functional-light-service 0.4.4 → 0.5.4

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.
data/Rakefile CHANGED
@@ -9,4 +9,4 @@ RuboCop::RakeTask.new
9
9
  RSpec::Core::RakeTask.new(:spec)
10
10
 
11
11
  task(:default).clear
12
- task :default => %i[spec rubocop]
12
+ task :default => %i[spec rubocop]
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.4.4
1
+ 0.5.4
@@ -21,11 +21,16 @@ Gem::Specification.new do |gem|
21
21
  gem.add_runtime_dependency("i18n", "~> 1.8", ">= 1.8.11")
22
22
 
23
23
 
24
+ gem.add_development_dependency("rake", "~> 13.0.6", ">= 13.0.6")
24
25
  gem.add_development_dependency("i18n", "~> 1.8", ">= 1.8.11")
25
26
  gem.add_development_dependency("dry-inflector", "~> 0.2", ">= 0.2.1")
26
27
  gem.add_development_dependency("rspec", "~> 3.10.0")
28
+ gem.add_development_dependency("rspec-mocks", "= 3.10.2")
27
29
  gem.add_development_dependency("simplecov", "~> 0.21.2")
28
30
  gem.add_development_dependency("simplecov-cobertura", "~> 2.1.0")
31
+ # rexml >= 3.3 ha un parser XML piu severo che rompe simplecov-cobertura 2.1.0
32
+ # (Malformed XML: No root element). Blocco alla 3.2.x compatibile.
33
+ gem.add_development_dependency("rexml", "< 3.3")
29
34
  gem.add_development_dependency("rubocop", "~> 1.25.0")
30
35
  gem.add_development_dependency("rubocop-performance", "~> 1.13.2")
31
36
  gem.add_development_dependency("pry", "~> 0.14.1")
@@ -3,7 +3,7 @@ module FunctionalLightService
3
3
  class Context < Hash
4
4
  include FunctionalLightService::Prelude::Option
5
5
  include FunctionalLightService::Prelude::Result
6
- attr_accessor :outcome, :current_action
6
+ attr_accessor :outcome, :current_action, :organized_by
7
7
 
8
8
  # rubocop:disable Lint/MissingSuper
9
9
  def initialize(context = {},
@@ -2,9 +2,15 @@ module FunctionalLightService
2
2
  module Organizer
3
3
  class WithReducer
4
4
  attr_reader :context
5
+ attr_accessor :organizer
6
+
7
+ def initialize(monitored_organizer = nil)
8
+ @organizer = monitored_organizer
9
+ end
5
10
 
6
11
  def with(data = {})
7
12
  @context = FunctionalLightService::Context.make(data)
13
+ @context.organized_by = organizer
8
14
  self
9
15
  end
10
16
 
@@ -3,7 +3,7 @@ module FunctionalLightService
3
3
  class WithReducerFactory
4
4
  def self.make(monitored_organizer)
5
5
  logger = monitored_organizer.logger || FunctionalLightService::Configuration.logger
6
- decorated = WithReducer.new
6
+ decorated = WithReducer.new(monitored_organizer)
7
7
 
8
8
  return decorated if logger.nil?
9
9
 
@@ -8,6 +8,9 @@ module FunctionalLightService
8
8
  def initialize(organizer, logger:, decorated: WithReducer.new)
9
9
  @decorated = decorated
10
10
  @organizer = organizer
11
+
12
+ decorated.organizer = organizer
13
+
11
14
  @logger = logger
12
15
  @logged = false
13
16
  end
@@ -63,6 +63,16 @@ module FunctionalLightService
63
63
  def logger
64
64
  @logger
65
65
  end
66
+
67
+ def add_to_context(**args)
68
+ args.map do |key, value|
69
+ execute(->(ctx) { ctx[key.to_sym] = value })
70
+ end
71
+ end
72
+
73
+ def add_aliases(args)
74
+ execute(->(ctx) { ctx.assign_aliases(ctx.aliases.merge(args)) })
75
+ end
66
76
  end
67
77
 
68
78
  module Macros
@@ -1,3 +1,3 @@
1
1
  module FunctionalLightService
2
- VERSION = "0.4.4".freeze
2
+ VERSION = "0.5.4".freeze
3
3
  end
@@ -0,0 +1,28 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe FunctionalLightService::Organizer do
4
+ class TestAddAliases
5
+ extend FunctionalLightService::Organizer
6
+
7
+ def self.call(context = FunctionalLightService::Context.make)
8
+ with(context).reduce(steps)
9
+ end
10
+
11
+ def self.steps
12
+ [
13
+ add_to_context(:my_message => "Hello There"),
14
+ # This will add the alias `:a_message` which points
15
+ # to the :my_message key's value
16
+ add_aliases(:my_message => :a_message),
17
+ TestDoubles::CapitalizeMessage
18
+ ]
19
+ end
20
+ end
21
+
22
+ it "adds aliases to the context embedded in the series of actions" do
23
+ result = TestAddAliases.call
24
+
25
+ expect(result).to be_success
26
+ expect(result.final_message).to eq("HELLO THERE")
27
+ end
28
+ end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+
3
+ RSpec.describe FunctionalLightService::Organizer do
4
+ class TestAddToContext
5
+ extend FunctionalLightService::Organizer
6
+
7
+ def self.call(context = FunctionalLightService::Context.make)
8
+ with(context).reduce(steps)
9
+ end
10
+
11
+ def self.steps
12
+ [
13
+ # This will add the `:number` key to the context
14
+ # with the value of 0, so it's available for
15
+ # AddsOneAction
16
+ add_to_context(:number => 0),
17
+ TestDoubles::AddsOneAction,
18
+ add_to_context(:something => "hello")
19
+ ]
20
+ end
21
+ end
22
+
23
+ it "adds items to the context on the fly" do
24
+ result = TestAddToContext.call
25
+
26
+ expect(result).to be_success
27
+ expect(result.number).to eq(1)
28
+ expect(result[:something]).to eq("hello")
29
+ end
30
+ end
@@ -20,6 +20,13 @@ RSpec.describe FunctionalLightService::Organizer do
20
20
  expect(result.number).to eq(5)
21
21
  end
22
22
 
23
+ it "knows that it's being iterated from within an organizer" do
24
+ result = TestDoubles::TestIterate.call(:number => 1,
25
+ :counters => [1, 2, 3, 4])
26
+
27
+ expect(result.organized_by).to eq TestDoubles::TestIterate
28
+ end
29
+
23
30
  it 'will not iterate over a failed context' do
24
31
  empty_context.fail!('Something bad happened')
25
32
 
@@ -49,6 +49,12 @@ RSpec.describe FunctionalLightService::Organizer do
49
49
  expect(result).to be_success
50
50
  end
51
51
 
52
+ it "knows that it's being conditionally reduced from within an organizer" do
53
+ result = TestReduceIf.call(:number => 2)
54
+
55
+ expect(result.organized_by).to eq TestReduceIf
56
+ end
57
+
52
58
  it 'skips actions within in its own scope' do
53
59
  org = Class.new do
54
60
  extend FunctionalLightService::Organizer
@@ -40,4 +40,10 @@ RSpec.describe FunctionalLightService::Organizer do
40
40
  result = TestReduceUntil.call(empty_context)
41
41
  expect(result).to be_success
42
42
  end
43
+
44
+ it "is expected to know its organizer when reducing until a condition" do
45
+ result = TestReduceUntil.call(:number => 1)
46
+
47
+ expect(result.organized_by).to eq TestReduceUntil
48
+ end
43
49
  end
data/spec/action_spec.rb CHANGED
@@ -68,6 +68,14 @@ describe FunctionalLightService::Action do
68
68
  expect(result.to_hash).to eq(:number => 2)
69
69
  end
70
70
 
71
+ context "when called directly" do
72
+ it "is expected to not be organized" do
73
+ result = TestDoubles::AddsTwoActionWithFetch.execute(context)
74
+
75
+ expect(result.organized_by).to be_nil
76
+ end
77
+ end
78
+
71
79
  context "when invoked with hash" do
72
80
  it "creates FunctionalLightService::Context implicitly" do
73
81
  ctx = { :some_key => "some value" }
@@ -72,27 +72,31 @@ describe FunctionalLightService::Option do
72
72
  end
73
73
 
74
74
  it "match" do
75
- # expect(
76
- # Some(0).match do
77
- # Some(where { s == 1 }) { |_s| 99 }
78
- # Some(where { s == 0 }) { |s| s + 1 }
79
- # None() {}
80
- # end
81
- # ).to eq 1
75
+ expect(
76
+ # rubocop:disable Lint/UnusedBlockArgument
77
+ # rubocop:disable Lint/EmptyBlock
78
+ Some(0).match do
79
+ Some(where { s == 1 }) { |s| 99 }
80
+ Some(where { s == 0 }) { |s| s + 1 }
81
+ None() {}
82
+ end
83
+ ).to eq 1
82
84
 
83
85
  expect(
84
86
  Some(1).match do
85
87
  None() { 0 }
86
- Some() { |_s| 1 }
88
+ Some() { |s| 1 }
87
89
  end
88
90
  ).to eq 1
89
91
 
90
- # expect(
91
- # Some(1).match do
92
- # None() { 0 }
93
- # Some(where { s.is_a? Integer }) { |_s| 1 }
94
- # end
95
- # ).to eq 1
92
+ expect(
93
+ Some(1).match do
94
+ None() { 0 }
95
+ Some(where { s.is_a? Integer }) { |s| 1 }
96
+ end
97
+ # rubocop:enable Lint/UnusedBlockArgument
98
+ # rubocop:enable Lint/EmptyBlock
99
+ ).to eq 1
96
100
 
97
101
  expect(
98
102
  None.match do
@@ -19,6 +19,11 @@ describe FunctionalLightService::Organizer do
19
19
  result = TestDoubles::AnOrganizer.call(:user => user)
20
20
  expect(result).to eq(ctx)
21
21
  end
22
+
23
+ it "sets itself as the organizer" do
24
+ result = TestDoubles::AnOrganizer.call(:user => user)
25
+ expect(result.organized_by).to eq TestDoubles::AnOrganizer
26
+ end
22
27
  end
23
28
 
24
29
  context "when #with is called with Context" do
@@ -90,4 +95,20 @@ describe FunctionalLightService::Organizer do
90
95
  expect(reduced).to eq(ctx)
91
96
  end
92
97
  end
98
+
99
+ context "can add items to the context" do
100
+ specify 'with #add_to_context' do
101
+ result = TestDoubles::AnOrganizerThatAddsToContext.call
102
+ expect(result[:strongest_avenger]).to eq :thor
103
+ expect(result[:last_jedi]).to eq "Rey"
104
+ end
105
+ end
106
+
107
+ context "can assign key aliaeses" do
108
+ it 'with #add_aliases' do
109
+ result = TestDoubles::AnOrganizerThatAddsAliases.call
110
+ expect(result[:foo]).to eq :bar
111
+ expect(result[:baz]).to eq :bar
112
+ end
113
+ end
93
114
  end
@@ -15,7 +15,7 @@ describe ProvidesFreeShippingAction do
15
15
  end
16
16
 
17
17
  context "when the order total with tax is <= 200" do
18
- specify "order gets free shipping" do
18
+ specify "order does not get free shipping" do
19
19
  allow(order).to receive_messages(:total_with_tax => 200)
20
20
  expect(order).not_to receive(:provide_free_shipping!)
21
21
 
data/spec/spec_helper.rb CHANGED
@@ -1,21 +1,23 @@
1
1
  $LOAD_PATH << File.join(File.dirname(__FILE__), '..', 'lib')
2
2
  $LOAD_PATH << File.join(File.dirname(__FILE__))
3
3
 
4
- require 'simplecov'
4
+ if ENV['RUN_COVERAGE_REPORT']
5
+ require 'simplecov'
5
6
 
6
- SimpleCov.start do
7
- add_filter 'vendor/'
8
- add_filter %r{^/spec/}
9
- end
7
+ SimpleCov.start do
8
+ add_filter 'vendor/'
9
+ add_filter %r{^/spec/}
10
+ end
10
11
 
11
- SimpleCov.minimum_coverage_by_file 90
12
+ SimpleCov.minimum_coverage_by_file 90
12
13
 
13
- require 'simplecov-cobertura'
14
- SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
14
+ require "simplecov-cobertura"
15
+ SimpleCov.formatter = SimpleCov::Formatter::CoberturaFormatter
16
+ end
15
17
 
16
- require 'functional-light-service'
17
- require 'functional-light-service/testing'
18
+ require "functional-light-service"
19
+ require "functional-light-service/testing"
18
20
  require "functional-light-service/functional/null"
19
- require 'support'
20
- require 'test_doubles'
21
- require 'stringio'
21
+ require "support"
22
+ require "test_doubles"
23
+ require "stringio"
data/spec/test_doubles.rb CHANGED
@@ -561,4 +561,39 @@ module TestDoubles
561
561
  ctx.total += ctx.number
562
562
  end
563
563
  end
564
+
565
+ class CapitalizeMessage
566
+ extend FunctionalLightService::Action
567
+ expects :a_message
568
+ promises :final_message
569
+
570
+ executed do |ctx|
571
+ ctx.final_message = ctx.a_message.upcase
572
+ end
573
+ end
574
+
575
+ class AnOrganizerThatAddsToContext
576
+ extend FunctionalLightService::Organizer
577
+ def self.call
578
+ with.reduce(actions)
579
+ end
580
+
581
+ def self.actions
582
+ [add_to_context(
583
+ :strongest_avenger => :thor,
584
+ :last_jedi => "Rey"
585
+ )]
586
+ end
587
+ end
588
+
589
+ class AnOrganizerThatAddsAliases
590
+ extend FunctionalLightService::Organizer
591
+ def self.call
592
+ with(:foo => :bar).reduce(actions)
593
+ end
594
+
595
+ def self.actions
596
+ [add_aliases(:foo => :baz)]
597
+ end
598
+ end
564
599
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: functional-light-service
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.5.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Boscolo Michele
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2022-01-27 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: dry-inflector
@@ -50,6 +49,26 @@ dependencies:
50
49
  - - ">="
51
50
  - !ruby/object:Gem::Version
52
51
  version: 1.8.11
52
+ - !ruby/object:Gem::Dependency
53
+ name: rake
54
+ requirement: !ruby/object:Gem::Requirement
55
+ requirements:
56
+ - - "~>"
57
+ - !ruby/object:Gem::Version
58
+ version: 13.0.6
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: 13.0.6
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 13.0.6
69
+ - - ">="
70
+ - !ruby/object:Gem::Version
71
+ version: 13.0.6
53
72
  - !ruby/object:Gem::Dependency
54
73
  name: i18n
55
74
  requirement: !ruby/object:Gem::Requirement
@@ -104,6 +123,20 @@ dependencies:
104
123
  - - "~>"
105
124
  - !ruby/object:Gem::Version
106
125
  version: 3.10.0
126
+ - !ruby/object:Gem::Dependency
127
+ name: rspec-mocks
128
+ requirement: !ruby/object:Gem::Requirement
129
+ requirements:
130
+ - - '='
131
+ - !ruby/object:Gem::Version
132
+ version: 3.10.2
133
+ type: :development
134
+ prerelease: false
135
+ version_requirements: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - '='
138
+ - !ruby/object:Gem::Version
139
+ version: 3.10.2
107
140
  - !ruby/object:Gem::Dependency
108
141
  name: simplecov
109
142
  requirement: !ruby/object:Gem::Requirement
@@ -132,6 +165,20 @@ dependencies:
132
165
  - - "~>"
133
166
  - !ruby/object:Gem::Version
134
167
  version: 2.1.0
168
+ - !ruby/object:Gem::Dependency
169
+ name: rexml
170
+ requirement: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - "<"
173
+ - !ruby/object:Gem::Version
174
+ version: '3.3'
175
+ type: :development
176
+ prerelease: false
177
+ version_requirements: !ruby/object:Gem::Requirement
178
+ requirements:
179
+ - - "<"
180
+ - !ruby/object:Gem::Version
181
+ version: '3.3'
135
182
  - !ruby/object:Gem::Dependency
136
183
  name: rubocop
137
184
  requirement: !ruby/object:Gem::Requirement
@@ -215,7 +262,6 @@ files:
215
262
  - ".rspec"
216
263
  - ".rubocop.yml"
217
264
  - ".solargraph.yml"
218
- - ".travis.yml"
219
265
  - Appraisals
220
266
  - CHANGELOG.md
221
267
  - CODE_OF_CONDUCT.md
@@ -268,6 +314,8 @@ files:
268
314
  - spec/acceptance/log_from_organizer_spec.rb
269
315
  - spec/acceptance/message_localization_spec.rb
270
316
  - spec/acceptance/not_having_call_method_warning_spec.rb
317
+ - spec/acceptance/organizer/add_aliases_spec.rb
318
+ - spec/acceptance/organizer/add_to_context_spec.rb
271
319
  - spec/acceptance/organizer/around_each_with_reduce_if_spec.rb
272
320
  - spec/acceptance/organizer/context_failure_and_skipping_spec.rb
273
321
  - spec/acceptance/organizer/execute_spec.rb
@@ -323,7 +371,6 @@ homepage: https://github.com/sphynx79/functional-light-service
323
371
  licenses:
324
372
  - MIT
325
373
  metadata: {}
326
- post_install_message:
327
374
  rdoc_options: []
328
375
  require_paths:
329
376
  - lib
@@ -338,8 +385,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
338
385
  - !ruby/object:Gem::Version
339
386
  version: '0'
340
387
  requirements: []
341
- rubygems_version: 3.2.28
342
- signing_key:
388
+ rubygems_version: 3.6.9
343
389
  specification_version: 4
344
390
  summary: A service skeleton with an emphasis on simplicity with a pinch a functional
345
391
  programming
@@ -354,6 +400,8 @@ test_files:
354
400
  - spec/acceptance/log_from_organizer_spec.rb
355
401
  - spec/acceptance/message_localization_spec.rb
356
402
  - spec/acceptance/not_having_call_method_warning_spec.rb
403
+ - spec/acceptance/organizer/add_aliases_spec.rb
404
+ - spec/acceptance/organizer/add_to_context_spec.rb
357
405
  - spec/acceptance/organizer/around_each_with_reduce_if_spec.rb
358
406
  - spec/acceptance/organizer/context_failure_and_skipping_spec.rb
359
407
  - spec/acceptance/organizer/execute_spec.rb
data/.travis.yml DELETED
@@ -1,24 +0,0 @@
1
- language: ruby
2
-
3
- env:
4
- - RUN_COVERAGE_REPORT=true
5
-
6
- rvm:
7
- - 2.6.6
8
- - 2.7.2
9
- - 3.0.0
10
-
11
- before_install:
12
- - 'echo ''gem: --no-ri --no-rdoc'' > ~/.gemrc'
13
- - yes | gem update --system --force
14
- - gem install bundler
15
- - bundle install --gemfile=Gemfile --clean --path vendor/bundle
16
-
17
- # uncomment this line if your project needs to run something other than `rake`:
18
- script:
19
- - bundle exec rspec spec
20
- - bundle exec rubocop
21
-
22
- gemfile:
23
- - gemfiles/dry_inflector_0_2_1.gemfile
24
- - gemfiles/i18n_1_8_11.gemfile