yaso 1.2.0 → 1.3.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 293839b577b5832d54938e07a07729d49ddd74fd226f0077076fe6f4986340ae
4
- data.tar.gz: 72d9d2bde9edbc0050f1473e3efc33a9c81952fe78906eaeb35acbba2ccc80bf
3
+ metadata.gz: 1d9de791b4d45e8ea1cd2ffb6d75738f9d5eef8376261437b923d0795f81a5a2
4
+ data.tar.gz: 1d6234c4203c8cd9acdec73b5267ff16a45563caf67fd757f8fbed7fb2228d79
5
5
  SHA512:
6
- metadata.gz: a54b6acc15d5d8e71b25a4273ce87816ae58a1e63bd815e4cf338d671b5b71b3378016c076d9db44122e7612619e69e06c60e63cf7afd388b0de7509ad42ac0f
7
- data.tar.gz: 55a031ce994ac21ed04e659d70b2871cae67ed64d088799e26663b1d5e2ac5f76593d0ea4d0e3e181ff72b63fed7aa626abf67b063eed696be4418e74930e9e8
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.2.0)
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.0)
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.0)
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.0)
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.2.0)
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
  [![Ruby](https://github.com/Ar2emis/yaso/actions/workflows/main.yml/badge.svg?branch=master)](https://github.com/Ar2emis/yaso/actions/workflows/main.yml) ![gem](https://img.shields.io/gem/v/yaso) [![GitHub license](https://img.shields.io/github/license/Ar2emis/yaso)](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 new branch from the master, do your dark business, open a pull request and assign me as a reviewer.
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,7 @@
1
+ ARG VERSION=latest
2
+
3
+ FROM ruby:${VERSION}
4
+
5
+ ENTRYPOINT [ "/yaso/docker/entrypoint.sh" ]
6
+
7
+ WORKDIR /yaso/benchmark
@@ -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
@@ -0,0 +1,15 @@
1
+ services:
2
+ benchmark:
3
+ build: docker
4
+ volumes:
5
+ - .:/yaso
6
+ - bundle:/bundle/cache
7
+ deploy:
8
+ resources:
9
+ limits:
10
+ cpus: '1.5'
11
+ reservations:
12
+ cpus: '1.5'
13
+
14
+ volumes:
15
+ bundle:
@@ -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, _| object.call(context.clone).success? }
14
- when CALLABLE then proc { |context, _, &block| object.call(context, **options, &block) }
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 method_invocable(object)
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, &block| # proc { |context, instance, &block|
31
- instance.#{object}(context, **context.data, &block) # instance.<method_name>(context, **context.data, &block)
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
@@ -4,8 +4,7 @@ module Yaso
4
4
  module Logic
5
5
  class Failure < Base
6
6
  def call(context, instance)
7
- context.success = false
8
- @invocable.call(context, instance) ? @next_step : @failure
7
+ [@invocable.call(context, instance) ? @next_step : @failure, false]
9
8
  end
10
9
  end
11
10
  end
@@ -4,8 +4,7 @@ module Yaso
4
4
  module Logic
5
5
  class Pass < Base
6
6
  def call(context, instance)
7
- context.success = true
8
- @invocable.call(context, instance) ? @next_step : @failure
7
+ [@invocable.call(context, instance) ? @next_step : @failure, true]
9
8
  end
10
9
  end
11
10
  end
@@ -4,13 +4,7 @@ module Yaso
4
4
  module Logic
5
5
  class Step < Base
6
6
  def call(context, instance)
7
- context.success = true
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
- step = step.call(context, instance) while step
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
@@ -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
@@ -9,13 +9,8 @@ module Yaso
9
9
  end
10
10
 
11
11
  def call(context, instance)
12
- context.success = true
13
- if @invocable.call(context, instance) { @wrapper.call(context, instance).success? }
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
- step = step.call(context, instance) while step
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Yaso
4
- VERSION = '1.2.0'
4
+ VERSION = '1.3.0'
5
5
  end
data/lib/yaso.rb CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  require_relative 'yaso/version'
4
4
  require_relative 'yaso/errors'
5
- require_relative 'yaso/context'
6
5
  require_relative 'yaso/invocable'
7
6
  require_relative 'yaso/stepable'
8
7
  require_relative 'yaso/logic'
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.2.0
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-08-27 00:00:00.000000000 Z
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