dh_easy-test 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +12 -0
  3. data/.travis.yml +7 -0
  4. data/.yardopts +1 -0
  5. data/CODE_OF_CONDUCT.md +74 -0
  6. data/Gemfile +6 -0
  7. data/LICENSE +21 -0
  8. data/README.md +20 -0
  9. data/Rakefile +22 -0
  10. data/dh_easy-test.gemspec +49 -0
  11. data/doc/DhEasy.html +117 -0
  12. data/doc/DhEasy/Core.html +117 -0
  13. data/doc/DhEasy/Core/Mock.html +115 -0
  14. data/doc/DhEasy/Core/Mock/FakeExecutor.html +2114 -0
  15. data/doc/DhEasy/Core/Modk.html +105 -0
  16. data/doc/DhEasy/Core/Plugin.html +117 -0
  17. data/doc/DhEasy/Core/Plugin/ExecutorBehavior.html +196 -0
  18. data/doc/DhEasy/Test.html +616 -0
  19. data/doc/DhEasy/Test/Helper.html +1710 -0
  20. data/doc/DhEasy/Test/RecordTask.html +2493 -0
  21. data/doc/_index.html +237 -0
  22. data/doc/class_list.html +51 -0
  23. data/doc/css/common.css +1 -0
  24. data/doc/css/full_list.css +58 -0
  25. data/doc/css/style.css +496 -0
  26. data/doc/file.README.html +91 -0
  27. data/doc/file_list.html +56 -0
  28. data/doc/frames.html +17 -0
  29. data/doc/index.html +91 -0
  30. data/doc/js/app.js +303 -0
  31. data/doc/js/full_list.js +216 -0
  32. data/doc/js/jquery.js +4 -0
  33. data/doc/method_list.html +427 -0
  34. data/doc/top-level-namespace.html +110 -0
  35. data/lib/dh_easy/test.rb +52 -0
  36. data/lib/dh_easy/test/helper.rb +225 -0
  37. data/lib/dh_easy/test/rake.rb +335 -0
  38. data/lib/dh_easy/test/version.rb +6 -0
  39. data/lib/dh_easy_override/core.rb +7 -0
  40. data/lib/dh_easy_override/core/mock.rb +8 -0
  41. data/lib/dh_easy_override/core/mock/fake_executor.rb +338 -0
  42. data/lib/dh_easy_override/core/plugin.rb +8 -0
  43. data/lib/dh_easy_override/core/plugin/executor_behavior.rb +11 -0
  44. metadata +200 -0
@@ -0,0 +1,6 @@
1
+ module DhEasy
2
+ module Test
3
+ # Gem version
4
+ VERSION = "0.0.5"
5
+ end
6
+ end
@@ -0,0 +1,7 @@
1
+ require 'dh_easy_override/core/plugin'
2
+ require 'dh_easy_override/core/mock'
3
+
4
+ module DhEasy
5
+ module Core
6
+ end
7
+ end
@@ -0,0 +1,8 @@
1
+ require 'dh_easy_override/core/mock/fake_executor'
2
+
3
+ module DhEasy
4
+ module Core
5
+ module Modk
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,338 @@
1
+ module DhEasy
2
+ module Core
3
+ module Mock
4
+ module FakeExecutor
5
+ # Root input directory.
6
+ attr_accessor :root_input_dir
7
+
8
+ # Current assigned input directory.
9
+ attr_accessor :input_dir
10
+
11
+ # Expand a relative input directory.
12
+ #
13
+ # @param [String, nil] dir Relative input directory
14
+ #
15
+ # @return [String] Absolute path
16
+ def expand_relative_input dir
17
+ return nil if dir.nil?
18
+ File.expand_path File.join(root_input_dir, dir)
19
+ end
20
+
21
+ # Load data into executor from options or input files.
22
+ #
23
+ # @param [Hash] opts ({}) Configuration options.
24
+ # @option opts [String,nil] :input_dir (nil) Will load files from this
25
+ # directory. The files map as follows (file_name -> variable):
26
+ # ```
27
+ # content -> content
28
+ # page.json -> page
29
+ # vars.json -> page['vars']
30
+ # pages.json -> saved_pages
31
+ # outputs.json -> saved_outputs
32
+ # ```
33
+ # @option opts [String,nil] :rel_dir (nil) Same as +:input_dir+ option
34
+ # but relative to root input directory (see #root_input_dir).
35
+ # @option opts [String,nil] :content Content to load. It will override
36
+ # `content` file from input directory.
37
+ # @option opts [Hash,nil] :page Page to load. It will override `page.json`
38
+ # from input directory.
39
+ # @option opts [Hash,nil] :vars Variables to load. It will override
40
+ # `vars.json` from input directory.
41
+ # @option opts [Hash,nil] :pages Pages to load. It will override
42
+ # `pages.json` from input directory.
43
+ # @option opts [Hash,nil] :outputs Outputs to load. It will override
44
+ # `outputs.json` from input directory.
45
+ #
46
+ # @return [FakeExecutor]
47
+ def load_input opts = {}
48
+ opts = {
49
+ rel_dir: nil,
50
+ input_dir: nil,
51
+ content: nil,
52
+ page: nil,
53
+ vars: nil,
54
+ pages: nil,
55
+ outputs: nil
56
+ }.merge opts
57
+ dir = self.input_dir = opts[:input_dir] || expand_relative_input(opts[:rel_dir]) || self.input_dir
58
+
59
+ # Load overrides
60
+ self.content = opts[:content]
61
+ new_page = DhEasy::Core.deep_stringify_keys(opts[:page]) unless opts[:page].nil?
62
+ save_pages opts[:pages] unless opts[:pages].nil?
63
+ save_outputs opts[:outputs] unless opts[:outputs].nil?
64
+ vars = nil
65
+ vars = DhEasy::Core.deep_stringify_keys(opts[:vars]) unless opts[:vars]
66
+
67
+ # Load input files
68
+ unless dir.nil?
69
+ self.content ||= DhEasy::Test::Helper.load_file(File.join(dir, 'content'))
70
+ new_page ||= DhEasy::Test::Helper.load_json_file(File.join(dir, 'page.json'))
71
+ input_pages = DhEasy::Test::Helper.load_json_file(File.join(dir, 'pages.json'))
72
+ save_pages input_pages unless input_pages.nil?
73
+ input_outputs = DhEasy::Test::Helper.load_json_file(File.join(dir, 'outputs.json'))
74
+ save_outputs input_outputs unless input_outputs.nil?
75
+ input_vars = DhEasy::Test::Helper.load_json_file(File.join(dir, 'vars.json'))
76
+ vars ||= input_vars if opts[:page].nil?
77
+ end
78
+
79
+ # Load vars only when no page override and not nil
80
+ self.page = new_page unless new_page.nil?
81
+ page['vars'] = vars unless vars.nil?
82
+ self
83
+ end
84
+
85
+ # Load failed content into executor from options or input files.
86
+ #
87
+ # @param [Hash] opts ({}) Configuration options.
88
+ # @option opts [String,nil] :input_dir (nil) Will load files from this
89
+ # directory. The files map as follows (file_name -> variable):
90
+ # ```
91
+ # failed_content.json -> failed_content
92
+ # ```
93
+ # @option opts [String,nil] :rel_dir (nil) Same as +:input_dir+ option
94
+ # but relative to root input directory (see #root_input_dir).
95
+ # @option opts [Hash,nil] :failed_content Failed content to load. It
96
+ # will override `failed_content.json` from input directory.
97
+ #
98
+ # @return [FakeExecutor]
99
+ def load_failed_content opts = {}
100
+ opts = {
101
+ rel_dir: nil,
102
+ input_dir: nil,
103
+ failed_content: nil
104
+ }.merge opts
105
+ dir = opts[:input_dir] || expand_relative_input(opts[:rel_dir]) || self.input_dir
106
+
107
+ # Load overrides
108
+ self.failed_content = opts[:failed_content]
109
+
110
+ # Load input files
111
+ unless dir.nil?
112
+ self.failed_content ||= DhEasy::Test::Helper.load_file(File.join(dir, 'failed_content.json'))
113
+ end
114
+
115
+ self
116
+ end
117
+
118
+ # Load expected pages into executor from options or input files.
119
+ #
120
+ # @param [Hash] opts ({}) Configuration options.
121
+ # @option opts [String,nil] :input_dir (nil) Will load files from this
122
+ # directory. The files map as follows (file_name -> variable):
123
+ # ```
124
+ # expected_pages.json -> saved_pages
125
+ # ```
126
+ # @option opts [String,nil] :rel_dir (nil) Same as +:input_dir+ option
127
+ # but relative to root input directory (see #root_input_dir).
128
+ # @option opts [Hash,nil] :pages Pages to load. It will override
129
+ # `expected_pages.json` from input directory.
130
+ #
131
+ # @return [FakeExecutor]
132
+ def load_expected_pages opts = {}
133
+ opts = {
134
+ rel_dir: nil,
135
+ input_dir: nil,
136
+ pages: nil
137
+ }.merge opts
138
+ dir = opts[:input_dir] || expand_relative_input(opts[:rel_dir]) || self.input_dir
139
+
140
+ # Load overrides
141
+ save_pages opts[:pages] unless opts[:pages].nil?
142
+
143
+ # Load input files
144
+ unless dir.nil?
145
+ expected_pages = DhEasy::Test::Helper.load_json_file(File.join(dir, 'expected_pages.json'))
146
+ save_pages expected_pages unless expected_pages.nil?
147
+ end
148
+
149
+ self
150
+ end
151
+
152
+ # Load expected outputs into executor from options or input files.
153
+ #
154
+ # @param [Hash] opts ({}) Configuration options.
155
+ # @option opts [String,nil] :input_dir (nil) Will load files from this
156
+ # directory. The files map as follows (file_name -> variable):
157
+ # ```
158
+ # expected_outputs.json -> saved_outputs
159
+ # ```
160
+ # @option opts [String,nil] :rel_dir (nil) Same as +:input_dir+ option
161
+ # but relative to root input directory (see #root_input_dir).
162
+ # @option opts [Hash,nil] :outputs Outputs to load. It will override
163
+ # `expected_outputs.json` from input directory.
164
+ #
165
+ # @return [FakeExecutor]
166
+ def load_expected_outputs opts = {}
167
+ opts = {
168
+ rel_dir: nil,
169
+ input_dir: nil,
170
+ outputs: nil
171
+ }.merge opts
172
+ dir = opts[:input_dir] || expand_relative_input(opts[:rel_dir]) || self.input_dir
173
+
174
+ # Load overrides
175
+ save_outputs opts[:outputs] unless opts[:outputs].nil?
176
+
177
+ # Load input files
178
+ unless dir.nil?
179
+ expected_outputs = DhEasy::Test::Helper.load_json_file(File.join(dir, 'expected_outputs.json'))
180
+ save_outputs expected_outputs unless expected_outputs.nil?
181
+ end
182
+
183
+ self
184
+ end
185
+
186
+ # Create an executor based on the current executor type.
187
+ #
188
+ # @return [DhEasy::Core::Mock::FakeExecutor]
189
+ def new_executor
190
+ self.class.new
191
+ end
192
+
193
+ # Match expected pages.
194
+ #
195
+ # @param [Hash] opts ({}) Configuration options.
196
+ # @option opts [String,nil] :input_dir (nil) Will load files from this
197
+ # directory. The files map as follows (file_name -> description):
198
+ # ```
199
+ # expected_pages.json -> expected pages to compare with saved_pages.
200
+ # ```
201
+ # @option opts [String,nil] :rel_dir (nil) Same as +:input_dir+ option
202
+ # but relative to root input directory (see #root_input_dir).
203
+ # @option opts [Hash,nil] :pages Expected pages to load. It will override
204
+ # `expected_pages.json` from input directory.
205
+ # @option opts [Array] :skip_fields (nil) Fields to skip on match.
206
+ # @option opts [Boolean] :default_skip_fields (true) Add `gid` and
207
+ # `job_id` to the `:skip_fields` list when `true`.
208
+ #
209
+ # @return [Hash] A hash with the following fields:
210
+ # * `[Boolean] match` `true` when match, `false` when diff.
211
+ # * `[Hash] saved` Non matching saved pages.
212
+ # * `[Hash] expected` Non matching expected pages.
213
+ def match_expected_pages opts = {}
214
+ opts = {
215
+ rel_dir: nil,
216
+ input_dir: nil,
217
+ pages: nil,
218
+ skip_fields: [],
219
+ default_skip_fields: true,
220
+ }.merge opts
221
+ opts[:input_dir] ||= input_dir
222
+
223
+ # Expected context
224
+ expected_opts = {}.merge opts
225
+ expected_opts[:input_dir] ||= input_dir
226
+ expected = new_executor
227
+ expected.root_input_dir = root_input_dir
228
+ expected.load_expected_pages expected_opts
229
+
230
+ # Config skip fields
231
+ skip_fields = opts[:skip_fields]
232
+ skip_fields += ['gid', 'job_id'] if opts[:default_skip_fields]
233
+ skip_fields.uniq!
234
+
235
+ # Diff
236
+ diff = DhEasy::Test::Helper.match_collections(
237
+ saved_pages,
238
+ expected.saved_pages,
239
+ skip: skip_fields,
240
+ compare_way: :left
241
+ )
242
+ {
243
+ match: diff[:match],
244
+ saved: diff[:diff][:items_a],
245
+ expected: diff[:diff][:items_b]
246
+ }
247
+ end
248
+
249
+ # Match saved pages with expected and verbose diff.
250
+ # {DhEasy::Test::Helper#match_expected}
251
+ # @option opts [Array] :log_caller (nil) Log caller. Defaults to method
252
+ # `caller`.
253
+ #
254
+ # @return [Boolean] `true` when pass, else `false`.
255
+ def should_match_pages opts = {}
256
+ flush
257
+ diff = match_expected_pages opts
258
+ log_caller = opts[:log_caller] || ([] + caller)
259
+ unless diff[:match]
260
+ DhEasy::Test.verbose_match_diff 'pages', diff, log_caller
261
+ end
262
+ diff[:match]
263
+ end
264
+
265
+ # Match expected outputs.
266
+ #
267
+ # @param [Hash] opts ({}) Configuration options.
268
+ # @option opts [String,nil] :input_dir (nil) Will load files from this
269
+ # directory. The files map as follows (file_name -> description):
270
+ # ```
271
+ # expected_outputs.json -> expected outputs to compare with saved_outputs.
272
+ # ```
273
+ # @option opts [String,nil] :rel_dir (nil) Same as +:input_dir+ option
274
+ # but relative to root input directory (see #root_input_dir).
275
+ # @option opts [Hash,nil] :outputs Expected outputs to load. It will
276
+ # override `expected_outputs.json` from input directory.
277
+ # @option opts [Array] :skip_fields (nil) Fields to skip on match.
278
+ # @option opts [Boolean] :default_skip_fields (true) Add `_gid`,
279
+ # `_job_id` and `_created_at` to the `:skip_fields` list when `true`.
280
+ #
281
+ # @return [Hash] A hash with the following structure:
282
+ # * `[Boolean] match` `true` when match, `false` when diff.
283
+ # * `[Hash] expected` Non matching expected outputs.
284
+ # * `[Hash] saved` Non matching saved outputs.
285
+ def match_expected_outputs opts = {}
286
+ opts = {
287
+ rel_dir: nil,
288
+ input_dir: nil,
289
+ outputs: nil,
290
+ skip_fields: [],
291
+ default_skip_fields: true,
292
+ }.merge opts
293
+
294
+ # Expected context
295
+ expected_opts = {}.merge opts
296
+ expected_opts[:input_dir] ||= input_dir
297
+ expected = new_executor
298
+ expected.root_input_dir = root_input_dir
299
+ expected.load_expected_outputs expected_opts
300
+
301
+ # Config skip fields
302
+ skip_fields = opts[:skip_fields]
303
+ skip_fields += ['_created_at', '_gid', '_job_id'] if opts[:default_skip_fields]
304
+ skip_fields.uniq!
305
+
306
+ # Diff
307
+ diff = DhEasy::Test::Helper.match_collections(
308
+ saved_outputs,
309
+ expected.saved_outputs,
310
+ skip: skip_fields,
311
+ compare_way: :left
312
+ )
313
+ {
314
+ match: diff[:match],
315
+ saved: diff[:diff][:items_a],
316
+ expected: diff[:diff][:items_b]
317
+ }
318
+ end
319
+
320
+ # Match saved outputs with expected and verbose diff.
321
+ # {DhEasy::Test::Helper#match_expected_outputs}
322
+ # @option opts [Array] :log_caller (nil) Log caller. Defaults to method
323
+ # `caller`.
324
+ #
325
+ # @return [Boolean] `true` when pass, else `false`.
326
+ def should_match_outputs opts = {}
327
+ flush
328
+ diff = match_expected_outputs opts
329
+ log_caller = opts[:log_caller] || ([] + caller)
330
+ unless diff[:match]
331
+ DhEasy::Test.verbose_match_diff 'outputs', diff, log_caller
332
+ end
333
+ diff[:match]
334
+ end
335
+ end
336
+ end
337
+ end
338
+ end
@@ -0,0 +1,8 @@
1
+ require 'dh_easy_override/core/plugin/executor_behavior'
2
+
3
+ module DhEasy
4
+ module Core
5
+ module Plugin
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,11 @@
1
+ module DhEasy
2
+ module Core
3
+ module Plugin
4
+ module ExecutorBehavior
5
+ def test_mode?
6
+ DhEasy::Test.test_mode?
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
metadata ADDED
@@ -0,0 +1,200 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: dh_easy-test
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.5
5
+ platform: ruby
6
+ authors:
7
+ - Eduardo Rosales
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-12-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: dh_easy-core
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '1'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '1'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10'
55
+ - !ruby/object:Gem::Dependency
56
+ name: minitest
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5'
69
+ - !ruby/object:Gem::Dependency
70
+ name: simplecov
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: simplecov-console
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: timecop
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: byebug
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: '0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - ">="
123
+ - !ruby/object:Gem::Version
124
+ version: '0'
125
+ description: DataHen Easy toolkit test module to support other complex modules.
126
+ email:
127
+ - eduardo@datahen.com
128
+ executables: []
129
+ extensions: []
130
+ extra_rdoc_files: []
131
+ files:
132
+ - ".gitignore"
133
+ - ".travis.yml"
134
+ - ".yardopts"
135
+ - CODE_OF_CONDUCT.md
136
+ - Gemfile
137
+ - LICENSE
138
+ - README.md
139
+ - Rakefile
140
+ - dh_easy-test.gemspec
141
+ - doc/DhEasy.html
142
+ - doc/DhEasy/Core.html
143
+ - doc/DhEasy/Core/Mock.html
144
+ - doc/DhEasy/Core/Mock/FakeExecutor.html
145
+ - doc/DhEasy/Core/Modk.html
146
+ - doc/DhEasy/Core/Plugin.html
147
+ - doc/DhEasy/Core/Plugin/ExecutorBehavior.html
148
+ - doc/DhEasy/Test.html
149
+ - doc/DhEasy/Test/Helper.html
150
+ - doc/DhEasy/Test/RecordTask.html
151
+ - doc/_index.html
152
+ - doc/class_list.html
153
+ - doc/css/common.css
154
+ - doc/css/full_list.css
155
+ - doc/css/style.css
156
+ - doc/file.README.html
157
+ - doc/file_list.html
158
+ - doc/frames.html
159
+ - doc/index.html
160
+ - doc/js/app.js
161
+ - doc/js/full_list.js
162
+ - doc/js/jquery.js
163
+ - doc/method_list.html
164
+ - doc/top-level-namespace.html
165
+ - lib/dh_easy/test.rb
166
+ - lib/dh_easy/test/helper.rb
167
+ - lib/dh_easy/test/rake.rb
168
+ - lib/dh_easy/test/version.rb
169
+ - lib/dh_easy_override/core.rb
170
+ - lib/dh_easy_override/core/mock.rb
171
+ - lib/dh_easy_override/core/mock/fake_executor.rb
172
+ - lib/dh_easy_override/core/plugin.rb
173
+ - lib/dh_easy_override/core/plugin/executor_behavior.rb
174
+ homepage: https://datahen.com
175
+ licenses:
176
+ - MIT
177
+ metadata:
178
+ homepage_uri: https://datahen.com
179
+ source_code_uri: https://github.com/DataHenOfficial/dh_easy-test
180
+ post_install_message:
181
+ rdoc_options: []
182
+ require_paths:
183
+ - lib
184
+ required_ruby_version: !ruby/object:Gem::Requirement
185
+ requirements:
186
+ - - ">="
187
+ - !ruby/object:Gem::Version
188
+ version: 2.2.2
189
+ required_rubygems_version: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ requirements: []
195
+ rubyforge_project:
196
+ rubygems_version: 2.7.6
197
+ signing_key:
198
+ specification_version: 4
199
+ summary: DataHen Easy toolkit test module
200
+ test_files: []