grape_resource 0.1.3 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/README.md +12 -1
- data/lib/generators/grape_resource/generator_helpers.rb +105 -0
- data/lib/generators/grape_resource/install_generator.rb +5 -0
- data/lib/generators/grape_resource/namespace_generator.rb +67 -0
- data/lib/generators/grape_resource/rest_generator.rb +66 -0
- data/lib/generators/templates/entities.rb.erb +6 -0
- data/lib/generators/templates/initializer.rb +8 -1
- data/lib/generators/templates/namespace/namespace_endpoint.rb.erb +91 -0
- data/lib/generators/templates/rest/rest_endpoint.rb.erb +69 -0
- data/lib/generators/templates/routes.rb.erb +14 -0
- data/lib/generators/templates/specs.rb.erb +3 -0
- data/lib/grape_resource.rb +3 -0
- data/lib/grape_resource/version.rb +1 -1
- metadata +10 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 18a0f9753a02d378d8f4f1cd7ccddb48952958b56a7bfef8526b2bc8e528d337
|
4
|
+
data.tar.gz: a2e8531e0149e10b7864fa5aad490f10c8f399df7c13d3bf313eac6a4d7b8d85
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f9a52aa191ddab0b319284b0028c8f381015ec2dfed5d8c4d36070972451422882897e32eab10e9b1bbe8a6c5092148070467b29a252b077afbba3e864302738
|
7
|
+
data.tar.gz: 126ba5569261901342908c42066b86b89d8358fa0fb81b3e1159f20ce4baca8de3a6ac475fb315cf18a6b32ca281f926bc79e514b588c49b4dc1ddca1bc55986
|
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
@@ -40,6 +40,9 @@ Modify GrapeResource configuration inside `config/initializers/grape_resource.rb
|
|
40
40
|
|
41
41
|
1. `config.directory` will be your endpoint directory. Default to : `controllers/API/v1/`
|
42
42
|
2. `config.class_name_prefix` will be your class name prefix for your endpoint. Default to : `API::V1`
|
43
|
+
3. `config.entry_point_routes` will be your entry point for your routes. Default to : `# Routes entry point`
|
44
|
+
4. `config.success_formatter` will be your success formatter. Default to : `formatter :json, ::API::SuccessFormatter`
|
45
|
+
5. `config.error_formatter` will be your error formatter. Default to : `error_formatter :json, ::API::ErrorFormatter`
|
43
46
|
|
44
47
|
### Generator
|
45
48
|
|
@@ -47,6 +50,10 @@ To generate REST API :
|
|
47
50
|
|
48
51
|
$ rails g grape_resource:rest class_name
|
49
52
|
|
53
|
+
Example :
|
54
|
+
|
55
|
+
$ rails g grape_resource:rest article
|
56
|
+
|
50
57
|
This will give you :
|
51
58
|
|
52
59
|
1. GET /
|
@@ -57,7 +64,11 @@ This will give you :
|
|
57
64
|
|
58
65
|
To generate namespaced API :
|
59
66
|
|
60
|
-
$ rails g grape_resource:namespace namespace api_endpoint1 api_endpoint2:method
|
67
|
+
$ rails g grape_resource:namespace namespace api_endpoint1 api_endpoint2:method
|
68
|
+
|
69
|
+
Example :
|
70
|
+
|
71
|
+
$ rails g grape_resource:namespace article popular like:post similar:get:member trending:get:collection
|
61
72
|
|
62
73
|
While method is one of :
|
63
74
|
|
@@ -0,0 +1,105 @@
|
|
1
|
+
module GrapeResource
|
2
|
+
module GeneratorHelpers
|
3
|
+
attr_accessor :attributes
|
4
|
+
|
5
|
+
private
|
6
|
+
def check_endpoint_or_method(args)
|
7
|
+
@default_endpoint, custom, custom2 = [], [], []
|
8
|
+
args.each do |arg|
|
9
|
+
case arg.split(":").length
|
10
|
+
when 1
|
11
|
+
@default_endpoint << arg
|
12
|
+
when 2
|
13
|
+
custom << arg.split(":")
|
14
|
+
else
|
15
|
+
if arg.split(":")[1] == "get"
|
16
|
+
custom2 << arg.split(":")
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
@default_endpoint
|
21
|
+
@custom_endpoint, @custom_endpoint2 = custom.to_h, custom2
|
22
|
+
collection_or_member
|
23
|
+
get_endpoint_and_method_name
|
24
|
+
end
|
25
|
+
|
26
|
+
def collection_or_member
|
27
|
+
collection, member = [], []
|
28
|
+
@custom_endpoint2.each do |c2|
|
29
|
+
collection << c2.take(2) if c2.last == "collection"
|
30
|
+
member << c2.take(2) if c2.last == "member"
|
31
|
+
end
|
32
|
+
@collection, @member = collection.to_h, member.to_h
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_endpoint_and_method_name
|
36
|
+
@put, @post, @delete = {}, {}, {}
|
37
|
+
@custom_endpoint.each do |k, v|
|
38
|
+
@put[k] = v if v == "put"
|
39
|
+
@post[k] = v if v == "post"
|
40
|
+
@delete[k] = v if v == "delete"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def generator_type class_name
|
45
|
+
@name_of_class = class_name == "rest" ? name.camelize.pluralize : name.camelize.singularize
|
46
|
+
@name_of_class
|
47
|
+
end
|
48
|
+
|
49
|
+
# Routes
|
50
|
+
def routes_exist?
|
51
|
+
@routes_file = Rails.root.join("app/#{GrapeResource.directory}#{name.underscore.pluralize}/routes.rb")
|
52
|
+
File.exist? @routes_file
|
53
|
+
end
|
54
|
+
|
55
|
+
def mount_code_exist?
|
56
|
+
string = " mount #{GrapeResource.class_name_prefix}::#{name.camelize.pluralize}::Resources::#{@name_of_class}\n"
|
57
|
+
File.read(@routes_file).each_line do |line|
|
58
|
+
return true if line == string
|
59
|
+
end
|
60
|
+
return false
|
61
|
+
end
|
62
|
+
|
63
|
+
# Main
|
64
|
+
def mounted_routes_exist?
|
65
|
+
@main_file = Rails.root.join("app/#{GrapeResource.directory}main.rb")
|
66
|
+
string = " mount API::V1::#{name.camelize.pluralize}::Routes\n"
|
67
|
+
File.read(@main_file).each_line do |line|
|
68
|
+
return true if line == string
|
69
|
+
end
|
70
|
+
return false
|
71
|
+
end
|
72
|
+
|
73
|
+
# Specs
|
74
|
+
def rspec_exist?
|
75
|
+
rspec_file = Rails.root.join("app/#{GrapeResource.directory}#{name.underscore.pluralize}/spec/#{@name_of_class.underscore}_spec.rb")
|
76
|
+
File.exist? rspec_file
|
77
|
+
end
|
78
|
+
|
79
|
+
# Entities
|
80
|
+
def entities_exist?
|
81
|
+
entity_file = Rails.root.join("app/#{GrapeResource.directory}#{name.underscore.pluralize}/entities/#{name.underscore.singularize}.rb")
|
82
|
+
File.exist? entity_file
|
83
|
+
end
|
84
|
+
|
85
|
+
def model_columns_for_attributes
|
86
|
+
name.classify.constantize.columns.reject do |column|
|
87
|
+
column.name.to_s =~ /^(id|created_at|updated_at)$/
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def editable_attributes
|
92
|
+
attributes ||= model_columns_for_attributes.map do |column|
|
93
|
+
Rails::Generators::GeneratedAttribute.new(column.name.to_s, column.type.to_s)
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def attributes_for_params
|
98
|
+
@entities = {}
|
99
|
+
editable_attributes.map do |col|
|
100
|
+
@entities[col.name] = col.type.downcase == "text" || "uuid" ? "String" : col.type.capitalize
|
101
|
+
end
|
102
|
+
@entities
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
@@ -5,5 +5,10 @@ module GrapeResource
|
|
5
5
|
def copy_initializer
|
6
6
|
template "initializer.rb", "config/initializers/grape_resource.rb"
|
7
7
|
end
|
8
|
+
|
9
|
+
def insert_entry_point
|
10
|
+
insert_into_file "app/#{GrapeResource.directory}/main.rb", "\n\n #{GrapeResource.entry_point_routes} -- DONT REMOVE THIS LINE", after: " mount API::V1::Info::Routes"
|
11
|
+
end
|
12
|
+
|
8
13
|
end
|
9
14
|
end
|
@@ -0,0 +1,67 @@
|
|
1
|
+
require "generators/grape_resource/generator_helpers.rb"
|
2
|
+
|
3
|
+
module GrapeResource
|
4
|
+
class NamespaceGenerator < Rails::Generators::NamedBase
|
5
|
+
source_root File.expand_path("../../templates", __FILE__)
|
6
|
+
include GrapeResource::GeneratorHelpers
|
7
|
+
|
8
|
+
def generate
|
9
|
+
unless Object.const_defined?(name.classify)
|
10
|
+
say
|
11
|
+
say
|
12
|
+
say "You need to generate model", :red
|
13
|
+
say
|
14
|
+
say "Example :"
|
15
|
+
say " rails g model #{name.classify} attr1 attr2", :green
|
16
|
+
say
|
17
|
+
return
|
18
|
+
end
|
19
|
+
|
20
|
+
generator_type "namespace"
|
21
|
+
insert_resources
|
22
|
+
insert_into_main unless mounted_routes_exist?
|
23
|
+
insert_namespace_entities unless entities_exist?
|
24
|
+
template_rspec unless rspec_exist?
|
25
|
+
routes_exist? ? insert_namespace_routes : template_namespace_routes
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def insert_resources
|
30
|
+
check_endpoint_or_method args
|
31
|
+
attributes_for_params
|
32
|
+
|
33
|
+
template "namespace/namespace_endpoint.rb.erb", "app/#{GrapeResource.directory}/#{name.underscore.pluralize}/resources/#{name.underscore.singularize}.rb"
|
34
|
+
|
35
|
+
inside "app/#{GrapeResource.directory}/#{name.underscore.pluralize}/resources/" do
|
36
|
+
gsub_file("#{name.underscore.singularize}.rb", /.*?remove.*\r?\n/, "")
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
def insert_into_main
|
41
|
+
insert_into_file "app/#{GrapeResource.directory}/main.rb", " mount API::V1::#{name.camelize.pluralize}::Routes\n", before: " #{GrapeResource.entry_point_routes} -- DONT REMOVE THIS LINE"
|
42
|
+
end
|
43
|
+
|
44
|
+
def insert_namespace_entities
|
45
|
+
attributes_for_params
|
46
|
+
|
47
|
+
template "entities.rb.erb", "app/#{GrapeResource.directory}/#{name.underscore.pluralize}/entities/#{name.underscore.singularize}.rb"
|
48
|
+
|
49
|
+
inside "app/#{GrapeResource.directory}/#{name.underscore.pluralize}/entities/" do
|
50
|
+
gsub_file("#{name.underscore.singularize}.rb", /.*?remove.*\r?\n/, "")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def template_rspec
|
55
|
+
template "specs.rb.erb", "app/#{GrapeResource.directory}/#{name.underscore.pluralize}/spec/#{name.underscore.singularize}_spec.rb"
|
56
|
+
end
|
57
|
+
|
58
|
+
def insert_namespace_routes
|
59
|
+
insert_into_file "app/#{GrapeResource.directory}/#{name.underscore.pluralize}/routes.rb", " mount #{GrapeResource.class_name_prefix}::#{name.camelize.pluralize}::Resources::#{name.camelize.singularize}\n", before: " #{GrapeResource.entry_point_routes} -- DONT REMOVE THIS LINE\n" unless mount_code_exist?
|
60
|
+
end
|
61
|
+
|
62
|
+
def template_namespace_routes
|
63
|
+
template "routes.rb.erb", "app/#{GrapeResource.directory}/#{name.underscore.pluralize}/routes.rb"
|
64
|
+
end
|
65
|
+
|
66
|
+
end
|
67
|
+
end
|
@@ -0,0 +1,66 @@
|
|
1
|
+
require "generators/grape_resource/generator_helpers.rb"
|
2
|
+
|
3
|
+
module GrapeResource
|
4
|
+
class RestGenerator < Rails::Generators::NamedBase
|
5
|
+
source_root File.expand_path("../../templates", __FILE__)
|
6
|
+
include GrapeResource::GeneratorHelpers
|
7
|
+
|
8
|
+
def run_me
|
9
|
+
unless Object.const_defined?(name.classify)
|
10
|
+
say
|
11
|
+
say
|
12
|
+
say "You need to generate model", :red
|
13
|
+
say
|
14
|
+
say "Example :"
|
15
|
+
say " rails g model #{name.classify} attr1 attr2", :green
|
16
|
+
say
|
17
|
+
return
|
18
|
+
end
|
19
|
+
|
20
|
+
generator_type "rest"
|
21
|
+
create_rest_endpoint
|
22
|
+
insert_into_main unless mounted_routes_exist?
|
23
|
+
insert_rest_entities unless entities_exist?
|
24
|
+
template_rspec unless rspec_exist?
|
25
|
+
routes_exist? ? insert_rest_routes : template_rest_routes
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
def create_rest_endpoint
|
30
|
+
attributes_for_params
|
31
|
+
|
32
|
+
template "rest/rest_endpoint.rb.erb", "app/#{GrapeResource.directory}/#{name.underscore.pluralize}/resources/#{name.underscore.pluralize}.rb"
|
33
|
+
|
34
|
+
inside "app/#{GrapeResource.directory}/#{name.underscore.pluralize}/resources/" do
|
35
|
+
gsub_file("#{name.underscore.pluralize}.rb", /.*?remove.*\r?\n/, "")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def insert_into_main
|
40
|
+
insert_into_file "app/#{GrapeResource.directory}/main.rb", " mount API::V1::#{name.camelize.pluralize}::Routes\n", before: " #{GrapeResource.entry_point_routes} -- DONT REMOVE THIS LINE"
|
41
|
+
end
|
42
|
+
|
43
|
+
def insert_rest_entities
|
44
|
+
attributes_for_params
|
45
|
+
|
46
|
+
template "entities.rb.erb", "app/#{GrapeResource.directory}/#{name.underscore.pluralize}/entities/#{name.underscore.singularize}.rb"
|
47
|
+
|
48
|
+
inside "app/#{GrapeResource.directory}/#{name.underscore.pluralize}/entities/" do
|
49
|
+
gsub_file("#{name.underscore.singularize}.rb", /.*?remove.*\r?\n/, "")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def template_rspec
|
54
|
+
template "specs.rb.erb", "app/#{GrapeResource.directory}/#{name.underscore.pluralize}/spec/#{name.underscore.pluralize}_spec.rb"
|
55
|
+
end
|
56
|
+
|
57
|
+
def insert_rest_routes
|
58
|
+
insert_into_file "app/#{GrapeResource.directory}/#{name.underscore.pluralize}/routes.rb", " mount #{GrapeResource.class_name_prefix}::#{name.camelize.pluralize}::Resources::#{name.camelize.pluralize}\n", before: " #{GrapeResource.entry_point_routes} -- DONT REMOVE THIS LINE\n" unless mount_code_exist?
|
59
|
+
end
|
60
|
+
|
61
|
+
def template_rest_routes
|
62
|
+
template "routes.rb.erb", "app/#{GrapeResource.directory}/#{name.underscore.pluralize}/routes.rb"
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
end
|
@@ -4,4 +4,11 @@ GrapeResource.setup do |config|
|
|
4
4
|
|
5
5
|
# Class name prefix
|
6
6
|
config.class_name_prefix = "API::V1"
|
7
|
-
|
7
|
+
|
8
|
+
# Entry point routes
|
9
|
+
config.entry_point_routes = "# Routes entry point"
|
10
|
+
|
11
|
+
# Formatter
|
12
|
+
config.success_formatter = "formatter :json, ::API::SuccessFormatter"
|
13
|
+
config.error_formatter = "error_formatter :json, ::API::ErrorFormatter"
|
14
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
class <%= GrapeResource.class_name_prefix %>::<%= name.camelize.pluralize %>::Resources::<%= name.camelize.singularize %> < <%= GrapeResource.class_name_prefix %>::ApiResource
|
2
|
+
helpers <%= GrapeResource.class_name_prefix %>::Helpers
|
3
|
+
|
4
|
+
resource "<%= name.underscore.singularize %>" do
|
5
|
+
|
6
|
+
<% if @default_endpoint.present? %>remove
|
7
|
+
<% @default_endpoint.each do |endpoint_name| %>remove
|
8
|
+
# Default Collection method
|
9
|
+
desc "Get <%= endpoint_name.underscore %>"
|
10
|
+
paginate per_page: Pagy::VARS[:items], max_per_page: Pagy::VARS[:max_per_page]
|
11
|
+
get "/<%= endpoint_name %>" do
|
12
|
+
results = <%= name.camelize.singularize %>.all
|
13
|
+
resources = paginate(results)
|
14
|
+
present_metas resources
|
15
|
+
present :<%= name.camelize.singularize %>, resources, with: <%= GrapeResource.class_name_prefix %>::<%= name.camelize.pluralize %>::Entities::<%= name.camelize.singularize %>
|
16
|
+
end
|
17
|
+
|
18
|
+
<% end %>remove
|
19
|
+
<% end %>remove
|
20
|
+
<% if @collection.any? %>remove
|
21
|
+
<% @collection.each do |k, v| %>remove
|
22
|
+
# Collection method
|
23
|
+
desc "Get <%= k.underscore %>"
|
24
|
+
paginate per_page: Pagy::VARS[:items], max_per_page: Pagy::VARS[:max_per_page]
|
25
|
+
get "/<%= k.downcase %>" do
|
26
|
+
results = <%= name.camelize.singularize %>.<%= k.downcase %>
|
27
|
+
resources = paginate(results)
|
28
|
+
present_metas resources
|
29
|
+
present :<%= name.camelize.singularize %>, resources, with: <%= GrapeResource.class_name_prefix %>::<%= name.camelize.pluralize %>::Entities::<%= name.camelize.singularize %>
|
30
|
+
end
|
31
|
+
|
32
|
+
<% end %>remove
|
33
|
+
<% end %>remove
|
34
|
+
<% if @member.any? %>remove
|
35
|
+
<% @member.each do |k, v| %>remove
|
36
|
+
# Member method
|
37
|
+
desc "Get <%= k.underscore %>"
|
38
|
+
params do
|
39
|
+
requires :id, type: String
|
40
|
+
end
|
41
|
+
get "/:id/<%= k.downcase %>" do
|
42
|
+
results = <%= name.camelize.singularize %>.find(params.id)
|
43
|
+
present :<%= name.camelize.singularize %>, results, with: <%= GrapeResource.class_name_prefix %>::<%= name.camelize.pluralize %>::Entities::<%= name.camelize.singularize %>
|
44
|
+
end
|
45
|
+
|
46
|
+
<% end %>remove
|
47
|
+
<% end %>remove
|
48
|
+
<% if @post.present? %>remove
|
49
|
+
<% @post.each do |k, v| %>remove
|
50
|
+
desc "Create"
|
51
|
+
params do
|
52
|
+
# requires :your_params, type: [eg: String, Integer, Array]
|
53
|
+
end
|
54
|
+
post "/<%= k.downcase %>" do
|
55
|
+
# present :<%= name.capitalize.singularize %>, results, with: <%= GrapeResource.class_name_prefix %>::<%= name.capitalize.singularize %>::Entities::<%= name.capitalize.singularize %>
|
56
|
+
end
|
57
|
+
|
58
|
+
<% end %>remove
|
59
|
+
<% end %>remove
|
60
|
+
<% if @put.present? %>remove
|
61
|
+
<% @put.each do |k, v| %>remove
|
62
|
+
desc "Update"
|
63
|
+
params do
|
64
|
+
requires :id, type: String
|
65
|
+
# requires :your_params, type: [eg: String, Integer, Array]
|
66
|
+
end
|
67
|
+
put "/:id/<%= k.downcase %>" do
|
68
|
+
error!("Can't find id #{params.id}", 422) unless <%= name.capitalize.singularize %>.all.pluck(:id).include?(params.id)
|
69
|
+
# present :<%= name.capitalize.singularize %>, results, with: <%= GrapeResource.class_name_prefix %>::<%= name.capitalize.singularize %>::Entities::<%= name.capitalize.singularize %>
|
70
|
+
end
|
71
|
+
|
72
|
+
<% end %>remove
|
73
|
+
<% end %>remove
|
74
|
+
<% if @delete.present? %>remove
|
75
|
+
<% @delete.each do |k, v| %>remove
|
76
|
+
desc "Delete"
|
77
|
+
params do
|
78
|
+
requires :id, type: String
|
79
|
+
end
|
80
|
+
delete "/:id/<%= k.downcase %>" do
|
81
|
+
error!("Can't find id #{params.id}", 422) unless <%= name.camelize.singularize %>.all.pluck(:id).include?(params.id)
|
82
|
+
q = <%= name.camelize.singularize %>.find params.id
|
83
|
+
q.destroy!
|
84
|
+
success = "success deleted data with id #{params.id}"
|
85
|
+
present :status, success
|
86
|
+
end
|
87
|
+
<% end %>remove
|
88
|
+
<% end %>remove
|
89
|
+
end
|
90
|
+
|
91
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
class <%= GrapeResource.class_name_prefix %>::<%= name.camelize.pluralize %>::Resources::<%= name.camelize.pluralize %> < <%= GrapeResource.class_name_prefix %>::ApiResource
|
2
|
+
helpers <%= GrapeResource.class_name_prefix %>::Helpers
|
3
|
+
|
4
|
+
resource "<%= name.underscore.pluralize %>" do
|
5
|
+
|
6
|
+
desc "Get all <%= name.underscore.pluralize %>"
|
7
|
+
paginate per_page: Pagy::VARS[:items], max_per_page: Pagy::VARS[:max_per_page]
|
8
|
+
get "/" do
|
9
|
+
results = <%= name.camelize.singularize %>.all
|
10
|
+
resources = paginate(results)
|
11
|
+
present_metas resources
|
12
|
+
present :<%= name.underscore %>, resources, with: <%= GrapeResource.class_name_prefix %>::<%= name.camelize.pluralize %>::Entities::<%= name.camelize.singularize %>
|
13
|
+
end
|
14
|
+
|
15
|
+
desc "Get <%= name.underscore.singularize %> by id"
|
16
|
+
params do
|
17
|
+
requires :id, type: String
|
18
|
+
end
|
19
|
+
get "/:id" do
|
20
|
+
results = <%= name.camelize.singularize %>.find(params.id)
|
21
|
+
present :<%= name.underscore %>, results, with: <%= GrapeResource.class_name_prefix %>::<%= name.camelize.pluralize %>::Entities::<%= name.camelize.singularize %>
|
22
|
+
end
|
23
|
+
|
24
|
+
desc "Create"
|
25
|
+
params do
|
26
|
+
<% @entities.each do |k, v| %>remove
|
27
|
+
optional :<%= k %>, type: <%= v %>
|
28
|
+
<% end %>remove
|
29
|
+
end
|
30
|
+
post "/" do
|
31
|
+
p = <%= name.camelize.singularize %>.new <%= name.underscore.singularize %>_params
|
32
|
+
results = p.save!
|
33
|
+
present :status, results
|
34
|
+
present :<%= name.underscore %>, p, with: <%= GrapeResource.class_name_prefix %>::<%= name.camelize.pluralize %>::Entities::<%= name.camelize.singularize %>
|
35
|
+
end
|
36
|
+
|
37
|
+
desc "Update"
|
38
|
+
params do
|
39
|
+
requires :id, type: String
|
40
|
+
<% @entities.each do |k, v| %>remove
|
41
|
+
optional :<%= k %>, type: <%= v %>
|
42
|
+
<% end %>remove
|
43
|
+
end
|
44
|
+
put "/" do
|
45
|
+
p = <%= name.camelize.singularize %>.find(params.id)
|
46
|
+
p.update <%= name.underscore.singularize %>_params
|
47
|
+
present :<%= name.underscore %>, p, with: <%= GrapeResource.class_name_prefix %>::<%= name.camelize.pluralize %>::Entities::<%= name.camelize.singularize %>
|
48
|
+
end
|
49
|
+
|
50
|
+
desc "Delete"
|
51
|
+
params do
|
52
|
+
requires :id, type: String
|
53
|
+
end
|
54
|
+
delete "/" do
|
55
|
+
q = <%= name.camelize.singularize %>.find params.id
|
56
|
+
q.destroy!
|
57
|
+
success = "Success deleted data with id #{params.id}"
|
58
|
+
present :status, success
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
helpers do
|
64
|
+
def <%= name.underscore.singularize %>_params
|
65
|
+
ActionController::Parameters.new(params).permit(<%= @entities.keys.map { |a| a.to_sym } %>)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
module API
|
2
|
+
module V1
|
3
|
+
module <%= name.camelize.pluralize %>
|
4
|
+
class Routes < Grape::API
|
5
|
+
# Format response
|
6
|
+
<%= GrapeResource.success_formatter %>
|
7
|
+
<%= GrapeResource.error_formatter %>
|
8
|
+
|
9
|
+
mount <%= GrapeResource.class_name_prefix %>::<%= name.camelize.pluralize %>::Resources::<%= @name_of_class %>
|
10
|
+
<%= GrapeResource.entry_point_routes %> -- DONT REMOVE THIS LINE
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
data/lib/grape_resource.rb
CHANGED
@@ -8,4 +8,7 @@ module GrapeResource
|
|
8
8
|
|
9
9
|
define_setting :directory, "controllers/API/v1/"
|
10
10
|
define_setting :class_name_prefix, "API::V1"
|
11
|
+
define_setting :entry_point_routes, "# Routes entry point"
|
12
|
+
define_setting :success_formatter, "formatter :json, ::API::SuccessFormatter"
|
13
|
+
define_setting :error_formatter, "error_formatter :json, ::API::ErrorFormatter"
|
11
14
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: grape_resource
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yunan Helmy
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2019-
|
12
|
+
date: 2019-07-08 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: bundler
|
@@ -88,8 +88,16 @@ files:
|
|
88
88
|
- bin/console
|
89
89
|
- bin/setup
|
90
90
|
- grape_resource.gemspec
|
91
|
+
- lib/generators/grape_resource/generator_helpers.rb
|
91
92
|
- lib/generators/grape_resource/install_generator.rb
|
93
|
+
- lib/generators/grape_resource/namespace_generator.rb
|
94
|
+
- lib/generators/grape_resource/rest_generator.rb
|
95
|
+
- lib/generators/templates/entities.rb.erb
|
92
96
|
- lib/generators/templates/initializer.rb
|
97
|
+
- lib/generators/templates/namespace/namespace_endpoint.rb.erb
|
98
|
+
- lib/generators/templates/rest/rest_endpoint.rb.erb
|
99
|
+
- lib/generators/templates/routes.rb.erb
|
100
|
+
- lib/generators/templates/specs.rb.erb
|
93
101
|
- lib/grape_resource.rb
|
94
102
|
- lib/grape_resource/configuration.rb
|
95
103
|
- lib/grape_resource/version.rb
|