wallaby 5.1.5 → 5.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Rakefile +1 -1
- data/app/controllers/wallaby/abstract_resources_controller.rb +171 -187
- data/app/controllers/wallaby/application_controller.rb +15 -4
- data/app/controllers/wallaby/base_controller.rb +1 -3
- data/app/controllers/wallaby/secure_controller.rb +10 -6
- data/app/security/ability.rb +1 -0
- data/app/views/wallaby/resources/form/_float.html.erb +1 -1
- data/config/locales/wallaby.en.yml +5 -0
- data/lib/adaptors/wallaby/active_record.rb +1 -1
- data/lib/adaptors/wallaby/active_record/model_decorator.rb +17 -19
- data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder.rb +7 -0
- data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/association_builder.rb +11 -0
- data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/polymorphic_builder.rb +10 -1
- data/lib/adaptors/wallaby/active_record/model_decorator/fields_builder/sti_builder.rb +14 -7
- data/lib/adaptors/wallaby/active_record/model_decorator/title_field_finder.rb +4 -0
- data/lib/adaptors/wallaby/active_record/model_finder.rb +4 -3
- data/lib/adaptors/wallaby/active_record/model_pagination_provider.rb +3 -6
- data/lib/adaptors/wallaby/active_record/model_service_provider.rb +12 -3
- data/lib/adaptors/wallaby/active_record/model_service_provider/normalizer.rb +16 -1
- data/lib/adaptors/wallaby/active_record/model_service_provider/permitter.rb +14 -2
- data/lib/adaptors/wallaby/active_record/model_service_provider/querier.rb +46 -1
- data/lib/adaptors/wallaby/active_record/model_service_provider/querier/transformer.rb +11 -5
- data/lib/adaptors/wallaby/active_record/model_service_provider/validator.rb +6 -0
- data/lib/concerns/wallaby/resources_helper_methods.rb +44 -0
- data/lib/decorators/wallaby/abstract_resource_decorator.rb +9 -4
- data/lib/errors/wallaby/model_not_found.rb +1 -0
- data/lib/errors/wallaby/resource_not_found.rb +1 -0
- data/lib/forms/wallaby/form_builder.rb +5 -3
- data/lib/helpers/wallaby/application_helper.rb +10 -1
- data/lib/helpers/wallaby/base_helper.rb +12 -4
- data/lib/helpers/wallaby/form_helper.rb +7 -4
- data/lib/helpers/wallaby/links_helper.rb +10 -7
- data/lib/helpers/wallaby/resources_helper.rb +2 -0
- data/lib/helpers/wallaby/secure_helper.rb +13 -7
- data/lib/helpers/wallaby/styling_helper.rb +1 -1
- data/lib/interfaces/wallaby/mode.rb +38 -16
- data/lib/interfaces/wallaby/model_decorator.rb +36 -27
- data/lib/interfaces/wallaby/model_decorator/field_helpers.rb +12 -2
- data/lib/interfaces/wallaby/model_finder.rb +1 -0
- data/lib/interfaces/wallaby/model_pagination_provider.rb +6 -5
- data/lib/interfaces/wallaby/model_service_provider.rb +10 -2
- data/lib/paginators/wallaby/abstract_resource_paginator.rb +6 -1
- data/lib/parsers/wallaby/parser.rb +1 -0
- data/lib/responders/wallaby/abstract_responder.rb +15 -2
- data/lib/routes/wallaby/resources_router.rb +4 -0
- data/lib/servicers/wallaby/abstract_model_servicer.rb +25 -1
- data/lib/servicers/wallaby/model_servicer.rb +1 -0
- data/lib/services/wallaby/link_options_normalizer.rb +13 -9
- data/lib/services/wallaby/lookup_context_wrapper.rb +11 -2
- data/lib/services/wallaby/map.rb +107 -69
- data/lib/services/wallaby/map/mode_mapper.rb +2 -0
- data/lib/services/wallaby/map/model_class_collector.rb +7 -0
- data/lib/services/wallaby/map/model_class_mapper.rb +15 -7
- data/lib/services/wallaby/partial_renderer.rb +7 -0
- data/lib/services/wallaby/prefixes_builder.rb +18 -0
- data/lib/services/wallaby/sorting/hash_builder.rb +7 -1
- data/lib/services/wallaby/sorting/link_builder.rb +6 -1
- data/lib/services/wallaby/sorting/next_builder.rb +23 -2
- data/lib/tree/wallaby/node.rb +2 -0
- data/lib/utils/wallaby/test_utils.rb +32 -0
- data/lib/utils/wallaby/utils.rb +51 -5
- data/lib/wallaby.rb +1 -0
- data/lib/wallaby/configuration.rb +9 -3
- data/lib/wallaby/configuration/features.rb +2 -1
- data/lib/wallaby/configuration/mapping.rb +66 -0
- data/lib/wallaby/configuration/metadata.rb +1 -0
- data/lib/wallaby/configuration/pagination.rb +2 -1
- data/lib/wallaby/engine.rb +4 -0
- data/lib/wallaby/version.rb +1 -1
- metadata +5 -3
- 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]
|
@@ -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
|
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
|
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
|
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
|
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
|
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
|
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
|
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,10 +1,11 @@
|
|
1
1
|
module Wallaby
|
2
|
-
#
|
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
|
-
#
|
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,16 +1,20 @@
|
|
1
1
|
module Wallaby
|
2
|
+
# @private
|
2
3
|
# Link renderer
|
3
4
|
class LinkOptionsNormalizer
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
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
|
-
#
|
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
|