interaktor 0.1.3

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,61 @@
1
+ module Interaktor
2
+ describe Organizer do
3
+ let(:organizer) { Class.new.send(:include, Organizer) }
4
+
5
+ include_examples "lint"
6
+
7
+ describe ".organize" do
8
+ let(:interaktor2) { double(:interaktor2) }
9
+ let(:interaktor3) { double(:interaktor3) }
10
+
11
+ it "sets interaktors given class arguments" do
12
+ expect {
13
+ organizer.organize(interaktor2, interaktor3)
14
+ }.to change(organizer, :organized).from([]).to([interaktor2, interaktor3])
15
+ end
16
+
17
+ it "sets interaktors given an array of classes" do
18
+ expect {
19
+ organizer.organize([interaktor2, interaktor3])
20
+ }.to change(organizer, :organized).from([]).to([interaktor2, interaktor3])
21
+ end
22
+
23
+ it "allows multiple organize calls" do
24
+ interaktor4 = double(:interaktor4)
25
+ expect {
26
+ organizer.organize(interaktor2, interaktor3)
27
+ organizer.organize(interaktor4)
28
+ }.to change(organizer, :organized).from([]).to([interaktor2, interaktor3, interaktor4])
29
+ end
30
+ end
31
+
32
+ describe ".organized" do
33
+ it "is empty by default" do
34
+ expect(organizer.organized).to eq([])
35
+ end
36
+ end
37
+
38
+ describe "#call" do
39
+ let(:instance) { organizer.new }
40
+ let(:context) { double(:context) }
41
+ let(:interaktor2) { double(:interaktor2) }
42
+ let(:interaktor3) { double(:interaktor3) }
43
+ let(:interaktor4) { double(:interaktor4) }
44
+
45
+ before do
46
+ allow(instance).to receive(:context) { context }
47
+ allow(organizer).to receive(:organized) {
48
+ [interaktor2, interaktor3, interaktor4]
49
+ }
50
+ end
51
+
52
+ it "calls each interaktor in order with the context" do
53
+ expect(interaktor2).to receive(:call!).once.with(context).ordered
54
+ expect(interaktor3).to receive(:call!).once.with(context).ordered
55
+ expect(interaktor4).to receive(:call!).once.with(context).ordered
56
+
57
+ instance.call
58
+ end
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,3 @@
1
+ describe Interaktor do
2
+ include_examples "lint"
3
+ end
@@ -0,0 +1,8 @@
1
+ if ENV["CODECLIMATE_REPO_TOKEN"]
2
+ require "simplecov"
3
+ SimpleCov.start
4
+ end
5
+
6
+ require "interaktor"
7
+
8
+ Dir[File.expand_path("support/*.rb", __dir__)].sort.each { |f| require f }
@@ -0,0 +1,136 @@
1
+ shared_examples "lint" do
2
+ let(:interaktor) { Class.new.send(:include, described_class) }
3
+
4
+ describe ".call" do
5
+ let(:context) { double(:context) }
6
+ let(:instance) { double(:instance, context: context) }
7
+
8
+ it "calls an instance with the given context" do
9
+ expect(interaktor).to receive(:new).once.with(foo: "bar") { instance }
10
+ expect(instance).to receive(:run).once.with(no_args)
11
+
12
+ expect(interaktor.call(foo: "bar")).to eq(context)
13
+ end
14
+
15
+ it "provides a blank context if none is given" do
16
+ expect(interaktor).to receive(:new).once.with({}) { instance }
17
+ expect(instance).to receive(:run).once.with(no_args)
18
+
19
+ expect(interaktor.call).to eq(context)
20
+ end
21
+ end
22
+
23
+ describe ".call!" do
24
+ let(:context) { double(:context) }
25
+ let(:instance) { double(:instance, context: context) }
26
+
27
+ it "calls an instance with the given context" do
28
+ expect(interaktor).to receive(:new).once.with(foo: "bar") { instance }
29
+ expect(instance).to receive(:run!).once.with(no_args)
30
+
31
+ expect(interaktor.call!(foo: "bar")).to eq(context)
32
+ end
33
+
34
+ it "provides a blank context if none is given" do
35
+ expect(interaktor).to receive(:new).once.with({}) { instance }
36
+ expect(instance).to receive(:run!).once.with(no_args)
37
+
38
+ expect(interaktor.call!).to eq(context)
39
+ end
40
+ end
41
+
42
+ describe ".new" do
43
+ let(:context) { double(:context) }
44
+
45
+ it "initializes a context" do
46
+ expect(Interaktor::Context).to receive(:build)
47
+ .once.with(foo: "bar") { context }
48
+
49
+ instance = interaktor.new(foo: "bar")
50
+
51
+ expect(instance).to be_a(interaktor)
52
+ expect(instance.context).to eq(context)
53
+ end
54
+
55
+ it "initializes a blank context if none is given" do
56
+ expect(Interaktor::Context).to receive(:build).once.with({}) { context }
57
+
58
+ instance = interaktor.new
59
+
60
+ expect(instance).to be_a(interaktor)
61
+ expect(instance.context).to eq(context)
62
+ end
63
+ end
64
+
65
+ describe "#run" do
66
+ let(:instance) { interaktor.new }
67
+
68
+ it "runs the interaktor" do
69
+ expect(instance).to receive(:run!).once.with(no_args)
70
+
71
+ instance.run
72
+ end
73
+
74
+ it "rescues failure" do
75
+ expect(instance).to receive(:run!).and_raise(Interaktor::Failure)
76
+
77
+ expect {
78
+ instance.run
79
+ }.not_to raise_error
80
+ end
81
+
82
+ it "raises other errors" do
83
+ expect(instance).to receive(:run!).and_raise("foo")
84
+
85
+ expect {
86
+ instance.run
87
+ }.to raise_error("foo")
88
+ end
89
+ end
90
+
91
+ describe "#run!" do
92
+ let(:instance) { interaktor.new }
93
+
94
+ it "calls the interaktor" do
95
+ expect(instance).to receive(:call).once.with(no_args)
96
+
97
+ instance.run!
98
+ end
99
+
100
+ it "raises failure" do
101
+ expect(instance).to receive(:run!).and_raise(Interaktor::Failure)
102
+
103
+ expect {
104
+ instance.run!
105
+ }.to raise_error(Interaktor::Failure)
106
+ end
107
+
108
+ it "raises other errors" do
109
+ expect(instance).to receive(:run!).and_raise("foo")
110
+
111
+ expect {
112
+ instance.run
113
+ }.to raise_error("foo")
114
+ end
115
+ end
116
+
117
+ describe "#call" do
118
+ let(:instance) { interaktor.new }
119
+
120
+ it "exists" do
121
+ expect(instance).to respond_to(:call)
122
+ expect { instance.call }.not_to raise_error
123
+ expect { instance.method(:call) }.not_to raise_error
124
+ end
125
+ end
126
+
127
+ describe "#rollback" do
128
+ let(:instance) { interaktor.new }
129
+
130
+ it "exists" do
131
+ expect(instance).to respond_to(:rollback)
132
+ expect { instance.rollback }.not_to raise_error
133
+ expect { instance.method(:rollback) }.not_to raise_error
134
+ end
135
+ end
136
+ end
metadata ADDED
@@ -0,0 +1,97 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: interaktor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.3
5
+ platform: ruby
6
+ authors:
7
+ - Taylor Thurlow
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2020-07-13 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: zeitwerk
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.3.1
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.3.1
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '13.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '13.0'
41
+ description: A common interface for building service objects.
42
+ email: taylorthurlow@me.com
43
+ executables: []
44
+ extensions: []
45
+ extra_rdoc_files: []
46
+ files:
47
+ - ".gitignore"
48
+ - ".rspec"
49
+ - ".rubocop.yml"
50
+ - ".travis.yml"
51
+ - Gemfile
52
+ - README.md
53
+ - Rakefile
54
+ - interaktor.gemspec
55
+ - lib/interaktor.rb
56
+ - lib/interaktor/context.rb
57
+ - lib/interaktor/failure.rb
58
+ - lib/interaktor/hooks.rb
59
+ - lib/interaktor/organizer.rb
60
+ - spec/integration_spec.rb
61
+ - spec/interactor/context_spec.rb
62
+ - spec/interactor/hooks_spec.rb
63
+ - spec/interactor/organizer_spec.rb
64
+ - spec/interactor_spec.rb
65
+ - spec/spec_helper.rb
66
+ - spec/support/lint.rb
67
+ homepage: https://github.com/taylorthurlow/interaktor
68
+ licenses:
69
+ - MIT
70
+ metadata: {}
71
+ post_install_message:
72
+ rdoc_options: []
73
+ require_paths:
74
+ - lib
75
+ required_ruby_version: !ruby/object:Gem::Requirement
76
+ requirements:
77
+ - - ">="
78
+ - !ruby/object:Gem::Version
79
+ version: '2.5'
80
+ required_rubygems_version: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - ">="
83
+ - !ruby/object:Gem::Version
84
+ version: '0'
85
+ requirements: []
86
+ rubygems_version: 3.1.2
87
+ signing_key:
88
+ specification_version: 4
89
+ summary: Simple service object implementation
90
+ test_files:
91
+ - spec/integration_spec.rb
92
+ - spec/interactor/context_spec.rb
93
+ - spec/interactor/hooks_spec.rb
94
+ - spec/interactor/organizer_spec.rb
95
+ - spec/interactor_spec.rb
96
+ - spec/spec_helper.rb
97
+ - spec/support/lint.rb