interactor-initializer 0.2.0 → 1.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
- SHA1:
3
- metadata.gz: 3d2e2c03930bb06fbe39d7288d3c8905158755fd
4
- data.tar.gz: 12836a46c17a2a101adb49abfd096585aa1350f5
2
+ SHA256:
3
+ metadata.gz: 2a7524207f17039e7eda3b4e2ceb0a3f406c70da99c7776be2a3d042dd6dc474
4
+ data.tar.gz: 23377afbee95423b6cab13e9d58137c1319e24bcefb7754b32a225308b28c09f
5
5
  SHA512:
6
- metadata.gz: f4c6eb6c26e8a6028e2624438d41b898c18675e4811bc9824c94d7ceb049a227945aeee09eccd0ff7b2060fd81694fdfb863dd4f4a57e695b6d9c84781a57b5b
7
- data.tar.gz: 0ff55deb63da6274083cf4f76d379c6070348cff2d0663d103adde4007e9506e75f79d3d4ef5fe3f68d2cb085decb62d6534954ce4050bb61106445914ab1a18
6
+ metadata.gz: 9533cbdd913a94086ec11affcb130704ac4f7603468aa5881f2dd1c0c2aa87132dda21e13f2ceedd8fccf993d006cf6fd8af0d89b34331ae691e467b4201b8ba
7
+ data.tar.gz: 26f239fb44ac1a598cfe05eff32a0ba53ff8ac25c4dd1b06398ace36e38613e4d239c0fa800fa02d74158912d835639b51399d0a8b2687deb4b0db1226a860d1
@@ -0,0 +1,53 @@
1
+ name: Build and release ruby gem
2
+
3
+ on:
4
+ pull_request:
5
+ branches: [ master ]
6
+ push:
7
+ workflow_dispatch:
8
+
9
+ jobs:
10
+ build-release-pipeline:
11
+ runs-on: ubuntu-latest
12
+ container: ruby:2.7.2
13
+ steps:
14
+ - uses: actions/checkout@v2
15
+ - name: Setup
16
+ run: |
17
+ gem install bundler
18
+ bundle install
19
+
20
+ - name: Test
21
+ run: bundle exec rspec
22
+
23
+ - name: Build
24
+ id: build
25
+ if: success() && github.ref == 'refs/heads/master'
26
+ run: |
27
+ bundle exec rake build
28
+ echo "::set-output name=gem_version::v$(bundle exec rake version)"
29
+
30
+ - name: Release
31
+ if: success() && github.ref == 'refs/heads/master'
32
+ run: |
33
+ mkdir -p $HOME/.gem
34
+ touch $HOME/.gem/credentials
35
+ chmod 600 $HOME/.gem/credentials
36
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
37
+ gem push pkg/*
38
+ env:
39
+ GEM_HOST_API_KEY: "${{ secrets.RUBYGEMS_AUTH_TOKEN }}"
40
+
41
+ - name: Tag repo with new gem version
42
+ if: success() && github.ref == 'refs/heads/master'
43
+ uses: actions/github-script@v3
44
+ with:
45
+ github-token: ${{ github.token }}
46
+ script: |
47
+ github.git.createRef({
48
+ owner: context.repo.owner,
49
+ repo: context.repo.repo,
50
+ ref: "refs/tags/${{ steps.build.outputs.gem_version }}",
51
+ sha: context.sha
52
+ })
53
+
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ 3.0.2
data/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2016 Vinted
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
data/README.md CHANGED
@@ -2,7 +2,6 @@
2
2
 
3
3
  [![Build Status](https://secure.travis-ci.org/vinted/interactor-initializer.png)](http://travis-ci.org/vinted/interactor-initializer)
4
4
  [![Gem Version](https://badge.fury.io/rb/interactor-initializer.png)](http://badge.fury.io/rb/interactor-initializer)
5
- [![Dependency Status](https://gemnasium.com/vinted/interactor-initializer.png)](https://gemnasium.com/vinted/interactor-initializer)
6
5
 
7
6
  Dry interactor initializer
8
7
 
data/Rakefile CHANGED
@@ -1,3 +1,7 @@
1
1
  require 'bundler/gem_tasks'
2
2
 
3
3
  task default: :spec
4
+
5
+ task :version do |t|
6
+ puts Interactor::Initializer::VERSION
7
+ end
@@ -8,15 +8,16 @@ Gem::Specification.new do |spec|
8
8
  spec.platform = Gem::Platform::RUBY
9
9
  spec.version = Interactor::Initializer::VERSION
10
10
  spec.authors = ['Šarūnas Kūjalis']
11
- spec.email = ['sarjalis@gmail.com']
11
+ spec.email = ['admin@vinted.com']
12
12
  spec.summary = 'Dry interactor initializer'
13
13
  spec.homepage = 'https://github.com/vinted/interactor-initializer'
14
+ spec.license = 'MIT'
14
15
 
15
16
  spec.files = `git ls-files`.split($/)
16
17
  spec.test_files = `git ls-files -- {spec}/*`.split("\n")
17
18
  spec.require_paths = ['lib']
18
19
 
19
- spec.add_development_dependency 'bundler', '~> 1.11'
20
+ spec.add_development_dependency 'bundler'
20
21
  spec.add_development_dependency 'rake', '~> 10.0'
21
22
  spec.add_development_dependency 'rspec', '~> 3.0'
22
23
  end
@@ -0,0 +1,62 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Interactor::Initializer::Helper
4
+ def self.modify_class(target_class, signature, attributes, class_methods)
5
+ assignments = attr_assignments(attributes)
6
+
7
+ target_class.class_eval <<-RUBY, __FILE__, __LINE__ + 1
8
+ def initialize(#{signature})
9
+ #{assignments}
10
+ end
11
+
12
+ #{class_methods}
13
+ RUBY
14
+
15
+ attr_readers(target_class, attributes)
16
+ end
17
+
18
+ def self.attr_readers(target_class, attributes)
19
+ target_class.class_eval do
20
+ attributes.each do |attr|
21
+ attr_reader(attr)
22
+ protected(attr)
23
+ end
24
+ end
25
+ end
26
+
27
+ def self.methods_with_params
28
+ <<-RUBY
29
+ def self.for(*args)
30
+ new(*args).run
31
+ end
32
+
33
+ def self.run(*args)
34
+ new(*args).run
35
+ end
36
+
37
+ def self.with(*args)
38
+ new(*args).run
39
+ end
40
+ RUBY
41
+ end
42
+
43
+ def self.methods_with_keywords
44
+ <<-RUBY
45
+ def self.for(args)
46
+ new(**args).run
47
+ end
48
+
49
+ def self.run(args)
50
+ new(**args).run
51
+ end
52
+
53
+ def self.with(args)
54
+ new(**args).run
55
+ end
56
+ RUBY
57
+ end
58
+
59
+ def self.attr_assignments(attributes)
60
+ attributes.map { |attr| "@#{attr} = #{attr}" }.join(';')
61
+ end
62
+ end
@@ -1,5 +1,5 @@
1
1
  module Interactor
2
2
  module Initializer
3
- VERSION = '0.2.0'.freeze
3
+ VERSION = '1.0'.freeze
4
4
  end
5
5
  end
@@ -1,26 +1,29 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'interactor/initializer/version'
2
- require 'interactor/initializer/attr_readers'
3
- require 'interactor/initializer/call_methods'
4
- require 'interactor/initializer/initialize'
4
+ require 'interactor/initializer/helper'
5
5
 
6
6
  module Interactor
7
7
  module Initializer
8
8
  def self.included(target_class)
9
9
  target_class.extend ClassMethods
10
- Interactor::Initializer::CallMethods.for(target_class)
11
10
  end
12
11
 
13
12
  module ClassMethods
14
13
  module_function
15
14
 
16
15
  def initialize_with(*attributes)
17
- Interactor::Initializer::Initialize.for(self, attributes)
18
- Interactor::Initializer::AttrReaders.for(self, attributes)
16
+ signature = attributes.join(', ')
17
+ class_methods = Interactor::Initializer::Helper.methods_with_params
18
+
19
+ Interactor::Initializer::Helper.modify_class(self, signature, attributes, class_methods)
19
20
  end
20
21
 
21
22
  def initialize_with_keyword_params(*attributes)
22
- Interactor::Initializer::Initialize.for(self, attributes, keyword_params: true)
23
- Interactor::Initializer::AttrReaders.for(self, attributes)
23
+ signature = attributes.map { |attr| "#{attr}:" }.join(', ')
24
+ class_methods = Interactor::Initializer::Helper.methods_with_keywords
25
+
26
+ Interactor::Initializer::Helper.modify_class(self, signature, attributes, class_methods)
24
27
  end
25
28
  end
26
29
  end
@@ -1,8 +1,11 @@
1
- describe Interactor::Initializer::AttrReaders do
2
- describe '.for' do
3
- subject { described_class.for(dummy_class, attributes) }
1
+ # frozen_string_literal: true
2
+
3
+ describe Interactor::Initializer::Helper do
4
+ describe '.attr_readers' do
5
+ subject { described_class.attr_readers(dummy_class, attributes) }
6
+
4
7
  let(:dummy_class) { Class.new }
5
- let(:attributes) { [:test1, :test2] }
8
+ let(:attributes) { %i[test1 test2] }
6
9
 
7
10
  it 'adds protected attr_reader' do
8
11
  subject
@@ -0,0 +1,109 @@
1
+ # frozen_string_literal: true
2
+
3
+ describe Interactor::Initializer do
4
+ let(:interactor) do
5
+ Class.new do
6
+ include Interactor::Initializer
7
+
8
+ initialize_with :arg1, :arg2
9
+
10
+ def run
11
+ :result
12
+ end
13
+ end
14
+ end
15
+ let(:params) { %w[value1 value2] }
16
+
17
+ describe '.for' do
18
+ subject { interactor.for(*params) }
19
+
20
+ it { is_expected.to eq(:result) }
21
+ end
22
+
23
+ describe '.with' do
24
+ subject { interactor.with(*params) }
25
+
26
+ it { is_expected.to eq(:result) }
27
+ end
28
+
29
+ describe '.run' do
30
+ subject { interactor.run(*params) }
31
+
32
+ it { is_expected.to eq(:result) }
33
+ end
34
+
35
+ describe '.new' do
36
+ subject { interactor.new(*params) }
37
+
38
+ it 'adds instance variables' do
39
+ expect(subject.instance_variable_get(:@arg1)).to eq 'value1'
40
+ expect(subject.instance_variable_get(:@arg2)).to eq 'value2'
41
+ end
42
+ end
43
+
44
+ context 'when incorrect number of params' do
45
+ subject { interactor.for(*params) }
46
+
47
+ let(:params) { %w[value1] }
48
+
49
+ it 'raises an error' do
50
+ expect { subject }.to raise_error(/wrong number of arguments/)
51
+ end
52
+ end
53
+
54
+ context 'when initialization with keywords' do
55
+ let(:interactor) do
56
+ Class.new do
57
+ include Interactor::Initializer
58
+
59
+ initialize_with_keyword_params :arg1, :arg2
60
+
61
+ def run
62
+ :result
63
+ end
64
+ end
65
+ end
66
+ let(:params) do
67
+ { arg1: 'value1', arg2: 'value2' }
68
+ end
69
+
70
+ describe '.for' do
71
+ subject { interactor.for(params) }
72
+
73
+ it { is_expected.to eq(:result) }
74
+ end
75
+
76
+ describe '.with' do
77
+ subject { interactor.with(params) }
78
+
79
+ it { is_expected.to eq(:result) }
80
+ end
81
+
82
+ describe '.run' do
83
+ subject { interactor.run(params) }
84
+
85
+ it { is_expected.to eq(:result) }
86
+ end
87
+
88
+ describe '.new' do
89
+ subject { interactor.new(**params) }
90
+
91
+ it 'adds instance variables' do
92
+ expect(subject.instance_variable_get(:@arg1)).to eq 'value1'
93
+ expect(subject.instance_variable_get(:@arg2)).to eq 'value2'
94
+ end
95
+ end
96
+
97
+ context 'when incorrect keywords' do
98
+ subject { interactor.for(params) }
99
+
100
+ let(:params) do
101
+ { arg1: 'value2', arg4: 'value2' }
102
+ end
103
+
104
+ it 'raises an error' do
105
+ expect { subject }.to raise_error(/missing keyword: :arg2/)
106
+ end
107
+ end
108
+ end
109
+ end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: interactor-initializer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: '1.0'
5
5
  platform: ruby
6
6
  authors:
7
- - "Šarūnas Kūjalis"
7
+ - Šarūnas Kūjalis
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-06-14 00:00:00.000000000 Z
11
+ date: 2022-01-21 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '1.11'
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '1.11'
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -54,30 +54,30 @@ dependencies:
54
54
  version: '3.0'
55
55
  description:
56
56
  email:
57
- - sarjalis@gmail.com
57
+ - admin@vinted.com
58
58
  executables: []
59
59
  extensions: []
60
60
  extra_rdoc_files: []
61
61
  files:
62
+ - ".github/workflows/build_release_pipeline.yaml"
62
63
  - ".gitignore"
63
64
  - ".rspec"
64
65
  - ".rubocop.yml"
65
- - ".travis.yml"
66
+ - ".ruby-version"
66
67
  - Gemfile
68
+ - LICENSE
67
69
  - README.md
68
70
  - Rakefile
69
71
  - interactor-initializer.gemspec
70
72
  - lib/interactor/initializer.rb
71
- - lib/interactor/initializer/attr_readers.rb
72
- - lib/interactor/initializer/call_methods.rb
73
- - lib/interactor/initializer/initialize.rb
73
+ - lib/interactor/initializer/helper.rb
74
74
  - lib/interactor/initializer/version.rb
75
- - spec/initializer/attr_readers_spec.rb
76
- - spec/initializer/call_methods_spec.rb
77
- - spec/initializer/initialize_spec.rb
75
+ - spec/interactor/initializer/helper_spec.rb
76
+ - spec/interactor/initializer_spec.rb
78
77
  - spec/spec_helper.rb
79
78
  homepage: https://github.com/vinted/interactor-initializer
80
- licenses: []
79
+ licenses:
80
+ - MIT
81
81
  metadata: {}
82
82
  post_install_message:
83
83
  rdoc_options: []
@@ -94,8 +94,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
94
94
  - !ruby/object:Gem::Version
95
95
  version: '0'
96
96
  requirements: []
97
- rubyforge_project:
98
- rubygems_version: 2.4.5
97
+ rubygems_version: 3.1.4
99
98
  signing_key:
100
99
  specification_version: 4
101
100
  summary: Dry interactor initializer
data/.travis.yml DELETED
@@ -1,4 +0,0 @@
1
- language: ruby
2
- rvm:
3
- - 2.1.1
4
- script: 'bundle exec rspec'
@@ -1,10 +0,0 @@
1
- class Interactor::Initializer::AttrReaders
2
- def self.for(target_class, attributes)
3
- target_class.class_eval do
4
- attributes.each do |attribute|
5
- attr_reader(attribute)
6
- protected(attribute)
7
- end
8
- end
9
- end
10
- end
@@ -1,9 +0,0 @@
1
- class Interactor::Initializer::CallMethods
2
- METHOD_NAMES = %i(for with run).freeze
3
-
4
- def self.for(target_class)
5
- METHOD_NAMES.each do |method_name|
6
- target_class.define_singleton_method(method_name) { |*args| new(*args).run }
7
- end
8
- end
9
- end
@@ -1,35 +0,0 @@
1
- class Interactor::Initializer::Initialize
2
- def self.for(*args)
3
- new(*args).run
4
- end
5
-
6
- attr_reader :target_class, :attributes, :keyword_params
7
-
8
- def initialize(target_class, attributes, keyword_params: false)
9
- @target_class = target_class
10
- @attributes = attributes
11
- @keyword_params = keyword_params
12
- end
13
-
14
- def run
15
- target_class.class_eval <<-RUBY
16
- def initialize(#{initializer_signature(attributes)})
17
- #{attr_assignments(attributes)}
18
- end
19
- RUBY
20
- end
21
-
22
- private
23
-
24
- def initializer_signature(attributes)
25
- return attributes.join(', ') unless keyword_params
26
-
27
- attributes.map { |attribute| "#{attribute}:" }.join(', ')
28
- end
29
-
30
- def attr_assignments(attributes)
31
- attributes.inject('') do |assignments, attribute|
32
- "#{assignments}@#{attribute} = #{attribute};"
33
- end
34
- end
35
- end
@@ -1,13 +0,0 @@
1
- describe Interactor::Initializer::CallMethods do
2
- describe '.for' do
3
- subject { described_class.for(dummy_class) }
4
- let(:dummy_class) { Class.new }
5
-
6
- it 'adds .for .with and .run class methods' do
7
- subject
8
- expect(dummy_class).to respond_to :for
9
- expect(dummy_class).to respond_to :with
10
- expect(dummy_class).to respond_to :run
11
- end
12
- end
13
- end
@@ -1,28 +0,0 @@
1
- describe Interactor::Initializer::Initialize do
2
- describe '.for' do
3
- subject { described_class.for(dummy_class, attributes, keyword_params: keyword_params) }
4
- let(:dummy_class) { Class.new }
5
- let(:attributes) { [:test1, :test2] }
6
- let(:keyword_params) { false }
7
-
8
- shared_examples 'object initializer' do
9
- it 'adds object initializer' do
10
- subject
11
- expect(dummy_instance.instance_variable_get(:@test1)).to eq 1
12
- expect(dummy_instance.instance_variable_get(:@test2)).to eq 2
13
- end
14
- end
15
-
16
- it_behaves_like 'object initializer' do
17
- let(:dummy_instance) { dummy_class.new(1, 2) }
18
- end
19
-
20
- context 'when keyword params' do
21
- let(:keyword_params) { true }
22
-
23
- it_behaves_like 'object initializer' do
24
- let(:dummy_instance) { dummy_class.new(test1: 1, test2: 2) }
25
- end
26
- end
27
- end
28
- end