coach 0.2.1 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3258a468d749d86884a028d51d035966dfa925a2
4
- data.tar.gz: c04518e139d26372ee97a8450967d4aa32756989
3
+ metadata.gz: f98b2d520ff9d3365bc21440436f1505c1f691bc
4
+ data.tar.gz: 0ef36903075d6e1339f028c7e41bed7f9ca96ee5
5
5
  SHA512:
6
- metadata.gz: 439c250dce80d2ed7f50a69d8c06aaf4d47e01ba3b25f4c368debfc0ab4431c45c8cf470f0f3377cbdb6043e1604c3c731b116e0134903d986865b06f53f9fc2
7
- data.tar.gz: 01963b88c9e4886cfd523d0da278958a5db70e08e1f1fb96d2c97ba987c30392fe2581a450a613c9ee0f6427390664ba44f1c4b4b90be10efbb092b360eeb017
6
+ metadata.gz: 9356101215b2e311132501a81f609a4ace4a76de13d109ee6fb962ba28303edfc65882b0edd26cc6aef19b1296aa5c023f3e834465feeea115a2e8637b2314fa
7
+ data.tar.gz: 8901071c03b028612902d07b143595bcfc02b187a09da697c5b87c8b4395f9be1fca0105caaa2d2368ade0ae1f07676a1ea4eeee871215c70d01a19b441e242e
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- coach (0.2.1)
4
+ coach (0.2.2)
5
5
  actionpack (~> 4.2)
6
6
  activesupport (~> 4.2)
7
7
 
@@ -101,4 +101,4 @@ DEPENDENCIES
101
101
  rubocop
102
102
 
103
103
  BUNDLED WITH
104
- 1.10.4
104
+ 1.10.5
data/lib/coach/errors.rb CHANGED
@@ -1,9 +1,22 @@
1
1
  module Coach
2
2
  module Errors
3
3
  class MiddlewareDependencyNotMet < StandardError
4
- def initialize(middleware, keys)
5
- super("#{middleware.name} requires keys [#{keys.join(',')}] that are not " \
6
- "provided by the middleware chain")
4
+ def initialize(middleware, previous_chain, missing_keys)
5
+ @middleware = middleware
6
+ @previous_chain = previous_chain
7
+ @missing_keys = missing_keys
8
+
9
+ super("\n\n#{chain_diagram}\n\n#{missing_keys_message}\n\n")
10
+ end
11
+
12
+ def missing_keys_message
13
+ " #{@middleware.name} is missing #{@missing_keys} from above!"
14
+ end
15
+
16
+ def chain_diagram
17
+ @previous_chain.map do |middleware|
18
+ " #{middleware.name} => #{middleware.provided}"
19
+ end.join("\n")
7
20
  end
8
21
  end
9
22
 
data/lib/coach/handler.rb CHANGED
@@ -5,6 +5,10 @@ module Coach
5
5
  def initialize(middleware)
6
6
  @root_item = MiddlewareItem.new(middleware)
7
7
  validate!
8
+ rescue Coach::Errors::MiddlewareDependencyNotMet => error
9
+ # Remove noise of validation stack trace, reset to the handler callsite
10
+ error.backtrace.clear.push(*Thread.current.backtrace)
11
+ raise error
8
12
  end
9
13
 
10
14
  # Run validation on the root of the middleware chain
@@ -2,8 +2,9 @@ require "coach/errors"
2
2
 
3
3
  module Coach
4
4
  class MiddlewareValidator
5
- def initialize(middleware, already_provided = [])
5
+ def initialize(middleware, previous_middlewares = [], already_provided = [])
6
6
  @middleware = middleware
7
+ @previous_middlewares = previous_middlewares.clone
7
8
  @already_provided = already_provided
8
9
  end
9
10
 
@@ -12,7 +13,7 @@ module Coach
12
13
  def validated_provides!
13
14
  if missing_requirements.any?
14
15
  raise Coach::Errors::MiddlewareDependencyNotMet.new(
15
- @middleware, missing_requirements
16
+ @middleware, @previous_middlewares, missing_requirements
16
17
  )
17
18
  end
18
19
 
@@ -21,15 +22,20 @@ module Coach
21
22
 
22
23
  private
23
24
 
25
+ attr_reader :previous_middlewares
26
+
24
27
  def missing_requirements
25
28
  @middleware.requirements - provided_by_chain
26
29
  end
27
30
 
28
31
  def provided_by_chain
29
- @provided_by_chain ||=
30
- middleware_dependencies.reduce(@already_provided) do |provided, middleware|
31
- provided + self.class.new(middleware, provided).validated_provides!
32
- end.flatten.uniq
32
+ @provided_by_chain ||= begin
33
+ initial = [@already_provided, @previous_middlewares]
34
+ middleware_dependencies.reduce(initial) do |(provided, previous), middleware|
35
+ validator = self.class.new(middleware, previous, provided)
36
+ [provided + validator.validated_provides!, previous + [middleware]]
37
+ end.first.flatten.uniq
38
+ end
33
39
  end
34
40
 
35
41
  def middleware_dependencies
data/lib/coach/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Coach
2
- VERSION = '0.2.1'
2
+ VERSION = '0.2.2'
3
3
  end
@@ -56,7 +56,7 @@ describe Coach::MiddlewareValidator do
56
56
  context "at terminal" do
57
57
  before { head_middleware.requires :a, :c }
58
58
 
59
- it { is_expected.to raise_exception(/requires keys \[a,c\]/) }
59
+ it { is_expected.to raise_exception(/missing \[:a, :c\]/) }
60
60
  end
61
61
 
62
62
  context "from unordered middleware" do
@@ -65,7 +65,7 @@ describe Coach::MiddlewareValidator do
65
65
  middleware_b.provides :b
66
66
  end
67
67
 
68
- it { is_expected.to raise_exception(/requires keys \[b\]/) }
68
+ it { is_expected.to raise_exception(/missing \[:b\]/) }
69
69
  end
70
70
  end
71
71
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coach
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.1
4
+ version: 0.2.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - GoCardless
@@ -14,84 +14,84 @@ dependencies:
14
14
  name: actionpack
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ~>
18
18
  - !ruby/object:Gem::Version
19
19
  version: '4.2'
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ~>
25
25
  - !ruby/object:Gem::Version
26
26
  version: '4.2'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: activesupport
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ~>
32
32
  - !ruby/object:Gem::Version
33
33
  version: '4.2'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ~>
39
39
  - !ruby/object:Gem::Version
40
40
  version: '4.2'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - "~>"
45
+ - - ~>
46
46
  - !ruby/object:Gem::Version
47
47
  version: 3.2.0
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - "~>"
52
+ - - ~>
53
53
  - !ruby/object:Gem::Version
54
54
  version: 3.2.0
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rspec-its
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
- - - "~>"
59
+ - - ~>
60
60
  - !ruby/object:Gem::Version
61
61
  version: 1.2.0
62
62
  type: :development
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
- - - "~>"
66
+ - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: 1.2.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: pry
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
- - - ">="
73
+ - - '>='
74
74
  - !ruby/object:Gem::Version
75
75
  version: '0'
76
76
  type: :development
77
77
  prerelease: false
78
78
  version_requirements: !ruby/object:Gem::Requirement
79
79
  requirements:
80
- - - ">="
80
+ - - '>='
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
84
  name: rubocop
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - '>='
88
88
  - !ruby/object:Gem::Version
89
89
  version: '0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - '>='
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  description: Controller framework
@@ -101,10 +101,10 @@ executables: []
101
101
  extensions: []
102
102
  extra_rdoc_files: []
103
103
  files:
104
- - ".gitignore"
105
- - ".rspec"
106
- - ".rubocop.yml"
107
- - ".travis.yml"
104
+ - .gitignore
105
+ - .rspec
106
+ - .rubocop.yml
107
+ - .travis.yml
108
108
  - Gemfile
109
109
  - Gemfile.lock
110
110
  - README.md
@@ -139,12 +139,12 @@ require_paths:
139
139
  - lib
140
140
  required_ruby_version: !ruby/object:Gem::Requirement
141
141
  requirements:
142
- - - ">="
142
+ - - '>='
143
143
  - !ruby/object:Gem::Version
144
144
  version: '0'
145
145
  required_rubygems_version: !ruby/object:Gem::Requirement
146
146
  requirements:
147
- - - ">="
147
+ - - '>='
148
148
  - !ruby/object:Gem::Version
149
149
  version: '0'
150
150
  requirements: []