coach 0.5.2 → 1.0.0

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.
@@ -1,7 +1,7 @@
1
1
  require "coach/middleware"
2
2
 
3
3
  describe Coach::Middleware do
4
- let(:middleware_class) { Class.new(Coach::Middleware) }
4
+ let(:middleware_class) { Class.new(described_class) }
5
5
  let(:context_) { {} }
6
6
  let(:middleware_obj) { middleware_class.new(context_, nil) }
7
7
 
@@ -17,8 +17,10 @@ describe Coach::Middleware do
17
17
  before { middleware_class.provides(:foo, :bar) }
18
18
 
19
19
  it "returns true" do
20
+ # rubocop:disable RSpec/PredicateMatcher
20
21
  expect(middleware_class.provides?(:foo)).to be_truthy
21
22
  expect(middleware_class.provides?(:bar)).to be_truthy
23
+ # rubocop:enable RSpec/PredicateMatcher
22
24
  end
23
25
  end
24
26
 
@@ -26,7 +28,9 @@ describe Coach::Middleware do
26
28
  before { middleware_class.provides(:foo) }
27
29
 
28
30
  it "returns false" do
31
+ # rubocop:disable RSpec/PredicateMatcher
29
32
  expect(middleware_class.provides?(:baz)).to be_falsy
33
+ # rubocop:enable RSpec/PredicateMatcher
30
34
  end
31
35
  end
32
36
  end
@@ -4,12 +4,12 @@ require "coach/middleware_validator"
4
4
  describe Coach::MiddlewareValidator do
5
5
  subject(:validator) { described_class.new(head_middleware, already_provided) }
6
6
 
7
- let(:head_middleware) { build_middleware('Head') }
7
+ let(:head_middleware) { build_middleware("Head") }
8
8
  let(:already_provided) { [] }
9
9
 
10
- let(:middleware_a) { build_middleware('A') }
11
- let(:middleware_b) { build_middleware('B') }
12
- let(:middleware_c) { build_middleware('C') }
10
+ let(:middleware_a) { build_middleware("A") }
11
+ let(:middleware_b) { build_middleware("B") }
12
+ let(:middleware_c) { build_middleware("C") }
13
13
 
14
14
  # head <── a
15
15
  # └─ b <- c
@@ -1,36 +1,37 @@
1
- require 'spec_helper'
2
- require 'coach/notifications'
1
+ require "spec_helper"
2
+ require "coach/notifications"
3
3
 
4
4
  describe Coach::Notifications do
5
5
  subject(:notifications) { described_class.instance }
6
- before { described_class.unsubscribe! }
7
6
 
8
- # Remove need to fully mock a request object
9
7
  before do
8
+ described_class.unsubscribe!
9
+
10
+ # Remove need to fully mock a request object
10
11
  allow(Coach::RequestSerializer).
11
- to receive(:new).and_return(double(serialize: {}))
12
+ to receive(:new).
13
+ and_return(instance_double("Coach::RequestSerializer", serialize: {}))
14
+
15
+ ActiveSupport::Notifications.subscribe(/\.coach$/) do |name, *_, event|
16
+ events << [name, event]
17
+ end
12
18
  end
13
19
 
14
20
  # Capture all Coach events
15
21
  let(:events) { [] }
16
22
  let(:middleware_event) do
17
- event = events.find { |(name, _)| name == 'coach.request' }
23
+ event = events.find { |(name, _)| name == "request.coach" }
18
24
  event && event[1]
19
25
  end
20
- before do
21
- ActiveSupport::Notifications.subscribe(/coach/) do |name, *_, event|
22
- events << [name, event]
23
- end
24
- end
25
26
 
26
27
  # Mock a handler to simulate an endpoint call
27
28
  let(:handler) do
28
- middleware_a = build_middleware('A')
29
- middleware_b = build_middleware('B')
29
+ middleware_a = build_middleware("A")
30
+ middleware_b = build_middleware("B")
30
31
 
31
32
  middleware_a.uses(middleware_b)
32
33
 
33
- terminal_middleware = build_middleware('Terminal')
34
+ terminal_middleware = build_middleware("Terminal")
34
35
  terminal_middleware.uses(middleware_a)
35
36
 
36
37
  Coach::Handler.new(terminal_middleware)
@@ -43,17 +44,17 @@ describe Coach::Notifications do
43
44
  expect(notifications.active?).to be(true)
44
45
  end
45
46
 
46
- it "will now send coach.request" do
47
+ it "will now send request.coach" do
47
48
  handler.call({})
48
- expect(middleware_event).not_to be_nil
49
+ expect(middleware_event).to_not be_nil
49
50
  end
50
51
 
51
- describe "coach.request event" do
52
+ describe "request.coach event" do
52
53
  before { handler.call({}) }
53
54
 
54
55
  it "contains all middleware that have been run" do
55
56
  middleware_names = middleware_event[:chain].map { |item| item[:name] }
56
- expect(middleware_names).to include('Terminal', 'A', 'B')
57
+ expect(middleware_names).to include("Terminal", "A", "B")
57
58
  end
58
59
 
59
60
  it "includes all logged metadata" do
@@ -64,17 +65,17 @@ describe Coach::Notifications do
64
65
  end
65
66
 
66
67
  describe "#unsubscribe!" do
67
- it "should disable any prior subscriptions" do
68
+ it "disables any prior subscriptions" do
68
69
  notifications.subscribe!
69
70
 
70
71
  handler.call({})
71
- expect(events.count { |(name, _)| name == 'coach.request' }).
72
+ expect(events.count { |(name, _)| name == "request.coach" }).
72
73
  to eq(1)
73
74
 
74
75
  notifications.unsubscribe!
75
76
 
76
77
  handler.call({})
77
- expect(events.count { |(name, _)| name == 'coach.request' }).
78
+ expect(events.count { |(name, _)| name == "request.coach" }).
78
79
  to eq(1)
79
80
  end
80
81
  end
@@ -1,8 +1,8 @@
1
- require 'spec_helper'
2
- require 'coach/request_benchmark'
1
+ require "spec_helper"
2
+ require "coach/request_benchmark"
3
3
 
4
4
  describe Coach::RequestBenchmark do
5
- subject(:event) { described_class.new('ENDPOINT') }
5
+ subject(:event) { described_class.new("ENDPOINT") }
6
6
 
7
7
  let(:base_time) { Time.now }
8
8
 
@@ -14,8 +14,8 @@ describe Coach::RequestBenchmark do
14
14
  let(:finish) { base_time + 5 }
15
15
 
16
16
  before do
17
- event.notify('B', b_start, b_finish)
18
- event.notify('A', a_start, a_finish)
17
+ event.notify("B", b_start, b_finish)
18
+ event.notify("A", a_start, a_finish)
19
19
  event.complete(start, finish)
20
20
  end
21
21
 
@@ -35,11 +35,11 @@ describe Coach::RequestBenchmark do
35
35
  end
36
36
 
37
37
  it "computes duration of middleware with no children" do
38
- expect(stats[:chain]).to include(name: 'B', duration: 1000)
38
+ expect(stats[:chain]).to include(name: "B", duration: 1000)
39
39
  end
40
40
 
41
41
  it "adjusts duration of middleware for their children" do
42
- expect(stats[:chain]).to include(name: 'A', duration: 2000)
42
+ expect(stats[:chain]).to include(name: "A", duration: 2000)
43
43
  end
44
44
 
45
45
  it "correctly orders chain" do
@@ -1,12 +1,12 @@
1
- require 'spec_helper'
2
- require 'active_support/core_ext/object/try'
3
- require 'coach/request_serializer'
1
+ require "spec_helper"
2
+ require "active_support/core_ext/object/try"
3
+ require "coach/request_serializer"
4
4
 
5
5
  describe Coach::RequestSerializer do
6
6
  describe ".apply_header_rule" do
7
7
  before { described_class.clear_header_rules! }
8
8
 
9
- let(:header) { 'http_abc' }
9
+ let(:header) { "http_abc" }
10
10
  let(:rule) { nil }
11
11
 
12
12
  context "with header that has a rule that" do
@@ -14,8 +14,8 @@ describe Coach::RequestSerializer do
14
14
 
15
15
  context "does not specify block" do
16
16
  it "replaces blacklisted header with default text" do
17
- sanitized = Coach::RequestSerializer.apply_header_rule(header, 'value')
18
- expect(sanitized).not_to eq('value')
17
+ sanitized = described_class.apply_header_rule(header, "value")
18
+ expect(sanitized).to_not eq("value")
19
19
  end
20
20
  end
21
21
 
@@ -23,20 +23,22 @@ describe Coach::RequestSerializer do
23
23
  let(:rule) { ->(value) { "#{value}#{value}" } }
24
24
 
25
25
  it "uses block to compute new filtered value" do
26
- sanitized = Coach::RequestSerializer.apply_header_rule(header, 'value')
27
- expect(sanitized).to eq('valuevalue')
26
+ sanitized = described_class.apply_header_rule(header, "value")
27
+ expect(sanitized).to eq("valuevalue")
28
28
  end
29
29
  end
30
30
  end
31
31
 
32
32
  context "with header that has no blacklist rule" do
33
33
  it "does not modify value" do
34
- sanitized = Coach::RequestSerializer.apply_header_rule(header, 'value')
35
- expect(sanitized).to eq('value')
34
+ sanitized = described_class.apply_header_rule(header, "value")
35
+ expect(sanitized).to eq("value")
36
36
  end
37
37
  end
38
38
 
39
39
  context "as an instance" do
40
+ subject(:request_serializer) { described_class.new(mock_request) }
41
+
40
42
  let(:mock_request) do
41
43
  instance_double("ActionDispatch::Request", format: nil,
42
44
  remote_ip: nil,
@@ -45,25 +47,23 @@ describe Coach::RequestSerializer do
45
47
  filtered_parameters: nil,
46
48
  filtered_env: {
47
49
  "foo" => "bar",
48
- "HTTP_foo" => "bar"
50
+ "HTTP_foo" => "bar",
49
51
  })
50
52
  end
51
53
 
52
- subject(:request_serializer) { described_class.new(mock_request) }
53
-
54
54
  describe "#serialize" do
55
55
  subject(:serialized) { request_serializer.serialize }
56
56
 
57
57
  it "rescues any exceptions request#fullpath may raise" do
58
58
  allow(mock_request).to receive(:fullpath).and_raise
59
59
 
60
- expect(serialized[:path]).to eq('unknown')
60
+ expect(serialized[:path]).to eq("unknown")
61
61
  end
62
62
 
63
63
  it "filters headers allowing only those prefixed with 'HTTP_'" do
64
64
  allow(mock_request).to receive(:fullpath).and_return(nil)
65
65
 
66
- expect(serialized[:headers]).not_to include("foo")
66
+ expect(serialized[:headers]).to_not include("foo")
67
67
  expect(serialized[:headers]).to include("http_foo")
68
68
  end
69
69
  end
@@ -1,15 +1,12 @@
1
- require 'spec_helper'
1
+ require "spec_helper"
2
2
 
3
- require 'coach/router'
4
- require 'coach/handler'
3
+ require "coach/router"
4
+ require "coach/handler"
5
5
 
6
6
  describe Coach::Router do
7
7
  subject(:router) { described_class.new(mapper) }
8
- let(:mapper) { double(:mapper) }
9
8
 
10
- before do
11
- allow(Coach::Handler).to receive(:new) { |route| route }
12
- end
9
+ let(:mapper) { instance_double("ActionDispatch::Routing::Mapper") }
13
10
 
14
11
  let(:resource_routes) do
15
12
  routes_module = Module.new
@@ -19,6 +16,10 @@ describe Coach::Router do
19
16
  routes_module
20
17
  end
21
18
 
19
+ before do
20
+ allow(Coach::Handler).to receive(:new) { |route| route }
21
+ end
22
+
22
23
  shared_examples "mount action" do |action, params|
23
24
  let(:actions) { [action] }
24
25
 
@@ -35,31 +36,33 @@ describe Coach::Router do
35
36
  end
36
37
 
37
38
  describe "#draw" do
38
- subject(:draw) { router.draw(resource_routes, base: '/resource', actions: actions) }
39
+ subject(:draw) { router.draw(resource_routes, base: "/resource", actions: actions) }
39
40
 
40
41
  context "with default action" do
41
- it_behaves_like "mount action", :index, url: '/resource', method: :get
42
- it_behaves_like "mount action", :show, url: '/resource/:id', method: :get
43
- it_behaves_like "mount action", :create, url: '/resource', method: :post
44
- it_behaves_like "mount action", :update, url: '/resource/:id', method: :put
45
- it_behaves_like "mount action", :destroy, url: '/resource/:id', method: :delete
42
+ it_behaves_like "mount action", :index, url: "/resource", method: :get
43
+ it_behaves_like "mount action", :show, url: "/resource/:id", method: :get
44
+ it_behaves_like "mount action", :create, url: "/resource", method: :post
45
+ it_behaves_like "mount action", :update, url: "/resource/:id", method: :put
46
+ it_behaves_like "mount action", :destroy, url: "/resource/:id", method: :delete
46
47
  end
47
48
 
48
49
  context "with custom action" do
49
50
  let(:actions) { [refund: { method: :post, url: custom_url }] }
50
51
 
51
52
  context "with no slash" do
52
- let(:custom_url) { ':id/refund' }
53
+ let(:custom_url) { ":id/refund" }
54
+
53
55
  it "mounts correct url" do
54
- expect(mapper).to receive(:match).with('/resource/:id/refund', anything)
56
+ expect(mapper).to receive(:match).with("/resource/:id/refund", anything)
55
57
  draw
56
58
  end
57
59
  end
58
60
 
59
61
  context "with multiple /'s" do
60
- let(:custom_url) { '//:id/refund' }
62
+ let(:custom_url) { "//:id/refund" }
63
+
61
64
  it "mounts correct url" do
62
- expect(mapper).to receive(:match).with('/resource/:id/refund', anything)
65
+ expect(mapper).to receive(:match).with("/resource/:id/refund", anything)
63
66
  draw
64
67
  end
65
68
  end
@@ -67,6 +70,7 @@ describe Coach::Router do
67
70
 
68
71
  context "with unknown default action" do
69
72
  let(:actions) { [:unknown] }
73
+
70
74
  it "raises RouterUnknownDefaultAction" do
71
75
  expect { draw }.to raise_error(Coach::Errors::RouterUnknownDefaultAction)
72
76
  end
@@ -1,7 +1,7 @@
1
- require 'rspec/its'
2
- require 'pry'
3
- require 'coach'
4
- require 'coach/rspec'
1
+ require "rspec/its"
2
+ require "pry"
3
+ require "coach"
4
+ require "coach/rspec"
5
5
 
6
6
  RSpec.configure do |config|
7
7
  config.expect_with :rspec do |expectations|
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: coach
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.2
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - GoCardless
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-09-26 00:00:00.000000000 Z
11
+ date: 2018-04-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: actionpack
@@ -39,61 +39,61 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '4.2'
41
41
  - !ruby/object:Gem::Dependency
42
- name: rspec
42
+ name: pry
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: '3.2'
47
+ version: '0.10'
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
- version: '3.2'
54
+ version: '0.10'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rspec-its
56
+ name: rspec
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - "~>"
60
60
  - !ruby/object:Gem::Version
61
- version: '1.2'
61
+ version: '3.2'
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
- version: '1.2'
68
+ version: '3.2'
69
69
  - !ruby/object:Gem::Dependency
70
- name: pry
70
+ name: rspec-its
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - "~>"
74
74
  - !ruby/object:Gem::Version
75
- version: '0.10'
75
+ version: '1.2'
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
- version: '0.10'
82
+ version: '1.2'
83
83
  - !ruby/object:Gem::Dependency
84
- name: rubocop
84
+ name: rspec_junit_formatter
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: 0.50.0
89
+ version: 0.3.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
- version: 0.50.0
96
+ version: 0.3.0
97
97
  description:
98
98
  email:
99
99
  - developers@gocardless.com
@@ -101,10 +101,11 @@ executables: []
101
101
  extensions: []
102
102
  extra_rdoc_files: []
103
103
  files:
104
+ - ".circleci/config.yml"
104
105
  - ".gitignore"
105
106
  - ".rspec"
106
107
  - ".rubocop.yml"
107
- - ".travis.yml"
108
+ - ".rubocop_todo.yml"
108
109
  - CHANGELOG.md
109
110
  - Gemfile
110
111
  - LICENSE.txt
@@ -142,7 +143,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
142
143
  requirements:
143
144
  - - ">="
144
145
  - !ruby/object:Gem::Version
145
- version: '0'
146
+ version: '2.2'
146
147
  required_rubygems_version: !ruby/object:Gem::Requirement
147
148
  requirements:
148
149
  - - ">="
@@ -150,7 +151,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
150
151
  version: '0'
151
152
  requirements: []
152
153
  rubyforge_project:
153
- rubygems_version: 2.6.13
154
+ rubygems_version: 2.7.4
154
155
  signing_key:
155
156
  specification_version: 4
156
157
  summary: Alternative controllers built with middleware