rails-rapido 0.8.0 → 0.9.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: b6eaff7850cbfee3ff250c0346fc8803ed9b29b6abe046622c72883eac6b3777
4
- data.tar.gz: 61dfea4640f66a7fb095e618890b9224fcf3a0f371a6dbdcef9201194b1966b2
3
+ metadata.gz: ba95de45e5c2da70d27301f8e1dfa05aa67826b67e5181b1b0a1abf99c8364c1
4
+ data.tar.gz: 135e89202da1052dc49da04497896d4254fb63e20f096b6473c6ef62b66b7367
5
5
  SHA512:
6
- metadata.gz: dd665acfb46b79e7b80704cc64ba8d3fbe8780c51cb7196a3d39552f036e2df35138cb442126d1f0ca08b23038ef185b8b538a4c62de42c7403c74e3a03b6fe5
7
- data.tar.gz: c31a11e293f0e2deca6de6c69d504c1ef836c9424bb8bd18a409c1275f5030c55a5541a7751908f358fda3ed27dd56680c6bbf6407840d3a68b9ab5a7fcad6a6
6
+ metadata.gz: 7538a106aab6e8abce41e80fbf69809834bf798350298a23a695a98d9be9939f8e5f8721b4748b05d298f8249ec5b8196872279818b047ae43ba8d2e0c66aee7
7
+ data.tar.gz: afa72fbef3ad4a135dbddcb91ca8e2c2f0ecf7e1909ee863f9dc50d9a15fb0acbbf5df5a56790749e4ee63622ece92c245ef79df2f271072cb745c7908572c96
data/.rubocop.yml CHANGED
@@ -1,124 +1,431 @@
1
+ # Continue here: https://raw.githubusercontent.com/rubocop-hq/rubocop/master/config/default.yml
2
+ # TODO: Skipped rails or naming or style
3
+
1
4
  AllCops:
2
- TargetRubyVersion: 2.3
3
- # RuboCop has a bunch of cops enabled by default. This setting tells RuboCop
4
- # to ignore them, so only the ones explicitly set in this file are enabled.
5
- DisabledByDefault: true
6
5
  Exclude:
7
- - '**/templates/**/*'
8
- - '**/vendor/**/*'
9
- - 'actionpack/lib/action_dispatch/journey/parser.rb'
6
+ - 'node_modules/**/*'
7
+ - 'vendor/**/*'
8
+ - '.git/**/*'
9
+ - 'db/**/*'
10
+ - 'lib/tasks/cucumber.rake'
11
+ - 'config/routes.rb'
12
+ - 'features/**/*'
13
+ EnabledByDefault: false
14
+ DisabledByDefault: true
15
+
16
+ require: rubocop-performance
17
+
18
+ Bundler/DuplicatedGem:
19
+ Enabled: true
20
+
21
+ Bundler/InsecureProtocolSource:
22
+ Enabled: true
23
+
24
+ Bundler/OrderedGems:
25
+ Enabled: true
26
+
27
+ Gemspec/DuplicatedAssignment:
28
+ Enabled: true
29
+
30
+ Gemspec/OrderedDependencies:
31
+ Enabled: true
10
32
 
11
- # Prefer &&/|| over and/or.
12
- Style/AndOr:
33
+ Gemspec/RequiredRubyVersion:
13
34
  Enabled: true
14
35
 
15
- # Do not use braces for hash literals when they are the last argument of a
16
- # method call.
17
- Style/BracesAroundHashParameters:
36
+ Layout/BlockEndNewline:
18
37
  Enabled: true
19
38
 
20
- # Align `when` with `case`.
21
- Style/CaseIndentation:
39
+ Layout/ClassStructure:
22
40
  Enabled: true
23
41
 
24
- # Align comments with method definitions.
25
- Style/CommentIndentation:
42
+ Layout/ClosingParenthesisIndentation:
26
43
  Enabled: true
27
44
 
28
- # No extra empty lines.
29
- Style/EmptyLines:
45
+ Layout/ConditionPosition:
30
46
  Enabled: true
31
47
 
32
- # In a regular class definition, no empty lines around the body.
33
- Style/EmptyLinesAroundClassBody:
48
+ Layout/DefEndAlignment:
34
49
  Enabled: true
35
50
 
36
- # In a regular method definition, no empty lines around the body.
37
- Style/EmptyLinesAroundMethodBody:
51
+ Layout/ElseAlignment:
38
52
  Enabled: true
39
53
 
40
- # In a regular module definition, no empty lines around the body.
41
- Style/EmptyLinesAroundModuleBody:
54
+ Layout/EmptyLineBetweenDefs:
42
55
  Enabled: true
43
56
 
44
- # Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
45
- Style/HashSyntax:
57
+ Layout/EmptyLines:
46
58
  Enabled: true
47
59
 
48
- # Method definitions after `private` or `protected` isolated calls need one
49
- # extra level of indentation.
50
- Style/IndentationConsistency:
60
+ Layout/EmptyLinesAroundAccessModifier:
51
61
  Enabled: true
52
- EnforcedStyle: rails
53
62
 
54
- # Two spaces, no tabs (for indentation).
55
- Style/IndentationWidth:
63
+ Layout/EndAlignment:
56
64
  Enabled: true
57
65
 
58
- Style/SpaceAfterColon:
66
+ Layout/EndOfLine:
59
67
  Enabled: true
60
68
 
61
- Style/SpaceAfterComma:
69
+ Layout/EmptyLinesAroundArguments:
62
70
  Enabled: true
63
71
 
64
- Style/SpaceAroundEqualsInParameterDefault:
72
+ Layout/IndentationWidth:
65
73
  Enabled: true
66
74
 
67
- Style/SpaceAroundKeyword:
75
+ Layout/InitialIndentation:
68
76
  Enabled: true
69
77
 
70
- Style/SpaceAroundOperators:
78
+ Layout/LeadingEmptyLines:
71
79
  Enabled: true
72
80
 
73
- Style/SpaceBeforeFirstArg:
74
- Enabled: true
81
+ Layout/SpaceAfterColon:
82
+ Enabled: true
83
+
84
+ Layout/SpaceAfterComma:
85
+ Enabled: true
86
+
87
+ Layout/SpaceAfterNot:
88
+ Enabled: true
89
+
90
+ Layout/SpaceAfterSemicolon:
91
+ Enabled: true
92
+
93
+ Layout/SpaceAroundEqualsInParameterDefault:
94
+ Enabled: true
95
+
96
+ Layout/SpaceAroundKeyword:
97
+ Enabled: true
98
+
99
+ Layout/SpaceBeforeComma:
100
+ Enabled: true
101
+
102
+ Layout/SpaceInsideStringInterpolation:
103
+ Enabled: true
104
+
105
+ Layout/IndentationStyle:
106
+ Enabled: true
107
+
108
+ Layout/TrailingEmptyLines:
109
+ Enabled: true
110
+
111
+ Layout/TrailingWhitespace:
112
+ Enabled: true
113
+
114
+ Lint/AssignmentInCondition:
115
+ Enabled: true
116
+
117
+ Lint/BooleanSymbol:
118
+ Enabled: true
119
+
120
+ Lint/CircularArgumentReference:
121
+ Enabled: true
122
+
123
+ Lint/Debugger:
124
+ Enabled: true
125
+
126
+ Lint/DuplicateCaseCondition:
127
+ Enabled: true
128
+
129
+ Lint/DuplicateMethods:
130
+ Enabled: true
131
+
132
+ Lint/DuplicateHashKey:
133
+ Enabled: true
134
+
135
+ Lint/EachWithObjectArgument:
136
+ Enabled: true
137
+
138
+ Lint/ElseLayout:
139
+ Enabled: true
75
140
 
76
- # Defining a method with parameters needs parentheses.
77
- Style/MethodDefParentheses:
141
+ Lint/EmptyEnsure:
78
142
  Enabled: true
79
143
 
80
- # Use `foo {}` not `foo{}`.
81
- Style/SpaceBeforeBlockBraces:
144
+ Lint/EmptyExpression:
82
145
  Enabled: true
83
146
 
84
- # Use `foo { bar }` not `foo {bar}`.
85
- Style/SpaceInsideBlockBraces:
147
+ Lint/EmptyInterpolation:
86
148
  Enabled: true
87
149
 
88
- # Use `{ a: 1 }` not `{a:1}`.
89
- Style/SpaceInsideHashLiteralBraces:
150
+ Lint/EmptyWhen:
90
151
  Enabled: true
91
152
 
92
- Style/SpaceInsideParens:
153
+ Lint/EnsureReturn:
93
154
  Enabled: true
94
155
 
95
- # Check quotes usage according to lint rule below.
96
- Style/StringLiterals:
156
+ Lint/FloatOutOfRange:
97
157
  Enabled: true
98
- EnforcedStyle: single_quotes
99
158
 
100
- # Detect hard tabs, no hard tabs.
101
- Style/Tab:
159
+ Lint/FormatParameterMismatch:
102
160
  Enabled: true
103
161
 
104
- # Blank lines should not have any spaces.
105
- Style/TrailingBlankLines:
162
+ Lint/SuppressedException:
106
163
  Enabled: true
107
164
 
108
- # No trailing whitespace.
109
- Style/TrailingWhitespace:
165
+ Lint/ImplicitStringConcatenation:
110
166
  Enabled: true
111
167
 
112
- # Use quotes for string literals when they are enough.
113
- Style/UnneededPercentQ:
168
+ Lint/IneffectiveAccessModifier:
114
169
  Enabled: true
115
170
 
116
- # Align `end` with the matching keyword or starting expression except for
117
- # assignments, where it should be aligned with the LHS.
118
- Lint/EndAlignment:
171
+ Lint/InheritException:
172
+ Enabled: true
173
+
174
+ Lint/InterpolationCheck:
175
+ Enabled: true
176
+
177
+ Lint/LiteralAsCondition:
178
+ Enabled: true
179
+
180
+ Lint/LiteralInInterpolation:
181
+ Enabled: true
182
+
183
+ Lint/Loop:
184
+ Enabled: true
185
+
186
+ Lint/MissingCopEnableDirective:
187
+ Enabled: true
188
+
189
+ Lint/MultipleComparison:
190
+ Enabled: true
191
+
192
+ Lint/NestedMethodDefinition:
193
+ Enabled: true
194
+
195
+ Lint/NextWithoutAccumulator:
196
+ Enabled: true
197
+
198
+ Lint/NonLocalExitFromIterator:
199
+ Enabled: true
200
+
201
+ # This caused too much confusion.
202
+ Lint/NumberConversion:
203
+ Enabled: false
204
+
205
+ Lint/ParenthesesAsGroupedExpression:
206
+ Enabled: true
207
+
208
+ Lint/PercentStringArray:
209
+ Enabled: true
210
+
211
+ Lint/PercentSymbolArray:
212
+ Enabled: true
213
+
214
+ Lint/RandOne:
215
+ Enabled: true
216
+
217
+ Lint/RedundantWithIndex:
218
+ Enabled: true
219
+
220
+ Lint/RedundantWithObject:
221
+ Enabled: true
222
+
223
+ Lint/RegexpAsCondition:
119
224
  Enabled: true
120
- EnforcedStyleAlignWith: variable
121
225
 
122
- # Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
123
226
  Lint/RequireParentheses:
124
227
  Enabled: true
228
+
229
+ Lint/RescueException:
230
+ Enabled: true
231
+
232
+ Lint/RescueType:
233
+ Enabled: true
234
+
235
+ Lint/ReturnInVoidContext:
236
+ Enabled: true
237
+
238
+ Lint/SafeNavigationChain:
239
+ Enabled: true
240
+
241
+ Lint/SafeNavigationConsistency:
242
+ Enabled: true
243
+
244
+ Lint/ShadowedArgument:
245
+ Enabled: true
246
+
247
+ Lint/ShadowedException:
248
+ Enabled: true
249
+
250
+ Lint/ShadowingOuterLocalVariable:
251
+ Enabled: true
252
+
253
+ Lint/RedundantStringCoercion:
254
+ Enabled: true
255
+
256
+ Lint/Syntax:
257
+ Enabled: true
258
+
259
+ Lint/UnderscorePrefixedVariableName:
260
+ Enabled: true
261
+
262
+ Lint/UnifiedInteger:
263
+ Enabled: true
264
+
265
+ Lint/RedundantRequireStatement:
266
+ Enabled: true
267
+
268
+ Lint/RedundantSplatExpansion:
269
+ Enabled: true
270
+
271
+ Lint/UnreachableCode:
272
+ Enabled: true
273
+
274
+ Lint/UnusedBlockArgument:
275
+ Enabled: true
276
+
277
+ Lint/UnusedMethodArgument:
278
+ Enabled: true
279
+
280
+ Lint/UselessAccessModifier:
281
+ Enabled: true
282
+
283
+ Lint/UselessAssignment:
284
+ Enabled: true
285
+
286
+ Lint/BinaryOperatorWithIdenticalOperands:
287
+ Enabled: true
288
+
289
+ Lint/UselessElseWithoutRescue:
290
+ Enabled: true
291
+
292
+ Lint/UselessSetterCall:
293
+ Enabled: true
294
+
295
+ Lint/Void:
296
+ Enabled: true
297
+
298
+ Metrics/AbcSize:
299
+ Enabled: true
300
+ Max: 150
301
+
302
+ Metrics/BlockLength:
303
+ Enabled: true
304
+ Max: 100
305
+
306
+ Metrics/BlockNesting:
307
+ Enabled: true
308
+ Max: 3
309
+
310
+ Metrics/ClassLength:
311
+ Description: 'Avoid long classes'
312
+ Enabled: true
313
+ Max: 250
314
+
315
+ Metrics/CyclomaticComplexity:
316
+ Enabled: true
317
+ Max: 12
318
+
319
+ Layout/LineLength:
320
+ Enabled: true
321
+ Max: 200
322
+
323
+ Metrics/MethodLength:
324
+ Description: 'Avoid long methods.'
325
+ Enabled: true
326
+ Max: 30
327
+
328
+ Metrics/ModuleLength:
329
+ Description: 'Avoid long modules.'
330
+ Enabled: true
331
+ Max: 250
332
+
333
+ Metrics/ParameterLists:
334
+ Description: 'Avoid long parameter lists.'
335
+ Enabled: true
336
+ Max: 100
337
+
338
+ Metrics/PerceivedComplexity:
339
+ Enabled: true
340
+ Max: 15
341
+
342
+ Performance/Caller:
343
+ Enabled: true
344
+
345
+ Performance/Casecmp:
346
+ Enabled: true
347
+
348
+ # TODO: Re-enable
349
+ Performance/ChainArrayAllocation:
350
+ Enabled: false
351
+
352
+ Performance/CompareWithBlock:
353
+ Enabled: true
354
+
355
+ Performance/Count:
356
+ Enabled: true
357
+
358
+ Performance/Detect:
359
+ Enabled: true
360
+
361
+ Performance/DoubleStartEndWith:
362
+ Enabled: true
363
+
364
+ Performance/EndWith:
365
+ Enabled: true
366
+
367
+ Performance/FixedSize:
368
+ Enabled: true
369
+
370
+ Performance/FlatMap:
371
+ Enabled: true
372
+
373
+ Performance/InefficientHashSearch:
374
+ Enabled: true
375
+
376
+ Performance/RangeInclude:
377
+ Enabled: true
378
+
379
+ Performance/RedundantBlockCall:
380
+ Enabled: true
381
+
382
+ Performance/RedundantMatch:
383
+ Enabled: true
384
+
385
+ Performance/RedundantMerge:
386
+ Enabled: true
387
+
388
+ Style/RedundantSortBy:
389
+ Enabled: true
390
+
391
+ Performance/RegexpMatch:
392
+ Enabled: true
393
+
394
+ Performance/ReverseEach:
395
+ Enabled: true
396
+
397
+ Style/Sample:
398
+ Enabled: true
399
+
400
+ Performance/Size:
401
+ Enabled: true
402
+
403
+ Performance/StartWith:
404
+ Enabled: true
405
+
406
+ Performance/StringReplacement:
407
+ Enabled: true
408
+
409
+ Performance/TimesMap:
410
+ Enabled: true
411
+
412
+ Performance/UnfreezeString:
413
+ Enabled: true
414
+
415
+ Style/RedundantSort:
416
+ Enabled: true
417
+
418
+ Security/Eval:
419
+ Enabled: true
420
+
421
+ Security/JSONLoad:
422
+ Enabled: true
423
+
424
+ Security/MarshalLoad:
425
+ Enabled: true
426
+
427
+ Security/Open:
428
+ Enabled: true
429
+
430
+ Security/YAMLLoad:
431
+ Enabled: true
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.6.5
1
+ 2.7.2
data/README.md CHANGED
@@ -4,9 +4,53 @@
4
4
 
5
5
  Rapido is a simple, highly opinionated library that can be included into your Rails controllers to enforce standardized behavior and security.
6
6
 
7
+ ## Example
8
+
9
+ Below is a typical example of a class using Rapido. More examples are available in the [dummy application](https://github.com/starfighterheavy/rapido/tree/master/test/dummy).
10
+
11
+ ```ruby
12
+ # Create, Index: https://www.example.com/api/documents/
13
+ # Show, update, delete: https://www.example.com/api/documents/123
14
+
15
+ class DocumentsController < ApplicationController
16
+ include Rapido::ApiController
17
+
18
+ attr_permitted :file, file_name, :category
19
+
20
+ belongs_to :user, getter: :current_user
21
+
22
+ present_with DocumentPresenter
23
+
24
+ present_collection_with DocumentCollectionPresenter, :query # Query could be a string supplied as a URL parameter to search documents by name.
25
+ end
26
+ ```
27
+
28
+ Another example where records are automatically retrieved from route parameters.
29
+
30
+ ```ruby
31
+ # Create, Index: https://www.example.com/api/documents/123/pages
32
+ # Show, update, delete: https://www.example.com/api/documents/123/pages/345
33
+
34
+ class PagesController < ApplicationController
35
+ include Rapido::ApiController
36
+
37
+ attr_permitted :contents, :page_number
38
+
39
+ belongs_to :document, owner: :current_user
40
+
41
+ present_with PagePresenter
42
+
43
+ present_collection_with PageCollectionPresenter
44
+ end
45
+ ```
46
+
7
47
  ## API
8
48
 
9
- #### `belongs_to`
49
+ ### `attr_permitted`
50
+
51
+ Accepts a list of symbols. These symbols specify the attributes that are supplied to StrongParameters as permitted parameters in `create` and `update` actions.
52
+
53
+ ### `belongs_to`
10
54
 
11
55
  Specifies the owner of the resource. For example, if many `Post` belonged to `User`, then in the `PostsController`, the following would be included: `belongs_to :user` and `Post` would be retrieved like so:
12
56
 
@@ -48,41 +92,56 @@ Default `[singular owner name]_id`. Specifies the param used as the owner's fore
48
92
 
49
93
  `User.find(params[:author_id]).posts.find(params[:id])`.
50
94
 
51
- #### `lookup_param`
95
+ ### `lookup_param`
52
96
 
53
97
  Specifies the param used to retrieve the resource. For example, if `Post` belongs to `User`, then in the `PostsController` if `lookup_param :token` is supplied, then the post would be retrieved like so:
54
98
 
55
99
  `User.find_by(params[:id]).posts.find_by(token: params[:token])`.
56
100
 
57
- #### `presented_by`
101
+ ### `present_with`
58
102
 
59
103
  Specifies the class that will present the resource. This class must accept the resource as the only parameter at initialization, and respond to the `as_json` for output when used with the `Rapido::ApiController`.
60
104
 
61
105
  For example, if `params` contained a `:filter` parameter which should be used by the presenter , then the following would work:
62
106
 
63
- `presented_by WidgetsPresenter, :filter`
107
+ `present_with WidgetsPresenter, :filter`
64
108
 
65
109
  The `initialize` method of the presenter should be structured as such:
66
110
 
67
111
  `def initialize(widgets, filter = nil)`
68
112
 
69
- #### `collection_presented_by`
113
+ ### `present_collection_with`
70
114
 
71
115
  Specifies the class that will present a collection of resources, as in the index method. Similar to `presented_by`, the class must accept the resource collection as the only argument at initialization, and respond to `as_json` for output when used with the `Rapido::ApiController`. The `collection_presented_by` can also accept a list of arguments, as symbols, that should be pulled from the `params` hash and passed to presenter class at initialization as optional argments.
72
116
 
73
- Collection presenters can also be provided args, similar to `presented_by`
117
+ Collection presenters can also be provided args, similar to `present_with`
74
118
 
75
- #### `attr_permitted`
119
+ ### `permit_no_params!`
76
120
 
77
- Accepts a list of symbols. These symbols specify the attributes that are supplied to StrongParameters as permitted parameters in `create` and `update` actions.
121
+ This will disallow any parameters in `create` and `update` actions.
78
122
 
79
- #### `permit_no_params!`
123
+ ## Filters
80
124
 
81
- This will disallow any parameters in `create` and `update` actions.
125
+ The following filters are available to override, similar to the standard Rails action filters.
126
+
127
+ #### Create
128
+
129
+ * before_build
130
+ * before_create
131
+ * after_create_success
132
+ * after_create_failure
133
+
134
+ #### Destroy
135
+
136
+ * before_destroy
137
+ * after_destroy_success
82
138
 
83
- ## Notes
139
+ #### Update
84
140
 
85
- Authentication & AppController functionality will be deprecated in v0.6 and removed in v1.0. With the 1.0 release, Rapido will remove all functionality that is not strictly oriented to streamlining API Controller development and security.
141
+ * before_assign_attributes
142
+ * before_updat
143
+ * after_update_success
144
+ * after_update_failure
86
145
 
87
146
  ## Development
88
147
 
@@ -1,6 +1,7 @@
1
1
  require 'active_support'
2
2
  require 'active_support/core_ext'
3
3
  require 'active_support/rescuable'
4
+ require 'rapido/controller'
4
5
  require 'rapido/errors'
5
6
 
6
7
  module Rapido
@@ -10,6 +11,8 @@ module Rapido
10
11
  include Rapido::Errors
11
12
 
12
13
  included do
14
+ include Rapido::Controller
15
+
13
16
  rescue_from RecordNotFound do |e|
14
17
  render json: { errors: [ e.to_s ] }, status: 404
15
18
  end
@@ -18,21 +21,44 @@ module Rapido
18
21
  end
19
22
 
20
23
  def index
21
- render json: present_resource_collection(resource_collection)
24
+ return if performed?
25
+ render json: resource_collection_presenter
22
26
  end
23
27
 
24
28
  def show
25
- render json: present_resource(resource)
29
+ return if performed?
30
+ if request.format.to_sym == :json
31
+ if(params["filename"])
32
+ send_data resource_presenter.as_json.to_json, filename: params["filename"]
33
+ else
34
+ render json: resource_presenter
35
+ end
36
+ elsif request.format.to_sym == :xml
37
+ if(params["filename"])
38
+ send_data resource_presenter.to_xml, filename: params["filename"]
39
+ else
40
+ render xml: resource_presenter
41
+ end
42
+ elsif request.format.to_sym == :csv
43
+ if(params["filename"])
44
+ send_data resource_presenter.to_csv, filename: params["filename"]
45
+ else
46
+ render plain: resource_presenter.send("to_csv")
47
+ end
48
+ else
49
+ render json: resource_presenter
50
+ end
26
51
  end
27
52
 
28
53
  def create
54
+ return if performed?
29
55
  before_build
30
56
  new_resource = build_resource(resource_params)
31
57
  before_create(new_resource)
32
58
  if new_resource.save
33
59
  after_create_success(new_resource)
34
60
  return if performed?
35
- render json: present_resource(new_resource), status: :created
61
+ render json: resource_presenter(new_resource), status: :created
36
62
  else
37
63
  after_create_failure(new_resource)
38
64
  return if performed?
@@ -41,7 +67,8 @@ module Rapido
41
67
  end
42
68
 
43
69
  def destroy
44
- resource_before_destruction = present_resource(resource)
70
+ return if performed?
71
+ resource_before_destruction = resource_presenter
45
72
  before_destroy
46
73
  resource.destroy
47
74
  after_destroy_success
@@ -50,13 +77,14 @@ module Rapido
50
77
  end
51
78
 
52
79
  def update
80
+ return if performed?
53
81
  before_assign_attributes
54
82
  resource.assign_attributes(resource_params)
55
83
  before_update
56
84
  if resource.save
57
85
  after_update_success
58
86
  return if performed?
59
- render json: present_resource(resource)
87
+ render json: resource_presenter
60
88
  else
61
89
  after_update_failure
62
90
  return if performed?
@@ -66,52 +94,63 @@ module Rapido
66
94
 
67
95
  private
68
96
 
69
- def after_create_failure(new_resource)
70
- end
97
+ def after_create_failure(new_resource)
98
+ end
71
99
 
72
- def after_create_success(new_resource)
73
- end
100
+ def after_create_success(new_resource)
101
+ end
74
102
 
75
- def after_destroy_success
76
- end
103
+ def after_destroy_success
104
+ end
77
105
 
78
- def after_update_failure
79
- end
106
+ def after_update_failure
107
+ end
80
108
 
81
- def after_update_success
82
- end
109
+ def after_update_success
110
+ end
83
111
 
84
- def before_assign_attributes
85
- end
112
+ def before_assign_attributes
113
+ end
86
114
 
87
- def before_build
88
- end
115
+ def before_build
116
+ end
89
117
 
90
- def before_create(new_resource)
91
- end
118
+ def before_create(new_resource)
119
+ end
92
120
 
93
- def before_destroy
94
- end
121
+ def before_destroy
122
+ end
95
123
 
96
- def before_update
97
- end
124
+ def before_update
125
+ end
98
126
 
99
- def permit_only_allowed_actions
100
- return unless allowed_actions
101
- head :unauthorized unless allowed_actions.include?(params[:action].to_sym)
102
- end
127
+ def permit_only_allowed_actions
128
+ return unless allowed_actions
129
+ head :unauthorized unless allowed_actions.include?(params[:action].to_sym)
130
+ end
103
131
 
104
- def present_resource(resource)
132
+ def resource_presenter(new_resource = nil)
133
+ @resource_presenter ||= begin
105
134
  args = presenter_args.nil? ? nil : presenter_args.map { |arg| params[arg] }
106
- return presenter.new(*[resource, *args]).as_json if presenter
107
- resource.to_h
135
+ if presenter
136
+ presenter.new(new_resource || resource, *args)
137
+ else
138
+ (new_resource || resource).to_h
139
+ end
108
140
  end
141
+ end
109
142
 
110
- def present_resource_collection(resource_collection)
143
+ def resource_collection_presenter
144
+ @resource_collection_presenter ||= begin
111
145
  args = collection_presenter_args.nil? ? nil : collection_presenter_args.map { |arg| params[arg] }
112
- return collection_presenter.new(*[resource_collection, *args]).as_json if collection_presenter
113
- return resource_collection.map { |r| presenter.new(r).as_json } if presenter
114
- resource_collection.map(&:to_h)
146
+ if collection_presenter
147
+ collection_presenter.new(resource_collection, *args)
148
+ elsif presenter
149
+ resource_collection.map { |r| presenter.new(r) }
150
+ else
151
+ resource_collection.map(&:to_h)
152
+ end
115
153
  end
154
+ end
116
155
  end
117
156
  end
@@ -97,136 +97,136 @@ module Rapido
97
97
 
98
98
  private
99
99
 
100
- def allowed_actions
101
- setting(:allowed_actions)
102
- end
100
+ def allowed_actions
101
+ setting(:allowed_actions)
102
+ end
103
103
 
104
- def build_resource(params = {})
105
- return owner.send('build_' + resource_class_name, params) if setting(:has_one)
106
- return owner.send(resource_class_name.pluralize).build(params) if owner && owner.respond_to?(resource_class_name.pluralize)
107
- begin
108
- send(:build)
109
- rescue NoMethodError
110
- raise 'Rapido::Controller must belong to something that responds to build or define a build method'
111
- end
104
+ def build_resource(params = {})
105
+ return owner.send('build_' + resource_class_name, params) if setting(:has_one)
106
+ return owner.send(resource_class_name.pluralize).build(params) if owner && owner.respond_to?(resource_class_name.pluralize)
107
+ begin
108
+ send(:build)
109
+ rescue NoMethodError => _e
110
+ raise 'Rapido::Controller must belong to something that responds to build or define a build method'
112
111
  end
112
+ end
113
113
 
114
- def collection_presenter
115
- setting(:collection_presenter)
116
- end
114
+ def collection_presenter
115
+ setting(:collection_presenter)
116
+ end
117
117
 
118
- def collection_presenter_args
119
- setting(:collection_presenter_args)
120
- end
118
+ def collection_presenter_args
119
+ setting(:collection_presenter_args)
120
+ end
121
121
 
122
- def owner_class
123
- return nil unless setting(:owner_class)
124
- @owner_class ||= begin
125
- name = setting(:owner_class)
126
- name.to_s.camelize.constantize
127
- rescue NameError
128
- raise BadOwnerClassName, name
129
- end
122
+ def owner_class
123
+ return nil unless setting(:owner_class)
124
+ @owner_class ||= begin
125
+ name = setting(:owner_class)
126
+ name.to_s.camelize.constantize
127
+ rescue NameError
128
+ raise BadOwnerClassName, name
130
129
  end
130
+ end
131
131
 
132
- def owner_class_name
133
- @owner_class_name ||= owner_class.to_s.underscore
134
- end
132
+ def owner_class_name
133
+ @owner_class_name ||= owner_class.to_s.underscore
134
+ end
135
135
 
136
- def owner_lookup_param
137
- @owner_lookup_param ||=
138
- setting(:owner_lookup_param).to_s
139
- end
136
+ def owner_lookup_param
137
+ @owner_lookup_param ||=
138
+ setting(:owner_lookup_param).to_s
139
+ end
140
140
 
141
- def owner_lookup_field
142
- @owner_lookup_field ||=
143
- (setting(:owner_lookup_field) || owner_lookup_param).to_s
144
- end
141
+ def owner_lookup_field
142
+ @owner_lookup_field ||=
143
+ (setting(:owner_lookup_field) || owner_lookup_param).to_s
144
+ end
145
145
 
146
- def owner
147
- @owner ||= begin
148
- if setting(:owner_getter)
149
- send(setting(:owner_getter))
150
- elsif setting(:owner_class)
151
- if setting(:owners_owner)
152
- base = send(setting(:owners_owner)).send(owner_class_name.pluralize)
153
- else
154
- base = owner_class
155
- end
156
- base.find_by!(owner_lookup_field => params[owner_lookup_param])
146
+ def owner
147
+ @owner ||= begin
148
+ if setting(:owner_getter)
149
+ send(setting(:owner_getter))
150
+ elsif setting(:owner_class)
151
+ if setting(:owners_owner)
152
+ base = send(setting(:owners_owner)).send(owner_class_name.pluralize)
157
153
  else
158
- nil
154
+ base = owner_class
159
155
  end
160
- rescue ActiveRecord::RecordNotFound
161
- raise RecordNotFound
156
+ base.find_by!(owner_lookup_field => params[owner_lookup_param])
157
+ else
158
+ nil
162
159
  end
160
+ rescue ActiveRecord::RecordNotFound
161
+ raise RecordNotFound
163
162
  end
163
+ end
164
164
 
165
- def presenter
166
- setting(:presenter)
167
- end
165
+ def presenter
166
+ setting(:presenter)
167
+ end
168
168
 
169
- def presenter_args
170
- setting(:presenter_args)
171
- end
169
+ def presenter_args
170
+ setting(:presenter_args)
171
+ end
172
172
 
173
- def resource
174
- @resource ||= begin
175
- if setting(:has_one)
176
- owner.send(resource_class_name)
177
- elsif owner && owner.respond_to?(resource_class_name.pluralize)
178
- owner
179
- .send(resource_class_name.pluralize)
180
- .find_by!(resource_lookup_param => params[resource_lookup_param])
181
- else
182
- begin NoMethodError
183
- send(:find)
184
- rescue
185
- raise 'Rapido::Controller must belong to something that has many or has one of resource, or define a find method'
186
- end
173
+ def resource
174
+ @resource ||= begin
175
+ if setting(:has_one)
176
+ owner.send(resource_class_name)
177
+ elsif owner && owner.respond_to?(resource_class_name.pluralize)
178
+ owner
179
+ .send(resource_class_name.pluralize)
180
+ .find_by!(resource_lookup_param => params[resource_lookup_param])
181
+ else
182
+ begin
183
+ send(:find)
184
+ rescue NoMethodError => _e
185
+ raise 'Rapido::Controller must belong to something that has many or has one of resource, or define a find method'
187
186
  end
188
- rescue ActiveRecord::RecordNotFound
189
- raise RecordNotFound
190
187
  end
188
+ rescue ActiveRecord::RecordNotFound
189
+ raise RecordNotFound
191
190
  end
191
+ end
192
192
 
193
- def resource_class
194
- @resource_class ||= resource_class_name.to_s.camelize.constantize
195
- end
193
+ def resource_class
194
+ @resource_class ||= resource_class_name.to_s.camelize.constantize
195
+ end
196
196
 
197
- def resource_class_name
198
- self.class.resource_class_name
199
- end
197
+ def resource_class_name
198
+ self.class.resource_class_name
199
+ end
200
200
 
201
201
  # Todo: FIXME
202
- def resource_collection
203
- @resource_collection ||= begin
204
- if setting(:has_one)
205
- owner.send(resource_class_name)
206
- else
207
- owner.send(resource_class_name.pluralize)
208
- end
202
+ def resource_collection
203
+ @resource_collection ||= begin
204
+ if setting(:has_one)
205
+ owner.send(resource_class_name)
206
+ else
207
+ owner.send(resource_class_name.pluralize)
209
208
  end
210
209
  end
210
+ end
211
211
 
212
- def resource_lookup_param
213
- @resource_lookup_param ||=
214
- setting(:resource_lookup_param) || :id
215
- end
212
+ def resource_lookup_param
213
+ @resource_lookup_param ||=
214
+ setting(:resource_lookup_param) || :id
215
+ end
216
216
 
217
- def resource_permitted_params
218
- @resource_permitted_params ||=
219
- setting(:resource_permitted_params)
220
- end
217
+ def resource_permitted_params
218
+ @resource_permitted_params ||=
219
+ setting(:resource_permitted_params)
220
+ end
221
221
 
222
- def resource_params
223
- return {} if setting(:permit_no_params)
224
- base = params.require(resource_class_name)
225
- base.permit(resource_permitted_params)
226
- end
222
+ def resource_params
223
+ return {} if setting(:permit_no_params)
224
+ base = params.require(resource_class_name)
225
+ base.permit(resource_permitted_params)
226
+ end
227
227
 
228
- def setting(var)
229
- self.class.instance_variable_get("@#{var}")
230
- end
228
+ def setting(var)
229
+ self.class.instance_variable_get("@#{var}")
230
+ end
231
231
  end
232
232
  end
@@ -1,3 +1,3 @@
1
1
  module Rapido
2
- VERSION = '0.8.0'
2
+ VERSION = '0.9.4'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-rapido
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.8.0
4
+ version: 0.9.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Kirst
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2020-02-20 00:00:00.000000000 Z
11
+ date: 2021-03-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -83,7 +83,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
83
83
  - !ruby/object:Gem::Version
84
84
  version: '0'
85
85
  requirements: []
86
- rubygems_version: 3.0.3
86
+ rubygems_version: 3.1.4
87
87
  signing_key:
88
88
  specification_version: 4
89
89
  summary: Rails API Dryer-o