quickbooks 0.0.7 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (263) hide show
  1. data/README +10 -5
  2. data/Rakefile +4 -3
  3. data/doc/classes/Array.html +78 -247
  4. data/doc/classes/Array.src/{M000049.html → M000026.html} +1 -1
  5. data/doc/classes/Array.src/{M000050.html → M000027.html} +1 -1
  6. data/doc/classes/{Hash.src/M000030.html → Array.src/M000028.html} +4 -4
  7. data/doc/classes/Array.src/M000029.html +19 -0
  8. data/doc/classes/Array.src/M000030.html +18 -0
  9. data/doc/classes/Array.src/{M000042.html → M000031.html} +0 -0
  10. data/doc/classes/Array.src/{M000043.html → M000032.html} +0 -0
  11. data/doc/classes/Array.src/{M000044.html → M000033.html} +0 -0
  12. data/doc/classes/Array.src/{M000045.html → M000034.html} +1 -1
  13. data/doc/classes/Array.src/{M000046.html → M000035.html} +1 -1
  14. data/doc/classes/Array.src/{M000047.html → M000036.html} +1 -1
  15. data/doc/classes/Array.src/M000037.html +9 -4
  16. data/doc/classes/Array.src/M000038.html +4 -7
  17. data/doc/classes/Array.src/M000039.html +7 -4
  18. data/doc/classes/Array.src/M000040.html +4 -5
  19. data/doc/classes/Array.src/M000041.html +4 -4
  20. data/doc/classes/Class.html +10 -10
  21. data/doc/classes/Class.src/{M000075.html → M000042.html} +0 -0
  22. data/doc/classes/Class.src/{M000076.html → M000043.html} +1 -1
  23. data/doc/classes/Hash.html +124 -248
  24. data/doc/classes/Hash.src/M000001.html +18 -0
  25. data/doc/classes/Hash.src/M000002.html +21 -0
  26. data/doc/classes/Hash.src/M000003.html +18 -0
  27. data/doc/classes/Hash.src/M000004.html +7 -4
  28. data/doc/classes/Hash.src/M000005.html +4 -7
  29. data/doc/classes/Hash.src/M000006.html +6 -4
  30. data/doc/classes/Hash.src/M000007.html +4 -7
  31. data/doc/classes/Hash.src/M000008.html +8 -4
  32. data/doc/classes/Hash.src/M000009.html +4 -6
  33. data/doc/classes/Hash.src/M000010.html +7 -4
  34. data/doc/classes/Hash.src/M000011.html +9 -7
  35. data/doc/classes/Hash.src/M000012.html +4 -4
  36. data/doc/classes/Hash.src/M000013.html +4 -4
  37. data/doc/classes/Hash.src/M000014.html +4 -4
  38. data/doc/classes/Hash.src/M000015.html +4 -4
  39. data/doc/classes/Hash.src/M000016.html +4 -4
  40. data/doc/classes/Hash.src/M000017.html +5 -5
  41. data/doc/classes/Hash.src/M000018.html +13 -4
  42. data/doc/classes/Hash.src/M000019.html +6 -7
  43. data/doc/classes/Hash.src/M000020.html +4 -13
  44. data/doc/classes/Hash.src/M000021.html +4 -6
  45. data/doc/classes/Hash.src/M000022.html +4 -4
  46. data/doc/classes/Hash.src/M000023.html +4 -6
  47. data/doc/classes/Hash.src/M000024.html +4 -4
  48. data/doc/classes/Hash.src/M000025.html +14 -4
  49. data/doc/classes/Object.html +41 -41
  50. data/doc/classes/Object.src/{M000077.html → M000044.html} +0 -0
  51. data/doc/classes/Object.src/{M000078.html → M000045.html} +0 -0
  52. data/doc/classes/Object.src/{M000079.html → M000046.html} +1 -1
  53. data/doc/classes/Object.src/{M000080.html → M000047.html} +1 -1
  54. data/doc/classes/Object.src/{M000081.html → M000048.html} +1 -1
  55. data/doc/classes/Object.src/{M000082.html → M000049.html} +1 -1
  56. data/doc/classes/Object.src/{M000083.html → M000050.html} +1 -1
  57. data/doc/classes/Object.src/{M000084.html → M000051.html} +1 -1
  58. data/doc/classes/Qbxml/Request.html +15 -15
  59. data/doc/classes/Qbxml/Request.src/{M000184.html → M000132.html} +12 -11
  60. data/doc/classes/Qbxml/Request.src/{M000185.html → M000133.html} +1 -1
  61. data/doc/classes/Qbxml/Request.src/{M000186.html → M000134.html} +1 -1
  62. data/doc/classes/Qbxml/RequestSet.html +20 -20
  63. data/doc/classes/Qbxml/RequestSet.src/{M000187.html → M000135.html} +1 -1
  64. data/doc/classes/Qbxml/RequestSet.src/{M000188.html → M000136.html} +1 -1
  65. data/doc/classes/Qbxml/RequestSet.src/{M000189.html → M000137.html} +1 -1
  66. data/doc/classes/Qbxml/RequestSet.src/{M000190.html → M000138.html} +1 -1
  67. data/doc/classes/Qbxml/Response.html +45 -45
  68. data/doc/classes/Qbxml/Response.src/{M000175.html → M000123.html} +0 -0
  69. data/doc/classes/Qbxml/Response.src/{M000176.html → M000124.html} +0 -0
  70. data/doc/classes/Qbxml/Response.src/{M000177.html → M000125.html} +0 -0
  71. data/doc/classes/Qbxml/Response.src/{M000178.html → M000126.html} +0 -0
  72. data/doc/classes/Qbxml/Response.src/{M000179.html → M000127.html} +0 -0
  73. data/doc/classes/Qbxml/Response.src/{M000180.html → M000128.html} +0 -0
  74. data/doc/classes/Qbxml/Response.src/{M000181.html → M000129.html} +0 -0
  75. data/doc/classes/Qbxml/Response.src/{M000182.html → M000130.html} +0 -0
  76. data/doc/classes/Qbxml/Response.src/{M000183.html → M000131.html} +1 -1
  77. data/doc/classes/Qbxml/ResponseSet.html +35 -35
  78. data/doc/classes/Qbxml/ResponseSet.src/{M000168.html → M000116.html} +0 -0
  79. data/doc/classes/Qbxml/ResponseSet.src/{M000169.html → M000117.html} +0 -0
  80. data/doc/classes/Qbxml/ResponseSet.src/{M000170.html → M000118.html} +0 -0
  81. data/doc/classes/Qbxml/ResponseSet.src/{M000171.html → M000119.html} +0 -0
  82. data/doc/classes/Qbxml/ResponseSet.src/{M000172.html → M000120.html} +0 -0
  83. data/doc/classes/Qbxml/ResponseSet.src/{M000173.html → M000121.html} +0 -0
  84. data/doc/classes/Qbxml/ResponseSet.src/{M000174.html → M000122.html} +0 -0
  85. data/doc/classes/Quickbooks.html +6 -0
  86. data/doc/classes/Quickbooks/Address.html +5 -5
  87. data/doc/classes/Quickbooks/Address.src/{M000150.html → M000115.html} +0 -0
  88. data/doc/classes/Quickbooks/Base.html +167 -106
  89. data/doc/classes/Quickbooks/Base.src/{M000131.html → M000095.html} +1 -1
  90. data/doc/classes/Quickbooks/Base.src/{M000132.html → M000096.html} +1 -1
  91. data/doc/classes/Quickbooks/Base.src/{M000133.html → M000097.html} +1 -1
  92. data/doc/classes/Quickbooks/Base.src/{M000134.html → M000098.html} +1 -1
  93. data/doc/classes/Quickbooks/Base.src/{M000135.html → M000099.html} +1 -1
  94. data/doc/classes/Quickbooks/Base.src/{M000136.html → M000100.html} +1 -1
  95. data/doc/classes/Quickbooks/Base.src/{M000137.html → M000101.html} +1 -1
  96. data/doc/classes/Quickbooks/Base.src/{M000138.html → M000102.html} +1 -1
  97. data/doc/classes/Quickbooks/Base.src/{M000139.html → M000103.html} +1 -1
  98. data/doc/classes/Quickbooks/Base.src/{M000140.html → M000104.html} +1 -1
  99. data/doc/classes/Quickbooks/Base.src/M000105.html +18 -0
  100. data/doc/classes/Quickbooks/Base.src/{M000141.html → M000106.html} +1 -1
  101. data/doc/classes/Quickbooks/Base.src/{M000142.html → M000107.html} +1 -1
  102. data/doc/classes/Quickbooks/Base.src/{M000143.html → M000108.html} +1 -1
  103. data/doc/classes/Quickbooks/Base.src/{M000144.html → M000109.html} +1 -1
  104. data/doc/classes/Quickbooks/Base.src/{M000145.html → M000110.html} +1 -1
  105. data/doc/classes/Quickbooks/Base.src/{M000146.html → M000111.html} +2 -2
  106. data/doc/classes/Quickbooks/Base.src/{M000147.html → M000112.html} +1 -1
  107. data/doc/classes/Quickbooks/ListDeleted.html +5 -5
  108. data/doc/classes/Quickbooks/ListDeleted.src/{M000149.html → M000114.html} +0 -0
  109. data/doc/classes/Quickbooks/ListItem.html +26 -10
  110. data/doc/classes/Quickbooks/ListItem.src/{M000129.html → M000093.html} +3 -2
  111. data/doc/classes/Quickbooks/ListItem.src/{M000130.html → M000094.html} +1 -1
  112. data/doc/classes/Quickbooks/Model.html +110 -117
  113. data/doc/classes/Quickbooks/Model.src/{M000109.html → M000073.html} +3 -4
  114. data/doc/classes/Quickbooks/Model.src/{M000110.html → M000074.html} +2 -1
  115. data/doc/classes/Quickbooks/Model.src/{M000111.html → M000075.html} +2 -2
  116. data/doc/classes/Quickbooks/Model.src/{M000112.html → M000076.html} +2 -3
  117. data/doc/classes/Quickbooks/Model.src/{M000113.html → M000077.html} +0 -0
  118. data/doc/classes/Quickbooks/Model.src/{M000114.html → M000078.html} +0 -0
  119. data/doc/classes/Quickbooks/Model.src/{M000115.html → M000079.html} +0 -0
  120. data/doc/classes/Quickbooks/Model.src/{M000116.html → M000080.html} +0 -0
  121. data/doc/classes/Quickbooks/Model.src/{M000117.html → M000081.html} +0 -0
  122. data/doc/classes/Quickbooks/Model.src/{M000118.html → M000082.html} +0 -0
  123. data/doc/classes/Quickbooks/Model.src/{M000119.html → M000083.html} +0 -0
  124. data/doc/classes/Quickbooks/Model.src/{M000120.html → M000084.html} +0 -0
  125. data/doc/classes/Quickbooks/Model.src/{M000121.html → M000085.html} +0 -0
  126. data/doc/classes/Quickbooks/Model.src/{M000122.html → M000086.html} +0 -0
  127. data/doc/classes/Quickbooks/Model.src/{M000123.html → M000087.html} +0 -0
  128. data/doc/classes/Quickbooks/Model.src/{M000124.html → M000088.html} +2 -4
  129. data/doc/classes/Quickbooks/Model.src/{M000125.html → M000089.html} +3 -5
  130. data/doc/classes/Quickbooks/Model.src/{M000126.html → M000090.html} +1 -1
  131. data/doc/classes/Quickbooks/Model.src/{M000127.html → M000091.html} +1 -1
  132. data/doc/classes/Quickbooks/OleAdapter/Connection.html +65 -65
  133. data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000094.html → M000058.html} +0 -0
  134. data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000095.html → M000059.html} +0 -0
  135. data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000096.html → M000060.html} +0 -0
  136. data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000097.html → M000061.html} +0 -0
  137. data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000098.html → M000062.html} +0 -0
  138. data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000099.html → M000063.html} +1 -1
  139. data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000100.html → M000064.html} +0 -0
  140. data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000101.html → M000065.html} +0 -0
  141. data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000102.html → M000066.html} +0 -0
  142. data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000103.html → M000067.html} +2 -2
  143. data/doc/classes/Quickbooks/OleAdapter/Ole.html +17 -17
  144. data/doc/classes/Quickbooks/OleAdapter/Ole.src/{M000104.html → M000068.html} +0 -0
  145. data/doc/classes/Quickbooks/OleAdapter/Ole.src/{M000105.html → M000069.html} +0 -0
  146. data/doc/classes/Quickbooks/OleAdapter/Ole.src/{M000106.html → M000070.html} +0 -0
  147. data/doc/classes/Quickbooks/QbxmlDebugAdapter/Connection.html +5 -5
  148. data/doc/classes/Quickbooks/QbxmlDebugAdapter/Connection.src/{M000093.html → M000057.html} +0 -0
  149. data/doc/classes/Quickbooks/Ref.html +12 -5
  150. data/doc/classes/Quickbooks/Ref.src/{M000148.html → M000113.html} +1 -1
  151. data/doc/classes/Quickbooks/Transaction.html +10 -10
  152. data/doc/classes/Quickbooks/Transaction.src/{M000107.html → M000071.html} +0 -0
  153. data/doc/classes/Quickbooks/Transaction.src/{M000108.html → M000072.html} +0 -0
  154. data/doc/classes/Quickbooks/TxnDeleted.html +5 -5
  155. data/doc/classes/Quickbooks/TxnDeleted.src/{M000128.html → M000092.html} +0 -0
  156. data/doc/classes/String.html +25 -91
  157. data/doc/classes/String.src/{M000085.html → M000052.html} +0 -0
  158. data/doc/classes/String.src/{M000086.html → M000053.html} +0 -0
  159. data/doc/classes/String.src/{M000087.html → M000054.html} +0 -0
  160. data/doc/classes/String.src/{M000088.html → M000055.html} +1 -1
  161. data/doc/classes/String.src/{M000089.html → M000056.html} +1 -1
  162. data/doc/created.rid +1 -1
  163. data/doc/files/LICENSE.html +1 -1
  164. data/doc/files/README.html +38 -10
  165. data/doc/files/lib/qbxml/request_rb.html +2 -1
  166. data/doc/files/lib/qbxml/response_rb.html +1 -1
  167. data/doc/files/lib/qbxml/support_rb.html +1 -8
  168. data/doc/files/lib/qbxml_rb.html +14 -1
  169. data/doc/files/lib/quickbooks/adapters/ole_adapter_rb.html +1 -1
  170. data/doc/files/lib/quickbooks/adapters/qbxml_debug_adapter_rb.html +1 -1
  171. data/doc/files/lib/quickbooks/base_rb.html +8 -3
  172. data/doc/files/lib/quickbooks/model_rb.html +1 -2
  173. data/doc/files/lib/quickbooks/models/common/address_rb.html +1 -1
  174. data/doc/files/lib/quickbooks/models/common/all_refs_rb.html +1 -1
  175. data/doc/files/lib/quickbooks/models/customer/credit_card_info_rb.html +1 -1
  176. data/doc/files/lib/quickbooks/models/customer_rb.html +1 -1
  177. data/doc/files/lib/quickbooks/models/deleted_rb.html +1 -1
  178. data/doc/files/lib/quickbooks/models/list_item_rb.html +1 -1
  179. data/doc/files/lib/quickbooks/models/transaction_rb.html +1 -1
  180. data/doc/files/lib/quickbooks/ruby_magic_rb.html +2 -1
  181. data/doc/files/lib/quickbooks_rb.html +14 -1
  182. data/doc/fr_class_index.html +0 -5
  183. data/doc/fr_file_index.html +0 -1
  184. data/doc/fr_method_index.html +138 -190
  185. data/lib/qbxml.rb +1 -0
  186. data/lib/qbxml/request.rb +12 -10
  187. data/lib/qbxml/response.rb +1 -1
  188. data/lib/qbxml/support.rb +1 -1
  189. data/lib/quickbooks.rb +1 -0
  190. data/lib/quickbooks/adapters/ole_adapter.rb +3 -3
  191. data/lib/quickbooks/base.rb +30 -3
  192. data/lib/quickbooks/model.rb +14 -18
  193. data/lib/quickbooks/models/common/all_refs.rb +1 -0
  194. data/lib/quickbooks/models/deleted.rb +1 -1
  195. data/lib/quickbooks/models/list_item.rb +7 -1
  196. data/lib/quickbooks/models/transaction.rb +1 -1
  197. data/lib/quickbooks/ruby_magic.rb +28 -11
  198. metadata +124 -179
  199. data/doc/classes/Array.src/M000048.html +0 -23
  200. data/doc/classes/Array.src/M000051.html +0 -18
  201. data/doc/classes/Array.src/M000052.html +0 -18
  202. data/doc/classes/Array.src/M000053.html +0 -18
  203. data/doc/classes/Array.src/M000054.html +0 -20
  204. data/doc/classes/Array.src/M000055.html +0 -18
  205. data/doc/classes/Array.src/M000056.html +0 -34
  206. data/doc/classes/Array.src/M000057.html +0 -19
  207. data/doc/classes/Array.src/M000058.html +0 -29
  208. data/doc/classes/Array.src/M000059.html +0 -18
  209. data/doc/classes/Array.src/M000060.html +0 -20
  210. data/doc/classes/Array.src/M000061.html +0 -18
  211. data/doc/classes/Array.src/M000062.html +0 -18
  212. data/doc/classes/Array.src/M000063.html +0 -19
  213. data/doc/classes/Hash.src/M000026.html +0 -18
  214. data/doc/classes/Hash.src/M000027.html +0 -22
  215. data/doc/classes/Hash.src/M000028.html +0 -18
  216. data/doc/classes/Hash.src/M000029.html +0 -20
  217. data/doc/classes/Hash.src/M000031.html +0 -30
  218. data/doc/classes/Hash.src/M000032.html +0 -19
  219. data/doc/classes/Hash.src/M000033.html +0 -19
  220. data/doc/classes/Hash.src/M000034.html +0 -18
  221. data/doc/classes/Hash.src/M000035.html +0 -18
  222. data/doc/classes/Hash.src/M000036.html +0 -21
  223. data/doc/classes/OrderedArray.html +0 -178
  224. data/doc/classes/OrderedArray.src/M000001.html +0 -18
  225. data/doc/classes/OrderedArray.src/M000002.html +0 -18
  226. data/doc/classes/OrderedArray.src/M000003.html +0 -18
  227. data/doc/classes/OrderedHash.html +0 -324
  228. data/doc/classes/OrderedHash.src/M000064.html +0 -19
  229. data/doc/classes/OrderedHash.src/M000065.html +0 -18
  230. data/doc/classes/OrderedHash.src/M000066.html +0 -18
  231. data/doc/classes/OrderedHash.src/M000067.html +0 -18
  232. data/doc/classes/OrderedHash.src/M000068.html +0 -18
  233. data/doc/classes/OrderedHash.src/M000069.html +0 -18
  234. data/doc/classes/OrderedHash.src/M000070.html +0 -20
  235. data/doc/classes/OrderedHash.src/M000071.html +0 -18
  236. data/doc/classes/OrderedHash.src/M000072.html +0 -18
  237. data/doc/classes/OrderedHash.src/M000073.html +0 -19
  238. data/doc/classes/OrderedHash.src/M000074.html +0 -24
  239. data/doc/classes/SlashedArray.html +0 -226
  240. data/doc/classes/SlashedArray.src/M000161.html +0 -23
  241. data/doc/classes/SlashedArray.src/M000162.html +0 -18
  242. data/doc/classes/SlashedArray.src/M000163.html +0 -18
  243. data/doc/classes/SlashedArray.src/M000164.html +0 -22
  244. data/doc/classes/SlashedArray.src/M000165.html +0 -22
  245. data/doc/classes/SlashedArray.src/M000166.html +0 -18
  246. data/doc/classes/SlashedArray.src/M000167.html +0 -22
  247. data/doc/classes/SlashedHash.html +0 -193
  248. data/doc/classes/SlashedHash.src/M000156.html +0 -22
  249. data/doc/classes/SlashedHash.src/M000157.html +0 -18
  250. data/doc/classes/SlashedHash.src/M000158.html +0 -18
  251. data/doc/classes/SlashedHash.src/M000159.html +0 -27
  252. data/doc/classes/SlashedHash.src/M000160.html +0 -22
  253. data/doc/classes/String.src/M000090.html +0 -18
  254. data/doc/classes/String.src/M000091.html +0 -18
  255. data/doc/classes/String.src/M000092.html +0 -97
  256. data/doc/classes/UniqueArray.html +0 -193
  257. data/doc/classes/UniqueArray.src/M000151.html +0 -25
  258. data/doc/classes/UniqueArray.src/M000152.html +0 -18
  259. data/doc/classes/UniqueArray.src/M000153.html +0 -20
  260. data/doc/classes/UniqueArray.src/M000154.html +0 -20
  261. data/doc/classes/UniqueArray.src/M000155.html +0 -20
  262. data/doc/files/lib/quickbooks/structure_rb.html +0 -122
  263. data/lib/quickbooks/structure.rb +0 -393
@@ -1,393 +0,0 @@
1
- # This is serious super-magic code... :P
2
- # Array and Hash are extended only slightly, with methods that will extend an Array object to be kept unique, or
3
- # a Hash object to be kept in a given order or else in the order keys are defined; or an Array or Hash object just to retain
4
- # the ordered-ness of contained hashes.
5
- # 'slashing' in Array and Hash is the idea that multi-dimensional hashes and arrays could be represented by a key split by '/'s.
6
- # In this way we can sort a multi-dimensional hash by a multi-dimensional array (to give the hash order), and then blow up the
7
- # slash keys into actual multi-dimensional hashes.
8
- class String
9
- def slashed?
10
- self =~ /\//
11
- end
12
- def flatten_slashes
13
- self
14
- end
15
- def expand_slashes(seed=nil,overwrite=false)
16
- return self.dup if !slashed? && seed.nil?
17
-
18
- hsh = seed.nil? ? [] : (seed.is_a?(Array) ? seed : [seed])
19
- leaf = hsh
20
- slashed = self
21
- s = nil
22
- redoing = false
23
- while(slashed)
24
- s, slashed = slashed.split('/',2) unless redoing
25
- redoing = false
26
-
27
- # break when we can't go further
28
-
29
- # If leaf is a hash, continue into hash[s] if an array, or if a hash and !slashed.nil?.
30
- if leaf.is_a?(Hash)
31
- if leaf.has_key?(s)
32
- if leaf[s].is_a?(Array) || (leaf[s].is_a?(Hash) && slashed.to_s.split('/').length > 1)
33
- leaf = leaf[s]
34
- else
35
- break
36
- end
37
- else
38
- break
39
- end
40
-
41
-
42
- # If leaf is an array, continue only if !slashed.nil? AND an included hash contains the key
43
- elsif leaf.is_a?(Array)
44
- if !slashed.nil? && ((false) || h = leaf.reject {|e| !e.is_a?(Hash)}.reject {|e| !e.has_key?(s)}[-1])
45
- leaf = h
46
- redoing = true
47
- redo
48
- else
49
- break
50
- end
51
- end
52
- end
53
-
54
- # now we have leaf, which is where we need to append our value(s); s, the next segment, and slashed, which is all the rest of the segments
55
- if slashed
56
- case leaf
57
- when Hash
58
- if leaf.has_key?(s)
59
- if overwrite
60
- leaf[s] = slashed.expand_slashes
61
- else
62
- if leaf[s].is_a?(Array)
63
- leaf[s] = leaf[s] + slashed.expand_slashes
64
- else
65
- leaf[s] = [leaf[s], slashed.expand_slashes]
66
- end
67
- end
68
- else
69
- leaf[s] = slashed.expand_slashes
70
- end
71
- when Array
72
- if overwrite && leaf.include?(s)
73
- leaf[leaf.index(s)] = {s => slashed.expand_slashes}
74
- else
75
- if leaf[-1].is_a?(Hash)
76
- leaf[-1][s] = slashed.expand_slashes
77
- else
78
- leaf << {s => slashed.expand_slashes}
79
- end
80
- end
81
- end
82
-
83
-
84
- # There's no more, just the end value. leaf shouldn't be a hash in this case
85
- else
86
- case leaf
87
- when Hash
88
- # If leaf IS a hash, it must be the root hsh. In that case, it becomes obvious we need hsh to be an array, not a hash
89
- hsh = [hsh, s]
90
- when Array
91
- leaf << s unless overwrite && leaf.include?(s)
92
- end
93
- end
94
-
95
- hsh.length < 2 ? hsh[0] : hsh
96
- end
97
- end
98
- class Array
99
- def slashed?
100
- any? {|e| e.to_s =~ /\//}
101
- end
102
- def slashed!
103
- expand_slashes!
104
- SlashedArray.prepare_for_overwrites!(self) unless self.respond_to?(:append_unslashed)
105
- extend SlashedArray
106
- end
107
- def flatten_slashes!
108
- replace(flatten_slashes)
109
- end
110
- def flatten_slashes
111
- ary = []
112
- self.each do |e|
113
- if e.is_a?(Hash)
114
- e.flatten_slashes.each do |k,v|
115
- if v.is_a?(Array)
116
- v.each do |i|
117
- ary << k.to_s+'/'+i.to_s
118
- end
119
- else
120
- ary << k.to_s+'/'+v.to_s
121
- end
122
- end
123
- else
124
- ary << e
125
- end
126
- end
127
- ary
128
- end
129
- def expand_slashes!(seed=nil)
130
- h = expand_slashes(seed)
131
- replace(h.is_a?(Array) ? h : [h])
132
- end
133
- def expand_slashes(seed=nil)
134
- return self.dup if !slashed? && seed.nil?
135
- hsh = seed.nil? ? [] : (seed.is_a?(Array) ? seed : [seed])
136
- self.each do |e|
137
- if !e.is_a?(String)
138
- hsh << e
139
- next
140
- end
141
- # Find as far as possible in the already-created structure,
142
- # then create new structure by either adding to an existing hash value, array, or by calling string.expand_slashes
143
- e.expand_slashes(hsh)
144
- end
145
- hsh.length < 2 ? hsh[0] : hsh
146
- end
147
- def step_into_slash(key)
148
- reject {|e| e !~ Regexp.new("^#{key}")}.collect {|e| e.split('/',2)[1]}
149
- end
150
-
151
- def keep_unique!
152
- uniq!
153
- UniqueArray.prepare_for_overwrites!(self) unless self.respond_to?(:push_without_unique)
154
- extend UniqueArray
155
- end
156
- def ordered!(*keys_in_order)
157
- OrderedArray.new(*keys_in_order).replace(self)
158
- end
159
- def ordered?
160
- false
161
- end
162
- def ordered_propogated!
163
- OrderedHashPropogator.prepare_for_overwrites!(self) unless self.respond_to?(:push_without_unique)
164
- extend OrderedHashPropogator
165
- end
166
- end
167
- module SlashedArray
168
- def self.prepare_for_overwrites!(ary)
169
- class << ary
170
- alias :append_unslashed :<<
171
- alias :push_unslashed :push
172
- alias :unshift_unslashed :unshift
173
- alias :set_value_unslashed :[]=
174
- end
175
- end
176
-
177
- # Currently this doesn't do anything. :P
178
- def keep_unique!
179
- @keep_unique = true
180
- end
181
-
182
- def flattened
183
- flatten_slashes
184
- end
185
- def unshift(v)
186
- if v.slashed?
187
- self.expand_slashes(v)
188
- else
189
- unshift_unslashed(v)
190
- end
191
- end
192
- def push(v)
193
- if v.slashed?
194
- v.expand_slashes(self)
195
- else
196
- push_unslashed(v)
197
- end
198
- end
199
- def <<(v)
200
- push(v)
201
- end
202
- def []=(i,v)
203
- if v.slashed?
204
- v.expand_slashes(self,true)
205
- else
206
- set_value_unslashed(i,v)
207
- end
208
- end
209
- end
210
- # In reality, this is just holding the Order information for any hashes it might contain.
211
- class OrderedArray < Array
212
- def initialize(*keys_in_order)
213
- @keys_in_order = keys_in_order.flatten.compact.keep_unique!
214
- end
215
-
216
- def ordered!(*keys_in_order)
217
- false
218
- end
219
- def ordered?
220
- true
221
- end
222
- end
223
- module UniqueArray
224
- def self.prepare_for_overwrites!(ary)
225
- class << ary
226
- alias :push_without_unique :push
227
- alias :unshift_without_unique :unshift
228
- alias :append_without_unique :<<
229
- # This makes sure whatever kind of array (regular, slashed_structure, etc) it is,
230
- # keep_unique! will keep it unique at the type it was when it was told to stay unique.
231
- alias :_snapshot_include? :include?
232
- end
233
- end
234
- def self.new
235
- [].keep_unique!
236
- end
237
-
238
- def push(*args)
239
- args.each do |arg|
240
- push_without_unique(arg) unless _snapshot_include?(arg)
241
- end
242
- end
243
- def unshift(*args)
244
- args.each do |arg|
245
- unshift_without_unique(arg) unless _snapshot_include?(arg)
246
- end
247
- end
248
- def <<(*args)
249
- args.each do |arg|
250
- append_without_unique(arg) unless _snapshot_include?(arg)
251
- end
252
- end
253
- end
254
-
255
- class Hash
256
- def slashed?
257
- keys.any? {|k| k.to_s =~ /\//}
258
- end
259
- def slashed!
260
- expand_slashes!
261
- SlashedHash.prepare_for_overwrites!(self) unless self.respond_to?(:set_value_unslashed)
262
- extend SlashedHash
263
- end
264
- def flatten_slashes
265
- self.dup.flatten_slashes!
266
- end
267
- def flatten_slashes!
268
- hsh = {} #.ordered!
269
- self.each do |k,v|
270
- if v.is_a?(Hash)
271
- v.flatten_slashes.each do |vk,vv|
272
- hsh[k.to_s+'/'+vk.to_s] = vv
273
- end
274
- elsif v.is_a?(Array)
275
- hsh[k] = v.flatten_slashes
276
- else
277
- hsh[k] = v
278
- end
279
- end
280
- hsh
281
- end
282
- def expand_slashes(seed=nil)
283
- return self.dup if empty?
284
- [self.dup].flatten_slashes.expand_slashes(seed)
285
- end
286
- def expand_slashes!(seed=nil)
287
- return self if empty?
288
- replace(expand_slashes(seed))
289
- end
290
-
291
- def ordered!(*keys_in_order)
292
- OrderedHash.new(*keys_in_order).replace(self)
293
- end
294
- def ordered?
295
- false
296
- end
297
- def slash_camelize_keys!(specials={})
298
- self.each_key do |k|
299
- self[specials.has_key?(k) ? specials[k] : (k.is_a?(Symbol) ? k.to_s.camelize.to_sym : k.split('/').map {|e| e.camelize}.join('/'))] = self.delete(k)
300
- end
301
- self
302
- end
303
- end
304
- module SlashedHash
305
- def self.prepare_for_overwrites!(hsh)
306
- class << hsh
307
- # alias :append_value_unslashed :<<
308
- alias :set_value_unslashed :[]=
309
- alias :get_value_unslashed :[]
310
- end
311
- end
312
-
313
- def flattened
314
- flatten_slashes
315
- end
316
- def <<(v)
317
- v.expand_slashes(self)
318
- end
319
- def [](k)
320
- if k.slashed?
321
- leaf = self
322
- k.split('/').each do |s|
323
- leaf = leaf[s]
324
- break unless leaf.is_a?(Hash)
325
- end
326
- leaf
327
- else
328
- get_value_unslashed(k)
329
- end
330
- end
331
- def []=(k,v)
332
- if k.slashed?
333
- (k+'/'+v).expand_slashes(self,true)
334
- else
335
- set_value_unslashed(k,v)
336
- end
337
- end
338
- end
339
-
340
- class OrderedHash < Hash
341
- alias :unordered_keys :keys
342
- alias :unordered_values :values
343
- alias :each_unordered :each
344
- alias :set_value :[]=
345
- alias :get_value :[]
346
-
347
- def initialize(*keys_in_order, &block)
348
- super(&block)
349
- @keys_in_order = keys_in_order.flatten + (self.keys.reject {|e| !keys_in_order.flatten.include?(e) }).compact.keep_unique!
350
- end
351
-
352
- def dup
353
- Hash.new.replace(self)
354
- end
355
-
356
- def ordered!
357
- false
358
- end
359
- def ordered?
360
- true
361
- end
362
-
363
- def keys
364
- expand_slashes.keys.sort {|a,b| @keys_in_order.index(a) <=> @keys_in_order.index(b)}
365
- end
366
- def values
367
- self.keys.collect {|k| self[k]}
368
- end
369
- def each(&block)
370
- self.keys.each do |k|
371
- block.call(k, self[k])
372
- end
373
- end
374
- def each_key(&block)
375
- self.keys.each &block
376
- end
377
- def each_value(&block)
378
- self.values.each &block
379
- end
380
- def []=(k,v)
381
- @keys_in_order << k
382
- set_value(k,v)
383
- end
384
- def [](k)
385
- # If the value being retrieved is a hash or an array, we need to make sure it's an Ordered one.
386
- v = get_value(k)
387
- if (v.is_a?(Hash) || v.is_a?(Array)) && !v.ordered?
388
- child_order = @keys_in_order.step_into_slash(k)
389
- v = self[k] = v.ordered!(child_order)
390
- end
391
- v
392
- end
393
- end