Class: XMigra::DeclarativeSupport::StructureReader
- Includes:
- Enumerable
- Defined in:
- lib/xmigra/declarative_support.rb
Constant Summary collapse
- EXTENSION_PREFIX =
'X-'
Instance Method Summary collapse
- #[](key) ⇒ Object
- #array_fetch(key, key_finder_proc) ⇒ Object
- #each ⇒ Object
- #each_extension(&blk) ⇒ Object
- #each_unused_standard_key(&blk) ⇒ Object
- #eql?(other) ⇒ Boolean
- #fetch(key, *args) ⇒ Object
- #hash ⇒ Object
-
#initialize(data, keypath = []) ⇒ StructureReader
constructor
A new instance of StructureReader.
- #join(sep = $,) ⇒ Object
- #keys ⇒ Object
- #kind_of?(klass) ⇒ Boolean
- #length ⇒ Object
- #raw_item(key) ⇒ Object
- #uniq ⇒ Object
- #values ⇒ Object
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 |
#each ⇒ Object
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
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 |
#hash ⇒ Object
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 |
#keys ⇒ Object
86 87 88 |
# File 'lib/xmigra/declarative_support.rb', line 86 def keys @data.keys end |
#kind_of?(klass) ⇒ Boolean
74 75 76 |
# File 'lib/xmigra/declarative_support.rb', line 74 def kind_of?(klass) return super(klass) || @data.kind_of?(klass) end |
#length ⇒ Object
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 |
#uniq ⇒ Object
94 95 96 |
# File 'lib/xmigra/declarative_support.rb', line 94 def uniq collect {|o| o}.uniq end |
#values ⇒ Object
90 91 92 |
# File 'lib/xmigra/declarative_support.rb', line 90 def values @data.values end |