wallaby-core 0.1.2 → 0.2.0
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 +19 -13
- data/app/controllers/wallaby/application_controller.rb +6 -6
- data/app/controllers/wallaby/resources_controller.rb +4 -3
- data/app/controllers/wallaby/secure_controller.rb +2 -2
- data/lib/concerns/wallaby/authorizable.rb +0 -6
- data/lib/concerns/wallaby/prefixable.rb +21 -0
- data/lib/concerns/wallaby/servicable.rb +0 -6
- data/lib/helpers/wallaby/application_helper.rb +0 -9
- data/lib/helpers/wallaby/form_helper.rb +0 -6
- data/lib/helpers/wallaby/index_helper.rb +0 -12
- data/lib/helpers/wallaby/resources_helper.rb +0 -7
- data/lib/parsers/wallaby/parser.rb +49 -14
- data/lib/services/wallaby/prefixes_builder.rb +15 -49
- data/lib/services/wallaby/type_renderer.rb +1 -1
- data/lib/utils/wallaby/preload_utils.rb +1 -1
- data/lib/utils/wallaby/utils.rb +0 -6
- data/lib/wallaby/configuration/mapping.rb +0 -6
- data/lib/wallaby/constants.rb +10 -8
- data/lib/wallaby/core/version.rb +1 -1
- data/lib/wallaby/core.rb +4 -11
- metadata +35 -16
- data/lib/concerns/wallaby/rails_overridden_methods.rb +0 -42
- data/lib/concerns/wallaby/themeable.rb +0 -40
- data/lib/errors/wallaby/cell_handling.rb +0 -6
- data/lib/paginators/wallaby/resource_paginator.rb +0 -12
- data/lib/renderers/wallaby/cell.rb +0 -137
- data/lib/renderers/wallaby/cell_resolver.rb +0 -89
- data/lib/renderers/wallaby/custom_lookup_context.rb +0 -64
- data/lib/renderers/wallaby/custom_partial_renderer.rb +0 -33
- data/lib/renderers/wallaby/custom_renderer.rb +0 -16
- data/lib/utils/wallaby/cell_utils.rb +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 52359ec55f58d6479a497e4d8bb412d2ff4e2a22781abb034721a580d6321a87
|
4
|
+
data.tar.gz: 14009b74724c111574addf3869e4f2bc5b96eae721a40a61c9885773bfb7eb05
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7e772e4457e4892ad725f6d0e65de0854f7cafeaa163c00fb3c4f3c9d88c44e25623bfe5b26fca01454e1bf2facf5d4f904c65a2bdf278ff3a22945679c0054b
|
7
|
+
data.tar.gz: a0a7fa9c558e05e8e62b4570265d4e2d1f063960550bf06148535be0cbb7aa571d416e932419cd0493b209e21c0ab249766de1299105eedbb62e5c3d416e902d
|
data/README.md
CHANGED
@@ -1,31 +1,37 @@
|
|
1
|
-
# Wallaby::Core
|
1
|
+
# [Wallaby::Core](https://github.com/wallaby-rails/wallaby-core)
|
2
2
|
|
3
|
-
|
3
|
+
[](https://badge.fury.io/rb/wallaby-core)
|
4
|
+
[](https://opensource.org/licenses/MIT)
|
5
|
+
[](https://travis-ci.com/wallaby-rails/wallaby-core)
|
6
|
+
[](https://codeclimate.com/github/wallaby-rails/wallaby-core/maintainability)
|
7
|
+
[](https://codeclimate.com/github/wallaby-rails/wallaby-core/test_coverage)
|
8
|
+
[](https://inch-ci.org/github/wallaby-rails/wallaby-core)
|
4
9
|
|
5
|
-
|
10
|
+
Wallaby::Core contains all the core interfaces that [Wallaby](https://github.com/wallaby-rails/wallaby) gem is built upon.
|
6
11
|
|
7
|
-
|
12
|
+
## Install
|
13
|
+
|
14
|
+
Add `Wallaby::Core` to `Gemfile`.
|
8
15
|
|
9
16
|
```ruby
|
10
17
|
gem 'wallaby-core'
|
11
18
|
```
|
12
19
|
|
13
|
-
And
|
20
|
+
And re-bundle.
|
14
21
|
|
15
22
|
```shell
|
16
|
-
|
23
|
+
bundle install
|
17
24
|
```
|
18
25
|
|
19
|
-
|
26
|
+
## Documentation
|
20
27
|
|
21
|
-
|
22
|
-
|
23
|
-
```
|
28
|
+
- [API Reference](https://www.rubydoc.info/gems/wallaby-core)
|
29
|
+
- [Change Logs](https://github.com/wallaby-rails/wallaby-core/blob/master/CHANGELOG.md)
|
24
30
|
|
25
|
-
##
|
31
|
+
## Want to contribute?
|
26
32
|
|
27
|
-
|
33
|
+
Raise an [issue](https://github.com/wallaby-rails/wallaby-core/issues/new), discuss and resolve!
|
28
34
|
|
29
35
|
## License
|
30
36
|
|
31
|
-
This project
|
37
|
+
This project uses [MIT License](https://github.com/wallaby-rails/wallaby-core/blob/master/LICENSE).
|
@@ -31,31 +31,31 @@ module Wallaby
|
|
31
31
|
# Not found page
|
32
32
|
# @param exception [Exception] comes from **rescue_from**
|
33
33
|
def not_found(exception = nil)
|
34
|
-
|
34
|
+
render_error exception, __callee__
|
35
35
|
end
|
36
36
|
|
37
37
|
# Bad request page
|
38
38
|
# @param exception [Exception] comes from **rescue_from**
|
39
39
|
def bad_request(exception = nil)
|
40
|
-
|
40
|
+
render_error exception, __callee__
|
41
41
|
end
|
42
42
|
|
43
43
|
# Unprocessable entity page
|
44
44
|
# @param exception [Exception] comes from **rescue_from**
|
45
45
|
def unprocessable_entity(exception = nil)
|
46
|
-
|
46
|
+
render_error exception, __callee__
|
47
47
|
end
|
48
48
|
|
49
49
|
# Internal server error page
|
50
50
|
# @param exception [Exception] comes from **rescue_from**
|
51
51
|
def internal_server_error(exception = nil)
|
52
|
-
|
52
|
+
render_error exception, __callee__
|
53
53
|
end
|
54
54
|
|
55
55
|
# Not implemented
|
56
56
|
# @param exception [Exception] comes from **rescue_from**
|
57
57
|
def not_implemented(exception = nil)
|
58
|
-
|
58
|
+
render_error exception, __callee__
|
59
59
|
end
|
60
60
|
|
61
61
|
# {https://api.rubyonrails.org/classes/ActionController/Helpers.html#method-i-helpers helpers}
|
@@ -72,7 +72,7 @@ module Wallaby
|
|
72
72
|
# Capture exceptions and display the error using error template.
|
73
73
|
# @param exception [Exception]
|
74
74
|
# @param symbol [Symbol] http status symbol
|
75
|
-
def
|
75
|
+
def render_error(exception, symbol)
|
76
76
|
Rails.logger.error exception
|
77
77
|
|
78
78
|
@exception = exception
|
@@ -11,15 +11,16 @@ module Wallaby
|
|
11
11
|
extend Paginatable::ClassMethods
|
12
12
|
extend Resourcable::ClassMethods
|
13
13
|
extend Servicable::ClassMethods
|
14
|
-
|
14
|
+
|
15
|
+
include View
|
16
|
+
prepend Prefixable
|
17
|
+
|
15
18
|
include Authorizable
|
16
19
|
include Decoratable
|
17
20
|
include Defaultable
|
18
21
|
include Paginatable
|
19
|
-
include RailsOverriddenMethods
|
20
22
|
include Resourcable
|
21
23
|
include Servicable
|
22
|
-
include Themeable
|
23
24
|
|
24
25
|
self.responder = ResourcesResponder
|
25
26
|
respond_to :html
|
@@ -12,13 +12,13 @@ module Wallaby
|
|
12
12
|
# Unauthorized page.
|
13
13
|
# @param exception [Exception] exception comes from `rescue_from`
|
14
14
|
def unauthorized(exception = nil)
|
15
|
-
|
15
|
+
render_error exception, __callee__
|
16
16
|
end
|
17
17
|
|
18
18
|
# Forbidden page.
|
19
19
|
# @param exception [Exception] exception comes from `rescue_from`
|
20
20
|
def forbidden(exception = nil)
|
21
|
-
|
21
|
+
render_error exception, __callee__
|
22
22
|
end
|
23
23
|
|
24
24
|
# @note This is a template method that can be overridden by subclasses
|
@@ -83,12 +83,6 @@ module Wallaby
|
|
83
83
|
!authorized? action, subject
|
84
84
|
end
|
85
85
|
|
86
|
-
# @deprecated Use {#current_authorizer} instead. It will be removed from 5.3.*
|
87
|
-
def authorizer
|
88
|
-
Utils.deprecate 'deprecation.authorizer', caller: caller
|
89
|
-
current_authorizer
|
90
|
-
end
|
91
|
-
|
92
86
|
protected
|
93
87
|
|
94
88
|
# @param model_class [Class]
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Wallaby
|
4
|
+
# Field helper for model decorator
|
5
|
+
module Prefixable
|
6
|
+
# @return [Array<String>] prefixes
|
7
|
+
def _prefixes
|
8
|
+
override_prefixes(
|
9
|
+
options: { mapping_actions: FORM_ACTIONS }
|
10
|
+
) do |prefixes|
|
11
|
+
PrefixesBuilder.new(
|
12
|
+
prefixes: prefixes,
|
13
|
+
resources_name: current_resources_name,
|
14
|
+
script_name: request.env[SCRIPT_NAME]
|
15
|
+
).execute
|
16
|
+
|
17
|
+
prefixes[0..prefixes.index(ResourcesController.controller_path)]
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -58,11 +58,5 @@ module Wallaby
|
|
58
58
|
klass.new current_model_class, current_authorizer, current_model_decorator
|
59
59
|
end
|
60
60
|
end
|
61
|
-
|
62
|
-
# @deprecated Use {#current_servicer} instead. It will be removed from 5.3.*
|
63
|
-
def current_model_service
|
64
|
-
Utils.deprecate 'deprecation.current_model_service', caller: caller
|
65
|
-
current_servicer
|
66
|
-
end
|
67
61
|
end
|
68
62
|
end
|
@@ -12,15 +12,6 @@ module Wallaby
|
|
12
12
|
# @see Wallaby::ModuleUtils.try_to
|
13
13
|
delegate :try_to, to: ModuleUtils
|
14
14
|
|
15
|
-
# Override the origin view_renderer to support {Wallaby::Cell} rendering
|
16
|
-
# @!attribute [r] view_renderer
|
17
|
-
# @see Wallaby::CustomRenderer
|
18
|
-
def view_renderer
|
19
|
-
return @view_renderer if @view_renderer.is_a? CustomRenderer
|
20
|
-
|
21
|
-
@view_renderer = CustomRenderer.new @view_renderer.lookup_context
|
22
|
-
end
|
23
|
-
|
24
15
|
# Override origin method to handle URL for Wallaby engine.
|
25
16
|
#
|
26
17
|
# As Wallaby's routes are declared in a
|
@@ -3,12 +3,6 @@
|
|
3
3
|
module Wallaby
|
4
4
|
# Form helper
|
5
5
|
module FormHelper
|
6
|
-
# @deprecated Use {Wallaby::ResourcesHelper#type_render} instead. It will be removed from 5.3.*
|
7
|
-
def form_type_partial_render(options = {}, locals = {}, &block)
|
8
|
-
Utils.deprecate 'deprecation.form_type_partial_render', caller: caller
|
9
|
-
type_render options, locals, &block
|
10
|
-
end
|
11
|
-
|
12
6
|
# To generate remote URL for auto select plugin.
|
13
7
|
# @see https://github.com/reinteractive/wallaby/blob/master/app/assets/javascripts/wallaby/auto_select.js
|
14
8
|
# auto_select.js
|
@@ -3,18 +3,6 @@
|
|
3
3
|
module Wallaby
|
4
4
|
# Helper methods for index action
|
5
5
|
module IndexHelper
|
6
|
-
# @deprecated This method is no longer in use. It will be removed from 5.3.*
|
7
|
-
def index_params(parameters = params)
|
8
|
-
Utils.deprecate 'deprecation.index_params', caller: caller
|
9
|
-
parameters
|
10
|
-
end
|
11
|
-
|
12
|
-
# @deprecated Use {Wallaby::Paginatable#current_paginator} instead. It will be removed from 5.3.*
|
13
|
-
def paginator_of(_model_class, _collection, _params)
|
14
|
-
Utils.deprecate 'deprecation.paginator_of', caller: caller
|
15
|
-
current_paginator
|
16
|
-
end
|
17
|
-
|
18
6
|
# Just a label
|
19
7
|
# @return [String]
|
20
8
|
def all_label
|
@@ -12,13 +12,6 @@ module Wallaby
|
|
12
12
|
include Paginatable
|
13
13
|
include Resourcable
|
14
14
|
include Servicable
|
15
|
-
include Themeable
|
16
|
-
|
17
|
-
# @deprecated Use {#type_render} instead. It will be removed from 5.3.*
|
18
|
-
def type_partial_render(options = {}, locals = {}, &block)
|
19
|
-
Utils.deprecate 'deprecation.type_partial_render', caller: caller
|
20
|
-
type_render options, locals, &block
|
21
|
-
end
|
22
15
|
|
23
16
|
# Render type cell/partial
|
24
17
|
# @param partial_name [String]
|
@@ -1,34 +1,69 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Wallaby
|
4
|
-
#
|
4
|
+
# A parser to parse colon query string and return a hash for transformer
|
5
|
+
# to consume
|
5
6
|
class Parser < Parslet::Parser
|
7
|
+
# @!method parse(str)
|
8
|
+
# Parse string into Abstract Syntax Tree for transformer to consume
|
9
|
+
# @param str [String]
|
10
|
+
# @return [Hash] Abstract Syntax Tree
|
11
|
+
|
12
|
+
# Case insensitive string match
|
13
|
+
# @param str [String]
|
14
|
+
def stri(str)
|
15
|
+
str.chars.map! { |c| match["#{c.upcase}#{c.downcase}"] }.reduce :>>
|
16
|
+
end
|
17
|
+
|
6
18
|
root(:statement)
|
7
|
-
rule(:statement) { expression >> (
|
8
|
-
rule(:expression) { colon_query |
|
19
|
+
rule(:statement) { expression >> (spaces >> expression).repeat }
|
20
|
+
rule(:expression) { colon_query | quoted_string | string | any.repeat(0).as(:null) }
|
9
21
|
rule(:colon_query) do
|
10
|
-
name.as(:left) >> operator.as(:op) >>
|
22
|
+
name.as(:left) >> operator.as(:op) >> values.as(:right)
|
23
|
+
end
|
24
|
+
|
25
|
+
# colon query
|
26
|
+
begin
|
27
|
+
# name starts with letter
|
28
|
+
rule(:name) { letter >> ((colon | spaces).absent? >> any).repeat }
|
29
|
+
|
30
|
+
# operator starts with colon
|
31
|
+
rule(:operator) do
|
32
|
+
colon >> (
|
33
|
+
(colon | spaces | quote | comma | digit | letter).absent? >> any
|
34
|
+
).repeat(0, 3)
|
35
|
+
end
|
36
|
+
|
37
|
+
# values separated by comma
|
38
|
+
rule(:values) { value >> (comma >> value).repeat }
|
39
|
+
rule(:value) { quoted_string | data }
|
40
|
+
rule(:data) do
|
41
|
+
null.as(:null) | boolean.as(:boolean) |
|
42
|
+
(spaces.absent? >> comma.absent? >> any).repeat.as(:string)
|
43
|
+
end
|
11
44
|
end
|
12
|
-
rule(:name) { (space.absent? >> colon.absent? >> any).repeat(1) }
|
13
|
-
rule(:operator) { colon >> match('[^\s\'\"\:\,0-9a-zA-Z]').repeat(0, 3) }
|
14
|
-
rule(:keywords) { general_keyword >> (comma >> general_keyword).repeat }
|
15
|
-
rule(:general_keyword) { quoted_keyword | keyword }
|
16
45
|
|
17
46
|
# basic elements
|
18
|
-
rule(:
|
47
|
+
rule(:quoted_string) do
|
19
48
|
open_quote >>
|
20
|
-
(close_quote.absent? >> any).repeat.as(:
|
49
|
+
(close_quote.absent? >> any).repeat.as(:string) >>
|
21
50
|
close_quote
|
22
51
|
end
|
23
|
-
rule(:
|
52
|
+
rule(:string) { (spaces.absent? >> any).repeat(1).as(:string) }
|
24
53
|
|
25
54
|
# atomic entities
|
55
|
+
rule(:null) { stri('nil') | stri('null') }
|
56
|
+
rule(:boolean) { stri('true') | stri('false') }
|
57
|
+
rule(:letter) { match['a-zA-Z'] }
|
58
|
+
rule(:digit) { match['0-9'] }
|
59
|
+
rule(:dot) { str('.') }
|
26
60
|
rule(:comma) { str(',') }
|
27
|
-
rule(:
|
61
|
+
rule(:spaces) { match['\s'].repeat(1) }
|
28
62
|
rule(:colon) { str(':') }
|
63
|
+
rule(:quote) { match['\'\"'] }
|
29
64
|
|
30
65
|
# open-close elements
|
31
|
-
rule(:open_quote) {
|
32
|
-
rule(:close_quote) { dynamic { |_src, ctx| str(ctx.captures[:
|
66
|
+
rule(:open_quote) { quote.capture(:quoting) }
|
67
|
+
rule(:close_quote) { dynamic { |_src, ctx| str(ctx.captures[:quoting]) } }
|
33
68
|
end
|
34
69
|
end
|
@@ -3,64 +3,30 @@
|
|
3
3
|
module Wallaby
|
4
4
|
# To extend prefixes to provide more possibility
|
5
5
|
class PrefixesBuilder
|
6
|
-
|
7
|
-
# @param action_name [String] action name
|
8
|
-
# @param resources_name [String] resources name
|
9
|
-
# @param script_name [String] script name
|
10
|
-
# @param theme_name [String] theme name
|
11
|
-
def self.build(origin_prefixes:, action_name:, resources_name:, script_name:, theme_name:)
|
12
|
-
new(
|
13
|
-
origin_prefixes: origin_prefixes,
|
14
|
-
action_name: action_name,
|
15
|
-
resources_name: resources_name,
|
16
|
-
script_name: script_name,
|
17
|
-
theme_name: theme_name
|
18
|
-
).send :build
|
19
|
-
end
|
6
|
+
include ActiveModel::Model
|
20
7
|
|
21
|
-
|
8
|
+
attr_accessor :prefixes
|
9
|
+
attr_accessor :resources_name
|
10
|
+
attr_accessor :script_name
|
22
11
|
|
23
|
-
|
24
|
-
|
25
|
-
@origin_prefixes = origin_prefixes
|
26
|
-
@action_name = action_name
|
27
|
-
@resources_name = resources_name
|
28
|
-
@script_name = script_name
|
29
|
-
@theme_name = theme_name
|
30
|
-
end
|
12
|
+
def execute
|
13
|
+
return if prefixes.include? resources_path
|
31
14
|
|
32
|
-
|
33
|
-
def build
|
34
|
-
prefixes = minimal_prefixes
|
35
|
-
prefixes.unshift mounted_prefix unless prefixes.include? resources_path
|
36
|
-
prefixes.uniq.compact.each_with_object([]) do |prefix, result|
|
37
|
-
result << "#{prefix}/#{suffix}" << prefix
|
38
|
-
end
|
39
|
-
end
|
15
|
+
full_prefix = [script_path, resources_path].compact.join(SLASH)
|
40
16
|
|
41
|
-
|
42
|
-
def minimal_prefixes
|
43
|
-
index = @origin_prefixes.index ResourcesController.controller_path
|
44
|
-
@origin_prefixes.slice(0..index).tap do |prefixes|
|
45
|
-
insert_index = prefixes.length > 1 ? -2 : 0
|
46
|
-
prefixes.insert insert_index, @theme_name if @theme_name.present?
|
47
|
-
end
|
48
|
-
end
|
17
|
+
return if prefixes.include? full_prefix
|
49
18
|
|
50
|
-
|
51
|
-
def mounted_prefix
|
52
|
-
prefix = (@script_name || '').sub(%r{^/}, '')
|
53
|
-
prefix << SLASH if prefix.present?
|
54
|
-
prefix << resources_path if resources_path
|
19
|
+
prefixes.insert 0, full_prefix
|
55
20
|
end
|
56
21
|
|
57
|
-
|
58
|
-
def suffix
|
59
|
-
@suffix ||= CellUtils.to_action_prefix @action_name
|
60
|
-
end
|
22
|
+
private
|
61
23
|
|
62
24
|
def resources_path
|
63
|
-
@resources_path ||=
|
25
|
+
@resources_path ||= resources_name.try :gsub, COLONS, SLASH
|
26
|
+
end
|
27
|
+
|
28
|
+
def script_path
|
29
|
+
@script_path ||= script_name.try :[], 1..-1
|
64
30
|
end
|
65
31
|
end
|
66
32
|
end
|
@@ -31,7 +31,7 @@ module Wallaby
|
|
31
31
|
# @param locals [Hash]
|
32
32
|
# @param action [String]
|
33
33
|
def complete(locals, action)
|
34
|
-
action_name =
|
34
|
+
action_name = FORM_ACTIONS[action] || action
|
35
35
|
locals[:metadata] = locals[:object].public_send :"#{action_name}_metadata_of", locals[:field_name]
|
36
36
|
locals[:value] = locals[:object].public_send locals[:field_name]
|
37
37
|
end
|
data/lib/utils/wallaby/utils.rb
CHANGED
@@ -11,12 +11,6 @@ module Wallaby
|
|
11
11
|
warn I18n.t(key, options.merge(from: caller[0]))
|
12
12
|
end
|
13
13
|
|
14
|
-
# @deprecated Use {Wallaby::FilterUtils.filter_name_by} instead. It will be removed from 5.3.*
|
15
|
-
def self.find_filter_name(filter_name, filters)
|
16
|
-
deprecate 'deprecation.find_filter_name', caller: caller
|
17
|
-
FilterUtils.filter_name_by filter_name, filters
|
18
|
-
end
|
19
|
-
|
20
14
|
# @see http://stackoverflow.com/a/8710663/1326499
|
21
15
|
# @param object [Object]
|
22
16
|
# @return [Object] a clone object
|
@@ -80,12 +80,6 @@ module Wallaby
|
|
80
80
|
@model_servicer ||= ModelServicer
|
81
81
|
end
|
82
82
|
|
83
|
-
# @deprecated Use {#model_paginator=} instead. It will be removed from 5.3.*
|
84
|
-
def resource_paginator=(resource_paginator)
|
85
|
-
Utils.deprecate 'deprecation.resource_paginator=', caller: caller
|
86
|
-
self.model_paginator = resource_paginator
|
87
|
-
end
|
88
|
-
|
89
83
|
# @!attribute [w] model_authorizer
|
90
84
|
attr_writer :model_authorizer
|
91
85
|
|
data/lib/wallaby/constants.rb
CHANGED
@@ -1,14 +1,16 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Wallaby
|
4
|
-
EMPTY_STRING = ''.html_safe
|
5
|
-
EMPTY_HASH = {}.freeze
|
6
|
-
EMPTY_ARRAY = [].freeze
|
7
|
-
SPACE = ' '
|
8
|
-
SLASH = '/'
|
9
|
-
COLONS = '::'
|
10
|
-
COMMA = ','
|
11
|
-
DOT = '.'
|
4
|
+
EMPTY_STRING = ''.html_safe.freeze # :nodoc:
|
5
|
+
EMPTY_HASH = {}.freeze # :nodoc:
|
6
|
+
EMPTY_ARRAY = [].freeze # :nodoc:
|
7
|
+
SPACE = ' ' # :nodoc:
|
8
|
+
SLASH = '/' # :nodoc:
|
9
|
+
COLONS = '::' # :nodoc:
|
10
|
+
COMMA = ',' # :nodoc:
|
11
|
+
DOT = '.' # :nodoc:
|
12
|
+
UNDERSCORE = '_' # :nodoc:
|
13
|
+
PCT = '%' # :nodoc:
|
12
14
|
|
13
15
|
# Default page size for {Wallaby::Configuration::Pagination#page_size}
|
14
16
|
DEFAULT_PAGE_SIZE = 20
|
data/lib/wallaby/core/version.rb
CHANGED
data/lib/wallaby/core.rb
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require 'active_model'
|
3
4
|
require 'parslet'
|
4
5
|
require 'responders'
|
6
|
+
require 'wallaby/view'
|
5
7
|
|
6
8
|
require 'wallaby/core/version'
|
7
9
|
require 'wallaby/constants'
|
@@ -23,7 +25,6 @@ require 'routes/wallaby/resources_router'
|
|
23
25
|
require 'tree/wallaby/node'
|
24
26
|
require 'parsers/wallaby/parser'
|
25
27
|
|
26
|
-
require 'utils/wallaby/cell_utils'
|
27
28
|
require 'utils/wallaby/field_utils'
|
28
29
|
require 'utils/wallaby/filter_utils'
|
29
30
|
require 'utils/wallaby/model_utils'
|
@@ -40,11 +41,11 @@ require 'concerns/wallaby/defaultable'
|
|
40
41
|
require 'concerns/wallaby/engineable'
|
41
42
|
require 'concerns/wallaby/fieldable'
|
42
43
|
require 'concerns/wallaby/paginatable'
|
43
|
-
require 'concerns/wallaby/
|
44
|
+
require 'concerns/wallaby/prefixable'
|
44
45
|
require 'concerns/wallaby/resourcable'
|
45
46
|
require 'concerns/wallaby/servicable'
|
46
47
|
require 'concerns/wallaby/shared_helpers'
|
47
|
-
require 'concerns/wallaby/themeable'
|
48
|
+
# require 'concerns/wallaby/themeable'
|
48
49
|
|
49
50
|
require 'interfaces/wallaby/mode'
|
50
51
|
require 'interfaces/wallaby/model_decorator'
|
@@ -59,7 +60,6 @@ require 'errors/wallaby/not_implemented'
|
|
59
60
|
require 'errors/wallaby/not_found'
|
60
61
|
require 'errors/wallaby/model_not_found'
|
61
62
|
require 'errors/wallaby/resource_not_found'
|
62
|
-
require 'errors/wallaby/cell_handling'
|
63
63
|
|
64
64
|
require 'errors/wallaby/forbidden'
|
65
65
|
require 'errors/wallaby/not_authenticated'
|
@@ -68,7 +68,6 @@ require 'errors/wallaby/unprocessable_entity'
|
|
68
68
|
require 'decorators/wallaby/resource_decorator'
|
69
69
|
require 'servicers/wallaby/model_servicer'
|
70
70
|
require 'paginators/wallaby/model_paginator'
|
71
|
-
require 'paginators/wallaby/resource_paginator'
|
72
71
|
require 'authorizers/wallaby/model_authorizer'
|
73
72
|
require 'authorizers/wallaby/default_authorization_provider'
|
74
73
|
require 'authorizers/wallaby/cancancan_authorization_provider'
|
@@ -103,12 +102,6 @@ require 'helpers/wallaby/application_helper'
|
|
103
102
|
require 'responders/wallaby/resources_responder'
|
104
103
|
require 'responders/wallaby/json_api_responder'
|
105
104
|
|
106
|
-
require 'renderers/wallaby/cell'
|
107
|
-
require 'renderers/wallaby/cell_resolver'
|
108
|
-
require 'renderers/wallaby/custom_lookup_context'
|
109
|
-
require 'renderers/wallaby/custom_renderer'
|
110
|
-
require 'renderers/wallaby/custom_partial_renderer'
|
111
|
-
|
112
105
|
require 'adaptors/wallaby/custom'
|
113
106
|
require 'adaptors/wallaby/custom/default_provider'
|
114
107
|
require 'adaptors/wallaby/custom/model_finder'
|
metadata
CHANGED
@@ -1,31 +1,31 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wallaby-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tian Chen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-02-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: activemodel
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 4.2.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 4.2.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: railties
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 4.2.0
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: parslet
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: responders
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,20 @@ dependencies:
|
|
52
66
|
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: wallaby-view
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - "~>"
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 0.1.2
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - "~>"
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 0.1.2
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: rspec-rails
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -113,13 +141,11 @@ files:
|
|
113
141
|
- lib/concerns/wallaby/engineable.rb
|
114
142
|
- lib/concerns/wallaby/fieldable.rb
|
115
143
|
- lib/concerns/wallaby/paginatable.rb
|
116
|
-
- lib/concerns/wallaby/
|
144
|
+
- lib/concerns/wallaby/prefixable.rb
|
117
145
|
- lib/concerns/wallaby/resourcable.rb
|
118
146
|
- lib/concerns/wallaby/servicable.rb
|
119
147
|
- lib/concerns/wallaby/shared_helpers.rb
|
120
|
-
- lib/concerns/wallaby/themeable.rb
|
121
148
|
- lib/decorators/wallaby/resource_decorator.rb
|
122
|
-
- lib/errors/wallaby/cell_handling.rb
|
123
149
|
- lib/errors/wallaby/forbidden.rb
|
124
150
|
- lib/errors/wallaby/general_error.rb
|
125
151
|
- lib/errors/wallaby/invalid_error.rb
|
@@ -146,13 +172,7 @@ files:
|
|
146
172
|
- lib/interfaces/wallaby/model_pagination_provider.rb
|
147
173
|
- lib/interfaces/wallaby/model_service_provider.rb
|
148
174
|
- lib/paginators/wallaby/model_paginator.rb
|
149
|
-
- lib/paginators/wallaby/resource_paginator.rb
|
150
175
|
- lib/parsers/wallaby/parser.rb
|
151
|
-
- lib/renderers/wallaby/cell.rb
|
152
|
-
- lib/renderers/wallaby/cell_resolver.rb
|
153
|
-
- lib/renderers/wallaby/custom_lookup_context.rb
|
154
|
-
- lib/renderers/wallaby/custom_partial_renderer.rb
|
155
|
-
- lib/renderers/wallaby/custom_renderer.rb
|
156
176
|
- lib/responders/wallaby/json_api_responder.rb
|
157
177
|
- lib/responders/wallaby/resources_responder.rb
|
158
178
|
- lib/routes/wallaby/resources_router.rb
|
@@ -171,7 +191,6 @@ files:
|
|
171
191
|
- lib/services/wallaby/type_renderer.rb
|
172
192
|
- lib/support/action_dispatch/routing/mapper.rb
|
173
193
|
- lib/tree/wallaby/node.rb
|
174
|
-
- lib/utils/wallaby/cell_utils.rb
|
175
194
|
- lib/utils/wallaby/field_utils.rb
|
176
195
|
- lib/utils/wallaby/filter_utils.rb
|
177
196
|
- lib/utils/wallaby/model_utils.rb
|
@@ -1,42 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Wallaby
|
4
|
-
# This is a collection of the helper methods that overrides the rails methods
|
5
|
-
module RailsOverriddenMethods
|
6
|
-
protected
|
7
|
-
|
8
|
-
# Override {https://github.com/rails/rails/blob/master/actionview/lib/action_view/view_paths.rb
|
9
|
-
# ActionView::ViewPaths::ClassMethods#_prefixes} to extend the prefixes for **ActionView::ViewPaths** to look up
|
10
|
-
# in below precedence from high to low:
|
11
|
-
#
|
12
|
-
# - :mounted_path/:resources_name/:action_prefix (e.g. `admin/products/index`)
|
13
|
-
# - :mounted_path/:resources_name (e.g. `admin/products`)
|
14
|
-
# - :controller_path/:action_prefix
|
15
|
-
# - :controller_path
|
16
|
-
# - :parent_controller_path/:action_prefix
|
17
|
-
# - :parent_controller_path
|
18
|
-
# - :more_parent_controller_path/:action_prefix
|
19
|
-
# - :more_parent_controller_path
|
20
|
-
# - :theme_name/:action_prefix
|
21
|
-
# - :theme_name
|
22
|
-
# - wallaby/resources/:action_prefix
|
23
|
-
# - wallaby/resources
|
24
|
-
# @return [Array<String>]
|
25
|
-
def _prefixes
|
26
|
-
@_prefixes ||= PrefixesBuilder.build(
|
27
|
-
origin_prefixes: super,
|
28
|
-
theme_name: current_theme_name,
|
29
|
-
resources_name: current_resources_name,
|
30
|
-
script_name: request.env[SCRIPT_NAME],
|
31
|
-
action_name: params[:action]
|
32
|
-
)
|
33
|
-
end
|
34
|
-
|
35
|
-
# Override to provide support for cell lookup
|
36
|
-
# @return [Wallaby::CustomLookupContext]
|
37
|
-
def lookup_context
|
38
|
-
@_lookup_context ||= # rubocop:disable Naming/MemoizedInstanceVariableName
|
39
|
-
CustomLookupContext.normalize(super, prefixes: _prefixes)
|
40
|
-
end
|
41
|
-
end
|
42
|
-
end
|
@@ -1,40 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Wallaby
|
4
|
-
# Theme related methods
|
5
|
-
module Themeable
|
6
|
-
# Configurable attributes
|
7
|
-
module ClassMethods
|
8
|
-
# @!attribute [w] theme_name
|
9
|
-
def theme_name=(theme_name)
|
10
|
-
layout theme_name
|
11
|
-
@theme_name = theme_name
|
12
|
-
end
|
13
|
-
|
14
|
-
# @!attribute [r] theme_name
|
15
|
-
# The theme name is used to apply a set of frontend (html/css/javascript) implementation.
|
16
|
-
#
|
17
|
-
# When theme name is set to e.g. `custom_theme`, the following changes will be made:
|
18
|
-
#
|
19
|
-
# - layout will be set to the same name `custom_theme`
|
20
|
-
# - it will be added to the partial lookup prefixes right on top of `wallaby/resources` prefix.
|
21
|
-
#
|
22
|
-
# Once theme name is set, all its controller subclasses will inherit the same theme name
|
23
|
-
# @example To set an theme name:
|
24
|
-
# class Admin::ApplicationController < Wallaby::ResourcesController
|
25
|
-
# self.theme_name = 'admin_theme'
|
26
|
-
# end
|
27
|
-
# @return [String, Symbol, nil] theme name
|
28
|
-
# @since 5.2.0
|
29
|
-
def theme_name
|
30
|
-
@theme_name ||= ModuleUtils.try_to superclass, :theme_name
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
# @return [String, Symbol, nil] theme name
|
35
|
-
# @since 5.2.0
|
36
|
-
def current_theme_name
|
37
|
-
controller_to_get __callee__, :theme_name
|
38
|
-
end
|
39
|
-
end
|
40
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Wallaby
|
4
|
-
# Resource paginator
|
5
|
-
class ResourcePaginator < ModelPaginator
|
6
|
-
base_class!
|
7
|
-
|
8
|
-
def self.inherited(_sub_class)
|
9
|
-
Utils.deprecate 'deprecation.resource_paginator_inheirtance', caller: caller
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,137 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Wallaby
|
4
|
-
# In order to improve the rendering performance, cell is designed as simple partial component.
|
5
|
-
# @since 5.2.0
|
6
|
-
class Cell
|
7
|
-
# @!attribute [r] context
|
8
|
-
# @return [Object] view context
|
9
|
-
attr_reader :context
|
10
|
-
|
11
|
-
# @!attribute [r] local_assigns
|
12
|
-
# @return [Hash] a list of local_assigns containing {#object}, {#field_name}, {#value}, {#metadata} and {#form}
|
13
|
-
attr_reader :local_assigns
|
14
|
-
|
15
|
-
# @!attribute [r] buffer
|
16
|
-
# @return [String] output string buffer
|
17
|
-
attr_reader :buffer
|
18
|
-
|
19
|
-
delegate(*ERB::Util.singleton_methods, to: ERB::Util)
|
20
|
-
|
21
|
-
# @param context [ActionView::Context] view context
|
22
|
-
# @param local_assigns [Hash] local variables
|
23
|
-
def initialize(context, local_assigns)
|
24
|
-
@context = context
|
25
|
-
@local_assigns = local_assigns
|
26
|
-
end
|
27
|
-
|
28
|
-
# @!attribute [r] object
|
29
|
-
# @return [Object] object
|
30
|
-
def object
|
31
|
-
local_assigns[:object]
|
32
|
-
end
|
33
|
-
|
34
|
-
# @!attribute [w] object
|
35
|
-
def object=(object)
|
36
|
-
local_assigns[:object] = object
|
37
|
-
end
|
38
|
-
|
39
|
-
# @!attribute [r] field_name
|
40
|
-
# @return [String] field name
|
41
|
-
def field_name
|
42
|
-
local_assigns[:field_name]
|
43
|
-
end
|
44
|
-
|
45
|
-
# @!attribute [w] field_name
|
46
|
-
def field_name=(field_name)
|
47
|
-
local_assigns[:field_name] = field_name
|
48
|
-
end
|
49
|
-
|
50
|
-
# @!attribute [r] value
|
51
|
-
# @return [String] value
|
52
|
-
def value
|
53
|
-
local_assigns[:value]
|
54
|
-
end
|
55
|
-
|
56
|
-
# @!attribute [w] value
|
57
|
-
def value=(value)
|
58
|
-
local_assigns[:value] = value
|
59
|
-
end
|
60
|
-
|
61
|
-
# @!attribute [r] metadata
|
62
|
-
# @return [String] metadata
|
63
|
-
def metadata
|
64
|
-
local_assigns[:metadata]
|
65
|
-
end
|
66
|
-
|
67
|
-
# @!attribute [w] metadata
|
68
|
-
def metadata=(metadata)
|
69
|
-
local_assigns[:metadata] = metadata
|
70
|
-
end
|
71
|
-
|
72
|
-
# @!attribute [r] form
|
73
|
-
# @return [ActionView::Helpers::FormBuilder] form object
|
74
|
-
def form
|
75
|
-
local_assigns[:form]
|
76
|
-
end
|
77
|
-
|
78
|
-
# @!attribute [w] form
|
79
|
-
def form=(form)
|
80
|
-
local_assigns[:form] = form
|
81
|
-
end
|
82
|
-
|
83
|
-
# @note this is a template method that can be overridden by subclasses
|
84
|
-
# Produce output for this cell component.
|
85
|
-
#
|
86
|
-
# Please note that the output doesn't include the buffer produced by {#concat}.
|
87
|
-
# Therefore, use {#render_complete} method instead when the cell is rendered.
|
88
|
-
def render; end
|
89
|
-
|
90
|
-
# This method produces the complete rendered string including the buffer produced by {#concat}.
|
91
|
-
# @return [String] output of the cell
|
92
|
-
def render_complete(&block)
|
93
|
-
@buffer = EMPTY_STRING.dup # reset buffer before rendering
|
94
|
-
last_part = render(&block)
|
95
|
-
@buffer << last_part.to_s
|
96
|
-
end
|
97
|
-
|
98
|
-
# Append string to output buffer
|
99
|
-
# @param string [String] string to concat
|
100
|
-
def concat(string)
|
101
|
-
(@buffer ||= EMPTY_STRING.dup) << string
|
102
|
-
end
|
103
|
-
|
104
|
-
# @overload at(name)
|
105
|
-
# Get view instance variable value
|
106
|
-
# @example To get view instance variable value
|
107
|
-
# at('name') # => get value of `@name` from the view
|
108
|
-
# @param name [String, Symbol] view instance variable name without `@`
|
109
|
-
# @overload at(name, value)
|
110
|
-
# Set view instance variable value
|
111
|
-
# @example To set view instance variable value
|
112
|
-
# at('name', value) # => set value of `@name` in the view
|
113
|
-
# @param name [String, Symbol] view instance variable name without `@`
|
114
|
-
# @param value [object] value
|
115
|
-
# @return [object] view instance variable value
|
116
|
-
def at(*args)
|
117
|
-
raise ArgumentError unless args.length.in? [1, 2]
|
118
|
-
return context.instance_variable_get :"@#{args.first}" if args.length == 1
|
119
|
-
|
120
|
-
context.instance_variable_set :"@#{args.first}", args.last
|
121
|
-
end
|
122
|
-
|
123
|
-
private
|
124
|
-
|
125
|
-
# Delegate missing method to {#context}
|
126
|
-
def method_missing(method_id, *args, &block)
|
127
|
-
return super unless context.respond_to? method_id
|
128
|
-
|
129
|
-
context.public_send method_id, *args, &block
|
130
|
-
end
|
131
|
-
|
132
|
-
# Delegate missing method check to {#context}
|
133
|
-
def respond_to_missing?(method_id, _include_private)
|
134
|
-
context.respond_to?(method_id) || super
|
135
|
-
end
|
136
|
-
end
|
137
|
-
end
|
@@ -1,89 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Wallaby
|
4
|
-
# Resolver to provide support for cell and partial
|
5
|
-
# @since 5.2.0
|
6
|
-
class CellResolver < ActionView::OptimizedFileSystemResolver
|
7
|
-
# for Rails 5.2 and below
|
8
|
-
begin
|
9
|
-
# @note this method is only applicable to Rails 5.2 and below
|
10
|
-
# A cell query looks like:
|
11
|
-
#
|
12
|
-
# ```
|
13
|
-
# app/views/wallaby/resources/index/integer{_en,}{_html,}.rb
|
14
|
-
# ```
|
15
|
-
#
|
16
|
-
# Wallaby adds it to the front of the whole query as below:
|
17
|
-
#
|
18
|
-
# ```
|
19
|
-
# {app/views/wallaby/resources/index/integer{_en,}{_html,}.rb,
|
20
|
-
# app/views/wallaby/resources/index/_integer{.en,}{.html,}{.erb,}}
|
21
|
-
# ```
|
22
|
-
# @param path [String]
|
23
|
-
# @param details [Hash]
|
24
|
-
# see {https://api.rubyonrails.org/classes/ActionView/LookupContext/ViewPaths.html#method-i-detail_args_for
|
25
|
-
# Detials from ViewPaths}
|
26
|
-
# @return [String] a path query
|
27
|
-
def build_query(path, details)
|
28
|
-
# NOTE: super is impacted by {#escape_entry}
|
29
|
-
origin = super
|
30
|
-
file_name = origin[%r{(?<=/\{,_\})[^/\{]+}]
|
31
|
-
return origin unless file_name
|
32
|
-
|
33
|
-
base_dir = origin.gsub(%r{/[^/]*$}, '')
|
34
|
-
locales = convert details[:locale]
|
35
|
-
formats = convert details[:formats]
|
36
|
-
cell = "#{base_dir}/#{file_name}{#{locales}}{#{formats}}.rb"
|
37
|
-
"{#{cell},#{origin}}"
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
# for Rails 6 and above
|
42
|
-
begin
|
43
|
-
# @note this method is only applicable to Rails 6 and above
|
44
|
-
# This is to extend the origin functionality to enable to return cell file.
|
45
|
-
# at highest precedence.
|
46
|
-
# @param path [String]
|
47
|
-
# @param details [Hash]
|
48
|
-
# @return [ActionView::Template] found template
|
49
|
-
def find_template_paths_from_details(path, details)
|
50
|
-
details[:handlers].unshift(:rb) if details[:handlers].try(:first) != :rb
|
51
|
-
super
|
52
|
-
end
|
53
|
-
|
54
|
-
# @note this method is only applicable to Rails 6 and above
|
55
|
-
# This is to extend the origin functionality to enable to query cell files.
|
56
|
-
# @param path [String]
|
57
|
-
# @param details [Hash]
|
58
|
-
# @return [Regexp]
|
59
|
-
def build_regex(path, details)
|
60
|
-
origin = super.source
|
61
|
-
Regexp.new(
|
62
|
-
origin
|
63
|
-
.gsub(%r{/\{,_\}([^/]+)\z}, '/_?\\1')
|
64
|
-
.gsub('\\.', '[_\\.]')
|
65
|
-
.gsub('raw|', 'rb|raw|')
|
66
|
-
)
|
67
|
-
end
|
68
|
-
end
|
69
|
-
|
70
|
-
# This is to extend the origin funcationality to enable the query
|
71
|
-
# to look for cell files
|
72
|
-
# @example extend the query
|
73
|
-
# escape_entry('integer') # => '/{,_}integer'
|
74
|
-
# @param entry [String]
|
75
|
-
# @return [String] an escaped and extended query
|
76
|
-
def escape_entry(entry)
|
77
|
-
super.gsub(%r{/_([^/]+)\z}, '/{,_}\1')
|
78
|
-
end
|
79
|
-
|
80
|
-
private
|
81
|
-
|
82
|
-
# @example concat a list of values into a string
|
83
|
-
# convert(['html', 'csv']) # => '_html,_cvs,'
|
84
|
-
# @param values [Array<String>]
|
85
|
-
def convert(values)
|
86
|
-
(values.map { |v| "_#{v}" } << '').join ','
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
@@ -1,64 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Wallaby
|
4
|
-
# A custom lookup context that uses {Wallaby::CellResolver} to find cell/partial
|
5
|
-
class CustomLookupContext < ::ActionView::LookupContext
|
6
|
-
def self.normalize(lookup, details: nil, prefixes: nil)
|
7
|
-
return lookup if lookup.is_a? self
|
8
|
-
|
9
|
-
CustomLookupContext.new(
|
10
|
-
lookup.view_paths,
|
11
|
-
details || lookup.instance_variable_get('@details'),
|
12
|
-
prefixes || lookup.prefixes
|
13
|
-
)
|
14
|
-
end
|
15
|
-
|
16
|
-
# @note for Rails 6 and above
|
17
|
-
# It overrides the origin method to convert paths to {Wallaby::CellResolver}
|
18
|
-
# @param paths [Array]
|
19
|
-
# @return [ActionView::PathSet]
|
20
|
-
def build_view_paths(paths)
|
21
|
-
ActionView::PathSet.new Array(paths).map(&method(:convert))
|
22
|
-
end
|
23
|
-
|
24
|
-
# @note for Rails 5.2 and below
|
25
|
-
# It overrides the origin method to convert paths to {Wallaby::CellResolver}
|
26
|
-
# @param paths [Array]
|
27
|
-
# @return [ActionView::PathSet]
|
28
|
-
def view_paths=(paths)
|
29
|
-
@view_paths = build_view_paths paths
|
30
|
-
end
|
31
|
-
|
32
|
-
# It overrides the oirgin method to call the origin `find_template` and cache the result during a request.
|
33
|
-
# @param name [String]
|
34
|
-
# @param prefixes [Array<String>]
|
35
|
-
# @param partial [Boolean]
|
36
|
-
# @param keys [Array<String>] keys of local variables
|
37
|
-
# @param options [Hash]
|
38
|
-
def find_template(name, prefixes = [], partial = false, keys = [], options = {})
|
39
|
-
prefixes = [] if partial && name.include?(SLASH) # reset the prefixes if `/` is detected
|
40
|
-
key = [name, prefixes, partial, keys, options].map(&:inspect).join(SLASH)
|
41
|
-
cached_lookup[key] ||= super
|
42
|
-
end
|
43
|
-
|
44
|
-
protected
|
45
|
-
|
46
|
-
# @!attribute [r] cached_lookup
|
47
|
-
# Cached lookup result
|
48
|
-
def cached_lookup
|
49
|
-
@cached_lookup ||= {}
|
50
|
-
end
|
51
|
-
|
52
|
-
# Convert path to {Wallaby::CellResolver}
|
53
|
-
# @param path [Object]
|
54
|
-
# @return [Wallaby::CellResolver]
|
55
|
-
def convert(path)
|
56
|
-
case path
|
57
|
-
when ActionView::OptimizedFileSystemResolver, Pathname, String
|
58
|
-
CellResolver.new path.to_s
|
59
|
-
else
|
60
|
-
path
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
64
|
-
end
|
@@ -1,33 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Wallaby
|
4
|
-
# Custom partial renderer to provide support for cell rendering
|
5
|
-
class CustomPartialRenderer < ::ActionView::PartialRenderer
|
6
|
-
# When a type partial is found, it works as usual.
|
7
|
-
#
|
8
|
-
# But when a cell is found, there is an exception {Wallaby::CellHandling} raised. This error will be captured,
|
9
|
-
# and the cell will be rendered.
|
10
|
-
# @param context [ActionView::Context]
|
11
|
-
# @param options [Hash]
|
12
|
-
# @param block [Proc]
|
13
|
-
# @return [String] HTML output
|
14
|
-
def render(context, options, block)
|
15
|
-
super.try do |rendered|
|
16
|
-
ModuleUtils.try_to(rendered, :body) || # Rails 6 and above
|
17
|
-
rendered # Rails 5.2 and below
|
18
|
-
end
|
19
|
-
rescue CellHandling => e
|
20
|
-
CellUtils.render context, e.message, options[:locals], &block
|
21
|
-
end
|
22
|
-
|
23
|
-
# Override origin method to stop rendering when a cell is found.
|
24
|
-
# @return [ActionView::Template] partial template
|
25
|
-
# @raise [Wallaby:::CellHandling] when a cell is found
|
26
|
-
def find_partial(*)
|
27
|
-
super.tap do |partial|
|
28
|
-
cell = CellUtils.find_cell(partial.identifier, partial.inspect)
|
29
|
-
raise CellHandling, cell if cell
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Wallaby
|
4
|
-
# Custom view renderer to provide support for cell rendering
|
5
|
-
class CustomRenderer < ::ActionView::Renderer
|
6
|
-
def initialize(lookup_context)
|
7
|
-
super CustomLookupContext.normalize(lookup_context)
|
8
|
-
end
|
9
|
-
|
10
|
-
# @return [String] HTML output
|
11
|
-
# @see Wallaby::CustomPartialRenderer
|
12
|
-
def render_partial(context, options, &block) #:nodoc:
|
13
|
-
CustomPartialRenderer.new(lookup_context).render(context, options, block)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Wallaby
|
4
|
-
# Cell utils
|
5
|
-
module CellUtils
|
6
|
-
class << self
|
7
|
-
# Render a cell and produce output
|
8
|
-
# @param context [ActionView::Context]
|
9
|
-
# @param file_name [String]
|
10
|
-
# @param locals [Hash]
|
11
|
-
# @return [String] output
|
12
|
-
def render(context, file_name, locals = {}, &block)
|
13
|
-
snake_class = file_name[%r{(?<=app/views/).+(?=\.rb)}]
|
14
|
-
cell_class = snake_class.camelize.constantize
|
15
|
-
Rails.logger.info " Rendered [cell] #{file_name}"
|
16
|
-
cell_class.new(context, locals).render_complete(&block)
|
17
|
-
end
|
18
|
-
|
19
|
-
# Check if a partial is a cell or not
|
20
|
-
# @param partial_path [String]
|
21
|
-
# @return [true] if partial is a `rb` file
|
22
|
-
# @return [false] otherwise
|
23
|
-
def find_cell(*partials)
|
24
|
-
partials.find { |partial| partial.end_with? '.rb' }
|
25
|
-
end
|
26
|
-
|
27
|
-
# @param action_name [String, Symbol]
|
28
|
-
# @return [String, Symbol] action prefix
|
29
|
-
def to_action_prefix(action_name)
|
30
|
-
FORM_ACTIONS[action_name] || action_name
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|