grape-transformations 0.0.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 +7 -0
- data/MIT-LICENSE +20 -0
- data/README.rdoc +3 -0
- data/Rakefile +19 -0
- data/lib/grape/generators/templates/entity.rb +12 -0
- data/lib/grape/generators/templates/grape-transformations.rb +4 -0
- data/lib/grape/generators/transformations/entity_generator.rb +54 -0
- data/lib/grape/generators/transformations/install_generator.rb +29 -0
- data/lib/grape/tasks/grapi_tasks.rake +4 -0
- data/lib/grape/transformations/base.rb +67 -0
- data/lib/grape/transformations/engine.rb +14 -0
- data/lib/grape/transformations/loader.rb +86 -0
- data/lib/grape/transformations/version.rb +5 -0
- data/lib/grape/transformations.rb +112 -0
- data/spec/api/animal_spec.rb +37 -0
- data/spec/api/user_spec.rb +55 -0
- data/spec/generators/entity_generator_spec.rb +25 -0
- data/spec/generators/install_generator_spec.rb +33 -0
- data/spec/grapi_spec.rb +132 -0
- data/spec/spec_helper.rb +78 -0
- data/spec/test_app/README.rdoc +28 -0
- data/spec/test_app/Rakefile +6 -0
- data/spec/test_app/app/api/api.rb +7 -0
- data/spec/test_app/app/api/test_app/entities/animals/compact.rb +10 -0
- data/spec/test_app/app/api/test_app/entities/animals/full.rb +12 -0
- data/spec/test_app/app/api/test_app/entities/food.rb +8 -0
- data/spec/test_app/app/api/test_app/entities/users/compact.rb +10 -0
- data/spec/test_app/app/api/test_app/entities/users/default.rb +13 -0
- data/spec/test_app/app/api/test_app/modules/animal.rb +39 -0
- data/spec/test_app/app/api/test_app/modules/user.rb +39 -0
- data/spec/test_app/app/assets/javascripts/application.js +13 -0
- data/spec/test_app/app/assets/stylesheets/application.css +15 -0
- data/spec/test_app/app/controllers/application_controller.rb +5 -0
- data/spec/test_app/app/helpers/application_helper.rb +2 -0
- data/spec/test_app/app/models/animal.rb +12 -0
- data/spec/test_app/app/models/food.rb +7 -0
- data/spec/test_app/app/models/user.rb +13 -0
- data/spec/test_app/app/views/layouts/application.html.erb +14 -0
- data/spec/test_app/bin/bundle +3 -0
- data/spec/test_app/bin/rails +4 -0
- data/spec/test_app/bin/rake +4 -0
- data/spec/test_app/config/application.rb +32 -0
- data/spec/test_app/config/boot.rb +5 -0
- data/spec/test_app/config/database.yml +25 -0
- data/spec/test_app/config/environment.rb +5 -0
- data/spec/test_app/config/environments/development.rb +37 -0
- data/spec/test_app/config/environments/production.rb +78 -0
- data/spec/test_app/config/environments/test.rb +39 -0
- data/spec/test_app/config/initializers/assets.rb +8 -0
- data/spec/test_app/config/initializers/backtrace_silencers.rb +7 -0
- data/spec/test_app/config/initializers/cookies_serializer.rb +3 -0
- data/spec/test_app/config/initializers/filter_parameter_logging.rb +4 -0
- data/spec/test_app/config/initializers/grapi.rb +4 -0
- data/spec/test_app/config/initializers/inflections.rb +16 -0
- data/spec/test_app/config/initializers/mime_types.rb +4 -0
- data/spec/test_app/config/initializers/session_store.rb +3 -0
- data/spec/test_app/config/initializers/wrap_parameters.rb +14 -0
- data/spec/test_app/config/locales/en.yml +23 -0
- data/spec/test_app/config/routes.rb +3 -0
- data/spec/test_app/config/secrets.yml +22 -0
- data/spec/test_app/config.ru +4 -0
- data/spec/test_app/db/development.sqlite3 +0 -0
- data/spec/test_app/log/development.log +72 -0
- data/spec/test_app/public/404.html +67 -0
- data/spec/test_app/public/422.html +67 -0
- data/spec/test_app/public/500.html +66 -0
- data/spec/test_app/public/favicon.ico +0 -0
- data/spec/test_app/tmp/cache/7F3/650/registered_entities +1 -0
- metadata +400 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 16befd94dc2420bbfb79747c0e0231f00b4594a1
|
4
|
+
data.tar.gz: 03e6b12432f44d2c8cc0276e0cd656453e0bc25d
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 842c56ccc9ffd37e7f4c8a7d440ee06be7ab8358168137a300c5212ad4603a5105bc32891f9ed7b10fb7f3ac331066994f024c410f462d7cf28e34ab6a8abd0f
|
7
|
+
data.tar.gz: 1bb9ed0dbb2697306db84ec13033aebb1082edbf258243e5dd93cffab8bb448c4e42f84ff1ac2c387e0cdb9abbc86954251257b3872e11f5c935c6a2f9f62cd2
|
data/MIT-LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright 2014 Johan Tique, Miguel Diaz
|
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.rdoc
ADDED
data/Rakefile
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
2
|
+
|
3
|
+
begin
|
4
|
+
require 'bundler/setup'
|
5
|
+
rescue LoadError
|
6
|
+
puts 'You must `gem install bundler` and `bundle install` to run rake tasks'
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'rdoc/task'
|
10
|
+
|
11
|
+
RDoc::Task.new(:rdoc) do |rdoc|
|
12
|
+
rdoc.rdoc_dir = 'rdoc'
|
13
|
+
rdoc.title = 'grape-transformations'
|
14
|
+
rdoc.options << '--line-numbers'
|
15
|
+
rdoc.rdoc_files.include('README.rdoc')
|
16
|
+
rdoc.rdoc_files.include('lib/**/*.rb')
|
17
|
+
end
|
18
|
+
|
19
|
+
Bundler::GemHelper.install_tasks
|
@@ -0,0 +1,12 @@
|
|
1
|
+
module <%= app_name.classify %>
|
2
|
+
module Entities
|
3
|
+
module <%= entity_name.classify.pluralize %>
|
4
|
+
class Default < Grape::Entity
|
5
|
+
<% fields.each do |field| %>
|
6
|
+
<% attribute, type = field.split(':')%>
|
7
|
+
expose :<%= attribute %>, documentation: { type: '<%= type %>', desc: 'write a description here', example: 'write an example here' }
|
8
|
+
<% end %>
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
12
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
require 'rails/generators/base'
|
2
|
+
|
3
|
+
module Grape
|
4
|
+
module Generators
|
5
|
+
module Transformations
|
6
|
+
class EntityGenerator < Rails::Generators::Base
|
7
|
+
|
8
|
+
desc <<-DESC.strip_heredoc
|
9
|
+
Create inherited Grape::Entity entity in your app/api/.../entities folder. this
|
10
|
+
created entity will have related with grape-transformations naming conventions
|
11
|
+
|
12
|
+
For example:
|
13
|
+
|
14
|
+
rails generate entity user
|
15
|
+
|
16
|
+
This will create a entity class at app/api/.../entities/users/default.rb like this:
|
17
|
+
|
18
|
+
module TestApp
|
19
|
+
module Entities
|
20
|
+
module Users
|
21
|
+
class Default < Grape::Entity
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
DESC
|
28
|
+
|
29
|
+
source_root File.expand_path('../../templates', __FILE__)
|
30
|
+
|
31
|
+
argument :entity_name, type: :string, required: true, desc: 'name of entity'
|
32
|
+
argument :fields, :type => :array, required: false, desc: 'field set that you want to expose'
|
33
|
+
|
34
|
+
def generate_layout
|
35
|
+
@fields ||= []
|
36
|
+
template "entity.rb", "app/api/#{app_name}/entities/#{underscored_entity_name.pluralize}/default.rb"
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
# Returns the app name
|
42
|
+
# @return [String]
|
43
|
+
def app_name
|
44
|
+
Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'')
|
45
|
+
end
|
46
|
+
|
47
|
+
def underscored_entity_name
|
48
|
+
entity_name.underscore
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require 'rails/generators/base'
|
2
|
+
|
3
|
+
module Grape
|
4
|
+
module Generators
|
5
|
+
module Transformations
|
6
|
+
class InstallGenerator < Rails::Generators::Base
|
7
|
+
|
8
|
+
source_root File.expand_path("../../templates", __FILE__)
|
9
|
+
|
10
|
+
def copy_initializer
|
11
|
+
template "grape-transformations.rb", "config/initializers/grape-transformations.rb"
|
12
|
+
end
|
13
|
+
|
14
|
+
def generate_layout
|
15
|
+
create_file "app/api/#{app_name}/entities/.keep"
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
# Returns the app name
|
21
|
+
# @return [String]
|
22
|
+
def app_name
|
23
|
+
Rails.application.config.session_options[:key].sub(/^_/,'').sub(/_session/,'')
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require 'active_support/concern'
|
2
|
+
|
3
|
+
module Grape
|
4
|
+
module Transformations
|
5
|
+
module Base
|
6
|
+
extend ::ActiveSupport::Concern
|
7
|
+
|
8
|
+
module ClassMethods
|
9
|
+
|
10
|
+
# Defines the target model associated to current transformations
|
11
|
+
# @param [Class], Class as a reference of model, bear in mind that you
|
12
|
+
# need to prefix the scope resolution operator at the beginning in order
|
13
|
+
# to point to the right model
|
14
|
+
# example:
|
15
|
+
# target_model ::User
|
16
|
+
def target_model(klass)
|
17
|
+
@grape_transformations_target_class = klass
|
18
|
+
end
|
19
|
+
|
20
|
+
# Defines the endpoints that will use with the existing transformations
|
21
|
+
# @param [Proc], all code related with transformable endpoints definition
|
22
|
+
def define_endpoints(&block)
|
23
|
+
@grape_transformations_endpoints = block.to_proc
|
24
|
+
end
|
25
|
+
|
26
|
+
# Defines the endpoints that will use with the existing transformations
|
27
|
+
# @param [Proc], all code related with non transformable endpoints definition
|
28
|
+
def define_non_transformable_endpoints(&block)
|
29
|
+
@grape_transformations_non_transformable_endpoints = block.to_proc
|
30
|
+
end
|
31
|
+
|
32
|
+
# Invokes the block associated with transformable endpoints
|
33
|
+
# @param [Hash], options hash that contains entity transformation definition
|
34
|
+
def add_endpoints_with(options = {})
|
35
|
+
return unless @grape_transformations_endpoints.is_a? Proc
|
36
|
+
entity = options[:entity] || entity_for_transformation(:default)
|
37
|
+
@grape_transformations_endpoints.call(entity)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Invokes the block associated with non transformable endpoints
|
41
|
+
def add_non_transformable_endpoints
|
42
|
+
return unless @grape_transformations_non_transformable_endpoints.is_a? Proc
|
43
|
+
@grape_transformations_non_transformable_endpoints.call
|
44
|
+
end
|
45
|
+
|
46
|
+
# Abstracts entity_for_transformation grape_transformations method using the grape_transformations_target_class variable
|
47
|
+
def entity_for_transformation(transformation)
|
48
|
+
Grape::Transformations.entity_for_transformation(@grape_transformations_target_class, transformation)
|
49
|
+
end
|
50
|
+
|
51
|
+
# Invokes both transformable and non-transformable body endpoints
|
52
|
+
def add_endpoints
|
53
|
+
# transformable endpoints
|
54
|
+
Grape::Transformations.transformations_for(@grape_transformations_target_class).each do |transformation|
|
55
|
+
entity = entity_for_transformation transformation
|
56
|
+
namespace transformation do
|
57
|
+
add_endpoints_with entity: entity
|
58
|
+
end
|
59
|
+
end
|
60
|
+
# normal api
|
61
|
+
add_endpoints_with entity: entity_for_transformation(:default) if Grape::Transformations.simbolized_entities_for(@grape_transformations_target_class).include? :default
|
62
|
+
add_non_transformable_endpoints
|
63
|
+
end
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# Rails Engine
|
2
|
+
|
3
|
+
module Grape
|
4
|
+
module Transformations
|
5
|
+
class Engine < ::Rails::Engine
|
6
|
+
# config.generators do |g|
|
7
|
+
# g.test_framework :rspec, :fixture => false
|
8
|
+
# g.fixture_replacement :factory_girl, :dir => 'spec/factories'
|
9
|
+
# g.assets false
|
10
|
+
# g.helper false
|
11
|
+
# end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -0,0 +1,86 @@
|
|
1
|
+
module Grape
|
2
|
+
module Transformations
|
3
|
+
module Loader
|
4
|
+
# extend ActiveSupport::Autoload # TODO: Make entities autoloadable so that
|
5
|
+
# code is live reloaded in development mode
|
6
|
+
|
7
|
+
# Return a class by its name, id it is not valid
|
8
|
+
# it returns nil
|
9
|
+
# @param [String], full class name
|
10
|
+
# @return [Object]
|
11
|
+
def self.class_by_name(name)
|
12
|
+
name.safe_constantize
|
13
|
+
end
|
14
|
+
|
15
|
+
# Loads all valid entities located in relative_path_to_entities dir, it
|
16
|
+
# verifies if entity is valid and if it is associated with valid class.
|
17
|
+
# When this process is accomplished is saved a hash with classname as a
|
18
|
+
# key and its associated entity as a value (using Rails.cache)
|
19
|
+
# @param root_api_path [String], path to api dir
|
20
|
+
# @param relative_path_to_entities [String], relative path to entities
|
21
|
+
def self.load_entities(root_api_path, relative_path_to_entities)
|
22
|
+
available_entities = {}
|
23
|
+
path_to_entities = File.join(root_api_path, relative_path_to_entities)
|
24
|
+
api_entities_namespace = relative_path_to_entities.split('/').map { |module_name| module_name.gsub(' ','_').camelcase }.join('::')
|
25
|
+
Dir.glob(File.join(path_to_entities, '**', '*.rb')).each do |filename|
|
26
|
+
relative_path = filename.sub("#{path_to_entities}/", '')
|
27
|
+
class_hierarchy = relative_path.split("/").map {|filename| filename.gsub(' ','_').camelcase.sub('.rb','')}
|
28
|
+
class_name = class_hierarchy.join('::')
|
29
|
+
entity_name = "#{api_entities_namespace}::#{class_name}"
|
30
|
+
klass = class_by_name class_name
|
31
|
+
entity = class_by_name entity_name
|
32
|
+
|
33
|
+
# If there is a one to one match from Entities::..::Entity to ..::Klass, use it
|
34
|
+
if entity && klass
|
35
|
+
available_entities[class_name] = entity_name
|
36
|
+
else
|
37
|
+
# If not, try to find a "Default" transformation entity class
|
38
|
+
# namespaced in the pluralized klass
|
39
|
+
|
40
|
+
# An entity has to exist
|
41
|
+
if entity
|
42
|
+
# example: ['Admin', 'Billing', 'Addresses'], 'Default' = ['Admin', 'Billing', 'Addresses', 'Default']
|
43
|
+
*transformation_hierarchy, transformation_name = class_hierarchy
|
44
|
+
|
45
|
+
if transformation_name == 'Default'
|
46
|
+
|
47
|
+
# example: ['Admin', 'Billing'], 'Addresses' = ['Admin', 'Billing', 'Addresses']
|
48
|
+
*class_name_hierarchy, pluralized_transformable_class_name = transformation_hierarchy
|
49
|
+
# example: 'Address' = "Addresses".singularize
|
50
|
+
transformable_class_name = pluralized_transformable_class_name.singularize
|
51
|
+
# example: Admin::Billing::Address
|
52
|
+
|
53
|
+
class_name_hierarchy << transformable_class_name
|
54
|
+
class_name = class_name_hierarchy.join('::')
|
55
|
+
klass = class_by_name class_name
|
56
|
+
# example: Admin::Billing::Address
|
57
|
+
|
58
|
+
# a matching class was found
|
59
|
+
if klass
|
60
|
+
available_entities[class_name] = entity_name
|
61
|
+
else
|
62
|
+
# The entity is just an entity, no matching class... however seems like
|
63
|
+
# conventions were not properly followed
|
64
|
+
end
|
65
|
+
|
66
|
+
else
|
67
|
+
# No one to one match or Default transformation found, no entity used
|
68
|
+
end
|
69
|
+
else
|
70
|
+
puts "[WARN] - Conventions not followed? - Entity #{entity_name} was not found at #{filename}, please check"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
|
74
|
+
end
|
75
|
+
register_entities available_entities
|
76
|
+
end
|
77
|
+
|
78
|
+
private
|
79
|
+
# Saves entities in cache by using Rails.cache approach
|
80
|
+
def self.register_entities(available_entities)
|
81
|
+
Rails.cache.delete(:registered_entities) # make sure it is clean
|
82
|
+
Rails.cache.fetch(:registered_entities){ available_entities }
|
83
|
+
end
|
84
|
+
end
|
85
|
+
end
|
86
|
+
end
|
@@ -0,0 +1,112 @@
|
|
1
|
+
require 'grape/transformations/version'
|
2
|
+
require 'grape/transformations/loader'
|
3
|
+
require 'grape/transformations/base'
|
4
|
+
require 'grape/transformations/engine' if defined?(Rails)
|
5
|
+
require 'grape'
|
6
|
+
require 'rails'
|
7
|
+
|
8
|
+
module Grape
|
9
|
+
module Transformations
|
10
|
+
# Sets default api location ../app/api
|
11
|
+
mattr_accessor :root_api_path
|
12
|
+
|
13
|
+
# relative_path_to_entities
|
14
|
+
mattr_accessor :relative_path_to_entities
|
15
|
+
|
16
|
+
# Uses Loader.load_entities method in order to load all valid entities located
|
17
|
+
# in relative path_to_entities
|
18
|
+
def self.load_entities_from(relative_path_to_entities)
|
19
|
+
self.root_api_path ||= File.join(Rails.root, 'app', 'api')
|
20
|
+
self.relative_path_to_entities = relative_path_to_entities
|
21
|
+
Loader.load_entities root_api_path, relative_path_to_entities
|
22
|
+
end
|
23
|
+
|
24
|
+
# defines wrapped accessor to grape-transformations configurator
|
25
|
+
def self.setup
|
26
|
+
yield self
|
27
|
+
end
|
28
|
+
|
29
|
+
# returns entities registered from rails cache
|
30
|
+
def self.registered_entities
|
31
|
+
Rails.cache.fetch(:registered_entities)
|
32
|
+
end
|
33
|
+
|
34
|
+
# returns the appropite class for a class name or class
|
35
|
+
def self.registered_entity_for(klass)
|
36
|
+
registered_entities[normalized_class_name(klass)]
|
37
|
+
end
|
38
|
+
|
39
|
+
# @return [Class] the entity class for a given transformation
|
40
|
+
# example:
|
41
|
+
# entity_for_transformation(User, :full)
|
42
|
+
# #=> MyApp::Entities::Users::Full
|
43
|
+
def self.entity_for_transformation(klass, transformation)
|
44
|
+
entity_hierarchy = root_entity_namespace_hierarchy << normalized_class_name(klass).pluralize
|
45
|
+
entity_hierarchy << transformation.to_s.camelize
|
46
|
+
entity_hierarchy.join('::').constantize
|
47
|
+
end
|
48
|
+
|
49
|
+
# @return [Array] the top level module entity namespace wrapping
|
50
|
+
# example: ['MyApp', 'Entities']
|
51
|
+
def self.root_entity_namespace_hierarchy
|
52
|
+
File.split(relative_path_to_entities).map{|namespace| namespace.camelize}
|
53
|
+
end
|
54
|
+
|
55
|
+
# @return [String] the top level module namespacing to begin looking entities within
|
56
|
+
# example: "MyApp::Entities"
|
57
|
+
def self.root_entity_namespace
|
58
|
+
root_entity_namespace_hierarchy.join('::')
|
59
|
+
end
|
60
|
+
|
61
|
+
# @return [String] the absolute path to entities directory
|
62
|
+
def self.full_path_to_entities
|
63
|
+
File.join(root_api_path, relative_path_to_entities)
|
64
|
+
end
|
65
|
+
|
66
|
+
# @return [Array] all transformations listed as symbols (excludes :default)
|
67
|
+
def self.transformations_for(klass)
|
68
|
+
simbolized_entities_for(klass) - [:default]
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.simbolized_entities_for(klass)
|
72
|
+
class_name = normalized_class_name(klass)
|
73
|
+
entities_directory = File.join(full_path_to_entities, class_name.pluralize.underscore)
|
74
|
+
entity_files = Dir[File.join(entities_directory, '*')]
|
75
|
+
entity_files.map{|filename| File.split(filename).last.sub('.rb', '').to_sym}
|
76
|
+
end
|
77
|
+
|
78
|
+
# @return [Array] all entity classes including "Default" that relate to a given class
|
79
|
+
def self.all_entities_for(klass)
|
80
|
+
(transformations_for(klass) + [:default]).map{|transformation| entity_for_transformation(klass, transformation)}
|
81
|
+
end
|
82
|
+
|
83
|
+
# @return [Array] all entity classes except for "Default" that relate to a given class
|
84
|
+
def self.all_transformation_entities_for(klass)
|
85
|
+
all_entities_for(klass) - [entity_for_transformation(klass, :default)]
|
86
|
+
end
|
87
|
+
|
88
|
+
# return the class_name given a Class or :class or "class"...or anything like it
|
89
|
+
def self.normalized_class_name(klass)
|
90
|
+
klass.to_s.classify
|
91
|
+
end
|
92
|
+
|
93
|
+
# Monkey patch for Grape::Endpoint#present so that it
|
94
|
+
# autoloads a default entity when presenting a given class instance
|
95
|
+
::Grape::Endpoint.send(:define_method, :present_with_autoload) do |instance, options = {}|
|
96
|
+
is_instance_a_set = false
|
97
|
+
is_instance_a_set = if defined? Mongoid
|
98
|
+
instance.kind_of?(Mongoid::Criteria)
|
99
|
+
elsif defined? ActiveRecord
|
100
|
+
instance.kind_of?(ActiveRecord::Relation)
|
101
|
+
end
|
102
|
+
is_instance_a_set ||= instance.kind_of?(Array)
|
103
|
+
klass = is_instance_a_set ? instance.first.class : instance.class
|
104
|
+
entity = Grape::Transformations.registered_entity_for klass
|
105
|
+
options[:with] = entity.constantize if options[:with].nil? && entity
|
106
|
+
present_without_autoload instance, options
|
107
|
+
end
|
108
|
+
|
109
|
+
::Grape::Endpoint.alias_method_chain(:present, :autoload)
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|