simple-interactors 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: f7ff7d77b7cbbd6cf739e8ee2e00563500748a216908263cbe74eb4ab8032b41
4
+ data.tar.gz: 81488ca044bd1a3061a8936949ffb9ebb2b3c203fe3bb7b51fff01a8ddf10383
5
+ SHA512:
6
+ metadata.gz: 923eb61eca94d6dd0c0761f25446d820d786cec8c49190973de9cfecde23ff158ec7d751f523700ec2c7ff08d84b6cadf31608614a5d56e75ff4948eed978c05
7
+ data.tar.gz: 5efd10c8b01e2b8fcb137aea8402bbb0557edda3d652f91720956349eed9098789c38418142656522d673b3cf6a87a207a8ce9fc606228a653f4f2ff2f3fd80c
data/README.md ADDED
@@ -0,0 +1,53 @@
1
+ # SimpleInteractors
2
+
3
+ The Hanami::Utils (https://github.com/hanami/utils) used to include an implementation of the interactor pattern. But it no longer does, see https://github.com/hanami/utils/issues/401
4
+
5
+ This gem includes the original Hanami Interactor and it is a drop by replacement. You should be able to just include this gem and continue to use Hanami::Interactor as you used to.
6
+
7
+ My future goal is to create an alternative implementation of Interactor that is independent of Hanami.
8
+
9
+ ## Installation
10
+
11
+ Add this line to your application's Gemfile:
12
+
13
+ ```ruby
14
+ gem 'simple-interactors'
15
+ ```
16
+
17
+ ## Usage
18
+
19
+ ```ruby
20
+ require 'hanami/interactor'
21
+
22
+ class YourClass
23
+ include Hanami::Interactor
24
+
25
+ def initialize(person:, current_user:)
26
+ @person = person
27
+ @current_user = current_user
28
+ end
29
+
30
+ def call
31
+ # do your business logic here.
32
+ end
33
+ end
34
+ ```
35
+
36
+ ```ruby
37
+ class PeopleController < ApplicationController
38
+
39
+ def create
40
+ result = YourClass.new(person: person_params, current_user: current_user).call
41
+
42
+ if result.success?
43
+ redirect_to :index
44
+ else
45
+ render :new
46
+ end
47
+ end
48
+ end
49
+ ```
50
+
51
+ ## Copyright
52
+
53
+ Copyright © 2022 Gonzalo Rodríguez-Baltanás Díaz – Released under MIT License
@@ -0,0 +1,617 @@
1
+ require "hanami/utils/basic_object"
2
+ require "hanami/utils/class_attribute"
3
+ require "hanami/utils/hash"
4
+
5
+ module Hanami
6
+ # Hanami Interactor
7
+ #
8
+ # @since 0.3.5
9
+ module Interactor
10
+ # Result of an operation
11
+ #
12
+ # @since 0.3.5
13
+ class Result < Utils::BasicObject
14
+ # Concrete methods
15
+ #
16
+ # @since 0.3.5
17
+ # @api private
18
+ #
19
+ # @see Hanami::Interactor::Result#respond_to_missing?
20
+ METHODS = ::Hash[initialize: true,
21
+ success?: true,
22
+ successful?: true,
23
+ failure?: true,
24
+ fail!: true,
25
+ prepare!: true,
26
+ errors: true,
27
+ error: true].freeze
28
+
29
+ # Initialize a new result
30
+ #
31
+ # @param payload [Hash] a payload to carry on
32
+ #
33
+ # @return [Hanami::Interactor::Result]
34
+ #
35
+ # @since 0.3.5
36
+ # @api private
37
+ def initialize(payload = {})
38
+ @payload = payload
39
+ @errors = []
40
+ @success = true
41
+ end
42
+
43
+ # Checks if the current status is successful
44
+ #
45
+ # @return [TrueClass,FalseClass] the result of the check
46
+ #
47
+ # @since 0.8.1
48
+ def successful?
49
+ @success && errors.empty?
50
+ end
51
+
52
+ # @since 0.3.5
53
+ alias_method :success?, :successful?
54
+
55
+ # Checks if the current status is not successful
56
+ #
57
+ # @return [TrueClass,FalseClass] the result of the check
58
+ #
59
+ # @since 0.9.2
60
+ def failure?
61
+ !successful?
62
+ end
63
+
64
+ # Forces the status to be a failure
65
+ #
66
+ # @since 0.3.5
67
+ def fail!
68
+ @success = false
69
+ end
70
+
71
+ # Returns all the errors collected during an operation
72
+ #
73
+ # @return [Array] the errors
74
+ #
75
+ # @since 0.3.5
76
+ #
77
+ # @see Hanami::Interactor::Result#error
78
+ # @see Hanami::Interactor#call
79
+ # @see Hanami::Interactor#error
80
+ # @see Hanami::Interactor#error!
81
+ def errors
82
+ @errors.dup
83
+ end
84
+
85
+ # @since 0.5.0
86
+ # @api private
87
+ def add_error(*errors)
88
+ @errors << errors
89
+ @errors.flatten!
90
+ nil
91
+ end
92
+
93
+ # Returns the first errors collected during an operation
94
+ #
95
+ # @return [nil,String] the error, if present
96
+ #
97
+ # @since 0.3.5
98
+ #
99
+ # @see Hanami::Interactor::Result#errors
100
+ # @see Hanami::Interactor#call
101
+ # @see Hanami::Interactor#error
102
+ # @see Hanami::Interactor#error!
103
+ def error
104
+ errors.first
105
+ end
106
+
107
+ # Prepares the result before to be returned
108
+ #
109
+ # @param payload [Hash] an updated payload
110
+ #
111
+ # @since 0.3.5
112
+ # @api private
113
+ def prepare!(payload)
114
+ @payload.merge!(payload)
115
+ self
116
+ end
117
+
118
+ protected
119
+
120
+ # @since 0.3.5
121
+ # @api private
122
+ def method_missing(method_name, *)
123
+ @payload.fetch(method_name) { super }
124
+ end
125
+
126
+ # @since 0.3.5
127
+ # @api private
128
+ def respond_to_missing?(method_name, _include_all)
129
+ method_name = method_name.to_sym
130
+ METHODS[method_name] || @payload.key?(method_name)
131
+ end
132
+
133
+ # @since 0.3.5
134
+ # @api private
135
+ def __inspect
136
+ " @success=#{@success} @payload=#{@payload.inspect}"
137
+ end
138
+ end
139
+
140
+ # Override for <tt>Module#included</tt>.
141
+ #
142
+ # @since 0.3.5
143
+ # @api private
144
+ def self.included(base)
145
+ super
146
+
147
+ base.class_eval do
148
+ extend ClassMethods
149
+ end
150
+ end
151
+
152
+ # Interactor legacy interface
153
+ #
154
+ # @since 0.3.5
155
+ module LegacyInterface
156
+ # Initialize an interactor
157
+ #
158
+ # It accepts arbitrary number of arguments.
159
+ # Developers can override it.
160
+ #
161
+ # @param args [Array<Object>] arbitrary number of arguments
162
+ #
163
+ # @return [Hanami::Interactor] the interactor
164
+ #
165
+ # @since 0.3.5
166
+ #
167
+ # @example Override #initialize
168
+ # require 'hanami/interactor'
169
+ #
170
+ # class UpdateProfile
171
+ # include Hanami::Interactor
172
+ #
173
+ # def initialize(user, params)
174
+ # @user = user
175
+ # @params = params
176
+ # end
177
+ #
178
+ # def call
179
+ # # ...
180
+ # end
181
+ # end
182
+ def initialize(*args, **kwargs)
183
+ super
184
+ ensure
185
+ @__result = ::Hanami::Interactor::Result.new
186
+ end
187
+
188
+ # Triggers the operation and return a result.
189
+ #
190
+ # All the instance variables will be available in the result.
191
+ #
192
+ # ATTENTION: This must be implemented by the including class.
193
+ #
194
+ # @return [Hanami::Interactor::Result] the result of the operation
195
+ #
196
+ # @raise [NoMethodError] if this isn't implemented by the including class.
197
+ #
198
+ # @example Expose instance variables in result payload
199
+ # require 'hanami/interactor'
200
+ #
201
+ # class Signup
202
+ # include Hanami::Interactor
203
+ # expose :user, :params
204
+ #
205
+ # def initialize(params)
206
+ # @params = params
207
+ # @foo = 'bar'
208
+ # end
209
+ #
210
+ # def call
211
+ # @user = UserRepository.new.create(@params)
212
+ # end
213
+ # end
214
+ #
215
+ # result = Signup.new(name: 'Luca').call
216
+ # result.failure? # => false
217
+ # result.successful? # => true
218
+ #
219
+ # result.user # => #<User:0x007fa311105778 @id=1 @name="Luca">
220
+ # result.params # => { :name=>"Luca" }
221
+ # result.foo # => raises NoMethodError
222
+ #
223
+ # @example Failed precondition
224
+ # require 'hanami/interactor'
225
+ #
226
+ # class Signup
227
+ # include Hanami::Interactor
228
+ # expose :user
229
+ #
230
+ # def initialize(params)
231
+ # @params = params
232
+ # end
233
+ #
234
+ # # THIS WON'T BE INVOKED BECAUSE #valid? WILL RETURN false
235
+ # def call
236
+ # @user = UserRepository.new.create(@params)
237
+ # end
238
+ #
239
+ # private
240
+ # def valid?
241
+ # @params.valid?
242
+ # end
243
+ # end
244
+ #
245
+ # result = Signup.new(name: nil).call
246
+ # result.successful? # => false
247
+ # result.failure? # => true
248
+ #
249
+ # result.user # => #<User:0x007fa311105778 @id=nil @name="Luca">
250
+ #
251
+ # @example Bad usage
252
+ # require 'hanami/interactor'
253
+ #
254
+ # class Signup
255
+ # include Hanami::Interactor
256
+ #
257
+ # # Method #call is not defined
258
+ # end
259
+ #
260
+ # Signup.new.call # => NoMethodError
261
+ def call
262
+ _call { super }
263
+ end
264
+
265
+ private
266
+
267
+ # @since 0.3.5
268
+ # @api private
269
+ def _call
270
+ catch :fail do
271
+ validate!
272
+ yield
273
+ end
274
+
275
+ _prepare!
276
+ end
277
+
278
+ # @since 0.3.5
279
+ def validate!
280
+ fail! unless valid?
281
+ end
282
+ end
283
+
284
+ # Interactor interface
285
+ # @since 1.1.0
286
+ module Interface
287
+ # Triggers the operation and return a result.
288
+ #
289
+ # All the exposed instance variables will be available in the result.
290
+ #
291
+ # ATTENTION: This must be implemented by the including class.
292
+ #
293
+ # @return [Hanami::Interactor::Result] the result of the operation
294
+ #
295
+ # @raise [NoMethodError] if this isn't implemented by the including class.
296
+ #
297
+ # @example Expose instance variables in result payload
298
+ # require 'hanami/interactor'
299
+ #
300
+ # class Signup
301
+ # include Hanami::Interactor
302
+ # expose :user, :params
303
+ #
304
+ # def call(params)
305
+ # @params = params
306
+ # @foo = 'bar'
307
+ # @user = UserRepository.new.persist(User.new(params))
308
+ # end
309
+ # end
310
+ #
311
+ # result = Signup.new(name: 'Luca').call
312
+ # result.failure? # => false
313
+ # result.successful? # => true
314
+ #
315
+ # result.user # => #<User:0x007fa311105778 @id=1 @name="Luca">
316
+ # result.params # => { :name=>"Luca" }
317
+ # result.foo # => raises NoMethodError
318
+ #
319
+ # @example Failed precondition
320
+ # require 'hanami/interactor'
321
+ #
322
+ # class Signup
323
+ # include Hanami::Interactor
324
+ # expose :user
325
+ #
326
+ # # THIS WON'T BE INVOKED BECAUSE #valid? WILL RETURN false
327
+ # def call(params)
328
+ # @user = User.new(params)
329
+ # @user = UserRepository.new.persist(@user)
330
+ # end
331
+ #
332
+ # private
333
+ # def valid?(params)
334
+ # params.valid?
335
+ # end
336
+ # end
337
+ #
338
+ # result = Signup.new.call(name: nil)
339
+ # result.successful? # => false
340
+ # result.failure? # => true
341
+ #
342
+ # result.user # => nil
343
+ #
344
+ # @example Bad usage
345
+ # require 'hanami/interactor'
346
+ #
347
+ # class Signup
348
+ # include Hanami::Interactor
349
+ #
350
+ # # Method #call is not defined
351
+ # end
352
+ #
353
+ # Signup.new.call # => NoMethodError
354
+ def call(*args, **kwargs)
355
+ @__result = ::Hanami::Interactor::Result.new
356
+ _call(*args, **kwargs) { super }
357
+ end
358
+
359
+ private
360
+
361
+ # @api private
362
+ # @since 1.1.0
363
+ def _call(*args, **kwargs)
364
+ catch :fail do
365
+ validate!(*args, **kwargs)
366
+ yield
367
+ end
368
+
369
+ _prepare!
370
+ end
371
+
372
+ # @since 1.1.0
373
+ def validate!(*args, **kwargs)
374
+ fail! unless valid?(*args, **kwargs)
375
+ end
376
+ end
377
+
378
+ private
379
+
380
+ # Checks if proceed with <tt>#call</tt> invocation.
381
+ # By default it returns <tt>true</tt>.
382
+ #
383
+ # Developers can override it.
384
+ #
385
+ # @return [TrueClass,FalseClass] the result of the check
386
+ #
387
+ # @since 0.3.5
388
+ def valid?(*)
389
+ true
390
+ end
391
+
392
+ # Fails and interrupts the current flow.
393
+ #
394
+ # @since 0.3.5
395
+ #
396
+ # @example
397
+ # require 'hanami/interactor'
398
+ #
399
+ # class CreateEmailTest
400
+ # include Hanami::Interactor
401
+ #
402
+ # def initialize(params)
403
+ # @params = params
404
+ # end
405
+ #
406
+ # def call
407
+ # persist_email_test!
408
+ # capture_screenshot!
409
+ # end
410
+ #
411
+ # private
412
+ # def persist_email_test!
413
+ # @email_test = EmailTestRepository.new.create(@params)
414
+ # end
415
+ #
416
+ # # IF THIS RAISES AN EXCEPTION WE FORCE A FAILURE
417
+ # def capture_screenshot!
418
+ # Screenshot.new(@email_test).capture!
419
+ # rescue
420
+ # fail!
421
+ # end
422
+ # end
423
+ #
424
+ # result = CreateEmailTest.new(account_id: 1).call
425
+ # result.successful? # => false
426
+ def fail!
427
+ @__result.fail!
428
+ throw :fail
429
+ end
430
+
431
+ # Logs an error without interrupting the flow.
432
+ #
433
+ # When used, the returned result won't be successful.
434
+ #
435
+ # @param message [String] the error message
436
+ #
437
+ # @return false
438
+ #
439
+ # @since 0.3.5
440
+ #
441
+ # @see Hanami::Interactor#error!
442
+ #
443
+ # @example
444
+ # require 'hanami/interactor'
445
+ #
446
+ # class CreateRecord
447
+ # include Hanami::Interactor
448
+ # expose :logger
449
+ #
450
+ # def initialize
451
+ # @logger = []
452
+ # end
453
+ #
454
+ # def call
455
+ # prepare_data!
456
+ # persist!
457
+ # sync!
458
+ # end
459
+ #
460
+ # private
461
+ # def prepare_data!
462
+ # @logger << __method__
463
+ # error "Prepare data error"
464
+ # end
465
+ #
466
+ # def persist!
467
+ # @logger << __method__
468
+ # error "Persist error"
469
+ # end
470
+ #
471
+ # def sync!
472
+ # @logger << __method__
473
+ # end
474
+ # end
475
+ #
476
+ # result = CreateRecord.new.call
477
+ # result.successful? # => false
478
+ #
479
+ # result.errors # => ["Prepare data error", "Persist error"]
480
+ # result.logger # => [:prepare_data!, :persist!, :sync!]
481
+ def error(message)
482
+ @__result.add_error message
483
+ false
484
+ end
485
+
486
+ # Logs an error and interrupts the flow.
487
+ #
488
+ # When used, the returned result won't be successful.
489
+ #
490
+ # @param message [String] the error message
491
+ #
492
+ # @since 0.3.5
493
+ #
494
+ # @see Hanami::Interactor#error
495
+ #
496
+ # @example
497
+ # require 'hanami/interactor'
498
+ #
499
+ # class CreateRecord
500
+ # include Hanami::Interactor
501
+ # expose :logger
502
+ #
503
+ # def initialize
504
+ # @logger = []
505
+ # end
506
+ #
507
+ # def call
508
+ # prepare_data!
509
+ # persist!
510
+ # sync!
511
+ # end
512
+ #
513
+ # private
514
+ # def prepare_data!
515
+ # @logger << __method__
516
+ # error "Prepare data error"
517
+ # end
518
+ #
519
+ # def persist!
520
+ # @logger << __method__
521
+ # error! "Persist error"
522
+ # end
523
+ #
524
+ # # THIS WILL NEVER BE INVOKED BECAUSE WE USE #error! IN #persist!
525
+ # def sync!
526
+ # @logger << __method__
527
+ # end
528
+ # end
529
+ #
530
+ # result = CreateRecord.new.call
531
+ # result.successful? # => false
532
+ #
533
+ # result.errors # => ["Prepare data error", "Persist error"]
534
+ # result.logger # => [:prepare_data!, :persist!]
535
+ def error!(message)
536
+ error(message)
537
+ fail!
538
+ end
539
+
540
+ # @since 0.3.5
541
+ # @api private
542
+ def _prepare!
543
+ @__result.prepare!(_exposures)
544
+ end
545
+
546
+ # @since 0.5.0
547
+ # @api private
548
+ def _exposures
549
+ ::Hash[].tap do |result|
550
+ self.class.exposures.each do |name, ivar|
551
+ result[name] = instance_variable_defined?(ivar) ? instance_variable_get(ivar) : nil
552
+ end
553
+ end
554
+ end
555
+ end
556
+
557
+ # @since 0.5.0
558
+ # @api private
559
+ module ClassMethods
560
+ # @since 0.5.0
561
+ # @api private
562
+ def self.extended(interactor)
563
+ interactor.class_eval do
564
+ include Utils::ClassAttribute
565
+
566
+ class_attribute :exposures
567
+ self.exposures = {}
568
+ end
569
+ end
570
+
571
+ def method_added(method_name)
572
+ super
573
+ return unless method_name == :call
574
+
575
+ if instance_method(:call).arity.zero?
576
+ prepend Hanami::Interactor::LegacyInterface
577
+ else
578
+ prepend Hanami::Interactor::Interface
579
+ end
580
+ end
581
+
582
+ # Exposes local instance variables into the returning value of <tt>#call</tt>
583
+ #
584
+ # @param instance_variable_names [Symbol,Array<Symbol>] one or more instance
585
+ # variable names
586
+ #
587
+ # @since 0.5.0
588
+ #
589
+ # @see Hanami::Interactor::Result
590
+ #
591
+ # @example Exposes instance variable
592
+ #
593
+ # class Signup
594
+ # include Hanami::Interactor
595
+ # expose :user
596
+ #
597
+ # def initialize(params)
598
+ # @params = params
599
+ # @user = User.new(@params[:user])
600
+ # end
601
+ #
602
+ # def call
603
+ # # ...
604
+ # end
605
+ # end
606
+ #
607
+ # result = Signup.new(user: { name: "Luca" }).call
608
+ #
609
+ # result.user # => #<User:0x007fa85c58ccd8 @name="Luca">
610
+ # result.params # => NoMethodError
611
+ def expose(*instance_variable_names)
612
+ instance_variable_names.each do |name|
613
+ exposures[name.to_sym] = "@#{name}"
614
+ end
615
+ end
616
+ end
617
+ end
@@ -0,0 +1,141 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Hanami
4
+ module Utils
5
+ # BasicObject
6
+ #
7
+ # @since 0.3.5
8
+ class BasicObject < ::BasicObject
9
+ # Lookups constants at the top-level namespace, if they are missing in the
10
+ # current context.
11
+ #
12
+ # @param name [Symbol] the constant name
13
+ #
14
+ # @return [Object, Module] the constant
15
+ #
16
+ # @raise [NameError] if the constant cannot be found
17
+ #
18
+ # @since 1.3.4
19
+ # @api private
20
+ #
21
+ # @see https://ruby-doc.org/core/Module.html#method-i-const_missing
22
+ def self.const_missing(name)
23
+ ::Object.const_get(name)
24
+ end
25
+
26
+ # Returns the class for debugging purposes.
27
+ #
28
+ # @since 0.3.5
29
+ #
30
+ # @see http://ruby-doc.org/core/Object.html#method-i-class
31
+ def class
32
+ (class << self; self; end).superclass
33
+ end
34
+
35
+ # Bare minimum inspect for debugging purposes.
36
+ #
37
+ # @return [String] the inspect string
38
+ #
39
+ # @since 0.3.5
40
+ #
41
+ # @see http://ruby-doc.org/core/Object.html#method-i-inspect
42
+ def inspect
43
+ "#<#{self.class}:#{'0x0000%x' % (__id__ << 1)}#{__inspect}>"
44
+ end
45
+
46
+ # @!macro [attach] instance_of?(class)
47
+ #
48
+ # Determines if self is an instance of given class or module
49
+ #
50
+ # @param class [Class,Module] the class of module to verify
51
+ #
52
+ # @return [TrueClass,FalseClass] the result of the check
53
+ #
54
+ # @raise [TypeError] if the given argument is not of the expected types
55
+ #
56
+ # @since 1.3.2
57
+ #
58
+ # @see http://ruby-doc.org/core/Object.html#method-i-instance_of-3F
59
+ define_method :instance_of?, ::Object.instance_method(:instance_of?)
60
+
61
+ # @!macro [attach] is_a?(class)
62
+ #
63
+ # Determines if self is of the type of the object class or module
64
+ #
65
+ # @param class [Class,Module] the class of module to verify
66
+ #
67
+ # @return [TrueClass,FalseClass] the result of the check
68
+ #
69
+ # @raise [TypeError] if the given argument is not of the expected types
70
+ #
71
+ # @since 1.3.2
72
+ #
73
+ # @see http://ruby-doc.org/core/Object.html#method-i-is_a-3F
74
+ define_method :is_a?, ::Object.instance_method(:is_a?)
75
+
76
+ # @!macro [attach] kind_of?(class)
77
+ #
78
+ # Determines if self is of the kind of the object class or module
79
+ #
80
+ # @param class [Class,Module] the class of module to verify
81
+ #
82
+ # @return [TrueClass,FalseClass] the result of the check
83
+ #
84
+ # @raise [TypeError] if the given argument is not of the expected types
85
+ #
86
+ # @since 1.3.2
87
+ #
88
+ # @see http://ruby-doc.org/core/Object.html#method-i-kind_of-3F
89
+ define_method :kind_of?, ::Object.instance_method(:kind_of?)
90
+
91
+ # Alias for __id__
92
+ #
93
+ # @return [Fixnum] the object id
94
+ #
95
+ # @since 0.9.0
96
+ #
97
+ # @see http://ruby-doc.org/core/Object.html#method-i-object_id
98
+ def object_id
99
+ __id__
100
+ end
101
+
102
+ # Interface for pp
103
+ #
104
+ # @param printer [PP] the Pretty Printable printer
105
+ # @return [String] the pretty-printable inspection of the object
106
+ #
107
+ # @since 0.9.0
108
+ #
109
+ # @see https://ruby-doc.org/stdlib/libdoc/pp/rdoc/PP.html
110
+ def pretty_print(printer)
111
+ printer.text(inspect)
112
+ end
113
+
114
+ # Returns true if responds to the given method.
115
+ #
116
+ # @return [TrueClass,FalseClass] the result of the check
117
+ #
118
+ # @since 0.3.5
119
+ #
120
+ # @see http://ruby-doc.org/core-2.2.1/Object.html#method-i-respond_to-3F
121
+ def respond_to?(method_name, include_all = false)
122
+ respond_to_missing?(method_name, include_all)
123
+ end
124
+
125
+ private
126
+
127
+ # Must be overridden by descendants
128
+ #
129
+ # @since 0.3.5
130
+ # @api private
131
+ def respond_to_missing?(_method_name, _include_all)
132
+ ::Kernel.raise ::NotImplementedError
133
+ end
134
+
135
+ # @since 0.3.5
136
+ # @api private
137
+ def __inspect
138
+ end
139
+ end
140
+ end
141
+ end
@@ -0,0 +1,3 @@
1
+ module SimpleInteractors
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,6 @@
1
+ require "hanami/interactor"
2
+
3
+ module SimpleInteractors
4
+ require "simple-interactors/version"
5
+
6
+ end
@@ -0,0 +1,26 @@
1
+ $:.push File.expand_path("lib", __dir__)
2
+
3
+ require "simple-interactors/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "simple-interactors"
7
+ spec.version = SimpleInteractors::VERSION
8
+ spec.authors = ["Gonzalo Rodríguez-Baltanás Díaz"]
9
+ spec.email = ["siotopo@gmail.com"]
10
+ spec.description = "Interactors for Ruby on Rails applications"
11
+ spec.summary = "Interactors for Ruby on Rails applications"
12
+ spec.homepage = "https://github.com/Nerian/simple-interactors"
13
+ spec.license = "MIT"
14
+
15
+ spec.files = `git ls-files -- lib/* CHANGELOG.md LICENSE.md README.md simple-interactors.gemspec`.split($/)
16
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
18
+ spec.require_paths = ["lib"]
19
+ spec.required_ruby_version = ">= 3.0"
20
+
21
+ spec.add_dependency "hanami-utils"
22
+
23
+ spec.add_development_dependency "bundler"
24
+ spec.add_development_dependency "rake"
25
+ spec.add_development_dependency "rspec"
26
+ end
metadata ADDED
@@ -0,0 +1,105 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: simple-interactors
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Gonzalo Rodríguez-Baltanás Díaz
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-07-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: hanami-utils
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: rspec
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - ">="
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: '0'
69
+ description: Interactors for Ruby on Rails applications
70
+ email:
71
+ - siotopo@gmail.com
72
+ executables: []
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - README.md
77
+ - lib/hanami/interactor.rb
78
+ - lib/hanami/utils/basic_object.rb
79
+ - lib/simple-interactors.rb
80
+ - lib/simple-interactors/version.rb
81
+ - simple-interactors.gemspec
82
+ homepage: https://github.com/Nerian/simple-interactors
83
+ licenses:
84
+ - MIT
85
+ metadata: {}
86
+ post_install_message:
87
+ rdoc_options: []
88
+ require_paths:
89
+ - lib
90
+ required_ruby_version: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - ">="
93
+ - !ruby/object:Gem::Version
94
+ version: '3.0'
95
+ required_rubygems_version: !ruby/object:Gem::Requirement
96
+ requirements:
97
+ - - ">="
98
+ - !ruby/object:Gem::Version
99
+ version: '0'
100
+ requirements: []
101
+ rubygems_version: 3.3.11
102
+ signing_key:
103
+ specification_version: 4
104
+ summary: Interactors for Ruby on Rails applications
105
+ test_files: []