wallaby-view 0.1.4 → 0.1.5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +20 -14
- data/lib/wallaby/view.rb +18 -26
- data/lib/wallaby/view/action_viewable.rb +6 -8
- data/lib/wallaby/view/custom_prefixes.rb +13 -7
- data/lib/wallaby/view/themeable.rb +20 -23
- data/lib/wallaby/view/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7f9bf01cc8876f03b073afdaa8b322f00d781ff50fefd39f2eaac22f8feb535d
|
4
|
+
data.tar.gz: 04e7113c6650b3b756d886d859d08369f96beb39c2f2e5ffac4d8ba5c44c16c9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bd9d7a5a6985bfd6e317a44d8adf737a8e5639227e154fed90bdb2ac7230d6094efd0bebf5a60763826571b3cbc574365a1bf22d4dd4a6f326df279fd4f049e4
|
7
|
+
data.tar.gz: 7658edb6c169b0e577043856abe82583b3312a24c514cb4355584e15e2c2dd695dca2994731207a51f9b48c6e4575f0ece43c4de06edb133aae387db555fcbfa
|
data/README.md
CHANGED
@@ -7,11 +7,14 @@
|
|
7
7
|
[![Test Coverage](https://api.codeclimate.com/v1/badges/d3e924dd70cc12562eab/test_coverage)](https://codeclimate.com/github/wallaby-rails/wallaby-view/test_coverage)
|
8
8
|
[![Inch CI](https://inch-ci.org/github/wallaby-rails/wallaby-view.svg?branch=master)](https://inch-ci.org/github/wallaby-rails/wallaby-view)
|
9
9
|
|
10
|
-
|
10
|
+
**Wallaby::View** extends Rails template/partial inheritance chain to be able to:
|
11
|
+
|
12
|
+
- organize partials in `#{controller_path}/#{action}` fashion on top of Rails' controller fashion by extending Rails' [\_prefixes](https://github.com/rails/rails/blob/master/actionview/lib/action_view/view_paths.rb#L90).
|
13
|
+
- configure the theme (a set of layout/templates/partials starting with the theme prefix).
|
11
14
|
|
12
15
|
## Install
|
13
16
|
|
14
|
-
Add
|
17
|
+
Add **Wallaby::View** to `Gemfile`.
|
15
18
|
|
16
19
|
```ruby
|
17
20
|
gem 'wallaby-view'
|
@@ -23,7 +26,7 @@ And re-bundle.
|
|
23
26
|
bundle install
|
24
27
|
```
|
25
28
|
|
26
|
-
Include
|
29
|
+
Include **Wallaby::View** in the controller (e.g. **ApplicationController**):
|
27
30
|
|
28
31
|
```ruby
|
29
32
|
# app/controllers/application_controller
|
@@ -43,7 +46,7 @@ class ApplicationController < ActionController::Base
|
|
43
46
|
end
|
44
47
|
|
45
48
|
# app/controllers/admin/application_controller
|
46
|
-
class Admin::ApplicationController < ApplicationController
|
49
|
+
class Admin::ApplicationController < ::ApplicationController
|
47
50
|
self.theme_name = 'secure'
|
48
51
|
end
|
49
52
|
|
@@ -54,7 +57,7 @@ class Admin::UsersController < Admin::ApplicationController
|
|
54
57
|
end
|
55
58
|
```
|
56
59
|
|
57
|
-
By using
|
60
|
+
By using **Wallaby::View**, a template/partial for the `admin/application#edit` action will be looked up in the following folder order from top to bottom:
|
58
61
|
|
59
62
|
- app/views/admin/application/edit
|
60
63
|
- app/views/admin/application
|
@@ -63,18 +66,22 @@ By using `Wallaby::View`, the lookup folder order of `admin/application#edit` ac
|
|
63
66
|
- app/views/application/edit
|
64
67
|
- app/views/application
|
65
68
|
|
66
|
-
Then it
|
69
|
+
Then it depends on how a relative partial should be shared, the partial can be created in one of the above folders.
|
70
|
+
For example, if a `form` partial is designed specifically for `admin/application#edit` action, then it can be created in `admin/application/edit` folder as below:
|
71
|
+
|
72
|
+
```erb
|
73
|
+
<%# app/views/admin/application/edit/_form.html.erb %>
|
74
|
+
a form for `admin/application#edit`
|
75
|
+
```
|
76
|
+
|
77
|
+
Then in the `admin/application#edit` template, rendering the relative `form` partial will result in using the above partial.
|
67
78
|
|
68
79
|
```erb
|
69
80
|
<%# app/views/admin/application/edit.html.erb %>
|
70
81
|
<% render 'form' %>
|
71
|
-
|
72
|
-
<%# app/views/secure/edit/_form.html.erb %>
|
73
|
-
This form partial is under `secure` theme and `edit` action,
|
74
|
-
but still can be rendered by `admin/application#edit` action
|
75
82
|
```
|
76
83
|
|
77
|
-
For `admin/users#edit` action, since `mapping_actions` option is set, `edit` will be mapped to `form
|
84
|
+
For `admin/users#edit` action, since `mapping_actions` option is set, `edit` will be mapped to `form`, and `form` will be added to the prefixes as well.
|
78
85
|
Therefore, the lookup folder order of `admin/users#edit` becomes:
|
79
86
|
|
80
87
|
- app/views/admin/users/edit
|
@@ -95,7 +102,7 @@ Therefore, the lookup folder order of `admin/users#edit` becomes:
|
|
95
102
|
|
96
103
|
## Advanced Usage
|
97
104
|
|
98
|
-
It is possible to override the `_prefixes` method to make more changes to the prefixes:
|
105
|
+
It is possible to override the `_prefixes` method to make more changes to the prefixes before suffixing them with the action name:
|
99
106
|
|
100
107
|
```ruby
|
101
108
|
class ApplicationController < ActionController::Base
|
@@ -109,14 +116,13 @@ class ApplicationController < ActionController::Base
|
|
109
116
|
end
|
110
117
|
```
|
111
118
|
|
112
|
-
Then the lookup folder order of `application#edit` becomes:
|
119
|
+
Then the lookup folder order of e.g. `application#edit` becomes:
|
113
120
|
|
114
121
|
- app/views/application/edit
|
115
122
|
- app/views/application
|
116
123
|
- app/views/last_resort/edit
|
117
124
|
- app/views/last_resort
|
118
125
|
|
119
|
-
|
120
126
|
## Documentation
|
121
127
|
|
122
128
|
- [API Reference](https://www.rubydoc.info/gems/wallaby-view)
|
data/lib/wallaby/view.rb
CHANGED
@@ -11,35 +11,18 @@ require 'wallaby/view/custom_prefixes'
|
|
11
11
|
|
12
12
|
module Wallaby # :nodoc:
|
13
13
|
# To extend Rails prefixes and improve lookup performance.
|
14
|
+
#
|
15
|
+
# For example, include {Wallaby::View} module in the controller:
|
16
|
+
#
|
17
|
+
# ```
|
18
|
+
# # app/controllers/application_controller
|
19
|
+
# class ApplicationController < ActionController::Base
|
20
|
+
# include Wallaby::View
|
21
|
+
# end
|
22
|
+
# ```
|
14
23
|
module View
|
15
24
|
extend ActiveSupport::Concern
|
16
25
|
|
17
|
-
# This is the method executed when this module is included by other modules.
|
18
|
-
#
|
19
|
-
# Basically, it renames the methods so that it is possible
|
20
|
-
# to access the original methods after overriding them:
|
21
|
-
#
|
22
|
-
# 1. Rename the following original methods:
|
23
|
-
#
|
24
|
-
# - rename {https://github.com/rails/rails/blob/master/actionview/lib/action_view/view_paths.rb#L97
|
25
|
-
# lookup_context} to {Wallaby::View::ActionViewable#original_lookup_context original_lookup_context}
|
26
|
-
# - rename {https://github.com/rails/rails/blob/master/actionview/lib/action_view/view_paths.rb#L90 _prefixes}
|
27
|
-
# to {Wallaby::View::ActionViewable#original_prefixes original_prefixes}
|
28
|
-
#
|
29
|
-
# 2. Override the original methods:
|
30
|
-
#
|
31
|
-
# - rename {Wallaby::View::ActionViewable#override_lookup_context override_lookup_context}
|
32
|
-
# to {Wallaby::View::ActionViewable#lookup_context lookup_context}
|
33
|
-
# - rename {Wallaby::View::ActionViewable#override_prefixes override_prefixes}
|
34
|
-
# to {Wallaby::View::ActionViewable#\_prefixes \_prefixes}
|
35
|
-
# @param mod [Module]
|
36
|
-
def self.included(mod)
|
37
|
-
mod.send :alias_method, :original_lookup_context, :lookup_context
|
38
|
-
mod.send :alias_method, :original_prefixes, :_prefixes
|
39
|
-
mod.send :alias_method, :lookup_context, :override_lookup_context
|
40
|
-
mod.send :alias_method, :_prefixes, :override_prefixes
|
41
|
-
end
|
42
|
-
|
43
26
|
COMMA = ',' # :nodoc:
|
44
27
|
EMPTY_STRING = '' # :nodoc:
|
45
28
|
DOT_RB = '.rb' # :nodoc:
|
@@ -49,5 +32,14 @@ module Wallaby # :nodoc:
|
|
49
32
|
|
50
33
|
include ActionViewable
|
51
34
|
include Themeable
|
35
|
+
|
36
|
+
included do
|
37
|
+
# NOTE: Basically, it renames the methods so that it is possible
|
38
|
+
# to access the original methods after overriding them:
|
39
|
+
alias_method :original_lookup_context, :lookup_context
|
40
|
+
alias_method :original_prefixes, :_prefixes
|
41
|
+
alias_method :lookup_context, :override_lookup_context
|
42
|
+
alias_method :_prefixes, :override_prefixes
|
43
|
+
end
|
52
44
|
end
|
53
45
|
end
|
@@ -7,15 +7,13 @@ module Wallaby
|
|
7
7
|
module ActionViewable
|
8
8
|
extend ActiveSupport::Concern
|
9
9
|
|
10
|
-
|
11
|
-
# @!attribute prefix_options
|
12
|
-
# It stores the options for {#_prefixes}. It can inherit options from superclass.
|
13
|
-
# @return [Hash] prefix options
|
14
|
-
end
|
15
|
-
|
16
|
-
class_methods do
|
10
|
+
module ClassMethods # :nodoc:
|
11
|
+
# @!attribute[w] prefix_options
|
17
12
|
attr_writer :prefix_options
|
18
13
|
|
14
|
+
# @!attribute[r] prefix_options
|
15
|
+
# It stores the options for {#_prefixes}. It can inherit options from superclass.
|
16
|
+
# @return [Hash] prefix options
|
19
17
|
def prefix_options
|
20
18
|
@prefix_options ||= superclass.try(:prefix_options)
|
21
19
|
end
|
@@ -48,7 +46,7 @@ module Wallaby
|
|
48
46
|
# @param prefixes [Array<String>] the base prefixes
|
49
47
|
# @param action_name [String] the action name to add to the prefixes list
|
50
48
|
# @param themes [String] the theme name to add to the prefixes list
|
51
|
-
# @param options [Hash] the options
|
49
|
+
# @param options [Hash] the options that {Wallaby::View::CustomPrefixes} accepts
|
52
50
|
# @return [Array<String>]
|
53
51
|
|
54
52
|
# (see #_prefixes)
|
@@ -9,15 +9,18 @@ module Wallaby
|
|
9
9
|
# @return [Array<String>]
|
10
10
|
# @see Wallaby::View::ActionViewable#_prefixes
|
11
11
|
attr_reader :prefixes
|
12
|
+
|
12
13
|
# @!attribute [r] action_name
|
13
14
|
# Action name to be added
|
14
15
|
# @return [String]
|
15
16
|
attr_reader :action_name
|
17
|
+
|
16
18
|
# @!attribute [r] themes
|
17
19
|
# Themes to be inserted
|
18
20
|
# @return [Array<Hash>]
|
19
21
|
# @see Wallaby::View::Themeable#.themes
|
20
22
|
attr_reader :themes
|
23
|
+
|
21
24
|
# @!attribute [r] options
|
22
25
|
# Options for extending the given prefixes
|
23
26
|
# @return [Hash]
|
@@ -28,6 +31,7 @@ module Wallaby
|
|
28
31
|
# Wallaby::View::CustomPrefixes.execute(
|
29
32
|
# prefixes: ['users', 'application'], action_name: 'index'
|
30
33
|
# )
|
34
|
+
#
|
31
35
|
# # => [
|
32
36
|
# # 'users/index',
|
33
37
|
# # 'users',
|
@@ -39,6 +43,7 @@ module Wallaby
|
|
39
43
|
# prefixes: ['users', 'application'], action_name: 'index',
|
40
44
|
# themes: [{ theme_name: 'secure', theme_path: 'users' }]
|
41
45
|
# )
|
46
|
+
#
|
42
47
|
# # => [
|
43
48
|
# # 'users/index',
|
44
49
|
# # 'users',
|
@@ -52,6 +57,7 @@ module Wallaby
|
|
52
57
|
# prefixes: ['users', 'application'], action_name: 'edit',
|
53
58
|
# options: { mapping_actions: { 'edit' => 'form' } }
|
54
59
|
# )
|
60
|
+
#
|
55
61
|
# # => [
|
56
62
|
# # 'users/form',
|
57
63
|
# # 'users',
|
@@ -94,8 +100,10 @@ module Wallaby
|
|
94
100
|
end
|
95
101
|
end
|
96
102
|
|
97
|
-
|
103
|
+
protected
|
98
104
|
|
105
|
+
# @yield [array] To allow the array to be further modified
|
106
|
+
# @yieldparam [Array<String>] array
|
99
107
|
# @return [Array<String>]
|
100
108
|
def new_prefixes
|
101
109
|
prefixes.dup.try do |array|
|
@@ -105,20 +113,18 @@ module Wallaby
|
|
105
113
|
# in {Wallaby::View::ActionViewable#override_prefixes}
|
106
114
|
new_array = yield array if block_given?
|
107
115
|
|
108
|
-
# If the above block doesn't return
|
109
|
-
# it's assumed that `array` is changed
|
116
|
+
# If the above block doesn't return a new array, it returns the old `array`.
|
110
117
|
new_array.is_a?(Array) ? new_array : array
|
111
118
|
end
|
112
119
|
end
|
113
120
|
|
114
|
-
# Action
|
115
|
-
# @return [Array<String>]
|
121
|
+
# @return [Array<String>] Action names
|
116
122
|
def actions
|
117
123
|
@actions ||= [action_name, mapped_action_name].compact
|
118
124
|
end
|
119
125
|
|
120
|
-
# Insert theme
|
121
|
-
# @param [Array] array
|
126
|
+
# Insert theme names into the prefixes
|
127
|
+
# @param [Array<String>] array
|
122
128
|
def insert_themes_into(array)
|
123
129
|
themes.each do |theme|
|
124
130
|
index = array.index theme[:theme_path]
|
@@ -6,8 +6,7 @@ module Wallaby
|
|
6
6
|
module Themeable
|
7
7
|
extend ActiveSupport::Concern
|
8
8
|
|
9
|
-
|
10
|
-
# @!attribute theme_name
|
9
|
+
module ClassMethods # :nodoc:
|
11
10
|
# The theme name is used to specify the layout and prefixes
|
12
11
|
# so that a set of theme implementation for the frontend (html/css/javascript)
|
13
12
|
# can be applied
|
@@ -27,6 +26,7 @@ module Wallaby
|
|
27
26
|
#
|
28
27
|
# def index
|
29
28
|
# _prefixes
|
29
|
+
#
|
30
30
|
# # =>
|
31
31
|
# # [
|
32
32
|
# # 'admin/application/index',
|
@@ -37,8 +37,22 @@ module Wallaby
|
|
37
37
|
# # 'application'
|
38
38
|
# # ]
|
39
39
|
# end
|
40
|
-
#
|
40
|
+
# end
|
41
|
+
# @param theme_name [String]
|
42
|
+
# @param options [Hash] same options as Rails'
|
43
|
+
# {https://api.rubyonrails.org/classes/ActionView/Layouts/ClassMethods.html#method-i-layout
|
44
|
+
# layout} method
|
45
|
+
def theme_name=(theme_name, **options, &block)
|
46
|
+
layout theme_name, options, &block
|
47
|
+
@theme_path = theme_name && controller_path || nil
|
48
|
+
@theme_name = theme_name || nil
|
49
|
+
end
|
50
|
+
|
51
|
+
# @!attribute [r] theme_name
|
41
52
|
# @return [String, nil] theme name
|
53
|
+
def theme_name
|
54
|
+
defined?(@theme_name) && @theme_name || superclass.try(:theme_name)
|
55
|
+
end
|
42
56
|
|
43
57
|
# @!attribute [r] theme
|
44
58
|
# @example Once theme is set, the metadata will be set as well:
|
@@ -46,6 +60,7 @@ module Wallaby
|
|
46
60
|
# self.theme_name = 'secure'
|
47
61
|
#
|
48
62
|
# self.theme
|
63
|
+
#
|
49
64
|
# # =>
|
50
65
|
# # {
|
51
66
|
# # theme_name: 'secure',
|
@@ -53,25 +68,6 @@ module Wallaby
|
|
53
68
|
# # }
|
54
69
|
# end
|
55
70
|
# @return [Hash] theme metadata
|
56
|
-
|
57
|
-
# @!attribute [r] themes
|
58
|
-
# @return [Array<Hash>] a list of {.theme} metadata
|
59
|
-
end
|
60
|
-
|
61
|
-
class_methods do
|
62
|
-
# (see .theme_name)
|
63
|
-
def theme_name=(theme_name, **options, &block)
|
64
|
-
layout theme_name, options, &block
|
65
|
-
@theme_path = theme_name && controller_path || nil
|
66
|
-
@theme_name = theme_name || nil
|
67
|
-
end
|
68
|
-
|
69
|
-
# (see .theme_name)
|
70
|
-
def theme_name
|
71
|
-
defined?(@theme_name) && @theme_name || superclass.try(:theme_name)
|
72
|
-
end
|
73
|
-
|
74
|
-
# (see .theme)
|
75
71
|
def theme
|
76
72
|
defined?(@theme_name) && @theme_name && {
|
77
73
|
theme_name: @theme_name,
|
@@ -79,7 +75,8 @@ module Wallaby
|
|
79
75
|
} || superclass.try(:theme)
|
80
76
|
end
|
81
77
|
|
82
|
-
#
|
78
|
+
# @!attribute [r] themes
|
79
|
+
# @return [Array<Hash>] a list of {#theme} metadata
|
83
80
|
def themes
|
84
81
|
list = superclass.try(:themes) || []
|
85
82
|
list.prepend theme if defined?(@theme_name) && @theme_name
|
data/lib/wallaby/view/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wallaby-view
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tian Chen
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-04-13 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: railties
|
@@ -104,7 +104,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
104
104
|
- !ruby/object:Gem::Version
|
105
105
|
version: '0'
|
106
106
|
requirements: []
|
107
|
-
rubygems_version: 3.
|
107
|
+
rubygems_version: 3.1.2
|
108
108
|
signing_key:
|
109
109
|
specification_version: 4
|
110
110
|
summary: Wallaby View to extend Rails layout/template/partial inheritance chain.
|