yaso 1.2.0 → 1.3.0
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.
- checksums.yaml +4 -4
- data/Gemfile.lock +5 -5
- data/README.md +2 -3
- data/benchmark/Gemfile +1 -0
- data/benchmark/index.rb +1 -2
- data/docker/Dockerfile +7 -0
- data/docker/entrypoint.sh +15 -0
- data/docker-compose.yml +15 -0
- data/lib/yaso/invocable.rb +22 -8
- data/lib/yaso/logic/failure.rb +1 -2
- data/lib/yaso/logic/pass.rb +1 -2
- data/lib/yaso/logic/step.rb +1 -7
- data/lib/yaso/logic/step_builder.rb +6 -7
- data/lib/yaso/logic/switch.rb +1 -8
- data/lib/yaso/logic/wrap.rb +2 -7
- data/lib/yaso/service.rb +36 -4
- data/lib/yaso/version.rb +1 -1
- data/lib/yaso.rb +0 -1
- metadata +5 -3
- data/lib/yaso/context.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1d9de791b4d45e8ea1cd2ffb6d75738f9d5eef8376261437b923d0795f81a5a2
|
4
|
+
data.tar.gz: 1d6234c4203c8cd9acdec73b5267ff16a45563caf67fd757f8fbed7fb2228d79
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8d8a4268ef7295d5eef6a6f8a45a73cc823f7d3322ad0c2cfea2f46a627f415af1c1974a8806318c290961ecd01bef29f4ad521e8d12f9f360c9f6a76d7426d9
|
7
|
+
data.tar.gz: 3b3e2a00818e075f555f47302033d6b6f292413291c4991e6d5e7831e58a95877a257dc0bb377b526736f516da5c71e58690b6e557e2805ac5a40e466e068bae
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
yaso (1.
|
4
|
+
yaso (1.3.0)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
@@ -14,7 +14,7 @@ GEM
|
|
14
14
|
lefthook (1.0.5)
|
15
15
|
method_source (1.0.0)
|
16
16
|
parallel (1.22.1)
|
17
|
-
parser (3.1.2.
|
17
|
+
parser (3.1.2.1)
|
18
18
|
ast (~> 2.4.1)
|
19
19
|
pry (0.14.1)
|
20
20
|
coderay (~> 1.1)
|
@@ -29,13 +29,13 @@ GEM
|
|
29
29
|
rspec-mocks (~> 3.11.0)
|
30
30
|
rspec-core (3.11.0)
|
31
31
|
rspec-support (~> 3.11.0)
|
32
|
-
rspec-expectations (3.11.
|
32
|
+
rspec-expectations (3.11.1)
|
33
33
|
diff-lcs (>= 1.2.0, < 2.0)
|
34
34
|
rspec-support (~> 3.11.0)
|
35
35
|
rspec-mocks (3.11.1)
|
36
36
|
diff-lcs (>= 1.2.0, < 2.0)
|
37
37
|
rspec-support (~> 3.11.0)
|
38
|
-
rspec-support (3.11.
|
38
|
+
rspec-support (3.11.1)
|
39
39
|
rubocop (1.28.2)
|
40
40
|
parallel (~> 1.10)
|
41
41
|
parser (>= 3.1.0.0)
|
@@ -59,7 +59,7 @@ GEM
|
|
59
59
|
simplecov_json_formatter (~> 0.1)
|
60
60
|
simplecov-html (0.12.3)
|
61
61
|
simplecov_json_formatter (0.1.4)
|
62
|
-
unicode-display_width (2.
|
62
|
+
unicode-display_width (2.3.0)
|
63
63
|
|
64
64
|
PLATFORMS
|
65
65
|
x86_64-darwin-21
|
data/README.md
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
# Yaso
|
2
2
|
[](https://github.com/Ar2emis/yaso/actions/workflows/main.yml)  [](https://github.com/Ar2emis/yaso/blob/master/LICENSE.txt)
|
3
3
|
|
4
|
-
That's my (Yet Another) ServiceObject pattern implementation. I made it fast ([the fastest actually](https://github.com/Ar2emis/yaso/wiki/Benchmarks)) and simple to use.
|
5
|
-
I was inspired by those alternatives and I hope this will encourage them to be even better:
|
4
|
+
That's my (Yet Another) ServiceObject pattern implementation. I made it fast ([the fastest of this kind actually](https://github.com/Ar2emis/yaso/wiki/Benchmarks); [simple_command](https://github.com/nebulab/simple_command), you got me this time) and simple to use (I hope). I was inspired by those alternatives and I hope this will encourage them to be even better:
|
6
5
|
- [Trailblazer](https://github.com/trailblazer/trailblazer)
|
7
6
|
- [Decouplio](https://github.com/differencialx/decouplio)
|
8
7
|
|
@@ -28,7 +27,7 @@ All the information you can find in the gem [wiki](https://github.com/Ar2emis/ya
|
|
28
27
|
|
29
28
|
## Development
|
30
29
|
|
31
|
-
I don't think that someone would like to help me developing the gem but if so just fork a
|
30
|
+
I don't think that someone would like to help me developing the gem but if so just fork a repository, do your dark business, open a pull request and assign me as a reviewer.
|
32
31
|
|
33
32
|
## Contributing
|
34
33
|
|
data/benchmark/Gemfile
CHANGED
@@ -7,6 +7,7 @@ gem 'interactor', '~> 3.1.2'
|
|
7
7
|
gem 'kalibera', '~> 0.1.2'
|
8
8
|
gem 'simple_command', RUBY_VERSION.include?('2.5') ? '~> 0.2.0' : '~> 1.0.1'
|
9
9
|
gem 'trailblazer', '~> 2.1.0'
|
10
|
+
gem 'yaso', path: '..'
|
10
11
|
|
11
12
|
gem 'active_interaction', %w[2.5 2.6].any? { |version| RUBY_VERSION.include?(version) } ? '~> 4.1.0' : '~> 5.1.0'
|
12
13
|
|
data/benchmark/index.rb
CHANGED
@@ -2,14 +2,13 @@
|
|
2
2
|
|
3
3
|
require 'bundler/setup'
|
4
4
|
|
5
|
-
require_relative '../lib/yaso'
|
6
|
-
|
7
5
|
require 'benchmark/ips'
|
8
6
|
RUBY_VERSION.include?('2.5') || require('decouplio')
|
9
7
|
require 'interactor'
|
10
8
|
require 'active_interaction'
|
11
9
|
require 'trailblazer'
|
12
10
|
require 'simple_command'
|
11
|
+
require 'yaso'
|
13
12
|
|
14
13
|
require_relative 'shared/yaso_service'
|
15
14
|
RUBY_VERSION.include?('2.5') || require_relative('shared/decouplio_service')
|
data/docker/Dockerfile
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/bin/bash
|
2
|
+
|
3
|
+
if [[ `bundle -v` =~ "Bundler version 2" ]]; then
|
4
|
+
bundle config set --local path '/bundle/cache'
|
5
|
+
bundle config set --local without 'development'
|
6
|
+
else
|
7
|
+
bundle config --local path '/bundle/cache'
|
8
|
+
bundle config --local without 'development'
|
9
|
+
fi
|
10
|
+
|
11
|
+
bundle
|
12
|
+
|
13
|
+
ruby index.rb
|
14
|
+
|
15
|
+
rm Gemfile.lock
|
data/docker-compose.yml
ADDED
data/lib/yaso/invocable.rb
CHANGED
@@ -7,12 +7,12 @@ module Yaso
|
|
7
7
|
YASO = :yaso
|
8
8
|
|
9
9
|
class << self
|
10
|
-
def call(object, options: {}, **)
|
10
|
+
def call(object, options: {}, with_block: false, **)
|
11
11
|
type = object_type(object)
|
12
12
|
invocable = case type
|
13
|
-
when YASO then proc { |context
|
14
|
-
when CALLABLE then
|
15
|
-
else method_invocable(object)
|
13
|
+
when YASO then proc { |context| object.call(context).success? }
|
14
|
+
when CALLABLE then callable_invocable(object, options, with_block: with_block)
|
15
|
+
else method_invocable(object, with_block: with_block)
|
16
16
|
end
|
17
17
|
[type, invocable]
|
18
18
|
end
|
@@ -25,11 +25,25 @@ module Yaso
|
|
25
25
|
object < ::Yaso::Service ? Invocable::YASO : Invocable::CALLABLE
|
26
26
|
end
|
27
27
|
|
28
|
-
def
|
28
|
+
def callable_invocable(object, options, with_block:)
|
29
|
+
return proc { |context, &block| object.call(context, **options, &block) } if with_block
|
30
|
+
|
31
|
+
proc { |context| object.call(context, **options) }
|
32
|
+
end
|
33
|
+
|
34
|
+
def method_invocable(object, with_block:)
|
35
|
+
if with_block
|
36
|
+
return instance_eval <<-RUBY, __FILE__, __LINE__ + 1
|
37
|
+
proc { |context, instance, &block| # proc { |context, instance, &block|
|
38
|
+
instance.#{object}(context, **context, &block) # instance.<method_name>(context, **context, &block)
|
39
|
+
} # }
|
40
|
+
RUBY
|
41
|
+
end
|
42
|
+
|
29
43
|
instance_eval <<-RUBY, __FILE__, __LINE__ + 1
|
30
|
-
proc { |context, instance
|
31
|
-
instance.#{object}(context, **context
|
32
|
-
}
|
44
|
+
proc { |context, instance| # proc { |context, instance|
|
45
|
+
instance.#{object}(context, **context) # instance.<method_name>(context, **context)
|
46
|
+
} # }
|
33
47
|
RUBY
|
34
48
|
end
|
35
49
|
end
|
data/lib/yaso/logic/failure.rb
CHANGED
data/lib/yaso/logic/pass.rb
CHANGED
data/lib/yaso/logic/step.rb
CHANGED
@@ -4,13 +4,7 @@ module Yaso
|
|
4
4
|
module Logic
|
5
5
|
class Step < Base
|
6
6
|
def call(context, instance)
|
7
|
-
context
|
8
|
-
if @invocable.call(context, instance)
|
9
|
-
@next_step
|
10
|
-
else
|
11
|
-
context.success = false
|
12
|
-
@failure
|
13
|
-
end
|
7
|
+
@invocable.call(context, instance) ? [@next_step, true] : [@failure, false]
|
14
8
|
end
|
15
9
|
end
|
16
10
|
end
|
@@ -16,8 +16,8 @@ module Yaso
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def call(object:, category:, block:, **opts)
|
19
|
-
invocable_type, invocable = Invocable.call(object, **opts)
|
20
19
|
logic_class = CATEGORIES[category]
|
20
|
+
invocable_type, invocable = Invocable.call(object, with_block: logic_class == Wrap, **opts)
|
21
21
|
if invocable_type == Invocable::METHOD
|
22
22
|
opts[:name] = logic_class == Switch ? build_switch(object, **opts, &block) : build_method(object, &block)
|
23
23
|
end
|
@@ -51,14 +51,13 @@ module Yaso
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def build_wrapper_methods(wrapper_class, service_class)
|
54
|
-
wrapper_class.define_singleton_method(:flow) do
|
55
|
-
service_class.flow
|
56
|
-
end
|
57
54
|
wrapper_class.define_singleton_method(:call) do |context, instance|
|
58
|
-
@entry ||= flow.call(service_class, steps)
|
55
|
+
@entry ||= service_class.flow.call(service_class, steps)
|
59
56
|
step = @entry
|
60
|
-
|
61
|
-
context
|
57
|
+
success = true
|
58
|
+
step, success = step.call(context, instance) while step
|
59
|
+
instance.success = success
|
60
|
+
instance
|
62
61
|
end
|
63
62
|
end
|
64
63
|
end
|
data/lib/yaso/logic/switch.rb
CHANGED
@@ -4,15 +4,8 @@ module Yaso
|
|
4
4
|
module Logic
|
5
5
|
class Switch < Base
|
6
6
|
def call(context, instance)
|
7
|
-
context.success = true
|
8
7
|
switch_case = @invocable.call(context, instance) || raise(UnhandledSwitchCaseError, instance.class)
|
9
|
-
|
10
|
-
if Invocable.call(switch_case).last.call(context, instance)
|
11
|
-
@next_step
|
12
|
-
else
|
13
|
-
context.success = false
|
14
|
-
@failure
|
15
|
-
end
|
8
|
+
Invocable.call(switch_case).last.call(context, instance) ? [@next_step, true] : [@failure, false]
|
16
9
|
end
|
17
10
|
end
|
18
11
|
end
|
data/lib/yaso/logic/wrap.rb
CHANGED
@@ -9,13 +9,8 @@ module Yaso
|
|
9
9
|
end
|
10
10
|
|
11
11
|
def call(context, instance)
|
12
|
-
context.success
|
13
|
-
|
14
|
-
@next_step
|
15
|
-
else
|
16
|
-
context.success = false
|
17
|
-
@failure
|
18
|
-
end
|
12
|
+
result = @invocable.call(context, instance) { @wrapper.call(context, instance).success? }
|
13
|
+
result ? [@next_step, true] : [@failure, false]
|
19
14
|
end
|
20
15
|
end
|
21
16
|
end
|
data/lib/yaso/service.rb
CHANGED
@@ -4,14 +4,46 @@ module Yaso
|
|
4
4
|
class Service
|
5
5
|
extend Stepable
|
6
6
|
|
7
|
+
attr_writer :success
|
8
|
+
|
9
|
+
def initialize(context)
|
10
|
+
@context = context
|
11
|
+
@success = true
|
12
|
+
end
|
13
|
+
|
14
|
+
def [](key)
|
15
|
+
@context[key]
|
16
|
+
end
|
17
|
+
|
18
|
+
def []=(key, value)
|
19
|
+
@context[key] = value
|
20
|
+
end
|
21
|
+
|
22
|
+
def success?
|
23
|
+
@success
|
24
|
+
end
|
25
|
+
|
26
|
+
def failure?
|
27
|
+
!@success
|
28
|
+
end
|
29
|
+
|
30
|
+
def to_h
|
31
|
+
@context.dup
|
32
|
+
end
|
33
|
+
|
34
|
+
def inspect
|
35
|
+
"Result:#{self.class} successful: #{@success}, context: #{@context}"
|
36
|
+
end
|
37
|
+
|
7
38
|
class << self
|
8
39
|
def call(context = {})
|
9
|
-
context = context.is_a?(Context) ? context : Context.new(context)
|
10
40
|
@entry ||= flow.call(self, steps)
|
11
41
|
step = @entry
|
12
|
-
instance = new
|
13
|
-
|
14
|
-
context
|
42
|
+
instance = new(context)
|
43
|
+
success = true
|
44
|
+
step, success = step.call(context, instance) while step
|
45
|
+
instance.success = success
|
46
|
+
instance
|
15
47
|
end
|
16
48
|
|
17
49
|
def flow(name = nil)
|
data/lib/yaso/version.rb
CHANGED
data/lib/yaso.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: yaso
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artem Shevchenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-
|
11
|
+
date: 2022-09-19 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: ffaker
|
@@ -208,9 +208,11 @@ files:
|
|
208
208
|
- benchmark/step/simple_command.rb
|
209
209
|
- benchmark/step/trailblazer.rb
|
210
210
|
- benchmark/step/yaso.rb
|
211
|
+
- docker-compose.yml
|
212
|
+
- docker/Dockerfile
|
213
|
+
- docker/entrypoint.sh
|
211
214
|
- lefthook.yml
|
212
215
|
- lib/yaso.rb
|
213
|
-
- lib/yaso/context.rb
|
214
216
|
- lib/yaso/errors.rb
|
215
217
|
- lib/yaso/invocable.rb
|
216
218
|
- lib/yaso/logic.rb
|
data/lib/yaso/context.rb
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Yaso
|
4
|
-
class Context
|
5
|
-
attr_writer :success
|
6
|
-
attr_reader :data
|
7
|
-
|
8
|
-
def initialize(kwargs)
|
9
|
-
@success = true
|
10
|
-
@data = kwargs
|
11
|
-
end
|
12
|
-
|
13
|
-
def [](key)
|
14
|
-
@data[key]
|
15
|
-
end
|
16
|
-
|
17
|
-
def []=(key, value)
|
18
|
-
@data[key] = value
|
19
|
-
end
|
20
|
-
|
21
|
-
def to_h
|
22
|
-
@data.dup
|
23
|
-
end
|
24
|
-
|
25
|
-
def success?
|
26
|
-
@success
|
27
|
-
end
|
28
|
-
|
29
|
-
def failure?
|
30
|
-
!@success
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|