activeinteractor 0.1.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.
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveInteractor
4
+ # The Base Interactor class inherited by all Interactor::Organizers
5
+ #
6
+ # @author Aaron Allen <hello@aaronmallen.me>
7
+ # @since 0.0.1
8
+ # @version 0.1
9
+ class Organizer < ActiveInteractor::Base
10
+ class << self
11
+ # Declare Interactors to be invoked as part of the
12
+ # organizer's invocation. These interactors are invoked in
13
+ # the order in which they are declared.
14
+ #
15
+ # @example
16
+ # class MyFirstOrganizer < ActiveInteractor::Organizer
17
+ # organize InteractorOne, InteractorTwo
18
+ # end
19
+ #
20
+ # class MySecondOrganizer < ActiveInteractor::Organizer
21
+ # organize [InteractorThree, InteractorFour]
22
+ # end
23
+ #
24
+ # @param interactors [Array<ActiveInteractor::Base>] the interactors to call
25
+ def organize(*interactors)
26
+ @organized = interactors.flatten
27
+ end
28
+
29
+ # An Array of declared Interactors to be invoked.
30
+ # @private
31
+ def organized
32
+ @organized ||= []
33
+ end
34
+ end
35
+
36
+ # Invoke the organized interactors. An organizer is
37
+ # expected not to define its own {ActiveInteractor::Interactor#perform #perform} method
38
+ # in favor of this default implementation.
39
+ def perform
40
+ self.class.organized.each do |interactor|
41
+ self.context = context.merge(
42
+ interactor.new(context).tap(&:skip_clean_context!).execute_perform!
43
+ )
44
+ end
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module ActiveInteractor
4
+ # The ActiveInteractor gem version
5
+ # @return [String] the gem version
6
+ VERSION = '0.1.0'
7
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails/generators/base'
4
+ require 'rails/generators/named_base'
5
+
6
+ require 'active_interactor'
7
+
8
+ module ActiveInteractor
9
+ module Generators
10
+ module Generator
11
+ extend ActiveSupport::Concern
12
+
13
+ class_methods do
14
+ def self.base_root
15
+ __dir__
16
+ end
17
+
18
+ def source_root
19
+ File.expand_path('templates', __dir__)
20
+ end
21
+ end
22
+ end
23
+
24
+ class Base < ::Rails::Generators::Base
25
+ include Generator
26
+ end
27
+
28
+ class NamedBase < ::Rails::Generators::NamedBase
29
+ include Generator
30
+ end
31
+ end
32
+ end
33
+
34
+ Dir[File.expand_path('active_interactor/*.rb', __dir__)].each { |file| require file }
35
+ Dir[File.expand_path('interactor/*.rb', __dir__)].each { |file| require file }
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../active_interactor'
4
+
5
+ module ActiveInteractor
6
+ module Generators
7
+ class InstallGenerator < Base
8
+ def create_initializer
9
+ template 'initializer.rb', File.join('config', 'initializers', 'active_interactor.rb')
10
+ end
11
+
12
+ def create_application_interactor
13
+ template 'application_interactor.erb', File.join('app', 'interactors', 'application_interactor.rb')
14
+ end
15
+
16
+ def create_interactor_concerns
17
+ create_file 'app/interactors/concerns/.keep'
18
+ end
19
+
20
+ def autoload_interactors
21
+ application do
22
+ <<~CONFIG
23
+ # autoload interactors
24
+ config.autoload_paths += %w[app/interactors]
25
+
26
+ CONFIG
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../active_interactor'
4
+
5
+ class InteractorGenerator < ActiveInteractor::Generators::NamedBase
6
+ desc 'Generate an interactor'
7
+
8
+ def create_interactor
9
+ template 'interactor.erb', File.join('app', 'interactors', class_path, "#{file_name}.rb")
10
+ end
11
+
12
+ hook_for :test_framework, in: :interactor
13
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../active_interactor'
4
+
5
+ module Interactor
6
+ module Generators
7
+ class OrganizerGenerator < ActiveInteractor::Generators::NamedBase
8
+ desc 'Generate an interactor organizer'
9
+ argument :interactors, type: :array, default: [], banner: 'name name'
10
+
11
+ def create_organizer
12
+ template 'organizer.erb', File.join('app', 'interactors', class_path, "#{file_name}.rb")
13
+ end
14
+
15
+ hook_for :test_framework, in: :interactor
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../active_interactor'
4
+
5
+ module Interactor
6
+ module Generators
7
+ class RspecGenerator < ActiveInteractor::Generators::NamedBase
8
+ desc 'Generate an interactor spec'
9
+
10
+ def create_spec
11
+ template 'rspec.erb', File.join('spec', 'interactors', class_path, "#{file_name}_spec.rb")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../active_interactor'
4
+
5
+ module Interactor
6
+ module Generators
7
+ class TestUnitGenerator < ActiveInteractor::Generators::NamedBase
8
+ desc 'Generate an interactor unit test'
9
+
10
+ def create_test
11
+ template 'test_unit.erb', File.join('test', 'interactors', class_path, "#{file_name}_test.rb")
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ # frozen_string_literal: true
2
+
3
+ class ApplicationInteractor < ActiveInteractor::Base
4
+ end
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'active_interactor'
4
+
5
+ ActiveInteractor.configure do |config|
6
+ # Set the ActiveInteractor.logger to Rails.logger
7
+ config.logger = Rails.logger
8
+ end
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_name %> < ApplicationInteractor
4
+
5
+ def perform
6
+ # TODO implement <%= class_name %> call
7
+ end
8
+
9
+ def rollback
10
+ # TODO implement <%= class_name %> rollback
11
+ end
12
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ class <%= class_name %> < ActiveInteractor::Organizer
4
+
5
+ <%- if interactors.any? -%>
6
+ organize <%= interactors.map(&:classify).join(", ") %>
7
+ <%- else -%>
8
+ # organize Interactor1, Interactor2
9
+ <%- end -%>
10
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'rails_helper'
4
+
5
+ RSpec.describe <%= class_name %>, type: :interactor do
6
+ pending "add some examples to (or delete) #{__FILE__}"
7
+ end
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'test_helper'
4
+
5
+ class <%= class_name %>Test < ActiveSupport::TestCase
6
+ # test "the truth" do
7
+ # assert true
8
+ # end
9
+ end
metadata ADDED
@@ -0,0 +1,269 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: activeinteractor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Aaron Allen
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2019-03-30 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activemodel
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ - - "<"
21
+ - !ruby/object:Gem::Version
22
+ version: '6.1'
23
+ type: :runtime
24
+ prerelease: false
25
+ version_requirements: !ruby/object:Gem::Requirement
26
+ requirements:
27
+ - - ">="
28
+ - !ruby/object:Gem::Version
29
+ version: '4.2'
30
+ - - "<"
31
+ - !ruby/object:Gem::Version
32
+ version: '6.1'
33
+ - !ruby/object:Gem::Dependency
34
+ name: activesupport
35
+ requirement: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - ">="
38
+ - !ruby/object:Gem::Version
39
+ version: '4.2'
40
+ - - "<"
41
+ - !ruby/object:Gem::Version
42
+ version: '6.1'
43
+ type: :runtime
44
+ prerelease: false
45
+ version_requirements: !ruby/object:Gem::Requirement
46
+ requirements:
47
+ - - ">="
48
+ - !ruby/object:Gem::Version
49
+ version: '4.2'
50
+ - - "<"
51
+ - !ruby/object:Gem::Version
52
+ version: '6.1'
53
+ - !ruby/object:Gem::Dependency
54
+ name: bundler
55
+ requirement: !ruby/object:Gem::Requirement
56
+ requirements:
57
+ - - "~>"
58
+ - !ruby/object:Gem::Version
59
+ version: '1.17'
60
+ type: :development
61
+ prerelease: false
62
+ version_requirements: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - "~>"
65
+ - !ruby/object:Gem::Version
66
+ version: '1.17'
67
+ - !ruby/object:Gem::Dependency
68
+ name: github-markup
69
+ requirement: !ruby/object:Gem::Requirement
70
+ requirements:
71
+ - - "~>"
72
+ - !ruby/object:Gem::Version
73
+ version: '3.0'
74
+ type: :development
75
+ prerelease: false
76
+ version_requirements: !ruby/object:Gem::Requirement
77
+ requirements:
78
+ - - "~>"
79
+ - !ruby/object:Gem::Version
80
+ version: '3.0'
81
+ - !ruby/object:Gem::Dependency
82
+ name: mdl
83
+ requirement: !ruby/object:Gem::Requirement
84
+ requirements:
85
+ - - "~>"
86
+ - !ruby/object:Gem::Version
87
+ version: '0.5'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '0.5'
95
+ - !ruby/object:Gem::Dependency
96
+ name: rake
97
+ requirement: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - "~>"
100
+ - !ruby/object:Gem::Version
101
+ version: '10.0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - "~>"
107
+ - !ruby/object:Gem::Version
108
+ version: '10.0'
109
+ - !ruby/object:Gem::Dependency
110
+ name: redcarpet
111
+ requirement: !ruby/object:Gem::Requirement
112
+ requirements:
113
+ - - "~>"
114
+ - !ruby/object:Gem::Version
115
+ version: '3.4'
116
+ type: :development
117
+ prerelease: false
118
+ version_requirements: !ruby/object:Gem::Requirement
119
+ requirements:
120
+ - - "~>"
121
+ - !ruby/object:Gem::Version
122
+ version: '3.4'
123
+ - !ruby/object:Gem::Dependency
124
+ name: rspec
125
+ requirement: !ruby/object:Gem::Requirement
126
+ requirements:
127
+ - - "~>"
128
+ - !ruby/object:Gem::Version
129
+ version: '3.0'
130
+ type: :development
131
+ prerelease: false
132
+ version_requirements: !ruby/object:Gem::Requirement
133
+ requirements:
134
+ - - "~>"
135
+ - !ruby/object:Gem::Version
136
+ version: '3.0'
137
+ - !ruby/object:Gem::Dependency
138
+ name: rspec-collection_matchers
139
+ requirement: !ruby/object:Gem::Requirement
140
+ requirements:
141
+ - - "~>"
142
+ - !ruby/object:Gem::Version
143
+ version: '1.1'
144
+ type: :development
145
+ prerelease: false
146
+ version_requirements: !ruby/object:Gem::Requirement
147
+ requirements:
148
+ - - "~>"
149
+ - !ruby/object:Gem::Version
150
+ version: '1.1'
151
+ - !ruby/object:Gem::Dependency
152
+ name: rubocop
153
+ requirement: !ruby/object:Gem::Requirement
154
+ requirements:
155
+ - - "~>"
156
+ - !ruby/object:Gem::Version
157
+ version: '0.66'
158
+ type: :development
159
+ prerelease: false
160
+ version_requirements: !ruby/object:Gem::Requirement
161
+ requirements:
162
+ - - "~>"
163
+ - !ruby/object:Gem::Version
164
+ version: '0.66'
165
+ - !ruby/object:Gem::Dependency
166
+ name: simplecov
167
+ requirement: !ruby/object:Gem::Requirement
168
+ requirements:
169
+ - - "~>"
170
+ - !ruby/object:Gem::Version
171
+ version: '0.16'
172
+ type: :development
173
+ prerelease: false
174
+ version_requirements: !ruby/object:Gem::Requirement
175
+ requirements:
176
+ - - "~>"
177
+ - !ruby/object:Gem::Version
178
+ version: '0.16'
179
+ - !ruby/object:Gem::Dependency
180
+ name: yard
181
+ requirement: !ruby/object:Gem::Requirement
182
+ requirements:
183
+ - - "~>"
184
+ - !ruby/object:Gem::Version
185
+ version: '0.9'
186
+ type: :development
187
+ prerelease: false
188
+ version_requirements: !ruby/object:Gem::Requirement
189
+ requirements:
190
+ - - "~>"
191
+ - !ruby/object:Gem::Version
192
+ version: '0.9'
193
+ - !ruby/object:Gem::Dependency
194
+ name: yard-activesupport-concern
195
+ requirement: !ruby/object:Gem::Requirement
196
+ requirements:
197
+ - - '='
198
+ - !ruby/object:Gem::Version
199
+ version: 0.0.1
200
+ type: :development
201
+ prerelease: false
202
+ version_requirements: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - '='
205
+ - !ruby/object:Gem::Version
206
+ version: 0.0.1
207
+ description: |
208
+ Ruby interactors with ActiveModel::Validations based on the interactors gem.
209
+ Rich support for attributes, callbacks, and validations, and thread safe performance methods.
210
+ email:
211
+ - hello@aaronmallen.me
212
+ executables: []
213
+ extensions: []
214
+ extra_rdoc_files: []
215
+ files:
216
+ - CHANGELOG.md
217
+ - LICENSE
218
+ - README.md
219
+ - lib/active_interactor.rb
220
+ - lib/active_interactor/base.rb
221
+ - lib/active_interactor/configuration.rb
222
+ - lib/active_interactor/context.rb
223
+ - lib/active_interactor/interactor.rb
224
+ - lib/active_interactor/interactor/callbacks.rb
225
+ - lib/active_interactor/interactor/context.rb
226
+ - lib/active_interactor/interactor/execution.rb
227
+ - lib/active_interactor/interactor/worker.rb
228
+ - lib/active_interactor/organizer.rb
229
+ - lib/active_interactor/version.rb
230
+ - lib/rails/generators/active_interactor.rb
231
+ - lib/rails/generators/active_interactor/install_generator.rb
232
+ - lib/rails/generators/interactor/interactor_generator.rb
233
+ - lib/rails/generators/interactor/organizer_generator.rb
234
+ - lib/rails/generators/interactor/rspec_generator.rb
235
+ - lib/rails/generators/interactor/test_unit_generator.rb
236
+ - lib/rails/generators/templates/application_interactor.erb
237
+ - lib/rails/generators/templates/initializer.rb
238
+ - lib/rails/generators/templates/interactor.erb
239
+ - lib/rails/generators/templates/organizer.erb
240
+ - lib/rails/generators/templates/rspec.erb
241
+ - lib/rails/generators/templates/test_unit.erb
242
+ homepage: https://github.com/aaronmallen/activeinteractor
243
+ licenses:
244
+ - MIT
245
+ metadata:
246
+ bug_tracker_uri: https://github.com/aaronmallen/activeinteractor/issues
247
+ hompage_uri: https://github.com/aaronmallen/activeinteractor
248
+ source_code_uri: https://github.com/aaronmallen/activeinteractor/tree/v0.1.0
249
+ changelog_uri: https://github.com/aaronmallen/activeinteractor/blob/v0.1.0/CHANGELOG.md
250
+ post_install_message:
251
+ rdoc_options: []
252
+ require_paths:
253
+ - lib
254
+ required_ruby_version: !ruby/object:Gem::Requirement
255
+ requirements:
256
+ - - ">="
257
+ - !ruby/object:Gem::Version
258
+ version: 2.5.0
259
+ required_rubygems_version: !ruby/object:Gem::Requirement
260
+ requirements:
261
+ - - ">="
262
+ - !ruby/object:Gem::Version
263
+ version: '0'
264
+ requirements: []
265
+ rubygems_version: 3.0.3
266
+ signing_key:
267
+ specification_version: 4
268
+ summary: Ruby interactors with ActiveModel::Validations
269
+ test_files: []