interaktor 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -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