Advertisement
Guest User

Untitled

a guest
Apr 23rd, 2017
87
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.46 KB | None | 0 0
  1. parent = { 'parent' => nil, 'id' => 3 }
  2. child = { 'parent' => parent, 'id' => 7 }
  3.  
  4. {
  5. "parent": { "parent": null, "id": 3, ...etc.},
  6. "id": 7,
  7. ...etc.
  8. }
  9.  
  10. class Item
  11. def initialize(data)
  12. @data = data
  13. end
  14.  
  15. def parent
  16. @parent ||= Item.new(data['parent']) if data['parent']
  17. end
  18.  
  19. def id
  20. data['id']
  21. end
  22.  
  23. private
  24.  
  25. attr_reader :data
  26. end
  27.  
  28. describe 'children' do
  29. let(:subject1) { Item.new(child) }
  30.  
  31. it 'is an item' do
  32. subject1.class.must_equal(Item)
  33. end
  34.  
  35. it 'has an id' do
  36. subject1.id.must_equal(7)
  37. end
  38.  
  39. it 'has a parent' do
  40. subject1.parent.id.must_equal(3)
  41. end
  42. end
  43.  
  44. describe 'parent' do
  45. let(:subject2) { subject1.parent }
  46.  
  47. it 'is also an item' do
  48. subject2.class.must_equal(Item)
  49. end
  50.  
  51. it 'does not have a parent' do
  52. assert_nil(subject2.parent)
  53. end
  54. end
  55.  
  56. module Handlers
  57. module JSONHandler
  58. require 'json'
  59.  
  60. def from_json json
  61. hash = JSON.parse(json)
  62. recursive hash
  63. end
  64.  
  65. # You might want to add an extra check to stop an infinite loop
  66. # Beware the data!
  67. def recursive hash
  68. return nil if hash.nil?
  69. return hash unless hash.respond_to? :fetch
  70. Item.new id: hash["id"], parent: recursive(hash["parent"])
  71. end
  72. end
  73. end
  74.  
  75.  
  76. class Item
  77. extend Handlers::JSONHandler
  78.  
  79. def self.items
  80. @items ||= {}
  81. end
  82.  
  83.  
  84. def initialize(id:, parent:nil)
  85. @parent = parent
  86. @id = id
  87. self.class.items[@id] = self
  88. end
  89.  
  90. attr_reader :parent, :id
  91.  
  92. def to_h
  93. h = {id: @id, parent: (@parent && parent.id) }
  94. h.reject{|k,v| v.nil? }
  95. end
  96.  
  97. alias_method :to_hash,:to_h
  98. end
  99. # => Item
  100. parent = Item.new id: 3
  101. # => #<Item:0x007fa94a4010c8 @parent=nil, @id=3>
  102. child = Item.new id: 7, parent: parent
  103. # => #<Item:0x007fa94a9abe38 @parent=#<Item:0x007fa94a4010c8 @parent=nil, @id=3>, @id=7>
  104. Item.items
  105. # => {3=>#<Item:0x007fa94a4010c8 @parent=nil, @id=3>, 7=>#<Item:0x007fa94a9abe38 @parent=#<Item:0x007fa94a4010c8 @parent=nil, @id=3>, @id=7>}
  106. Item.items[3]
  107. # => #<Item:0x007fa94a4010c8 @parent=nil, @id=3>
  108. Item.items[7]
  109. # => #<Item:0x007fa94a9abe38 @parent=#<Item:0x007fa94a4010c8 @parent=nil, @id=3>, @id=7>
  110. Item.items[7].parent
  111. # => #<Item:0x007fa94a4010c8 @parent=nil, @id=3>
  112. parent.to_h
  113. # => {:id=>3}
  114. child.to_hash
  115. # => {:id=>7, :parent=>3}
  116. json_parent = parent.to_h.to_json
  117. # => "{"id":3}"
  118. json_child = child.to_h.to_json
  119. # => "{"id":7,"parent":3}"
  120. parent2 = Item.from_json json_parent
  121. # => #<Item:0x007fb543e26940 @parent=nil, @id=3>
  122. child2 = Item.from_json json_child
  123. # => #<Item:0x007fb5431d7270 @parent=3, @id=7>
  124.  
  125. def self.Item(*args, **keywords)
  126. case args.first
  127. when String # it's JSON
  128. Item.from_json args.first
  129. when Hash
  130. # you might want to nick the recursive bit from the handler
  131. # or write an Hash handler etc
  132. Item.new id: args.first["id"], parent: args.first["parent"]
  133. when Item
  134. args.first
  135. else
  136. Item.new id: keywords[:id], parent: keywords[:parent]
  137. end
  138. end
  139.  
  140. Item(parent)
  141. # => #<Item:0x007fb9b2765160 @parent=nil, @id=3>
  142. Item(child)
  143. # => #<Item:0x007fb9b272f330 @parent=3, @id=7>
  144. Item(json_parent)
  145. # => #<Item:0x007fb9b26fdd30 @parent=nil, @id=3>
  146. Item(json_child)
  147. # => #<Item:0x007fb9b26c7dc0 @parent=3, @id=7>
  148. Item(parent.to_h)
  149. # => #<Item:0x007fb9b26965b8 @parent=nil, @id=3>
  150. Item(child.to_h)
  151. # => #<Item:0x007fb9b2664928 @parent=3, @id=7>
  152. Item(id: 3)
  153. # => #<Item:0x007fb9b262ed50 @parent=nil, @id=3>
  154. Item(id: 7, parent: parent)
  155. # => #<Item:0x007fb9b25fc990 @parent=#<Item:0x007fb9b23bd7b0 @parent=nil, @id=3>, @id=7>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement