wallaby-core 0.2.0 → 0.2.1
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 +6 -375
- data/app/security/ability.rb +1 -1
- data/config/locales/wallaby.en.yml +92 -128
- data/config/locales/wallaby_class.en.yml +0 -21
- data/lib/adaptors/wallaby/custom/model_service_provider.rb +8 -8
- data/lib/authorizers/wallaby/cancancan_authorization_provider.rb +2 -1
- data/lib/authorizers/wallaby/pundit_authorization_provider.rb +2 -2
- data/lib/concerns/wallaby/application_concern.rb +111 -0
- data/lib/concerns/wallaby/authentication_concern.rb +93 -0
- data/lib/concerns/wallaby/authorizable.rb +1 -1
- data/lib/concerns/wallaby/decoratable.rb +1 -1
- data/lib/concerns/wallaby/paginatable.rb +1 -1
- data/lib/concerns/wallaby/resourcable.rb +4 -0
- data/lib/concerns/wallaby/resources_concern.rb +433 -0
- data/lib/concerns/wallaby/servicable.rb +1 -1
- data/lib/errors/wallaby/model_not_found.rb +1 -1
- data/lib/errors/wallaby/resource_not_found.rb +1 -1
- data/lib/helpers/wallaby/application_helper.rb +6 -0
- data/lib/helpers/wallaby/form_helper.rb +2 -3
- data/lib/helpers/wallaby/index_helper.rb +2 -2
- data/lib/helpers/wallaby/links_helper.rb +5 -5
- data/lib/helpers/wallaby/styling_helper.rb +17 -3
- data/lib/interfaces/wallaby/mode.rb +2 -2
- data/lib/interfaces/wallaby/model_decorator.rb +1 -1
- data/lib/paginators/wallaby/model_paginator.rb +1 -1
- data/lib/routes/wallaby/resources_router.rb +1 -1
- data/lib/servicers/wallaby/model_servicer.rb +2 -1
- data/lib/services/wallaby/map/model_class_collector.rb +1 -1
- data/lib/services/wallaby/type_renderer.rb +2 -2
- data/lib/utils/wallaby/locale.rb +53 -0
- data/lib/utils/wallaby/logger.rb +21 -0
- data/lib/utils/wallaby/model_utils.rb +1 -1
- data/lib/utils/wallaby/module_utils.rb +1 -1
- data/lib/utils/wallaby/utils.rb +1 -1
- data/lib/wallaby/core.rb +6 -0
- data/lib/wallaby/core/version.rb +1 -1
- data/lib/wallaby/engine.rb +3 -3
- data/lib/wallaby/map.rb +1 -1
- metadata +7 -4
- data/app/controllers/wallaby/application_controller.rb +0 -84
- data/app/controllers/wallaby/secure_controller.rb +0 -81
@@ -54,7 +54,7 @@ module Wallaby
|
|
54
54
|
@current_servicer ||=
|
55
55
|
(controller_to_get(:model_servicer) \
|
56
56
|
|| Map.servicer_map(current_model_class, controller_to_get(:application_servicer))).try do |klass|
|
57
|
-
|
57
|
+
Logger.debug %(Current servicer: #{klass})
|
58
58
|
klass.new current_model_class, current_authorizer, current_model_decorator
|
59
59
|
end
|
60
60
|
end
|
@@ -66,5 +66,11 @@ module Wallaby
|
|
66
66
|
options = default_options.merge!(sources.extract_options!.stringify_keys)
|
67
67
|
super(*sources, options)
|
68
68
|
end
|
69
|
+
|
70
|
+
# @param key
|
71
|
+
# @param options [Hash]
|
72
|
+
def wt(key, options = {})
|
73
|
+
Locale.t key, { translator: method(:t) }.merge(options)
|
74
|
+
end
|
69
75
|
end
|
70
76
|
end
|
@@ -46,9 +46,8 @@ module Wallaby
|
|
46
46
|
type = metadata[:type]
|
47
47
|
hint = metadata[:hint]
|
48
48
|
# @see http://guides.rubyonrails.org/i18n.html#using-safe-html-translations
|
49
|
-
hint ||= type &&
|
50
|
-
|
51
|
-
return unless hint
|
49
|
+
hint ||= type && wt("hints.#{type}_html", default: [:"hints.#{type}", ''])
|
50
|
+
return if hint.blank?
|
52
51
|
|
53
52
|
content_tag :p, hint, class: 'help-block'
|
54
53
|
end
|
@@ -6,7 +6,7 @@ module Wallaby
|
|
6
6
|
# Just a label
|
7
7
|
# @return [String]
|
8
8
|
def all_label
|
9
|
-
|
9
|
+
wt 'filters.all'
|
10
10
|
end
|
11
11
|
|
12
12
|
# If `:fields` parameter is given, only display fields that is in `index_field_names`
|
@@ -58,7 +58,7 @@ module Wallaby
|
|
58
58
|
# @return [String] Export link for the given model_class.
|
59
59
|
def export_link(model_class, url_params: {})
|
60
60
|
index_link(model_class, url_params: { format: 'csv', page: nil, per: nil, with_query: true }.merge(url_params)) do
|
61
|
-
|
61
|
+
wt 'links.export', ext: 'CSV'
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
@@ -44,7 +44,7 @@ module Wallaby
|
|
44
44
|
html_options, block = LinkOptionsNormalizer.normalize(
|
45
45
|
html_options, block,
|
46
46
|
class: 'resource__create',
|
47
|
-
block: -> {
|
47
|
+
block: -> { wt 'links.new', model: to_model_label(model_class) }
|
48
48
|
)
|
49
49
|
|
50
50
|
url = options[:url] || new_path(model_class, url_params: url_params)
|
@@ -97,7 +97,7 @@ module Wallaby
|
|
97
97
|
html_options, block = LinkOptionsNormalizer.normalize(
|
98
98
|
html_options, block,
|
99
99
|
class: 'resource__update',
|
100
|
-
block: -> { "#{
|
100
|
+
block: -> { "#{wt 'links.edit'} #{decorate(resource).to_label}" }
|
101
101
|
)
|
102
102
|
|
103
103
|
default = options[:readonly] && block.call || nil
|
@@ -123,11 +123,11 @@ module Wallaby
|
|
123
123
|
return if unauthorized? :destroy, extract(resource)
|
124
124
|
|
125
125
|
html_options, block = LinkOptionsNormalizer.normalize(
|
126
|
-
html_options, block, class: 'resource__destroy', block: -> {
|
126
|
+
html_options, block, class: 'resource__destroy', block: -> { wt 'links.delete' }
|
127
127
|
)
|
128
128
|
|
129
129
|
html_options[:method] ||= :delete
|
130
|
-
(html_options[:data] ||= {})[:confirm] ||=
|
130
|
+
(html_options[:data] ||= {})[:confirm] ||= wt 'links.confirm.delete'
|
131
131
|
|
132
132
|
url = options[:url] || show_path(resource, is_resource: options[:is_resource], url_params: url_params)
|
133
133
|
link_to url, html_options, &block
|
@@ -140,7 +140,7 @@ module Wallaby
|
|
140
140
|
# @yield block to return the link label
|
141
141
|
# @return [String] anchor link of cancel action
|
142
142
|
def cancel_link(html_options: {}, &block)
|
143
|
-
block ||= -> {
|
143
|
+
block ||= -> { wt 'links.cancel' }
|
144
144
|
link_to 'javascript:history.back()', html_options, &block
|
145
145
|
end
|
146
146
|
|
@@ -3,6 +3,20 @@
|
|
3
3
|
module Wallaby
|
4
4
|
# Helper methods to build custom elements
|
5
5
|
module StylingHelper
|
6
|
+
# backforward compatible with FontAwesome 4
|
7
|
+
# @see this fa migration document https://fontawesome.com/how-to-use/on-the-web/setup/upgrading-from-version-4
|
8
|
+
FONT_AWESOME_MAPPING = {
|
9
|
+
4 => {
|
10
|
+
clock: 'clock-o',
|
11
|
+
bars: 'navicon',
|
12
|
+
calendar: 'calendar-o',
|
13
|
+
'check-square': 'check-square-o',
|
14
|
+
square: 'square-o',
|
15
|
+
link: 'chain',
|
16
|
+
user: 'user-o'
|
17
|
+
}
|
18
|
+
}.with_indifferent_access.freeze
|
19
|
+
|
6
20
|
# Shortcut to build up the HTML options as keyword arguments
|
7
21
|
# @param string_or_array [String, Array<String>]
|
8
22
|
# @param options [Hash]
|
@@ -54,12 +68,12 @@ module Wallaby
|
|
54
68
|
|
55
69
|
# @return [String] grey null
|
56
70
|
def null
|
57
|
-
muted
|
71
|
+
muted wt 'labels.empty'
|
58
72
|
end
|
59
73
|
|
60
74
|
# @return [String] grey N/A
|
61
75
|
def na
|
62
|
-
muted
|
76
|
+
muted wt 'labels.na'
|
63
77
|
end
|
64
78
|
|
65
79
|
# Grey text
|
@@ -74,7 +88,7 @@ module Wallaby
|
|
74
88
|
def fa_map(name, major = nil)
|
75
89
|
@map ||= begin
|
76
90
|
major ||= Gem.loaded_specs['font-awesome-sass'].try(:version).try(:segments).try(:first)
|
77
|
-
|
91
|
+
FONT_AWESOME_MAPPING[major] || {}
|
78
92
|
end
|
79
93
|
@map[name] || name
|
80
94
|
end
|
@@ -61,10 +61,10 @@ module Wallaby
|
|
61
61
|
class_name.constantize.tap do |klass|
|
62
62
|
next if klass < parent_class
|
63
63
|
|
64
|
-
raise InvalidError,
|
64
|
+
raise InvalidError, Locale.t('mode.inherit_required', klass: klass, parent: parent_class)
|
65
65
|
end
|
66
66
|
rescue NameError => e
|
67
|
-
|
67
|
+
Logger.error e
|
68
68
|
raise NotImplemented, class_name
|
69
69
|
end
|
70
70
|
end
|
@@ -162,7 +162,7 @@ module Wallaby
|
|
162
162
|
# @return [String, Symbol] type
|
163
163
|
# @raise [ArgumentError] when type is nil
|
164
164
|
def validate_presence_of(field_name, type)
|
165
|
-
type || raise(::ArgumentError,
|
165
|
+
type || raise(::ArgumentError, Locale.t('errors.invalid.type_required', field_name: field_name))
|
166
166
|
end
|
167
167
|
end
|
168
168
|
end
|
@@ -59,7 +59,7 @@ module Wallaby
|
|
59
59
|
# @param params [ActionController::Parameters]
|
60
60
|
def initialize(model_class, collection, params)
|
61
61
|
@model_class = self.class.model_class || model_class
|
62
|
-
raise ArgumentError,
|
62
|
+
raise ArgumentError, Locale.t('errors.required', subject: 'model_class') unless @model_class
|
63
63
|
|
64
64
|
@collection = collection
|
65
65
|
@params = params
|
@@ -53,7 +53,7 @@ module Wallaby
|
|
53
53
|
return model_class unless MODEL_ACTIONS.include? params[:action].to_sym
|
54
54
|
raise ModelNotFound, params[:resources] unless model_class
|
55
55
|
unless Map.mode_map[model_class]
|
56
|
-
raise UnprocessableEntity,
|
56
|
+
raise UnprocessableEntity, Locale.t('errors.unprocessable_entity.model', model: model_class)
|
57
57
|
end
|
58
58
|
|
59
59
|
model_class
|
@@ -75,7 +75,7 @@ module Wallaby
|
|
75
75
|
# @raise [ArgumentError] if param model_class is blank
|
76
76
|
def initialize(model_class, authorizer, model_decorator = nil)
|
77
77
|
@model_class = model_class || self.class.model_class
|
78
|
-
raise ArgumentError,
|
78
|
+
raise ArgumentError, Locale.t('errors.required', subject: 'model_class') unless @model_class
|
79
79
|
|
80
80
|
@model_decorator = model_decorator || Map.model_decorator_map(model_class)
|
81
81
|
@authorizer = authorizer
|
@@ -100,6 +100,7 @@ module Wallaby
|
|
100
100
|
provider.collection params, authorizer
|
101
101
|
end
|
102
102
|
|
103
|
+
# @!method paginate(query, params)
|
103
104
|
# @note This is a template method that can be overridden by subclasses.
|
104
105
|
# Paginate given {#collection}.
|
105
106
|
# @param query [Enumerable]
|
@@ -26,7 +26,7 @@ module Wallaby
|
|
26
26
|
invalid_models = configured_models - @models
|
27
27
|
return if invalid_models.blank?
|
28
28
|
|
29
|
-
message =
|
29
|
+
message = Locale.t 'errors.invalid.models', models: invalid_models.to_sentence
|
30
30
|
raise InvalidError, message
|
31
31
|
end
|
32
32
|
|
@@ -23,8 +23,8 @@ module Wallaby
|
|
23
23
|
# @raise [ArgumentError] if field_name is not provided
|
24
24
|
# @raise [ArgumentError] if object is not decorated
|
25
25
|
def check(locals)
|
26
|
-
raise ArgumentError,
|
27
|
-
raise ArgumentError,
|
26
|
+
raise ArgumentError, Locale.t('errors.required', subject: 'form') if locals.key?(:form) && locals[:form].blank?
|
27
|
+
raise ArgumentError, Locale.t('errors.required', subject: 'field_name') if locals[:field_name].blank?
|
28
28
|
raise ArgumentError, 'Object is not decorated.' unless locals[:object].is_a? ResourceDecorator
|
29
29
|
end
|
30
30
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Wallaby
|
4
|
+
# Locale related
|
5
|
+
module Locale
|
6
|
+
class << self
|
7
|
+
# Extend translation just for Wallaby
|
8
|
+
# so that translation can be prefixed with `wallaby.`
|
9
|
+
# @param key [String, Symbol, Array]
|
10
|
+
# @param options [Hash] the rest of the arguments
|
11
|
+
# @return [String] translation
|
12
|
+
def t(key, options = {})
|
13
|
+
translator = options.delete(:translator) || I18n.method(:t)
|
14
|
+
return translator.call(key, options) unless key.is_a?(String) || key.is_a?(Symbol)
|
15
|
+
|
16
|
+
new_key, new_defaults = normalize key, options.delete(:default)
|
17
|
+
|
18
|
+
translator.call(new_key, { default: new_defaults }.merge(options))
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
# @param key [String, Symbol, Array]
|
24
|
+
# @param defaults [String, Symbol, Array]
|
25
|
+
# @return [Array]
|
26
|
+
def normalize(key, defaults)
|
27
|
+
*keys, default = *defaults
|
28
|
+
|
29
|
+
# default will NOT be considered as one of the key
|
30
|
+
# if it is not set or if it is a String (since String means translation for I18n.t)
|
31
|
+
unless default.nil? || default.is_a?(String)
|
32
|
+
keys << default
|
33
|
+
default = nil
|
34
|
+
end
|
35
|
+
|
36
|
+
new_defaults = prefix_defaults_from keys.unshift(key)
|
37
|
+
new_key = new_defaults.shift
|
38
|
+
new_defaults << default if default
|
39
|
+
[new_key, new_defaults]
|
40
|
+
end
|
41
|
+
|
42
|
+
# Duplicate and prefix the keys respectively
|
43
|
+
# @param keys [Array]
|
44
|
+
# @return [Array] new_keys
|
45
|
+
def prefix_defaults_from(keys)
|
46
|
+
keys.each_with_object([]) do |k, result|
|
47
|
+
result << :"wallaby.#{k}" unless k.to_s.start_with? 'wallaby.'
|
48
|
+
result << k.to_sym
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Wallaby
|
4
|
+
# Custom logger
|
5
|
+
module Logger
|
6
|
+
class << self
|
7
|
+
%w(unknown fatal error warn info debug).each do |method_id|
|
8
|
+
define_method method_id do |message, replacements = {}|
|
9
|
+
message = message.inspect unless message.is_a? String
|
10
|
+
sourcing = replacements.delete :sourcing # sourcing can be set to false
|
11
|
+
|
12
|
+
from = "\nfrom #{caller[sourcing || 0]}" unless sourcing == false
|
13
|
+
Rails.logger.public_send(
|
14
|
+
method_id, "#{method_id.upcase}: #{format message, replacements}#{from}"
|
15
|
+
)
|
16
|
+
nil
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -34,7 +34,7 @@ module Wallaby
|
|
34
34
|
class_name = to_model_name resources_name
|
35
35
|
class_name.constantize
|
36
36
|
rescue NameError
|
37
|
-
|
37
|
+
Logger.warn Locale.t('errors.not_found.model', model: class_name), sourcing: 2
|
38
38
|
nil
|
39
39
|
end
|
40
40
|
|
@@ -32,7 +32,7 @@ module Wallaby
|
|
32
32
|
return unless child && parent
|
33
33
|
return if child < parent
|
34
34
|
|
35
|
-
raise ::ArgumentError,
|
35
|
+
raise ::ArgumentError, Locale.t('errors.invalid.inheritance', klass: child, parent: parent)
|
36
36
|
end
|
37
37
|
|
38
38
|
# If block is given, run the block. Otherwise, return subject
|
data/lib/utils/wallaby/utils.rb
CHANGED
@@ -8,7 +8,7 @@ module Wallaby
|
|
8
8
|
# @param caller [String] the line where it's called
|
9
9
|
# @param options [Hash]
|
10
10
|
def self.deprecate(key, caller:, options: {})
|
11
|
-
warn
|
11
|
+
warn Locale.t(key, options.merge(from: caller[0]))
|
12
12
|
end
|
13
13
|
|
14
14
|
# @see http://stackoverflow.com/a/8710663/1326499
|
data/lib/wallaby/core.rb
CHANGED
@@ -27,6 +27,8 @@ require 'parsers/wallaby/parser'
|
|
27
27
|
|
28
28
|
require 'utils/wallaby/field_utils'
|
29
29
|
require 'utils/wallaby/filter_utils'
|
30
|
+
require 'utils/wallaby/locale'
|
31
|
+
require 'utils/wallaby/logger'
|
30
32
|
require 'utils/wallaby/model_utils'
|
31
33
|
require 'utils/wallaby/module_utils'
|
32
34
|
require 'utils/wallaby/params_utils'
|
@@ -34,6 +36,10 @@ require 'utils/wallaby/preload_utils'
|
|
34
36
|
require 'utils/wallaby/test_utils'
|
35
37
|
require 'utils/wallaby/utils'
|
36
38
|
|
39
|
+
require 'concerns/wallaby/application_concern'
|
40
|
+
require 'concerns/wallaby/authentication_concern'
|
41
|
+
require 'concerns/wallaby/resources_concern'
|
42
|
+
|
37
43
|
require 'concerns/wallaby/authorizable'
|
38
44
|
require 'concerns/wallaby/baseable'
|
39
45
|
require 'concerns/wallaby/decoratable'
|
data/lib/wallaby/core/version.rb
CHANGED
data/lib/wallaby/engine.rb
CHANGED
@@ -19,7 +19,7 @@ module Wallaby
|
|
19
19
|
# @see http://rmosolgo.github.io/blog/2017/04/12/watching-files-during-rails-development/
|
20
20
|
config.to_prepare do
|
21
21
|
if Rails.env.development? || Rails.configuration.eager_load
|
22
|
-
|
22
|
+
Logger.debug ' [WALLABY] Reloading...'
|
23
23
|
::Wallaby::Map.clear
|
24
24
|
::Wallaby::PreloadUtils.require_all
|
25
25
|
end
|
@@ -28,14 +28,14 @@ module Wallaby
|
|
28
28
|
|
29
29
|
config.before_eager_load do
|
30
30
|
# NOTE: We need to ensure that the core models are loaded before anything else
|
31
|
-
|
31
|
+
Logger.debug ' [WALLABY] Preload all model files.'
|
32
32
|
::Wallaby::PreloadUtils.require_one 'app/models'
|
33
33
|
end
|
34
34
|
|
35
35
|
# Preload the rest files
|
36
36
|
config.after_initialize do
|
37
37
|
unless Rails.env.development? || Rails.configuration.eager_load
|
38
|
-
|
38
|
+
Logger.debug ' [WALLABY] Preload files after initialize.'
|
39
39
|
::Wallaby::PreloadUtils.require_all
|
40
40
|
end
|
41
41
|
end
|
data/lib/wallaby/map.rb
CHANGED
@@ -157,7 +157,7 @@ module Wallaby
|
|
157
157
|
return unless model_class
|
158
158
|
|
159
159
|
unless mode_map[model_class]
|
160
|
-
|
160
|
+
Logger.warn Locale.t('map.missing_mode_for_model_class', model: model_class.name), sourcing: 2
|
161
161
|
return
|
162
162
|
end
|
163
163
|
instance_variable_set(variable_name, instance_variable_get(variable_name) || {})
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wallaby-core
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
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-03-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activemodel
|
@@ -117,9 +117,7 @@ extra_rdoc_files: []
|
|
117
117
|
files:
|
118
118
|
- LICENSE
|
119
119
|
- README.md
|
120
|
-
- app/controllers/wallaby/application_controller.rb
|
121
120
|
- app/controllers/wallaby/resources_controller.rb
|
122
|
-
- app/controllers/wallaby/secure_controller.rb
|
123
121
|
- app/security/ability.rb
|
124
122
|
- config/locales/wallaby.en.yml
|
125
123
|
- config/locales/wallaby_class.en.yml
|
@@ -134,6 +132,8 @@ files:
|
|
134
132
|
- lib/authorizers/wallaby/default_authorization_provider.rb
|
135
133
|
- lib/authorizers/wallaby/model_authorizer.rb
|
136
134
|
- lib/authorizers/wallaby/pundit_authorization_provider.rb
|
135
|
+
- lib/concerns/wallaby/application_concern.rb
|
136
|
+
- lib/concerns/wallaby/authentication_concern.rb
|
137
137
|
- lib/concerns/wallaby/authorizable.rb
|
138
138
|
- lib/concerns/wallaby/baseable.rb
|
139
139
|
- lib/concerns/wallaby/decoratable.rb
|
@@ -143,6 +143,7 @@ files:
|
|
143
143
|
- lib/concerns/wallaby/paginatable.rb
|
144
144
|
- lib/concerns/wallaby/prefixable.rb
|
145
145
|
- lib/concerns/wallaby/resourcable.rb
|
146
|
+
- lib/concerns/wallaby/resources_concern.rb
|
146
147
|
- lib/concerns/wallaby/servicable.rb
|
147
148
|
- lib/concerns/wallaby/shared_helpers.rb
|
148
149
|
- lib/decorators/wallaby/resource_decorator.rb
|
@@ -193,6 +194,8 @@ files:
|
|
193
194
|
- lib/tree/wallaby/node.rb
|
194
195
|
- lib/utils/wallaby/field_utils.rb
|
195
196
|
- lib/utils/wallaby/filter_utils.rb
|
197
|
+
- lib/utils/wallaby/locale.rb
|
198
|
+
- lib/utils/wallaby/logger.rb
|
196
199
|
- lib/utils/wallaby/model_utils.rb
|
197
200
|
- lib/utils/wallaby/module_utils.rb
|
198
201
|
- lib/utils/wallaby/params_utils.rb
|