wallaby 5.1.5 → 5.1.6

Sign up to get free protection for your applications and to get access to all the features.
Files changed (72) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +1 -1
  3. data/app/controllers/wallaby/abstract_resources_controller.rb +171 -187
  4. data/app/controllers/wallaby/application_controller.rb +15 -4
  5. data/app/controllers/wallaby/base_controller.rb +1 -3
  6. data/app/controllers/wallaby/secure_controller.rb +10 -6
  7. data/app/security/ability.rb +1 -0
  8. data/app/views/wallaby/resources/form/_float.html.erb +1 -1
  9. data/config/locales/wallaby.en.yml +5 -0
  10. data/lib/adaptors/wallaby/active_record.rb +1 -1
  11. data/lib/adaptors/wallaby/active_record/model_decorator.rb +17 -19
  12. data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder.rb +7 -0
  13. data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/association_builder.rb +11 -0
  14. data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/polymorphic_builder.rb +10 -1
  15. data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/sti_builder.rb +14 -7
  16. data/lib/adaptors/wallaby/active_record/model_decorator/title_field_finder.rb +4 -0
  17. data/lib/adaptors/wallaby/active_record/model_finder.rb +4 -3
  18. data/lib/adaptors/wallaby/active_record/model_pagination_provider.rb +3 -6
  19. data/lib/adaptors/wallaby/active_record/model_service_provider.rb +12 -3
  20. data/lib/adaptors/wallaby/active_record/model_service_provider/normalizer.rb +16 -1
  21. data/lib/adaptors/wallaby/active_record/model_service_provider/permitter.rb +14 -2
  22. data/lib/adaptors/wallaby/active_record/model_service_provider/querier.rb +46 -1
  23. data/lib/adaptors/wallaby/active_record/model_service_provider/querier/transformer.rb +11 -5
  24. data/lib/adaptors/wallaby/active_record/model_service_provider/validator.rb +6 -0
  25. data/lib/concerns/wallaby/resources_helper_methods.rb +44 -0
  26. data/lib/decorators/wallaby/abstract_resource_decorator.rb +9 -4
  27. data/lib/errors/wallaby/model_not_found.rb +1 -0
  28. data/lib/errors/wallaby/resource_not_found.rb +1 -0
  29. data/lib/forms/wallaby/form_builder.rb +5 -3
  30. data/lib/helpers/wallaby/application_helper.rb +10 -1
  31. data/lib/helpers/wallaby/base_helper.rb +12 -4
  32. data/lib/helpers/wallaby/form_helper.rb +7 -4
  33. data/lib/helpers/wallaby/links_helper.rb +10 -7
  34. data/lib/helpers/wallaby/resources_helper.rb +2 -0
  35. data/lib/helpers/wallaby/secure_helper.rb +13 -7
  36. data/lib/helpers/wallaby/styling_helper.rb +1 -1
  37. data/lib/interfaces/wallaby/mode.rb +38 -16
  38. data/lib/interfaces/wallaby/model_decorator.rb +36 -27
  39. data/lib/interfaces/wallaby/model_decorator/field_helpers.rb +12 -2
  40. data/lib/interfaces/wallaby/model_finder.rb +1 -0
  41. data/lib/interfaces/wallaby/model_pagination_provider.rb +6 -5
  42. data/lib/interfaces/wallaby/model_service_provider.rb +10 -2
  43. data/lib/paginators/wallaby/abstract_resource_paginator.rb +6 -1
  44. data/lib/parsers/wallaby/parser.rb +1 -0
  45. data/lib/responders/wallaby/abstract_responder.rb +15 -2
  46. data/lib/routes/wallaby/resources_router.rb +4 -0
  47. data/lib/servicers/wallaby/abstract_model_servicer.rb +25 -1
  48. data/lib/servicers/wallaby/model_servicer.rb +1 -0
  49. data/lib/services/wallaby/link_options_normalizer.rb +13 -9
  50. data/lib/services/wallaby/lookup_context_wrapper.rb +11 -2
  51. data/lib/services/wallaby/map.rb +107 -69
  52. data/lib/services/wallaby/map/mode_mapper.rb +2 -0
  53. data/lib/services/wallaby/map/model_class_collector.rb +7 -0
  54. data/lib/services/wallaby/map/model_class_mapper.rb +15 -7
  55. data/lib/services/wallaby/partial_renderer.rb +7 -0
  56. data/lib/services/wallaby/prefixes_builder.rb +18 -0
  57. data/lib/services/wallaby/sorting/hash_builder.rb +7 -1
  58. data/lib/services/wallaby/sorting/link_builder.rb +6 -1
  59. data/lib/services/wallaby/sorting/next_builder.rb +23 -2
  60. data/lib/tree/wallaby/node.rb +2 -0
  61. data/lib/utils/wallaby/test_utils.rb +32 -0
  62. data/lib/utils/wallaby/utils.rb +51 -5
  63. data/lib/wallaby.rb +1 -0
  64. data/lib/wallaby/configuration.rb +9 -3
  65. data/lib/wallaby/configuration/features.rb +2 -1
  66. data/lib/wallaby/configuration/mapping.rb +66 -0
  67. data/lib/wallaby/configuration/metadata.rb +1 -0
  68. data/lib/wallaby/configuration/pagination.rb +2 -1
  69. data/lib/wallaby/engine.rb +4 -0
  70. data/lib/wallaby/version.rb +1 -1
  71. metadata +5 -3
  72. data/lib/tasks/wallaby_tasks.rake +0 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: d350fea3b2b5c2c80941c75875aa66a6a660efaa
4
- data.tar.gz: ff4f3f8a4edeafa44eb548e6e89a3a1a26a74602
3
+ metadata.gz: ad9fb3be960036fe7cb2726cd9fd30a9ee111aaa
4
+ data.tar.gz: f49cb2db9f22cfb9022624b30f0a718fabd2e93e
5
5
  SHA512:
6
- metadata.gz: 630a3c2632aca7189885132b805c6bf6cffd71497ff1562e844040eeab96af18048871c841a359a41fddf6044f8ece6880a185085a9fb0afc118f7b26438a323
7
- data.tar.gz: f9f092cc627eb09b631c0ac0bb4394019a5b9ac5c56ebb970c752a8b8845e0819bb9efc4b32875790ea16ff0392b359dd8f0b8859236cc245df5564c5cdc1a14
6
+ metadata.gz: 54a406b351d36c99269a644db761d88198379204832ab17aef026353d5b0f06d6ec0f3ca63290f23cb5fda5e1d68adca32ee9a63c146db5b1bfcef3d8ed28cf2
7
+ data.tar.gz: 0c5011125fc765c9a1d1a8b064cc1cf9665f220df1130232f6b8ee6cad3cbb928ecbedeff1ded060943a144421ec6aaf222d60b8b7ce12335f5c0703cddaaa39
data/Rakefile CHANGED
@@ -14,7 +14,7 @@ RDoc::Task.new(:rdoc) do |rdoc|
14
14
  rdoc.rdoc_files.include('lib/**/*.rb')
15
15
  end
16
16
 
17
- APP_RAKEFILE = File.expand_path('../spec/dummy/Rakefile', __FILE__)
17
+ APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
18
18
  load 'rails/tasks/engine.rake'
19
19
  load 'rails/tasks/statistics.rake'
20
20
 
@@ -1,6 +1,7 @@
1
1
  module Wallaby
2
2
  # Generic CRUD controller
3
3
  class AbstractResourcesController < ::Wallaby::BaseController
4
+ include ResourcesHelperMethods
4
5
  self.responder = ResourcesResponder
5
6
  respond_to :html
6
7
  respond_to :json
@@ -9,94 +10,118 @@ module Wallaby
9
10
  helper_method :resource_id, :resource, :collection,
10
11
  :current_model_decorator, :authorizer
11
12
 
12
- # Fetch resources name from its class name
13
- def self.resources_name
14
- return unless self < ::Wallaby::ResourcesController
15
- Map.resources_name_map name.gsub('Controller', EMPTY_STRING)
16
- end
13
+ class << self
14
+ # @return [String] resources name for controller
15
+ def resources_name
16
+ return unless self < configuration.mapping.resources_controller
17
+ Map.resources_name_map name.gsub('Controller', EMPTY_STRING)
18
+ end
17
19
 
18
- # Find model class from its resources name
19
- def self.model_class
20
- return unless self < ::Wallaby::ResourcesController
21
- Map.model_class_map resources_name
20
+ # @return [Class] model class for controller
21
+ def model_class
22
+ return unless self < configuration.mapping.resources_controller
23
+ Map.model_class_map resources_name
24
+ end
22
25
  end
23
26
 
24
- # home page
27
+ # Home page
28
+ #
29
+ # You can completely override this action:
30
+ #
31
+ # def home
32
+ # # do something differently
33
+ # end
25
34
  def home
26
35
  # do nothing
27
36
  end
28
37
 
29
- # Index page to list data
38
+ # Resourceful action to list paginated records.
39
+ #
40
+ # You can override this method in subclasses in the following ways:
41
+ #
42
+ # - To perform action before `index` is run
43
+ #
44
+ # def index
45
+ # # do something beforehand
46
+ # super
47
+ # end
48
+ #
49
+ # - To perform action after `index`, but before rendering.
50
+ # The reason is that we use responder at the end of the action
51
+ #
52
+ # def index
53
+ # super do
54
+ # # do something afterwards
55
+ # end
56
+ # end
57
+ #
58
+ # - To perform completely different action
59
+ #
60
+ # def index
61
+ # # do something completely different
62
+ # end
30
63
  def index
31
64
  authorize! :index, current_model_class
32
65
  yield if block_given? # after_index
33
66
  respond_with collection
34
67
  end
35
68
 
36
- # Form page for creation
37
- # You could override this method in subclasses in the following ways:
69
+ # Resourceful new action to show a form for creating a record.
70
+ #
71
+ # You can override this method in subclasses in the following ways:
72
+ #
38
73
  # - To perform action before `new` is run
39
74
  #
40
- # ```
41
- # def new
42
- # # do something beforehand
43
- # super
44
- # end
45
- # ```
75
+ # def new
76
+ # # do something beforehand
77
+ # super
78
+ # end
46
79
  #
47
80
  # - To perform action after `new`, but before rendering.
48
- # The reason is that we use responder at the end of the action
81
+ # The reason is that we use responder at the end of the action
49
82
  #
50
- # ```
51
- # def new
52
- # super do
53
- # # do something after new
54
- # end
55
- # end
56
- # ```
83
+ # def new
84
+ # super do
85
+ # # do something afterwards
86
+ # end
87
+ # end
57
88
  #
58
89
  # - To perform completely different action
59
90
  #
60
- # ```
61
- # def new
62
- # # do something completely different
63
- # end
64
- # ```
91
+ # def new
92
+ # # do something completely different
93
+ # end
65
94
  def new
66
95
  authorize! :new, resource
67
96
  yield if block_given? # after_new
68
97
  respond_with resource
69
98
  end
70
99
 
71
- # Data creation
72
- # You could override this method in subclasses in the following ways:
100
+ # Resourceful create action to create a record.
101
+ #
102
+ # You can override this method in subclasses in the following ways:
103
+ #
73
104
  # - To perform action before `new` is run
74
105
  #
75
- # ```
76
- # def create
77
- # # do something beforehand
78
- # super
79
- # end
80
- # ```
106
+ # def create
107
+ # # do something beforehand
108
+ # super
109
+ # end
81
110
  #
82
111
  # - To perform action after `create`, but before rendering.
83
- # The reason is that we use responder at the end of the action
112
+ # The reason is that we use responder at the end of the action
84
113
  #
85
- # ```
86
- # def create
87
- # super do
88
- # # do something after create
89
- # end
90
- # end
91
- # ```
114
+ # def create
115
+ # super do
116
+ # # do something afterwards
117
+ # end
118
+ # end
92
119
  #
93
120
  # - To perform completely different action
94
121
  #
95
- # ```
96
- # def create
97
- # # do something completely different
98
- # end
99
- # ```
122
+ # def create
123
+ # # do something completely different
124
+ # end
100
125
  def create
101
126
  authorize! :create, resource
102
127
  current_model_service.create resource, params
@@ -104,105 +129,93 @@ module Wallaby
104
129
  respond_with resource, location: helpers.show_path(resource)
105
130
  end
106
131
 
107
- # Show page for a single record
108
- # You could override this method in subclasses in the following ways:
132
+ # Resourceful show action to display values for a record.
133
+ #
134
+ # You can override this method in subclasses in the following ways:
135
+ #
109
136
  # - To perform action before `show` is run
110
137
  #
111
- # ```
112
- # def show
113
- # # do something beforehand
114
- # super
115
- # end
116
- # ```
138
+ # def show
139
+ # # do something beforehand
140
+ # super
141
+ # end
117
142
  #
118
143
  # - To perform action after `show`, but before rendering.
119
- # The reason is that we use responder at the end of the action
144
+ # The reason is that we use responder at the end of the action
120
145
  #
121
- # ```
122
- # def show
123
- # super do
124
- # # do something after show
125
- # end
126
- # end
127
- # ```
146
+ # def show
147
+ # super do
148
+ # # do something afterwards
149
+ # end
150
+ # end
128
151
  #
129
152
  # - To perform completely different action
130
153
  #
131
- # ```
132
- # def show
133
- # # do something completely different
134
- # end
135
- # ```
154
+ # def show
155
+ # # do something completely different
156
+ # end
136
157
  def show
137
158
  authorize! :show, resource
138
159
  yield if block_given? # after_show
139
160
  respond_with resource
140
161
  end
141
162
 
142
- # Edit page for a single record
143
- # You could override this method in subclasses in the following ways:
163
+ # Resourceful edit action to show a form for editing a record.
164
+ #
165
+ # You can override this method in subclasses in the following ways:
166
+ #
144
167
  # - To perform action before `edit` is run
145
168
  #
146
- # ```
147
- # def edit
148
- # # do something beforehand
149
- # super
150
- # end
151
- # ```
169
+ # def edit
170
+ # # do something beforehand
171
+ # super
172
+ # end
152
173
  #
153
174
  # - To perform action after `edit`, but before rendering.
154
- # The reason is that we use responder at the end of the action
175
+ # The reason is that we use responder at the end of the action
155
176
  #
156
- # ```
157
- # def edit
158
- # super do
159
- # # do something after edit
160
- # end
161
- # end
162
- # ```
177
+ # def edit
178
+ # super do
179
+ # # do something afterwards
180
+ # end
181
+ # end
163
182
  #
164
183
  # - To perform completely different action
165
184
  #
166
- # ```
167
- # def edit
168
- # # do something completely different
169
- # end
170
- # ```
185
+ # def edit
186
+ # # do something completely different
187
+ # end
171
188
  def edit
172
189
  authorize! :edit, resource
173
190
  yield if block_given? # after_edit
174
191
  respond_with resource
175
192
  end
176
193
 
177
- # Date update
178
- # You could override this method in subclasses in the following ways:
194
+ # Resourceful update action to update a record.
195
+ #
196
+ # You can override this method in subclasses in the following ways:
197
+ #
179
198
  # - To perform action before `update` is run
180
199
  #
181
- # ```
182
- # def update
183
- # # do something beforehand
184
- # super
185
- # end
186
- # ```
200
+ # def update
201
+ # # do something beforehand
202
+ # super
203
+ # end
187
204
  #
188
205
  # - To perform action after `update`, but before rendering.
189
- # The reason is that we use responder at the end of the action
206
+ # The reason is that we use responder at the end of the action
190
207
  #
191
- # ```
192
- # def update
193
- # super do
194
- # # do something after update
195
- # end
196
- # end
197
- # ```
208
+ # def update
209
+ # super do
210
+ # # do something afterwards
211
+ # end
212
+ # end
198
213
  #
199
214
  # - To perform completely different action
200
215
  #
201
- # ```
202
- # def update
203
- # # do something completely different
204
- # end
205
- # ```
216
+ # def update
217
+ # # do something completely different
218
+ # end
206
219
  def update
207
220
  authorize! :update, resource
208
221
  current_model_service.update resource, params
@@ -210,35 +223,31 @@ module Wallaby
210
223
  respond_with resource, location: helpers.show_path(resource)
211
224
  end
212
225
 
213
- # Data deletion
214
- # You could override this method in subclasses in the following ways:
226
+ # Resourceful destroy action to delete a record.
227
+ #
228
+ # You can override this method in subclasses in the following ways:
229
+ #
215
230
  # - To perform action before `destroy` is run
216
231
  #
217
- # ```
218
- # def destroy
219
- # # do something beforehand
220
- # super
221
- # end
222
- # ```
232
+ # def destroy
233
+ # # do something beforehand
234
+ # super
235
+ # end
223
236
  #
224
237
  # - To perform action after `destroy`, but before rendering.
225
- # The reason is that we use responder at the end of the action
238
+ # The reason is that we use responder at the end of the action
226
239
  #
227
- # ```
228
- # def destroy
229
- # super do
230
- # # do something after destroy
231
- # end
232
- # end
233
- # ```
240
+ # def destroy
241
+ # super do
242
+ # # do something afterwards
243
+ # end
244
+ # end
234
245
  #
235
246
  # - To perform completely different action
236
247
  #
237
- # ```
238
- # def destroy
239
- # # do something completely different
240
- # end
241
- # ```
248
+ # def destroy
249
+ # # do something completely different
250
+ # end
242
251
  def destroy
243
252
  authorize! :destroy, resource
244
253
  current_model_service.destroy resource, params
@@ -246,6 +255,26 @@ module Wallaby
246
255
  respond_with resource, location: helpers.index_path(current_model_class)
247
256
  end
248
257
 
258
+ # Model servicer associated to current modal class.
259
+ #
260
+ # This model servicer will take care of all the CRUD operations
261
+ #
262
+ # For how to override model service, see (Wallaby::ModelServicer)
263
+ # @return [Wallaby::ModelServicer] a servicer
264
+ def current_model_service
265
+ @current_model_service ||= begin
266
+ model_class = current_model_class
267
+ Map.servicer_map(model_class).new model_class, authorizer
268
+ end
269
+ end
270
+
271
+ # To whitelist the params for CRUD actions
272
+ # @see Wallaby::ModelServicer#permit
273
+ # @return [ActionController::Parameters] whitelisted params
274
+ def resource_params
275
+ @resource_params ||= current_model_service.permit params
276
+ end
277
+
249
278
  protected
250
279
 
251
280
  # Override origin ActionView::ViewPaths::ClassMethods#_prefixes
@@ -261,6 +290,7 @@ module Wallaby
261
290
  # (e.g. `wallaby/resources/index)
262
291
  # - wallaby_resources_controller_name
263
292
  # (e.g. `wallaby/resources)
293
+ # @return [PrefixesBuilder]
264
294
  def _prefixes
265
295
  @_prefixes ||= PrefixesBuilder.new(
266
296
  super, controller_path, current_resources_name, params
@@ -269,66 +299,20 @@ module Wallaby
269
299
 
270
300
  # A wrapped lookup content
271
301
  # Its aim is to render string partial when given partial is not found
302
+ # @return [LookupContextWrapper]
272
303
  def lookup_context
273
- @_lookup_context ||= LookupContextWrapper.new super
274
- end
275
-
276
- # Current model service to take care of all the CRUD actions
277
- # For how to override model service, see (Wallaby::ModelServicer)
278
- def current_model_service
279
- @current_model_service ||= begin
280
- model_class = current_model_class
281
- Map.servicer_map(model_class).new model_class, authorizer
282
- end
304
+ @_lookup_context ||= LookupContextWrapper.new super # rubocop:disable Naming/MemoizedInstanceVariableName, Metrics/LineLength
283
305
  end
284
306
 
285
307
  # To paginate the collection but only when either `page` or `per` param is
286
308
  # given, or requesting HTML response
287
309
  # @see Wallaby::ModelServicer#paginate
310
+ # @param query [#each]
311
+ # @return [#each]
288
312
  def paginate(query)
289
313
  paginatable =
290
314
  params[:page] || params[:per] || request.format.symbol == :html
291
315
  paginatable ? current_model_service.paginate(query, params) : query
292
316
  end
293
-
294
- # To whitelist the params for CRUD actions
295
- # @see Wallaby::ModelServicer#permit
296
- def resource_params
297
- @resource_params ||= current_model_service.permit params
298
- end
299
-
300
- # Shorthand of params[:id]
301
- def resource_id
302
- params[:id]
303
- end
304
-
305
- # @return [#each] a collection of all the records
306
- def collection
307
- @collection ||= paginate current_model_service.collection params
308
- end
309
-
310
- # @return either persisted or unpersisted resource instance
311
- def resource
312
- @resource ||= begin
313
- whitelisted = action_name.in?(SAVE_ACTIONS) ? resource_params : {}
314
- if resource_id.present?
315
- current_model_service.find resource_id, whitelisted
316
- else
317
- current_model_service.new whitelisted
318
- end
319
- end
320
- end
321
-
322
- # Get current model decorator so that we could retrieve metadata for given
323
- # model class.
324
- def current_model_decorator
325
- @current_model_decorator ||= helpers.model_decorator current_model_class
326
- end
327
-
328
- # A wrapper method for authorizer
329
- # @todo to add support to pundit in the future
330
- def authorizer
331
- current_ability
332
- end
333
317
  end
334
318
  end