wallaby-core 0.2.11 → 0.3.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/controllers/wallaby/resources_controller.rb +20 -7
- data/app/security/ability.rb +1 -1
- data/config/routes.rb +21 -14
- data/lib/adaptors/wallaby/custom/default_provider.rb +1 -1
- data/lib/adaptors/wallaby/custom/model_decorator.rb +5 -17
- data/lib/adaptors/wallaby/custom/model_finder.rb +3 -3
- data/lib/adaptors/wallaby/custom/model_pagination_provider.rb +1 -1
- data/lib/adaptors/wallaby/custom/model_service_provider.rb +1 -1
- data/lib/authorizers/wallaby/cancancan_authorization_provider.rb +12 -5
- data/lib/authorizers/wallaby/default_authorization_provider.rb +10 -1
- data/lib/authorizers/wallaby/model_authorizer.rb +41 -16
- data/lib/authorizers/wallaby/pundit_authorization_provider.rb +22 -8
- data/lib/concerns/wallaby/application_concern.rb +41 -71
- data/lib/concerns/wallaby/authentication_concern.rb +29 -127
- data/lib/concerns/wallaby/authorizable.rb +14 -57
- data/lib/concerns/wallaby/baseable.rb +24 -57
- data/lib/concerns/wallaby/configurable.rb +416 -0
- data/lib/concerns/wallaby/decoratable.rb +24 -60
- data/lib/concerns/wallaby/engineable.rb +29 -46
- data/lib/concerns/wallaby/fieldable.rb +45 -56
- data/lib/concerns/wallaby/paginatable.rb +20 -51
- data/lib/concerns/wallaby/prefixable.rb +24 -4
- data/lib/concerns/wallaby/resourcable.rb +130 -72
- data/lib/concerns/wallaby/resources_concern.rb +205 -305
- data/lib/concerns/wallaby/servicable.rb +8 -48
- data/lib/concerns/wallaby/urlable.rb +69 -0
- data/lib/decorators/wallaby/resource_decorator.rb +72 -34
- data/lib/errors/wallaby/class_not_found.rb +1 -2
- data/lib/errors/wallaby/forbidden.rb +1 -2
- data/lib/errors/wallaby/general_error.rb +1 -1
- data/lib/errors/wallaby/invalid_error.rb +1 -2
- data/lib/errors/wallaby/method_removed.rb +5 -0
- data/lib/errors/wallaby/model_not_found.rb +1 -2
- data/lib/errors/wallaby/not_authenticated.rb +1 -2
- data/lib/errors/wallaby/not_found.rb +1 -2
- data/lib/errors/wallaby/not_implemented.rb +1 -2
- data/lib/errors/wallaby/resource_not_found.rb +1 -2
- data/lib/errors/wallaby/unprocessable_entity.rb +1 -2
- data/lib/fields/wallaby/all_fields.rb +63 -0
- data/lib/forms/wallaby/form_builder.rb +2 -2
- data/lib/generators/wallaby/engine/application_generator.rb +33 -0
- data/lib/generators/wallaby/engine/authorizer/USAGE +20 -0
- data/lib/generators/wallaby/engine/authorizer/authorizer_generator.rb +19 -0
- data/lib/generators/wallaby/engine/authorizer/templates/authorizer.rb.erb +35 -0
- data/lib/generators/wallaby/engine/controller/USAGE +20 -0
- data/lib/generators/wallaby/engine/controller/controller_generator.rb +23 -0
- data/lib/generators/wallaby/engine/controller/templates/controller.rb.erb +130 -0
- data/lib/generators/wallaby/engine/decorator/USAGE +20 -0
- data/lib/generators/wallaby/engine/decorator/decorator_generator.rb +19 -0
- data/lib/generators/wallaby/engine/decorator/templates/decorator.rb.erb +5 -0
- data/lib/generators/wallaby/engine/install/USAGE +19 -0
- data/lib/generators/wallaby/engine/install/install_generator.rb +91 -0
- data/lib/generators/wallaby/engine/install/templates/application_authorizer.rb.erb +37 -0
- data/lib/generators/wallaby/engine/install/templates/application_controller.rb.erb +173 -0
- data/lib/generators/wallaby/engine/install/templates/application_decorator.rb.erb +7 -0
- data/lib/generators/wallaby/engine/install/templates/application_paginator.rb.erb +27 -0
- data/lib/generators/wallaby/engine/install/templates/application_servicer.rb.erb +47 -0
- data/lib/generators/wallaby/engine/install/templates/initializer.rb.erb +16 -0
- data/lib/generators/wallaby/engine/paginator/USAGE +20 -0
- data/lib/generators/wallaby/engine/paginator/paginator_generator.rb +19 -0
- data/lib/generators/wallaby/engine/paginator/templates/paginator.rb.erb +25 -0
- data/lib/generators/wallaby/engine/servicer/USAGE +20 -0
- data/lib/generators/wallaby/engine/servicer/servicer_generator.rb +19 -0
- data/lib/generators/wallaby/engine/servicer/templates/servicer.rb.erb +45 -0
- data/lib/helpers/wallaby/application_helper.rb +10 -59
- data/lib/helpers/wallaby/base_helper.rb +11 -11
- data/lib/helpers/wallaby/configuration_helper.rb +36 -4
- data/lib/helpers/wallaby/form_helper.rb +1 -1
- data/lib/helpers/wallaby/index_helper.rb +19 -9
- data/lib/helpers/wallaby/links_helper.rb +13 -80
- data/lib/helpers/wallaby/resources_helper.rb +39 -7
- data/lib/helpers/wallaby/secure_helper.rb +20 -19
- data/lib/interfaces/wallaby/mode.rb +8 -8
- data/lib/interfaces/wallaby/model_authorization_provider.rb +23 -22
- data/lib/interfaces/wallaby/model_decorator.rb +36 -48
- data/lib/interfaces/wallaby/model_finder.rb +3 -3
- data/lib/interfaces/wallaby/model_pagination_provider.rb +2 -6
- data/lib/interfaces/wallaby/model_service_provider.rb +4 -4
- data/lib/paginators/wallaby/model_paginator.rb +1 -1
- data/lib/responders/wallaby/json_api_responder.rb +10 -5
- data/lib/responders/wallaby/resources_responder.rb +7 -2
- data/lib/routes/wallaby/engines/base_route.rb +78 -0
- data/lib/routes/wallaby/engines/custom_app_route.rb +92 -0
- data/lib/routes/wallaby/engines/engine_route.rb +77 -0
- data/lib/routes/wallaby/resources_router.rb +100 -45
- data/lib/servicers/wallaby/model_servicer.rb +13 -13
- data/lib/services/wallaby/authorizer_finder.rb +23 -0
- data/lib/services/wallaby/class_finder.rb +42 -0
- data/lib/services/wallaby/controller_finder.rb +29 -0
- data/lib/services/wallaby/decorator_finder.rb +34 -0
- data/lib/services/wallaby/default_models_excluder.rb +45 -0
- data/lib/services/wallaby/engine_name_finder.rb +14 -11
- data/lib/services/wallaby/engine_url_for.rb +82 -37
- data/lib/services/wallaby/fields_regulator.rb +34 -0
- data/lib/services/wallaby/map/mode_mapper.rb +4 -4
- data/lib/services/wallaby/map/model_class_mapper.rb +1 -1
- data/lib/services/wallaby/model_class_filter.rb +29 -0
- data/lib/services/wallaby/paginator_finder.rb +24 -0
- data/lib/services/wallaby/prefixes_builder.rb +49 -8
- data/lib/services/wallaby/servicer_finder.rb +31 -0
- data/lib/services/wallaby/sorting/hash_builder.rb +9 -0
- data/lib/services/wallaby/sorting/link_builder.rb +7 -10
- data/lib/services/wallaby/sorting/next_builder.rb +1 -12
- data/lib/services/wallaby/sorting/single_builder.rb +1 -1
- data/lib/support/action_dispatch/routing/mapper.rb +29 -4
- data/lib/utils/wallaby/field_utils.rb +9 -8
- data/lib/utils/wallaby/inflector.rb +94 -0
- data/lib/utils/wallaby/locale.rb +2 -2
- data/lib/utils/wallaby/module_utils.rb +3 -10
- data/lib/utils/wallaby/utils.rb +21 -14
- data/lib/wallaby/class_array.rb +18 -13
- data/lib/wallaby/class_hash.rb +16 -14
- data/lib/wallaby/classifier.rb +4 -2
- data/lib/wallaby/configuration/features.rb +8 -2
- data/lib/wallaby/configuration/mapping.rb +66 -112
- data/lib/wallaby/configuration/metadata.rb +15 -12
- data/lib/wallaby/configuration/models.rb +27 -25
- data/lib/wallaby/configuration/pagination.rb +15 -19
- data/lib/wallaby/configuration/security.rb +88 -80
- data/lib/wallaby/configuration/sorting.rb +15 -17
- data/lib/wallaby/configuration.rb +58 -23
- data/lib/wallaby/constants.rb +21 -13
- data/lib/wallaby/core/version.rb +1 -1
- data/lib/wallaby/core.rb +34 -10
- data/lib/wallaby/deprecator.rb +81 -0
- data/lib/wallaby/engine.rb +2 -19
- data/lib/wallaby/guesser.rb +45 -0
- data/lib/wallaby/logger.rb +35 -13
- data/lib/wallaby/map.rb +11 -88
- data/lib/wallaby/preloader.rb +9 -31
- metadata +120 -15
- data/config/locales/wallaby_class.en.yml +0 -9
- data/lib/concerns/wallaby/defaultable.rb +0 -38
- data/lib/concerns/wallaby/shared_helpers.rb +0 -22
- data/lib/services/wallaby/map/model_class_collector.rb +0 -49
- data/lib/services/wallaby/type_renderer.rb +0 -40
- data/lib/utils/wallaby/model_utils.rb +0 -52
- data/lib/utils/wallaby/test_utils.rb +0 -34
@@ -5,72 +5,34 @@ module Wallaby
|
|
5
5
|
module AuthenticationConcern
|
6
6
|
extend ActiveSupport::Concern
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
# @note This is a template method that can be overridden by subclasses
|
11
|
-
# This {current_user} method will try to looking up the actual implementation from the following
|
12
|
-
# places from high precedence to low:
|
13
|
-
#
|
14
|
-
# - {Wallaby::Configuration::Security#current_user}
|
15
|
-
# - `super`
|
16
|
-
# - do nothing
|
17
|
-
#
|
18
|
-
# It can be replaced completely in subclasses:
|
19
|
-
#
|
20
|
-
# def current_user
|
21
|
-
# # NOTE: please ensure `@current_user` is assigned, for instance:
|
22
|
-
# @current_user ||= User.new params.slice(:email)
|
23
|
-
# end
|
24
|
-
# @return [Object] a user object
|
8
|
+
included do
|
9
|
+
try :helper_method, :wallaby_user
|
25
10
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
# It can be replaced completely in subclasses:
|
37
|
-
#
|
38
|
-
# def authenticate_user!
|
39
|
-
# authenticate_or_request_with_http_basic do |username, password|
|
40
|
-
# username == 'too_simple' && password == 'too_naive'
|
41
|
-
# end
|
42
|
-
# end
|
43
|
-
# @return [true] when user is authenticated successfully
|
44
|
-
# @raise [Wallaby::NotAuthenticated] when user fails to authenticate
|
11
|
+
rescue_from NotAuthenticated, with: :unauthorized
|
12
|
+
rescue_from Forbidden, with: :forbidden
|
13
|
+
|
14
|
+
# # @note This is a proxy method to ensure {#current_user} exists
|
15
|
+
unless method_defined?(:current_user)
|
16
|
+
def current_user
|
17
|
+
defined?(super) ? super : nil
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
45
21
|
|
46
|
-
# @!method wallaby_user
|
47
22
|
# @note This is a template method that can be overridden by subclasses
|
48
|
-
# This method will try to call
|
23
|
+
# This method will try to call #current_user from superclass.
|
49
24
|
# @example It can be overridden in subclasses:
|
50
25
|
# def wallaby_user
|
51
26
|
# # NOTE: better to assign user to `@wallaby_user` for better performance:
|
52
27
|
# @wallaby_user ||= User.new params.slice(:email)
|
53
28
|
# end
|
54
29
|
# @return [Object] a user object
|
30
|
+
def wallaby_user
|
31
|
+
@wallaby_user ||= try :current_user
|
32
|
+
end
|
55
33
|
|
56
|
-
# @!method pundit_user
|
57
|
-
# @note This is a template method that can be overridden by subclasses
|
58
|
-
# This overridden method of {#original_pundit_user} will try to call {#wallaby_user} instead of {#current_user}.
|
59
|
-
# @example It can be overridden in subclasses:
|
60
|
-
# def pundit_user
|
61
|
-
# @pundit_user ||= User.new params.slice(:email)
|
62
|
-
# end
|
63
|
-
# @return [Object] a user object
|
64
|
-
|
65
|
-
# @!parse alias :override_pundit_user :pundit_user
|
66
|
-
|
67
|
-
# @!method original_pundit_user
|
68
|
-
# This method is the original version of {#pundit_user} which calls the {#current_user}.
|
69
|
-
# @return [Object] a user object
|
70
|
-
|
71
|
-
# @!method authenticate_wallaby_user!
|
72
34
|
# @note This is a template method that can be overridden by subclasses
|
73
|
-
# This method will try to call
|
35
|
+
# This method will try to call #authenticate_user! from superclass.
|
74
36
|
# And it will be run as the first callback before an action.
|
75
37
|
# @example It can be overridden in subclasses:
|
76
38
|
# def authenticate_wallaby_user!
|
@@ -79,84 +41,24 @@ module Wallaby
|
|
79
41
|
# end
|
80
42
|
# end
|
81
43
|
# @return [true] when user is authenticated successfully
|
82
|
-
# @raise [
|
44
|
+
# @raise [NotAuthenticated] when user fails to authenticate
|
45
|
+
def authenticate_wallaby_user!
|
46
|
+
authenticated = try :authenticate_user!
|
47
|
+
raise NotAuthenticated if authenticated == false
|
48
|
+
|
49
|
+
true
|
50
|
+
end
|
83
51
|
|
84
|
-
# @!method unauthorized(exception = nil)
|
85
52
|
# Unauthorized page.
|
86
53
|
# @param exception [Exception] comes from **rescue_from**
|
54
|
+
def unauthorized(exception = nil)
|
55
|
+
render_error exception, __callee__
|
56
|
+
end
|
87
57
|
|
88
|
-
# @!method forbidden(exception = nil)
|
89
58
|
# Forbidden page.
|
90
59
|
# @param exception [Exception] comes from **rescue_from**
|
91
|
-
|
92
|
-
|
93
|
-
helper_method :wallaby_user
|
94
|
-
|
95
|
-
rescue_from NotAuthenticated, with: :unauthorized
|
96
|
-
rescue_from Forbidden, with: :forbidden
|
97
|
-
|
98
|
-
# (see #current_user)
|
99
|
-
# TODO: remove this from 6.2
|
100
|
-
def current_user
|
101
|
-
@current_user ||=
|
102
|
-
if security.current_user? || !defined? super
|
103
|
-
instance_exec(&security.current_user)
|
104
|
-
else
|
105
|
-
Logger.deprecated 'Wallaby will use `wallaby_user` instead of `current_user` from 6.2.'
|
106
|
-
super
|
107
|
-
end
|
108
|
-
end
|
109
|
-
|
110
|
-
# (see #authenticate_user!)
|
111
|
-
# TODO: remove this from 6.2
|
112
|
-
def authenticate_user!
|
113
|
-
authenticated =
|
114
|
-
if security.authenticate? || !defined? super
|
115
|
-
instance_exec(&security.authenticate)
|
116
|
-
else
|
117
|
-
Logger.deprecated 'Wallaby will use `authenticate_wallaby_user!`' \
|
118
|
-
'instead of `authenticate_user!` from 6.2.'
|
119
|
-
super
|
120
|
-
end
|
121
|
-
raise NotAuthenticated if authenticated == false
|
122
|
-
|
123
|
-
true
|
124
|
-
end
|
125
|
-
|
126
|
-
# (see #wallaby_user)
|
127
|
-
def wallaby_user
|
128
|
-
@wallaby_user ||= try :current_user
|
129
|
-
end
|
130
|
-
|
131
|
-
if defined?(::Pundit) && instance_methods.include?(:pundit_user)
|
132
|
-
# (see #override_pundit_user)
|
133
|
-
def override_pundit_user
|
134
|
-
wallaby_user
|
135
|
-
end
|
136
|
-
|
137
|
-
# (see #original_pundit_user)
|
138
|
-
alias_method :original_pundit_user, :pundit_user
|
139
|
-
# (see #pundit_user)
|
140
|
-
alias_method :pundit_user, :override_pundit_user
|
141
|
-
end
|
142
|
-
|
143
|
-
# (see #authenticate_wallaby_user!)
|
144
|
-
def authenticate_wallaby_user!
|
145
|
-
authenticated = try :authenticate_user!
|
146
|
-
raise NotAuthenticated if authenticated == false
|
147
|
-
|
148
|
-
true
|
149
|
-
end
|
150
|
-
|
151
|
-
# (see #unauthorized)
|
152
|
-
def unauthorized(exception = nil)
|
153
|
-
render_error exception, __callee__
|
154
|
-
end
|
155
|
-
|
156
|
-
# (see #forbidden)
|
157
|
-
def forbidden(exception = nil)
|
158
|
-
render_error exception, __callee__
|
159
|
-
end
|
60
|
+
def forbidden(exception = nil)
|
61
|
+
render_error exception, __callee__
|
160
62
|
end
|
161
63
|
end
|
162
64
|
end
|
@@ -1,61 +1,15 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Wallaby
|
4
|
-
# Authorizer related
|
4
|
+
# Authorizer related
|
5
5
|
module Authorizable
|
6
|
-
# Configurable attribute for authorizer related
|
7
|
-
module ClassMethods
|
8
|
-
# @!attribute [w] model_authorizer
|
9
|
-
def model_authorizer=(model_authorizer)
|
10
|
-
ModuleUtils.inheritance_check model_authorizer, application_authorizer
|
11
|
-
@model_authorizer = model_authorizer
|
12
|
-
end
|
13
|
-
|
14
|
-
# @!attribute [r] model_authorizer
|
15
|
-
# If Wallaby doesn't get it right, please specify the **model_authorizer**.
|
16
|
-
# @example To set model authorizer
|
17
|
-
# class Admin::ProductionsController < Admin::ApplicationController
|
18
|
-
# self.model_authorizer = ProductAuthorizer
|
19
|
-
# end
|
20
|
-
# @return [Class] model authorizer
|
21
|
-
# @raise [ArgumentError] when **model_authorizer** doesn't inherit from **application_authorizer**
|
22
|
-
# @see Wallaby::ModelAuthorizer
|
23
|
-
# @since wallaby-5.2.0
|
24
|
-
attr_reader :model_authorizer
|
25
|
-
|
26
|
-
# @!attribute [w] application_authorizer
|
27
|
-
def application_authorizer=(application_authorizer)
|
28
|
-
ModuleUtils.inheritance_check model_authorizer, application_authorizer
|
29
|
-
@application_authorizer = application_authorizer
|
30
|
-
end
|
31
|
-
|
32
|
-
# @!attribute [r] application_authorizer
|
33
|
-
# The **application_authorizer** is as the base class of {#model_authorizer}.
|
34
|
-
# @example To set application decorator:
|
35
|
-
# class Admin::ApplicationController < Wallaby::ResourcesController
|
36
|
-
# self.application_authorizer = AnotherApplicationAuthorizer
|
37
|
-
# end
|
38
|
-
# @return [Class] application decorator
|
39
|
-
# @raise [ArgumentError] when **model_authorizer** doesn't inherit from **application_authorizer**
|
40
|
-
# @see Wallaby::ModelAuthorizer
|
41
|
-
# @since wallaby-5.2.0
|
42
|
-
def application_authorizer
|
43
|
-
@application_authorizer ||= ModuleUtils.try_to superclass, :application_authorizer
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
6
|
# Model authorizer for current modal class.
|
48
|
-
#
|
49
|
-
#
|
50
|
-
#
|
51
|
-
# - controller configuration {Wallaby::Authorizable::ClassMethods#model_authorizer .model_authorizer}
|
52
|
-
# - a generic authorizer based on
|
53
|
-
# {Wallaby::Authorizable::ClassMethods#application_authorizer .application_authorizer}
|
54
|
-
# @return [Wallaby::ModelAuthorizer] model authorizer
|
7
|
+
# @return [ModelAuthorizer] model authorizer
|
8
|
+
# @see #authorizer_of
|
55
9
|
# @since wallaby-5.2.0
|
56
10
|
def current_authorizer
|
57
11
|
@current_authorizer ||=
|
58
|
-
authorizer_of(current_model_class
|
12
|
+
authorizer_of(current_model_class).tap do |authorizer|
|
59
13
|
Logger.debug %(Current authorizer: #{authorizer.try(:class)}), sourcing: false
|
60
14
|
end
|
61
15
|
end
|
@@ -70,7 +24,7 @@ module Wallaby
|
|
70
24
|
return false unless subject
|
71
25
|
|
72
26
|
klass = subject.is_a?(Class) ? subject : subject.class
|
73
|
-
authorizer_of(klass).authorized?
|
27
|
+
authorizer_of(klass).authorized?(action, subject)
|
74
28
|
end
|
75
29
|
|
76
30
|
# Check if user is allowed to perform action on given subject
|
@@ -80,18 +34,21 @@ module Wallaby
|
|
80
34
|
# @return [false] if allowed
|
81
35
|
# @since wallaby-5.2.0
|
82
36
|
def unauthorized?(action, subject)
|
83
|
-
!authorized?
|
37
|
+
!authorized?(action, subject)
|
84
38
|
end
|
85
39
|
|
86
40
|
protected
|
87
41
|
|
88
42
|
# @param model_class [Class]
|
89
|
-
# @
|
90
|
-
# @
|
43
|
+
# @return [ModelAuthorizer] model authorizer for given model
|
44
|
+
# @see AuthorizerFinder#execute
|
91
45
|
# @since wallaby-5.2.0
|
92
|
-
def authorizer_of(model_class
|
93
|
-
|
94
|
-
|
46
|
+
def authorizer_of(model_class)
|
47
|
+
AuthorizerFinder.new(
|
48
|
+
script_name: script_name,
|
49
|
+
model_class: model_class,
|
50
|
+
current_controller_class: wallaby_controller
|
51
|
+
).execute.create model_class, self
|
95
52
|
end
|
96
53
|
end
|
97
54
|
end
|
@@ -3,42 +3,7 @@
|
|
3
3
|
module Wallaby
|
4
4
|
# Abstract related class methods
|
5
5
|
module Baseable
|
6
|
-
|
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
|
6
|
+
extend ActiveSupport::Concern
|
42
7
|
|
43
8
|
# Configurable attributes:
|
44
9
|
# 1. mark a class as a base class
|
@@ -80,37 +45,39 @@ module Wallaby
|
|
80
45
|
# end
|
81
46
|
# end
|
82
47
|
# @return [Class] assigned model class or Wallaby will guess it
|
83
|
-
# (see {
|
48
|
+
# (see {Guesser.class_for})
|
84
49
|
# @return [nil] if current class is marked as base class
|
85
|
-
# @raise [
|
50
|
+
# @raise [ClassNotFound] if model class isn't found
|
86
51
|
# @raise [ArgumentError] if base class is empty
|
87
52
|
def model_class
|
88
53
|
return if base_class?
|
89
54
|
|
90
|
-
@model_class ||=
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
55
|
+
@model_class ||= Guesser.class_for(name) || raise(
|
56
|
+
ClassNotFound, <<~INSTRUCTION
|
57
|
+
The `model_class` hasn't been provided for Class `#{name}` and Wallaby cannot guess it right.
|
58
|
+
If `#{name}` is supposed to be a base class, add the following line to its class declaration:
|
59
|
+
|
60
|
+
class #{name}
|
61
|
+
base_class!
|
62
|
+
end
|
95
63
|
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
64
|
+
Otherwise, please specify the `model_class` in `#{name}`'s declaration as follows:
|
65
|
+
|
66
|
+
class #{name}
|
67
|
+
self.model_class = CorrectModelClass
|
68
|
+
end
|
69
|
+
INSTRUCTION
|
70
|
+
)
|
100
71
|
end
|
101
72
|
|
102
|
-
#
|
103
|
-
|
104
|
-
|
105
|
-
|
73
|
+
# @deprecated
|
74
|
+
def namespace=(_namespace)
|
75
|
+
Deprecator.alert method(__callee__), from: '0.3.0'
|
76
|
+
end
|
106
77
|
|
107
|
-
#
|
108
|
-
# @return [String] namespace
|
109
|
-
# @since wallaby-5.2.0
|
78
|
+
# @deprecated
|
110
79
|
def namespace
|
111
|
-
|
112
|
-
superclass.try(:namespace) \
|
113
|
-
|| name.deconstantize.gsub(/Wallaby(::)?/, EMPTY_STRING).presence
|
80
|
+
Deprecator.alert method(__callee__), from: '0.3.0'
|
114
81
|
end
|
115
82
|
end
|
116
83
|
end
|