introspective_grape 0.3.2 → 0.3.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.rubocop.yml +1 -1
- data/.travis.yml +16 -3
- data/CHANGELOG.md +16 -8
- data/README.md +6 -6
- data/gemfiles/2.0.0-Gemfile +1 -1
- data/gemfiles/Gemfile.rails.3.2.22 +1 -1
- data/gemfiles/Gemfile.rails.4.1.13 +1 -1
- data/gemfiles/Gemfile.rails.4.2.7.1 +1 -1
- data/gemfiles/Gemfile.rails.4.2.7.1.new.swagger +1 -1
- data/gemfiles/Gemfile.rails.4.2.8 +1 -1
- data/gemfiles/Gemfile.rails.5.0.1 +1 -1
- data/gemfiles/Gemfile.rails.master +1 -1
- data/introspective_grape.gemspec +2 -2
- data/lib/introspective_grape/api.rb +16 -16
- data/lib/introspective_grape/camel_snake.rb +5 -4
- data/lib/introspective_grape/filters.rb +2 -2
- data/lib/introspective_grape/formatter/camel_json.rb +12 -9
- data/lib/introspective_grape/helpers.rb +3 -3
- data/lib/introspective_grape/snake_params.rb +2 -1
- data/lib/introspective_grape/traversal.rb +5 -5
- data/lib/introspective_grape/validators.rb +1 -1
- data/lib/introspective_grape/version.rb +1 -1
- data/spec/dummy/app/api/dummy/chat_api.rb +4 -4
- data/spec/dummy/app/api/dummy/company_api.rb +1 -1
- data/spec/dummy/app/api/dummy/location_api.rb +2 -2
- data/spec/dummy/app/api/dummy/project_api.rb +1 -1
- data/spec/dummy/app/api/dummy/sessions.rb +3 -3
- data/spec/dummy/app/api/dummy/user_api.rb +1 -1
- data/spec/dummy/app/api/dummy_api.rb +0 -3
- data/spec/dummy/app/api/error_handlers.rb +2 -2
- data/spec/dummy/app/models/admin_user.rb +1 -1
- data/spec/dummy/app/models/chat.rb +1 -1
- data/spec/dummy/app/models/chat_message.rb +1 -1
- data/spec/dummy/app/models/chat_user.rb +1 -1
- data/spec/dummy/app/models/company.rb +1 -1
- data/spec/dummy/app/models/image.rb +1 -1
- data/spec/dummy/app/models/project.rb +1 -1
- data/spec/dummy/app/models/user.rb +1 -1
- data/spec/dummy/app/models/user/chatter.rb +4 -4
- data/spec/dummy/app/models/user_location.rb +4 -4
- data/spec/dummy/app/policies/location_policy.rb +1 -1
- data/spec/dummy/app/policies/project_policy.rb +5 -5
- data/spec/dummy/app/policies/role_policy.rb +2 -2
- data/spec/dummy/app/policies/user_policy.rb +1 -1
- data/spec/dummy/db/migrate/20150414213154_add_user_authentication_token.rb +1 -1
- data/spec/dummy/db/migrate/20150601212924_create_location_beacons.rb +1 -1
- data/spec/dummy/db/migrate/20150616205336_add_role_user_constraint.rb +1 -1
- data/spec/dummy/db/migrate/20150727214950_add_confirmable_to_devise.rb +1 -1
- data/spec/dummy/db/migrate/20150820190524_add_user_names.rb +2 -2
- data/spec/models/project_spec.rb +3 -3
- data/spec/models/role_spec.rb +6 -6
- data/spec/models/team_spec.rb +2 -2
- data/spec/models/team_user_spec.rb +4 -4
- data/spec/models/user_location_spec.rb +1 -1
- data/spec/models/user_project_job_spec.rb +2 -2
- data/spec/models/user_spec.rb +10 -10
- data/spec/requests/chat_api_spec.rb +7 -7
- data/spec/requests/company_api_spec.rb +4 -4
- data/spec/requests/location_api_spec.rb +10 -10
- data/spec/requests/project_api_spec.rb +18 -18
- data/spec/requests/role_api_spec.rb +1 -1
- data/spec/requests/sessions_api_spec.rb +3 -3
- data/spec/requests/swagger_spec.rb +1 -1
- data/spec/requests/user_api_spec.rb +13 -13
- data/spec/support/blueprints.rb +10 -10
- data/spec/support/location_helper.rb +6 -6
- data/spec/support/request_helpers.rb +4 -3
- metadata +6 -10
- data/lib/.DS_Store +0 -0
- data/spec/.DS_Store +0 -0
- data/spec/dummy/app/api/.DS_Store +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: de6a41c1400168ecda38b06734cdd3678071328a
|
4
|
+
data.tar.gz: ce20e1fc247df07463068dade8bc7e6ccfeb4e7c
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6cd190fef2c67c05f7e6f472458686d347f1e70d64960f3909439203b032627e899ecdce9966a81046e08eb164007b91cf13a35b62555cf144c43e3d3b9f2c0e
|
7
|
+
data.tar.gz: 256ae7c47d140a34431bdb400b24ae703d25a48ded09e8639c54a4ca5cacf7f3f5ea50602226b8bb2510f15013df90763a9d56e141f9fcef1683d944b30e99be
|
data/.rubocop.yml
CHANGED
data/.travis.yml
CHANGED
@@ -12,11 +12,12 @@ rvm:
|
|
12
12
|
- 2.2.0
|
13
13
|
- 2.2.6
|
14
14
|
- 2.3.0
|
15
|
+
- 2.4.0
|
15
16
|
- ruby-head
|
16
17
|
- jruby-head
|
17
18
|
gemfile:
|
18
|
-
# - gemfiles/Gemfile.rails.3.2.22
|
19
|
-
|
19
|
+
# - gemfiles/Gemfile.rails.3.2.22
|
20
|
+
# - gemfiles/Gemfile.rails.4.1.13
|
20
21
|
- gemfiles/Gemfile.rails.4.2.7.1
|
21
22
|
- gemfiles/Gemfile.rails.4.2.7.1.new.swagger
|
22
23
|
- gemfiles/Gemfile.rails.4.2.8
|
@@ -50,6 +51,10 @@ matrix:
|
|
50
51
|
gemfile: gemfiles/Gemfile.rails.5.0.1
|
51
52
|
- rvm: 2.2.0
|
52
53
|
gemfile: gemfiles/Gemfile.rails.master
|
54
|
+
- rvm: 2.4.0
|
55
|
+
gemfile: gemfiles/Gemfile.rails.4.2.7.1
|
56
|
+
- rvm: 2.4.0
|
57
|
+
gemfile: gemfiles/Gemfile.rails.4.2.7.1.new.swagger
|
53
58
|
- rvm: jruby-9.0.4.0
|
54
59
|
gemfile: gemfiles/Gemfile.rails.4.2.7.1.new.swagger
|
55
60
|
- rvm: jruby-9.0.4.0
|
@@ -58,6 +63,14 @@ matrix:
|
|
58
63
|
gemfile: gemfiles/Gemfile.rails.5.0.1
|
59
64
|
- rvm: jruby-9.0.4.0
|
60
65
|
gemfile: gemfiles/Gemfile.rails.master
|
66
|
+
- rvm: ruby-head
|
67
|
+
gemfile: gemfiles/Gemfile.rails.4.2.7.1
|
68
|
+
- rvm: ruby-head
|
69
|
+
gemfile: gemfiles/Gemfile.rails.4.2.7.1.new.swagger
|
70
|
+
- rvm: jruby-head
|
71
|
+
gemfile: gemfiles/Gemfile.rails.4.2.7.1
|
72
|
+
- rvm: jruby-head
|
73
|
+
gemfile: gemfiles/Gemfile.rails.4.2.7.1.new.swagger
|
61
74
|
allow_failures:
|
62
75
|
- rvm: ruby-head
|
63
76
|
- rvm: jruby-head
|
@@ -67,7 +80,7 @@ env:
|
|
67
80
|
- JRUBY_OPTS="-J-Xmx1024m --debug"
|
68
81
|
|
69
82
|
notifications:
|
70
|
-
email:
|
83
|
+
email:
|
71
84
|
recipients:
|
72
85
|
- buermann@gmail.com
|
73
86
|
on_success: change
|
data/CHANGELOG.md
CHANGED
@@ -1,17 +1,25 @@
|
|
1
1
|
|
2
|
+
0.2.9 04/06/2017
|
3
|
+
================
|
4
|
+
|
5
|
+
Update to camel_snake_json >=0.0.5, which switches from monkey patching everything that includes Enumerable to using refinements, like a good neighbor. Use the class methods instead so we can continue to ostensibly support JRuby, like a good neighbor.
|
6
|
+
|
7
|
+
Simplify the logic in the CamelJson formatter for determining whether to parse the json representation of the object before camelizing it.
|
8
|
+
|
9
|
+
|
2
10
|
0.2.8 01/22/2017
|
3
|
-
|
11
|
+
================
|
4
12
|
|
5
13
|
Nested endpoints for creating new associations will now return only the newly created records.
|
6
14
|
|
7
15
|
0.2.7 01/18/2017
|
8
|
-
|
16
|
+
================
|
9
17
|
|
10
18
|
Add support for Swagger 2+, we can now support the latest versions of grape and other dependencies.
|
11
19
|
|
12
20
|
|
13
21
|
0.2.6 11/01/2016
|
14
|
-
|
22
|
+
================
|
15
23
|
|
16
24
|
Change the Model.attribute_param_types class method lookup (for specifying custom param types attributes on a model) to "grape_param_types" to make it clearer that the method is used in the API.
|
17
25
|
|
@@ -23,14 +31,14 @@ Add custom validators to verify that JSON strings parse as a JSON object, an arr
|
|
23
31
|
|
24
32
|
|
25
33
|
0.2.5 10/28/2016
|
26
|
-
|
34
|
+
================
|
27
35
|
|
28
36
|
### Bug Fix
|
29
37
|
|
30
38
|
Include the nested model IDs in the swagger doc.
|
31
39
|
|
32
40
|
0.2.4 10/26/2016
|
33
|
-
|
41
|
+
================
|
34
42
|
|
35
43
|
### Bug Fix
|
36
44
|
|
@@ -85,11 +93,11 @@ class MyModel
|
|
85
93
|
def my_filter(filter=false)
|
86
94
|
filter ? my_scope : where(nil)
|
87
95
|
end
|
88
|
-
|
96
|
+
|
89
97
|
def my_field=(parameters)
|
90
98
|
# parse the passed parameters in some fancy way and return a query scope
|
91
99
|
end
|
92
|
-
end
|
100
|
+
end
|
93
101
|
end
|
94
102
|
|
95
103
|
0.1.9 9/27/2016
|
@@ -136,7 +144,7 @@ Added an include_actions declaration as the inverse of exclude_actions.
|
|
136
144
|
|
137
145
|
### Features
|
138
146
|
|
139
|
-
Stop monkey patching Grape's json formatter and instead use Grape's "formatter"
|
147
|
+
Stop monkey patching Grape's json formatter and instead use Grape's "formatter"
|
140
148
|
with our own CamelJson module.
|
141
149
|
|
142
150
|
0.1.0 5/8/2016
|
data/README.md
CHANGED
@@ -58,7 +58,7 @@ It also defaults to monkey patching Grape::Swagger to camelize the API's paramet
|
|
58
58
|
|
59
59
|
You can disable this behavior by setting `IntrospectiveGrape.config.camelize_parameters = false`.
|
60
60
|
|
61
|
-
To include this behavior in your test coverage you need to either access the API's params hash or you can format the response body to `JSON.parse(response.body).with_snake_keys` in a helper method.
|
61
|
+
To include this behavior in your test coverage you need to either access the API's params hash or you can format the response body to `JSON.parse(response.body).with_snake_keys` in a helper method with the `using CamelSnakeKeys` refinement.
|
62
62
|
|
63
63
|
## Authentication and authorization
|
64
64
|
|
@@ -131,7 +131,7 @@ class MyModelAPI < IntrospectiveGrape::API
|
|
131
131
|
restful MyModel, [:strong, :param, :fields, :and, { nested_model_attributes: [:nested,:fields, :_destroy] }] do
|
132
132
|
# Add additional end points to the model's namespace
|
133
133
|
end
|
134
|
-
|
134
|
+
|
135
135
|
class <NestedModel>Entity < Grape::Entity
|
136
136
|
expose :id, :attribute
|
137
137
|
end
|
@@ -170,7 +170,7 @@ The index action by default will not be paginated, simply declared `paginate` be
|
|
170
170
|
To define a Grape param type for a virtual attribute or override the defaut param
|
171
171
|
type from database introspection, define a class method in the model with the param
|
172
172
|
types for the attributes specified in a hash, e.g.:
|
173
|
-
|
173
|
+
|
174
174
|
```
|
175
175
|
def self.grape_param_types
|
176
176
|
{ "<attribute name 1>" => String,
|
@@ -185,8 +185,8 @@ class method ("grape_validations") that will be applied to that field's param de
|
|
185
185
|
```
|
186
186
|
def self.grape_validations
|
187
187
|
{ field1: { values: %w(red blue green) },
|
188
|
-
field2: { json_array: true },
|
189
|
-
field3: { regexp: /\w+/ }
|
188
|
+
field2: { json_array: true },
|
189
|
+
field3: { regexp: /\w+/ }
|
190
190
|
end
|
191
191
|
```
|
192
192
|
|
@@ -196,7 +196,7 @@ IntrospectiveGrape provides the following custom grape validators for JSON strin
|
|
196
196
|
|
197
197
|
```
|
198
198
|
json: true # validates that the JSON string parses
|
199
|
-
json_array: true # validates that the JSON string parses and returns an Array
|
199
|
+
json_array: true # validates that the JSON string parses and returns an Array
|
200
200
|
json_hash: true # validates that the JSON string parses and returns a Hash
|
201
201
|
```
|
202
202
|
|
data/gemfiles/2.0.0-Gemfile
CHANGED
data/introspective_grape.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |s|
|
|
20
20
|
|
21
21
|
s.required_ruby_version = '~> 2.0'
|
22
22
|
|
23
|
-
s.add_dependency "rails", '>= 3.0.0'
|
23
|
+
s.add_dependency "rails", '>= 3.0.0'
|
24
24
|
|
25
25
|
s.add_dependency 'grape' #, '~> 0.16.2'
|
26
26
|
s.add_dependency 'grape-entity' #, '< 0.5.0'
|
@@ -28,7 +28,7 @@ Gem::Specification.new do |s|
|
|
28
28
|
s.add_dependency 'kaminari', '< 1.0' # There's a version 1.0.0 out there that breaks everything
|
29
29
|
s.add_dependency 'grape-kaminari'
|
30
30
|
s.add_dependency 'pundit'
|
31
|
-
s.add_dependency 'camel_snake_keys'
|
31
|
+
s.add_dependency 'camel_snake_keys', '>0.0.4'
|
32
32
|
|
33
33
|
if RUBY_PLATFORM == 'java'
|
34
34
|
#s.add_development_dependency "jdbc-sqlite3"
|
@@ -76,7 +76,7 @@ module IntrospectiveGrape
|
|
76
76
|
# model: the model class for the API
|
77
77
|
# whitelist: a list of fields in Rail's strong params structure, also used to
|
78
78
|
# generate grape's permitted params.
|
79
|
-
# routes: An array of OpenStruct representations of a nested route's ancestors
|
79
|
+
# routes: An array of OpenStruct representations of a nested route's ancestors
|
80
80
|
#
|
81
81
|
|
82
82
|
# Defining the api will break pending migrations during db:migrate, so bail:
|
@@ -91,7 +91,7 @@ module IntrospectiveGrape
|
|
91
91
|
# when routes are nested
|
92
92
|
whitelist = whitelist( strong_params )
|
93
93
|
|
94
|
-
# As routes are nested keep track of the routes, we are preventing siblings from
|
94
|
+
# As routes are nested keep track of the routes, we are preventing siblings from
|
95
95
|
# appending to the routes array here:
|
96
96
|
routes = build_routes(routes, model)
|
97
97
|
define_routes(routes, whitelist)
|
@@ -99,7 +99,7 @@ module IntrospectiveGrape
|
|
99
99
|
# Top level declaration of the Grape::API namespace for the resource:
|
100
100
|
resource routes.first.name.pluralize do
|
101
101
|
# yield to append additional routes under the root namespace
|
102
|
-
yield if block_given?
|
102
|
+
yield if block_given?
|
103
103
|
end
|
104
104
|
end
|
105
105
|
|
@@ -114,7 +114,7 @@ module IntrospectiveGrape
|
|
114
114
|
# Look at model.reflections to find the association's class name:
|
115
115
|
reflection_name = r.to_s.sub(/_attributes$/,'')
|
116
116
|
begin
|
117
|
-
relation = model.reflections[reflection_name].class_name.constantize
|
117
|
+
relation = model.reflections[reflection_name].class_name.constantize
|
118
118
|
rescue
|
119
119
|
Rails.logger.fatal "Can't find associated model for #{r} on #{model}"
|
120
120
|
end
|
@@ -145,7 +145,7 @@ module IntrospectiveGrape
|
|
145
145
|
end
|
146
146
|
end
|
147
147
|
|
148
|
-
def define_restful_api(dsl, routes, model, api_params)
|
148
|
+
def define_restful_api(dsl, routes, model, api_params)
|
149
149
|
# declare index, show, update, create, and destroy methods:
|
150
150
|
API_ACTIONS.each do |action|
|
151
151
|
send("define_#{action}", dsl, routes, model, api_params) unless exclude_actions(model).include?(action)
|
@@ -270,7 +270,7 @@ module IntrospectiveGrape
|
|
270
270
|
# routes: the existing routes array passed from the parent
|
271
271
|
# model: the model being manipulated in this leaf
|
272
272
|
# reflection_name: the association name from the original strong_params declaration
|
273
|
-
#
|
273
|
+
#
|
274
274
|
# Constructs an array representation of the route's models and their associations,
|
275
275
|
# a /root/:rootId/branch/:branchId/leaf/:leafId path would have flat array like
|
276
276
|
# [root,branch,leaf] representing the path structure and its models, used to
|
@@ -287,7 +287,7 @@ module IntrospectiveGrape
|
|
287
287
|
end
|
288
288
|
|
289
289
|
|
290
|
-
def build_nested_attributes(routes,hash)
|
290
|
+
def build_nested_attributes(routes,hash)
|
291
291
|
# Recursively re-express the flat attributes hash from nested routes as nested
|
292
292
|
# attributes that can be used to perform an update on the root model.
|
293
293
|
|
@@ -299,12 +299,12 @@ module IntrospectiveGrape
|
|
299
299
|
id = hash.delete route.key
|
300
300
|
attributes = id ? { id: id } : {}
|
301
301
|
|
302
|
-
attributes.merge!( hash ) if routes.blank? # assign param values to the last reference
|
302
|
+
attributes.merge!( hash ) if routes.blank? # assign param values to the last reference
|
303
303
|
|
304
304
|
if route.many? # nest it in an array if it is a has_many association
|
305
|
-
{ route.param => [attributes.merge( build_nested_attributes(routes, hash) )] }
|
306
|
-
else
|
307
|
-
{ route.param => attributes.merge( build_nested_attributes(routes, hash) ) }
|
305
|
+
{ route.param => [attributes.merge( build_nested_attributes(routes, hash) )] }
|
306
|
+
else
|
307
|
+
{ route.param => attributes.merge( build_nested_attributes(routes, hash) ) }
|
308
308
|
end
|
309
309
|
end
|
310
310
|
|
@@ -354,7 +354,7 @@ module IntrospectiveGrape
|
|
354
354
|
# Handle Carrierwave file upload fields
|
355
355
|
s = [:filename, :type, :name, :tempfile, :head]-v
|
356
356
|
if s.present?
|
357
|
-
Rails.logger.warn "Missing required file upload parameters #{s} for uploader field #{r}"
|
357
|
+
Rails.logger.warn "Missing required file upload parameters #{s} for uploader field #{r}"
|
358
358
|
end
|
359
359
|
elsif PLURAL_REFLECTIONS.include?( model.reflections[reflection].class )
|
360
360
|
# In case you need a refresher on how these work:
|
@@ -377,8 +377,8 @@ module IntrospectiveGrape
|
|
377
377
|
end
|
378
378
|
|
379
379
|
def is_file_attachment?(model,field)
|
380
|
-
model.
|
381
|
-
(model.
|
380
|
+
model.respond_to?(:uploaders) && model.uploaders[field.to_sym] || # carrierwave
|
381
|
+
(model.respond_to?(:attachment_definitions) && model.attachment_definitions[field.to_sym]) ||
|
382
382
|
defined?(Paperclip::Attachment) && model.send(:new).try(field).kind_of?(Paperclip::Attachment)
|
383
383
|
end
|
384
384
|
|
@@ -389,8 +389,8 @@ module IntrospectiveGrape
|
|
389
389
|
|
390
390
|
# Check if it's a file attachment, look for an override class from the model,
|
391
391
|
# check Pg2Ruby, use the database type, or fail over to a String:
|
392
|
-
( is_file_attachment?(model,f) && Rack::Multipart::UploadedFile ) ||
|
393
|
-
(model.try(:grape_param_types)||{}).with_indifferent_access[f] ||
|
392
|
+
( is_file_attachment?(model,f) && Rack::Multipart::UploadedFile ) ||
|
393
|
+
(model.try(:grape_param_types)||{}).with_indifferent_access[f] ||
|
394
394
|
Pg2Ruby[db_type] ||
|
395
395
|
begin db_type.to_s.camelize.constantize rescue nil end ||
|
396
396
|
String
|
@@ -1,10 +1,11 @@
|
|
1
1
|
require 'grape-swagger'
|
2
|
-
require 'active_support
|
3
|
-
require '
|
4
|
-
|
2
|
+
require 'active_support/core_ext/module/aliasing'
|
3
|
+
require 'active_support/inflector/methods'
|
4
|
+
|
5
|
+
if IntrospectiveGrape.config.camelize_parameters
|
5
6
|
# Camelize the parameters in the swagger documentation.
|
6
7
|
if Gem::Version.new( GrapeSwagger::VERSION ) <= Gem::Version.new('0.11.0')
|
7
|
-
Grape::API.class_eval do
|
8
|
+
Grape::API.class_eval do
|
8
9
|
class << self
|
9
10
|
private
|
10
11
|
def create_documentation_class_with_camelized
|
@@ -29,7 +29,7 @@ module IntrospectiveGrape::Filters
|
|
29
29
|
end
|
30
30
|
|
31
31
|
def simple_filters(klass, model, api_params)
|
32
|
-
@simple_filters ||= api_params.select {|p| p.is_a? Symbol }.select {|field|
|
32
|
+
@simple_filters ||= api_params.select {|p| p.is_a? Symbol }.select {|field|
|
33
33
|
filters.include?(:all) || filters.include?(field)
|
34
34
|
}.map { |field|
|
35
35
|
(klass.param_type(model,field) == DateTime ? ["#{field}_start", "#{field}_end"] : field.to_s)
|
@@ -58,7 +58,7 @@ module IntrospectiveGrape::Filters
|
|
58
58
|
# timestamp, a Start and an End, to apply a date range.
|
59
59
|
simple_filters(klass, model, api_params).each do |field|
|
60
60
|
if timestamp_filter(klass,model,field)
|
61
|
-
terminal = field.ends_with?("_start") ? "initial" : "terminal"
|
61
|
+
terminal = field.ends_with?("_start") ? "initial" : "terminal"
|
62
62
|
dsl.optional field, type: klass.param_type(model,field), description: "Constrain #{field} by #{terminal} date."
|
63
63
|
elsif identifier_filter(klass,model,field)
|
64
64
|
dsl.optional field, type: Array[Integer], coerce_with: ->(val) { val.split(',') }, description: "Filter by a comma separated list of integers."
|
@@ -4,17 +4,20 @@ require 'grape/formatter/json'
|
|
4
4
|
module IntrospectiveGrape
|
5
5
|
module Formatter
|
6
6
|
module CamelJson
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
7
|
+
class << self
|
8
|
+
def transform_to_camel_keys(object)
|
9
|
+
# We only need to parse(object.to_json) like this if it isn't already
|
10
|
+
# a native hash (or array of them), i.e. we have to parse Grape::Entities
|
11
|
+
# and other formatter facades:
|
12
|
+
unless (object.is_a?(Array) && object.first.is_a?(Hash)) || object.is_a?(Hash)
|
13
|
+
object = JSON.parse(object.to_json) if object.respond_to?(:to_json)
|
14
|
+
end
|
15
|
+
CamelSnakeKeys.camel_keys(object)
|
14
16
|
end
|
15
|
-
object = object.with_camel_keys if object.respond_to?(:with_camel_keys)
|
16
17
|
|
17
|
-
|
18
|
+
def call(object, env)
|
19
|
+
Grape::Formatter::Json.call(transform_to_camel_keys(object), env)
|
20
|
+
end
|
18
21
|
end
|
19
22
|
end
|
20
23
|
end
|
@@ -7,7 +7,7 @@ module IntrospectiveGrape::Helpers
|
|
7
7
|
|
8
8
|
def authentication_method(context)
|
9
9
|
# Default to "authenticate!" or as grape docs once suggested, "authorize!"
|
10
|
-
if @authentication_method
|
10
|
+
if @authentication_method
|
11
11
|
@authentication_method
|
12
12
|
elsif context.respond_to?('authenticate!')
|
13
13
|
'authenticate!'
|
@@ -27,7 +27,7 @@ module IntrospectiveGrape::Helpers
|
|
27
27
|
def exclude_actions(model, *args)
|
28
28
|
@exclude_actions ||= {}; @exclude_actions[model.name] ||= []
|
29
29
|
args.flatten!
|
30
|
-
args = API_ACTIONS if args.include?(:all)
|
30
|
+
args = API_ACTIONS if args.include?(:all)
|
31
31
|
args = [] if args.include?(:none)
|
32
32
|
|
33
33
|
undefined_actions = args.compact-API_ACTIONS
|
@@ -46,7 +46,7 @@ module IntrospectiveGrape::Helpers
|
|
46
46
|
@default_includes ||= {}
|
47
47
|
@default_includes[model.name] = args.present? ? args.flatten : @default_includes[model.name] || []
|
48
48
|
end
|
49
|
-
|
49
|
+
|
50
50
|
def whitelist(whitelist=nil)
|
51
51
|
return @whitelist if !whitelist
|
52
52
|
@whitelist = whitelist
|