rest-api-generator 0.2.0 → 0.4.0

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b15131fc7fcedabae2098ef8f2e5e255683acda454d022304ea855ac9ce0a98a
4
- data.tar.gz: 413967d92aca8c5c65075a8dfd5d0159be5c00b29a918b5bc3a39275217b3b6b
3
+ metadata.gz: bb2c1297296ab8fb5b53e9eaa49a1569c56a564e60058f206118d9baa2423935
4
+ data.tar.gz: d6b146e4fdca8a433c2244a2baf73ef66b3f4e4c579fe497a0eef04766b4e194
5
5
  SHA512:
6
- metadata.gz: 439eb464b272818413629d6ca448c1e976603d97543600f521ff9386ba47e514c4a380b367c087a75a96cdeb5a501d707b365ca5d52d35a4cd3adf08fbddf9ec
7
- data.tar.gz: 79ec324210477f42878cadebaf87566083c6db14251de20206a2cb2a98f2fd9bcbaba969170ecc3cfcee5dae89a51a37381aeaddb29fe30c7fd4d817d769f2de
6
+ metadata.gz: 9c4cdc211df26b7d4aad4e6cc1aa61d9d3cec342b3482d0bb088ffb78a006eb1b7a262b7b2ef51afb3812cbef41b6b04e335dd103ce9be511773fcf603c729fe
7
+ data.tar.gz: b1e5c67523466113cfb88f99c842c4b26b0e9700016b8d683e53f27ce0f8f4ad24b811f3b0c1b0b2e52fc211c4c5d7f7aff85a7612640efcc2446b52ea0e1658
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- rest-api-generator (0.2.0)
4
+ rest-api-generator (0.3.0)
5
5
  anyway_config (>= 2.0.0)
6
6
  pagy
7
7
  rails (>= 5.0)
@@ -9,108 +9,123 @@ PATH
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
- actioncable (7.0.4.3)
13
- actionpack (= 7.0.4.3)
14
- activesupport (= 7.0.4.3)
12
+ actioncable (7.2.0)
13
+ actionpack (= 7.2.0)
14
+ activesupport (= 7.2.0)
15
15
  nio4r (~> 2.0)
16
16
  websocket-driver (>= 0.6.1)
17
- actionmailbox (7.0.4.3)
18
- actionpack (= 7.0.4.3)
19
- activejob (= 7.0.4.3)
20
- activerecord (= 7.0.4.3)
21
- activestorage (= 7.0.4.3)
22
- activesupport (= 7.0.4.3)
23
- mail (>= 2.7.1)
24
- net-imap
25
- net-pop
26
- net-smtp
27
- actionmailer (7.0.4.3)
28
- actionpack (= 7.0.4.3)
29
- actionview (= 7.0.4.3)
30
- activejob (= 7.0.4.3)
31
- activesupport (= 7.0.4.3)
32
- mail (~> 2.5, >= 2.5.4)
33
- net-imap
34
- net-pop
35
- net-smtp
36
- rails-dom-testing (~> 2.0)
37
- actionpack (7.0.4.3)
38
- actionview (= 7.0.4.3)
39
- activesupport (= 7.0.4.3)
40
- rack (~> 2.0, >= 2.2.0)
17
+ zeitwerk (~> 2.6)
18
+ actionmailbox (7.2.0)
19
+ actionpack (= 7.2.0)
20
+ activejob (= 7.2.0)
21
+ activerecord (= 7.2.0)
22
+ activestorage (= 7.2.0)
23
+ activesupport (= 7.2.0)
24
+ mail (>= 2.8.0)
25
+ actionmailer (7.2.0)
26
+ actionpack (= 7.2.0)
27
+ actionview (= 7.2.0)
28
+ activejob (= 7.2.0)
29
+ activesupport (= 7.2.0)
30
+ mail (>= 2.8.0)
31
+ rails-dom-testing (~> 2.2)
32
+ actionpack (7.2.0)
33
+ actionview (= 7.2.0)
34
+ activesupport (= 7.2.0)
35
+ nokogiri (>= 1.8.5)
36
+ racc
37
+ rack (>= 2.2.4, < 3.2)
38
+ rack-session (>= 1.0.1)
41
39
  rack-test (>= 0.6.3)
42
- rails-dom-testing (~> 2.0)
43
- rails-html-sanitizer (~> 1.0, >= 1.2.0)
44
- actiontext (7.0.4.3)
45
- actionpack (= 7.0.4.3)
46
- activerecord (= 7.0.4.3)
47
- activestorage (= 7.0.4.3)
48
- activesupport (= 7.0.4.3)
40
+ rails-dom-testing (~> 2.2)
41
+ rails-html-sanitizer (~> 1.6)
42
+ useragent (~> 0.16)
43
+ actiontext (7.2.0)
44
+ actionpack (= 7.2.0)
45
+ activerecord (= 7.2.0)
46
+ activestorage (= 7.2.0)
47
+ activesupport (= 7.2.0)
49
48
  globalid (>= 0.6.0)
50
49
  nokogiri (>= 1.8.5)
51
- actionview (7.0.4.3)
52
- activesupport (= 7.0.4.3)
50
+ actionview (7.2.0)
51
+ activesupport (= 7.2.0)
53
52
  builder (~> 3.1)
54
- erubi (~> 1.4)
55
- rails-dom-testing (~> 2.0)
56
- rails-html-sanitizer (~> 1.1, >= 1.2.0)
57
- active_model_serializers (0.10.13)
58
- actionpack (>= 4.1, < 7.1)
59
- activemodel (>= 4.1, < 7.1)
53
+ erubi (~> 1.11)
54
+ rails-dom-testing (~> 2.2)
55
+ rails-html-sanitizer (~> 1.6)
56
+ active_model_serializers (0.10.14)
57
+ actionpack (>= 4.1)
58
+ activemodel (>= 4.1)
60
59
  case_transform (>= 0.2)
61
60
  jsonapi-renderer (>= 0.1.1.beta1, < 0.3)
62
- activejob (7.0.4.3)
63
- activesupport (= 7.0.4.3)
61
+ activejob (7.2.0)
62
+ activesupport (= 7.2.0)
64
63
  globalid (>= 0.3.6)
65
- activemodel (7.0.4.3)
66
- activesupport (= 7.0.4.3)
67
- activerecord (7.0.4.3)
68
- activemodel (= 7.0.4.3)
69
- activesupport (= 7.0.4.3)
70
- activestorage (7.0.4.3)
71
- actionpack (= 7.0.4.3)
72
- activejob (= 7.0.4.3)
73
- activerecord (= 7.0.4.3)
74
- activesupport (= 7.0.4.3)
64
+ activemodel (7.2.0)
65
+ activesupport (= 7.2.0)
66
+ activerecord (7.2.0)
67
+ activemodel (= 7.2.0)
68
+ activesupport (= 7.2.0)
69
+ timeout (>= 0.4.0)
70
+ activestorage (7.2.0)
71
+ actionpack (= 7.2.0)
72
+ activejob (= 7.2.0)
73
+ activerecord (= 7.2.0)
74
+ activesupport (= 7.2.0)
75
75
  marcel (~> 1.0)
76
- mini_mime (>= 1.1.0)
77
- activesupport (7.0.4.3)
78
- concurrent-ruby (~> 1.0, >= 1.0.2)
76
+ activesupport (7.2.0)
77
+ base64
78
+ bigdecimal
79
+ concurrent-ruby (~> 1.0, >= 1.3.1)
80
+ connection_pool (>= 2.2.5)
81
+ drb
79
82
  i18n (>= 1.6, < 2)
83
+ logger (>= 1.4.2)
80
84
  minitest (>= 5.1)
81
- tzinfo (~> 2.0)
82
- addressable (2.8.4)
83
- public_suffix (>= 2.0.2, < 6.0)
84
- ammeter (1.1.5)
85
+ securerandom (>= 0.3)
86
+ tzinfo (~> 2.0, >= 2.0.5)
87
+ addressable (2.8.7)
88
+ public_suffix (>= 2.0.2, < 7.0)
89
+ ammeter (1.1.7)
85
90
  activesupport (>= 3.0)
86
91
  railties (>= 3.0)
87
92
  rspec-rails (>= 2.2)
88
- anyway_config (2.4.1)
89
- ruby-next-core (>= 0.14.0)
93
+ anyway_config (2.6.4)
94
+ ruby-next-core (~> 1.0)
90
95
  ast (2.4.2)
91
- builder (3.2.4)
96
+ base64 (0.2.0)
97
+ bigdecimal (3.1.8)
98
+ builder (3.3.0)
92
99
  case_transform (0.2)
93
100
  activesupport
94
- concurrent-ruby (1.2.2)
101
+ concurrent-ruby (1.3.4)
102
+ connection_pool (2.4.1)
95
103
  crass (1.0.6)
96
104
  database_cleaner (2.0.2)
97
105
  database_cleaner-active_record (>= 2, < 3)
98
- database_cleaner-active_record (2.1.0)
106
+ database_cleaner-active_record (2.2.0)
99
107
  activerecord (>= 5.a)
100
108
  database_cleaner-core (~> 2.0.0)
101
109
  database_cleaner-core (2.0.1)
102
- date (3.3.3)
103
- diff-lcs (1.5.0)
104
- erubi (1.12.0)
105
- globalid (1.1.0)
106
- activesupport (>= 5.0)
107
- i18n (1.13.0)
110
+ date (3.3.4)
111
+ diff-lcs (1.5.1)
112
+ drb (2.2.1)
113
+ erubi (1.13.0)
114
+ globalid (1.2.1)
115
+ activesupport (>= 6.1)
116
+ i18n (1.14.5)
108
117
  concurrent-ruby (~> 1.0)
109
- json (2.6.3)
110
- json-schema (3.0.0)
118
+ io-console (0.7.2)
119
+ irb (1.14.0)
120
+ rdoc (>= 4.0.0)
121
+ reline (>= 0.4.2)
122
+ json (2.7.2)
123
+ json-schema (4.3.1)
111
124
  addressable (>= 2.8)
112
125
  jsonapi-renderer (0.2.2)
113
- loofah (2.21.2)
126
+ language_server-protocol (3.17.0.3)
127
+ logger (1.6.0)
128
+ loofah (2.22.0)
114
129
  crass (~> 1.0.2)
115
130
  nokogiri (>= 1.12.0)
116
131
  mail (2.8.1)
@@ -118,82 +133,100 @@ GEM
118
133
  net-imap
119
134
  net-pop
120
135
  net-smtp
121
- marcel (1.0.2)
122
- method_source (1.0.0)
123
- mini_mime (1.1.2)
124
- mini_portile2 (2.8.2)
125
- minitest (5.18.0)
126
- net-imap (0.3.4)
136
+ marcel (1.0.4)
137
+ mini_mime (1.1.5)
138
+ mini_portile2 (2.8.7)
139
+ minitest (5.25.0)
140
+ net-imap (0.4.14)
127
141
  date
128
142
  net-protocol
129
143
  net-pop (0.1.2)
130
144
  net-protocol
131
- net-protocol (0.2.1)
145
+ net-protocol (0.2.2)
132
146
  timeout
133
- net-smtp (0.3.3)
147
+ net-smtp (0.5.0)
134
148
  net-protocol
135
- nio4r (2.5.9)
136
- nokogiri (1.14.4)
137
- mini_portile2 (~> 2.8.0)
149
+ nio4r (2.7.3)
150
+ nokogiri (1.16.7)
151
+ mini_portile2 (~> 2.8.2)
138
152
  racc (~> 1.4)
139
- nokogiri (1.14.4-x86_64-linux)
153
+ nokogiri (1.16.7-x86_64-linux)
140
154
  racc (~> 1.4)
141
- oj (3.14.3)
142
- pagy (6.0.4)
143
- panko_serializer (0.7.9)
155
+ oj (3.16.5)
156
+ bigdecimal (>= 3.0)
157
+ ostruct (>= 0.2)
158
+ ostruct (0.6.0)
159
+ pagy (9.0.5)
160
+ panko_serializer (0.8.2)
144
161
  activesupport
145
162
  oj (> 3.11.0, < 4.0.0)
146
- parallel (1.23.0)
147
- parser (3.2.2.1)
163
+ parallel (1.26.2)
164
+ parser (3.3.4.2)
148
165
  ast (~> 2.4.1)
149
- public_suffix (5.0.1)
150
- racc (1.6.2)
151
- rack (2.2.7)
166
+ racc
167
+ psych (5.1.2)
168
+ stringio
169
+ public_suffix (6.0.1)
170
+ racc (1.8.1)
171
+ rack (3.1.7)
172
+ rack-session (2.0.0)
173
+ rack (>= 3.0.0)
152
174
  rack-test (2.1.0)
153
175
  rack (>= 1.3)
154
- rails (7.0.4.3)
155
- actioncable (= 7.0.4.3)
156
- actionmailbox (= 7.0.4.3)
157
- actionmailer (= 7.0.4.3)
158
- actionpack (= 7.0.4.3)
159
- actiontext (= 7.0.4.3)
160
- actionview (= 7.0.4.3)
161
- activejob (= 7.0.4.3)
162
- activemodel (= 7.0.4.3)
163
- activerecord (= 7.0.4.3)
164
- activestorage (= 7.0.4.3)
165
- activesupport (= 7.0.4.3)
176
+ rackup (2.1.0)
177
+ rack (>= 3)
178
+ webrick (~> 1.8)
179
+ rails (7.2.0)
180
+ actioncable (= 7.2.0)
181
+ actionmailbox (= 7.2.0)
182
+ actionmailer (= 7.2.0)
183
+ actionpack (= 7.2.0)
184
+ actiontext (= 7.2.0)
185
+ actionview (= 7.2.0)
186
+ activejob (= 7.2.0)
187
+ activemodel (= 7.2.0)
188
+ activerecord (= 7.2.0)
189
+ activestorage (= 7.2.0)
190
+ activesupport (= 7.2.0)
166
191
  bundler (>= 1.15.0)
167
- railties (= 7.0.4.3)
168
- rails-dom-testing (2.0.3)
169
- activesupport (>= 4.2.0)
192
+ railties (= 7.2.0)
193
+ rails-dom-testing (2.2.0)
194
+ activesupport (>= 5.0.0)
195
+ minitest
170
196
  nokogiri (>= 1.6)
171
- rails-html-sanitizer (1.5.0)
172
- loofah (~> 2.19, >= 2.19.1)
173
- railties (7.0.4.3)
174
- actionpack (= 7.0.4.3)
175
- activesupport (= 7.0.4.3)
176
- method_source
197
+ rails-html-sanitizer (1.6.0)
198
+ loofah (~> 2.21)
199
+ nokogiri (~> 1.14)
200
+ railties (7.2.0)
201
+ actionpack (= 7.2.0)
202
+ activesupport (= 7.2.0)
203
+ irb (~> 1.13)
204
+ rackup (>= 1.0.0)
177
205
  rake (>= 12.2)
178
- thor (~> 1.0)
179
- zeitwerk (~> 2.5)
206
+ thor (~> 1.0, >= 1.2.2)
207
+ zeitwerk (~> 2.6)
180
208
  rainbow (3.1.1)
181
- rake (13.0.6)
182
- regexp_parser (2.8.0)
183
- rexml (3.2.5)
184
- rspec (3.12.0)
185
- rspec-core (~> 3.12.0)
186
- rspec-expectations (~> 3.12.0)
187
- rspec-mocks (~> 3.12.0)
188
- rspec-core (3.12.2)
189
- rspec-support (~> 3.12.0)
190
- rspec-expectations (3.12.3)
209
+ rake (13.2.1)
210
+ rdoc (6.7.0)
211
+ psych (>= 4.0.0)
212
+ regexp_parser (2.9.2)
213
+ reline (0.5.9)
214
+ io-console (~> 0.5)
215
+ rexml (3.3.5)
216
+ strscan
217
+ rspec (3.13.0)
218
+ rspec-core (~> 3.13.0)
219
+ rspec-expectations (~> 3.13.0)
220
+ rspec-mocks (~> 3.13.0)
221
+ rspec-core (3.13.0)
222
+ rspec-support (~> 3.13.0)
223
+ rspec-expectations (3.13.1)
191
224
  diff-lcs (>= 1.2.0, < 2.0)
192
- rspec-support (~> 3.12.0)
193
- rspec-mocks (3.12.5)
225
+ rspec-support (~> 3.13.0)
226
+ rspec-mocks (3.13.1)
194
227
  diff-lcs (>= 1.2.0, < 2.0)
195
- rspec-support (~> 3.12.0)
196
- rspec-rails (6.0.2)
228
+ rspec-support (~> 3.13.0)
229
+ rspec-rails (6.0.4)
197
230
  actionpack (>= 6.1)
198
231
  activesupport (>= 6.1)
199
232
  railties (>= 6.1)
@@ -201,70 +234,81 @@ GEM
201
234
  rspec-expectations (~> 3.12)
202
235
  rspec-mocks (~> 3.12)
203
236
  rspec-support (~> 3.12)
204
- rspec-support (3.12.0)
205
- rswag (2.9.0)
206
- rswag-api (= 2.9.0)
207
- rswag-specs (= 2.9.0)
208
- rswag-ui (= 2.9.0)
209
- rswag-api (2.9.0)
210
- railties (>= 3.1, < 7.1)
211
- rswag-specs (2.9.0)
212
- activesupport (>= 3.1, < 7.1)
213
- json-schema (>= 2.2, < 4.0)
214
- railties (>= 3.1, < 7.1)
237
+ rspec-support (3.13.1)
238
+ rswag (2.14.0)
239
+ rswag-api (= 2.14.0)
240
+ rswag-specs (= 2.14.0)
241
+ rswag-ui (= 2.14.0)
242
+ rswag-api (2.14.0)
243
+ activesupport (>= 5.2, < 8.0)
244
+ railties (>= 5.2, < 8.0)
245
+ rswag-specs (2.14.0)
246
+ activesupport (>= 5.2, < 8.0)
247
+ json-schema (>= 2.2, < 5.0)
248
+ railties (>= 5.2, < 8.0)
215
249
  rspec-core (>= 2.14)
216
- rswag-ui (2.9.0)
217
- actionpack (>= 3.1, < 7.1)
218
- railties (>= 3.1, < 7.1)
219
- rubocop (1.51.0)
250
+ rswag-ui (2.14.0)
251
+ actionpack (>= 5.2, < 8.0)
252
+ railties (>= 5.2, < 8.0)
253
+ rubocop (1.64.1)
220
254
  json (~> 2.3)
255
+ language_server-protocol (>= 3.17.0)
221
256
  parallel (~> 1.10)
222
- parser (>= 3.2.0.0)
257
+ parser (>= 3.3.0.2)
223
258
  rainbow (>= 2.2.2, < 4.0)
224
259
  regexp_parser (>= 1.8, < 3.0)
225
260
  rexml (>= 3.2.5, < 4.0)
226
- rubocop-ast (>= 1.28.0, < 2.0)
261
+ rubocop-ast (>= 1.31.1, < 2.0)
227
262
  ruby-progressbar (~> 1.7)
228
263
  unicode-display_width (>= 2.4.0, < 3.0)
229
- rubocop-ast (1.28.1)
230
- parser (>= 3.2.1.0)
231
- rubocop-capybara (2.18.0)
264
+ rubocop-ast (1.32.0)
265
+ parser (>= 3.3.1.0)
266
+ rubocop-capybara (2.21.0)
232
267
  rubocop (~> 1.41)
233
- rubocop-factory_bot (2.22.0)
234
- rubocop (~> 1.33)
235
- rubocop-performance (1.17.1)
236
- rubocop (>= 1.7.0, < 2.0)
237
- rubocop-ast (>= 0.4.0)
238
- rubocop-rails (2.19.1)
268
+ rubocop-factory_bot (2.26.1)
269
+ rubocop (~> 1.61)
270
+ rubocop-performance (1.21.0)
271
+ rubocop (>= 1.48.1, < 2.0)
272
+ rubocop-ast (>= 1.31.1, < 2.0)
273
+ rubocop-rails (2.25.0)
239
274
  activesupport (>= 4.2.0)
240
275
  rack (>= 1.1)
241
276
  rubocop (>= 1.33.0, < 2.0)
242
- rubocop-rspec (2.22.0)
243
- rubocop (~> 1.33)
277
+ rubocop-ast (>= 1.31.1, < 2.0)
278
+ rubocop-rspec (2.29.2)
279
+ rubocop (~> 1.40)
244
280
  rubocop-capybara (~> 2.17)
245
281
  rubocop-factory_bot (~> 2.22)
246
- rubocop-shopify (2.13.0)
247
- rubocop (~> 1.50)
248
- ruby-next-core (0.15.3)
282
+ rubocop-rspec_rails (~> 2.28)
283
+ rubocop-rspec_rails (2.29.1)
284
+ rubocop (~> 1.61)
285
+ rubocop-shopify (2.15.1)
286
+ rubocop (~> 1.51)
287
+ ruby-next-core (1.0.3)
249
288
  ruby-progressbar (1.13.0)
250
- sqlite3 (1.6.2)
289
+ securerandom (0.3.1)
290
+ sqlite3 (2.0.4)
251
291
  mini_portile2 (~> 2.8.0)
252
- sqlite3 (1.6.2-x86_64-linux)
253
- switchcop (0.1.3)
254
- rubocop (~> 1.48)
255
- rubocop-performance (~> 1.16)
256
- rubocop-rails (~> 2.18)
257
- rubocop-rspec (~> 2.19)
258
- rubocop-shopify (~> 2.12)
259
- thor (1.2.2)
260
- timeout (0.3.2)
292
+ sqlite3 (2.0.4-x86_64-linux-gnu)
293
+ stringio (3.1.1)
294
+ strscan (3.1.0)
295
+ switchcop (0.1.7)
296
+ rubocop (= 1.64.1)
297
+ rubocop-performance (= 1.21.0)
298
+ rubocop-rails (= 2.25.0)
299
+ rubocop-rspec (= 2.29.2)
300
+ rubocop-shopify (= 2.15.1)
301
+ thor (1.3.1)
302
+ timeout (0.4.1)
261
303
  tzinfo (2.0.6)
262
304
  concurrent-ruby (~> 1.0)
263
- unicode-display_width (2.4.2)
264
- websocket-driver (0.7.5)
305
+ unicode-display_width (2.5.0)
306
+ useragent (0.16.10)
307
+ webrick (1.8.1)
308
+ websocket-driver (0.7.6)
265
309
  websocket-extensions (>= 0.1.0)
266
310
  websocket-extensions (0.1.5)
267
- zeitwerk (2.6.8)
311
+ zeitwerk (2.6.17)
268
312
 
269
313
  PLATFORMS
270
314
  ruby
@@ -285,4 +329,4 @@ DEPENDENCIES
285
329
  switchcop
286
330
 
287
331
  BUNDLED WITH
288
- 2.3.3
332
+ 2.4.19
data/README.md CHANGED
@@ -3,6 +3,11 @@
3
3
  This gem helps you to build a Ruby on Rails REST API faster, using a scaffold-like generator that follows the best
4
4
  practices.
5
5
 
6
+ ## Get started
7
+
8
+ :zap: **Quick Start**: [docs](https://rest-api-generator.switchdreams.com.br/quick-start)\
9
+ :books: **Documentation**: [docs](https://rest-api-generator.switchdreams.com.br/)
10
+
6
11
  ## How it works?
7
12
 
8
13
  The gems use vanilla Rails generators in combination with our templates to create all the resources needed to build a
@@ -27,6 +32,7 @@ Following [Switch Dreams's](https://www.switchdreams.com.br/]) coding practices,
27
32
  - [Resource pagination](#pagination)
28
33
  - [Resource serialization](#serialization)
29
34
  - [Configurable](#configuration)
35
+ - [Callbacks](#callbacks)
30
36
 
31
37
  ## Next Features
32
38
 
@@ -34,343 +40,12 @@ Following [Switch Dreams's](https://www.switchdreams.com.br/]) coding practices,
34
40
  - Select fields
35
41
  - User auth module
36
42
 
37
- ## Installation
38
-
39
- Add this line to your application's Gemfile:
40
-
41
- ```ruby
42
- # Build a Ruby on Rails REST API faster
43
- gem 'rest-api-generator'
44
- ```
45
-
46
- And then execute:
47
-
48
- $ bundle install
49
-
50
- Or install it yourself as:
51
-
52
- $ gem install rest-api-generator
53
-
54
- ## Requirements
55
-
56
- 1. You need to have installed RSpec and FactoryBot in your application.
57
-
58
- <ul>
59
- <li>RSpec: https://github.com/rspec/rspec-rails</li>
60
- <li>Factory bot: https://github.com/thoughtbot/factory_bot_rails</li>
61
- </ul>
62
-
63
- 2. Include in ApplicationController the error handler module:
64
-
65
- ```ruby
66
-
67
- class ApplicationController < ActionController::API
68
- include RestApiGenerator::ErrorHandler
69
- end
70
- ```
71
-
72
- This error handler will rescue from: `ActiveRecord::RecordNotFound`
73
- , `ActiveRecord::ActiveRecordError`, `ActiveRecord::RecordInvalid`, `ActiveModel::ValidationError`
74
- , `RestApiGenerator::CustomError`.
75
-
76
- ## Usage
77
-
78
- ### Generate Resource
79
-
80
- ```bash
81
- $ rails g rest_api_generator:resource table_name attributes
82
- ```
83
-
84
- This command will create:
85
-
86
- - **Model and Migration**: Using rails default model generator
87
- - **Controller**: A controller that implementes CRUD by inheritance of `RestApiGenerator::ResourceController`, or you
88
- can use eject option for create a controller
89
- that implements index, show, create, update and destroy methods.
90
- - **Specs for the created controller**
91
- - **Factory bot factory for created model**
92
- - **Routes**: with rails resources
93
-
94
- ### Example
95
-
96
- ```bash
97
- $ rails g rest_api_generator:resource car name:string color:string
98
- ```
99
-
100
- Will generate following controller and the other files:
101
-
102
- ```ruby
103
- # app/controllers/cars_controller.rb
104
- class CarsController < RestApiGenerator::ResourceController
105
- end
106
- ```
107
-
108
- For a better experience you can override some methods from the
109
- [default controller](https://github.com/SwitchDreams/rest-api-generator/blob/main/lib/rest_api_generator/resource_controller.rb)
110
-
111
- ### Options
112
-
113
- | Option | Goal | Default | Usage Example |
114
- |--------|--------------------------------------------------------------|---------|-----------------|
115
- | father | Generate nested resource | nil | --father Users |
116
- | scope | Scope the resource for other route or namespace organization | nil | --scope Api::V1 |
117
- | eject | Eject the controller to high customization | false | true |
118
- | spec | Choose the spec format. Current options: "rspec" or "rswag" | rspec | --spec rswag |
119
-
120
- #### Scope
121
-
122
- In REST api one of the best practices is versioning the end-points, and you can achieve this using scope options,
123
- example:
124
-
125
- ```bash
126
- # Command
127
- rails g rest_api_generator:resource car name:string color:string --scope Api::V1
128
- ```
129
-
130
- ```ruby
131
- # GET api/v1/cars
132
- module Api::V1
133
- class CarsController < RestApiGenerator::ResourceController
134
- end
135
- end
136
- ```
137
-
138
- For this option you need to manually setup routes, for this example:
139
-
140
- ```ruby
141
- # routes.rb
142
- namespace :api do
143
- namespace :v1 do
144
- resources :cars
145
- end
146
- end
147
- ```
148
-
149
- #### Nested resource
150
-
151
- In REST api sometimes we need to build a nested resource, for example when we need to get all devices from a user, for
152
- this we have nested resource option:
153
-
154
- ```bash
155
- # Command
156
- rails g rest_api_generator:resource Devices name:string color:string users:references --scope Users
157
- ```
158
-
159
- ```ruby
160
- # GET users/:user_id/devices
161
- module Users
162
- class DevicesController < RestApiGenerator::ChildResourceController
163
- end
164
- end
165
- ```
166
-
167
- For this option you need to manually setup routes, for this example:
168
-
169
- ```ruby
170
- # routes.rb
171
- resources :users do
172
- resources :devices, controller: 'users/devices'
173
- end
174
- ```
175
-
176
- Considerations:
177
-
178
- - The children model needs to belongs_to parent model and parent model needs to have has_many children model
179
-
180
- #### Eject
181
-
182
- Or you can use the `eject` option for create the controller with the implemented methods:
183
-
184
- ```bash
185
- rails g rest_api_generator:resource car name:string color:string --eject true
186
- ```
187
-
188
- ```ruby
189
-
190
- class CarsController < ApplicationController
191
- before_action :set_car, only: %i[show update destroy]
192
-
193
- def index
194
- @car = Car.all
195
- render json: @car, status: :ok
196
- end
197
-
198
- def show
199
- render json: @car, status: :ok
200
- end
201
-
202
- def create
203
- @car = Car.create!(car_params)
204
- render json: @car, status: :created
205
- end
206
-
207
- def update
208
- @car = Car.update!(car_params)
209
- render json: @car, status: :ok
210
- end
211
-
212
- def destroy
213
- @car.destroy!
214
- end
215
-
216
- private
217
-
218
- def set_car
219
- @car = Car.find(params[:id])
220
- end
221
-
222
- def car_params
223
- params.require(:car).permit(:name, :color)
224
- end
225
- end
226
- ```
227
-
228
- #### Specs/Docs
229
-
230
- The default generated spec for this gem is using plain rspec, but you can choose rswag, for scaffold you specs and docs
231
- at the same time:
232
-
233
- For this you need to setup https://github.com/rswag/rswag and you the following flag when generating resources.
234
-
235
- ```shell
236
- rails g rest_api_generator:resource Car name:string color:string --spec rswag
237
- ```
238
-
239
- This spec options work as generators too, so you can call them individually:
240
-
241
- ```shell
242
- # rest_api_generator:spec:rswag or rest_api_generator:spec:rspec
243
- rails g rest_api_generator:spec:rswag Car name:string color:string
244
- ```
245
-
246
- #### Configuration for specs
247
-
248
- By default, the plain rspec and rswag specs are going to be generated in the _spec/requests_ and _spec/docs_
249
- directories, respectively. You can override using the (config options)[#configuration]]. :
250
-
251
- ### Resource Features
252
-
253
- #### Modular Error Handler
254
-
255
- The error module will return a json in this following format when any active record or custom error raises.
256
-
257
- ```json
258
- {
259
- "status": 422,
260
- "error": "",
261
- "message": ""
262
- }
263
- ```
264
-
265
- This is good to padronize the error handler in front-end too.
266
-
267
- #### Ordering
268
-
269
- For ordering use this format:
270
-
271
- - Ordering asc: `GET /cars?sort=+name or GET /cars?sort=name`
272
- - Ordering desc: `GET /card?sort=-name`
273
-
274
- By default, every resource column can be the key for ordering.
275
-
276
- #### Filtering
277
-
278
- For filter is needed to add some scopes in Model file, example:
279
-
280
- ```ruby
281
- # app/models/car.rb
282
-
283
- class Car < ApplicationRecord
284
- include RestApiGenerator::Filterable
285
-
286
- filter_scope :filter_by_color, ->(color) { where(color: color) }
287
- filter_scope :filter_by_name, ->(name) { where("name LIKE ?", "%#{name}%") }
288
- end
289
- ```
290
-
291
- And It's done, you can filter your index end-point:
292
-
293
- - `GET /cars?color=blue or GET /cars?color=red&name=Ferrari`
294
-
295
- ### Pagination
296
-
297
- For pagination, you need to create pagy initialializer file (pagy.rb) in the config directory of your project.
298
- Follow [pagy's example](https://ddnexus.github.io/pagy/quick-start/) for more information.
299
-
300
- Next, you should add some lines on top of the previously created pagy file:
301
-
302
- ```ruby
303
- # config/initializers/pagy.rb
304
- require "pagy"
305
- require "pagy/extras/headers"
306
- ```
307
-
308
- At last, change the pagination variable on RestApiGenerator initializer to true;
309
-
310
- ```rb
311
- # config/initializers/rest_api_generator.rb
312
- config.pagination = true # default: false
313
- ```
314
-
315
- Note, if the parent controller is changed, it is necessary to include Pagy::Backend in the new parent.
316
-
317
- ```rb
318
- # new_parent_controller.rb
319
- class NewParentController < ActionController::Base
320
- include Pagy::Backend
321
- end
322
- ```
323
-
324
- ### Serialization
325
-
326
- If you are working with [ams](https://github.com/rails-api/active_model_serializers), the serializer will work without
327
- any extra configuration.
328
- But if you need to customize you can override the serializer method in the controller:
329
-
330
- ```ruby
331
- # Example with panko serializer: https://github.com/panko-serializer/panko_serializer
332
- class CarsController < RestApiGenerator::ResourceController
333
-
334
- # serializer used in show, create, update.
335
- def serializer(resource)
336
- Panko::CarSerializer.new.serialize_to_json(resource)
337
- end
338
-
339
- # serializer used in index.
340
- def index_serializer(resources)
341
- Panko::ArraySerializer.new(resources, each_serializer: Panko::CarSerializer).to_json
342
- end
343
- end
344
- ```
345
-
346
- ```ruby
347
- # Example with ams
348
- class CarsController < RestApiGenerator::ResourceController
349
- def serializer(resource)
350
- ActiveModelSerializers::SerializableResource.new(resource, each_serializer: Ams::CarSerializer).to_json
351
- end
352
- end
353
- ```
354
-
355
- The gem is tested with [panko serializer](https://github.com/panko-serializer/panko_serializer)
356
- and [ams](https://github.com/rails-api/active_model_serializers). But should works with any serializer, feel free to add
357
- tests for your favorite serializer.
358
-
359
- ## Configuration
360
-
361
- You can override this gem configuration using the initializer or any other method
362
- from [anyway_config](https://github.com/palkan/anyway_config):
43
+ ## Other alternatives
363
44
 
364
- ```rb
365
- # config/initializers/rest_api_generator.rb
45
+ This gem resolves a very common problem so the are a lot of alternative in the market.
366
46
 
367
- RestApiGenerator.configure do |config|
368
- config.test_path = "custom_test_dir/requests" # default: spec/requests
369
- config.docs_path = "custom_docs_dir/rswag" # default: spec/docs
370
- config.parent_class = "ApplicationController" # default: RestApiGenerator::ResourceController
371
- config.pagination = true # default: false
372
- end
373
- ```
47
+ - [decent_exposure](https://github.com/hashrocket/decent_exposure)
48
+ - [resourcerer](https://github.com/ElMassimo/resourcerer)
374
49
 
375
50
  ## Development
376
51
 
@@ -2,6 +2,7 @@
2
2
 
3
3
  module RestApiGenerator
4
4
  class ChildResourceController < RestApiGenerator.configuration.parent_controller.constantize
5
+ include ControllerCallbacks
5
6
  include Orderable
6
7
  include Serializable
7
8
 
@@ -9,7 +10,7 @@ module RestApiGenerator
9
10
  before_action :set_resource, only: [:show, :update, :destroy]
10
11
 
11
12
  def index
12
- @resources = resources
13
+ set_all_resources
13
14
  @resources = @resources.filter_resource(params_for_filter) if resource_class.include?(Filterable)
14
15
  @resources = @resources.order(ordering_params(params[:sort])) if params[:sort]
15
16
  if pagination
@@ -39,6 +40,12 @@ module RestApiGenerator
39
40
 
40
41
  private
41
42
 
43
+ def set_all_resources
44
+ run_callbacks :set_all_resources do
45
+ @resources = resources
46
+ end
47
+ end
48
+
42
49
  def resources
43
50
  @parent_resource.send(resource_class.to_s.downcase.pluralize)
44
51
  end
@@ -74,11 +81,15 @@ module RestApiGenerator
74
81
 
75
82
  # Before actions
76
83
  def set_parent_resource
77
- @parent_resource = parent_resource_class.find(parent_record_id)
84
+ run_callbacks :set_parent_resource do
85
+ @parent_resource = parent_resource_class.find(parent_record_id)
86
+ end
78
87
  end
79
88
 
80
89
  def set_resource
81
- @resource = resources.find(record_id)
90
+ run_callbacks :set_resource do
91
+ @resource = resources.find(record_id)
92
+ end
82
93
  end
83
94
 
84
95
  # UsersController => User
@@ -2,13 +2,14 @@
2
2
 
3
3
  module RestApiGenerator
4
4
  class ResourceController < RestApiGenerator.configuration.parent_controller.constantize
5
+ include ControllerCallbacks
5
6
  include Orderable
6
7
  include Serializable
7
8
 
8
9
  before_action :set_resource, only: [:show, :update, :destroy]
9
10
 
10
11
  def index
11
- @resources = resource_class.all
12
+ set_all_resources
12
13
  @resources = @resources.filter_resource(params_for_filter) if resource_class.include?(Filterable)
13
14
  @resources = @resources.order(ordering_params(params[:sort])) if params[:sort]
14
15
  if pagination
@@ -63,7 +64,15 @@ module RestApiGenerator
63
64
  end
64
65
 
65
66
  def set_resource
66
- @resource = resource_class.find(record_id)
67
+ run_callbacks :set_resource do
68
+ @resource = resource_class.find(record_id)
69
+ end
70
+ end
71
+
72
+ def set_all_resources
73
+ run_callbacks :set_all_resources do
74
+ @resources = resource_class.all
75
+ end
67
76
  end
68
77
 
69
78
  # UsersController => User
@@ -51,11 +51,9 @@ module RestApiGenerator
51
51
  end
52
52
 
53
53
  def build_model_attributes
54
- model_attributes = []
55
- attributes.each do |attribute|
56
- model_attributes << "#{attribute.name}:#{attribute.type}"
54
+ attributes.map do |attribute|
55
+ "#{attribute.name}:#{attribute.type}"
57
56
  end
58
- model_attributes
59
57
  end
60
58
  end
61
59
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module RestApiGenerator
4
+ module ControllerCallbacks
5
+ extend ActiveSupport::Concern
6
+ include ActiveSupport::Callbacks
7
+
8
+ included do
9
+ define_callbacks :set_resource
10
+ define_callbacks :set_parent_resource
11
+ define_callbacks :set_all_resources
12
+ end
13
+
14
+ module ClassMethods
15
+ # Code from rails source code
16
+ [:before, :after, :around].each do |callback|
17
+ define_method :"#{callback}_set_resource" do |*names, &blk|
18
+ _insert_callbacks(names, blk) do |name, options|
19
+ set_callback(:set_resource, callback, name, options)
20
+ end
21
+ end
22
+
23
+ define_method :"#{callback}_set_parent_resource" do |*names, &blk|
24
+ _insert_callbacks(names, blk) do |name, options|
25
+ set_callback(:set_parent_resource, callback, name, options)
26
+ end
27
+ end
28
+
29
+ define_method :"#{callback}_set_all_resources" do |*names, &blk|
30
+ _insert_callbacks(names, blk) do |name, options|
31
+ set_callback(:set_all_resources, callback, name, options)
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -21,7 +21,7 @@ module RestApiGenerator
21
21
  def filter_resource(params)
22
22
  results = where(nil)
23
23
  params.each do |key, value|
24
- results = results.public_send("filter_by_#{key}", value) if value.present?
24
+ results = results.public_send(:"filter_by_#{key}", value) if value.present?
25
25
  end
26
26
  results
27
27
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module RestApiGenerator
4
- VERSION = "0.2.0"
4
+ VERSION = "0.4.0"
5
5
  end
@@ -9,6 +9,7 @@ require_relative "rest_api_generator/helpers/render"
9
9
  require_relative "rest_api_generator/filterable"
10
10
  require_relative "rest_api_generator/orderable"
11
11
  require_relative "rest_api_generator/serializable"
12
+ require_relative "rest_api_generator/controller_callbacks"
12
13
 
13
14
  module RestApiGenerator
14
15
  class Error < StandardError; end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rest-api-generator
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - PedroAugustoRamalhoDuarte
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2023-05-15 00:00:00.000000000 Z
11
+ date: 2024-10-30 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: anyway_config
@@ -155,6 +155,7 @@ files:
155
155
  - lib/rest-api-generator.rb
156
156
  - lib/rest_api_generator.rb
157
157
  - lib/rest_api_generator/config.rb
158
+ - lib/rest_api_generator/controller_callbacks.rb
158
159
  - lib/rest_api_generator/custom_error.rb
159
160
  - lib/rest_api_generator/error_handler.rb
160
161
  - lib/rest_api_generator/filterable.rb
@@ -190,7 +191,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
190
191
  - !ruby/object:Gem::Version
191
192
  version: '0'
192
193
  requirements: []
193
- rubygems_version: 3.3.3
194
+ rubygems_version: 3.5.16
194
195
  signing_key:
195
196
  specification_version: 4
196
197
  summary: Build a Ruby on Rails REST API faster