wallaby 5.1.5 → 5.1.6

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.
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