hashmodel 0.4.0.beta1 → 0.4.0.beta2

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 (45) hide show
  1. data/Gemfile.lock +1 -1
  2. data/LICENSE.txt +1 -1
  3. data/README.markdown +65 -27
  4. data/hashmodel.gemspec +1 -1
  5. data/lib/hash_model/hash_model.rb +13 -105
  6. data/lib/hash_model/hash_model_create_object.rb +62 -0
  7. data/lib/hash_model/hash_model_delete.rb +13 -0
  8. data/lib/hash_model/hash_model_filter.rb +37 -0
  9. data/lib/hash_model/hash_model_flatten.rb +47 -0
  10. data/lib/hash_model/hash_model_group.rb +18 -0
  11. data/lib/hash_model/hash_model_update.rb +118 -0
  12. data/lib/hash_model/hash_model_where.rb +27 -0
  13. data/lib/hash_model/version.rb +1 -1
  14. data/lib/hashmodel.rb +1 -0
  15. data/lib/monkey_patch/deep_clone.rb +27 -0
  16. data/spec/hash_model/_current_spec.rb +6 -0
  17. data/spec/hash_model/hash_model_adding_records_spec.rb +338 -0
  18. data/spec/hash_model/hash_model_array_methods_spec.rb +132 -0
  19. data/spec/hash_model/hash_model_comparisons_spec.rb +55 -0
  20. data/spec/hash_model/hash_model_delete_spec.rb +51 -0
  21. data/spec/hash_model/hash_model_flattening_spec.rb +92 -0
  22. data/spec/hash_model/hash_model_group_spec.rb +67 -0
  23. data/spec/hash_model/hash_model_searching_spec.rb +245 -0
  24. data/spec/hash_model/hash_model_spec.rb +1 -1
  25. data/spec/hash_model/hash_model_unflattening_spec.rb +34 -0
  26. data/spec/hash_model/hash_model_update_spec.rb +147 -0
  27. data/spec/hash_model/hash_model_where_spec.rb +287 -0
  28. data/spec/support/configuration.rb +50 -0
  29. data/spec/support/debug_print.rb +13 -0
  30. data/spec/support/proc_tester.rb +17 -0
  31. metadata +49 -27
  32. data/_brainstorm/StrangeMarshal.txt +0 -0
  33. data/_brainstorm/_readme +0 -1
  34. data/_brainstorm/block_wheres.rb +0 -80
  35. data/_brainstorm/clone.rb +0 -19
  36. data/_brainstorm/hash_model_examples.rb +0 -57
  37. data/_brainstorm/hash_test.rb +0 -169
  38. data/_brainstorm/inspect.rb +0 -26
  39. data/_brainstorm/instance_vars.rb +0 -24
  40. data/_brainstorm/proc_tests.rb +0 -14
  41. data/_brainstorm/ref_val.rb +0 -16
  42. data/_brainstorm/regex_captures.rb +0 -18
  43. data/_brainstorm/spliting.rb +0 -46
  44. data/_brainstorm/test.rb +0 -27
  45. data/_brainstorm/unflat.rb +0 -16
@@ -0,0 +1,50 @@
1
+ require 'hashmodel'
2
+
3
+ RSpec.configure do |config|
4
+ config.before(:each) do
5
+
6
+ @records = [
7
+ {:switch => ["-x", "--xtended"], :parameter => {:type => String, :required => true}, :description => "Xish stuff"},
8
+ {:switch => ["-y", "--why"], :description => "lucky what?"},
9
+ {:switch => "-z", :parameter => {:type => String}, :description => "zee svitch zu moost calz"},
10
+ ]
11
+ @hm = HashModel.new(:raw_data=>@records)
12
+
13
+ @records2 = [
14
+ {:switch => ["-p", "--pea"], :parameter => {:type => Hash, :required => false}, :description => "Pea soup"},
15
+ {:switch => ["-q", "--quit"], :description => "exit the game"},
16
+ {:switch => "-r", :parameter => {:type => Fixnum}, :description => "Arrrrrrrrrrgh!"},
17
+ ]
18
+ @hm2 = HashModel.new(:raw_data=>@records2)
19
+
20
+ @flat_records = [
21
+ {:switch=>"-x", :parameter=>{:type=>String, :required=>true}, :description=>"Xish stuff", :_id=>0, :_group_id=>0},
22
+ {:switch=>"--xtended", :parameter=>{:type=>String, :required=>true}, :description=>"Xish stuff", :_id=>1, :_group_id=>0},
23
+ {:switch=>"-y", :description=>"lucky what?", :_id=>2, :_group_id=>1},
24
+ {:switch=>"--why", :description=>"lucky what?", :_id=>3, :_group_id=>1},
25
+ {:switch=>"-z", :parameter=>{:type=>String}, :description=>"zee svitch zu moost calz", :_id=>4, :_group_id=>2}
26
+ ]
27
+
28
+ @flat_records2 =[
29
+ {:switch=>"-p", :parameter=>{:type=>Hash, :required=>false}, :description=>"Pea soup", :_id=>0, :_group_id=>0},
30
+ {:switch=>"--pea", :parameter=>{:type=>Hash, :required=>false}, :description=>"Pea soup", :_id=>1, :_group_id=>0},
31
+ {:switch=>"-q", :description=>"exit the game", :_id=>2, :_group_id=>1},
32
+ {:switch=>"--quit", :description=>"exit the game", :_id=>3, :_group_id=>1},
33
+ {:switch=>"-r", :parameter=>{:type=>Fixnum}, :description=>"Arrrrrrrrrrgh!", :_id=>4, :_group_id=>2}
34
+ ]
35
+
36
+ @flat_records_all = [
37
+ {:switch=>"-x", :parameter=>{:type=>String, :required=>true}, :description=>"Xish stuff", :_id=>0, :_group_id=>0},
38
+ {:switch=>"--xtended", :parameter=>{:type=>String, :required=>true}, :description=>"Xish stuff", :_id=>1, :_group_id=>0},
39
+ {:switch=>"-y", :description=>"lucky what?", :_id=>2, :_group_id=>1},
40
+ {:switch=>"--why", :description=>"lucky what?", :_id=>3, :_group_id=>1},
41
+ {:switch=>"-z", :parameter=>{:type=>String}, :description=>"zee svitch zu moost calz", :_id=>4, :_group_id=>2},
42
+ {:switch=>"-p", :parameter=>{:type=>Hash, :required=>false}, :description=>"Pea soup", :_id=>5, :_group_id=>3},
43
+ {:switch=>"--pea", :parameter=>{:type=>Hash, :required=>false}, :description=>"Pea soup", :_id=>6, :_group_id=>3},
44
+ {:switch=>"-q", :description=>"exit the game", :_id=>7, :_group_id=>4},
45
+ {:switch=>"--quit", :description=>"exit the game", :_id=>8, :_group_id=>4},
46
+ {:switch=>"-r", :parameter=>{:type=>Fixnum}, :description=>"Arrrrrrrrrrgh!", :_id=>9, :_group_id=>5}
47
+ ]
48
+
49
+ end
50
+ end
@@ -0,0 +1,13 @@
1
+ # Debug print
2
+ module Kernel
3
+ def dp(value="")
4
+ puts ""
5
+ puts "*" * 40
6
+ puts value
7
+ puts "&" * 40
8
+ puts ""
9
+ end
10
+ def dpi(value)
11
+ dp value.inspect
12
+ end
13
+ end
@@ -0,0 +1,17 @@
1
+ # Make a new class with the given name and create instance variables set using key,value pairs.
2
+ # e.g. new_class = create_class "Dummy", {:x=>"x", :y=>String, :z=>["1",2,:three]}
3
+ def create_proc_tester(property_value_hash)
4
+ proc_test = Class.new.new
5
+
6
+ # Add an evaluator method to make it more clear what we are doing
7
+ proc_test.class.class_eval do
8
+ define_method(:xql?) { |&block| instance_eval &block }
9
+ end
10
+
11
+ # Add the property values to this instance of the class
12
+ property_value_hash.each do |key, value|
13
+ proc_test.instance_variable_set("@#{key}", value)
14
+ end
15
+
16
+ proc_test
17
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hashmodel
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0.beta1
4
+ version: 0.4.0.beta2
5
5
  prerelease: 6
6
6
  platform: ruby
7
7
  authors:
@@ -9,12 +9,12 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2011-03-19 00:00:00.000000000 -04:00
12
+ date: 2011-03-21 00:00:00.000000000 -04:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: sourcify
17
- requirement: &2157841220 !ruby/object:Gem::Requirement
17
+ requirement: &2158452320 !ruby/object:Gem::Requirement
18
18
  none: false
19
19
  requirements:
20
20
  - - ! '>='
@@ -22,10 +22,10 @@ dependencies:
22
22
  version: '0'
23
23
  type: :runtime
24
24
  prerelease: false
25
- version_requirements: *2157841220
25
+ version_requirements: *2158452320
26
26
  - !ruby/object:Gem::Dependency
27
27
  name: file-tail
28
- requirement: &2157840800 !ruby/object:Gem::Requirement
28
+ requirement: &2158451900 !ruby/object:Gem::Requirement
29
29
  none: false
30
30
  requirements:
31
31
  - - ! '>='
@@ -33,10 +33,10 @@ dependencies:
33
33
  version: '0'
34
34
  type: :runtime
35
35
  prerelease: false
36
- version_requirements: *2157840800
36
+ version_requirements: *2158451900
37
37
  - !ruby/object:Gem::Dependency
38
38
  name: rspec
39
- requirement: &2157840380 !ruby/object:Gem::Requirement
39
+ requirement: &2158451480 !ruby/object:Gem::Requirement
40
40
  none: false
41
41
  requirements:
42
42
  - - ! '>='
@@ -44,10 +44,10 @@ dependencies:
44
44
  version: '0'
45
45
  type: :development
46
46
  prerelease: false
47
- version_requirements: *2157840380
47
+ version_requirements: *2158451480
48
48
  - !ruby/object:Gem::Dependency
49
49
  name: cucumber
50
- requirement: &2157839940 !ruby/object:Gem::Requirement
50
+ requirement: &2158451040 !ruby/object:Gem::Requirement
51
51
  none: false
52
52
  requirements:
53
53
  - - ! '>='
@@ -55,10 +55,10 @@ dependencies:
55
55
  version: '0'
56
56
  type: :development
57
57
  prerelease: false
58
- version_requirements: *2157839940
59
- description: A simple MVC type model class for storing records based on nested hashes
60
- as an array of hashes. You can store deeply nested hashes and still easily flatten
61
- and query the records using flattened field names.
58
+ version_requirements: *2158451040
59
+ description: A hash based MVC model class that makes searching and updating deeply
60
+ nested hashes a breeze. You can store deeply nested hashes and still easily flatten,
61
+ query, and update the records using flattened field names.
62
62
  email:
63
63
  - mikbe.tk@gmail.com
64
64
  executables: []
@@ -73,20 +73,6 @@ files:
73
73
  - LICENSE.txt
74
74
  - README.markdown
75
75
  - Rakefile
76
- - _brainstorm/StrangeMarshal.txt
77
- - _brainstorm/_readme
78
- - _brainstorm/block_wheres.rb
79
- - _brainstorm/clone.rb
80
- - _brainstorm/hash_model_examples.rb
81
- - _brainstorm/hash_test.rb
82
- - _brainstorm/inspect.rb
83
- - _brainstorm/instance_vars.rb
84
- - _brainstorm/proc_tests.rb
85
- - _brainstorm/ref_val.rb
86
- - _brainstorm/regex_captures.rb
87
- - _brainstorm/spliting.rb
88
- - _brainstorm/test.rb
89
- - _brainstorm/unflat.rb
90
76
  - autotest/discover.rb
91
77
  - features/README
92
78
  - features/hash_model_flatten.feature
@@ -98,12 +84,34 @@ files:
98
84
  - hashmodel.gemspec
99
85
  - lib/hash_model/exceptions.rb
100
86
  - lib/hash_model/hash_model.rb
87
+ - lib/hash_model/hash_model_create_object.rb
88
+ - lib/hash_model/hash_model_delete.rb
89
+ - lib/hash_model/hash_model_filter.rb
90
+ - lib/hash_model/hash_model_flatten.rb
91
+ - lib/hash_model/hash_model_group.rb
92
+ - lib/hash_model/hash_model_update.rb
93
+ - lib/hash_model/hash_model_where.rb
101
94
  - lib/hash_model/version.rb
102
95
  - lib/hashmodel.rb
96
+ - lib/monkey_patch/deep_clone.rb
97
+ - spec/hash_model/_current_spec.rb
103
98
  - spec/hash_model/_marshelling_spec.rb
99
+ - spec/hash_model/hash_model_adding_records_spec.rb
100
+ - spec/hash_model/hash_model_array_methods_spec.rb
101
+ - spec/hash_model/hash_model_comparisons_spec.rb
102
+ - spec/hash_model/hash_model_delete_spec.rb
103
+ - spec/hash_model/hash_model_flattening_spec.rb
104
+ - spec/hash_model/hash_model_group_spec.rb
105
+ - spec/hash_model/hash_model_searching_spec.rb
104
106
  - spec/hash_model/hash_model_spec.rb
107
+ - spec/hash_model/hash_model_unflattening_spec.rb
108
+ - spec/hash_model/hash_model_update_spec.rb
109
+ - spec/hash_model/hash_model_where_spec.rb
105
110
  - spec/hash_model/hashmodel.dat
106
111
  - spec/spec_helper.rb
112
+ - spec/support/configuration.rb
113
+ - spec/support/debug_print.rb
114
+ - spec/support/proc_tester.rb
107
115
  has_rdoc: true
108
116
  homepage: http://github.com/mikbe/hashmodel
109
117
  licenses: []
@@ -137,7 +145,21 @@ test_files:
137
145
  - features/step_definitions/hash_model_steps.rb
138
146
  - features/support/env.rb
139
147
  - features/support/helper.rb
148
+ - spec/hash_model/_current_spec.rb
140
149
  - spec/hash_model/_marshelling_spec.rb
150
+ - spec/hash_model/hash_model_adding_records_spec.rb
151
+ - spec/hash_model/hash_model_array_methods_spec.rb
152
+ - spec/hash_model/hash_model_comparisons_spec.rb
153
+ - spec/hash_model/hash_model_delete_spec.rb
154
+ - spec/hash_model/hash_model_flattening_spec.rb
155
+ - spec/hash_model/hash_model_group_spec.rb
156
+ - spec/hash_model/hash_model_searching_spec.rb
141
157
  - spec/hash_model/hash_model_spec.rb
158
+ - spec/hash_model/hash_model_unflattening_spec.rb
159
+ - spec/hash_model/hash_model_update_spec.rb
160
+ - spec/hash_model/hash_model_where_spec.rb
142
161
  - spec/hash_model/hashmodel.dat
143
162
  - spec/spec_helper.rb
163
+ - spec/support/configuration.rb
164
+ - spec/support/debug_print.rb
165
+ - spec/support/proc_tester.rb
File without changes
@@ -1 +0,0 @@
1
- This is my scratchpad area where I try stuff out. Nothing really useful here.
@@ -1,80 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), "/../lib"))
2
- require 'hash_model'
3
- =begin
4
-
5
- # Creates an object with instance variables for each field at every level
6
- # This allows using a block like {:field1==true && :field2_subfield21="potato"}
7
- def create_object_from_flat_hash(record, hash_record=Class.new.new, parent_key=nil)
8
-
9
- # Iterate through the record creating the object recursively
10
- case record
11
- when Hash
12
- record.each do |key, value|
13
- flat_key = "#{parent_key}#{"__" if !parent_key.nil?}#{key}"
14
- hash_record.instance_variable_set("@#{flat_key}", value)
15
- hash_record = create_object_from_flat_hash(value, hash_record, flat_key)
16
- end
17
- when Array
18
- record.each do |value|
19
- hash_record = create_object_from_flat_hash(value, hash_record, parent_key)
20
- end
21
- else
22
- hash_record.instance_variable_set("@#{parent_key}", record)
23
- end # case
24
-
25
- hash_record
26
- end # create_object_from_flat_hash
27
-
28
-
29
-
30
- records = [
31
- {:switch => ["-x", "--xtended"], :parameter => {:type => String, :required => true}, :description => "Xish stuff", :something => 4},
32
- {:switch => ["-y", "--why"], :description => "lucky what?"},
33
- {:switch => "-z", :parameter => {:type => String, :required => true}, :description => "zee svitch zu moost calz", :something => 4},
34
- ]
35
- hm = HashModel.new(:raw_data=>records)
36
- where = hm.where {:something == 4 && :parameter__type == String && :parameter__required == true}
37
- puts "\nWhere:"
38
- puts where
39
-
40
-
41
- records = [
42
- {:switch => ["-x", "--xtended"], :parameter => {:type => String, :required => true}, :description => "Xish stuff", :something => 4},
43
- {:switch => ["-y", "--why"], :description => "lucky what?", :something => 7},
44
- {:switch => "-z", :parameter => {:type => Integer, :required => true}, :description => "zee svitch zu moost calz", :something => 4},
45
- ]
46
- hm = HashModel.new(:raw_data=>records)
47
- where = hm.where {:parameter == {:type => String, :required => true}}
48
- puts "\nWhere:"
49
- puts where
50
-
51
-
52
- puts "\nflat object"
53
- flat = create_object_from_flat_hash(hm[0])
54
- puts flat.inspect
55
- =end
56
-
57
- puts "\nproc"
58
- xproc = proc {:parameter == {:type => String, :required => true} && :switch == ["-x", "--xtended"]}
59
- xproc_source = xproc.to_source
60
- puts "xproc: #{xproc_source}"
61
-
62
- matches = xproc_source.scan(/(\:\S+) ==/)
63
-
64
- puts "matches: #{matches}"
65
- puts "\nshow items"
66
- matches.each do |item|
67
- puts "item: #{item}"
68
- end
69
- puts 'done'
70
- #"proc { #{@filter} }.call".gsub(":", "@")
71
-
72
- #x = "{:parameter == {:type => String, :required => true}, "
73
- #x.match
74
-
75
- puts "\nMatch test"
76
- text = "The future Ruby is Ruby"
77
- m1 = text.scan(/(Ruby)/)
78
- puts "m1: #{m1}"
79
-
80
- puts "\n\ndone"
@@ -1,19 +0,0 @@
1
- x = ["x", "y", "z"]
2
-
3
- class Foo
4
-
5
- attr_accessor :array
6
-
7
- def initialize(input)
8
- @array = input
9
- end
10
-
11
- end
12
-
13
-
14
-
15
- f = Foo.new(x)
16
-
17
- x[0] = "change"
18
-
19
- puts f.array
@@ -1,57 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), "/../lib"))
2
- require 'hash_model'
3
- require 'sourcify'
4
-
5
- records = [
6
- {:switch => ["-x", "--xtended"], :parameter => {:type => String, :require => true}, :description => "Xish stuff"},
7
- {:switch => ["-y", "--why"], :description => "lucky what?"},
8
- {:switch => "-z", :parameter => {:type => String}, :description => "zee svitch zu moost calz"},
9
- ]
10
-
11
- =begin
12
- hash_model = HashModel.new(:raw_data=>records)
13
-
14
- records = [
15
- {:switch => ["-x", "--xtended"], :parameter => {:type => String, :require => true}, :description => "Xish stuff"},
16
- {:switch => ["-y", "--why"], :description => "lucky what?"}
17
- ]
18
-
19
- records2 = {:switch => "-z", :parameter => {:type => String}, :description => "zee svitch zu moost calz"}
20
-
21
- hash_model = HashModel.new(:raw_data => records)
22
- hash_model2 = HashModel.new(:raw_data => records2)
23
-
24
- hash_model << hash_model2
25
- # or
26
- hash_model += hash_model2
27
-
28
-
29
- # Flatten index is automatically set to the first field ever given
30
- # but you can change it
31
- records = [
32
- {:switch => ["-x", "--xtended"], :parameter => {:type => String, :require => true}, :description => "Xish stuff"},
33
- {:switch => ["-y", "--why"], :description => "lucky what?"},
34
- {:switch => "-z", :parameter => {:type => String}, :description => "zee svitch zu moost calz"},
35
- ]
36
- hash_model = HashModel.new(:raw_data=>records)
37
-
38
- puts hash_model.flatten_index
39
- # you can use flattened field names
40
- hash_model.flatten_index = :parameter__type
41
- puts hash_model
42
-
43
- >> {:parameter__type=>String, :switch=>["-x", "--xtended"], :parameter__require=>true, :description=>"Xish stuff", :_id=>0, :_group_id=>0}
44
- >> {:parameter__type=>nil, :switch=>["-y", "--why"], :description=>"lucky what?", :_id=>1, :_group_id=>1}
45
- >> {:parameter__type=>String, :switch=>"-z", :description=>"zee svitch zu moost calz", :_id=>2, :_group_id=>2}
46
-
47
- # Notice that records that don't have the flatten index have their value set to nil
48
- =end
49
- # The real strength of the class is its ability to search flattened fields
50
- hash_model = HashModel.new(:raw_data=>records)
51
-
52
- # default is to use the flatten index
53
- puts hash_model.where("-z")
54
-
55
- # but you can also use a block with boolean search parameters
56
- # You must write the field names as @variables instead of symbols
57
- puts hash_model.where {@parameter_type}
@@ -1,169 +0,0 @@
1
- $LOAD_PATH.unshift File.expand_path(File.join(File.dirname(__FILE__), "/../lib"))
2
- require 'hash_model'
3
-
4
- hash = {
5
- :field1 => "f",
6
- :field2 => {
7
- :field3 => "f3",
8
- :field4 => {
9
- :field5 => "f5",
10
- :field6 => ["f6", "f7"]
11
- }
12
- }
13
- }
14
- =begin
15
-
16
- hash2 = {
17
- :switch => ["-x", "--xtend"],
18
- :parameter => {:type => String, :require => true},
19
- :description => "Xish stuff",
20
- :field => {:field2 => {:field3 => "ff3", :field4 => "ff4"}}
21
- }
22
-
23
- hash2 = {
24
- :switch => ["-x", "--xtend"],
25
- :parameter => {:type => String, :require => true},
26
- :description => "Xish stuff",
27
- :field => {:field2 => [:field3 => "ff3", :field4 => "ff4", "ff5"]}
28
- }
29
-
30
-
31
- hm = HashModel.new
32
- hm << hash2
33
- hm.flatten_index = :field__field2
34
-
35
-
36
- flat = {
37
- :field2__field4__field5=>"f5",
38
- :field1=>"f",
39
- :field3=>"f3",
40
- :field2__field4__field6=>["f6", "f7"]
41
- }
42
-
43
- [
44
- {
45
- :field__field2__field3=>"ff3",
46
- :field__field2__field4=>"ff4",
47
- :switch=>["-x", "--xtend"],
48
- :parameter__type=>String,
49
- :parameter__require=>true,
50
- :description=>"Xish stuff",
51
- }
52
- ]
53
-
54
- puts "\nhm: #{hm}"
55
- #hash2 = {:field => "field", :field2__field3 => "field3", :field2__field4 => {:field5 => "field5", :field6 => ["field6", "field7"]}}}
56
- =end
57
-
58
-
59
-
60
- def unflatten(input)
61
- # Seriously in need of a refactor, just looking at this hurts my brain
62
- case input
63
- when Hash
64
- new_record = {}
65
- input.each do |key, value|
66
- puts "#{key} => #{value}"
67
- # recursively look for flattened keys
68
- keys = key.to_s.split("__", 2)
69
- if keys[1]
70
- key = keys[0].to_sym
71
- value = unflatten({keys[1].to_sym => value})
72
- end
73
-
74
- # Don't overwrite existing value
75
- if (existing = new_record[key])
76
- # convert to array and search for subkeys if appropriate
77
- if existing.class == Hash
78
- # Convert to an array if something other than a hash is added
79
- unless value.class == Hash
80
- new_record[key] = hash_to_array(existing)
81
- new_record[key] << value
82
- else
83
- # Search subkeys for duplicate values if it's a hash
84
- unless (found_keys = existing.keys & value.keys).empty?
85
- found_keys.each do |found_key|
86
- if new_record[key][found_key].class == Hash
87
- unless value[found_key].class == Hash
88
- new_record[key] = hash_to_array(new_record[key][found_key])
89
- new_record[key] << value[found_key]
90
- else
91
- new_record[key][found_key].merge!(value[found_key])
92
- end
93
- end
94
- end
95
- else
96
- new_record[key].merge!(value)
97
- end
98
- end
99
- else
100
- new_record[key] << value
101
- end
102
- else
103
- new_record.merge!(key => value)
104
- end
105
- end
106
- new_record
107
- when Array
108
- # recurse into array
109
- input.collect! {|item| unflatten(item) }
110
- else
111
- input
112
- end
113
- end
114
-
115
-
116
- def hash_to_array(hash)
117
- array = []
118
- hash.each do |key, value|
119
- array << {key => value}
120
- end
121
- array
122
- end
123
-
124
- hash = [
125
- {
126
- :field__field2__field3=>"ff3",
127
- :field__field2__field4=>"ff4"
128
- }
129
- ]
130
-
131
- hash2 = {
132
- :switch=>["-x", "--xtend"],
133
- :parameter__type=>String,
134
- :parameter__require=>true,
135
- :description=>"Xish stuff",
136
- }
137
-
138
-
139
- hash3 = {
140
- :switch=>[{:deep1 => "deepOne"}, {:deep2 => "deepTwo"}, "--xtend"],
141
- :parameter__type=>String,
142
- :parameter__require=>true,
143
- :description=>"Xish stuff",
144
- }
145
-
146
-
147
- hash4 = {
148
- :parameter__type=>String,
149
- :switch__deep1__deep3 => "deepTwo",
150
- :parameter__type__ruby=>true,
151
- :parameter => "glorp",
152
- :parameter__require=>true,
153
- :switch__deep2 => "deepTwo",
154
- :description=>"Xish stuff",
155
- :switch => "--xtend",
156
- }
157
-
158
-
159
- unflat = unflatten(hash4)
160
- puts "\nUnflat: #{unflat}"
161
-
162
- =begin
163
- puts "to_a: #{hash2.to_a}"
164
-
165
- x = [1,2,3]
166
- y = [3,4,5]
167
-
168
- puts "\nx & y = #{x & y}"
169
- =end