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
@@ -1,64 +1,74 @@
1
1
  module Wallaby
2
- # @private
3
2
  class ModelDecorator
4
- # @private
5
3
  # Field helper for model decorator
6
4
  module FieldHelpers
5
+ # @param field_name [String, Symbol] field name
7
6
  # @return [Hash] metadata information for a given field
8
7
  def metadata_of(field_name)
9
8
  fields[field_name] || {}
10
9
  end
11
10
 
11
+ # @param field_name [String, Symbol] field name
12
12
  # @return [String] label for a given field
13
13
  def label_of(field_name)
14
14
  metadata_of(field_name)[:label]
15
15
  end
16
16
 
17
+ # @param field_name [String, Symbol] field name
17
18
  # @return [String, Symbol] type for a given field
18
19
  def type_of(field_name)
19
20
  validate_presence_of field_name, metadata_of(field_name)[:type]
20
21
  end
21
22
 
23
+ # @param field_name [String, Symbol] field name
22
24
  # @return [Hash] index metadata information for a given field
23
25
  def index_metadata_of(field_name)
24
26
  index_fields[field_name] || {}
25
27
  end
26
28
 
29
+ # @param field_name [String, Symbol] field name
27
30
  # @return [String] index label for a given field
28
31
  def index_label_of(field_name)
29
32
  index_metadata_of(field_name)[:label]
30
33
  end
31
34
 
35
+ # @param field_name [String, Symbol] field name
32
36
  # @return [String, Symbol] index type for a given field
33
37
  def index_type_of(field_name)
34
38
  validate_presence_of field_name, index_metadata_of(field_name)[:type]
35
39
  end
36
40
 
41
+ # @param field_name [String, Symbol] field name
37
42
  # @return [Hash] show metadata information for a given field
38
43
  def show_metadata_of(field_name)
39
44
  show_fields[field_name] || {}
40
45
  end
41
46
 
47
+ # @param field_name [String, Symbol] field name
42
48
  # @return [String] show label for a given field
43
49
  def show_label_of(field_name)
44
50
  show_metadata_of(field_name)[:label]
45
51
  end
46
52
 
53
+ # @param field_name [String, Symbol] field name
47
54
  # @return [String, Symbol] show type for a given field
48
55
  def show_type_of(field_name)
49
56
  validate_presence_of field_name, show_metadata_of(field_name)[:type]
50
57
  end
51
58
 
59
+ # @param field_name [String, Symbol] field name
52
60
  # @return [Hash] form metadata information for a given field
53
61
  def form_metadata_of(field_name)
54
62
  form_fields[field_name] || {}
55
63
  end
56
64
 
65
+ # @param field_name [String, Symbol] field name
57
66
  # @return [String] form label for a given field
58
67
  def form_label_of(field_name)
59
68
  form_metadata_of(field_name)[:label]
60
69
  end
61
70
 
71
+ # @param field_name [String, Symbol] field name
62
72
  # @return [String, Symbol] form type for a given field
63
73
  def form_type_of(field_name)
64
74
  validate_presence_of field_name, form_metadata_of(field_name)[:type]
@@ -2,6 +2,7 @@ module Wallaby
2
2
  # Model finder interface
3
3
  class ModelFinder
4
4
  # Need to implement this method to get all the available model for a mode
5
+ # @return [Array<Class>] a list of model class
5
6
  def all
6
7
  raise NotImplemented
7
8
  end
@@ -1,7 +1,7 @@
1
1
  module Wallaby
2
2
  # Model pagination provider interface
3
3
  class ModelPaginationProvider
4
- # @param collection
4
+ # @param collection [#to_a]
5
5
  # @param params [ActionController::Parameters]
6
6
  # @param options [Hash] options
7
7
  # @param model_decorator [Wallaby::ModelDecorator, nil]
@@ -13,30 +13,31 @@ module Wallaby
13
13
  end
14
14
 
15
15
  # If a collection has pagination feature
16
+ # @return [Boolean]
16
17
  def paginatable?
17
18
  raise NotImplemented
18
19
  end
19
20
 
20
21
  # Check and see if it's the first page
21
- # @return boolean
22
+ # @return [Boolean]
22
23
  def first_page?
23
24
  page_number > first_page_number
24
25
  end
25
26
 
26
27
  # Check and see if it's the previous page
27
- # @return boolean
28
+ # @return [Boolean]
28
29
  def prev_page?
29
30
  page_number > first_page_number
30
31
  end
31
32
 
32
33
  # Check and see if it's the last page
33
- # @return boolean
34
+ # @return [Boolean]
34
35
  def last_page?
35
36
  page_number < last_page_number
36
37
  end
37
38
 
38
39
  # Check and see if it's the next page
39
- # @return boolean
40
+ # @return [Boolean]
40
41
  def next_page?
41
42
  page_number < last_page_number
42
43
  end
@@ -11,6 +11,7 @@ module Wallaby
11
11
 
12
12
  # To whitelist params for a model class
13
13
  # @param _params [ActionController::Parameters]
14
+ # @return [ActionController::Parameters] whitelisted params
14
15
  def permit(_params)
15
16
  raise NotImplemented
16
17
  end
@@ -18,13 +19,15 @@ module Wallaby
18
19
  # Fetch collection by params
19
20
  # @param _params [ActionController::Parameters]
20
21
  # @param _authorizer
22
+ # @return [#to_a]
21
23
  def collection(_params, _authorizer)
22
24
  raise NotImplemented
23
25
  end
24
26
 
25
- # Paginate the records
27
+ # Paginate the resources
26
28
  # @param _query
27
29
  # @param _params [ActionController::Parameters]
30
+ # @return [#to_a]
28
31
  def paginate(_query, _params)
29
32
  raise NotImplemented
30
33
  end
@@ -32,14 +35,16 @@ module Wallaby
32
35
  # Initialize the model class using params
33
36
  # @param _params [ActionController::Parameters]
34
37
  # @param _authorizer
38
+ # @return a resource object
35
39
  def new(_params, _authorizer)
36
40
  raise NotImplemented
37
41
  end
38
42
 
39
- # Find a record using id
43
+ # Find a resource using id
40
44
  # @param _id [Object]
41
45
  # @param _params [ActionController::Parameters]
42
46
  # @param _authorizer
47
+ # @return a resource object
43
48
  def find(_id, _params, _authorizer)
44
49
  raise NotImplemented
45
50
  end
@@ -48,6 +53,7 @@ module Wallaby
48
53
  # @param _resource [Object]
49
54
  # @param _params [ActionController::Parameters]
50
55
  # @param _authorizer
56
+ # @return a resource object
51
57
  def create(_resource, _params, _authorizer)
52
58
  raise NotImplemented
53
59
  end
@@ -56,6 +62,7 @@ module Wallaby
56
62
  # @param _resource [Object]
57
63
  # @param _params [ActionController::Parameters]
58
64
  # @param _authorizer
65
+ # @return a resource object
59
66
  def update(_resource, _params, _authorizer)
60
67
  raise NotImplemented
61
68
  end
@@ -64,6 +71,7 @@ module Wallaby
64
71
  # @param _resource [Object]
65
72
  # @param _params [ActionController::Parameters]
66
73
  # @param _authorizer
74
+ # @return a resource object
67
75
  def destroy(_resource, _params, _authorizer)
68
76
  raise NotImplemented
69
77
  end
@@ -1,8 +1,9 @@
1
1
  module Wallaby
2
2
  # Model paginator
3
3
  class AbstractResourcePaginator
4
+ # @return [Class] model class for paginator
4
5
  def self.model_class
5
- return unless self < ::Wallaby::ResourcePaginator
6
+ return unless self < ::Wallaby.configuration.mapping.resource_paginator
6
7
  Map.model_class_map name.gsub('Paginator', EMPTY_STRING)
7
8
  end
8
9
 
@@ -11,6 +12,10 @@ module Wallaby
11
12
  ModelPaginationProvider.instance_methods - ::Object.instance_methods
12
13
  delegate(*instance_methods, to: :@provider)
13
14
 
15
+ # Paginator constructor
16
+ # @param model_class [Class] model class
17
+ # @param collection [#to_a] a collection of all the resources
18
+ # @param params [ActionController::Parameters] parameters
14
19
  def initialize(model_class, collection, params)
15
20
  @model_class = model_class || self.class.model_class
16
21
  raise ArgumentError, 'model class required' unless @model_class
@@ -1,4 +1,5 @@
1
1
  module Wallaby
2
+ # @private
2
3
  # a parser to handle colon query
3
4
  class Parser < Parslet::Parser
4
5
  root(:statement)
@@ -1,10 +1,11 @@
1
1
  module Wallaby
2
- # abstract responder for later usage
2
+ # Abstract responder
3
3
  class AbstractResponder < ActionController::Responder
4
4
  include ::Responders::FlashResponder
5
5
 
6
6
  delegate :params, :headers, to: :request
7
7
 
8
+ # @return [String] HTML
8
9
  def to_html
9
10
  set_flash_message
10
11
  if post? then create_action
@@ -14,12 +15,14 @@ module Wallaby
14
15
  end
15
16
  end
16
17
 
18
+ # @return [String] CSV
17
19
  def to_csv
18
20
  set_layout_to_none
19
21
  headers['Content-Disposition'] = "attachment; filename=\"#{file_name}\""
20
22
  default_render
21
23
  end
22
24
 
25
+ # @return [String] JSON
23
26
  def to_json
24
27
  set_layout_to_none
25
28
  return default_render unless post? || patch? || put? || delete?
@@ -31,6 +34,9 @@ module Wallaby
31
34
 
32
35
  private
33
36
 
37
+ # For create action
38
+ # - if has errors, render the form again
39
+ # - else redirect to show page
34
40
  def create_action
35
41
  if has_errors?
36
42
  render :new, options
@@ -39,6 +45,9 @@ module Wallaby
39
45
  end
40
46
  end
41
47
 
48
+ # For update action
49
+ # - if has errors, render the form again
50
+ # - else redirect to show page
42
51
  def update_action
43
52
  if has_errors?
44
53
  render :edit, options
@@ -47,21 +56,25 @@ module Wallaby
47
56
  end
48
57
  end
49
58
 
59
+ # For destroy action
60
+ # - redirect to show page
50
61
  def destroy_action
51
62
  redirect_to resource_location
52
63
  end
53
64
 
65
+ # @return [String] file name
54
66
  def file_name
55
67
  timestamp = Time.zone.now.to_s(:number)
56
68
  "#{params[:resources]}-exported-#{timestamp}.#{format}"
57
69
  end
58
70
 
71
+ # Set layout to nothing
59
72
  def set_layout_to_none
60
73
  options[:layout] = false
61
74
  end
62
75
 
76
+ # @see FlashResponder
63
77
  def set_flash_message
64
- # @see FlashResponder
65
78
  set_flash_message! if set_flash_message?
66
79
  end
67
80
  end
@@ -21,11 +21,15 @@ module Wallaby
21
21
 
22
22
  private
23
23
 
24
+ # @param resources_name [String] resource name in plural
25
+ # @return [Class] controller class
24
26
  def find_controller_by(resources_name)
25
27
  model_class = Map.model_class_map resources_name
26
28
  Map.controller_map model_class
27
29
  end
28
30
 
31
+ # @param params [ActionController::Parameters]
32
+ # @return [String, Symbol] action name
29
33
  def find_action_by(params)
30
34
  # Action name comes from either the defaults or :action param
31
35
  # @see Wallaby::Engine.routes
@@ -1,11 +1,14 @@
1
1
  module Wallaby
2
- # Model servicer
2
+ # Abstract model servicer
3
3
  class AbstractModelServicer
4
+ # @return [Class] model class that comes from its class name
4
5
  def self.model_class
5
6
  return unless self < ::Wallaby::ModelServicer
6
7
  Map.model_class_map name.gsub('Servicer', EMPTY_STRING)
7
8
  end
8
9
 
10
+ # @param model_class [Class, nil] model class
11
+ # @param authorizer [Ability]
9
12
  def initialize(model_class = nil, authorizer = nil)
10
13
  @model_class = model_class || self.class.model_class
11
14
  raise ArgumentError, 'model class required' unless @model_class
@@ -13,34 +16,55 @@ module Wallaby
13
16
  @provider = Map.service_provider_map @model_class
14
17
  end
15
18
 
19
+ # @param params [ActionController::Parameters]
20
+ # @return [ActionController::Parameters]
16
21
  def permit(params)
17
22
  @provider.permit params
18
23
  end
19
24
 
25
+ # @param params [ActionController::Parameters]
26
+ # @return [ActiveRecord::Relation]
20
27
  def collection(params)
21
28
  @provider.collection params, @authorizer
22
29
  end
23
30
 
31
+ # @param query [ActiveRecord::Relation]
32
+ # @param params [ActionController::Parameters]
33
+ # @return [ActiveRecord::Relation]
24
34
  def paginate(query, params)
25
35
  @provider.paginate query, params
26
36
  end
27
37
 
38
+ # @param params [ActionController::Parameters]
39
+ # @return [Object] initialized object
28
40
  def new(params)
29
41
  @provider.new params, @authorizer
30
42
  end
31
43
 
44
+ # @param id [Object]
45
+ # @param params [ActionController::Parameters]
46
+ # @return [Object] resource object
32
47
  def find(id, params)
33
48
  @provider.find id, params, @authorizer
34
49
  end
35
50
 
51
+ # @param resource [Object]
52
+ # @param params [ActionController::Parameters]
53
+ # @return [Object] resource object
36
54
  def create(resource, params)
37
55
  @provider.create resource, params, @authorizer
38
56
  end
39
57
 
58
+ # @param resource [Object]
59
+ # @param params [ActionController::Parameters]
60
+ # @return [Object] resource object
40
61
  def update(resource, params)
41
62
  @provider.update resource, params, @authorizer
42
63
  end
43
64
 
65
+ # @param resource [Object]
66
+ # @param params [ActionController::Parameters]
67
+ # @return [Object] resource object
44
68
  def destroy(resource, params)
45
69
  @provider.destroy resource, params, @authorizer
46
70
  end
@@ -1,5 +1,6 @@
1
1
  module Wallaby
2
2
  # Model servicer
3
+ # @see Wallaby::AbstractModelServicer
3
4
  class ModelServicer < AbstractModelServicer
4
5
  end
5
6
  end
@@ -1,16 +1,20 @@
1
1
  module Wallaby
2
+ # @private
2
3
  # Link renderer
3
4
  class LinkOptionsNormalizer
4
- class << self
5
- def normalize(html_options, block, defaults)
6
- block ||= defaults[:block]
7
- html_options[:title] ||= defaults[:block].call
8
- # allow empty class to be set
9
- if !html_options.key?(:class) && defaults[:class]
10
- html_options[:class] = defaults[:class]
11
- end
12
- [html_options, block]
5
+ # Normalize options for `link_to` to use
6
+ # @param html_options [Hash] html options
7
+ # @param block [Proc] a block
8
+ # @param defaults [Hash]
9
+ # @return [Array<Hash, Proc>] html_options and the block
10
+ def self.normalize(html_options, block, defaults)
11
+ block ||= defaults[:block]
12
+ html_options[:title] ||= defaults[:block].call
13
+ # allow empty class to be set
14
+ if !html_options.key?(:class) && defaults[:class]
15
+ html_options[:class] = defaults[:class]
13
16
  end
17
+ [html_options, block]
14
18
  end
15
19
  end
16
20
  end
@@ -1,17 +1,22 @@
1
1
  module Wallaby
2
2
  # Lookup context wrapper.
3
- # This is to take care of missing template in production to return string
4
- # template.
3
+ #
4
+ # This is to take care of missing template in production.
5
+ # It will return `string` template
6
+ # if it doesn't know how to handle the template.
5
7
  # @see Wallaby::PartialRenderer
6
8
  class LookupContextWrapper
7
9
  origin_methods = ::ActionView::LookupContext.instance_methods \
8
10
  - ::Object.instance_methods - %i(find_template)
9
11
  delegate(*origin_methods, to: :@lookup_context)
10
12
 
13
+ # @param lookup_context [ActionView::LookupContext]
11
14
  def initialize(lookup_context)
12
15
  @lookup_context = lookup_context
13
16
  end
14
17
 
18
+ # @see ActionView::LookupContext#find_template
19
+ # @param args [Array] a list of arguments
15
20
  def find_template(*args)
16
21
  @lookup_context.find_template(*args)
17
22
  rescue ::ActionView::MissingTemplate
@@ -25,8 +30,12 @@ module Wallaby
25
30
  super nil
26
31
  end
27
32
 
33
+ # @param args [Array] a list of arguments
34
+ # @return [nil]
28
35
  def render(*args); end
29
36
 
37
+ # @param args [Array] a list of arguments
38
+ # @return [nil]
30
39
  def virtual_path(*args); end
31
40
  end
32
41
  end