grape-app 0.4.3 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: db0ee047b4c798e50070b6453ca7b478d7373228
4
- data.tar.gz: 49fba6382a15f6b213fa7542a46a249f2a2c66a7
3
+ metadata.gz: d769186af82c987daacf3e75c394b06204bc16c2
4
+ data.tar.gz: f770e69d47c41f0592d8cf2e7d148152a860966f
5
5
  SHA512:
6
- metadata.gz: 5ba2fffb0b8629eaad6749aeb6d075ea77eb638f1ea434547796f59ab648671a4a021ae06032c956f7e9d3a2ea384c525cfe2e2fcca80eb9efd60ab3cbef152e
7
- data.tar.gz: da6e86e39a86d94ee7f87def7d6d5cd69b7ec1f74f0e337cd01d90c20dfef1ee5f5b1c8539c8ce651a7da86c74d9262950822e220bddd987af81f03ee077d6d7
6
+ metadata.gz: d41db62c0ff28452f9182e779c2f54cf78475d489d50ad761bd128a779e304d6a8b38aabab3dae6f44b71de804aef051ccbbd57eda0f1b0c67ac8a9024fc38e4
7
+ data.tar.gz: ad80c70d20a27d4abeb444ab29cec562c72117d5567ec22aa7f072c81ee65de21fbfed7598834183abd5b476dfcd71450ba021a92c0e329e4e675f35ede9936d
data/.travis.yml CHANGED
@@ -1,6 +1,6 @@
1
1
  language: ruby
2
2
  sudo: false
3
3
  rvm:
4
- - 2.3.3
5
- - 2.2.6
6
- - 2.4.0
4
+ - 2.3.6
5
+ - 2.4.3
6
+ - 2.5.0
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- grape-app (0.4.3)
4
+ grape-app (0.5.0)
5
5
  activesupport
6
6
  grape
7
7
  grape-entity
@@ -36,35 +36,37 @@ GEM
36
36
  thread_safe (~> 0.3, >= 0.3.1)
37
37
  diff-lcs (1.3)
38
38
  equalizer (0.0.11)
39
- grape (1.0.1)
39
+ grape (1.0.2)
40
40
  activesupport
41
41
  builder
42
42
  mustermann-grape (~> 1.0.0)
43
43
  rack (>= 1.3.0)
44
44
  rack-accept
45
45
  virtus (>= 1.0.0)
46
- grape-entity (0.6.1)
47
- activesupport (>= 5.0.0)
46
+ grape-entity (0.7.1)
47
+ activesupport (>= 4.0)
48
48
  multi_json (>= 1.3.2)
49
- i18n (0.9.1)
49
+ i18n (0.9.3)
50
50
  concurrent-ruby (~> 1.0)
51
51
  ice_nine (0.11.2)
52
- minitest (5.10.3)
53
- multi_json (1.12.2)
52
+ minitest (5.11.3)
53
+ multi_json (1.13.1)
54
54
  mustermann (1.0.1)
55
55
  mustermann-grape (1.0.0)
56
56
  mustermann (~> 1.0.0)
57
- rack (2.0.3)
57
+ rack (2.0.4)
58
58
  rack-accept (0.4.5)
59
59
  rack (>= 0.4)
60
60
  rack-cors (1.0.2)
61
61
  rack-ssl-enforcer (0.2.9)
62
+ rack-test (0.8.2)
63
+ rack (>= 1.0, < 3)
62
64
  rake (12.3.0)
63
65
  rspec (3.7.0)
64
66
  rspec-core (~> 3.7.0)
65
67
  rspec-expectations (~> 3.7.0)
66
68
  rspec-mocks (~> 3.7.0)
67
- rspec-core (3.7.0)
69
+ rspec-core (3.7.1)
68
70
  rspec-support (~> 3.7.0)
69
71
  rspec-expectations (3.7.0)
70
72
  diff-lcs (>= 1.2.0, < 2.0)
@@ -72,7 +74,7 @@ GEM
72
74
  rspec-mocks (3.7.0)
73
75
  diff-lcs (>= 1.2.0, < 2.0)
74
76
  rspec-support (~> 3.7.0)
75
- rspec-support (3.7.0)
77
+ rspec-support (3.7.1)
76
78
  sqlite3 (1.3.13)
77
79
  thor (0.20.0)
78
80
  thread_safe (0.3.6)
@@ -91,9 +93,10 @@ DEPENDENCIES
91
93
  activerecord
92
94
  bundler
93
95
  grape-app!
96
+ rack-test
94
97
  rake
95
98
  rspec
96
99
  sqlite3
97
100
 
98
101
  BUNDLED WITH
99
- 1.16.0
102
+ 1.16.1
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2018 Black Square Media
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md CHANGED
@@ -29,27 +29,3 @@ $ bundle install
29
29
  Use `bundle show [gemname]` to see where a bundled gem is installed.
30
30
  ```
31
31
 
32
- ## Licence
33
-
34
- ```
35
- Copyright (c) 2015 Black Square Media
36
-
37
- Permission is hereby granted, free of charge, to any person obtaining
38
- a copy of this software and associated documentation files (the
39
- "Software"), to deal in the Software without restriction, including
40
- without limitation the rights to use, copy, modify, merge, publish,
41
- distribute, sublicense, and/or sell copies of the Software, and to
42
- permit persons to whom the Software is furnished to do so, subject to
43
- the following conditions:
44
-
45
- The above copyright notice and this permission notice shall be
46
- included in all copies or substantial portions of the Software.
47
-
48
- THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
49
- EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
50
- MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
51
- NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
52
- LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
53
- OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
54
- WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
55
- ```
data/grape-app.gemspec CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = 'grape-app'
5
- s.version = '0.4.3'
5
+ s.version = '0.5.0'
6
6
  s.authors = ['Black Square Media Ltd']
7
7
  s.email = ['info@blacksquaremedia.com']
8
8
  s.summary = %{Stanalone Grape API apps}
@@ -28,6 +28,6 @@ Gem::Specification.new do |s|
28
28
  s.add_development_dependency 'rspec'
29
29
  s.add_development_dependency 'activerecord'
30
30
  s.add_development_dependency 'sqlite3'
31
-
31
+ s.add_development_dependency 'rack-test'
32
32
  end
33
33
 
data/lib/grape/app.rb CHANGED
@@ -9,8 +9,6 @@ require 'rack/cors'
9
9
  require 'rack/ssl-enforcer'
10
10
 
11
11
  class Grape::App < Grape::API
12
- include ActiveSupport::Configurable
13
-
14
12
  class << self
15
13
 
16
14
  # Run initializers
@@ -36,6 +34,20 @@ class Grape::App < Grape::API
36
34
  require_one 'app', 'api'
37
35
  end
38
36
 
37
+ # @return [Grape::App::Configuration] the configuration
38
+ def config
39
+ @_config ||= if respond_to?(:superclass) && superclass.respond_to?(:config)
40
+ superclass.config.inheritable_copy
41
+ else
42
+ Class.new(Grape::App::Configuration).new
43
+ end
44
+ end
45
+
46
+ # Configure the app
47
+ def configure
48
+ yield config
49
+ end
50
+
39
51
  # @return [Pathname] root path
40
52
  def root
41
53
  @root ||= Bundler.root.dup
@@ -55,13 +67,9 @@ class Grape::App < Grape::API
55
67
  def middleware
56
68
  config = self.config
57
69
  @middleware ||= Rack::Builder.new do
70
+ use Rack::Cors, &config.cors if config.cors
58
71
  use Rack::SslEnforcer if config.force_ssl
59
- use Rack::Cors do
60
- allow do
61
- origins *Array.wrap(config.cors_allow_origins)
62
- resource '*', headers: :any, methods: [:get, :post, :options, :delete, :put]
63
- end
64
- end if config.cors_allow_origins
72
+ instance_eval(&config.middleware) if config.middleware
65
73
 
66
74
  run Grape::App
67
75
  end
@@ -82,4 +90,5 @@ class Grape::App < Grape::API
82
90
  end
83
91
  end
84
92
 
93
+ require 'grape/app/configuration'
85
94
  require 'grape/app/helpers'
@@ -0,0 +1,25 @@
1
+ class Grape::App::Configuration < ActiveSupport::InheritableOptions
2
+
3
+ def middleware(&block)
4
+ self.middleware = block if block
5
+ super
6
+ end
7
+
8
+ def cors(&block)
9
+ self.cors = block if block
10
+ super
11
+ end
12
+
13
+ def cors_allow_origins=(value)
14
+ warn "[DEPRECATION] setting `config.cors_allow_origins` is deprecated. Please use `config.cors` with a block instead. [#{caller[0]}]"
15
+
16
+ value = Array.wrap(value)
17
+ self.cors do
18
+ allow do
19
+ origins *value
20
+ resource '*', headers: :any, methods: [:get, :post, :options, :delete, :put]
21
+ end
22
+ end
23
+ end
24
+
25
+ end
@@ -3,8 +3,22 @@ Grape::App.configure do |config|
3
3
  # Force SSL
4
4
  # config.force_ssl = true
5
5
 
6
- # CORS is disabled by default, set to ['*'] to enable for all
7
- # config.cors_allow_origins = nil
6
+ # CORS is disabled by default, please see https://github.com/cyu/rack-cors
7
+ # for configuration options.
8
+ #
9
+ # config.cors do
10
+ # allow do
11
+ # origins '*'
12
+ # resource '*', headers: :any, methods: [:get, :post, :options]
13
+ # end
14
+ # end
15
+
16
+ # Enable custom middleware:
17
+ #
18
+ # config.middleware do
19
+ # use Rack::ETag
20
+ # insert_before Rack::Cors, Rack::ContentLength
21
+ # end
8
22
 
9
23
  # Don't raise errors on missing translations
10
24
  # config.raise_on_missing_translations = false
@@ -1,10 +1,15 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  RSpec.describe Grape::App do
4
+ include Rack::Test::Methods
4
5
 
5
6
  subject { described_class }
6
7
  before { subject.init! File.expand_path('../../scenario', __FILE__) }
7
8
 
9
+ def app
10
+ subject.middleware
11
+ end
12
+
8
13
  it 'should have an env' do
9
14
  expect(subject.env).to be_instance_of(ActiveSupport::StringInquirer)
10
15
  expect(subject.env).to eq("test")
@@ -30,17 +35,38 @@ RSpec.describe Grape::App do
30
35
  end
31
36
 
32
37
  it 'should read env specific initializers' do
33
- expect(subject.config).to eq(
34
- test_specific: true,
35
- raise_on_missing_translations: true,
36
- cors_allow_origins: ["example.com"],
38
+ expect(subject.config).to include(
39
+ :test_specific,
40
+ :raise_on_missing_translations,
41
+ :cors,
42
+ :middleware,
37
43
  )
38
44
  end
39
45
 
40
46
  it 'should prepare middleware' do
41
47
  expect(subject.middleware).to be_instance_of(Rack::Builder)
42
- expect(subject.middleware.send(:instance_variable_get, :@use).size).to eq(1)
48
+ expect(subject.middleware.send(:instance_variable_get, :@use).size).to eq(2)
43
49
  expect(subject.middleware.send(:instance_variable_get, :@run)).to eq(subject)
44
50
  end
45
51
 
52
+ it 'should apply middleware' do
53
+ header 'Origin', 'test.host'
54
+ get '/v1/ok'
55
+ expect(last_response).to be_ok
56
+ expect(last_response.body).to eq(%({"status":"OK"}))
57
+ expect(last_response.headers).to include(
58
+ "Access-Control-Allow-Origin" => "*",
59
+ "X-MyApp" => "true",
60
+ )
61
+
62
+ header 'Origin', 'test.host'
63
+ get '/v1/failing'
64
+ expect(last_response).to be_bad_request
65
+ expect(last_response.body).to eq(%({"error":"bad request"}))
66
+ expect(last_response.headers).to include(
67
+ "Access-Control-Allow-Origin" => "*",
68
+ "X-MyApp" => "true",
69
+ )
70
+ end
71
+
46
72
  end
@@ -0,0 +1,10 @@
1
+ require 'my_lib'
2
+
3
+ module API
4
+ extend ActiveSupport::Autoload
5
+
6
+ autoload :V1
7
+ end
8
+
9
+ # Mount root API to app
10
+ Grape::App.mount API::V1
@@ -0,0 +1,17 @@
1
+ class API::V1 < Grape::API
2
+ version 'v1'
3
+ format :json
4
+
5
+ rescue_from MyLib::BadRequest do |e|
6
+ error!({error: e}, 400)
7
+ end
8
+
9
+ get '/ok' do
10
+ {status: 'OK'}
11
+ end
12
+
13
+ get '/failing' do
14
+ raise MyLib::BadRequest, "bad request"
15
+ end
16
+
17
+ end
@@ -1,5 +1,14 @@
1
1
  Grape::App.configure do |c|
2
2
  c.test_specific = true
3
3
  c.raise_on_missing_translations = true
4
- c.cors_allow_origins = ['example.com']
4
+ c.cors_allow_origins = "x"
5
+ c.cors do
6
+ allow do
7
+ origins '*'
8
+ resource '*', headers: :any, methods: [:get, :post, :options]
9
+ end
10
+ end
11
+ c.middleware do
12
+ use MyLib::Middleware
13
+ end
5
14
  end
@@ -1,2 +1,18 @@
1
1
  class MyLib
2
+ class BadRequest < StandardError
3
+ end
4
+
5
+ class Middleware
6
+
7
+ def initialize(app)
8
+ @app = app
9
+ end
10
+
11
+ def call(env)
12
+ status, headers, body = @app.call(env)
13
+ headers['X-MyApp'] = 'true'
14
+ [status, headers, body]
15
+ end
16
+
17
+ end
2
18
  end
data/spec/spec_helper.rb CHANGED
@@ -1,2 +1,3 @@
1
1
  ENV['RACK_ENV'] ||= "test"
2
2
  require 'grape-app'
3
+ require "rack/test"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: grape-app
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Black Square Media Ltd
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-06 00:00:00.000000000 Z
11
+ date: 2018-02-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: grape
@@ -164,6 +164,20 @@ dependencies:
164
164
  - - ">="
165
165
  - !ruby/object:Gem::Version
166
166
  version: '0'
167
+ - !ruby/object:Gem::Dependency
168
+ name: rack-test
169
+ requirement: !ruby/object:Gem::Requirement
170
+ requirements:
171
+ - - ">="
172
+ - !ruby/object:Gem::Version
173
+ version: '0'
174
+ type: :development
175
+ prerelease: false
176
+ version_requirements: !ruby/object:Gem::Requirement
177
+ requirements:
178
+ - - ">="
179
+ - !ruby/object:Gem::Version
180
+ version: '0'
167
181
  description: ''
168
182
  email:
169
183
  - info@blacksquaremedia.com
@@ -177,6 +191,7 @@ files:
177
191
  - ".travis.yml"
178
192
  - Gemfile
179
193
  - Gemfile.lock
194
+ - LICENSE
180
195
  - README.md
181
196
  - Rakefile
182
197
  - bin/grape-app
@@ -184,6 +199,7 @@ files:
184
199
  - lib/grape-app.rb
185
200
  - lib/grape/app.rb
186
201
  - lib/grape/app/cli.rb
202
+ - lib/grape/app/configuration.rb
187
203
  - lib/grape/app/helpers.rb
188
204
  - lib/grape/app/helpers/params.rb
189
205
  - lib/grape/app/helpers/respond_with.rb
@@ -210,6 +226,8 @@ files:
210
226
  - lib/grape_app.rb
211
227
  - spec/grape/app_spec.rb
212
228
  - spec/scenario/Gemfile
229
+ - spec/scenario/app/api.rb
230
+ - spec/scenario/app/api/v1.rb
213
231
  - spec/scenario/config/database.yml
214
232
  - spec/scenario/config/environments/test.rb
215
233
  - spec/scenario/config/locales/en.yml
@@ -242,6 +260,8 @@ summary: Stanalone Grape API apps
242
260
  test_files:
243
261
  - spec/grape/app_spec.rb
244
262
  - spec/scenario/Gemfile
263
+ - spec/scenario/app/api.rb
264
+ - spec/scenario/app/api/v1.rb
245
265
  - spec/scenario/config/database.yml
246
266
  - spec/scenario/config/environments/test.rb
247
267
  - spec/scenario/config/locales/en.yml