wallaby-core 0.2.0 → 0.2.4
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 +4 -4
- data/README.md +42 -1
- data/app/controllers/wallaby/resources_controller.rb +15 -375
- data/app/security/ability.rb +1 -1
- data/config/locales/wallaby.en.yml +92 -128
- data/config/locales/wallaby_class.en.yml +2 -23
- data/lib/adaptors/wallaby/custom/default_provider.rb +1 -1
- data/lib/adaptors/wallaby/custom/model_decorator.rb +8 -7
- data/lib/adaptors/wallaby/custom/model_finder.rb +3 -2
- data/lib/adaptors/wallaby/custom/model_pagination_provider.rb +1 -1
- data/lib/adaptors/wallaby/custom/model_service_provider.rb +1 -40
- data/lib/authorizers/wallaby/cancancan_authorization_provider.rb +30 -24
- data/lib/authorizers/wallaby/default_authorization_provider.rb +6 -13
- data/lib/authorizers/wallaby/model_authorizer.rb +43 -67
- data/lib/authorizers/wallaby/pundit_authorization_provider.rb +21 -30
- data/lib/concerns/wallaby/application_concern.rb +110 -0
- data/lib/concerns/wallaby/authentication_concern.rb +162 -0
- data/lib/concerns/wallaby/authorizable.rb +8 -8
- data/lib/concerns/wallaby/baseable.rb +91 -10
- data/lib/concerns/wallaby/decoratable.rb +3 -3
- data/lib/concerns/wallaby/engineable.rb +1 -1
- data/lib/concerns/wallaby/fieldable.rb +4 -4
- data/lib/concerns/wallaby/paginatable.rb +3 -3
- data/lib/concerns/wallaby/resourcable.rb +4 -35
- data/lib/concerns/wallaby/resources_concern.rb +434 -0
- data/lib/concerns/wallaby/servicable.rb +4 -4
- data/lib/decorators/wallaby/resource_decorator.rb +53 -80
- data/lib/errors/wallaby/class_not_found.rb +6 -0
- data/lib/errors/wallaby/model_not_found.rb +3 -1
- data/lib/errors/wallaby/resource_not_found.rb +1 -1
- data/lib/helpers/wallaby/application_helper.rb +6 -0
- data/lib/helpers/wallaby/form_helper.rb +2 -3
- data/lib/helpers/wallaby/index_helper.rb +2 -2
- data/lib/helpers/wallaby/links_helper.rb +5 -5
- data/lib/helpers/wallaby/resources_helper.rb +3 -0
- data/lib/helpers/wallaby/secure_helper.rb +3 -3
- data/lib/helpers/wallaby/styling_helper.rb +17 -3
- data/lib/interfaces/wallaby/mode.rb +5 -5
- data/lib/interfaces/wallaby/model_authorization_provider.rb +15 -13
- data/lib/interfaces/wallaby/model_decorator.rb +15 -3
- data/lib/paginators/wallaby/model_paginator.rb +14 -45
- data/lib/routes/wallaby/resources_router.rb +1 -1
- data/lib/servicers/wallaby/model_servicer.rb +32 -62
- data/lib/services/wallaby/map/mode_mapper.rb +14 -14
- data/lib/services/wallaby/map/model_class_collector.rb +2 -2
- data/lib/services/wallaby/map/model_class_mapper.rb +7 -26
- data/lib/services/wallaby/type_renderer.rb +2 -12
- data/lib/utils/wallaby/locale.rb +53 -0
- data/lib/utils/wallaby/model_utils.rb +4 -3
- data/lib/utils/wallaby/module_utils.rb +1 -1
- data/lib/utils/wallaby/utils.rb +23 -9
- data/lib/wallaby/class_array.rb +75 -0
- data/lib/wallaby/class_hash.rb +94 -0
- data/lib/wallaby/classifier.rb +29 -0
- data/lib/wallaby/configuration/mapping.rb +33 -21
- data/lib/wallaby/configuration/metadata.rb +1 -1
- data/lib/wallaby/configuration/models.rb +5 -9
- data/lib/wallaby/configuration/security.rb +6 -3
- data/lib/wallaby/configuration/sorting.rb +1 -1
- data/lib/wallaby/configuration.rb +31 -2
- data/lib/wallaby/core/version.rb +1 -1
- data/lib/wallaby/core.rb +18 -6
- data/lib/wallaby/engine.rb +9 -20
- data/lib/wallaby/logger.rb +35 -0
- data/lib/wallaby/map.rb +20 -17
- data/lib/wallaby/preloader.rb +77 -0
- metadata +16 -9
- data/app/controllers/wallaby/application_controller.rb +0 -84
- data/app/controllers/wallaby/secure_controller.rb +0 -81
- data/lib/utils/wallaby/preload_utils.rb +0 -44
@@ -3,33 +3,114 @@
|
|
3
3
|
module Wallaby
|
4
4
|
# Abstract related class methods
|
5
5
|
module Baseable
|
6
|
-
|
7
|
-
|
6
|
+
SUFFIX = /(Controller|Decorator|Servicer|Authorizer|Paginator)$/.freeze
|
7
|
+
ATTR_NAME = 'model_class'
|
8
|
+
|
9
|
+
# @param class_name [String]
|
10
|
+
# @param attr_name [String]
|
11
|
+
# @param suffix [String]
|
12
|
+
# @param plural [String]
|
13
|
+
# @return [Class] found associated class
|
14
|
+
# @raise [Wallaby::ClassNotFound] if associated class isn't found
|
15
|
+
def self.guess_associated_class_of(class_name, attr_name: ATTR_NAME, suffix: EMPTY_STRING, plural: false)
|
16
|
+
base_name = class_name.gsub(SUFFIX, EMPTY_STRING).try(plural ? :pluralize : :singularize) << suffix
|
17
|
+
parts = base_name.split(COLONS)
|
18
|
+
parts.each_with_index do |_, index|
|
19
|
+
begin
|
20
|
+
# NOTE: DO NOT try to use const_defined? and const_get EVER.
|
21
|
+
# This is Rails, use constantize
|
22
|
+
return parts[index..-1].join(COLONS).constantize
|
23
|
+
rescue NameError # rubocop:disable Lint/SuppressedException
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
raise ClassNotFound, <<~INSTRUCTION
|
28
|
+
The `#{attr_name}` hasn't been provided for Class `#{class_name}` and Wallaby cannot guess it right.
|
29
|
+
If `#{class_name}` is supposed to be a base class, add the following line to its class declaration:
|
30
|
+
|
31
|
+
class #{class_name}
|
32
|
+
base_class!
|
33
|
+
end
|
34
|
+
|
35
|
+
Otherwise, please specify the `#{attr_name}` in `#{class_name}`'s declaration as follows:
|
36
|
+
|
37
|
+
class #{class_name}
|
38
|
+
self.#{attr_name} = CorrectClass
|
39
|
+
end
|
40
|
+
INSTRUCTION
|
41
|
+
end
|
42
|
+
|
43
|
+
# Configurable attributes:
|
44
|
+
# 1. mark a class as a base class
|
45
|
+
# 2. guess the model class if model class isn't given
|
8
46
|
module ClassMethods
|
9
47
|
# @return [true] if class is a base class
|
10
48
|
# @return [false] if class is not a base class
|
11
49
|
def base_class?
|
12
|
-
@base_class
|
50
|
+
@base_class == self
|
13
51
|
end
|
14
52
|
|
15
|
-
# Mark class
|
16
|
-
# @return [true]
|
53
|
+
# Mark the current class as the base class
|
17
54
|
def base_class!
|
18
|
-
@base_class =
|
55
|
+
@base_class = self
|
56
|
+
end
|
57
|
+
|
58
|
+
# @!attribute [r] base_class
|
59
|
+
# @return [Class] The base class or the one from super class
|
60
|
+
def base_class
|
61
|
+
@base_class || superclass.try(:base_class)
|
62
|
+
end
|
63
|
+
|
64
|
+
# @!attribute [w] model_class
|
65
|
+
def model_class=(model_class)
|
66
|
+
raise ArgumentError 'Please provide a Class for `model_class`.' unless model_class.is_a? Class
|
67
|
+
|
68
|
+
@model_class = model_class
|
69
|
+
end
|
70
|
+
|
71
|
+
# @!attribute [r] model_class
|
72
|
+
# @example To configure the model class
|
73
|
+
# class Admin::ProductAuthorizer < Admin::ApplicationAuthorizer
|
74
|
+
# self.model_class = Product
|
75
|
+
# end
|
76
|
+
# @example To configure the model class for version below 5.2.0
|
77
|
+
# class Admin::ProductAuthorizer < Admin::ApplicationAuthorizer
|
78
|
+
# def self.model_class
|
79
|
+
# Product
|
80
|
+
# end
|
81
|
+
# end
|
82
|
+
# @return [Class] assigned model class or Wallaby will guess it
|
83
|
+
# (see {Wallaby::Baseable.guess_associated_class_of .guess_associated_class_of})
|
84
|
+
# @return [nil] if current class is marked as base class
|
85
|
+
# @raise [Wallaby::ModelNotFound] if model class isn't found
|
86
|
+
# @raise [ArgumentError] if base class is empty
|
87
|
+
def model_class
|
88
|
+
return if base_class?
|
89
|
+
|
90
|
+
@model_class ||= Baseable.guess_associated_class_of name
|
91
|
+
rescue TypeError
|
92
|
+
raise ArgumentError, <<~INSTRUCTION
|
93
|
+
Please specify the base class for class `#{name}`
|
94
|
+
by marking one of its parents `base_class!`, for example:
|
95
|
+
|
96
|
+
class ParentClass
|
97
|
+
base_class!
|
98
|
+
end
|
99
|
+
INSTRUCTION
|
19
100
|
end
|
20
101
|
|
21
102
|
# @!attribute [w] namespace
|
22
103
|
# Used by `model_class`
|
23
|
-
# @since 5.2.0
|
104
|
+
# @since wallaby-5.2.0
|
24
105
|
attr_writer :namespace
|
25
106
|
|
26
107
|
# @!attribute [r] namespace
|
27
108
|
# @return [String] namespace
|
28
|
-
# @since 5.2.0
|
109
|
+
# @since wallaby-5.2.0
|
29
110
|
def namespace
|
30
111
|
@namespace ||=
|
31
|
-
|
32
|
-
|
112
|
+
superclass.try(:namespace) \
|
113
|
+
|| name.deconstantize.gsub(/Wallaby(::)?/, EMPTY_STRING).presence
|
33
114
|
end
|
34
115
|
end
|
35
116
|
end
|
@@ -22,7 +22,7 @@ module Wallaby
|
|
22
22
|
# @return [Class] resource decorator
|
23
23
|
# @raise [ArgumentError] when **resource_decorator** doesn't inherit from **application_decorator**
|
24
24
|
# @see Wallaby::ResourceDecorator
|
25
|
-
# @since 5.2.0
|
25
|
+
# @since wallaby-5.2.0
|
26
26
|
attr_reader :resource_decorator
|
27
27
|
|
28
28
|
# @!attribute [w] application_decorator
|
@@ -40,7 +40,7 @@ module Wallaby
|
|
40
40
|
# @raise [ArgumentError] when **resource_decorator** doesn't inherit from **application_decorator**
|
41
41
|
# @return [Class] application decorator
|
42
42
|
# @see Wallaby::ResourceDecorator
|
43
|
-
# @since 5.2.0
|
43
|
+
# @since wallaby-5.2.0
|
44
44
|
def application_decorator
|
45
45
|
@application_decorator ||= ModuleUtils.try_to superclass, :application_decorator
|
46
46
|
end
|
@@ -68,7 +68,7 @@ module Wallaby
|
|
68
68
|
@current_decorator ||=
|
69
69
|
(controller_to_get(:resource_decorator) || \
|
70
70
|
Map.resource_decorator_map(current_model_class, controller_to_get(:application_decorator))).tap do |decorator|
|
71
|
-
|
71
|
+
Logger.debug %(Current decorator: #{decorator}), sourcing: false
|
72
72
|
end
|
73
73
|
end
|
74
74
|
|
@@ -18,7 +18,7 @@ module Wallaby
|
|
18
18
|
# @param field_name [String, Symbol] field name
|
19
19
|
# @return [String, Symbol] type for a given field
|
20
20
|
def type_of(field_name)
|
21
|
-
|
21
|
+
ensure_type_is_present field_name, metadata_of(field_name)[:type]
|
22
22
|
end
|
23
23
|
|
24
24
|
# @param field_name [String, Symbol] field name
|
@@ -36,7 +36,7 @@ module Wallaby
|
|
36
36
|
# @param field_name [String, Symbol] field name
|
37
37
|
# @return [String, Symbol] index type for a given field
|
38
38
|
def index_type_of(field_name)
|
39
|
-
|
39
|
+
ensure_type_is_present field_name, index_metadata_of(field_name)[:type], 'index_'
|
40
40
|
end
|
41
41
|
|
42
42
|
# @param field_name [String, Symbol] field name
|
@@ -54,7 +54,7 @@ module Wallaby
|
|
54
54
|
# @param field_name [String, Symbol] field name
|
55
55
|
# @return [String, Symbol] show type for a given field
|
56
56
|
def show_type_of(field_name)
|
57
|
-
|
57
|
+
ensure_type_is_present field_name, show_metadata_of(field_name)[:type], 'show_'
|
58
58
|
end
|
59
59
|
|
60
60
|
# @param field_name [String, Symbol] field name
|
@@ -72,7 +72,7 @@ module Wallaby
|
|
72
72
|
# @param field_name [String, Symbol] field name
|
73
73
|
# @return [String, Symbol] form type for a given field
|
74
74
|
def form_type_of(field_name)
|
75
|
-
|
75
|
+
ensure_type_is_present field_name, form_metadata_of(field_name)[:type], 'form_'
|
76
76
|
end
|
77
77
|
end
|
78
78
|
end
|
@@ -20,7 +20,7 @@ module Wallaby
|
|
20
20
|
# @return [Class] model paginator
|
21
21
|
# @raise [ArgumentError] when **model_paginator** doesn't inherit from **application_paginator**
|
22
22
|
# @see Wallaby::ModelPaginator
|
23
|
-
# @since 5.2.0
|
23
|
+
# @since wallaby-5.2.0
|
24
24
|
attr_reader :model_paginator
|
25
25
|
|
26
26
|
# @!attribute [w] application_paginator
|
@@ -38,7 +38,7 @@ module Wallaby
|
|
38
38
|
# @return [Class] application decorator
|
39
39
|
# @raise [ArgumentError] when **model_paginator** doesn't inherit from **application_paginator**
|
40
40
|
# @see Wallaby::ModelPaginator
|
41
|
-
# @since 5.2.0
|
41
|
+
# @since wallaby-5.2.0
|
42
42
|
def application_paginator
|
43
43
|
@application_paginator ||= ModuleUtils.try_to superclass, :application_paginator
|
44
44
|
end
|
@@ -53,7 +53,7 @@ module Wallaby
|
|
53
53
|
@current_paginator ||=
|
54
54
|
(controller_to_get(:model_paginator) \
|
55
55
|
|| Map.paginator_map(current_model_class, controller_to_get(:application_paginator))).try do |klass|
|
56
|
-
|
56
|
+
Logger.debug %(Current paginator: #{klass}), sourcing: false
|
57
57
|
klass.new current_model_class, collection, params
|
58
58
|
end
|
59
59
|
end
|
@@ -3,41 +3,6 @@
|
|
3
3
|
module Wallaby
|
4
4
|
# Resources related attributes
|
5
5
|
module Resourcable
|
6
|
-
# Configurable attribute
|
7
|
-
module ClassMethods
|
8
|
-
# @!attribute [w] model_class
|
9
|
-
attr_writer :model_class
|
10
|
-
|
11
|
-
# @!attribute [r] model_class
|
12
|
-
# This attribute will be used by the dynamic router to find out which
|
13
|
-
# controller to dispatch to. For example:
|
14
|
-
#
|
15
|
-
# `/admin/products` will be dispatched to the controller that has the
|
16
|
-
# model class `Product`.
|
17
|
-
# @return [Class] the model class for controller.
|
18
|
-
# @example It can be customized as below:
|
19
|
-
# ```
|
20
|
-
# self.model_class = Product
|
21
|
-
# ```
|
22
|
-
# Or
|
23
|
-
# ```
|
24
|
-
# def self.model_class; Product; end
|
25
|
-
# ```
|
26
|
-
# @example To set model paginator
|
27
|
-
# class Admin::ProductionsController < Admin::ApplicationController
|
28
|
-
# self.model_class = ProductResources
|
29
|
-
# end
|
30
|
-
# @return [Class] model paginator
|
31
|
-
# @raise [ArgumentError] when **model_class** doesn't inherit from **application_paginator**
|
32
|
-
# @see Wallaby::ModelResources
|
33
|
-
def model_class
|
34
|
-
return unless self < ResourcesController
|
35
|
-
return if base_class? || self == Wallaby.configuration.mapping.resources_controller
|
36
|
-
|
37
|
-
@model_class ||= Map.model_class_map(name.gsub(/(^#{namespace}::)|(Controller$)/, EMPTY_STRING))
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
6
|
# @return [String] resources name for current request
|
42
7
|
def current_resources_name
|
43
8
|
@current_resources_name ||= params[:resources]
|
@@ -97,6 +62,8 @@ module Wallaby
|
|
97
62
|
)
|
98
63
|
end
|
99
64
|
|
65
|
+
alias collection! collection
|
66
|
+
|
100
67
|
# @note This is a template method that can be overridden by subclasses.
|
101
68
|
# This is a method to return resource for pages except `index`.
|
102
69
|
#
|
@@ -145,5 +112,7 @@ module Wallaby
|
|
145
112
|
&block
|
146
113
|
)
|
147
114
|
end
|
115
|
+
|
116
|
+
alias resource! resource
|
148
117
|
end
|
149
118
|
end
|