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.
Files changed (40) hide show
  1. checksums.yaml +5 -5
  2. data/.rspec +2 -0
  3. data/README.md +223 -72
  4. data/_config.yml +4 -4
  5. data/bin/concurrent_test_block +54 -0
  6. data/bin/concurrent_test_grouped +45 -0
  7. data/bin/concurrent_test_procs +45 -0
  8. data/bin/concurrent_test_wrapped +49 -0
  9. data/lib/skn_container.rb +2 -1
  10. data/lib/skn_failure.rb +2 -0
  11. data/lib/skn_hash.rb +2 -0
  12. data/lib/skn_registry.rb +25 -5
  13. data/lib/skn_settings.rb +2 -0
  14. data/lib/skn_success.rb +2 -0
  15. data/lib/skn_utils.rb +13 -2
  16. data/lib/skn_utils/concurrent_jobs.rb +117 -0
  17. data/lib/skn_utils/configurable.rb +55 -6
  18. data/lib/skn_utils/configuration.rb +2 -0
  19. data/lib/skn_utils/core_extensions.rb +29 -0
  20. data/lib/skn_utils/dotted_hash.rb +1 -0
  21. data/lib/skn_utils/env_string_handler.rb +2 -0
  22. data/lib/skn_utils/http_processor.rb +34 -0
  23. data/lib/skn_utils/job_commands.rb +247 -0
  24. data/lib/skn_utils/nested_result.rb +2 -0
  25. data/lib/skn_utils/notifier_base.rb +2 -0
  26. data/lib/skn_utils/null_object.rb +2 -0
  27. data/lib/skn_utils/page_controls.rb +2 -0
  28. data/lib/skn_utils/result_bean.rb +2 -0
  29. data/lib/skn_utils/version.rb +3 -1
  30. data/lib/skn_utils/wrappable.rb +32 -0
  31. data/skn_utils.gemspec +27 -22
  32. data/spec/lib/skn_utils/concurrent_jobs_spec.rb +279 -0
  33. data/spec/lib/skn_utils/configurable_spec.rb +23 -36
  34. data/spec/lib/skn_utils/registry_spec.rb +22 -0
  35. data/spec/lib/skn_utils/wrappers_spec.rb +80 -0
  36. data/spec/spec_helper.rb +5 -0
  37. data/spec/support/configurables.rb +36 -0
  38. data/spec/support/xml_matchers.rb +121 -0
  39. metadata +71 -24
  40. data/README.rdoc +0 -379
@@ -0,0 +1,279 @@
1
+ ##
2
+ # spec/lib/skn_utils/as_human_size_spec.rb
3
+ #
4
+
5
+
6
+ describe SknUtils::ConcurrentJobs, 'Run Multiple Jobs' do
7
+
8
+ let(:commands) {
9
+ [
10
+ SknUtils::CommandJSONPost.call(full_url: "http://example.com/posts", payload: {one: 1}, headers: {'my-header'=> "header-value"}),
11
+ SknUtils::CommandFORMPost.call(full_url: "http://example.com/posts", payload: {one: 1}),
12
+ SknUtils::CommandJSONGet.call(full_url: "http://example.com/posts/1"),
13
+ SknUtils::CommandJSONPut.call(full_url: "http://example.com/posts", payload: {one: 1}),
14
+ SknUtils::CommandFORMDelete.call(full_url: "http://example.com/posts/1")
15
+ ]
16
+ }
17
+
18
+ let(:test_proc) {
19
+ ->(cmd) { SknSuccess.(cmd.uri.request_uri, "Ok") }
20
+ }
21
+
22
+ let(:inline_failure_proc) {
23
+ ->(cmd) { SknFailure.(cmd.uri.request_uri, "Failure") }
24
+ }
25
+
26
+ let(:catastrophic_proc) {
27
+ ->(cmd) { SomeUnkownThing.(cmd.uri.request_uri, "Catastrophic") }
28
+ }
29
+
30
+ context "HTTP Requests " do
31
+ it "Job Commands will provide a valid http request object" do
32
+ expect(commands.any?(&:request)).to be true
33
+ end
34
+
35
+ it "Performs Http Post Requests" do
36
+ test_url = "http://jsonplaceholder.typicode.com/users"
37
+ stub_request(:post, test_url).
38
+ to_return(status: 200, body: "{\"message\":\"me\"}", headers: {})
39
+
40
+ cmd = SknUtils::CommandJSONPost.call(full_url: test_url, payload: {"one" => 1})
41
+
42
+ provider = SknUtils::ConcurrentJobs.call
43
+ provider.register_job do
44
+ SknUtils::JobWrapper.call(cmd, SknUtils::HttpProcessor)
45
+ end
46
+ result = provider.render_jobs
47
+
48
+ expect(result).to be_a(SknUtils::Result)
49
+ expect(result.success?).to be true
50
+ expect(result.values.size).to eq(1)
51
+ expect(result.values[0]).to be_a(SknSuccess)
52
+ expect(result.values[0].value).to be_a(Hash)
53
+ expect(result.values[0].value["message"]).to eq("me")
54
+ end
55
+
56
+ it "Performs Http Form Post Requests" do
57
+ test_url = "http://jsonplaceholder.typicode.com/users"
58
+ stub_request(:post, test_url).
59
+ to_return(status: 200, body: "message=me", headers: {})
60
+
61
+ cmd = SknUtils::CommandFORMPost.call(full_url: test_url, payload: {"one" => 1})
62
+
63
+ provider = SknUtils::ConcurrentJobs.call
64
+ provider.register_job do
65
+ SknUtils::JobWrapper.call(cmd, SknUtils::HttpProcessor)
66
+ end
67
+ result = provider.render_jobs
68
+
69
+ expect(result).to be_a(SknUtils::Result)
70
+ expect(result.success?).to be true
71
+ expect(result.values.size).to eq(1)
72
+ expect(result.values[0]).to be_a(SknSuccess)
73
+ expect(result.values[0].value).to be_a(String)
74
+ expect(result.values[0].value).to eq("message=me")
75
+ end
76
+
77
+ it "Performs Http Get Requests" do
78
+ test_url = "http://jsonplaceholder.typicode.com/users"
79
+ stub_request(:get, test_url).
80
+ to_return(status: 200, body: "{\"message\":\"me\"}", headers: {})
81
+
82
+ cmd = SknUtils::CommandJSONGet.call(full_url: test_url)
83
+
84
+ provider = SknUtils::ConcurrentJobs.call
85
+ provider.register_job do
86
+ SknUtils::JobWrapper.call(cmd, SknUtils::HttpProcessor)
87
+ end
88
+ result = provider.render_jobs
89
+
90
+ expect(result).to be_a(SknUtils::Result)
91
+ expect(result.success?).to be true
92
+ expect(result.values.size).to eq(1)
93
+ expect(result.values[0]).to be_a(SknSuccess)
94
+ expect(result.values[0].value).to be_a(Hash)
95
+ expect(result.values[0].value["message"]).to eq("me")
96
+ end
97
+
98
+ it "Performs Http Put Requests" do
99
+ test_url = "http://jsonplaceholder.typicode.com/users"
100
+ stub_request(:put, test_url).
101
+ to_return(status: 200, body: "{\"message\":\"me\"}", headers: {})
102
+
103
+ cmd = SknUtils::CommandJSONPut.call(full_url: test_url, payload: {"one" => 1})
104
+
105
+ provider = SknUtils::ConcurrentJobs.call
106
+ provider.register_job do
107
+ SknUtils::JobWrapper.call(cmd, SknUtils::HttpProcessor)
108
+ end
109
+ result = provider.render_jobs
110
+
111
+ expect(result).to be_a(SknUtils::Result)
112
+ expect(result.success?).to be true
113
+ expect(result.values.size).to eq(1)
114
+ expect(result.values[0]).to be_a(SknSuccess)
115
+ expect(result.values[0].value).to be_a(Hash)
116
+ expect(result.values[0].value["message"]).to eq("me")
117
+ end
118
+
119
+ it "Performs Http Form Delete Requests" do
120
+ test_url = "http://jsonplaceholder.typicode.com/users"
121
+ stub_request(:delete, test_url).
122
+ to_return(status: 200, body: "message=me", headers: {})
123
+
124
+ cmd = SknUtils::CommandFORMDelete.call(full_url: test_url, payload: {"one" => 1})
125
+
126
+ provider = SknUtils::ConcurrentJobs.call
127
+ provider.register_job do
128
+ SknUtils::JobWrapper.call(cmd, SknUtils::HttpProcessor)
129
+ end
130
+ result = provider.render_jobs
131
+
132
+ expect(result).to be_a(SknUtils::Result)
133
+ expect(result.success?).to be true
134
+ expect(result.values.size).to eq(1)
135
+ expect(result.values[0]).to be_a(SknSuccess)
136
+ expect(result.values[0].value).to be_a(String)
137
+ expect(result.values[0].value).to eq("message=me")
138
+ end
139
+ end
140
+
141
+ context "Asynchronous" do
142
+ it "Runs Jobs" do
143
+ provider = SknUtils::ConcurrentJobs.call
144
+ provider.register_jobs(commands, test_proc)
145
+ result = provider.render_jobs
146
+
147
+ expect(result).to be_a(SknUtils::Result)
148
+ expect(result.success?).to be true
149
+ expect(result.values.size).to eq(commands.size)
150
+ expect(result.values[0]).to be_a(SknSuccess)
151
+ end
152
+ it "Runs Jobs and handles inline failures" do
153
+ provider = SknUtils::ConcurrentJobs.call
154
+
155
+ provider.register_job do
156
+ SknUtils::JobWrapper.call(commands[0], test_proc)
157
+ end
158
+ provider.register_job do
159
+ SknUtils::JobWrapper.call(commands[1], inline_failure_proc)
160
+ end
161
+ provider.register_job do
162
+ SknUtils::JobWrapper.call(commands[2], inline_failure_proc)
163
+ end
164
+ provider.register_job do
165
+ SknUtils::JobWrapper.call(commands[3], inline_failure_proc)
166
+ end
167
+ provider.register_job do
168
+ SknUtils::JobWrapper.call(commands[4], test_proc)
169
+ end
170
+
171
+ result = provider.render_jobs
172
+
173
+ expect(result).to be_a(SknUtils::Result)
174
+ expect(result.success?).to be false
175
+ expect(result.values.size).to eq(commands.size)
176
+ expect(result.values[1]).to be_a(SknFailure)
177
+ expect(result.values[1].message).to eq("Failure")
178
+ end
179
+ it "Runs Jobs and handles catastrophic failures" do
180
+ provider = SknUtils::ConcurrentJobs.call
181
+ provider.register_job do
182
+ SknUtils::JobWrapper.call(command[0], test_proc)
183
+ end
184
+ provider.register_job do # notice `command` vs `commands`
185
+ SknUtils::JobWrapper.call(command[1], inline_failure_proc)
186
+ end
187
+ provider.register_job do
188
+ SknUtils::JobWrapper.call(command[2], catastrophic_proc)
189
+ end
190
+ provider.register_job do
191
+ SknUtils::JobWrapper.call(commands[3], catastrophic_proc)
192
+ end
193
+ provider.register_job do
194
+ SknUtils::JobWrapper.call(commands[4], test_proc)
195
+ end
196
+
197
+ result = provider.render_jobs
198
+
199
+ expect(result).to be_a(SknUtils::Result)
200
+ expect(result.success?).to be false
201
+ expect(result.values.size).to eq(commands.size)
202
+ expect(result.values.last).to be_a(SknSuccess)
203
+ expect(result.values[3].value).to eq("NameError")
204
+ expect(result.values[2]).to be_a(SknFailure)
205
+ expect(result.values[1]).to be_a(SknFailure)
206
+ expect(result.values[0]).to be_a(SknFailure)
207
+ expect(result.values[0].value).to eq("Unknown")
208
+ end
209
+ end
210
+
211
+ context "Synchronous" do
212
+ it "Runs Jobs" do
213
+ provider = SknUtils::ConcurrentJobs.call(async: false)
214
+ provider.register_jobs(commands, test_proc)
215
+ result = provider.render_jobs
216
+
217
+ expect(result).to be_a(SknUtils::Result)
218
+ expect(result.success?).to be true
219
+ expect(result.values.size).to eq(commands.size)
220
+ expect(result.values[0]).to be_a(SknSuccess)
221
+ end
222
+ it "Runs Jobs and handles inline failures" do
223
+ provider = SknUtils::ConcurrentJobs.call
224
+
225
+ provider.register_job do
226
+ SknUtils::JobWrapper.call(commands[0], test_proc)
227
+ end
228
+ provider.register_job do
229
+ SknUtils::JobWrapper.call(commands[1], inline_failure_proc)
230
+ end
231
+ provider.register_job do
232
+ SknUtils::JobWrapper.call(commands[2], inline_failure_proc)
233
+ end
234
+ provider.register_job do
235
+ SknUtils::JobWrapper.call(commands[3], inline_failure_proc)
236
+ end
237
+ provider.register_job do
238
+ SknUtils::JobWrapper.call(commands[4], test_proc)
239
+ end
240
+
241
+ result = provider.render_jobs
242
+
243
+ expect(result).to be_a(SknUtils::Result)
244
+ expect(result.success?).to be false
245
+ expect(result.values.size).to eq(commands.size)
246
+ expect(result.values[1]).to be_a(SknFailure)
247
+ expect(result.values[1].message).to eq("Failure")
248
+ end
249
+ it "Runs Jobs and handles catastrophic failures" do
250
+ provider = SknUtils::ConcurrentJobs.call
251
+ provider.register_job do
252
+ SknUtils::JobWrapper.call(commands[0], test_proc)
253
+ end
254
+ provider.register_job do
255
+ SknUtils::JobWrapper.call(commands[1], inline_failure_proc)
256
+ end
257
+ provider.register_job do
258
+ SknUtils::JobWrapper.call(commands[2], catastrophic_proc)
259
+ end
260
+ provider.register_job do
261
+ SknUtils::JobWrapper.call(commands[3], catastrophic_proc)
262
+ end
263
+ provider.register_job do
264
+ SknUtils::JobWrapper.call(commands[4], test_proc)
265
+ end
266
+
267
+ result = provider.render_jobs
268
+
269
+ expect(result).to be_a(SknUtils::Result)
270
+ expect(result.success?).to be false
271
+ expect(result.values.size).to eq(commands.size)
272
+ expect(result.values[3].value).to eq("NameError")
273
+ expect(result.values[2]).to be_a(SknFailure)
274
+ expect(result.values[1]).to be_a(SknFailure)
275
+ expect(result.values[0]).to be_a(SknSuccess)
276
+ end
277
+ end
278
+
279
+ end
@@ -2,51 +2,20 @@
2
2
  # spec/lib/skn_utils/configurable_spec.rb
3
3
  #
4
4
 
5
- class MyApp
6
- include SknUtils::Configurable.with( :app_id, :title, :cookie_name, enable_root: true) # No options hash defaults to true
7
- # - and accept defaults for #env=, #root=, #registry=, and #logger=
8
-
9
- # notice: self.logger=, the self is required when assigning values
10
- self.logger = Object.new
11
- self.registry = Object.new
12
-
13
- configure do
14
- app_id 'some app'
15
- title 'My Title'
16
- cookie_name 'Chocolate'
17
- end
18
-
19
- def null_value
20
- @app_id.dup
21
- end
22
- end
23
-
24
- module MyMod
25
- include SknUtils::Configurable.with(:app_id, :title, :cookie_name, enable_root: false)
26
-
27
- def self.null_value
28
- @app_id.dup
29
- end
30
- end
31
-
32
- MyMod.configure do
33
- app_id 'some module'
34
- title 'Some Title'
35
- cookie_name 'Caramel'
36
- end
5
+ require "support/configurables"
37
6
 
38
7
 
39
8
  describe SknUtils::Configurable, "Gem Configuration module." do
40
9
 
41
10
  let(:my_app) { MyApp.new }
42
11
 
43
- context "Top Level AppClass Extra Operational Features. " do
12
+ context "MyApp: Top Level AppClass Extra Operational Features. " do
44
13
 
45
14
  it "MyApp.env.test? returns expected value. " do
46
15
  expect( MyApp.env.test? ).to be true
47
16
  end
48
17
  it "MyApp.root returns expected value. " do
49
- expect( MyApp.root.realdirpath.to_s ).to eq( Dir.pwd )
18
+ expect( MyApp.root ).to eq( Dir.pwd )
50
19
  end
51
20
  it "MyApp.logger returns expected value. " do
52
21
  expect( MyApp.logger ).to be_instance_of(Object) # eq('No Logger Assigned.')
@@ -60,9 +29,11 @@ describe SknUtils::Configurable, "Gem Configuration module." do
60
29
 
61
30
  it "my_app#config.title returns expected value. " do
62
31
  expect( MyApp.config.title ).to eq( "My Title" )
32
+ expect( MyApp.config[:title] ).to eq( "My Title" )
63
33
  end
64
- it "my_app#config.app_id returns expected value. " do
65
- expect( MyApp.config.app_id ).to eq( "some app" )
34
+ it "my_app#config[:value] accepts and returns expected value. " do
35
+ expect( MyApp.config[:value]="New Attribute" ).to eq( "New Attribute" )
36
+ expect( MyApp.config[:value] ).to eq( "New Attribute" )
66
37
  end
67
38
 
68
39
  it "MyMod#config.app_id returns expected value. " do
@@ -70,6 +41,11 @@ describe SknUtils::Configurable, "Gem Configuration module." do
70
41
  end
71
42
  it "MyMod#config.cookie_name returns expected value. " do
72
43
  expect( MyMod.config.cookie_name ).to eq( 'Caramel' )
44
+ expect( MyMod.config[:cookie_name] ).to eq( 'Caramel' )
45
+ end
46
+ it "MyMod#config[:value] accepts and returns expected value. " do
47
+ expect( MyMod.config[:value]="New Attribute" ).to eq( "New Attribute" )
48
+ expect( MyMod.config[:value] ).to eq( "New Attribute" )
73
49
  end
74
50
 
75
51
  it "MyMod#logger raises NoMethodError as expected. " do
@@ -78,4 +54,15 @@ describe SknUtils::Configurable, "Gem Configuration module." do
78
54
 
79
55
  end
80
56
 
57
+ context "#config instance vars are accessable as expected. " do
58
+
59
+ it "MyApp#null_value to return expected value" do
60
+ expect(my_app.null_value).to eq "some app"
61
+ expect{ MyApp.null_value }.to raise_error(NoMethodError)
62
+ end
63
+
64
+ it "MyMod#null_value to return expected value" do
65
+ expect( MyMod.null_value ).to eq "some module"
66
+ end
67
+ end
81
68
  end
@@ -127,4 +127,26 @@ describe SknRegistry, "IoC Lite Container class." do
127
127
  end
128
128
  end
129
129
 
130
+
131
+ context "When used for testing " do
132
+
133
+ it "#register_mock Registers a temporary mock." do
134
+ services.register_mock(:service_c, "Testing" )
135
+
136
+ expect(services.resolve(:service_c)).to eq "Testing"
137
+ services.restore!
138
+ end
139
+
140
+ it "#unregister_mocks! Remove all mocks and restores previous entries if present." do
141
+ original = services.resolve(:service_c)
142
+ services.substitute(:service_c, "Testing")
143
+ expect(services.resolve(:service_c)).to eq "Testing"
144
+
145
+ services.unregister_mocks!
146
+
147
+ services.resolve(:service_c)
148
+ expect(services.resolve(:service_c)).to eq original
149
+ end
150
+ end
151
+
130
152
  end
@@ -0,0 +1,80 @@
1
+ # ##
2
+ #
3
+
4
+ module Powered
5
+ def make_noise
6
+ puts "Powering up"
7
+ super
8
+ puts "Shutting down"
9
+ end
10
+ end
11
+
12
+ class Machine
13
+ extend SknUtils::Wrappable
14
+
15
+ wrap Powered
16
+
17
+ def make_noise
18
+ puts "Buzzzzzz"
19
+ end
20
+ end
21
+
22
+
23
+ module Logging
24
+ def make_noise
25
+ puts "Started making noise"
26
+ super
27
+ puts "Finished making noise"
28
+ end
29
+ end
30
+
31
+ class Bird
32
+ extend SknUtils::Wrappable
33
+
34
+ wrap Logging
35
+
36
+ def make_noise
37
+ puts "Chirp, chirp!"
38
+ end
39
+ end
40
+
41
+
42
+ module Flying
43
+ def make_noise
44
+ super
45
+ puts "Is flying away"
46
+ end
47
+ end
48
+
49
+ class Pigeon < Bird
50
+ wrap Flying
51
+
52
+ def make_noise
53
+ puts "Coo!"
54
+ end
55
+ end
56
+
57
+ describe 'SknUtils::Wrappable Module Handles Inheritance properly ' do
58
+
59
+ it '#make_noise handles Bird module. ' do
60
+ expect do
61
+ obj = Bird.new
62
+ obj.make_noise
63
+ end.to output("Started making noise\nChirp, chirp!\nFinished making noise\n").to_stdout
64
+ end
65
+
66
+ it '#make_noise handles Pigeon module. ' do
67
+ expect do
68
+ obj = Pigeon.new
69
+ obj.make_noise
70
+ end.to output("Started making noise\nCoo!\nFinished making noise\nIs flying away\n").to_stdout
71
+ end
72
+
73
+ it '#make_noise handles Machine module. ' do
74
+ expect do
75
+ obj = Machine.new
76
+ obj.make_noise
77
+ end.to output("Powering up\nBuzzzzzz\nShutting down\n").to_stdout
78
+ end
79
+
80
+ end