skn_utils 5.4.0 → 5.8.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/.rspec +2 -0
- data/README.md +223 -72
- data/_config.yml +4 -4
- data/bin/concurrent_test_block +54 -0
- data/bin/concurrent_test_grouped +45 -0
- data/bin/concurrent_test_procs +45 -0
- data/bin/concurrent_test_wrapped +49 -0
- data/lib/skn_container.rb +2 -1
- data/lib/skn_failure.rb +2 -0
- data/lib/skn_hash.rb +2 -0
- data/lib/skn_registry.rb +25 -5
- data/lib/skn_settings.rb +2 -0
- data/lib/skn_success.rb +2 -0
- data/lib/skn_utils.rb +13 -2
- data/lib/skn_utils/concurrent_jobs.rb +117 -0
- data/lib/skn_utils/configurable.rb +55 -6
- data/lib/skn_utils/configuration.rb +2 -0
- data/lib/skn_utils/core_extensions.rb +29 -0
- data/lib/skn_utils/dotted_hash.rb +1 -0
- data/lib/skn_utils/env_string_handler.rb +2 -0
- data/lib/skn_utils/http_processor.rb +34 -0
- data/lib/skn_utils/job_commands.rb +247 -0
- data/lib/skn_utils/nested_result.rb +2 -0
- data/lib/skn_utils/notifier_base.rb +2 -0
- data/lib/skn_utils/null_object.rb +2 -0
- data/lib/skn_utils/page_controls.rb +2 -0
- data/lib/skn_utils/result_bean.rb +2 -0
- data/lib/skn_utils/version.rb +3 -1
- data/lib/skn_utils/wrappable.rb +32 -0
- data/skn_utils.gemspec +27 -22
- data/spec/lib/skn_utils/concurrent_jobs_spec.rb +279 -0
- data/spec/lib/skn_utils/configurable_spec.rb +23 -36
- data/spec/lib/skn_utils/registry_spec.rb +22 -0
- data/spec/lib/skn_utils/wrappers_spec.rb +80 -0
- data/spec/spec_helper.rb +5 -0
- data/spec/support/configurables.rb +36 -0
- data/spec/support/xml_matchers.rb +121 -0
- metadata +71 -24
- data/README.rdoc +0 -379
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: bdbe2b2318e4841c25afdec1e118cc19ff445f8a8b1e08d116715f5b9df0f56e
|
4
|
+
data.tar.gz: d42c5e55def5f8c2789714d1fada2f341f59665ba633192732b9e6b48816e253
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b48e34a868729ed2fe63cc77c456a9b9eef99540355d4de6135c7cd5fe96c88b78519cc8384f2eb13c0a29b9652b4e84fbc1624a4674df0ec73c4f95d3762392
|
7
|
+
data.tar.gz: c435de19604f41834446ca04084ffc7a559267786974130edc03ad2a540f07eb08111571b13995f67e6bcfc122b215a3d5bb5cf26a905d1e3e85b31e4f0dfad3
|
data/.rspec
CHANGED
data/README.md
CHANGED
@@ -2,68 +2,94 @@
|
|
2
2
|
[![Gem Version](https://badge.fury.io/rb/skn_utils.svg)](http://badge.fury.io/rb/skn_utils)
|
3
3
|
|
4
4
|
# SknUtils
|
5
|
-
## SknUtils::NestedResult class; dynamic key/value container
|
6
|
-
A Ruby Gem containing a Ruby PORO (Plain Old Ruby Object) that can be instantiated at runtime with an input hash. This library creates
|
7
|
-
an Object with Dot and Hash notational accessors to each key's value. Additional key/value pairs can be added post-create
|
8
|
-
by simply assigning it; `obj.my_new_var = "some value"`
|
9
|
-
|
10
|
-
* Transforms the initialing hash into accessible object instance values, with their keys as method names.
|
11
|
-
* If the key's value is also a hash, it too will become an Object.
|
12
|
-
* if the key's value is a Array of Hashes, or Array of Arrays of Hashes, each hash element of the Arrays will become an Object.
|
13
|
-
* The current key/value (including nested) pairs are returned via #to_hash or #to_json when and if needed.
|
14
|
-
* Best described as dot notation wrapper over a Ruby (Concurrent-Ruby) Hash.
|
15
5
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
6
|
+
`SknUtils` is a collection of pure-ruby utility classes and modules, with limited
|
7
|
+
dependencies, to augment the development of Ruby applications. Examples of these
|
8
|
+
utilities in action can be found in my related projects `SknServices`, `SknWebApp`,
|
9
|
+
and `SknBase`.
|
10
|
+
|
11
|
+
* Most classes are standalone modules, or cleary documented, and can be copy/pasted into your project.
|
12
|
+
* The exchange or handoff of values between objects is addressed via the `NestedResults`
|
13
|
+
class which implements dot-notation and nesting over a concurrent hash: A ruby Hash can
|
14
|
+
use any valid ruby object as a key or value.
|
15
|
+
* `NestedResults` is later sub-classed as `Configuration` to provide application level
|
16
|
+
settings using YAML files with a API simular to the RbConfig gem.
|
17
|
+
* Object or method return values can be enclosed in `SknSuccess` or `SknFailure` classes
|
18
|
+
to prevent or minimize nil returns.
|
19
|
+
* Precise microsecond `duration`s, Number to `as_human_size`, and a `catch_exceptions`
|
20
|
+
retry-able feature are implemented on the SknUtils class directly for ease of use.
|
21
|
+
* `Configurable` module extends any class or module with configurable attribute method
|
22
|
+
as needed, with a set of defaults methods which emulate Rails.env, Rails.logger, and
|
23
|
+
Rails.root functionality.
|
24
|
+
* `CoreObjectExtensions` simular to ActiveSupport's, `#present?` and `#blank?` are
|
25
|
+
automatically applied, unless already present, when SknUtils gem is loaded.
|
26
|
+
* `SknRegistry` class is an advanced feature which allows you to manually register
|
27
|
+
classes, procs, or any value with a user-defined `label`. Initialization and dependency injection
|
28
|
+
requirements of service-like classes can be included in this registration process allowing
|
29
|
+
them to be centrally maintained. The `label` can be any valid ruby value; like a
|
30
|
+
classname, symbol, or string as needed
|
31
|
+
* `NullObject`, `NotifierBase`, and `Wrappable` are interesting classes which you might want to explore further.
|
32
|
+
* `ConcurrentJobs` is a feature implemented to allow concurrent/multi-threaded execution of jobs. The included
|
33
|
+
companion classes focus on HTTP GET,PUT,POST, and DELETE jobs as an example of how to use the `ConcurrentJobs` feature.
|
34
|
+
|
35
|
+
All classes and modules have RSpec test coverage (90+) of their originally intended
|
36
|
+
use-cases.
|
37
|
+
|
38
|
+
|
39
|
+
### Available Classes
|
46
40
|
* SknSettings
|
47
41
|
* SknUtils::Configuration
|
48
42
|
* SknUtils::EnvStringHandler
|
49
|
-
* SknRegistry
|
50
|
-
* SknContainer
|
51
43
|
* SknHash
|
52
44
|
* SknUtils::ResultBean
|
53
45
|
* SknUtils::PageControls
|
54
46
|
* SknUtils::NestedResult
|
55
|
-
*
|
56
|
-
*
|
47
|
+
* SknRegistry
|
48
|
+
* SknContainer
|
49
|
+
* SknSuccess
|
50
|
+
* SknFailure
|
57
51
|
* SknUtils::Configurable
|
58
|
-
|
59
|
-
|
52
|
+
* SknUtils::CoreObjectExtensions
|
53
|
+
* SknUtils::NullObject
|
54
|
+
* SknUtils::NotifierBase
|
55
|
+
* SknUtils::Wrappable
|
56
|
+
* SknUtils::ConcurrentJobs
|
57
|
+
* SknUtils::JobWrapper (via ConcurrentJobs)
|
58
|
+
* SknUtils::CommandJSONPost (via JobCommands)
|
59
|
+
* SknUtils::CommandFORMPost
|
60
|
+
* SknUtils::CommandJSONGet
|
61
|
+
* SknUtils::CommandJSONPut
|
62
|
+
* SknUtils::CommandFORMDelete
|
63
|
+
* SknUtils::HttpProcessor
|
64
|
+
|
65
|
+
### Available Class.Methods
|
60
66
|
* SknUtils.catch_exceptions()
|
61
67
|
* SknUtils.as_human_size()
|
62
68
|
* SknUtils.duration(start_time=nil)
|
63
69
|
|
64
|
-
|
70
|
+
### Available RSpec Helpers
|
71
|
+
* spec/support/xml_matchers.rb
|
72
|
+
* expect(bundle).to have_xpath('//witnesses/witness/role')
|
73
|
+
* expect(bundle).to have_nodes('//witnesses/witness/role', 3)
|
74
|
+
* expect(bundle).to match_xpath('//lossInformation/date', "2020-01-28")
|
75
|
+
|
65
76
|
|
66
77
|
## History
|
78
|
+
2/3/2020 V5.7.0
|
79
|
+
Added
|
80
|
+
* RSpec XML_Matchers to spec/support folders
|
81
|
+
* Update ConcurrentJobs JobCommands to support HTTP Headers
|
82
|
+
|
83
|
+
2/24/2019 V5.5.0
|
84
|
+
Added
|
85
|
+
* ConcurrentJobs feature set
|
86
|
+
- Executes (HTTP/any) jobs in parallel
|
87
|
+
|
88
|
+
1/2/2019 V5.4.1
|
89
|
+
Added
|
90
|
+
- Wrappable module for evaluation.
|
91
|
+
- Ruby comment # frozen_string_literal, everywhere
|
92
|
+
|
67
93
|
12/16/2018 V5.4.0
|
68
94
|
Added :duration() utils to SknUtils module:
|
69
95
|
#duration() #=> returns start_time value
|
@@ -154,27 +180,66 @@ There are many more use cases for Ruby's Hash that this gem just makes easier to
|
|
154
180
|
06/2015 V1.5.1 commit #67ef656
|
155
181
|
Last Version to depend on Rails (ActiveModel) for #to_json and #to_xml serialization
|
156
182
|
|
183
|
+
### NestedResult class; dynamic key/value container
|
184
|
+
A class implementing a Ruby PORO (Plain Old Ruby Object) that can be instantiated at runtime with a hash. Creates
|
185
|
+
a nested object with Dot and Hash notational accessors to each key's value. Additional key/value pairs can be added post-create
|
186
|
+
by simply assigning it; `obj.my_new_var = "some value"`
|
187
|
+
|
188
|
+
* Transforms the initialing hash into accessible object instance values, with their keys as method names.
|
189
|
+
* If the key's value is also a hash, it too will become an Object.
|
190
|
+
* if the key's value is a Array of Hashes, or Array of Arrays of Hashes, each hash element of the Arrays will become an Object.
|
191
|
+
* The current key/value (including nested) pairs are returned via #to_hash or #to_json when and if needed.
|
192
|
+
* Best described as dot notation wrapper over a Ruby (Concurrent-Ruby) Hash.
|
193
|
+
|
194
|
+
Ruby's Hash object is already extremely flexible, even more so with the addition of dot-notation. As I work more with Ruby outside of Rails, I'm finding more use cases for the capabilities of this gem. Here are a few examples:
|
195
|
+
|
196
|
+
1. Application settings containers, SknSettings. Loads Yaml file based on `ENV['RACK_ENV']` value, or specified file-key.
|
197
|
+
- Replaces Config and/or RBConfig Gems for yaml based settings
|
198
|
+
1. Substitute for Rails.root, via a little ERB/YAML/Marshal statement in settings.yml file, and a helper class
|
199
|
+
- settings.yml (YAML)
|
200
|
+
- `root: <%= Dir.pwd %>`
|
201
|
+
- enables `SknSettings.root`
|
202
|
+
- `env: !ruby/string:SknUtils::EnvStringHandler <%= ENV.fetch('RACK_ENV', 'development') %>`
|
203
|
+
- enables `SknSettings.env.production?` ...
|
204
|
+
|
205
|
+
There are many more use cases for Ruby's Hash that this gem just makes easier to implement.
|
206
|
+
|
157
207
|
|
158
208
|
## Public Components
|
159
209
|
SknUtils::NestedResult # Primary Key/Value Container with Dot/Hash notiation support.
|
160
|
-
SknHash # Wrapper
|
161
|
-
SknUtils::ResultBean # Wrapper
|
162
|
-
SknUtils::PageControls # Wrapper
|
163
|
-
SknUtils::DottedHash # Wrapper
|
210
|
+
SknHash # Wrapper in name only, WITHOUT SknUtils namespace, inherits from SknUtils::NestedResult
|
211
|
+
SknUtils::ResultBean # Wrapper in name only, inherits from SknUtils::NestedResult
|
212
|
+
SknUtils::PageControls # Wrapper in name only, inherits from SknUtils::NestedResult
|
213
|
+
SknUtils::DottedHash # Wrapper in name only, inherits from SknUtils::NestedResult
|
164
214
|
|
165
|
-
|
215
|
+
SknSettings # Multi-level application Configuration class, Key/Value Container with Dot/Hash notiation support.
|
216
|
+
- Reads YAML files from ./config/ directory based by environment (RACK_ENV)
|
217
|
+
- INITIALIZED WHEN GEM LOADS
|
166
218
|
|
167
|
-
|
219
|
+
SknUtils::Configurable # Add Class writers/getters to any Class, think class configuration
|
168
220
|
|
169
|
-
SknContainer/SknRegistry #
|
221
|
+
SknContainer/SknRegistry # Key/Value container which #registers and #resolves procs, classes, and/or object
|
222
|
+
- Allows definition in one place, and label references as needed; dependency injection
|
223
|
+
- INITIALIZED WHEN GEM LOADS
|
170
224
|
|
171
|
-
SknSuccess # Three attribute value containers for return codes -- #value, #message, #success
|
225
|
+
SknSuccess # Three attribute value containers for consistant return codes -- #value, #message, #success
|
172
226
|
- Extra #payload method returns value as NestResult if value is_a Hash
|
173
227
|
SknFailure # Three attribute value containers for return codes -- #value, #message, #success
|
228
|
+
|
229
|
+
SknUtils::ConcurrentJobs # Async/Sync Job executor pool with HTTP support
|
230
|
+
SknUtils::CommandJSONGet # HTTP Get Command class expecting `json` return, located inside `job_commands`
|
231
|
+
SknUtils::CommandJSONPut # HTTP Put Command class expecting `json` return, located inside `job_commands`
|
232
|
+
SknUtils::CommandJSONPost # HTTP Post Command class expecting `json` return, located inside `job_commands`
|
233
|
+
SknUtils::CommandFORMPost # HTTP Post Command class expecting `form` data return, located inside `job_commands`
|
234
|
+
SknUtils::CommandFORMDelete # HTTP Delete Command class expecting `form` data return, located inside `job_commands`
|
235
|
+
SknUtils::HttpProcessor # Command driven HTTP processing object supporting GET,PUT,POST, and DELETE
|
236
|
+
SknUtils::JobWrapper # Outer wrapper class to capture catastrophic exceptions (syntax normally)
|
174
237
|
|
175
238
|
|
176
239
|
## Public Methods: SknUtils::Configurable module
|
177
|
-
|
240
|
+
For making an arbitrary class configurable and then specifying those configuration values. Intended to be used at the application
|
241
|
+
level, similar to the use of `Rails`, or for classes that would benefit from a configuration value when objects are created from it.
|
242
|
+
|
178
243
|
```ruby
|
179
244
|
# (1) First establish the method names of class values desired.
|
180
245
|
################
|
@@ -239,21 +304,27 @@ There are many more use cases for Ruby's Hash that this gem just makes easier to
|
|
239
304
|
```
|
240
305
|
|
241
306
|
|
242
|
-
## Public Methods: SknContainer
|
243
|
-
|
244
|
-
|
245
|
-
|
307
|
+
## Public Methods: SknContainer and/or SknRegistry class
|
308
|
+
`SknContainer` is global constant assigned to an instantiated instance of `SknRegistry`. `SknRegistry` can
|
309
|
+
be instantiated in the regular way via `SknRegistry.new`; and is included in the SknConfigurable root options
|
310
|
+
by default under the key `registry`.
|
311
|
+
|
312
|
+
Either returns the labeled value as the original instance/value or if provided with a proc, the result of calling that proc.
|
313
|
+
To register, and `label`, a class or object for retrieval, use the following API. Also review the RSpecs for
|
314
|
+
additional useage info.
|
246
315
|
|
247
316
|
#register(key, contents = nil, options = {})
|
248
317
|
- example:
|
249
318
|
SknContainer.register(:some_klass, MyClass) -- class as value
|
250
319
|
SknContainer.register(:the_instance, MyClass.new) -- Object Instance as value
|
251
|
-
SknContainer.register(:unique_instance, -> {MyClass.new})
|
320
|
+
SknContainer.register(:unique_instance, -> {MyClass.new}, call: true) -- New Object Instance for each #resolve
|
321
|
+
SknContainer.register(:unique_instance2, ->(parms) {MyClass.new(parms)}, call: false) -- New Object with parms for each #resolve
|
322
|
+
SknContainer.register(:some_proc, -> {MyClass.new}, call: false) -- Return uncalled proc for each #resolve
|
252
323
|
|
253
324
|
SknContainer -- #register returns self to enable chaining
|
254
325
|
.register(:unique_instance, -> {MyClass.new})
|
255
|
-
|
256
|
-
|
326
|
+
.register(:the_instance, MyClass.new)
|
327
|
+
.register(:some_klass, MyClass)
|
257
328
|
|
258
329
|
#resolve(key)
|
259
330
|
- example:
|
@@ -261,15 +332,84 @@ There are many more use cases for Ruby's Hash that this gem just makes easier to
|
|
261
332
|
instance = SknContainer.resolve(:some_klass).new
|
262
333
|
|
263
334
|
obj_instance1 = SknContainer.resolve(:unique_instance)
|
264
|
-
obj_instance2 = SknContainer.resolve(:
|
335
|
+
obj_instance2 = SknContainer.resolve(:unique_instance2).call(parms)
|
265
336
|
|
266
337
|
same_instance = SknContainer.resolve(:the_instance)
|
338
|
+
|
339
|
+
some_proc = SknContainer.resolve(:some_proc).call
|
340
|
+
|
341
|
+
* Testing Support:
|
342
|
+
- #substitute(...) allows you to mock an existing entry. #substitute is an alias for #register_mock
|
343
|
+
- SknContainer.substitute(:the_instance, MyClass.new)
|
344
|
+
- #restore! clears all mocked entries. #restore! is an alias for #unregister_mock!
|
345
|
+
- SknContainer.restore!
|
346
|
+
|
347
|
+
|
348
|
+
## Public Methods: SknUtils::ConcurrentJobs classes
|
349
|
+
`ConcurrentJobs` behaves as a concurrent thread pool by using Concurrent::Promise from the `concurrent-ruby` gem.
|
350
|
+
Enables the definition of Procs, or any callable class, which will be executed in parrallel with the available jobs
|
351
|
+
loaded into ConcurrentJobs. Meant to reduce user-sensitive response times when multiple APIs must be invoked.
|
352
|
+
Also review the RSpecs for additional useage info.
|
353
|
+
|
354
|
+
SknUtils::ConcurrentJobs
|
355
|
+
#call(async: true) - Instantiate ConcurrentJobs with Async Workers, false for Sync Workers
|
356
|
+
#register_jobs(cmds, callable) - Array of Command to be executed by single callable
|
357
|
+
#register_job(&block) - Adds callable block to internal worker queue
|
358
|
+
#render_jobs - Collect results from all jobs into a Result object
|
359
|
+
#elapsed_time_string - "0.012 seconds" string showing duration of last #render_jobs call
|
360
|
+
|
361
|
+
SknUtils::Result - Contains individual results from each job executed
|
362
|
+
#success? - Determines if any job failed
|
363
|
+
#messages - Retrieves messages from job results, assumed present when job fails
|
364
|
+
#values - Returns an array of individual results from job executions
|
365
|
+
|
366
|
+
Commands and HttpProcessors are included to demonstrate Job creating patterns. ConcurrentJobs is not restricted
|
367
|
+
to Http calls or the command to command handler pattern. Using the #register_job method you can pass callable BLOCK
|
368
|
+
and it will be executed when #render_jobs is invoked. HttpProcessor is what I needed and triggered me to add this feature.
|
369
|
+
|
370
|
+
Example here:
|
371
|
+
|
372
|
+
```ruby
|
373
|
+
begin
|
374
|
+
# CommandJSONPost, CommandFORMGet, CommandJSONGet,
|
375
|
+
# CommandJSONPut, CommandFORMDelete
|
376
|
+
commands = [
|
377
|
+
SknUtils::CommandJSONGet.call(full_url: "http://jsonplaceholder.typicode.com/posts"),
|
378
|
+
SknUtils::CommandJSONGet.call(full_url: "https://jsonplaceholder.typicode.com/comments"),
|
379
|
+
SknUtils::CommandJSONGet.call(full_url: "https://jsonplaceholder.typicode.com/todos/1"),
|
380
|
+
SknUtils::CommandJSONGet.call(full_url: "http://jsonplaceholder.typicode.com/users")
|
381
|
+
]
|
382
|
+
|
383
|
+
# Initialize the queue with Async Workers by default
|
384
|
+
provider = SknUtils::ConcurrentJobs.call
|
385
|
+
|
386
|
+
# Populate WorkQueue
|
387
|
+
provider.register_jobs(commands, SknUtils::HttpProcessor) # mis-spelling these params result in an immediate exception (line 43 below)
|
388
|
+
|
389
|
+
# Execute WorkQueue
|
390
|
+
result = provider.render_jobs
|
391
|
+
|
392
|
+
if result.success?
|
393
|
+
puts "Success: true"
|
394
|
+
puts "Values: #{result.values}"
|
395
|
+
puts "Messages: #{result.messages}"
|
396
|
+
else
|
397
|
+
puts "Success: false - errors: #{result.messages.join(', ')}"
|
398
|
+
puts "Values: #{result.values}"
|
399
|
+
end
|
267
400
|
|
401
|
+
# result.values
|
402
|
+
rescue => e
|
403
|
+
$stderr.puts e.message, e.backtrace
|
404
|
+
end
|
268
405
|
|
406
|
+
```
|
407
|
+
|
408
|
+
|
409
|
+
## Public Methods: SknSettings class
|
410
|
+
SknSettings is a global constant containing an initialized Object of SknUtils::Configuration using defaults.
|
411
|
+
To change the 'development'.yml default please use the following method early or in the case of Rails in 'application.rb
|
269
412
|
|
270
|
-
## Public Methods: SknSettings ONLY
|
271
|
-
SknSettings is global constant containing an initialized Object of SknUtils::Configuration using defaults
|
272
|
-
To change the 'development'.yml default please use the following method early or in the case of Rails in 'application.rb
|
273
413
|
#load_config_basename!(config_name) -- Where config_name is the name of yml files stored in the `./config/settings` directory
|
274
414
|
#config_path!(path) -- Where path format is './<dirs>/', default is: './config/'
|
275
415
|
and contains a settings.yml file and a 'path/settings/' directory
|
@@ -302,9 +442,15 @@ There are many more use cases for Ruby's Hash that this gem just makes easier to
|
|
302
442
|
#prepend_source!(file_path_or_hash) -- self, adds yaml_file or hash to start of filelist (:reload! required)
|
303
443
|
-------------------------------------------------
|
304
444
|
|
445
|
+
Usage
|
446
|
+
-------------------------------------------------
|
447
|
+
Dot notation of yaml file contents
|
448
|
+
SknSettings.version # => version's value
|
449
|
+
-------------------------------------------------
|
305
450
|
|
306
451
|
## Public Methods: SknUtils::NestedResult, SknHash & SknSettings
|
307
|
-
|
452
|
+
Each concrete Class supports the following utility methods:
|
453
|
+
|
308
454
|
#to_hash -- returns a hash of current key/value pairs, including nested
|
309
455
|
#to_json -- returns a json string of current key/value pairs, including nested
|
310
456
|
#hash_from(:base_key) -- exports the internal hash starting with this base level key
|
@@ -324,6 +470,7 @@ There are many more use cases for Ruby's Hash that this gem just makes easier to
|
|
324
470
|
|
325
471
|
|
326
472
|
## NestedResult Basic features include:
|
473
|
+
|
327
474
|
```ruby
|
328
475
|
- provides the hash or dot notation methods of accessing values:
|
329
476
|
|
@@ -365,6 +512,7 @@ There are many more use cases for Ruby's Hash that this gem just makes easier to
|
|
365
512
|
|
366
513
|
* The NestedResult produces these effects when given a params hash;
|
367
514
|
* Follow VALUES that are Hashes, Arrays of Hashes, and Arrays of Arrays of Hashes
|
515
|
+
|
368
516
|
```ruby
|
369
517
|
drb = SknUtils::NestedResult.new(params) Basic dot notation:
|
370
518
|
---------------------------------------------------- -----------------------------------------------------------------
|
@@ -389,6 +537,7 @@ There are many more use cases for Ruby's Hash that this gem just makes easier to
|
|
389
537
|
```
|
390
538
|
|
391
539
|
* Expected usage
|
540
|
+
|
392
541
|
```ruby
|
393
542
|
result = SknUtils::NestedResult.new({
|
394
543
|
success: true,
|
@@ -404,6 +553,7 @@ There are many more use cases for Ruby's Hash that this gem just makes easier to
|
|
404
553
|
|
405
554
|
|
406
555
|
* Wrap additional methods around the core NestedResult feature set
|
556
|
+
|
407
557
|
```ruby
|
408
558
|
class MyPackage < SknUtils::NestedResult
|
409
559
|
def initialize(params={})
|
@@ -420,10 +570,11 @@ There are many more use cases for Ruby's Hash that this gem just makes easier to
|
|
420
570
|
## Installation
|
421
571
|
|
422
572
|
runtime prereqs:
|
423
|
-
*
|
424
|
-
*
|
425
|
-
*
|
426
|
-
*
|
573
|
+
* V5+ None
|
574
|
+
* V4+ None
|
575
|
+
* V3+ None
|
576
|
+
* V2+ None
|
577
|
+
* V1+ gem 'active_model', '~> 3.0'
|
427
578
|
|
428
579
|
|
429
580
|
Add this line to your application's Gemfile:
|
data/_config.yml
CHANGED
@@ -1,9 +1,10 @@
|
|
1
1
|
title: SknUtils
|
2
2
|
email: skoona@gmail.com
|
3
3
|
description: > # this means to ignore newlines until "baseurl:"
|
4
|
-
|
5
|
-
|
6
|
-
|
4
|
+
Collection of pure-ruby utility classes and modules, with limited
|
5
|
+
dependencies, to augment the development of Ruby applications. Value containers supporting nested dot.notation access
|
6
|
+
over hashes, and utilities offering dependency injection/lookup, and language extensions support running in a non-rails
|
7
|
+
environment. Plus, examples of null objects, class customization, and concurrent processing.
|
7
8
|
baseurl: ""
|
8
9
|
url: https://skoona.github.io/SknServices
|
9
10
|
|
@@ -21,4 +22,3 @@ github:
|
|
21
22
|
author:
|
22
23
|
name: "James Scott, Jr. (a.k.a Skoona)"
|
23
24
|
url: https://keybase.io/skoona
|
24
|
-
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
#
|
3
|
+
# file: concurrent_test_block
|
4
|
+
#
|
5
|
+
|
6
|
+
require 'bundler/setup'
|
7
|
+
require 'skn_utils'
|
8
|
+
|
9
|
+
|
10
|
+
# ##
|
11
|
+
# MainLine
|
12
|
+
# ##
|
13
|
+
#
|
14
|
+
begin
|
15
|
+
# CommandJSONPost, CommandFORMGet, CommandJSONGet,
|
16
|
+
# CommandJSONPut, CommandFORMDelete
|
17
|
+
commands = [
|
18
|
+
SknUtils::CommandJSONGet.call(full_url: "http://jsonplaceholder.typicode.com/posts"),
|
19
|
+
SknUtils::CommandJSONGet.call(full_url: "https://jsonplaceholder.typicode.com/comments"),
|
20
|
+
SknUtils::CommandJSONGet.call(full_url: "https://jsonplaceholder.typicode.com/todos/1"),
|
21
|
+
SknUtils::CommandJSONGet.call(full_url: "http://jsonplaceholder.typicode.com/users")
|
22
|
+
]
|
23
|
+
|
24
|
+
# Initialize the queue with Async Workers by default
|
25
|
+
provider = SknUtils::ConcurrentJobs.call
|
26
|
+
|
27
|
+
# Populate WorkQueue
|
28
|
+
commands.each do |command|
|
29
|
+
provider.register_job do
|
30
|
+
begin
|
31
|
+
SknUtils::HttpProcessor.call(command) # mis-spelling these params result in [SknFailure, SknFailure, ...] results
|
32
|
+
rescue => ex
|
33
|
+
$stderr.puts ex
|
34
|
+
SknFailure.(ex.class.name, "#{ex.message}; #{ex.backtrace[0]}")
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# Execute WorkQueue
|
40
|
+
result = provider.render_jobs
|
41
|
+
|
42
|
+
if result.success?
|
43
|
+
puts "Success: true"
|
44
|
+
puts "Values: #{result.values}"
|
45
|
+
puts "Messages: #{result.messages}"
|
46
|
+
else
|
47
|
+
puts "Success: false - errors: #{result.messages.join(', ')}"
|
48
|
+
puts "Values: #{result.values}"
|
49
|
+
end
|
50
|
+
|
51
|
+
# result.values
|
52
|
+
rescue => e
|
53
|
+
$stderr.puts e.message, e.backtrace
|
54
|
+
end
|