jsonapi_compliable 0.10.3 → 0.10.4
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/lib/generators/jsonapi/resource_generator.rb +97 -89
- data/lib/generators/jsonapi/templates/controller.rb.erb +14 -1
- data/lib/generators/jsonapi/templates/create_request_spec.rb.erb +1 -1
- data/lib/generators/jsonapi/templates/destroy_request_spec.rb.erb +1 -1
- data/lib/generators/jsonapi/templates/index_request_spec.rb.erb +1 -1
- data/lib/generators/jsonapi/templates/payload.rb.erb +4 -0
- data/lib/generators/jsonapi/templates/serializer.rb.erb +3 -0
- data/lib/generators/jsonapi/templates/show_request_spec.rb.erb +1 -1
- data/lib/generators/jsonapi/templates/update_request_spec.rb.erb +1 -1
- data/lib/jsonapi_compliable/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f0dfed95b2e591f55607d09e2e9474d3b829c2c5
|
4
|
+
data.tar.gz: fdcb00d3692b33d53723c8fdf36e567d46b4548d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3d5358d1bcf58341f5e77d4213a4b975390f6c97846ac21401c0d21996a97cc6c5dcaeeb4a79e0256c2bc9bb33ae2ce828157ac2bdf733cdcf08c6256d26095e
|
7
|
+
data.tar.gz: f5140772a00d7cde5f1b73a889dee660eb7d3fd895a1a710d3ff6be827ebedea47484ad115d67a15a423ebcd5f6892c962b61660c3a2afe7429e4918996fdcd7
|
@@ -2,41 +2,18 @@ module Jsonapi
|
|
2
2
|
class ResourceGenerator < ::Rails::Generators::NamedBase
|
3
3
|
source_root File.expand_path('../templates', __FILE__)
|
4
4
|
|
5
|
+
argument :attributes, type: :array, default: [], banner: "field[:type][:index] field[:type][:index]"
|
6
|
+
|
5
7
|
class_option :'omit-comments',
|
6
8
|
type: :boolean,
|
7
9
|
default: false,
|
8
10
|
aliases: ['--omit-comments', '-c'],
|
9
11
|
desc: 'Generate without documentation comments'
|
10
|
-
class_option :'
|
11
|
-
type: :
|
12
|
-
default:
|
13
|
-
aliases: ['--
|
14
|
-
desc: '
|
15
|
-
class_option :'omit-serializer',
|
16
|
-
type: :boolean,
|
17
|
-
default: false,
|
18
|
-
aliases: ['--omit-serializer', '-s'],
|
19
|
-
desc: 'Generate without serializer'
|
20
|
-
class_option :'omit-payload',
|
21
|
-
type: :boolean,
|
22
|
-
default: false,
|
23
|
-
aliases: ['--omit-payload', '-p'],
|
24
|
-
desc: 'Generate without spec payload'
|
25
|
-
class_option :'omit-strong-resource',
|
26
|
-
type: :boolean,
|
27
|
-
default: false,
|
28
|
-
aliases: ['--omit-strong-resource', '-r'],
|
29
|
-
desc: 'Generate without strong resource'
|
30
|
-
class_option :'omit-route',
|
31
|
-
type: :boolean,
|
32
|
-
default: false,
|
33
|
-
aliases: ['--omit-route'],
|
34
|
-
desc: 'Generate without specs'
|
35
|
-
class_option :'omit-tests',
|
36
|
-
type: :boolean,
|
37
|
-
default: false,
|
38
|
-
aliases: ['--omit-tests', '-t'],
|
39
|
-
desc: 'Generate without specs'
|
12
|
+
class_option :'actions',
|
13
|
+
type: :array,
|
14
|
+
default: nil,
|
15
|
+
aliases: ['--actions', '-a'],
|
16
|
+
desc: 'Array of controller actions to support, e.g. "index show destroy"'
|
40
17
|
|
41
18
|
desc "This generator creates a resource file at app/resources, as well as corresponding controller/specs/route/etc"
|
42
19
|
def copy_resource_file
|
@@ -44,18 +21,30 @@ module Jsonapi
|
|
44
21
|
raise "You must define a #{class_name} model before generating the corresponding resource."
|
45
22
|
end
|
46
23
|
|
47
|
-
generate_controller
|
48
|
-
generate_serializer
|
24
|
+
generate_controller
|
25
|
+
generate_serializer
|
49
26
|
generate_application_resource unless application_resource_defined?
|
50
|
-
generate_spec_payload
|
51
|
-
|
52
|
-
|
53
|
-
|
27
|
+
generate_spec_payload
|
28
|
+
|
29
|
+
if actions?('create', 'update')
|
30
|
+
generate_strong_resource
|
31
|
+
end
|
32
|
+
|
33
|
+
generate_route
|
34
|
+
generate_tests
|
54
35
|
generate_resource
|
55
36
|
end
|
56
37
|
|
57
38
|
private
|
58
39
|
|
40
|
+
def actions
|
41
|
+
@options['actions'] || %w(index show create update destroy)
|
42
|
+
end
|
43
|
+
|
44
|
+
def actions?(*methods)
|
45
|
+
methods.any? { |m| actions.include?(m) }
|
46
|
+
end
|
47
|
+
|
59
48
|
def omit_comments?
|
60
49
|
@options['omit-comments']
|
61
50
|
end
|
@@ -65,19 +54,11 @@ module Jsonapi
|
|
65
54
|
template('controller.rb.erb', to)
|
66
55
|
end
|
67
56
|
|
68
|
-
def omit_controller?
|
69
|
-
@options['omit-controller']
|
70
|
-
end
|
71
|
-
|
72
57
|
def generate_serializer
|
73
58
|
to = File.join('app/serializers', class_path, "serializable_#{file_name}.rb")
|
74
59
|
template('serializer.rb.erb', to)
|
75
60
|
end
|
76
61
|
|
77
|
-
def omit_serializer?
|
78
|
-
@options['omit-serializer']
|
79
|
-
end
|
80
|
-
|
81
62
|
def generate_application_resource
|
82
63
|
to = File.join('app/resources', class_path, "application_resource.rb")
|
83
64
|
template('application_resource.rb.erb', to)
|
@@ -92,69 +73,62 @@ module Jsonapi
|
|
92
73
|
template('payload.rb.erb', to)
|
93
74
|
end
|
94
75
|
|
95
|
-
def omit_spec_payload?
|
96
|
-
@options['no-payload']
|
97
|
-
end
|
98
|
-
|
99
76
|
def generate_strong_resource
|
100
|
-
code =
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
end
|
77
|
+
code = " strong_resource :#{file_name} do\n"
|
78
|
+
attributes.each do |a|
|
79
|
+
code << " attribute :#{a.name}, :#{a.type}\n"
|
80
|
+
end
|
81
|
+
code << " end\n"
|
105
82
|
|
106
|
-
STR
|
107
83
|
inject_into_file 'config/initializers/strong_resources.rb', after: "StrongResources.configure do\n" do
|
108
84
|
code
|
109
85
|
end
|
110
86
|
end
|
111
87
|
|
112
|
-
def omit_strong_resource?
|
113
|
-
@options['no-strong-resources']
|
114
|
-
end
|
115
|
-
|
116
88
|
def generate_route
|
117
|
-
code =
|
118
|
-
|
119
|
-
|
89
|
+
code = " resources :#{type}"
|
90
|
+
code << ", only: [#{actions.map { |a| ":#{a}" }.join(', ')}]" if actions.length < 5
|
91
|
+
code << "\n"
|
120
92
|
inject_into_file 'config/routes.rb', after: "scope path: '/v1' do\n" do
|
121
93
|
code
|
122
94
|
end
|
123
95
|
end
|
124
96
|
|
125
|
-
def omit_route?
|
126
|
-
@options['no-route']
|
127
|
-
end
|
128
|
-
|
129
97
|
def generate_tests
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
class_path,
|
137
|
-
"show_spec.rb"
|
138
|
-
template('show_request_spec.rb.erb', to)
|
98
|
+
if actions?('index')
|
99
|
+
to = File.join "spec/api/v1/#{file_name.pluralize}",
|
100
|
+
class_path,
|
101
|
+
"index_spec.rb"
|
102
|
+
template('index_request_spec.rb.erb', to)
|
103
|
+
end
|
139
104
|
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
105
|
+
if actions?('show')
|
106
|
+
to = File.join "spec/api/v1/#{file_name.pluralize}",
|
107
|
+
class_path,
|
108
|
+
"show_spec.rb"
|
109
|
+
template('show_request_spec.rb.erb', to)
|
110
|
+
end
|
144
111
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
112
|
+
if actions?('create')
|
113
|
+
to = File.join "spec/api/v1/#{file_name.pluralize}",
|
114
|
+
class_path,
|
115
|
+
"create_spec.rb"
|
116
|
+
template('create_request_spec.rb.erb', to)
|
117
|
+
end
|
149
118
|
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
119
|
+
if actions?('update')
|
120
|
+
to = File.join "spec/api/v1/#{file_name.pluralize}",
|
121
|
+
class_path,
|
122
|
+
"update_spec.rb"
|
123
|
+
template('update_request_spec.rb.erb', to)
|
124
|
+
end
|
155
125
|
|
156
|
-
|
157
|
-
|
126
|
+
if actions?('destroy')
|
127
|
+
to = File.join "spec/api/v1/#{file_name.pluralize}",
|
128
|
+
class_path,
|
129
|
+
"destroy_spec.rb"
|
130
|
+
template('destroy_request_spec.rb.erb', to)
|
131
|
+
end
|
158
132
|
end
|
159
133
|
|
160
134
|
def generate_resource
|
@@ -162,6 +136,40 @@ module Jsonapi
|
|
162
136
|
template('resource.rb.erb', to)
|
163
137
|
end
|
164
138
|
|
139
|
+
def jsonapi_config
|
140
|
+
File.exists?('.jsonapicfg.yml') ? YAML.load_file('.jsonapicfg.yml') : {}
|
141
|
+
end
|
142
|
+
|
143
|
+
def update_config!(attrs)
|
144
|
+
config = jsonapi_config.merge(attrs)
|
145
|
+
File.open('.jsonapicfg.yml', 'w') { |f| f.write(config.to_yaml) }
|
146
|
+
end
|
147
|
+
|
148
|
+
def prompt(header: nil, description: nil, default: nil)
|
149
|
+
say(set_color("\n#{header}", :magenta, :bold)) if header
|
150
|
+
say("\n#{description}") if description
|
151
|
+
answer = ask(set_color("\n(default: #{default}):", :magenta, :bold))
|
152
|
+
answer = default if answer.blank? && default != 'nil'
|
153
|
+
say(set_color("\nGot it!\n", :white, :bold))
|
154
|
+
answer
|
155
|
+
end
|
156
|
+
|
157
|
+
def api_namespace
|
158
|
+
@api_namespace ||= begin
|
159
|
+
ns = jsonapi_config['namespace']
|
160
|
+
|
161
|
+
if ns.blank?
|
162
|
+
ns = prompt \
|
163
|
+
header: "What is your API namespace?",
|
164
|
+
description: "This will be used as a route prefix, e.g. if you want the route '/books_api/v1/authors' your namespace would be 'books_api'",
|
165
|
+
default: 'api'
|
166
|
+
update_config!('namespace' => ns)
|
167
|
+
end
|
168
|
+
|
169
|
+
ns
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
165
173
|
def model_klass
|
166
174
|
class_name.safe_constantize
|
167
175
|
end
|
@@ -5,12 +5,14 @@ class <%= model_klass.name.pluralize %>Controller < ApplicationController
|
|
5
5
|
<%- end -%>
|
6
6
|
jsonapi resource: <%= model_klass %>Resource
|
7
7
|
|
8
|
+
<%- if actions?('create', 'update') -%>
|
8
9
|
<%- unless omit_comments? -%>
|
9
10
|
# Reference a strong resource payload defined in
|
10
11
|
# config/initializers/strong_resources.rb
|
11
12
|
<%- end -%>
|
12
13
|
strong_resource :<%= file_name %>
|
13
|
-
|
14
|
+
<%- end -%>
|
15
|
+
<%- if actions?('create', 'update') -%>
|
14
16
|
<%- unless omit_comments? -%>
|
15
17
|
# Run strong parameter validation for these actions.
|
16
18
|
# Invalid keys will be dropped.
|
@@ -19,6 +21,8 @@ class <%= model_klass.name.pluralize %>Controller < ApplicationController
|
|
19
21
|
<%- end -%>
|
20
22
|
before_action :apply_strong_params, only: [:create, :update]
|
21
23
|
|
24
|
+
<%- end -%>
|
25
|
+
<%- if actions?('index') -%>
|
22
26
|
<%- unless omit_comments? -%>
|
23
27
|
# Start with a base scope and pass to render_jsonapi
|
24
28
|
<%- end -%>
|
@@ -27,6 +31,8 @@ class <%= model_klass.name.pluralize %>Controller < ApplicationController
|
|
27
31
|
render_jsonapi(<%= file_name.pluralize %>)
|
28
32
|
end
|
29
33
|
|
34
|
+
<%- end -%>
|
35
|
+
<%- if actions?('show') -%>
|
30
36
|
<%- unless omit_comments? -%>
|
31
37
|
# Call jsonapi_scope directly here so we can get behavior like
|
32
38
|
# sparse fieldsets and statistics.
|
@@ -36,6 +42,8 @@ class <%= model_klass.name.pluralize %>Controller < ApplicationController
|
|
36
42
|
render_jsonapi(scope.resolve.first, scope: false)
|
37
43
|
end
|
38
44
|
|
45
|
+
<%- end -%>
|
46
|
+
<%- if actions?('create') -%>
|
39
47
|
<%- unless omit_comments? -%>
|
40
48
|
# jsonapi_create will use the configured Resource (and adapter) to persist.
|
41
49
|
# This will handle nested relationships as well.
|
@@ -51,6 +59,8 @@ class <%= model_klass.name.pluralize %>Controller < ApplicationController
|
|
51
59
|
end
|
52
60
|
end
|
53
61
|
|
62
|
+
<%- end -%>
|
63
|
+
<%- if actions?('update') -%>
|
54
64
|
<%- unless omit_comments? -%>
|
55
65
|
# jsonapi_update will use the configured Resource (and adapter) to persist.
|
56
66
|
# This will handle nested relationships as well.
|
@@ -66,6 +76,8 @@ class <%= model_klass.name.pluralize %>Controller < ApplicationController
|
|
66
76
|
end
|
67
77
|
end
|
68
78
|
|
79
|
+
<%- end -%>
|
80
|
+
<%- if actions?('destroy') -%>
|
69
81
|
<%- unless omit_comments? -%>
|
70
82
|
# No need for any special logic here as no_content is jsonapi_compliant.
|
71
83
|
# Customize this if you have a more complex use case.
|
@@ -75,5 +87,6 @@ class <%= model_klass.name.pluralize %>Controller < ApplicationController
|
|
75
87
|
<%= file_name %>.destroy
|
76
88
|
return head(:no_content)
|
77
89
|
end
|
90
|
+
<%- end -%>
|
78
91
|
end
|
79
92
|
<% end -%>
|
@@ -15,7 +15,7 @@ RSpec.describe "<%= type %>#create", type: :request do
|
|
15
15
|
|
16
16
|
it 'creates the resource' do
|
17
17
|
expect {
|
18
|
-
jsonapi_post "
|
18
|
+
jsonapi_post "/<%= api_namespace %>/v1/<%= type %>", payload
|
19
19
|
}.to change { <%= model_klass %>.count }.by(1)
|
20
20
|
<%= file_name %> = <%= model_klass %>.last
|
21
21
|
|
@@ -6,7 +6,7 @@ RSpec.describe "<%= type %>#destroy", type: :request do
|
|
6
6
|
|
7
7
|
it 'updates the resource' do
|
8
8
|
expect {
|
9
|
-
delete "
|
9
|
+
delete "/<%= api_namespace %>/v1/<%= type %>/#{<%= file_name %>.id}"
|
10
10
|
}.to change { <%= model_klass %>.count }.by(-1)
|
11
11
|
|
12
12
|
expect(response.status).to eq(204)
|
@@ -6,7 +6,7 @@ RSpec.describe "<%= file_name.pluralize %>#index", type: :request do
|
|
6
6
|
let!(:<%= file_name %>2) { create(:<%= file_name %>) }
|
7
7
|
|
8
8
|
it 'serializes the list correctly' do
|
9
|
-
get "
|
9
|
+
get "/<%= api_namespace %>/v1/<%= file_name.pluralize %>"
|
10
10
|
|
11
11
|
expect(json_ids(true)).to match_array([<%= file_name %>1.id, <%= file_name %>2.id])
|
12
12
|
assert_payload(:<%= file_name %>, <%= file_name %>1, json_items[0])
|
@@ -30,4 +30,8 @@
|
|
30
30
|
# For more information, see https://jsonapi-suite.github.io/jsonapi_spec_helpers/
|
31
31
|
<%- end -%>
|
32
32
|
JsonapiSpecHelpers::Payload.register(:<%= file_name %>) do
|
33
|
+
<%- attributes.each do |a| -%>
|
34
|
+
<%- type = a.type == :boolean ? [TrueClass, FalseClass] : a.type.to_s.classify -%>
|
35
|
+
key(:<%= a.name %>, <%= type %>)
|
36
|
+
<%- end -%>
|
33
37
|
end
|
@@ -5,7 +5,7 @@ RSpec.describe "<%= file_name.pluralize %>#show", type: :request do
|
|
5
5
|
let!(:<%= file_name %>) { create(:<%= file_name %>) }
|
6
6
|
|
7
7
|
it 'serializes the resource correctly' do
|
8
|
-
get "
|
8
|
+
get "/<%= api_namespace %>/v1/<%= file_name.pluralize %>/#{<%= file_name %>.id}"
|
9
9
|
|
10
10
|
assert_payload(:<%= file_name %>, <%= file_name %>, json_item)
|
11
11
|
end
|
@@ -19,7 +19,7 @@ RSpec.describe "<%= type %>#update", type: :request do
|
|
19
19
|
# Replace 'xit' with 'it' after adding attributes
|
20
20
|
xit 'updates the resource' do
|
21
21
|
expect {
|
22
|
-
jsonapi_put "
|
22
|
+
jsonapi_put "/<%= api_namespace %>/v1/<%= type %>/#{<%= file_name %>.id}", payload
|
23
23
|
}.to change { <%= file_name %>.reload.attributes }
|
24
24
|
assert_payload(:<%= file_name %>, <%= file_name %>, json_item)
|
25
25
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jsonapi_compliable
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.10.
|
4
|
+
version: 0.10.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Lee Richmond
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: exe
|
11
11
|
cert_chain: []
|
12
|
-
date: 2017-10-
|
12
|
+
date: 2017-10-18 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: jsonapi-serializable
|