Class: XMigra::DeclarativeSupport::StructureReader

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/xmigra/declarative_support.rb

Constant Summary collapse

EXTENSION_PREFIX =
'X-'

Instance Method Summary collapse

Constructor Details

#initialize(data, keypath = []) ⇒ StructureReader

Returns a new instance of StructureReader.



8
9
10
11
12
13
# File 'lib/xmigra/declarative_support.rb', line 8

def initialize(data, keypath=[])
  @keypath = keypath
  @data = data
  @children = []
  @used_keys = Set.new
end

Instance Method Details

#[](key) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# File 'lib/xmigra/declarative_support.rb', line 15

def [](key)
  result, result_key = item_and_keypath(key)
  
  case result
  when Hash
    result = StructureReader.new(result, result_key).tap do |r|
      r.parent = self
    end
  when Array
    raise "Invalid to fetch an array via [] -- use array_fetch"
  end
  
  @used_keys << key if @data.kind_of? Hash
  return result
end

#array_fetch(key, key_finder_proc) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/xmigra/declarative_support.rb', line 45

def array_fetch(key, key_finder_proc)
  result, result_key = item_and_keypath(key)
  unless result.kind_of? Array
    raise ::TypeError, "Expected key for array"
  end
  
  @used_keys << key if @data.kind_of? Hash
  return StructureReader.new(result, result_key).tap do |r|
    r.parent = self
    r.key_finder_proc = key_finder_proc
  end
end

#eachObject



63
64
65
66
67
68
69
70
71
# File 'lib/xmigra/declarative_support.rb', line 63

def each
  to_enum(:each) unless block_given?
  
  if @data.kind_of? Hash
    @data.each_key {|k| yield k, self[k]}
  else
    (0...@data.length).each {|i| yield self[i]}
  end
end

#each_extension(&blk) ⇒ Object



106
107
108
109
110
111
112
113
114
115
116
117
118
119
# File 'lib/xmigra/declarative_support.rb', line 106

def each_extension(&blk)
  return to_enum(:each_extension) if blk.nil?
  
  if @data.kind_of? Hash
    @data.each_pair do |k, val|
      next unless k.kind_of?(String) and k.start_with?(EXTENSION_PREFIX)
      blk.call((@keypath + [k]).join('.'), val)
    end
  end
  
  children.each do |child|
    child.each_extension(&blk)
  end
end

#each_unused_standard_key(&blk) ⇒ Object



121
122
123
124
125
126
127
128
129
130
131
132
# File 'lib/xmigra/declarative_support.rb', line 121

def each_unused_standard_key(&blk)
  return to_enum(:each_unused_standard_key) if blk.nil?
  
  if @data.kind_of? Hash
    @data.each_key do |k|
      next if @used_keys.include?(k)
      next if k.kind_of?(String) && k.start_with?(EXTENSION_PREFIX)
      blk.call(@keypath + [k]).join('.')
    end
  end
  children.each {|child| child.each_unused_standard_key(&blk)}
end

#eql?(other) ⇒ Boolean

Returns:

  • (Boolean)


82
83
84
# File 'lib/xmigra/declarative_support.rb', line 82

def eql?(other)
  @data.eql?(other)
end

#fetch(key, *args) ⇒ Object



31
32
33
34
35
36
37
38
39
40
41
42
43
# File 'lib/xmigra/declarative_support.rb', line 31

def fetch(key, *args)
  if args.length > 1
    raise ArgumentError, "fetch takes 1 or 2 arguments"
  end
  
  if @data.has_key?(key)
    return self[key]
  elsif args.length == 1
    return args[0]
  else
    raise KeyError, "#{key.inspect} not present"
  end
end

#hashObject



78
79
80
# File 'lib/xmigra/declarative_support.rb', line 78

def hash
  @data.hash
end

#join(sep = $,) ⇒ Object



102
103
104
# File 'lib/xmigra/declarative_support.rb', line 102

def join(sep=$,)
  @data.join(sep)
end

#keysObject



86
87
88
# File 'lib/xmigra/declarative_support.rb', line 86

def keys
  @data.keys
end

#kind_of?(klass) ⇒ Boolean

Returns:

  • (Boolean)


74
75
76
# File 'lib/xmigra/declarative_support.rb', line 74

def kind_of?(klass)
  return super(klass) || @data.kind_of?(klass)
end

#lengthObject



98
99
100
# File 'lib/xmigra/declarative_support.rb', line 98

def length
  @data.length
end

#raw_item(key) ⇒ Object



58
59
60
61
# File 'lib/xmigra/declarative_support.rb', line 58

def raw_item(key)
  @used_keys << key if @data.kind_of? Hash
  return @data[key]
end

#uniqObject



94
95
96
# File 'lib/xmigra/declarative_support.rb', line 94

def uniq
  collect {|o| o}.uniq
end

#valuesObject



90
91
92
# File 'lib/xmigra/declarative_support.rb', line 90

def values
  @data.values
end