grape 1.6.0 → 1.6.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +18 -0
- data/CONTRIBUTING.md +1 -0
- data/README.md +9 -1
- data/lib/grape/api.rb +12 -0
- data/lib/grape/dry_types.rb +12 -0
- data/lib/grape/dsl/headers.rb +5 -2
- data/lib/grape/dsl/helpers.rb +1 -1
- data/lib/grape/middleware/auth/dsl.rb +7 -1
- data/lib/grape/middleware/base.rb +1 -1
- data/lib/grape/util/json.rb +2 -0
- data/lib/grape/util/strict_hash_configuration.rb +1 -1
- data/lib/grape/validations/types/array_coercer.rb +0 -2
- data/lib/grape/validations/types/dry_type_coercer.rb +1 -10
- data/lib/grape/validations/types/json.rb +0 -2
- data/lib/grape/validations/types/primitive_coercer.rb +5 -7
- data/lib/grape/validations/types/set_coercer.rb +0 -3
- data/lib/grape/validations/types.rb +83 -9
- data/lib/grape/validations/validators/all_or_none_of_validator.rb +16 -0
- data/lib/grape/validations/validators/allow_blank_validator.rb +20 -0
- data/lib/grape/validations/validators/as_validator.rb +14 -0
- data/lib/grape/validations/validators/at_least_one_of_validator.rb +15 -0
- data/lib/grape/validations/validators/base.rb +73 -71
- data/lib/grape/validations/validators/coerce_validator.rb +75 -0
- data/lib/grape/validations/validators/default_validator.rb +51 -0
- data/lib/grape/validations/validators/exactly_one_of_validator.rb +17 -0
- data/lib/grape/validations/validators/except_values_validator.rb +24 -0
- data/lib/grape/validations/validators/multiple_params_base.rb +24 -22
- data/lib/grape/validations/validators/mutual_exclusion_validator.rb +16 -0
- data/lib/grape/validations/validators/presence_validator.rb +15 -0
- data/lib/grape/validations/validators/regexp_validator.rb +16 -0
- data/lib/grape/validations/validators/same_as_validator.rb +29 -0
- data/lib/grape/validations/validators/values_validator.rb +88 -0
- data/lib/grape/version.rb +1 -1
- data/lib/grape.rb +59 -24
- data/spec/grape/api/custom_validations_spec.rb +77 -46
- data/spec/grape/api/deeply_included_options_spec.rb +3 -3
- data/spec/grape/api/defines_boolean_in_params_spec.rb +2 -1
- data/spec/grape/api/invalid_format_spec.rb +2 -0
- data/spec/grape/api/recognize_path_spec.rb +1 -1
- data/spec/grape/api/shared_helpers_exactly_one_of_spec.rb +9 -15
- data/spec/grape/api_remount_spec.rb +16 -15
- data/spec/grape/api_spec.rb +317 -193
- data/spec/grape/dsl/callbacks_spec.rb +1 -0
- data/spec/grape/dsl/headers_spec.rb +39 -9
- data/spec/grape/dsl/helpers_spec.rb +3 -2
- data/spec/grape/dsl/inside_route_spec.rb +6 -4
- data/spec/grape/dsl/logger_spec.rb +16 -18
- data/spec/grape/dsl/middleware_spec.rb +1 -0
- data/spec/grape/dsl/parameters_spec.rb +1 -0
- data/spec/grape/dsl/request_response_spec.rb +1 -0
- data/spec/grape/dsl/routing_spec.rb +9 -6
- data/spec/grape/endpoint/declared_spec.rb +12 -12
- data/spec/grape/endpoint_spec.rb +59 -50
- data/spec/grape/entity_spec.rb +13 -13
- data/spec/grape/exceptions/body_parse_errors_spec.rb +3 -0
- data/spec/grape/exceptions/invalid_accept_header_spec.rb +61 -22
- data/spec/grape/exceptions/validation_errors_spec.rb +13 -10
- data/spec/grape/exceptions/validation_spec.rb +5 -3
- data/spec/grape/extensions/param_builders/hash_spec.rb +7 -7
- data/spec/grape/extensions/param_builders/hash_with_indifferent_access_spec.rb +8 -8
- data/spec/grape/extensions/param_builders/hashie/mash_spec.rb +8 -8
- data/spec/grape/integration/rack_sendfile_spec.rb +1 -1
- data/spec/grape/loading_spec.rb +8 -8
- data/spec/grape/middleware/auth/dsl_spec.rb +14 -5
- data/spec/grape/middleware/auth/strategies_spec.rb +60 -20
- data/spec/grape/middleware/base_spec.rb +24 -15
- data/spec/grape/middleware/error_spec.rb +1 -0
- data/spec/grape/middleware/exception_spec.rb +111 -161
- data/spec/grape/middleware/formatter_spec.rb +25 -4
- data/spec/grape/middleware/globals_spec.rb +7 -4
- data/spec/grape/middleware/stack_spec.rb +11 -11
- data/spec/grape/middleware/versioner/accept_version_header_spec.rb +2 -1
- data/spec/grape/middleware/versioner/header_spec.rb +14 -13
- data/spec/grape/middleware/versioner/param_spec.rb +7 -1
- data/spec/grape/middleware/versioner/path_spec.rb +5 -1
- data/spec/grape/middleware/versioner_spec.rb +1 -1
- data/spec/grape/parser_spec.rb +4 -0
- data/spec/grape/path_spec.rb +52 -52
- data/spec/grape/presenters/presenter_spec.rb +7 -6
- data/spec/grape/request_spec.rb +6 -4
- data/spec/grape/util/inheritable_setting_spec.rb +7 -7
- data/spec/grape/util/inheritable_values_spec.rb +3 -2
- data/spec/grape/util/reverse_stackable_values_spec.rb +3 -1
- data/spec/grape/util/stackable_values_spec.rb +7 -5
- data/spec/grape/validations/instance_behaivour_spec.rb +9 -10
- data/spec/grape/validations/multiple_attributes_iterator_spec.rb +1 -0
- data/spec/grape/validations/params_scope_spec.rb +9 -7
- data/spec/grape/validations/single_attribute_iterator_spec.rb +1 -0
- data/spec/grape/validations/types/primitive_coercer_spec.rb +2 -2
- data/spec/grape/validations/types_spec.rb +8 -8
- data/spec/grape/validations/validators/all_or_none_spec.rb +50 -56
- data/spec/grape/validations/validators/allow_blank_spec.rb +136 -140
- data/spec/grape/validations/validators/at_least_one_of_spec.rb +50 -56
- data/spec/grape/validations/validators/coerce_spec.rb +10 -12
- data/spec/grape/validations/validators/default_spec.rb +72 -78
- data/spec/grape/validations/validators/exactly_one_of_spec.rb +71 -77
- data/spec/grape/validations/validators/except_values_spec.rb +1 -1
- data/spec/grape/validations/validators/mutual_exclusion_spec.rb +71 -77
- data/spec/grape/validations/validators/presence_spec.rb +16 -1
- data/spec/grape/validations/validators/regexp_spec.rb +25 -31
- data/spec/grape/validations/validators/same_as_spec.rb +14 -20
- data/spec/grape/validations/validators/values_spec.rb +172 -171
- data/spec/grape/validations_spec.rb +45 -16
- data/spec/integration/eager_load/eager_load_spec.rb +2 -2
- data/spec/integration/multi_json/json_spec.rb +1 -1
- data/spec/integration/multi_xml/xml_spec.rb +1 -1
- data/spec/shared/versioning_examples.rb +10 -7
- data/spec/spec_helper.rb +11 -1
- metadata +116 -116
- data/lib/grape/validations/types/build_coercer.rb +0 -94
- data/lib/grape/validations/validators/all_or_none.rb +0 -16
- data/lib/grape/validations/validators/allow_blank.rb +0 -18
- data/lib/grape/validations/validators/as.rb +0 -12
- data/lib/grape/validations/validators/at_least_one_of.rb +0 -15
- data/lib/grape/validations/validators/coerce.rb +0 -87
- data/lib/grape/validations/validators/default.rb +0 -49
- data/lib/grape/validations/validators/exactly_one_of.rb +0 -17
- data/lib/grape/validations/validators/except_values.rb +0 -22
- data/lib/grape/validations/validators/mutual_exclusion.rb +0 -16
- data/lib/grape/validations/validators/presence.rb +0 -13
- data/lib/grape/validations/validators/regexp.rb +0 -14
- data/lib/grape/validations/validators/same_as.rb +0 -27
- data/lib/grape/validations/validators/values.rb +0 -86
data/spec/grape/endpoint_spec.rb
CHANGED
@@ -10,32 +10,32 @@ describe Grape::Endpoint do
|
|
10
10
|
end
|
11
11
|
|
12
12
|
describe '.before_each' do
|
13
|
-
after {
|
13
|
+
after { described_class.before_each.clear }
|
14
14
|
|
15
15
|
it 'is settable via block' do
|
16
16
|
block = ->(_endpoint) { 'noop' }
|
17
|
-
|
18
|
-
expect(
|
17
|
+
described_class.before_each(&block)
|
18
|
+
expect(described_class.before_each.first).to eq(block)
|
19
19
|
end
|
20
20
|
|
21
21
|
it 'is settable via reference' do
|
22
22
|
block = ->(_endpoint) { 'noop' }
|
23
|
-
|
24
|
-
expect(
|
23
|
+
described_class.before_each block
|
24
|
+
expect(described_class.before_each.first).to eq(block)
|
25
25
|
end
|
26
26
|
|
27
27
|
it 'is able to override a helper' do
|
28
28
|
subject.get('/') { current_user }
|
29
29
|
expect { get '/' }.to raise_error(NameError)
|
30
30
|
|
31
|
-
|
31
|
+
described_class.before_each do |endpoint|
|
32
32
|
allow(endpoint).to receive(:current_user).and_return('Bob')
|
33
33
|
end
|
34
34
|
|
35
35
|
get '/'
|
36
36
|
expect(last_response.body).to eq('Bob')
|
37
37
|
|
38
|
-
|
38
|
+
described_class.before_each(nil)
|
39
39
|
expect { get '/' }.to raise_error(NameError)
|
40
40
|
end
|
41
41
|
|
@@ -46,18 +46,18 @@ describe Grape::Endpoint do
|
|
46
46
|
end
|
47
47
|
expect { get '/' }.to raise_error(NameError)
|
48
48
|
|
49
|
-
|
49
|
+
described_class.before_each do |endpoint|
|
50
50
|
allow(endpoint).to receive(:current_user).and_return('Bob')
|
51
51
|
end
|
52
52
|
|
53
|
-
|
53
|
+
described_class.before_each do |endpoint|
|
54
54
|
allow(endpoint).to receive(:authenticate_user!).and_return(true)
|
55
55
|
end
|
56
56
|
|
57
57
|
get '/'
|
58
58
|
expect(last_response.body).to eq('Bob')
|
59
59
|
|
60
|
-
|
60
|
+
described_class.before_each(nil)
|
61
61
|
expect { get '/' }.to raise_error(NameError)
|
62
62
|
end
|
63
63
|
end
|
@@ -66,7 +66,7 @@ describe Grape::Endpoint do
|
|
66
66
|
it 'takes a settings stack, options, and a block' do
|
67
67
|
p = proc {}
|
68
68
|
expect do
|
69
|
-
|
69
|
+
described_class.new(Grape::Util::InheritableSetting.new, {
|
70
70
|
path: '/',
|
71
71
|
method: :get
|
72
72
|
}, &p)
|
@@ -77,7 +77,7 @@ describe Grape::Endpoint do
|
|
77
77
|
it 'sets itself in the env upon call' do
|
78
78
|
subject.get('/') { 'Hello world.' }
|
79
79
|
get '/'
|
80
|
-
expect(last_request.env['api.endpoint']).to be_kind_of(
|
80
|
+
expect(last_request.env['api.endpoint']).to be_kind_of(described_class)
|
81
81
|
end
|
82
82
|
|
83
83
|
describe '#status' do
|
@@ -137,6 +137,7 @@ describe Grape::Endpoint do
|
|
137
137
|
headers.to_json
|
138
138
|
end
|
139
139
|
end
|
140
|
+
|
140
141
|
it 'includes request headers' do
|
141
142
|
get '/headers'
|
142
143
|
expect(JSON.parse(last_response.body)).to eq(
|
@@ -144,10 +145,12 @@ describe Grape::Endpoint do
|
|
144
145
|
'Cookie' => ''
|
145
146
|
)
|
146
147
|
end
|
148
|
+
|
147
149
|
it 'includes additional request headers' do
|
148
150
|
get '/headers', nil, 'HTTP_X_GRAPE_CLIENT' => '1'
|
149
151
|
expect(JSON.parse(last_response.body)['X-Grape-Client']).to eq('1')
|
150
152
|
end
|
153
|
+
|
151
154
|
it 'includes headers passed as symbols' do
|
152
155
|
env = Rack::MockRequest.env_for('/headers')
|
153
156
|
env[:HTTP_SYMBOL_HEADER] = 'Goliath passes symbols'
|
@@ -253,7 +256,7 @@ describe Grape::Endpoint do
|
|
253
256
|
|
254
257
|
describe '#params' do
|
255
258
|
context 'default class' do
|
256
|
-
it '
|
259
|
+
it 'is a ActiveSupport::HashWithIndifferentAccess' do
|
257
260
|
subject.get '/foo' do
|
258
261
|
params.class
|
259
262
|
end
|
@@ -339,7 +342,7 @@ describe Grape::Endpoint do
|
|
339
342
|
end
|
340
343
|
|
341
344
|
context 'namespace requirements' do
|
342
|
-
before
|
345
|
+
before do
|
343
346
|
subject.namespace :outer, requirements: { person_email: /abc@(.*).com/ } do
|
344
347
|
get('/:person_email') do
|
345
348
|
params[:person_email]
|
@@ -358,7 +361,7 @@ describe Grape::Endpoint do
|
|
358
361
|
expect(last_response.body).to eq('abc@example.com')
|
359
362
|
end
|
360
363
|
|
361
|
-
it "
|
364
|
+
it "overrides outer namespace's requirements" do
|
362
365
|
get '/outer/inner/someone@testing.wrong/test/1'
|
363
366
|
expect(last_response.status).to eq(404)
|
364
367
|
|
@@ -370,7 +373,7 @@ describe Grape::Endpoint do
|
|
370
373
|
end
|
371
374
|
|
372
375
|
context 'from body parameters' do
|
373
|
-
before
|
376
|
+
before do
|
374
377
|
subject.post '/request_body' do
|
375
378
|
params[:user]
|
376
379
|
end
|
@@ -469,11 +472,11 @@ describe Grape::Endpoint do
|
|
469
472
|
post '/', ::Grape::Json.dump(data: { some: 'payload' }), 'CONTENT_TYPE' => 'application/json'
|
470
473
|
end
|
471
474
|
|
472
|
-
it '
|
475
|
+
it 'does not response with 406 for same type without params' do
|
473
476
|
expect(last_response.status).not_to be 406
|
474
477
|
end
|
475
478
|
|
476
|
-
it '
|
479
|
+
it 'responses with given content type in headers' do
|
477
480
|
expect(last_response.headers['Content-Type']).to eq 'application/json; charset=utf-8'
|
478
481
|
end
|
479
482
|
end
|
@@ -709,16 +712,18 @@ describe Grape::Endpoint do
|
|
709
712
|
describe '.generate_api_method' do
|
710
713
|
it 'raises NameError if the method name is already in use' do
|
711
714
|
expect do
|
712
|
-
|
715
|
+
described_class.generate_api_method('version', &proc {})
|
713
716
|
end.to raise_error(NameError)
|
714
717
|
end
|
718
|
+
|
715
719
|
it 'raises ArgumentError if a block is not given' do
|
716
720
|
expect do
|
717
|
-
|
721
|
+
described_class.generate_api_method('GET without a block method')
|
718
722
|
end.to raise_error(ArgumentError)
|
719
723
|
end
|
724
|
+
|
720
725
|
it 'returns a Proc' do
|
721
|
-
expect(
|
726
|
+
expect(described_class.generate_api_method('GET test for a proc', &proc {})).to be_a Proc
|
722
727
|
end
|
723
728
|
end
|
724
729
|
|
@@ -777,7 +782,7 @@ describe Grape::Endpoint do
|
|
777
782
|
end
|
778
783
|
|
779
784
|
get '/error_filters'
|
780
|
-
expect(last_response.status).to
|
785
|
+
expect(last_response.status).to be 500
|
781
786
|
expect(called).to match_array %w[before before_validation]
|
782
787
|
end
|
783
788
|
|
@@ -786,8 +791,11 @@ describe Grape::Endpoint do
|
|
786
791
|
subject.before { called << 'parent' }
|
787
792
|
subject.namespace :parent do
|
788
793
|
before { called << 'prior' }
|
794
|
+
|
789
795
|
before { error! :oops, 500 }
|
796
|
+
|
790
797
|
before { called << 'subsequent' }
|
798
|
+
|
791
799
|
get :hello do
|
792
800
|
called << :endpoint
|
793
801
|
'Hello!'
|
@@ -795,7 +803,7 @@ describe Grape::Endpoint do
|
|
795
803
|
end
|
796
804
|
|
797
805
|
get '/parent/hello'
|
798
|
-
expect(last_response.status).to
|
806
|
+
expect(last_response.status).to be 500
|
799
807
|
expect(called).to match_array %w[parent prior]
|
800
808
|
end
|
801
809
|
end
|
@@ -806,19 +814,19 @@ describe Grape::Endpoint do
|
|
806
814
|
it 'allows for the anchoring option with a delete method' do
|
807
815
|
subject.send(:delete, '/example', anchor: true) {}
|
808
816
|
send(:delete, '/example/and/some/more')
|
809
|
-
expect(last_response.status).to
|
817
|
+
expect(last_response.status).to be 404
|
810
818
|
end
|
811
819
|
|
812
820
|
it 'anchors paths by default for the delete method' do
|
813
821
|
subject.send(:delete, '/example') {}
|
814
822
|
send(:delete, '/example/and/some/more')
|
815
|
-
expect(last_response.status).to
|
823
|
+
expect(last_response.status).to be 404
|
816
824
|
end
|
817
825
|
|
818
826
|
it 'responds to /example/and/some/more for the non-anchored delete method' do
|
819
827
|
subject.send(:delete, '/example', anchor: false) {}
|
820
828
|
send(:delete, '/example/and/some/more')
|
821
|
-
expect(last_response.status).to
|
829
|
+
expect(last_response.status).to be 204
|
822
830
|
expect(last_response.body).to be_empty
|
823
831
|
end
|
824
832
|
end
|
@@ -830,7 +838,7 @@ describe Grape::Endpoint do
|
|
830
838
|
body 'deleted'
|
831
839
|
end
|
832
840
|
send(:delete, '/example/and/some/more')
|
833
|
-
expect(last_response.status).to
|
841
|
+
expect(last_response.status).to be 200
|
834
842
|
expect(last_response.body).not_to be_empty
|
835
843
|
end
|
836
844
|
end
|
@@ -839,7 +847,7 @@ describe Grape::Endpoint do
|
|
839
847
|
it 'responds to /example delete method' do
|
840
848
|
subject.delete(:example) { 'deleted' }
|
841
849
|
delete '/example'
|
842
|
-
expect(last_response.status).to
|
850
|
+
expect(last_response.status).to be 200
|
843
851
|
expect(last_response.body).not_to be_empty
|
844
852
|
end
|
845
853
|
end
|
@@ -848,7 +856,7 @@ describe Grape::Endpoint do
|
|
848
856
|
it 'responds to /example delete method' do
|
849
857
|
subject.delete(:example) { nil }
|
850
858
|
delete '/example'
|
851
|
-
expect(last_response.status).to
|
859
|
+
expect(last_response.status).to be 204
|
852
860
|
expect(last_response.body).to be_empty
|
853
861
|
end
|
854
862
|
end
|
@@ -857,7 +865,7 @@ describe Grape::Endpoint do
|
|
857
865
|
it 'responds to /example delete method' do
|
858
866
|
subject.delete(:example) { '' }
|
859
867
|
delete '/example'
|
860
|
-
expect(last_response.status).to
|
868
|
+
expect(last_response.status).to be 204
|
861
869
|
expect(last_response.body).to be_empty
|
862
870
|
end
|
863
871
|
end
|
@@ -869,7 +877,7 @@ describe Grape::Endpoint do
|
|
869
877
|
verb
|
870
878
|
end
|
871
879
|
send(verb, '/example/and/some/more')
|
872
|
-
expect(last_response.status).to
|
880
|
+
expect(last_response.status).to be 404
|
873
881
|
end
|
874
882
|
|
875
883
|
it "anchors paths by default for the #{verb.upcase} method" do
|
@@ -877,7 +885,7 @@ describe Grape::Endpoint do
|
|
877
885
|
verb
|
878
886
|
end
|
879
887
|
send(verb, '/example/and/some/more')
|
880
|
-
expect(last_response.status).to
|
888
|
+
expect(last_response.status).to be 404
|
881
889
|
end
|
882
890
|
|
883
891
|
it "responds to /example/and/some/more for the non-anchored #{verb.upcase} method" do
|
@@ -900,8 +908,9 @@ describe Grape::Endpoint do
|
|
900
908
|
get '/url'
|
901
909
|
expect(last_response.body).to eq('http://example.org/url')
|
902
910
|
end
|
911
|
+
|
903
912
|
['v1', :v1].each do |version|
|
904
|
-
it "
|
913
|
+
it "includes version #{version}" do
|
905
914
|
subject.version version, using: :path
|
906
915
|
subject.get('/url') do
|
907
916
|
request.url
|
@@ -910,7 +919,7 @@ describe Grape::Endpoint do
|
|
910
919
|
expect(last_response.body).to eq("http://example.org/#{version}/url")
|
911
920
|
end
|
912
921
|
end
|
913
|
-
it '
|
922
|
+
it 'includes prefix' do
|
914
923
|
subject.version 'v1', using: :path
|
915
924
|
subject.prefix 'api'
|
916
925
|
subject.get('/url') do
|
@@ -1000,26 +1009,26 @@ describe Grape::Endpoint do
|
|
1000
1009
|
|
1001
1010
|
# In order that the events finalized (time each block ended)
|
1002
1011
|
expect(@events).to contain_exactly(
|
1003
|
-
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(
|
1012
|
+
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(described_class),
|
1004
1013
|
filters: a_collection_containing_exactly(an_instance_of(Proc)),
|
1005
1014
|
type: :before }),
|
1006
|
-
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(
|
1015
|
+
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(described_class),
|
1007
1016
|
filters: [],
|
1008
1017
|
type: :before_validation }),
|
1009
|
-
have_attributes(name: 'endpoint_run_validators.grape', payload: { endpoint: a_kind_of(
|
1018
|
+
have_attributes(name: 'endpoint_run_validators.grape', payload: { endpoint: a_kind_of(described_class),
|
1010
1019
|
validators: [],
|
1011
1020
|
request: a_kind_of(Grape::Request) }),
|
1012
|
-
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(
|
1021
|
+
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(described_class),
|
1013
1022
|
filters: [],
|
1014
1023
|
type: :after_validation }),
|
1015
|
-
have_attributes(name: 'endpoint_render.grape', payload: { endpoint: a_kind_of(
|
1016
|
-
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(
|
1024
|
+
have_attributes(name: 'endpoint_render.grape', payload: { endpoint: a_kind_of(described_class) }),
|
1025
|
+
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(described_class),
|
1017
1026
|
filters: [],
|
1018
1027
|
type: :after }),
|
1019
|
-
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(
|
1028
|
+
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(described_class),
|
1020
1029
|
filters: [],
|
1021
1030
|
type: :finally }),
|
1022
|
-
have_attributes(name: 'endpoint_run.grape', payload: { endpoint: a_kind_of(
|
1031
|
+
have_attributes(name: 'endpoint_run.grape', payload: { endpoint: a_kind_of(described_class),
|
1023
1032
|
env: an_instance_of(Hash) }),
|
1024
1033
|
have_attributes(name: 'format_response.grape', payload: { env: an_instance_of(Hash),
|
1025
1034
|
formatter: a_kind_of(Module) })
|
@@ -1027,25 +1036,25 @@ describe Grape::Endpoint do
|
|
1027
1036
|
|
1028
1037
|
# In order that events were initialized
|
1029
1038
|
expect(@events.sort_by(&:time)).to contain_exactly(
|
1030
|
-
have_attributes(name: 'endpoint_run.grape', payload: { endpoint: a_kind_of(
|
1039
|
+
have_attributes(name: 'endpoint_run.grape', payload: { endpoint: a_kind_of(described_class),
|
1031
1040
|
env: an_instance_of(Hash) }),
|
1032
|
-
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(
|
1041
|
+
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(described_class),
|
1033
1042
|
filters: a_collection_containing_exactly(an_instance_of(Proc)),
|
1034
1043
|
type: :before }),
|
1035
|
-
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(
|
1044
|
+
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(described_class),
|
1036
1045
|
filters: [],
|
1037
1046
|
type: :before_validation }),
|
1038
|
-
have_attributes(name: 'endpoint_run_validators.grape', payload: { endpoint: a_kind_of(
|
1047
|
+
have_attributes(name: 'endpoint_run_validators.grape', payload: { endpoint: a_kind_of(described_class),
|
1039
1048
|
validators: [],
|
1040
1049
|
request: a_kind_of(Grape::Request) }),
|
1041
|
-
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(
|
1050
|
+
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(described_class),
|
1042
1051
|
filters: [],
|
1043
1052
|
type: :after_validation }),
|
1044
|
-
have_attributes(name: 'endpoint_render.grape', payload: { endpoint: a_kind_of(
|
1045
|
-
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(
|
1053
|
+
have_attributes(name: 'endpoint_render.grape', payload: { endpoint: a_kind_of(described_class) }),
|
1054
|
+
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(described_class),
|
1046
1055
|
filters: [],
|
1047
1056
|
type: :after }),
|
1048
|
-
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(
|
1057
|
+
have_attributes(name: 'endpoint_run_filters.grape', payload: { endpoint: a_kind_of(described_class),
|
1049
1058
|
filters: [],
|
1050
1059
|
type: :finally }),
|
1051
1060
|
have_attributes(name: 'format_response.grape', payload: { env: an_instance_of(Hash),
|
data/spec/grape/entity_spec.rb
CHANGED
@@ -32,7 +32,7 @@ describe Grape::Entity do
|
|
32
32
|
end
|
33
33
|
|
34
34
|
it 'pulls a representation from the class options if it exists' do
|
35
|
-
entity = Class.new(
|
35
|
+
entity = Class.new(described_class)
|
36
36
|
allow(entity).to receive(:represent).and_return('Hiya')
|
37
37
|
|
38
38
|
subject.represent Object, with: entity
|
@@ -44,7 +44,7 @@ describe Grape::Entity do
|
|
44
44
|
end
|
45
45
|
|
46
46
|
it 'pulls a representation from the class options if the presented object is a collection of objects' do
|
47
|
-
entity = Class.new(
|
47
|
+
entity = Class.new(described_class)
|
48
48
|
allow(entity).to receive(:represent).and_return('Hiya')
|
49
49
|
|
50
50
|
module EntitySpec
|
@@ -75,7 +75,7 @@ describe Grape::Entity do
|
|
75
75
|
end
|
76
76
|
|
77
77
|
it 'pulls a representation from the class ancestor if it exists' do
|
78
|
-
entity = Class.new(
|
78
|
+
entity = Class.new(described_class)
|
79
79
|
allow(entity).to receive(:represent).and_return('Hiya')
|
80
80
|
|
81
81
|
subclass = Class.new(Object)
|
@@ -90,7 +90,7 @@ describe Grape::Entity do
|
|
90
90
|
|
91
91
|
it 'automatically uses Klass::Entity if that exists' do
|
92
92
|
some_model = Class.new
|
93
|
-
entity = Class.new(
|
93
|
+
entity = Class.new(described_class)
|
94
94
|
allow(entity).to receive(:represent).and_return('Auto-detect!')
|
95
95
|
|
96
96
|
some_model.const_set :Entity, entity
|
@@ -104,7 +104,7 @@ describe Grape::Entity do
|
|
104
104
|
|
105
105
|
it 'automatically uses Klass::Entity based on the first object in the collection being presented' do
|
106
106
|
some_model = Class.new
|
107
|
-
entity = Class.new(
|
107
|
+
entity = Class.new(described_class)
|
108
108
|
allow(entity).to receive(:represent).and_return('Auto-detect!')
|
109
109
|
|
110
110
|
some_model.const_set :Entity, entity
|
@@ -117,7 +117,7 @@ describe Grape::Entity do
|
|
117
117
|
end
|
118
118
|
|
119
119
|
it 'does not run autodetection for Entity when explicitly provided' do
|
120
|
-
entity = Class.new(
|
120
|
+
entity = Class.new(described_class)
|
121
121
|
some_array = []
|
122
122
|
|
123
123
|
subject.get '/example' do
|
@@ -129,7 +129,7 @@ describe Grape::Entity do
|
|
129
129
|
end
|
130
130
|
|
131
131
|
it 'does not use #first method on ActiveRecord::Relation to prevent needless sql query' do
|
132
|
-
entity = Class.new(
|
132
|
+
entity = Class.new(described_class)
|
133
133
|
some_relation = Class.new
|
134
134
|
some_model = Class.new
|
135
135
|
|
@@ -173,7 +173,7 @@ describe Grape::Entity do
|
|
173
173
|
|
174
174
|
%i[json serializable_hash].each do |format|
|
175
175
|
it "presents with #{format}" do
|
176
|
-
entity = Class.new(
|
176
|
+
entity = Class.new(described_class)
|
177
177
|
entity.root 'examples', 'example'
|
178
178
|
entity.expose :id
|
179
179
|
|
@@ -195,7 +195,7 @@ describe Grape::Entity do
|
|
195
195
|
end
|
196
196
|
|
197
197
|
it "presents with #{format} collection" do
|
198
|
-
entity = Class.new(
|
198
|
+
entity = Class.new(described_class)
|
199
199
|
entity.root 'examples', 'example'
|
200
200
|
entity.expose :id
|
201
201
|
|
@@ -219,7 +219,7 @@ describe Grape::Entity do
|
|
219
219
|
end
|
220
220
|
|
221
221
|
it 'presents with xml' do
|
222
|
-
entity = Class.new(
|
222
|
+
entity = Class.new(described_class)
|
223
223
|
entity.root 'examples', 'example'
|
224
224
|
entity.expose :name
|
225
225
|
|
@@ -249,7 +249,7 @@ describe Grape::Entity do
|
|
249
249
|
end
|
250
250
|
|
251
251
|
it 'presents with json' do
|
252
|
-
entity = Class.new(
|
252
|
+
entity = Class.new(described_class)
|
253
253
|
entity.root 'examples', 'example'
|
254
254
|
entity.expose :name
|
255
255
|
|
@@ -275,7 +275,7 @@ describe Grape::Entity do
|
|
275
275
|
# Include JSONP middleware
|
276
276
|
subject.use Rack::JSONP
|
277
277
|
|
278
|
-
entity = Class.new(
|
278
|
+
entity = Class.new(described_class)
|
279
279
|
entity.root 'examples', 'example'
|
280
280
|
entity.expose :name
|
281
281
|
|
@@ -315,7 +315,7 @@ describe Grape::Entity do
|
|
315
315
|
user1 = user.new(name: 'user1')
|
316
316
|
user2 = user.new(name: 'user2')
|
317
317
|
|
318
|
-
entity = Class.new(
|
318
|
+
entity = Class.new(described_class)
|
319
319
|
entity.expose :name
|
320
320
|
|
321
321
|
subject.format :json
|
@@ -5,6 +5,7 @@ require 'spec_helper'
|
|
5
5
|
describe Grape::Exceptions::ValidationErrors do
|
6
6
|
context 'api with rescue_from :all handler' do
|
7
7
|
subject { Class.new(Grape::API) }
|
8
|
+
|
8
9
|
before do
|
9
10
|
subject.rescue_from :all do |_e|
|
10
11
|
rack_response 'message was processed', 400
|
@@ -56,6 +57,7 @@ describe Grape::Exceptions::ValidationErrors do
|
|
56
57
|
|
57
58
|
context 'api with rescue_from :grape_exceptions handler' do
|
58
59
|
subject { Class.new(Grape::API) }
|
60
|
+
|
59
61
|
before do
|
60
62
|
subject.rescue_from :all do |_e|
|
61
63
|
rack_response 'message was processed', 400
|
@@ -93,6 +95,7 @@ describe Grape::Exceptions::ValidationErrors do
|
|
93
95
|
|
94
96
|
context 'api without a rescue handler' do
|
95
97
|
subject { Class.new(Grape::API) }
|
98
|
+
|
96
99
|
before do
|
97
100
|
subject.params do
|
98
101
|
requires :beer
|