rest_my_case 1.2.0 → 1.3.2
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.
- checksums.yaml +4 -4
- data/lib/rest_my_case.rb +13 -3
- data/lib/rest_my_case/base.rb +15 -13
- data/lib/rest_my_case/config/base.rb +13 -0
- data/lib/rest_my_case/{configuration/base.rb → config/general.rb} +2 -4
- data/lib/rest_my_case/{configuration → config}/shared.rb +1 -1
- data/lib/rest_my_case/defense_attorney/base.rb +61 -0
- data/lib/rest_my_case/{judges → judge}/base.rb +8 -8
- data/lib/rest_my_case/trial_case/base.rb +25 -0
- data/lib/rest_my_case/trial_case/context.rb +25 -0
- data/lib/rest_my_case/version.rb +1 -1
- data/spec/rest_my_case/base_spec.rb +35 -26
- data/spec/rest_my_case/{defense_attorney_spec.rb → defense_attorney/base_spec.rb} +12 -45
- data/spec/rest_my_case/trial_case/base_spec.rb +37 -0
- data/spec/support/defense_attorney.rb +41 -0
- data/spec/support/perform.rb +128 -0
- data/spec/support/rest_my_case_base.rb +47 -0
- metadata +18 -10
- data/lib/rest_my_case/context.rb +0 -25
- data/lib/rest_my_case/defense_attorney.rb +0 -58
- data/spec/rest_my_case/judges/base_spec.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f2d0b9d8de92ec372285332d8dce7720f3224323
|
4
|
+
data.tar.gz: 3bfcd6e611ee75c3ec7ff74cde2246ad80fb2a9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a8f3aea034cbf77270ff5a6e9f910959cbd8c536029c66f2b822490947346b1eefea71a960a010f0b8df540d25672bec7cbd61c67aa3caf765d01b94ad2ec745
|
7
|
+
data.tar.gz: b000730a80b5b848b4890154c5993a26d4d11d52a55c63b5bafb0c8ad22b1c7a65399c62b928fb9771f4132255be863c504d0d3b20fc1b3860f16332dfa2ff83
|
data/lib/rest_my_case.rb
CHANGED
@@ -1,4 +1,14 @@
|
|
1
|
-
require
|
1
|
+
require 'ostruct'
|
2
|
+
|
3
|
+
require "rest_my_case/config/shared"
|
4
|
+
require "rest_my_case/config/base"
|
5
|
+
require "rest_my_case/config/general"
|
6
|
+
|
7
|
+
require "rest_my_case/judge/base"
|
8
|
+
require "rest_my_case/trial_case/base"
|
9
|
+
require "rest_my_case/trial_case/context"
|
10
|
+
require "rest_my_case/defense_attorney/base"
|
11
|
+
|
2
12
|
require "rest_my_case/version"
|
3
13
|
require "rest_my_case/errors"
|
4
14
|
require "rest_my_case/base"
|
@@ -10,11 +20,11 @@ module RestMyCase
|
|
10
20
|
end
|
11
21
|
|
12
22
|
def self.config
|
13
|
-
@config ||=
|
23
|
+
@config ||= Config::General.new
|
14
24
|
end
|
15
25
|
|
16
26
|
def self.reset_config
|
17
|
-
@config =
|
27
|
+
@config = Config::General.new
|
18
28
|
end
|
19
29
|
|
20
30
|
def self.get_config(attribute, use_case)
|
data/lib/rest_my_case/base.rb
CHANGED
@@ -1,11 +1,8 @@
|
|
1
|
-
require "rest_my_case/defense_attorney"
|
2
|
-
require "rest_my_case/judges/base"
|
3
|
-
|
4
1
|
module RestMyCase
|
5
2
|
|
6
3
|
class Base
|
7
4
|
|
8
|
-
extend
|
5
|
+
extend Config::Base
|
9
6
|
|
10
7
|
def self.depends(*use_cases)
|
11
8
|
dependencies.push *use_cases
|
@@ -16,9 +13,15 @@ module RestMyCase
|
|
16
13
|
end
|
17
14
|
|
18
15
|
def self.perform(attributes = {})
|
19
|
-
|
16
|
+
trial_case = TrialCase::Base.new self, attributes
|
17
|
+
attorney = DefenseAttorney::Base.new trial_case
|
18
|
+
judge = Judge::Base.new trial_case
|
19
|
+
|
20
|
+
attorney.build_case_for_the_defendant
|
21
|
+
|
22
|
+
judge.execute_the_sentence
|
20
23
|
|
21
|
-
|
24
|
+
trial_case.context
|
22
25
|
end
|
23
26
|
|
24
27
|
def self.context_accessor(*methods)
|
@@ -38,12 +41,11 @@ module RestMyCase
|
|
38
41
|
|
39
42
|
##################### INSTANCE METHODS BELLOW ###################
|
40
43
|
|
41
|
-
attr_reader :context, :
|
44
|
+
attr_reader :context, :options
|
42
45
|
|
43
|
-
def initialize(context)
|
44
|
-
@context
|
45
|
-
@
|
46
|
-
@should_abort = false
|
46
|
+
def initialize(context, options = {})
|
47
|
+
@context = context
|
48
|
+
@options = options
|
47
49
|
end
|
48
50
|
|
49
51
|
def setup; end
|
@@ -63,7 +65,7 @@ module RestMyCase
|
|
63
65
|
end
|
64
66
|
|
65
67
|
def abort
|
66
|
-
|
68
|
+
options[:should_abort] = true
|
67
69
|
end
|
68
70
|
|
69
71
|
def abort!
|
@@ -71,7 +73,7 @@ module RestMyCase
|
|
71
73
|
end
|
72
74
|
|
73
75
|
def skip
|
74
|
-
|
76
|
+
options[:should_skip] = true
|
75
77
|
end
|
76
78
|
|
77
79
|
def skip!
|
@@ -0,0 +1,61 @@
|
|
1
|
+
module RestMyCase
|
2
|
+
module DefenseAttorney
|
3
|
+
|
4
|
+
class Base
|
5
|
+
|
6
|
+
def initialize(trial_case)
|
7
|
+
@trial_case = trial_case
|
8
|
+
end
|
9
|
+
|
10
|
+
def build_case_for_the_defendant
|
11
|
+
@trial_case.use_cases = all_dependencies @trial_case.defendant
|
12
|
+
end
|
13
|
+
|
14
|
+
protected ###################### PROTECTED #########################
|
15
|
+
|
16
|
+
def all_dependencies(use_case, options = {})
|
17
|
+
return [] unless use_case.respond_to?(:dependencies)
|
18
|
+
|
19
|
+
parent_dependencies = all_dependencies(use_case.superclass, options)
|
20
|
+
|
21
|
+
if RestMyCase.get_config(:parent_dependencies_first, use_case)
|
22
|
+
parent_dependencies | deep_dependencies(use_case, options)
|
23
|
+
else
|
24
|
+
deep_dependencies(use_case, options) | parent_dependencies
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
def deep_dependencies(use_case, options)
|
29
|
+
options = build_options(use_case, options)
|
30
|
+
deep_dependencies = []
|
31
|
+
|
32
|
+
use_case.dependencies.each do |dependency|
|
33
|
+
deep_dependencies.push *all_dependencies(dependency, options)
|
34
|
+
end
|
35
|
+
|
36
|
+
include_current_use_case(deep_dependencies, use_case, options)
|
37
|
+
end
|
38
|
+
|
39
|
+
private ####################### PRIVATE ###########################
|
40
|
+
|
41
|
+
def build_options(use_case, options)
|
42
|
+
unless use_case.silence_dependencies_abort.nil?
|
43
|
+
options[:silent_abort] = use_case.silence_dependencies_abort
|
44
|
+
end
|
45
|
+
|
46
|
+
options
|
47
|
+
end
|
48
|
+
|
49
|
+
def include_current_use_case(dependencies, use_case, options)
|
50
|
+
return dependencies unless use_case.superclass.respond_to? :dependencies
|
51
|
+
|
52
|
+
append_method =
|
53
|
+
RestMyCase.get_config(:dependencies_first, use_case) ? :push : :unshift
|
54
|
+
|
55
|
+
dependencies.send append_method, use_case.new(@trial_case.context, options)
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -1,10 +1,10 @@
|
|
1
1
|
module RestMyCase
|
2
|
-
module
|
2
|
+
module Judge
|
3
3
|
|
4
4
|
class Base
|
5
5
|
|
6
|
-
def initialize(
|
7
|
-
@
|
6
|
+
def initialize(trial_case)
|
7
|
+
@trial_case = trial_case
|
8
8
|
@performed_use_cases = []
|
9
9
|
@use_case_that_aborted = false
|
10
10
|
end
|
@@ -19,7 +19,7 @@ module RestMyCase
|
|
19
19
|
protected #################### PROTECTED ####################
|
20
20
|
|
21
21
|
def run_setup_methods
|
22
|
-
@use_cases.each do |use_case|
|
22
|
+
@trial_case.use_cases.each do |use_case|
|
23
23
|
break if method_setup_has_aborted use_case
|
24
24
|
end
|
25
25
|
end
|
@@ -27,7 +27,7 @@ module RestMyCase
|
|
27
27
|
def run_perform_methods
|
28
28
|
return nil if @use_case_that_aborted
|
29
29
|
|
30
|
-
@use_cases.each do |use_case|
|
30
|
+
@trial_case.use_cases.each do |use_case|
|
31
31
|
break if method_perform_has_aborted use_case
|
32
32
|
end
|
33
33
|
end
|
@@ -41,7 +41,7 @@ module RestMyCase
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def run_final_methods
|
44
|
-
@use_cases.each { |use_case| run_method(:final, use_case) }
|
44
|
+
@trial_case.use_cases.each { |use_case| run_method(:final, use_case) }
|
45
45
|
end
|
46
46
|
|
47
47
|
private #################### PRIVATE ######################
|
@@ -51,7 +51,7 @@ module RestMyCase
|
|
51
51
|
end
|
52
52
|
|
53
53
|
def method_perform_has_aborted(use_case)
|
54
|
-
return false if use_case.should_skip
|
54
|
+
return false if use_case.options[:should_skip]
|
55
55
|
|
56
56
|
@performed_use_cases.push use_case
|
57
57
|
|
@@ -62,7 +62,7 @@ module RestMyCase
|
|
62
62
|
begin
|
63
63
|
run_method(method_name, use_case)
|
64
64
|
|
65
|
-
use_case.should_abort
|
65
|
+
use_case.options[:should_abort]
|
66
66
|
rescue Errors::Skip => exception
|
67
67
|
false
|
68
68
|
rescue Errors::Abort => exception
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module RestMyCase
|
2
|
+
module TrialCase
|
3
|
+
|
4
|
+
class Base
|
5
|
+
|
6
|
+
attr_reader :defendant, :context
|
7
|
+
|
8
|
+
attr_accessor :use_cases
|
9
|
+
|
10
|
+
def initialize(defendant, attributes = {})
|
11
|
+
attributes ||= {}
|
12
|
+
|
13
|
+
unless attributes.respond_to?(:to_hash)
|
14
|
+
raise ArgumentError.new('Must respond_to method #to_hash')
|
15
|
+
end
|
16
|
+
|
17
|
+
@context = Context.new attributes.to_hash
|
18
|
+
@defendant = defendant
|
19
|
+
@use_cases = []
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module RestMyCase
|
2
|
+
module TrialCase
|
3
|
+
|
4
|
+
class Context < OpenStruct
|
5
|
+
|
6
|
+
def errors
|
7
|
+
@errors ||= Hash.new { |hash, key| hash[key] = [] }
|
8
|
+
end
|
9
|
+
|
10
|
+
def valid?
|
11
|
+
errors.empty?
|
12
|
+
end
|
13
|
+
|
14
|
+
alias :ok? :valid?
|
15
|
+
|
16
|
+
def serializable_hash(options = nil)
|
17
|
+
marshal_dump
|
18
|
+
end
|
19
|
+
|
20
|
+
alias :to_hash :serializable_hash
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
data/lib/rest_my_case/version.rb
CHANGED
@@ -2,37 +2,15 @@ require 'spec_helper'
|
|
2
2
|
|
3
3
|
describe RestMyCase::Base do
|
4
4
|
|
5
|
-
module RestMyCaseBase
|
6
|
-
class LogEvents < RestMyCase::Base; end
|
7
|
-
class AnalyseEvents < RestMyCase::Base; end
|
8
|
-
class BuildPost < RestMyCase::Base; end
|
9
|
-
class SavePost < RestMyCase::Base; end
|
10
|
-
class BuildComments < RestMyCase::Base; end
|
11
|
-
class SaveComments < RestMyCase::Base; end
|
12
|
-
|
13
|
-
class UseCaseWrapper < RestMyCase::Base
|
14
|
-
context_writer :id
|
15
|
-
context_reader :session
|
16
|
-
context_accessor :comment
|
17
|
-
depends LogEvents, AnalyseEvents
|
18
|
-
end
|
19
|
-
class CreatePost < UseCaseWrapper
|
20
|
-
depends BuildPost, SavePost
|
21
|
-
end
|
22
|
-
class CreatePostWithComments < CreatePost
|
23
|
-
depends BuildComments, SaveComments
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
5
|
describe ".dependencies" do
|
28
6
|
it " should only list the class's dependencies" do
|
29
7
|
expect(RestMyCaseBase::CreatePostWithComments.dependencies).to \
|
30
|
-
eq [RestMyCaseBase::BuildComments, RestMyCaseBase::
|
8
|
+
eq [RestMyCaseBase::BuildComments, RestMyCaseBase::CreateComments]
|
31
9
|
end
|
32
10
|
end
|
33
11
|
|
34
12
|
describe ".context_accessor" do
|
35
|
-
let(:context) { RestMyCase::Context.new(id: 1, comment: 'my comment', session: -1) }
|
13
|
+
let(:context) { RestMyCase::TrialCase::Context.new(id: 1, comment: 'my comment', session: -1) }
|
36
14
|
let(:use_case) { RestMyCaseBase::CreatePostWithComments.new(context) }
|
37
15
|
|
38
16
|
it "Should create getters targeting to context" do
|
@@ -54,7 +32,7 @@ describe RestMyCase::Base do
|
|
54
32
|
end
|
55
33
|
|
56
34
|
describe ".context_writer" do
|
57
|
-
let(:use_case) { RestMyCaseBase::CreatePostWithComments.new(RestMyCase::Context.new) }
|
35
|
+
let(:use_case) { RestMyCaseBase::CreatePostWithComments.new(RestMyCase::TrialCase::Context.new) }
|
58
36
|
|
59
37
|
it "Should create setters targeting to context" do
|
60
38
|
expect(use_case.respond_to?(:id)).to be false
|
@@ -69,7 +47,7 @@ describe RestMyCase::Base do
|
|
69
47
|
end
|
70
48
|
|
71
49
|
describe ".context_reader" do
|
72
|
-
let(:context) { RestMyCase::Context.new(id: 1, comment: 'my comment', session: -1) }
|
50
|
+
let(:context) { RestMyCase::TrialCase::Context.new(id: 1, comment: 'my comment', session: -1) }
|
73
51
|
let(:use_case) { RestMyCaseBase::CreatePostWithComments.new(context) }
|
74
52
|
|
75
53
|
it "Should create getters targeting to context" do
|
@@ -82,4 +60,35 @@ describe RestMyCase::Base do
|
|
82
60
|
end
|
83
61
|
end
|
84
62
|
|
63
|
+
describe ".perform" do
|
64
|
+
|
65
|
+
context "When something that doesn't responde to #to_hash is used" do
|
66
|
+
it "should raise an exception" do
|
67
|
+
expect { RestMyCaseBase::CreatePost.perform(Object.new) }.to \
|
68
|
+
raise_error(ArgumentError)
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
context "When a use case #abort during the setup process" do
|
73
|
+
before { @context = Perform::CreatePost.perform }
|
74
|
+
|
75
|
+
it "context should reflect an invalid state" do
|
76
|
+
expect(@context.valid?).to be false
|
77
|
+
end
|
78
|
+
|
79
|
+
it "context should contain only one error" do
|
80
|
+
expect(@context.errors.keys.length).to be 1
|
81
|
+
end
|
82
|
+
|
83
|
+
it "context must not be populated by the #perform methods" do
|
84
|
+
# binding.pry
|
85
|
+
expect(@context.setup.length).to be 2
|
86
|
+
expect(@context.perform.length).to be 0
|
87
|
+
expect(@context.rollback.length).to be 2
|
88
|
+
expect(@context.final.length).to be 6
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
85
94
|
end
|
@@ -1,34 +1,11 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe RestMyCase::DefenseAttorney do
|
3
|
+
describe RestMyCase::DefenseAttorney::Base do
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
class SaveEvent < RestMyCase::Base; end
|
8
|
-
class CreateEvent < RestMyCase::Base
|
9
|
-
depends SaveEvent
|
10
|
-
end
|
11
|
-
class LogEvents < RestMyCase::Base
|
12
|
-
depends BuilEvent, CreateEvent
|
13
|
-
end
|
14
|
-
class AnalyseEvents < RestMyCase::Base; end
|
15
|
-
class BuildPost < RestMyCase::Base; end
|
16
|
-
class SavePost < RestMyCase::Base; end
|
17
|
-
class BuildComments < RestMyCase::Base; end
|
18
|
-
class SaveComments < RestMyCase::Base; end
|
19
|
-
class CreateComments < RestMyCase::Base
|
20
|
-
depends SaveComments
|
21
|
-
end
|
5
|
+
let(:use_cases) do
|
6
|
+
described_class.new(trial_case).build_case_for_the_defendant
|
22
7
|
|
23
|
-
|
24
|
-
depends LogEvents, AnalyseEvents
|
25
|
-
end
|
26
|
-
class CreatePost < UseCaseWrapper
|
27
|
-
depends BuildPost, SavePost
|
28
|
-
end
|
29
|
-
class CreatePostWithComments < CreatePost
|
30
|
-
depends BuildComments, CreateComments
|
31
|
-
end
|
8
|
+
trial_case.use_cases
|
32
9
|
end
|
33
10
|
|
34
11
|
shared_examples "a porper shepherd" do |dependencies|
|
@@ -48,9 +25,7 @@ describe RestMyCase::DefenseAttorney do
|
|
48
25
|
end
|
49
26
|
|
50
27
|
context "When a use case depends on other use cases" do
|
51
|
-
let(:
|
52
|
-
described_class.new(DefenseAttorney::UseCaseWrapper, id: 1).build_trial_case
|
53
|
-
end
|
28
|
+
let(:trial_case) { RestMyCase::TrialCase::Base.new(DefenseAttorney::UseCaseWrapper, id: 1) }
|
54
29
|
|
55
30
|
it_behaves_like "a porper shepherd", [
|
56
31
|
DefenseAttorney::BuilEvent,
|
@@ -63,9 +38,7 @@ describe RestMyCase::DefenseAttorney do
|
|
63
38
|
end
|
64
39
|
|
65
40
|
context "When a use case inherits from another that also has its own dependencies" do
|
66
|
-
let(:
|
67
|
-
described_class.new(DefenseAttorney::CreatePostWithComments, id: 1).build_trial_case
|
68
|
-
end
|
41
|
+
let(:trial_case) { RestMyCase::TrialCase::Base.new DefenseAttorney::CreatePostWithComments, id: 1 }
|
69
42
|
|
70
43
|
it_behaves_like "a porper shepherd", [
|
71
44
|
DefenseAttorney::BuilEvent,
|
@@ -85,6 +58,8 @@ describe RestMyCase::DefenseAttorney do
|
|
85
58
|
end
|
86
59
|
|
87
60
|
context "When general configuration has parent_dependencies_first = false" do
|
61
|
+
let(:trial_case) { RestMyCase::TrialCase::Base.new DefenseAttorney::CreatePostWithComments, id: 1 }
|
62
|
+
|
88
63
|
before do
|
89
64
|
RestMyCase.configure do |config|
|
90
65
|
config.parent_dependencies_first = false
|
@@ -93,10 +68,6 @@ describe RestMyCase::DefenseAttorney do
|
|
93
68
|
|
94
69
|
after { RestMyCase.reset_config }
|
95
70
|
|
96
|
-
let(:use_cases) do
|
97
|
-
described_class.new(DefenseAttorney::CreatePostWithComments, id: 1).build_trial_case
|
98
|
-
end
|
99
|
-
|
100
71
|
it_behaves_like "a porper shepherd", [
|
101
72
|
DefenseAttorney::BuildComments,
|
102
73
|
DefenseAttorney::SaveComments,
|
@@ -117,6 +88,8 @@ describe RestMyCase::DefenseAttorney do
|
|
117
88
|
end
|
118
89
|
|
119
90
|
context "When general configuration has dependencies_first = false" do
|
91
|
+
let(:trial_case) { RestMyCase::TrialCase::Base.new DefenseAttorney::CreatePostWithComments, id: 1 }
|
92
|
+
|
120
93
|
before do
|
121
94
|
RestMyCase.configure do |config|
|
122
95
|
config.dependencies_first = false
|
@@ -125,10 +98,6 @@ describe RestMyCase::DefenseAttorney do
|
|
125
98
|
|
126
99
|
after { RestMyCase.reset_config }
|
127
100
|
|
128
|
-
let(:use_cases) do
|
129
|
-
described_class.new(DefenseAttorney::CreatePostWithComments, id: 1).build_trial_case
|
130
|
-
end
|
131
|
-
|
132
101
|
it_behaves_like "a porper shepherd", [
|
133
102
|
DefenseAttorney::UseCaseWrapper,
|
134
103
|
DefenseAttorney::LogEvents,
|
@@ -147,16 +116,14 @@ describe RestMyCase::DefenseAttorney do
|
|
147
116
|
end
|
148
117
|
|
149
118
|
context "When an use case class configuration has dependencies_first = false" do
|
119
|
+
let(:trial_case) { RestMyCase::TrialCase::Base.new DefenseAttorney::CreatePostWithComments, id: 1 }
|
120
|
+
|
150
121
|
before do
|
151
122
|
DefenseAttorney::UseCaseWrapper.dependencies_first = false
|
152
123
|
end
|
153
124
|
|
154
125
|
after { DefenseAttorney::UseCaseWrapper.dependencies_first = nil }
|
155
126
|
|
156
|
-
let(:use_cases) do
|
157
|
-
described_class.new(DefenseAttorney::CreatePostWithComments, id: 1).build_trial_case
|
158
|
-
end
|
159
|
-
|
160
127
|
it_behaves_like "a porper shepherd", [
|
161
128
|
DefenseAttorney::UseCaseWrapper,
|
162
129
|
DefenseAttorney::BuilEvent,
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe RestMyCase::TrialCase::Base do
|
4
|
+
|
5
|
+
context "When something that doesn't responds to #to_hash is passed down" do
|
6
|
+
it "should raise an exception" do
|
7
|
+
expect { described_class.new(Object, Object.new) }.to \
|
8
|
+
raise_error(ArgumentError)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
12
|
+
context "When nil is passed down" do
|
13
|
+
it "should NOT raise an exception" do
|
14
|
+
expect { described_class.new(Object, nil) }.not_to raise_error
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
context "When nothing is passed down" do
|
19
|
+
it "should NOT raise an exception" do
|
20
|
+
expect { described_class.new(Object) }.not_to raise_error
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
context "When something that responds to #to_hash is passed down" do
|
25
|
+
let(:context) { described_class.new(Object, id: 1, name: '2').context }
|
26
|
+
|
27
|
+
it "should create a context with it" do
|
28
|
+
expect(context).to be_a RestMyCase::TrialCase::Context
|
29
|
+
end
|
30
|
+
|
31
|
+
it "context should contain the attributes passed down" do
|
32
|
+
expect(context.id).to be 1
|
33
|
+
expect(context.name).to eq '2'
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module DefenseAttorney
|
2
|
+
|
3
|
+
class BuilEvent < RestMyCase::Base; end
|
4
|
+
|
5
|
+
class SaveEvent < RestMyCase::Base; end
|
6
|
+
|
7
|
+
class CreateEvent < RestMyCase::Base
|
8
|
+
depends SaveEvent
|
9
|
+
end
|
10
|
+
|
11
|
+
class LogEvents < RestMyCase::Base
|
12
|
+
depends BuilEvent, CreateEvent
|
13
|
+
end
|
14
|
+
|
15
|
+
class AnalyseEvents < RestMyCase::Base; end
|
16
|
+
|
17
|
+
class BuildPost < RestMyCase::Base; end
|
18
|
+
|
19
|
+
class SavePost < RestMyCase::Base; end
|
20
|
+
|
21
|
+
class BuildComments < RestMyCase::Base; end
|
22
|
+
|
23
|
+
class SaveComments < RestMyCase::Base; end
|
24
|
+
|
25
|
+
class CreateComments < RestMyCase::Base
|
26
|
+
depends SaveComments
|
27
|
+
end
|
28
|
+
|
29
|
+
class UseCaseWrapper < RestMyCase::Base
|
30
|
+
depends LogEvents, AnalyseEvents
|
31
|
+
end
|
32
|
+
|
33
|
+
class CreatePost < UseCaseWrapper
|
34
|
+
depends BuildPost, SavePost
|
35
|
+
end
|
36
|
+
|
37
|
+
class CreatePostWithComments < CreatePost
|
38
|
+
depends BuildComments, CreateComments
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
@@ -0,0 +1,128 @@
|
|
1
|
+
module Perform
|
2
|
+
|
3
|
+
class ValidateName < RestMyCase::Base
|
4
|
+
context_reader :name
|
5
|
+
|
6
|
+
def setup
|
7
|
+
fail('no name present!') if name.nil?
|
8
|
+
|
9
|
+
context.setup << self.class.name
|
10
|
+
end
|
11
|
+
|
12
|
+
def perform
|
13
|
+
context.perform << self.class.name
|
14
|
+
end
|
15
|
+
|
16
|
+
def rollback
|
17
|
+
context.rollback << self.class.name
|
18
|
+
end
|
19
|
+
|
20
|
+
def final
|
21
|
+
context.final << self.class.name
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
class ValidateBody < RestMyCase::Base
|
26
|
+
context_reader :body
|
27
|
+
|
28
|
+
def setup
|
29
|
+
fail('no body present!') if body.nil?
|
30
|
+
|
31
|
+
context.setup << self.class.name
|
32
|
+
end
|
33
|
+
|
34
|
+
def perform
|
35
|
+
context.perform << self.class.name
|
36
|
+
end
|
37
|
+
|
38
|
+
def rollback
|
39
|
+
context.rollback << self.class.name
|
40
|
+
end
|
41
|
+
|
42
|
+
def final
|
43
|
+
context.final << self.class.name
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
class Validations < RestMyCase::Base
|
48
|
+
depends ValidateName, ValidateBody
|
49
|
+
|
50
|
+
def setup
|
51
|
+
context.setup << self.class.name
|
52
|
+
end
|
53
|
+
|
54
|
+
def perform
|
55
|
+
context.perform << self.class.name
|
56
|
+
end
|
57
|
+
|
58
|
+
def rollback
|
59
|
+
context.rollback << self.class.name
|
60
|
+
end
|
61
|
+
|
62
|
+
def final
|
63
|
+
context.final << self.class.name
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
class BuildPost < RestMyCase::Base
|
68
|
+
def setup
|
69
|
+
context.setup = []
|
70
|
+
context.perform = []
|
71
|
+
context.rollback = []
|
72
|
+
context.final = []
|
73
|
+
|
74
|
+
context.setup << self.class.name
|
75
|
+
end
|
76
|
+
|
77
|
+
def perform
|
78
|
+
context.perform << self.class.name
|
79
|
+
end
|
80
|
+
|
81
|
+
def rollback
|
82
|
+
context.rollback << self.class.name
|
83
|
+
end
|
84
|
+
|
85
|
+
def final
|
86
|
+
context.final << self.class.name
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
class SavePost < RestMyCase::Base
|
91
|
+
def setup
|
92
|
+
context.setup << self.class.name
|
93
|
+
end
|
94
|
+
|
95
|
+
def perform
|
96
|
+
context.perform << self.class.name
|
97
|
+
end
|
98
|
+
|
99
|
+
def rollback
|
100
|
+
context.rollback << self.class.name
|
101
|
+
end
|
102
|
+
|
103
|
+
def final
|
104
|
+
context.final << self.class.name
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
class CreatePost < RestMyCase::Base
|
109
|
+
depends BuildPost, Validations, SavePost
|
110
|
+
|
111
|
+
def setup
|
112
|
+
context.setup << self.class.name
|
113
|
+
end
|
114
|
+
|
115
|
+
def perform
|
116
|
+
context.perform << self.class.name
|
117
|
+
end
|
118
|
+
|
119
|
+
def rollback
|
120
|
+
context.rollback << self.class.name
|
121
|
+
end
|
122
|
+
|
123
|
+
def final
|
124
|
+
context.final << self.class.name
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module RestMyCaseBase
|
2
|
+
|
3
|
+
class BuildPost < RestMyCase::Base; end
|
4
|
+
|
5
|
+
class ValidateName < RestMyCase::Base
|
6
|
+
def perform; fail('no name present!'); end
|
7
|
+
end
|
8
|
+
|
9
|
+
class ValidateBody < RestMyCase::Base
|
10
|
+
def perform; fail('no body present!'); end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Validations < RestMyCase::Base
|
14
|
+
depends ValidateName, ValidateBody
|
15
|
+
|
16
|
+
self.silence_dependencies_abort = true
|
17
|
+
end
|
18
|
+
|
19
|
+
class SavePost < RestMyCase::Base; end
|
20
|
+
|
21
|
+
class BuildComments < RestMyCase::Base; end
|
22
|
+
|
23
|
+
class SaveComments < RestMyCase::Base; end
|
24
|
+
|
25
|
+
class CreateComments < RestMyCase::Base
|
26
|
+
depends SaveComments
|
27
|
+
end
|
28
|
+
|
29
|
+
class UseCaseWrapper < RestMyCase::Base
|
30
|
+
context_writer :id
|
31
|
+
context_reader :session
|
32
|
+
context_accessor :comment
|
33
|
+
end
|
34
|
+
|
35
|
+
class CreatePost < UseCaseWrapper
|
36
|
+
depends BuildPost, SavePost
|
37
|
+
end
|
38
|
+
|
39
|
+
class CreatePostWithValidations < CreatePost
|
40
|
+
depends Validations
|
41
|
+
end
|
42
|
+
|
43
|
+
class CreatePostWithComments < CreatePost
|
44
|
+
depends BuildComments, CreateComments
|
45
|
+
end
|
46
|
+
|
47
|
+
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rest_my_case
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2
|
4
|
+
version: 1.3.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- goncalvesjoao
|
@@ -83,18 +83,23 @@ files:
|
|
83
83
|
- Rakefile
|
84
84
|
- lib/rest_my_case.rb
|
85
85
|
- lib/rest_my_case/base.rb
|
86
|
-
- lib/rest_my_case/
|
87
|
-
- lib/rest_my_case/
|
88
|
-
- lib/rest_my_case/
|
89
|
-
- lib/rest_my_case/defense_attorney.rb
|
86
|
+
- lib/rest_my_case/config/base.rb
|
87
|
+
- lib/rest_my_case/config/general.rb
|
88
|
+
- lib/rest_my_case/config/shared.rb
|
89
|
+
- lib/rest_my_case/defense_attorney/base.rb
|
90
90
|
- lib/rest_my_case/errors.rb
|
91
|
-
- lib/rest_my_case/
|
91
|
+
- lib/rest_my_case/judge/base.rb
|
92
|
+
- lib/rest_my_case/trial_case/base.rb
|
93
|
+
- lib/rest_my_case/trial_case/context.rb
|
92
94
|
- lib/rest_my_case/version.rb
|
93
95
|
- rest_my_case.gemspec
|
94
96
|
- spec/rest_my_case/base_spec.rb
|
95
|
-
- spec/rest_my_case/
|
96
|
-
- spec/rest_my_case/
|
97
|
+
- spec/rest_my_case/defense_attorney/base_spec.rb
|
98
|
+
- spec/rest_my_case/trial_case/base_spec.rb
|
97
99
|
- spec/spec_helper.rb
|
100
|
+
- spec/support/defense_attorney.rb
|
101
|
+
- spec/support/perform.rb
|
102
|
+
- spec/support/rest_my_case_base.rb
|
98
103
|
homepage: https://github.com/goncalvesjoao/rest_my_case
|
99
104
|
licenses:
|
100
105
|
- MIT
|
@@ -121,6 +126,9 @@ specification_version: 4
|
|
121
126
|
summary: Quick and light "The Clean Architecture" use case implementation.
|
122
127
|
test_files:
|
123
128
|
- spec/rest_my_case/base_spec.rb
|
124
|
-
- spec/rest_my_case/
|
125
|
-
- spec/rest_my_case/
|
129
|
+
- spec/rest_my_case/defense_attorney/base_spec.rb
|
130
|
+
- spec/rest_my_case/trial_case/base_spec.rb
|
126
131
|
- spec/spec_helper.rb
|
132
|
+
- spec/support/defense_attorney.rb
|
133
|
+
- spec/support/perform.rb
|
134
|
+
- spec/support/rest_my_case_base.rb
|
data/lib/rest_my_case/context.rb
DELETED
@@ -1,25 +0,0 @@
|
|
1
|
-
require 'ostruct'
|
2
|
-
|
3
|
-
module RestMyCase
|
4
|
-
|
5
|
-
class Context < OpenStruct
|
6
|
-
|
7
|
-
def errors
|
8
|
-
@errors ||= Hash.new { |hash, key| hash[key] = [] }
|
9
|
-
end
|
10
|
-
|
11
|
-
def valid?
|
12
|
-
errors.empty?
|
13
|
-
end
|
14
|
-
|
15
|
-
alias :ok? :valid?
|
16
|
-
|
17
|
-
def serializable_hash(options = nil)
|
18
|
-
marshal_dump
|
19
|
-
end
|
20
|
-
|
21
|
-
alias :to_hash :serializable_hash
|
22
|
-
|
23
|
-
end
|
24
|
-
|
25
|
-
end
|
@@ -1,58 +0,0 @@
|
|
1
|
-
require "rest_my_case/context"
|
2
|
-
|
3
|
-
module RestMyCase
|
4
|
-
|
5
|
-
class DefenseAttorney
|
6
|
-
|
7
|
-
def initialize(starting_point_use_case, attributes)
|
8
|
-
unless attributes.respond_to?(:to_hash)
|
9
|
-
raise ArgumentError.new('Must respond_to method #to_hash')
|
10
|
-
end
|
11
|
-
|
12
|
-
@shared_context = Context.new attributes.to_hash
|
13
|
-
@starting_point_use_case = starting_point_use_case
|
14
|
-
end
|
15
|
-
|
16
|
-
def build_trial_case
|
17
|
-
all_dependencies(@starting_point_use_case).map do |use_case|
|
18
|
-
use_case.new(@shared_context)
|
19
|
-
end
|
20
|
-
end
|
21
|
-
|
22
|
-
protected ###################### PROTECTED #########################
|
23
|
-
|
24
|
-
def all_dependencies(use_case)
|
25
|
-
return [] unless use_case.respond_to?(:dependencies)
|
26
|
-
|
27
|
-
if RestMyCase.get_config(:parent_dependencies_first, use_case)
|
28
|
-
all_dependencies(use_case.superclass) | deep_dependencies(use_case)
|
29
|
-
else
|
30
|
-
deep_dependencies(use_case) | all_dependencies(use_case.superclass)
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def deep_dependencies(use_case)
|
35
|
-
deep_dependencies = []
|
36
|
-
|
37
|
-
use_case.dependencies.each do |use_case|
|
38
|
-
deep_dependencies.push *all_dependencies(use_case)
|
39
|
-
end
|
40
|
-
|
41
|
-
include_current_use_case(deep_dependencies, use_case)
|
42
|
-
end
|
43
|
-
|
44
|
-
private ####################### PRIVATE ###########################
|
45
|
-
|
46
|
-
def include_current_use_case(dependencies, use_case)
|
47
|
-
return dependencies unless use_case.superclass.respond_to?(:dependencies)
|
48
|
-
|
49
|
-
if RestMyCase.get_config(:dependencies_first, use_case)
|
50
|
-
dependencies.push(use_case)
|
51
|
-
else
|
52
|
-
dependencies.unshift(use_case)
|
53
|
-
end
|
54
|
-
end
|
55
|
-
|
56
|
-
end
|
57
|
-
|
58
|
-
end
|
@@ -1,28 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
describe RestMyCase::Judges::Base do
|
4
|
-
|
5
|
-
describe "#build_use_cases_for_the_defendant" do
|
6
|
-
|
7
|
-
# context "When a use case depends on other use cases" do
|
8
|
-
# before { @result = defense_attorney.build_use_cases_for_the_defendant }
|
9
|
-
# let(:attributes) { { id: 1, comment: 'my comment', session: -1 } }
|
10
|
-
# let(:defense_attorney) do
|
11
|
-
# RestMyCase::DefenseAttorney.new(Comments::Create::Base, attributes)
|
12
|
-
# end
|
13
|
-
|
14
|
-
# it "Should instanciate 3 objects" do
|
15
|
-
# expect(@result.length).to be 3
|
16
|
-
# end
|
17
|
-
|
18
|
-
# it "dass" do
|
19
|
-
# expect(@result[0]).to be_a Comments::Create::BuildComment
|
20
|
-
# expect(@result[1]).to be_a Comments::SaveComment
|
21
|
-
# expect(@result[2]).to be_a Comments::Create::SendEmail
|
22
|
-
# end
|
23
|
-
|
24
|
-
# end
|
25
|
-
|
26
|
-
end
|
27
|
-
|
28
|
-
end
|