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.
- data/README +10 -5
- data/Rakefile +4 -3
- data/doc/classes/Array.html +78 -247
- data/doc/classes/Array.src/{M000049.html → M000026.html} +1 -1
- data/doc/classes/Array.src/{M000050.html → M000027.html} +1 -1
- data/doc/classes/{Hash.src/M000030.html → Array.src/M000028.html} +4 -4
- data/doc/classes/Array.src/M000029.html +19 -0
- data/doc/classes/Array.src/M000030.html +18 -0
- data/doc/classes/Array.src/{M000042.html → M000031.html} +0 -0
- data/doc/classes/Array.src/{M000043.html → M000032.html} +0 -0
- data/doc/classes/Array.src/{M000044.html → M000033.html} +0 -0
- data/doc/classes/Array.src/{M000045.html → M000034.html} +1 -1
- data/doc/classes/Array.src/{M000046.html → M000035.html} +1 -1
- data/doc/classes/Array.src/{M000047.html → M000036.html} +1 -1
- data/doc/classes/Array.src/M000037.html +9 -4
- data/doc/classes/Array.src/M000038.html +4 -7
- data/doc/classes/Array.src/M000039.html +7 -4
- data/doc/classes/Array.src/M000040.html +4 -5
- data/doc/classes/Array.src/M000041.html +4 -4
- data/doc/classes/Class.html +10 -10
- data/doc/classes/Class.src/{M000075.html → M000042.html} +0 -0
- data/doc/classes/Class.src/{M000076.html → M000043.html} +1 -1
- data/doc/classes/Hash.html +124 -248
- data/doc/classes/Hash.src/M000001.html +18 -0
- data/doc/classes/Hash.src/M000002.html +21 -0
- data/doc/classes/Hash.src/M000003.html +18 -0
- data/doc/classes/Hash.src/M000004.html +7 -4
- data/doc/classes/Hash.src/M000005.html +4 -7
- data/doc/classes/Hash.src/M000006.html +6 -4
- data/doc/classes/Hash.src/M000007.html +4 -7
- data/doc/classes/Hash.src/M000008.html +8 -4
- data/doc/classes/Hash.src/M000009.html +4 -6
- data/doc/classes/Hash.src/M000010.html +7 -4
- data/doc/classes/Hash.src/M000011.html +9 -7
- data/doc/classes/Hash.src/M000012.html +4 -4
- data/doc/classes/Hash.src/M000013.html +4 -4
- data/doc/classes/Hash.src/M000014.html +4 -4
- data/doc/classes/Hash.src/M000015.html +4 -4
- data/doc/classes/Hash.src/M000016.html +4 -4
- data/doc/classes/Hash.src/M000017.html +5 -5
- data/doc/classes/Hash.src/M000018.html +13 -4
- data/doc/classes/Hash.src/M000019.html +6 -7
- data/doc/classes/Hash.src/M000020.html +4 -13
- data/doc/classes/Hash.src/M000021.html +4 -6
- data/doc/classes/Hash.src/M000022.html +4 -4
- data/doc/classes/Hash.src/M000023.html +4 -6
- data/doc/classes/Hash.src/M000024.html +4 -4
- data/doc/classes/Hash.src/M000025.html +14 -4
- data/doc/classes/Object.html +41 -41
- data/doc/classes/Object.src/{M000077.html → M000044.html} +0 -0
- data/doc/classes/Object.src/{M000078.html → M000045.html} +0 -0
- data/doc/classes/Object.src/{M000079.html → M000046.html} +1 -1
- data/doc/classes/Object.src/{M000080.html → M000047.html} +1 -1
- data/doc/classes/Object.src/{M000081.html → M000048.html} +1 -1
- data/doc/classes/Object.src/{M000082.html → M000049.html} +1 -1
- data/doc/classes/Object.src/{M000083.html → M000050.html} +1 -1
- data/doc/classes/Object.src/{M000084.html → M000051.html} +1 -1
- data/doc/classes/Qbxml/Request.html +15 -15
- data/doc/classes/Qbxml/Request.src/{M000184.html → M000132.html} +12 -11
- data/doc/classes/Qbxml/Request.src/{M000185.html → M000133.html} +1 -1
- data/doc/classes/Qbxml/Request.src/{M000186.html → M000134.html} +1 -1
- data/doc/classes/Qbxml/RequestSet.html +20 -20
- data/doc/classes/Qbxml/RequestSet.src/{M000187.html → M000135.html} +1 -1
- data/doc/classes/Qbxml/RequestSet.src/{M000188.html → M000136.html} +1 -1
- data/doc/classes/Qbxml/RequestSet.src/{M000189.html → M000137.html} +1 -1
- data/doc/classes/Qbxml/RequestSet.src/{M000190.html → M000138.html} +1 -1
- data/doc/classes/Qbxml/Response.html +45 -45
- data/doc/classes/Qbxml/Response.src/{M000175.html → M000123.html} +0 -0
- data/doc/classes/Qbxml/Response.src/{M000176.html → M000124.html} +0 -0
- data/doc/classes/Qbxml/Response.src/{M000177.html → M000125.html} +0 -0
- data/doc/classes/Qbxml/Response.src/{M000178.html → M000126.html} +0 -0
- data/doc/classes/Qbxml/Response.src/{M000179.html → M000127.html} +0 -0
- data/doc/classes/Qbxml/Response.src/{M000180.html → M000128.html} +0 -0
- data/doc/classes/Qbxml/Response.src/{M000181.html → M000129.html} +0 -0
- data/doc/classes/Qbxml/Response.src/{M000182.html → M000130.html} +0 -0
- data/doc/classes/Qbxml/Response.src/{M000183.html → M000131.html} +1 -1
- data/doc/classes/Qbxml/ResponseSet.html +35 -35
- data/doc/classes/Qbxml/ResponseSet.src/{M000168.html → M000116.html} +0 -0
- data/doc/classes/Qbxml/ResponseSet.src/{M000169.html → M000117.html} +0 -0
- data/doc/classes/Qbxml/ResponseSet.src/{M000170.html → M000118.html} +0 -0
- data/doc/classes/Qbxml/ResponseSet.src/{M000171.html → M000119.html} +0 -0
- data/doc/classes/Qbxml/ResponseSet.src/{M000172.html → M000120.html} +0 -0
- data/doc/classes/Qbxml/ResponseSet.src/{M000173.html → M000121.html} +0 -0
- data/doc/classes/Qbxml/ResponseSet.src/{M000174.html → M000122.html} +0 -0
- data/doc/classes/Quickbooks.html +6 -0
- data/doc/classes/Quickbooks/Address.html +5 -5
- data/doc/classes/Quickbooks/Address.src/{M000150.html → M000115.html} +0 -0
- data/doc/classes/Quickbooks/Base.html +167 -106
- data/doc/classes/Quickbooks/Base.src/{M000131.html → M000095.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/{M000132.html → M000096.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/{M000133.html → M000097.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/{M000134.html → M000098.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/{M000135.html → M000099.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/{M000136.html → M000100.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/{M000137.html → M000101.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/{M000138.html → M000102.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/{M000139.html → M000103.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/{M000140.html → M000104.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/M000105.html +18 -0
- data/doc/classes/Quickbooks/Base.src/{M000141.html → M000106.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/{M000142.html → M000107.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/{M000143.html → M000108.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/{M000144.html → M000109.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/{M000145.html → M000110.html} +1 -1
- data/doc/classes/Quickbooks/Base.src/{M000146.html → M000111.html} +2 -2
- data/doc/classes/Quickbooks/Base.src/{M000147.html → M000112.html} +1 -1
- data/doc/classes/Quickbooks/ListDeleted.html +5 -5
- data/doc/classes/Quickbooks/ListDeleted.src/{M000149.html → M000114.html} +0 -0
- data/doc/classes/Quickbooks/ListItem.html +26 -10
- data/doc/classes/Quickbooks/ListItem.src/{M000129.html → M000093.html} +3 -2
- data/doc/classes/Quickbooks/ListItem.src/{M000130.html → M000094.html} +1 -1
- data/doc/classes/Quickbooks/Model.html +110 -117
- data/doc/classes/Quickbooks/Model.src/{M000109.html → M000073.html} +3 -4
- data/doc/classes/Quickbooks/Model.src/{M000110.html → M000074.html} +2 -1
- data/doc/classes/Quickbooks/Model.src/{M000111.html → M000075.html} +2 -2
- data/doc/classes/Quickbooks/Model.src/{M000112.html → M000076.html} +2 -3
- data/doc/classes/Quickbooks/Model.src/{M000113.html → M000077.html} +0 -0
- data/doc/classes/Quickbooks/Model.src/{M000114.html → M000078.html} +0 -0
- data/doc/classes/Quickbooks/Model.src/{M000115.html → M000079.html} +0 -0
- data/doc/classes/Quickbooks/Model.src/{M000116.html → M000080.html} +0 -0
- data/doc/classes/Quickbooks/Model.src/{M000117.html → M000081.html} +0 -0
- data/doc/classes/Quickbooks/Model.src/{M000118.html → M000082.html} +0 -0
- data/doc/classes/Quickbooks/Model.src/{M000119.html → M000083.html} +0 -0
- data/doc/classes/Quickbooks/Model.src/{M000120.html → M000084.html} +0 -0
- data/doc/classes/Quickbooks/Model.src/{M000121.html → M000085.html} +0 -0
- data/doc/classes/Quickbooks/Model.src/{M000122.html → M000086.html} +0 -0
- data/doc/classes/Quickbooks/Model.src/{M000123.html → M000087.html} +0 -0
- data/doc/classes/Quickbooks/Model.src/{M000124.html → M000088.html} +2 -4
- data/doc/classes/Quickbooks/Model.src/{M000125.html → M000089.html} +3 -5
- data/doc/classes/Quickbooks/Model.src/{M000126.html → M000090.html} +1 -1
- data/doc/classes/Quickbooks/Model.src/{M000127.html → M000091.html} +1 -1
- data/doc/classes/Quickbooks/OleAdapter/Connection.html +65 -65
- data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000094.html → M000058.html} +0 -0
- data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000095.html → M000059.html} +0 -0
- data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000096.html → M000060.html} +0 -0
- data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000097.html → M000061.html} +0 -0
- data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000098.html → M000062.html} +0 -0
- data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000099.html → M000063.html} +1 -1
- data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000100.html → M000064.html} +0 -0
- data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000101.html → M000065.html} +0 -0
- data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000102.html → M000066.html} +0 -0
- data/doc/classes/Quickbooks/OleAdapter/Connection.src/{M000103.html → M000067.html} +2 -2
- data/doc/classes/Quickbooks/OleAdapter/Ole.html +17 -17
- data/doc/classes/Quickbooks/OleAdapter/Ole.src/{M000104.html → M000068.html} +0 -0
- data/doc/classes/Quickbooks/OleAdapter/Ole.src/{M000105.html → M000069.html} +0 -0
- data/doc/classes/Quickbooks/OleAdapter/Ole.src/{M000106.html → M000070.html} +0 -0
- data/doc/classes/Quickbooks/QbxmlDebugAdapter/Connection.html +5 -5
- data/doc/classes/Quickbooks/QbxmlDebugAdapter/Connection.src/{M000093.html → M000057.html} +0 -0
- data/doc/classes/Quickbooks/Ref.html +12 -5
- data/doc/classes/Quickbooks/Ref.src/{M000148.html → M000113.html} +1 -1
- data/doc/classes/Quickbooks/Transaction.html +10 -10
- data/doc/classes/Quickbooks/Transaction.src/{M000107.html → M000071.html} +0 -0
- data/doc/classes/Quickbooks/Transaction.src/{M000108.html → M000072.html} +0 -0
- data/doc/classes/Quickbooks/TxnDeleted.html +5 -5
- data/doc/classes/Quickbooks/TxnDeleted.src/{M000128.html → M000092.html} +0 -0
- data/doc/classes/String.html +25 -91
- data/doc/classes/String.src/{M000085.html → M000052.html} +0 -0
- data/doc/classes/String.src/{M000086.html → M000053.html} +0 -0
- data/doc/classes/String.src/{M000087.html → M000054.html} +0 -0
- data/doc/classes/String.src/{M000088.html → M000055.html} +1 -1
- data/doc/classes/String.src/{M000089.html → M000056.html} +1 -1
- data/doc/created.rid +1 -1
- data/doc/files/LICENSE.html +1 -1
- data/doc/files/README.html +38 -10
- data/doc/files/lib/qbxml/request_rb.html +2 -1
- data/doc/files/lib/qbxml/response_rb.html +1 -1
- data/doc/files/lib/qbxml/support_rb.html +1 -8
- data/doc/files/lib/qbxml_rb.html +14 -1
- data/doc/files/lib/quickbooks/adapters/ole_adapter_rb.html +1 -1
- data/doc/files/lib/quickbooks/adapters/qbxml_debug_adapter_rb.html +1 -1
- data/doc/files/lib/quickbooks/base_rb.html +8 -3
- data/doc/files/lib/quickbooks/model_rb.html +1 -2
- data/doc/files/lib/quickbooks/models/common/address_rb.html +1 -1
- data/doc/files/lib/quickbooks/models/common/all_refs_rb.html +1 -1
- data/doc/files/lib/quickbooks/models/customer/credit_card_info_rb.html +1 -1
- data/doc/files/lib/quickbooks/models/customer_rb.html +1 -1
- data/doc/files/lib/quickbooks/models/deleted_rb.html +1 -1
- data/doc/files/lib/quickbooks/models/list_item_rb.html +1 -1
- data/doc/files/lib/quickbooks/models/transaction_rb.html +1 -1
- data/doc/files/lib/quickbooks/ruby_magic_rb.html +2 -1
- data/doc/files/lib/quickbooks_rb.html +14 -1
- data/doc/fr_class_index.html +0 -5
- data/doc/fr_file_index.html +0 -1
- data/doc/fr_method_index.html +138 -190
- data/lib/qbxml.rb +1 -0
- data/lib/qbxml/request.rb +12 -10
- data/lib/qbxml/response.rb +1 -1
- data/lib/qbxml/support.rb +1 -1
- data/lib/quickbooks.rb +1 -0
- data/lib/quickbooks/adapters/ole_adapter.rb +3 -3
- data/lib/quickbooks/base.rb +30 -3
- data/lib/quickbooks/model.rb +14 -18
- data/lib/quickbooks/models/common/all_refs.rb +1 -0
- data/lib/quickbooks/models/deleted.rb +1 -1
- data/lib/quickbooks/models/list_item.rb +7 -1
- data/lib/quickbooks/models/transaction.rb +1 -1
- data/lib/quickbooks/ruby_magic.rb +28 -11
- metadata +124 -179
- data/doc/classes/Array.src/M000048.html +0 -23
- data/doc/classes/Array.src/M000051.html +0 -18
- data/doc/classes/Array.src/M000052.html +0 -18
- data/doc/classes/Array.src/M000053.html +0 -18
- data/doc/classes/Array.src/M000054.html +0 -20
- data/doc/classes/Array.src/M000055.html +0 -18
- data/doc/classes/Array.src/M000056.html +0 -34
- data/doc/classes/Array.src/M000057.html +0 -19
- data/doc/classes/Array.src/M000058.html +0 -29
- data/doc/classes/Array.src/M000059.html +0 -18
- data/doc/classes/Array.src/M000060.html +0 -20
- data/doc/classes/Array.src/M000061.html +0 -18
- data/doc/classes/Array.src/M000062.html +0 -18
- data/doc/classes/Array.src/M000063.html +0 -19
- data/doc/classes/Hash.src/M000026.html +0 -18
- data/doc/classes/Hash.src/M000027.html +0 -22
- data/doc/classes/Hash.src/M000028.html +0 -18
- data/doc/classes/Hash.src/M000029.html +0 -20
- data/doc/classes/Hash.src/M000031.html +0 -30
- data/doc/classes/Hash.src/M000032.html +0 -19
- data/doc/classes/Hash.src/M000033.html +0 -19
- data/doc/classes/Hash.src/M000034.html +0 -18
- data/doc/classes/Hash.src/M000035.html +0 -18
- data/doc/classes/Hash.src/M000036.html +0 -21
- data/doc/classes/OrderedArray.html +0 -178
- data/doc/classes/OrderedArray.src/M000001.html +0 -18
- data/doc/classes/OrderedArray.src/M000002.html +0 -18
- data/doc/classes/OrderedArray.src/M000003.html +0 -18
- data/doc/classes/OrderedHash.html +0 -324
- data/doc/classes/OrderedHash.src/M000064.html +0 -19
- data/doc/classes/OrderedHash.src/M000065.html +0 -18
- data/doc/classes/OrderedHash.src/M000066.html +0 -18
- data/doc/classes/OrderedHash.src/M000067.html +0 -18
- data/doc/classes/OrderedHash.src/M000068.html +0 -18
- data/doc/classes/OrderedHash.src/M000069.html +0 -18
- data/doc/classes/OrderedHash.src/M000070.html +0 -20
- data/doc/classes/OrderedHash.src/M000071.html +0 -18
- data/doc/classes/OrderedHash.src/M000072.html +0 -18
- data/doc/classes/OrderedHash.src/M000073.html +0 -19
- data/doc/classes/OrderedHash.src/M000074.html +0 -24
- data/doc/classes/SlashedArray.html +0 -226
- data/doc/classes/SlashedArray.src/M000161.html +0 -23
- data/doc/classes/SlashedArray.src/M000162.html +0 -18
- data/doc/classes/SlashedArray.src/M000163.html +0 -18
- data/doc/classes/SlashedArray.src/M000164.html +0 -22
- data/doc/classes/SlashedArray.src/M000165.html +0 -22
- data/doc/classes/SlashedArray.src/M000166.html +0 -18
- data/doc/classes/SlashedArray.src/M000167.html +0 -22
- data/doc/classes/SlashedHash.html +0 -193
- data/doc/classes/SlashedHash.src/M000156.html +0 -22
- data/doc/classes/SlashedHash.src/M000157.html +0 -18
- data/doc/classes/SlashedHash.src/M000158.html +0 -18
- data/doc/classes/SlashedHash.src/M000159.html +0 -27
- data/doc/classes/SlashedHash.src/M000160.html +0 -22
- data/doc/classes/String.src/M000090.html +0 -18
- data/doc/classes/String.src/M000091.html +0 -18
- data/doc/classes/String.src/M000092.html +0 -97
- data/doc/classes/UniqueArray.html +0 -193
- data/doc/classes/UniqueArray.src/M000151.html +0 -25
- data/doc/classes/UniqueArray.src/M000152.html +0 -18
- data/doc/classes/UniqueArray.src/M000153.html +0 -20
- data/doc/classes/UniqueArray.src/M000154.html +0 -20
- data/doc/classes/UniqueArray.src/M000155.html +0 -20
- data/doc/files/lib/quickbooks/structure_rb.html +0 -122
- data/lib/quickbooks/structure.rb +0 -393
data/lib/quickbooks/structure.rb
DELETED
@@ -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
|