Skip to content

Commit a89d03c

Browse files
committed
extract EachChain class and refactor IfKlass
1 parent c34cfa1 commit a89d03c

File tree

3 files changed

+92
-39
lines changed

3 files changed

+92
-39
lines changed

lib/interactify/dsl/each_chain.rb

+2-37
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# frozen_string_literal: true
22

33
require "interactify/dsl/unique_klass_name"
4+
require "interactify/dsl/each_klass"
45

56
module Interactify
67
module Dsl
@@ -21,45 +22,9 @@ def initialize(each_loop_klasses, plural_resource_name, evaluating_receiver)
2122
# allows us to dynamically create an interactor chain
2223
# that iterates over the packages and
2324
# uses the passed in each_loop_klasses
24-
# rubocop:disable all
2525
def klass
26-
this = self
27-
28-
Class.new do # class SomeNamespace::EachPackage
29-
include Interactify # include Interactify
30-
31-
expects do # expects do
32-
required(this.plural_resource_name) # required(:packages)
33-
end # end
34-
35-
define_singleton_method(:source_location) do # def self.source_location
36-
const_source_location this.evaluating_receiver.to_s # [file, line]
37-
end # end
38-
39-
define_method(:run!) do # def run!
40-
context.send(this.plural_resource_name).each_with_index do |resource, index|# context.packages.each_with_index do |package, index|
41-
context[this.singular_resource_name] = resource # context.package = package
42-
context[this.singular_resource_index_name] = index # context.package_index = index
43-
44-
klasses = Wrapper.wrap_many(self, this.each_loop_klasses)
45-
46-
klasses.each do |interactor| # [A, B, C].each do |interactor|
47-
interactor.call!(context) # interactor.call!(context)
48-
end # end
49-
end # end
50-
51-
context[this.singular_resource_name] = nil # context.package = nil
52-
context[this.singular_resource_index_name] = nil # context.package_index = nil
53-
54-
context # context
55-
end # end
56-
57-
define_method(:inspect) do
58-
"<#{this.namespace}::#{this.iterator_klass_name} iterates_over: #{this.each_loop_klasses.inspect}>"
59-
end
60-
end
26+
EachKlass.new(self).klass
6127
end
62-
# rubocop:enable all
6328

6429
def attach_klass
6530
name = iterator_klass_name

lib/interactify/dsl/each_klass.rb

+85
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
# frozen_string_literal: true
2+
3+
require "interactify/dsl/unique_klass_name"
4+
5+
module Interactify
6+
module Dsl
7+
class EachKlass
8+
attr_reader :builder
9+
10+
def initialize(builder)
11+
@builder = builder
12+
end
13+
# allows us to dynamically create an interactor chain
14+
# that iterates over the packages and
15+
# uses the passed in each_loop_klasses
16+
# rubocop:disable all
17+
def klass
18+
this = self
19+
20+
klass_basis.tap do |klass|
21+
this.attach_method(klass, :run!) do
22+
this.run!(context)
23+
end
24+
end
25+
end
26+
27+
def run!(context)
28+
context.send(builder.plural_resource_name).each_with_index do |resource, index|# context.packages.each_with_index do |package, index|
29+
process_resource(context, resource, index) # process_resource(package, index)
30+
end # end
31+
32+
reset_context(context) # reset_context(context)
33+
34+
context # context
35+
end
36+
37+
def attach_method(klass, method_name, &block)
38+
klass.define_method(method_name, &block)
39+
end
40+
41+
def attach_inspect
42+
define_method(:inspect) do
43+
"<#{builder.namespace}::#{builder.iterator_klass_name} iterates_over: #{builder.each_loop_klasses.inspect}>"
44+
end
45+
end
46+
47+
private
48+
49+
def process_resource(context, resource, index)
50+
setup_context(context, resource, index) # setup_context(context, package, index)
51+
klasses = Wrapper.wrap_many(self, builder.each_loop_klasses)
52+
53+
klasses.each do |interactor| # [WrappedLambdaA, B, C].each do |interactor|
54+
interactor.call!(context) # interactor.call!(context)
55+
end # end
56+
end
57+
58+
def setup_context(context, resource, index) # def setup_context(context, package, index)
59+
context[builder.singular_resource_name] = resource # context.package = package
60+
context[builder.singular_resource_index_name] = index # context.package_index = index
61+
end
62+
63+
def reset_context(context) # reset_context(context)
64+
context[builder.singular_resource_name] = nil # context.package = nil
65+
context[builder.singular_resource_index_name] = nil # context.package_index = nil
66+
end
67+
68+
def klass_basis
69+
this = builder
70+
71+
Class.new do # class SomeNamespace::EachPackage
72+
include Interactify # include Interactify
73+
74+
expects do # expects do
75+
required(this.plural_resource_name) # required(:packages)
76+
end # end
77+
78+
define_singleton_method(:source_location) do # def self.source_location
79+
const_source_location this.evaluating_receiver.to_s # [file, line]
80+
end # end
81+
end
82+
end
83+
end
84+
end
85+
end

lib/interactify/dsl/if_klass.rb

+5-2
Original file line numberDiff line numberDiff line change
@@ -19,14 +19,17 @@ def klass
1919
end
2020

2121
def run!(context)
22-
result = condition.is_a?(Proc) ? condition.call(context) : context.send(condition)
22+
interactor = truthy_path?(context) ? success_interactor : failure_interactor
2323

24-
interactor = result ? success_interactor : failure_interactor
2524
interactor.respond_to?(:call!) ? interactor.call!(context) : interactor&.call(context)
2625
end
2726

2827
private
2928

29+
def truthy_path?(context)
30+
condition.is_a?(Proc) ? condition.call(context) : context.send(condition)
31+
end
32+
3033
def attach_source_location
3134
attach do |_klass, this|
3235
define_singleton_method(:source_location) do # def self.source_location

0 commit comments

Comments
 (0)