Class: Jei::Path

Inherits:
Object
  • Object
show all
Defined in:
lib/jei/path.rb

Defined Under Namespace

Classes: NameError

Constant Summary collapse

PATH_SEPARATOR =
','.freeze
NAME_SEPARATOR =
'.'.freeze

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(names) ⇒ Path

Returns a new instance of Path.

Parameters:

  • names (Array<Symbol>)


29
30
31
# File 'lib/jei/path.rb', line 29

def initialize(names)
  @names = names
end

Instance Attribute Details

#namesArray<Symbol> (readonly)

Returns:

  • (Array<Symbol>)


9
10
11
# File 'lib/jei/path.rb', line 9

def names
  @names
end

Class Method Details

.find(paths, serializer, serializers) ⇒ Object

Parameters:



22
23
24
25
26
# File 'lib/jei/path.rb', line 22

def self.find(paths, serializer, serializers)
  paths.each do |path|
    path.walk(serializer, serializers)
  end
end

.parse(paths) ⇒ Array<Path>

Parameters:

  • paths (String)

Returns:



13
14
15
16
17
# File 'lib/jei/path.rb', line 13

def self.parse(paths)
  paths.split(PATH_SEPARATOR).map do |path|
    new(path.split(NAME_SEPARATOR).map(&:to_sym))
  end
end

Instance Method Details

#walk(serializer, serializers, level = 0) ⇒ Object

Parameters:

Raises:



36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/jei/path.rb', line 36

def walk(serializer, serializers, level = 0)
  return if level >= @names.length

  name = @names[level]

  relationship = serializer.relationships[name]
  raise NameError, "invalid relationship name `#{name}'" unless relationship

  unless relationship.options[:data]
    serializer.options[:linkages] = Set.new unless serializer.options[:linkages]
    serializer.options[:linkages] << name
  end

  resources = [*relationship.evaluate(serializer)]

  resources.each do |resource|
    serializer = Serializer.factory(resource, relationship.options[:serializer])
    serializers << serializer
    walk(serializer, serializers, level + 1)
  end
end