functional_interactor 0.0.1

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,57 @@
1
+ module Interactor
2
+ describe Organizer do
3
+ include_examples :lint
4
+
5
+ let(:organizer) { Class.new.send(:include, Organizer) }
6
+
7
+ describe ".organize" do
8
+ let(:interactor2) { double(:interactor2) }
9
+ let(:interactor3) { double(:interactor3) }
10
+
11
+ it "sets interactors given class arguments" do
12
+ expect {
13
+ organizer.organize(interactor2, interactor3)
14
+ }.to change {
15
+ organizer.organized
16
+ }.from([]).to([interactor2, interactor3])
17
+ end
18
+
19
+ it "sets interactors given an array of classes" do
20
+ expect {
21
+ organizer.organize([interactor2, interactor3])
22
+ }.to change {
23
+ organizer.organized
24
+ }.from([]).to([interactor2, interactor3])
25
+ end
26
+ end
27
+
28
+ describe ".organized" do
29
+ it "is empty by default" do
30
+ expect(organizer.organized).to eq([])
31
+ end
32
+ end
33
+
34
+ describe "#call" do
35
+ let(:instance) { organizer.new }
36
+ let(:context) { double(:context) }
37
+ let(:interactor2) { double(:interactor2) }
38
+ let(:interactor3) { double(:interactor3) }
39
+ let(:interactor4) { double(:interactor4) }
40
+
41
+ before do
42
+ allow(instance).to receive(:context) { context }
43
+ allow(organizer).to receive(:organized) {
44
+ [interactor2, interactor3, interactor4]
45
+ }
46
+ end
47
+
48
+ it "calls each interactor in order with the context" do
49
+ expect(interactor2).to receive(:call!).once.with(context).ordered
50
+ expect(interactor3).to receive(:call!).once.with(context).ordered
51
+ expect(interactor4).to receive(:call!).once.with(context).ordered
52
+
53
+ instance.call
54
+ end
55
+ end
56
+ end
57
+ end
@@ -0,0 +1,3 @@
1
+ describe Interactor do
2
+ include_examples :lint
3
+ end
@@ -0,0 +1,8 @@
1
+ if ENV["CODECLIMATE_REPO_TOKEN"]
2
+ require "codeclimate-test-reporter"
3
+ CodeClimate::TestReporter.start
4
+ end
5
+
6
+ require "interactor"
7
+
8
+ Dir[File.expand_path("../support/*.rb", __FILE__)].each { |f| require f }
@@ -0,0 +1,135 @@
1
+ shared_examples :lint do
2
+ let(:interactor) { 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(interactor).to receive(:new).once.with(foo: "bar") { instance }
10
+ expect(instance).to receive(:run).once.with(no_args)
11
+
12
+ expect(interactor.call(foo: "bar")).to eq(context)
13
+ end
14
+
15
+ it "provides a blank context if none is given" do
16
+ expect(interactor).to receive(:new).once.with({}) { instance }
17
+ expect(instance).to receive(:run).once.with(no_args)
18
+
19
+ expect(interactor.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(interactor).to receive(:new).once.with(foo: "bar") { instance }
29
+ expect(instance).to receive(:run!).once.with(no_args)
30
+
31
+ expect(interactor.call!(foo: "bar")).to eq(context)
32
+ end
33
+
34
+ it "provides a blank context if none is given" do
35
+ expect(interactor).to receive(:new).once.with({}) { instance }
36
+ expect(instance).to receive(:run!).once.with(no_args)
37
+
38
+ expect(interactor.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(Interactor::Context).to receive(:build).once.with(foo: "bar") { context }
47
+
48
+ instance = interactor.new(foo: "bar")
49
+
50
+ expect(instance).to be_a(interactor)
51
+ expect(instance.context).to eq(context)
52
+ end
53
+
54
+ it "initializes a blank context if none is given" do
55
+ expect(Interactor::Context).to receive(:build).once.with({}) { context }
56
+
57
+ instance = interactor.new
58
+
59
+ expect(instance).to be_a(interactor)
60
+ expect(instance.context).to eq(context)
61
+ end
62
+ end
63
+
64
+ describe "#run" do
65
+ let(:instance) { interactor.new }
66
+
67
+ it "runs the interactor" do
68
+ expect(instance).to receive(:run!).once.with(no_args)
69
+
70
+ instance.run
71
+ end
72
+
73
+ it "rescues failure" do
74
+ expect(instance).to receive(:run!).and_raise(Interactor::Failure)
75
+
76
+ expect {
77
+ instance.run
78
+ }.not_to raise_error
79
+ end
80
+
81
+ it "raises other errors" do
82
+ expect(instance).to receive(:run!).and_raise("foo")
83
+
84
+ expect {
85
+ instance.run
86
+ }.to raise_error("foo")
87
+ end
88
+ end
89
+
90
+ describe "#run!" do
91
+ let(:instance) { interactor.new }
92
+
93
+ it "calls the interactor" do
94
+ expect(instance).to receive(:call).once.with(no_args)
95
+
96
+ instance.run!
97
+ end
98
+
99
+ it "raises failure" do
100
+ expect(instance).to receive(:run!).and_raise(Interactor::Failure)
101
+
102
+ expect {
103
+ instance.run!
104
+ }.to raise_error(Interactor::Failure)
105
+ end
106
+
107
+ it "raises other errors" do
108
+ expect(instance).to receive(:run!).and_raise("foo")
109
+
110
+ expect {
111
+ instance.run
112
+ }.to raise_error("foo")
113
+ end
114
+ end
115
+
116
+ describe "#call" do
117
+ let(:instance) { interactor.new }
118
+
119
+ it "exists" do
120
+ expect(instance).to respond_to(:call)
121
+ expect { instance.call }.not_to raise_error
122
+ expect { instance.method(:call) }.not_to raise_error
123
+ end
124
+ end
125
+
126
+ describe "#rollback" do
127
+ let(:instance) { interactor.new }
128
+
129
+ it "exists" do
130
+ expect(instance).to respond_to(:rollback)
131
+ expect { instance.rollback }.not_to raise_error
132
+ expect { instance.method(:rollback) }.not_to raise_error
133
+ end
134
+ end
135
+ end
metadata ADDED
@@ -0,0 +1,115 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: functional_interactor
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Ho-Sheng Hsiao
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-05-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: activesupport
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.2'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.2'
27
+ - !ruby/object:Gem::Dependency
28
+ name: bundler
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '1.7'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.7'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rake
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '10.3'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '10.3'
55
+ description: Functional Interactor using Kase protocol and composition operators
56
+ email: hosh@legal.io
57
+ executables: []
58
+ extensions: []
59
+ extra_rdoc_files: []
60
+ files:
61
+ - ".gitignore"
62
+ - ".rspec"
63
+ - ".travis.yml"
64
+ - CHANGELOG.md
65
+ - CONTRIBUTING.md
66
+ - Gemfile
67
+ - LICENSE.txt
68
+ - README.md
69
+ - Rakefile
70
+ - functional_interactor.gemspec
71
+ - lib/functional_interactor.rb
72
+ - lib/interactors.rb
73
+ - lib/interactors/anonymous.rb
74
+ - lib/interactors/sequence.rb
75
+ - lib/interactors/simple.rb
76
+ - spec/integration_spec.rb
77
+ - spec/interactor/context_spec.rb
78
+ - spec/interactor/hooks_spec.rb
79
+ - spec/interactor/organizer_spec.rb
80
+ - spec/interactor_spec.rb
81
+ - spec/spec_helper.rb
82
+ - spec/support/lint.rb
83
+ homepage: https://github.com/hosh/functional_interactor
84
+ licenses:
85
+ - MIT
86
+ metadata: {}
87
+ post_install_message:
88
+ rdoc_options: []
89
+ require_paths:
90
+ - lib
91
+ required_ruby_version: !ruby/object:Gem::Requirement
92
+ requirements:
93
+ - - ">="
94
+ - !ruby/object:Gem::Version
95
+ version: '0'
96
+ required_rubygems_version: !ruby/object:Gem::Requirement
97
+ requirements:
98
+ - - ">="
99
+ - !ruby/object:Gem::Version
100
+ version: '0'
101
+ requirements: []
102
+ rubyforge_project:
103
+ rubygems_version: 2.4.5.1
104
+ signing_key:
105
+ specification_version: 4
106
+ summary: Functional Interactor, composable, higher-order interactors. Complete rewrite
107
+ of collectiveideas/interactor
108
+ test_files:
109
+ - spec/integration_spec.rb
110
+ - spec/interactor/context_spec.rb
111
+ - spec/interactor/hooks_spec.rb
112
+ - spec/interactor/organizer_spec.rb
113
+ - spec/interactor_spec.rb
114
+ - spec/spec_helper.rb
115
+ - spec/support/lint.rb