lorj 0.2.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (106) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/.rubocop.yml +46 -0
  4. data/Gemfile +15 -15
  5. data/README.md +22 -17
  6. data/Rakefile +12 -2
  7. data/bin/cloud_test.rb +13 -65
  8. data/example/students_1/process/students.rb +39 -0
  9. data/example/students_1/students.rb +22 -5
  10. data/example/students_2/process/students.rb +48 -0
  11. data/example/students_2/students.rb +39 -16
  12. data/example/students_3/controller/yaml_students.rb +50 -43
  13. data/example/students_3/controller/yaml_students_controller.rb +100 -87
  14. data/example/students_3/process/students.rb +161 -97
  15. data/example/students_3/students.rb +85 -56
  16. data/example/yaml_students/students.rb +40 -40
  17. data/example/yaml_students/yaml_students.rb +103 -90
  18. data/lib/core/core.rb +356 -696
  19. data/lib/core/core_controller.rb +227 -0
  20. data/lib/core/core_internal.rb +339 -0
  21. data/lib/core/core_model.rb +328 -0
  22. data/lib/core/core_object_data.rb +330 -0
  23. data/lib/core/core_object_params.rb +230 -0
  24. data/lib/core/core_process.rb +391 -0
  25. data/lib/core/core_process_setup.rb +353 -0
  26. data/lib/core/core_setup_ask.rb +241 -0
  27. data/lib/core/core_setup_encrypt.rb +146 -0
  28. data/lib/core/core_setup_init.rb +229 -0
  29. data/lib/core/core_setup_list.rb +160 -0
  30. data/lib/core/definition.rb +647 -469
  31. data/lib/core/definition_internal.rb +264 -308
  32. data/lib/core/lorj_basecontroller.rb +95 -0
  33. data/lib/core/lorj_basedefinition.rb +307 -0
  34. data/lib/core/lorj_baseprocess.rb +265 -0
  35. data/lib/core/lorj_data.rb +583 -0
  36. data/lib/core/lorj_keypath.rb +119 -0
  37. data/lib/core_process/cloud/process/common.rb +63 -0
  38. data/lib/core_process/cloud/process/connection.rb +93 -0
  39. data/lib/core_process/cloud/process/external_network.rb +94 -0
  40. data/lib/core_process/cloud/process/flavor.rb +99 -0
  41. data/lib/core_process/cloud/process/images.rb +87 -0
  42. data/lib/core_process/cloud/process/internet_network.rb +34 -0
  43. data/lib/core_process/cloud/process/internet_server.rb +30 -0
  44. data/lib/core_process/cloud/process/keypairs.rb +276 -0
  45. data/lib/core_process/cloud/process/network.rb +108 -0
  46. data/lib/core_process/cloud/process/public_ip.rb +100 -0
  47. data/lib/core_process/cloud/process/router.rb +260 -0
  48. data/lib/core_process/cloud/process/rules.rb +120 -0
  49. data/lib/core_process/cloud/process/security_groups.rb +121 -0
  50. data/lib/core_process/cloud/process/server.rb +127 -0
  51. data/lib/core_process/cloud/process/server_log.rb +35 -0
  52. data/lib/core_process/cloud/process/subnetwork.rb +108 -0
  53. data/lib/core_process/cloud_process.rb +30 -0
  54. data/lib/logging.rb +298 -0
  55. data/lib/lorj/version.rb +18 -1
  56. data/lib/lorj.rb +58 -18
  57. data/lib/lorj_account.rb +556 -0
  58. data/lib/lorj_config.rb +468 -0
  59. data/lib/lorj_defaults.rb +278 -0
  60. data/lib/prc.rb +136 -104
  61. data/lib/prc_base_config.rb +285 -0
  62. data/lib/prc_core_config.rb +878 -0
  63. data/lib/prc_section_config.rb +57 -0
  64. data/lib/providers/hpcloud/compute.rb +81 -93
  65. data/lib/providers/hpcloud/hpcloud.rb +462 -0
  66. data/lib/providers/hpcloud/network.rb +96 -98
  67. data/lib/providers/hpcloud/security_groups.rb +41 -40
  68. data/lib/providers/mock/mock.rb +144 -0
  69. data/lib/providers/openstack/openstack.rb +45 -0
  70. data/lib/providers/templates/compute.rb +21 -23
  71. data/lib/providers/templates/mycloud.rb +72 -0
  72. data/lib/providers/templates/network.rb +11 -12
  73. data/lib/rh.rb +339 -0
  74. data/lorj-spec/defaults.yaml +4 -0
  75. data/lorj.gemspec +6 -0
  76. data/spec/00_lorj_log_spec.rb +53 -0
  77. data/spec/01_hash_rh_spec.rb +243 -0
  78. data/spec/02_prc_base_config_spec.rb +216 -0
  79. data/spec/04_prc_core_config_spec.rb +83 -0
  80. data/spec/11_lorj_config_spec.rb +263 -0
  81. data/spec/12_lorj_account_spec.rb +181 -0
  82. metadata +76 -28
  83. data/Gemfile.lock +0 -37
  84. data/example/students_1/process/Students.rb +0 -20
  85. data/example/students_2/process/Students.rb +0 -27
  86. data/example/students_4/controller/yaml_students.rb +0 -82
  87. data/example/students_4/controller/yaml_students_controller.rb +0 -141
  88. data/example/students_4/process/students.rb +0 -112
  89. data/example/students_4/students.rb +0 -103
  90. data/lib/core/lorj-basecontroller.rb +0 -90
  91. data/lib/core/lorj-basedefinition.rb +0 -1139
  92. data/lib/core/lorj-baseprocess.rb +0 -236
  93. data/lib/core/lorj-data.rb +0 -567
  94. data/lib/core/lorj-keypath.rb +0 -115
  95. data/lib/core_process/CloudProcess.rb +0 -337
  96. data/lib/core_process/global_process.rb +0 -502
  97. data/lib/core_process/network_process.rb +0 -605
  98. data/lib/prc-account.rb +0 -339
  99. data/lib/prc-config.rb +0 -1030
  100. data/lib/prc-logging.rb +0 -261
  101. data/lib/providers/hpcloud/Hpcloud.rb +0 -426
  102. data/lib/providers/mock/Mock.rb +0 -141
  103. data/lib/providers/openstack/Openstack.rb +0 -47
  104. data/lib/providers/templates/core.rb +0 -61
  105. data/spec/forj-account_spec.rb +0 -75
  106. data/spec/forj-config_spec.rb +0 -196
data/lib/rh.rb ADDED
@@ -0,0 +1,339 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ # (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ require 'rubygems'
19
+ require 'yaml'
20
+
21
+ # Recursive Hash added to the Hash class
22
+ class Hash
23
+ # Recursive Hash deep level found counter
24
+ # This function will returns the count of deep level of recursive hash.
25
+ # * *Args* :
26
+ # - +p+ : Array of string or symbols. keys tree to follow and check
27
+ # existence in yVal.
28
+ #
29
+ # * *Returns* :
30
+ # - +integer+ : Represents how many deep level was found in the recursive
31
+ # hash
32
+ #
33
+ # * *Raises* :
34
+ # No exceptions
35
+ #
36
+ # Example: (implemented in spec)
37
+ #
38
+ # yVal = { :test => {:test2 => 'value1', :test3 => 'value2'},
39
+ # :test4 => 'value3'}
40
+ #
41
+ # yVal can be represented like:
42
+ #
43
+ # yVal:
44
+ # test:
45
+ # test2 = 'value1'
46
+ # test3 = 'value2'
47
+ # test4 = 'value3'
48
+ #
49
+ # so:
50
+ # # test is found
51
+ # yVal.rh_lexist?(:test) => 1
52
+ #
53
+ # # no test5
54
+ # yVal.rh_lexist?(:test5) => 0
55
+ #
56
+ # # :test/:test2 tree is found
57
+ # yVal.rh_lexist?(:test, :test2) => 2
58
+ #
59
+ # # :test/:test2 is found (value = 2), but :test5 was not found in this tree
60
+ # yVal.rh_lexist?(:test, :test2, :test5) => 2
61
+ #
62
+ # # :test was found. but :test/:test5 tree was not found. so level 1, ok.
63
+ # yVal.rh_lexist?(:test, :test5 ) => 1
64
+ #
65
+ # # it is like searching for nothing...
66
+ # yVal.rh_lexist? => 0
67
+
68
+ def rh_lexist?(*p)
69
+ return 0 if p.length == 0
70
+
71
+ p = p.flatten
72
+ if p.length == 1
73
+ return 1 if self.key?(p[0])
74
+ return 0
75
+ end
76
+ return 0 unless self.key?(p[0])
77
+ ret = 0
78
+ ret = self[p[0]].rh_lexist?(p.drop(1)) if self[p[0]].is_a?(Hash)
79
+ 1 + ret
80
+ end
81
+
82
+ # Recursive Hash deep level existence
83
+ #
84
+ # * *Args* :
85
+ # - +p+ : Array of string or symbols. keys tree to follow and check
86
+ # existence in yVal.
87
+ #
88
+ # * *Returns* :
89
+ # - +boolean+ : Returns True if the deep level of recursive hash is found.
90
+ # false otherwise
91
+ #
92
+ # * *Raises* :
93
+ # No exceptions
94
+ #
95
+ # Example:(implemented in spec)
96
+ #
97
+ # yVal = { :test => {:test2 => 'value1', :test3 => 'value2'},
98
+ # :test4 => 'value3'}
99
+ #
100
+ # yVal can be represented like:
101
+ #
102
+ # yVal:
103
+ # test:
104
+ # test2 = 'value1'
105
+ # test3 = 'value2'
106
+ # test4 = 'value3'
107
+ #
108
+ # so:
109
+ # # test is found
110
+ # yVal.rh_exist?(:test) => True
111
+ #
112
+ # # no test5
113
+ # yVal.rh_exist?(:test5) => False
114
+ #
115
+ # # :test/:test2 tree is found
116
+ # yVal.rh_exist?(:test, :test2) => True
117
+ #
118
+ # # :test/:test2 is found (value = 2), but :test5 was not found in this tree
119
+ # yVal.rh_exist?(:test, :test2, :test5) => False
120
+ #
121
+ # # :test was found. but :test/:test5 tree was not found. so level 1, ok.
122
+ # yVal.rh_exist?(:test, :test5 ) => False
123
+ #
124
+ # # it is like searching for nothing...
125
+ # yVal.rh_exist? => nil
126
+ def rh_exist?(*p)
127
+ return nil if p.length == 0
128
+
129
+ count = p.length
130
+ (rh_lexist?(*p) == count)
131
+ end
132
+
133
+ # Recursive Hash Get
134
+ # This function will returns the level of recursive hash was found.
135
+ # * *Args* :
136
+ # - +p+ : Array of string or symbols. keys tree to follow and check
137
+ # existence in yVal.
138
+ #
139
+ # * *Returns* :
140
+ # - +value+ : Represents the data found in the tree. Can be of any type.
141
+ #
142
+ # * *Raises* :
143
+ # No exceptions
144
+ #
145
+ # Example:(implemented in spec)
146
+ #
147
+ # yVal = { :test => {:test2 => 'value1', :test3 => 'value2'},
148
+ # :test4 => 'value3'}
149
+ #
150
+ # yVal can be represented like:
151
+ #
152
+ # yVal:
153
+ # test:
154
+ # test2 = 'value1'
155
+ # test3 = 'value2'
156
+ # test4 = 'value3'
157
+ #
158
+ # so:
159
+ # yVal.rh_get(:test) => {:test2 => 'value1', :test3 => 'value2'}
160
+ # yVal.rh_get(:test5) => nil
161
+ # yVal.rh_get(:test, :test2) => 'value1'
162
+ # yVal.rh_get(:test, :test2, :test5) => nil
163
+ # yVal.rh_get(:test, :test5 ) => nil
164
+ # yVal.rh_get => { :test => {:test2 => 'value1', :test3 => 'value2'},
165
+ # :test4 => 'value3'}
166
+ def rh_get(*p)
167
+ p = p.flatten
168
+ return self if p.length == 0
169
+
170
+ if p.length == 1
171
+ return self[p[0]] if self.key?(p[0])
172
+ return nil
173
+ end
174
+ return self[p[0]].rh_get(p.drop(1)) if self[p[0]].is_a?(Hash)
175
+ nil
176
+ end
177
+
178
+ # Recursive Hash Set
179
+ # This function will build a recursive hash according to the '*p' key tree.
180
+ # if yVal is not nil, it will be updated.
181
+ #
182
+ # * *Args* :
183
+ # - +p+ : Array of string or symbols. keys tree to follow and check
184
+ # existence in yVal.
185
+ #
186
+ # * *Returns* :
187
+ # - +value+ : the value set.
188
+ #
189
+ # * *Raises* :
190
+ # No exceptions
191
+ #
192
+ # Example:(implemented in spec)
193
+ #
194
+ # yVal = {}
195
+ #
196
+ # yVal.rh_set(:test) => nil
197
+ # # yVal = {}
198
+ #
199
+ # yVal.rh_set(:test5) => nil
200
+ # # yVal = {}
201
+ #
202
+ # yVal.rh_set(:test, :test2) => :test
203
+ # # yVal = {:test2 => :test}
204
+ #
205
+ # yVal.rh_set(:test, :test2, :test5) => :test
206
+ # # yVal = {:test2 => {:test5 => :test} }
207
+ #
208
+ # yVal.rh_set(:test, :test5 ) => :test
209
+ # # yVal = {:test2 => {:test5 => :test}, :test5 => :test }
210
+ #
211
+ # yVal.rh_set('blabla', :test2, 'text') => :test
212
+ # # yVal = {:test2 => {:test5 => :test, 'text' => 'blabla'},
213
+ # :test5 => :test }
214
+ def rh_set(value, *p)
215
+ return nil if p.length == 0
216
+
217
+ p = p.flatten
218
+ if p.length == 1
219
+ self[p[0]] = value
220
+ return value
221
+ end
222
+
223
+ self[p[0]] = {} unless self[p[0]].is_a?(Hash)
224
+ self[p[0]].rh_set(value, p.drop(1))
225
+ end
226
+
227
+ # Recursive Hash delete
228
+ # This function will remove the last key defined by the key tree
229
+ #
230
+ # * *Args* :
231
+ # - +p+ : Array of string or symbols. keys tree to follow and check
232
+ # existence in yVal.
233
+ #
234
+ # * *Returns* :
235
+ # - +value+ : The Hash updated.
236
+ #
237
+ # * *Raises* :
238
+ # No exceptions
239
+ #
240
+ # Example:(implemented in spec)
241
+ #
242
+ # yVal = {{:test2 => { :test5 => :test,
243
+ # 'text' => 'blabla' },
244
+ # :test5 => :test}}
245
+ #
246
+ #
247
+ # yVal.rh_del(:test) => nil
248
+ # # yVal = no change
249
+ #
250
+ # yVal.rh_del(:test, :test2) => nil
251
+ # # yVal = no change
252
+ #
253
+ # yVal.rh_del(:test2, :test5) => {:test5 => :test}
254
+ # # yVal = {:test2 => {:test5 => :test} }
255
+ #
256
+ # yVal.rh_del(:test, :test2)
257
+ # # yVal = {:test2 => {:test5 => :test} }
258
+ #
259
+ # yVal.rh_del(:test, :test5)
260
+ # # yVal = {:test2 => {} }
261
+ #
262
+ def rh_del(*p)
263
+ return nil if p.length == 0
264
+
265
+ p = p.flatten
266
+ return delete(p[0]) if p.length == 1
267
+
268
+ return nil if self[p[0]].nil?
269
+ self[p[0]].rh_del(p.drop(1))
270
+ end
271
+
272
+ # Move levels (default level 1) of tree keys to become symbol.
273
+ #
274
+ # * *Args* :
275
+ # - +levels+: level of key tree to update.
276
+ # * *Returns* :
277
+ # - a new hash of hashes updated. Original Hash is not updated anymore.
278
+ #
279
+ # examples:
280
+ # With hdata = { :test => { :test2 => { :test5 => :test,
281
+ # 'text' => 'blabla' },
282
+ # 'test5' => 'test' }}
283
+ #
284
+ # rh_key_to_symbol(1) return no diff
285
+ # rh_key_to_symbol(2) return "test5" is replaced by :test5
286
+ # # hdata = { :test => { :test2 => { :test5 => :test,
287
+ # # 'text' => 'blabla' },
288
+ # # :test5 => 'test' }}
289
+ # rh_key_to_symbol(3) return "test5" replaced by :test5, and "text" to :text
290
+ # # hdata = { :test => { :test2 => { :test5 => :test,
291
+ # # :text => 'blabla' },
292
+ # # :test5 => 'test' }}
293
+ # rh_key_to_symbol(4) same like rh_key_to_symbol(3)
294
+
295
+ def rh_key_to_symbol(levels = 1)
296
+ result = {}
297
+ each do | key, value |
298
+ new_key = key
299
+ new_key = key.to_sym if key.is_a?(String)
300
+ if value.is_a?(Hash) && levels > 1
301
+ value = value.rh_key_to_symbol(levels - 1)
302
+ end
303
+ result[new_key] = value
304
+ end
305
+ result
306
+ end
307
+
308
+ # Check if levels of tree keys are all symbols.
309
+ #
310
+ # * *Args* :
311
+ # - +levels+: level of key tree to update.
312
+ # * *Returns* :
313
+ # - true : one key path is not symbol.
314
+ # - false : all key path are symbols.
315
+ # * *Raises* :
316
+ # Nothing
317
+ #
318
+ # examples:
319
+ # With hdata = { :test => { :test2 => { :test5 => :test,
320
+ # 'text' => 'blabla' },
321
+ # 'test5' => 'test' }}
322
+ #
323
+ # rh_key_to_symbol?(1) return false
324
+ # rh_key_to_symbol?(2) return true
325
+ # rh_key_to_symbol?(3) return true
326
+ # rh_key_to_symbol?(4) return true
327
+ def rh_key_to_symbol?(levels = 1)
328
+ each do | key, value |
329
+ return true if key.is_a?(String)
330
+
331
+ res = false
332
+ if levels > 1 && value.is_a?(Hash)
333
+ res = value.rh_key_to_symbol?(levels - 1)
334
+ end
335
+ return true if res
336
+ end
337
+ false
338
+ end
339
+ end
@@ -15,6 +15,8 @@
15
15
  # Defaults yaml file used for rspec.
16
16
  :default:
17
17
  :maestro_url: http://example.org
18
+ :keypair_name: default_key
19
+ :data: None
18
20
 
19
21
  :description:
20
22
  :FORJ_HPC: Testing extra application default value.
@@ -22,5 +24,7 @@
22
24
  :sections:
23
25
  :credentials:
24
26
  :keypair_name:
27
+ :data:
28
+ :account_exclusive: true
25
29
  :maestro:
26
30
  :maestro_url:
data/lorj.gemspec CHANGED
@@ -3,6 +3,11 @@ lib = File.expand_path('../lib', __FILE__)
3
3
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
  require 'lorj/version'
5
5
 
6
+ require 'rbconfig'
7
+ ruby_conf = defined?(RbConfig) ? RbConfig::CONFIG : Config::CONFIG
8
+ less_than_one_nine = ruby_conf['MAJOR'].to_i == 1 && ruby_conf['MINOR'].to_i < 9
9
+ less_than_two = ruby_conf['MAJOR'].to_i < 2
10
+
6
11
  Gem::Specification.new do |spec|
7
12
  spec.name = 'lorj'
8
13
  spec.version = Lorj::VERSION
@@ -24,6 +29,7 @@ Gem::Specification.new do |spec|
24
29
  spec.add_development_dependency 'bundler'
25
30
  spec.add_development_dependency 'rake', '~> 10.0'
26
31
  spec.add_development_dependency 'rspec', '~> 3.1.0'
32
+ spec.add_development_dependency 'byebug' unless less_than_two
27
33
  spec.rdoc_options << \
28
34
  '--title Lorj - The Process Controllers framework system' << \
29
35
  '--main README.md'
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ # (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ # require 'rubygems'
19
+ # require 'byebug'
20
+ # require 'bundler/setup'
21
+
22
+ app_path = File.dirname(File.dirname(__FILE__))
23
+
24
+ $LOAD_PATH << './lib'
25
+
26
+ # This spec HAVE to the the first one executed!
27
+ # Do never create a file or rename this file, which will
28
+ # move this spec later in the spec test system
29
+ # as soon as a first message is sent, the object gets created.
30
+ # Any PrcLib::level should be moved in the first test code executed.
31
+ # otherwise, you will break the first test in this file.
32
+
33
+ describe 'Module: Lorj,' do
34
+ context 'Initializing' do
35
+ it 'PrcLib module exist' do
36
+ require 'lorj' # Load lorj framework
37
+ expect(PrcLib.class).to equal(Module)
38
+
39
+ expect(PrcLib.log).to be_nil
40
+ end
41
+
42
+ it 'create PrcLib.log object at first message' do
43
+ PrcLib.log_file = 'lorj-rspec.log'
44
+ PrcLib.level = Logger::FATAL
45
+ PrcLib.app_name = 'lorj-spec'
46
+ PrcLib.app_defaults = File.join(app_path, 'lorj-spec')
47
+
48
+ PrcLib.debug 'Rspec logging ...'
49
+
50
+ expect(PrcLib.log).to_not be_nil
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,243 @@
1
+ #!/usr/bin/env ruby
2
+ # encoding: UTF-8
3
+
4
+ # (c) Copyright 2014 Hewlett-Packard Development Company, L.P.
5
+ #
6
+ # Licensed under the Apache License, Version 2.0 (the "License");
7
+ # you may not use this file except in compliance with the License.
8
+ # You may obtain a copy of the License at
9
+ #
10
+ # http://www.apache.org/licenses/LICENSE-2.0
11
+ #
12
+ # Unless required by applicable law or agreed to in writing, software
13
+ # distributed under the License is distributed on an "AS IS" BASIS,
14
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ # See the License for the specific language governing permissions and
16
+ # limitations under the License.
17
+
18
+ $LOAD_PATH << File.join('..', 'lib')
19
+
20
+ require 'rh'
21
+
22
+ describe 'Recursive Hash extension,' do
23
+ context "With { :test => {:test2 => 'value1', :test3 => 'value2'},"\
24
+ ":test4 => 'value3'}" do
25
+ before(:all) do
26
+ @hdata = { :test => { :test2 => 'value1', :test3 => 'value2' },
27
+ :test4 => 'value3' }
28
+ end
29
+ it 'rh_lexist?(:test) return 1' do
30
+ expect(@hdata.rh_lexist?(:test)).to eq(1)
31
+ end
32
+
33
+ it 'rh_lexist?(:test5) return 0' do
34
+ expect(@hdata.rh_lexist?(:test5)).to eq(0)
35
+ end
36
+
37
+ it 'rh_lexist?(:test, :test2) return 2' do
38
+ expect(@hdata.rh_lexist?(:test, :test2)).to eq(2)
39
+ end
40
+
41
+ it 'rh_lexist?(:test, :test2, :test5) return 2' do
42
+ expect(@hdata.rh_lexist?(:test, :test2, :test5)).to eq(2)
43
+ end
44
+
45
+ it 'rh_lexist?(:test, :test5 ) return 1' do
46
+ expect(@hdata.rh_lexist?(:test, :test5)).to eq(1)
47
+ end
48
+
49
+ it 'rh_lexist? return 0' do
50
+ expect(@hdata.rh_lexist?).to eq(0)
51
+ end
52
+ end
53
+
54
+ context "With { :test => {:test2 => 'value1', :test3 => 'value2'},"\
55
+ ":test4 => 'value3'}" do
56
+ before(:all) do
57
+ @hdata = { :test => { :test2 => 'value1', :test3 => 'value2' },
58
+ :test4 => 'value3' }
59
+ end
60
+ it 'rh_exist?(:test) return true' do
61
+ expect(@hdata.rh_exist?(:test)).to equal(true)
62
+ end
63
+
64
+ it 'rh_exist?(:test5) return false' do
65
+ expect(@hdata.rh_exist?(:test5)).to equal(false)
66
+ end
67
+
68
+ it 'rh_exist?(:test, :test2) return true' do
69
+ expect(@hdata.rh_exist?(:test, :test2)).to equal(true)
70
+ end
71
+
72
+ it 'rh_exist?(:test, :test2, :test5) return false' do
73
+ expect(@hdata.rh_exist?(:test, :test2, :test5)).to equal(false)
74
+ end
75
+
76
+ it 'rh_exist?(:test, :test5 ) return false' do
77
+ expect(@hdata.rh_exist?(:test, :test5)).to equal(false)
78
+ end
79
+
80
+ it 'rh_exist? return nil' do
81
+ expect(@hdata.rh_exist?).to eq(nil)
82
+ end
83
+ end
84
+
85
+ context "With { :test => {:test2 => 'value1', :test3 => 'value2'},"\
86
+ ":test4 => 'value3'}" do
87
+ before(:all) do
88
+ @hdata = { :test => { :test2 => 'value1',
89
+ :test3 => 'value2' },
90
+ :test4 => 'value3' }
91
+ end
92
+ it "rh_get(:test) return {:test2 => 'value1', :test3 => 'value2'}" do
93
+ expect(@hdata.rh_get(:test)).to eq(:test2 => 'value1',
94
+ :test3 => 'value2')
95
+ end
96
+
97
+ it 'rh_get(:test5) return nil' do
98
+ expect(@hdata.rh_get(:test5)).to equal(nil)
99
+ end
100
+
101
+ it "rh_get(:test, :test2) return 'value1'" do
102
+ expect(@hdata.rh_get(:test, :test2)).to eq('value1')
103
+ end
104
+
105
+ it 'rh_get(:test, :test2, :test5) return nil' do
106
+ expect(@hdata.rh_get(:test, :test2, :test5)).to equal(nil)
107
+ end
108
+
109
+ it 'rh_get(:test, :test5) return nil' do
110
+ expect(@hdata.rh_get(:test, :test5)).to equal(nil)
111
+ end
112
+
113
+ it 'rh_get return original data' do
114
+ expect(@hdata.rh_get).to eq(:test => { :test2 => 'value1',
115
+ :test3 => 'value2' },
116
+ :test4 => 'value3')
117
+ end
118
+ end
119
+
120
+ context 'With hdata = {}' do
121
+ before(:all) do
122
+ @hdata = {}
123
+ end
124
+ it 'rh_set(:test) return nil, with no change to hdata.' do
125
+ expect(@hdata.rh_set(:test)).to equal(nil)
126
+ expect(@hdata).to eq({})
127
+ end
128
+
129
+ it 'rh_set(:test, :test2) add a new element :test2 => :test' do
130
+ expect(@hdata.rh_set(:test, :test2)).to eq(:test)
131
+ expect(@hdata).to eq(:test2 => :test)
132
+ end
133
+
134
+ it 'rh_set(:test, :test2, :test5) replace :test2 by :test5 => :test' do
135
+ expect(@hdata.rh_set(:test, :test2, :test5)).to eq(:test)
136
+ expect(@hdata).to eq(:test2 => { :test5 => :test })
137
+ end
138
+
139
+ it 'rh_set(:test, :test5 ) add :test5 => :test, colocated with :test2' do
140
+ expect(@hdata.rh_set(:test, :test5)).to equal(:test)
141
+ expect(@hdata).to eq(:test2 => { :test5 => :test },
142
+ :test5 => :test)
143
+ end
144
+
145
+ it "rh_set('blabla', :test2, 'text') add a 'test' => 'blabla' under"\
146
+ ' :test2, colocated with ẗest5 ' do
147
+ expect(@hdata.rh_set('blabla', :test2, 'text')).to eq('blabla')
148
+ expect(@hdata).to eq(:test2 => { :test5 => :test,
149
+ 'text' => 'blabla' },
150
+ :test5 => :test)
151
+ end
152
+
153
+ it 'rh_set(nil, :test2) remove :test2 value' do
154
+ expect(@hdata.rh_set(nil, :test2)).to equal(nil)
155
+ expect(@hdata).to eq(:test2 => nil,
156
+ :test5 => :test)
157
+ end
158
+ end
159
+
160
+ context 'With hdata = {:test2 => { :test5 => :test,'\
161
+ "'text' => 'blabla' },"\
162
+ ':test5 => :test}' do
163
+ before(:all) do
164
+ @hdata = { :test2 => { :test5 => :test,
165
+ 'text' => 'blabla' },
166
+ :test5 => :test }
167
+ end
168
+ it 'rh_del(:test) return nil, with no change to hdata.' do
169
+ expect(@hdata.rh_del(:test)).to equal(nil)
170
+ expect(@hdata).to eq(:test2 => { :test5 => :test,
171
+ 'text' => 'blabla' },
172
+ :test5 => :test)
173
+ end
174
+
175
+ it 'rh_del(:test, :test2) return nil, with no change to hdata.' do
176
+ expect(@hdata.rh_del(:test, :test2)).to eq(nil)
177
+ expect(@hdata).to eq(:test2 => { :test5 => :test,
178
+ 'text' => 'blabla' },
179
+ :test5 => :test)
180
+ end
181
+
182
+ it 'rh_del(:test2, :test5) remove :test5 keys tree from :test2' do
183
+ expect(@hdata.rh_del(:test2, :test5)).to eq(:test)
184
+ expect(@hdata).to eq(:test2 => { 'text' => 'blabla' },
185
+ :test5 => :test)
186
+ end
187
+
188
+ it 'rh_del(:test5 ) remove :test5' do
189
+ expect(@hdata.rh_del(:test5)).to equal(:test)
190
+ expect(@hdata).to eq(:test2 => { 'text' => 'blabla' })
191
+ end
192
+
193
+ it 'rh_del(:test2) remove the :test2. hdata is now {}.'\
194
+ ' :test2, colocated with ẗest5 ' do
195
+ expect(@hdata.rh_del(:test2)).to eq('text' => 'blabla')
196
+ expect(@hdata).to eq({})
197
+ end
198
+ end
199
+ context 'With hdata = { :test => { :test2 => { :test5 => :test,'\
200
+ "'text' => 'blabla' },"\
201
+ "'test5' => 'test' }}" do
202
+ before(:all) do
203
+ @hdata = { :test => { :test2 => { :test5 => :test,
204
+ 'text' => 'blabla' },
205
+ 'test5' => 'test' } }
206
+ end
207
+ it 'rh_key_to_symbol?(1) return false' do
208
+ expect(@hdata.rh_key_to_symbol?(1)).to equal(false)
209
+ end
210
+ it 'rh_key_to_symbol?(2) return true' do
211
+ expect(@hdata.rh_key_to_symbol?(2)).to equal(true)
212
+ end
213
+ it 'rh_key_to_symbol?(3) return true' do
214
+ expect(@hdata.rh_key_to_symbol?(3)).to equal(true)
215
+ end
216
+ it 'rh_key_to_symbol?(4) return true' do
217
+ expect(@hdata.rh_key_to_symbol?(4)).to equal(true)
218
+ end
219
+
220
+ it 'rh_key_to_symbol(1) return no diff' do
221
+ expect(@hdata.rh_key_to_symbol(1)
222
+ ).to eq(:test => { :test2 => { :test5 => :test,
223
+ 'text' => 'blabla' },
224
+ 'test5' => 'test' })
225
+ end
226
+ it 'rh_key_to_symbol(2) return "test5" is replaced by :ẗest5' do
227
+ expect(@hdata.rh_key_to_symbol(2)
228
+ ).to eq(:test => { :test2 => { :test5 => :test,
229
+ 'text' => 'blabla' },
230
+ :test5 => 'test' })
231
+ end
232
+ it 'rh_key_to_symbol(3) return "test5" replaced by :ẗest5, '\
233
+ 'and "text" to :text' do
234
+ expect(@hdata.rh_key_to_symbol(3)
235
+ ).to eq(:test => { :test2 => { :test5 => :test,
236
+ :text => 'blabla' },
237
+ :test5 => 'test' })
238
+ end
239
+ it 'rh_key_to_symbol(4) same like rh_key_to_symbol(3)' do
240
+ expect(@hdata.rh_key_to_symbol(4)).to eq(@hdata.rh_key_to_symbol(3))
241
+ end
242
+ end
243
+ end