spokes 0.1.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,19 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spokes::Middleware::RequestID, modules: true, middleware: true do
4
+ let(:app) { proc { [200, {}, []] } }
5
+ let(:service_name) { 'nerds' }
6
+ let(:stack) { Spokes::Middleware::RequestID.new(app, service_name: service_name) }
7
+ let(:request) { Rack::MockRequest.new(stack) }
8
+ let(:env_header_name) { 'action_dispatch.request_id' }
9
+
10
+ it 'accepts incoming request ID' do
11
+ response = request.options('/', env_header_name => 'aaaa')
12
+ expect(response.status).to eq(200)
13
+ end
14
+
15
+ it 'generates request id when not present' do
16
+ response = request.options('/')
17
+ expect(response.status).to eq(200)
18
+ end
19
+ end
@@ -0,0 +1,60 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spokes::Middleware::ServiceName, modules: true, middleware: true do
4
+ let(:app) { proc { [200, {}, []] } }
5
+ let(:service_name) { 'nerds' }
6
+ let(:stack) { Spokes::Middleware::ServiceName.new(app, service_name: service_name) }
7
+ let(:stack_exclude_paths) do
8
+ Spokes::Middleware::ServiceName.new(app,
9
+ service_name: service_name,
10
+ exclude_paths: ['/match/:id'])
11
+ end
12
+ let(:request) { Rack::MockRequest.new(stack) }
13
+ let(:request_exclude_paths) { Rack::MockRequest.new(stack_exclude_paths) }
14
+ let(:env_header_name) { 'HTTP_SERVICE_NAME' }
15
+
16
+ it 'errors when the header is not present' do
17
+ response = request.get('/')
18
+ json = MultiJson.load(response.body)
19
+
20
+ expect(response.status).to eq(400)
21
+ expect(response.content_type).to eq('application/json; charset=utf-8')
22
+ expect(json).to have_key('errors')
23
+ expect(json['errors'][0]).to eq('Service-Name is required')
24
+ end
25
+
26
+ it 'errors when the header is invalid' do
27
+ response = request.options('/', env_header_name => 'not,valid')
28
+ json = MultiJson.load(response.body)
29
+
30
+ expect(response.status).to eq(400)
31
+ expect(response.content_type).to eq('application/json; charset=utf-8')
32
+ expect(json).to have_key('errors')
33
+ expect(json['errors'][0]).to eq('Service-Name is invalid')
34
+ end
35
+
36
+ it 'responds normally when the header is valid' do
37
+ response = request.options('/', env_header_name => 'valid')
38
+ expect(response.status).to eq(200)
39
+ end
40
+
41
+ it 'respond with valid if header is invalid but exclude path includes path' do
42
+ response = request_exclude_paths.options('/match/abcd')
43
+ expect(response.status).to eq(200)
44
+ end
45
+
46
+ it 'responds with error 400 if path not included in excludes paths' do
47
+ response = request_exclude_paths.options('/match')
48
+ expect(response.status).to eq(400)
49
+ end
50
+
51
+ it 'responds with error 400 if path not included in excludes paths' do
52
+ response = request_exclude_paths.options('/match?param=1')
53
+ expect(response.status).to eq(400)
54
+ end
55
+
56
+ it 'responds with error 400 if path not included in excludes paths' do
57
+ response = request_exclude_paths.options('/match/')
58
+ expect(response.status).to eq(400)
59
+ end
60
+ end
@@ -0,0 +1,3 @@
1
+ # This file is copied to spec/ when you run 'rails generate rspec:install'
2
+ ENV['RAILS_ENV'] ||= 'test'
3
+ require 'spec_helper'
@@ -0,0 +1,25 @@
1
+ ENV['RAILS_ENV'] = 'test'
2
+ $TEST = true
3
+
4
+ require 'bundler'
5
+ require 'simplecov'
6
+ require 'fileutils'
7
+ require 'rack/test'
8
+ require 'factory_bot'
9
+ require 'multi_json'
10
+
11
+ SimpleCov.start do
12
+ add_filter '.gems'
13
+ add_filter 'spec'
14
+ add_group 'Middleware', ['/spokes/middleware/*']
15
+ add_group 'Config', ['/spokes/config/*']
16
+ add_group 'Versioning', ['/spokes/versioning/*']
17
+ end
18
+
19
+ require_relative '../lib/spokes'
20
+
21
+ RSpec.configure do |config|
22
+ config.include Rack::Test::Methods
23
+ config.include FactoryBot::Syntax::Methods
24
+ config.order = 'random'
25
+ end
@@ -0,0 +1,45 @@
1
+ require 'rails_helper'
2
+
3
+ describe Spokes::Versioning::MinorVersioning do
4
+ let(:klass) do
5
+ klass = Class.new
6
+ expect(klass).to receive(:after_filter)
7
+ klass.send(:include, Spokes::Versioning::MinorVersioning)
8
+ klass
9
+ end
10
+
11
+ let(:controller) do
12
+ controller = klass.new
13
+ allow(controller).to receive(:all_minor_versions).and_return(minor_versions)
14
+ controller
15
+ end
16
+
17
+ let(:header_name) { 'API-Version' }
18
+ let(:default_version) { '2015-03-25' }
19
+ let(:minor_versions) do
20
+ {
21
+ '2015-07-07' => {},
22
+ default_version => { default: true }
23
+ }
24
+ end
25
+ let(:empty_info) { double('request/response info', headers: {}) }
26
+
27
+ it 'uses default version if no version is specified in the header' do
28
+ expect(controller).to receive(:request).and_return(empty_info)
29
+ expect(controller.minor_version).to eq default_version
30
+ end
31
+
32
+ it 'uses the version specified in the header' do
33
+ expected = '2015-07-07'
34
+ request_info = double('request', headers: { header_name => expected })
35
+ expect(controller).to receive(:request).and_return(request_info)
36
+ expect(controller.minor_version).to eq expected
37
+ end
38
+
39
+ it 'sets response header to current version' do
40
+ allow(controller).to receive(:response).and_return(empty_info)
41
+ expect(controller).to receive(:minor_version).and_return(default_version)
42
+ controller.set_minor_version_response_header
43
+ expect(controller.response.headers[header_name]).to eq(default_version)
44
+ end
45
+ end
data/spokes.gemspec ADDED
@@ -0,0 +1,29 @@
1
+ $LOAD_PATH.unshift File.expand_path('../lib', __FILE__)
2
+ require 'spokes/version'
3
+
4
+ Gem::Specification.new do |gem|
5
+ gem.name = 'spokes'
6
+ gem.version = Spokes::VERSION
7
+
8
+ gem.authors = ['Brett Buddin', 'Kevin Haight']
9
+ gem.email = ['kevinjhaight@gmail.com']
10
+ gem.homepage = 'https://github.com/khaight/spokes'
11
+ gem.summary = 'A set of utilities for helping creating apis'
12
+ gem.description = 'Setting up configuration of environment variables, versioning, & other middleware should be easier. This is is a set of utilities to help.'
13
+ gem.license = 'MIT'
14
+
15
+ gem.files = `git ls-files -z`.split("\x0")
16
+ gem.executables = gem.files.grep(%r{^bin/}) { |f| File.basename(f) }
17
+
18
+ gem.add_dependency 'activesupport', '~> 5.1', '>= 5.1.0'
19
+ gem.add_dependency 'multi_json', '~> 1.12', '>= 1.12.1'
20
+
21
+ gem.add_development_dependency 'factory_bot', '~> 4.8'
22
+ gem.add_development_dependency 'rack-test', '~> 0.6', '>= 0.6.2'
23
+ gem.add_development_dependency 'rake', '~> 0.8', '>= 0.8.7'
24
+ gem.add_development_dependency 'rspec', '~> 3.1', '>= 3.1.0'
25
+ gem.add_development_dependency 'rspec-rails', '~> 3.6', '>= 3.6.0'
26
+ gem.add_development_dependency 'rubocop', '~> 0.48.1'
27
+ gem.add_development_dependency 'rubygems-tasks', '~> 0.2.4'
28
+ gem.add_development_dependency 'simplecov', '~> 0.14.1'
29
+ end
metadata ADDED
@@ -0,0 +1,255 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spokes
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Brett Buddin
8
+ - Kevin Haight
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2017-12-05 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: activesupport
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - "~>"
19
+ - !ruby/object:Gem::Version
20
+ version: '5.1'
21
+ - - ">="
22
+ - !ruby/object:Gem::Version
23
+ version: 5.1.0
24
+ type: :runtime
25
+ prerelease: false
26
+ version_requirements: !ruby/object:Gem::Requirement
27
+ requirements:
28
+ - - "~>"
29
+ - !ruby/object:Gem::Version
30
+ version: '5.1'
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 5.1.0
34
+ - !ruby/object:Gem::Dependency
35
+ name: multi_json
36
+ requirement: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '1.12'
41
+ - - ">="
42
+ - !ruby/object:Gem::Version
43
+ version: 1.12.1
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: !ruby/object:Gem::Requirement
47
+ requirements:
48
+ - - "~>"
49
+ - !ruby/object:Gem::Version
50
+ version: '1.12'
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: 1.12.1
54
+ - !ruby/object:Gem::Dependency
55
+ name: factory_bot
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '4.8'
61
+ type: :development
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '4.8'
68
+ - !ruby/object:Gem::Dependency
69
+ name: rack-test
70
+ requirement: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - "~>"
73
+ - !ruby/object:Gem::Version
74
+ version: '0.6'
75
+ - - ">="
76
+ - !ruby/object:Gem::Version
77
+ version: 0.6.2
78
+ type: :development
79
+ prerelease: false
80
+ version_requirements: !ruby/object:Gem::Requirement
81
+ requirements:
82
+ - - "~>"
83
+ - !ruby/object:Gem::Version
84
+ version: '0.6'
85
+ - - ">="
86
+ - !ruby/object:Gem::Version
87
+ version: 0.6.2
88
+ - !ruby/object:Gem::Dependency
89
+ name: rake
90
+ requirement: !ruby/object:Gem::Requirement
91
+ requirements:
92
+ - - "~>"
93
+ - !ruby/object:Gem::Version
94
+ version: '0.8'
95
+ - - ">="
96
+ - !ruby/object:Gem::Version
97
+ version: 0.8.7
98
+ type: :development
99
+ prerelease: false
100
+ version_requirements: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - "~>"
103
+ - !ruby/object:Gem::Version
104
+ version: '0.8'
105
+ - - ">="
106
+ - !ruby/object:Gem::Version
107
+ version: 0.8.7
108
+ - !ruby/object:Gem::Dependency
109
+ name: rspec
110
+ requirement: !ruby/object:Gem::Requirement
111
+ requirements:
112
+ - - "~>"
113
+ - !ruby/object:Gem::Version
114
+ version: '3.1'
115
+ - - ">="
116
+ - !ruby/object:Gem::Version
117
+ version: 3.1.0
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '3.1'
125
+ - - ">="
126
+ - !ruby/object:Gem::Version
127
+ version: 3.1.0
128
+ - !ruby/object:Gem::Dependency
129
+ name: rspec-rails
130
+ requirement: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - "~>"
133
+ - !ruby/object:Gem::Version
134
+ version: '3.6'
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: 3.6.0
138
+ type: :development
139
+ prerelease: false
140
+ version_requirements: !ruby/object:Gem::Requirement
141
+ requirements:
142
+ - - "~>"
143
+ - !ruby/object:Gem::Version
144
+ version: '3.6'
145
+ - - ">="
146
+ - !ruby/object:Gem::Version
147
+ version: 3.6.0
148
+ - !ruby/object:Gem::Dependency
149
+ name: rubocop
150
+ requirement: !ruby/object:Gem::Requirement
151
+ requirements:
152
+ - - "~>"
153
+ - !ruby/object:Gem::Version
154
+ version: 0.48.1
155
+ type: :development
156
+ prerelease: false
157
+ version_requirements: !ruby/object:Gem::Requirement
158
+ requirements:
159
+ - - "~>"
160
+ - !ruby/object:Gem::Version
161
+ version: 0.48.1
162
+ - !ruby/object:Gem::Dependency
163
+ name: rubygems-tasks
164
+ requirement: !ruby/object:Gem::Requirement
165
+ requirements:
166
+ - - "~>"
167
+ - !ruby/object:Gem::Version
168
+ version: 0.2.4
169
+ type: :development
170
+ prerelease: false
171
+ version_requirements: !ruby/object:Gem::Requirement
172
+ requirements:
173
+ - - "~>"
174
+ - !ruby/object:Gem::Version
175
+ version: 0.2.4
176
+ - !ruby/object:Gem::Dependency
177
+ name: simplecov
178
+ requirement: !ruby/object:Gem::Requirement
179
+ requirements:
180
+ - - "~>"
181
+ - !ruby/object:Gem::Version
182
+ version: 0.14.1
183
+ type: :development
184
+ prerelease: false
185
+ version_requirements: !ruby/object:Gem::Requirement
186
+ requirements:
187
+ - - "~>"
188
+ - !ruby/object:Gem::Version
189
+ version: 0.14.1
190
+ description: Setting up configuration of environment variables, versioning, & other
191
+ middleware should be easier. This is is a set of utilities to help.
192
+ email:
193
+ - kevinjhaight@gmail.com
194
+ executables: []
195
+ extensions: []
196
+ extra_rdoc_files: []
197
+ files:
198
+ - ".gitignore"
199
+ - ".rubocop.yml"
200
+ - ".ruby-gemset"
201
+ - ".ruby-version"
202
+ - Gemfile
203
+ - README.md
204
+ - Rakefile
205
+ - lib/spokes.rb
206
+ - lib/spokes/config/env.rb
207
+ - lib/spokes/middleware/concerns/bad_request.rb
208
+ - lib/spokes/middleware/concerns/header_validation.rb
209
+ - lib/spokes/middleware/cors.rb
210
+ - lib/spokes/middleware/health.rb
211
+ - lib/spokes/middleware/request_id.rb
212
+ - lib/spokes/middleware/service_name.rb
213
+ - lib/spokes/version.rb
214
+ - lib/spokes/versioning/config/minor_versions.yml
215
+ - lib/spokes/versioning/minor_versioning.rb
216
+ - lib/spokes/versioning/railtie.rb
217
+ - lib/spokes/versioning/tasks/minor_versioning.rake
218
+ - logo/spokes_logo.png
219
+ - script/cibuild
220
+ - script/postbuild
221
+ - script/test
222
+ - spec/config/env_spec.rb
223
+ - spec/middleware/cors_spec.rb
224
+ - spec/middleware/health_spec.rb
225
+ - spec/middleware/request_id_spec.rb
226
+ - spec/middleware/service_name_spec.rb
227
+ - spec/rails_helper.rb
228
+ - spec/spec_helper.rb
229
+ - spec/versioning/minor_versioning_spec.rb
230
+ - spokes.gemspec
231
+ homepage: https://github.com/khaight/spokes
232
+ licenses:
233
+ - MIT
234
+ metadata: {}
235
+ post_install_message:
236
+ rdoc_options: []
237
+ require_paths:
238
+ - lib
239
+ required_ruby_version: !ruby/object:Gem::Requirement
240
+ requirements:
241
+ - - ">="
242
+ - !ruby/object:Gem::Version
243
+ version: '0'
244
+ required_rubygems_version: !ruby/object:Gem::Requirement
245
+ requirements:
246
+ - - ">="
247
+ - !ruby/object:Gem::Version
248
+ version: '0'
249
+ requirements: []
250
+ rubyforge_project:
251
+ rubygems_version: 2.4.5.1
252
+ signing_key:
253
+ specification_version: 4
254
+ summary: A set of utilities for helping creating apis
255
+ test_files: []