card 1.93.6 → 1.93.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/config/initializers/02_patches/active_record.rb +13 -0
- data/config/initializers/patches.rb +6 -0
- data/config/initializers/recaptcha.rb +16 -14
- data/lib/card.rb +4 -3
- data/lib/card/format/nest/fetch.rb +1 -3
- data/lib/card/migration/deck_structure.rb +18 -0
- data/lib/card/query/attributes.rb +1 -1
- data/lib/card/query/clause.rb +6 -7
- data/lib/card/query/interpretation.rb +5 -1
- data/lib/card/query/value.rb +29 -19
- data/lib/card/set/event.rb +52 -28
- data/lib/card/set/event/delayed_event.rb +3 -3
- data/lib/card/set/format/haml_views.rb +1 -1
- data/lib/card/tasks/card.rake +7 -0
- data/lib/card/tasks/card/migrate.rake +29 -0
- data/lib/card/view/options.rb +7 -189
- data/lib/card/view/options/key_lists.rb +41 -0
- data/lib/card/view/options/voo_api.rb +165 -0
- data/lib/cardio.rb +16 -7
- data/lib/cardio/schema.rb +6 -1
- data/mod/basic_formats/set/all/base.rb +7 -3
- data/mod/basic_formats/set/self/head.rb +5 -0
- data/mod/carrierwave/config/core_initializers/carrierwave.rb +7 -0
- data/mod/core/set/all/name_validations.rb +3 -4
- data/mod/machines/file/all_script_machine_output/file.js +75 -23
- data/mod/machines/file/all_style_machine_output/file.css +2 -2
- data/mod/machines/lib/javascript/decko.js.coffee +1 -1
- data/mod/machines/lib/javascript/decko_filter.js.coffee +18 -10
- data/mod/pointer/set/abstract/02_pointer.rb +1 -1
- data/mod/pointer/set/abstract/02_pointer/filtered.rb +3 -1
- data/mod/pointer/template/abstract/02_pointer/filtered/filter_items.haml +2 -1
- data/mod/pointer/template/abstract/02_pointer/filtered/filtered_list_input.haml +3 -2
- data/mod/search/set/abstract/01_filter_form_helper.rb +8 -0
- data/mod/search/set/abstract/{01_search_params.rb → 02_search_params.rb} +0 -0
- data/mod/search/set/abstract/03_filter.rb +1 -1
- data/mod/search/set/abstract/wql_search.rb +7 -0
- data/mod/search/template/abstract/03_filter/filter_form.haml +24 -22
- data/mod/search/template/abstract/search/checkbox_item.haml +1 -1
- metadata +9 -6
- data/mod/search/set/abstract/02_filter_formgroups.rb +0 -134
data/lib/card/view/options.rb
CHANGED
@@ -1,8 +1,7 @@
|
|
1
1
|
class Card
|
2
2
|
class View
|
3
|
+
# Manages options for card views, including those used in nest syntax
|
3
4
|
module Options
|
4
|
-
# Manages options for card views, including those used in nest syntax
|
5
|
-
|
6
5
|
# the keymap represents a 2x2 matrix, where the factors are
|
7
6
|
# (a) whether an option's value can be set by a Carditect via nests, and
|
8
7
|
# (b) whether nested views can inherit the option from a parent view.
|
@@ -13,7 +12,6 @@ class Card
|
|
13
12
|
# don't inherit | carditect | none
|
14
13
|
#
|
15
14
|
# (note: each option will likely some day merit its own object)
|
16
|
-
|
17
15
|
@keymap = {
|
18
16
|
carditect: [
|
19
17
|
:view, # view to render
|
@@ -48,198 +46,18 @@ class Card
|
|
48
46
|
}
|
49
47
|
# Note: option values are strings unless otherwise noted
|
50
48
|
|
51
|
-
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
52
|
-
# CLASS METHODS
|
53
|
-
|
54
49
|
class << self
|
55
50
|
attr_reader :keymap
|
56
51
|
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
def all_keys
|
62
|
-
@all_keys ||= keymap.each_with_object([]) { |(_k, v), a| a.push(*v) }
|
63
|
-
end
|
64
|
-
|
65
|
-
# keys whose values can be set by Deckers in card nests
|
66
|
-
# @return [Array]
|
67
|
-
def carditect_keys
|
68
|
-
@carditect_keys ||= ::Set.new(keymap[:both]) + keymap[:carditect]
|
69
|
-
end
|
70
|
-
|
71
|
-
# keys that follow simple standard inheritance pattern from parent views
|
72
|
-
# @return [Array]
|
73
|
-
def heir_keys
|
74
|
-
@heir_keys ||= ::Set.new(keymap[:both]) + keymap[:heir]
|
75
|
-
end
|
76
|
-
|
77
|
-
# Keys that can be read or written via accessors
|
78
|
-
# @return [Array]
|
79
|
-
def accessible_keys
|
80
|
-
all_keys - [ # (all but the following)
|
81
|
-
:view, # view is accessed as requested_view or ok_view and cannot be directly manipulated
|
82
|
-
:show, :hide # these have a more extensive API (see Card::View::Visibility)
|
83
|
-
#:items,
|
84
|
-
]
|
85
|
-
end
|
86
|
-
|
87
|
-
def define_getter option_key
|
88
|
-
define_method option_key do
|
89
|
-
norm_method = "normalize_#{option_key}"
|
90
|
-
value = live_options[option_key]
|
91
|
-
try(norm_method, value) || value
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
def define_setter option_key
|
96
|
-
define_method "#{option_key}=" do |value|
|
97
|
-
live_options[option_key] = value
|
98
|
-
end
|
99
|
-
end
|
100
|
-
end
|
101
|
-
|
102
|
-
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
103
|
-
# VOO API
|
104
|
-
|
105
|
-
# The following methods allow developers to read and write options dynamically.
|
106
|
-
|
107
|
-
|
108
|
-
# There are two primary options hashes:
|
109
|
-
|
110
|
-
# - @normalized_options are determined upon initialization and do not change after that.
|
111
|
-
# @return [Hash] options
|
112
|
-
attr_reader :normalized_options
|
113
|
-
|
114
|
-
# - @live_options are dynamic and can be altered by the "voo" API at any time. Such alterations are
|
115
|
-
# NOT used in stubs
|
116
|
-
# @return [Hash]
|
117
|
-
def live_options
|
118
|
-
@live_options ||= process_live_options
|
119
|
-
end
|
120
|
-
|
121
|
-
|
122
|
-
# Developers can also set most options directly via accessors, eg voo.title = "King"
|
123
|
-
# :view, :show, and :hide have non-standard access (see #accessible_keys)
|
124
|
-
|
125
|
-
accessible_keys.each do |option_key|
|
126
|
-
define_getter option_key
|
127
|
-
define_setter option_key
|
128
|
-
end
|
129
|
-
|
130
|
-
|
131
|
-
# "items", the option used to configure views of each of a list of cards, is
|
132
|
-
# currently the only Hash option (thus this accessor override)
|
133
|
-
# @return [Hash]
|
134
|
-
def items
|
135
|
-
live_options[:items] ||= {}
|
136
|
-
end
|
137
|
-
|
138
|
-
# options to be used in data attributes of card slots (normalized options
|
139
|
-
# with standard keys)
|
140
|
-
# FIXME: what we really want is options as they were when render was called.
|
141
|
-
# normalized is wrong because it can get changed before render. live is wrong
|
142
|
-
# because they can get changed after. current solution is a compromise.
|
143
|
-
# @return [Hash]
|
144
|
-
def slot_options
|
145
|
-
normalized_options.merge(view: requested_view).select do |k, _v|
|
146
|
-
Options.all_keys.include? k
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
def closest_live_option key
|
151
|
-
if live_options.key? key
|
152
|
-
live_options[key]
|
153
|
-
elsif (ancestor = next_ancestor)
|
154
|
-
ancestor.closest_live_option key
|
155
|
-
end
|
156
|
-
end
|
157
|
-
|
158
|
-
# ACCESSOR_HELPERS
|
159
|
-
# methods that follow the normalize_#{key} pattern are called by accessors
|
160
|
-
# (arguably that should be done during normalization!)
|
161
|
-
|
162
|
-
def normalize_editor value
|
163
|
-
value && value.to_sym
|
164
|
-
end
|
165
|
-
|
166
|
-
def normalize_cache value
|
167
|
-
value && value.to_sym
|
168
|
-
end
|
169
|
-
|
170
|
-
private
|
171
|
-
|
172
|
-
# option normalization includes standardizing options into a hash with
|
173
|
-
# symbols as keys, managing standard view inheritance, and special
|
174
|
-
# handling for main_views.
|
175
|
-
def normalize_options
|
176
|
-
@normalized_options = opts = options_to_hash @raw_options.clone
|
177
|
-
opts[:view] = @raw_view
|
178
|
-
inherit_from_parent if parent
|
179
|
-
opts[:main] = true if format.main?
|
180
|
-
@optional = opts.delete(:optional) || false
|
181
|
-
opts
|
182
|
-
end
|
183
|
-
|
184
|
-
# typically options are already a hash. this also handles an array of
|
185
|
-
# hashes and nil.
|
186
|
-
def options_to_hash opts
|
187
|
-
case opts
|
188
|
-
when ActionController::Parameters
|
189
|
-
opts.to_unsafe_h.deep_symbolize_keys
|
190
|
-
when Hash then opts.deep_symbolize_keys!
|
191
|
-
when Array then opts[0].merge(opts[1]).deep_symbolize_keys!
|
192
|
-
when nil then {}
|
193
|
-
else raise Card::Error, "bad view options: #{opts}"
|
52
|
+
def add_option name, type
|
53
|
+
raise "invalid option type" unless @keymap.key?(type)
|
54
|
+
@keymap[type] << name
|
55
|
+
reset_key_lists
|
194
56
|
end
|
195
57
|
end
|
196
58
|
|
197
|
-
|
198
|
-
|
199
|
-
Options.heir_keys.each do |key|
|
200
|
-
parent_value = parent.live_options[key]
|
201
|
-
normalized_options[key] ||= parent_value if parent_value
|
202
|
-
end
|
203
|
-
end
|
204
|
-
|
205
|
-
def process_live_options
|
206
|
-
opts = @live_options = normalized_options.clone
|
207
|
-
opts.merge! format.main_nest_options if opts[:main_view]
|
208
|
-
# main_nest_options are not processed in normalize_options so that they're NOT locked in the stub.
|
209
|
-
process_default_options
|
210
|
-
process_visibility_options
|
211
|
-
opts
|
212
|
-
end
|
213
|
-
|
214
|
-
# This method triggers the default_X_args methods which can alter the
|
215
|
-
# @live_options hash both directly and indirectly (via the voo API)
|
216
|
-
def process_default_options
|
217
|
-
format.view_options_with_defaults requested_view, live_options
|
218
|
-
end
|
219
|
-
|
220
|
-
# "foreign" options are non-standard options. They're allowed, but they
|
221
|
-
# prevent independent caching (and thus stubbing)
|
222
|
-
|
223
|
-
# non-standard options that are found in normalized_options
|
224
|
-
# @return [Hash] options Hash
|
225
|
-
def foreign_normalized_options
|
226
|
-
@foreign_normalize_options ||= foreign_options_in normalized_options
|
227
|
-
end
|
228
|
-
|
229
|
-
# non-standard options that are found in live_options
|
230
|
-
# @return [Hash] options Hash
|
231
|
-
def foreign_live_options
|
232
|
-
foreign_options_in live_options
|
233
|
-
end
|
234
|
-
|
235
|
-
# find non-standard option in Hash
|
236
|
-
# @param opts [Hash] options hash
|
237
|
-
# @return [Hash] options Hash
|
238
|
-
def foreign_options_in opts
|
239
|
-
opts.reject { |k, _v| Options.all_keys.include? k }
|
240
|
-
end
|
241
|
-
|
242
|
-
|
59
|
+
extend KeyLists
|
60
|
+
include VooApi
|
243
61
|
end
|
244
62
|
end
|
245
63
|
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
class Card
|
2
|
+
class View
|
3
|
+
module Options
|
4
|
+
module KeyLists
|
5
|
+
# all standard option keys
|
6
|
+
# @return [Array]
|
7
|
+
def all_keys
|
8
|
+
@all_keys ||= keymap.each_with_object([]) { |(_k, v), a| a.push(*v) }
|
9
|
+
end
|
10
|
+
|
11
|
+
# keys whose values can be set by Deckers in card nests
|
12
|
+
# @return [Array]
|
13
|
+
def carditect_keys
|
14
|
+
@carditect_keys ||= ::Set.new(keymap[:both]) + keymap[:carditect]
|
15
|
+
end
|
16
|
+
|
17
|
+
# keys that follow simple standard inheritance pattern from parent views
|
18
|
+
# @return [Array]
|
19
|
+
def heir_keys
|
20
|
+
@heir_keys ||= ::Set.new(keymap[:both]) + keymap[:heir]
|
21
|
+
end
|
22
|
+
|
23
|
+
# Keys that can be read or written via accessors
|
24
|
+
# @return [Array]
|
25
|
+
def accessible_keys
|
26
|
+
all_keys - [ # (all but the following)
|
27
|
+
:view, # view is accessed as requested_view or ok_view and cannot be
|
28
|
+
# directly manipulated
|
29
|
+
:show, :hide # these have a more extensive API (see Card::View::Visibility)
|
30
|
+
]
|
31
|
+
end
|
32
|
+
|
33
|
+
def reset_key_lists
|
34
|
+
@all_keys = nil
|
35
|
+
@carditect_keys = nil
|
36
|
+
@heir_keys = nil
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,165 @@
|
|
1
|
+
class Card
|
2
|
+
class View
|
3
|
+
module Options
|
4
|
+
# The methods of the VooApi module allow developers
|
5
|
+
# to read and write options dynamically.
|
6
|
+
module VooApi
|
7
|
+
# There are two primary options hashes:
|
8
|
+
|
9
|
+
# - @normalized_options are determined upon initialization and do not change
|
10
|
+
# after that.
|
11
|
+
# @return [Hash] options
|
12
|
+
attr_reader :normalized_options
|
13
|
+
|
14
|
+
# - @live_options are dynamic and can be altered by the "voo" API at any time.
|
15
|
+
# Such alterations are
|
16
|
+
# NOT used in stubs
|
17
|
+
# @return [Hash]
|
18
|
+
def live_options
|
19
|
+
@live_options ||= process_live_options
|
20
|
+
end
|
21
|
+
|
22
|
+
class << self
|
23
|
+
def included base
|
24
|
+
# Developers can also set most options directly via accessors,
|
25
|
+
# eg voo.title = "King"
|
26
|
+
# :view, :show, and :hide have non-standard access (see #accessible_keys)
|
27
|
+
|
28
|
+
base.accessible_keys.each do |option_key|
|
29
|
+
define_getter option_key unless option_key == :items
|
30
|
+
define_setter option_key
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def define_getter option_key
|
35
|
+
define_method option_key do
|
36
|
+
norm_method = "normalize_#{option_key}"
|
37
|
+
value = live_options[option_key]
|
38
|
+
try(norm_method, value) || value
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def define_setter option_key
|
43
|
+
define_method "#{option_key}=" do |value|
|
44
|
+
live_options[option_key] = value
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# "items", the option used to configure views of each of a list of cards, is
|
50
|
+
# currently the only Hash option (thus this accessor override)
|
51
|
+
# @return [Hash]
|
52
|
+
def items
|
53
|
+
live_options[:items] ||= {}
|
54
|
+
end
|
55
|
+
|
56
|
+
# options to be used in data attributes of card slots (normalized options
|
57
|
+
# with standard keys)
|
58
|
+
# FIXME: what we really want is options as they were when render was called.
|
59
|
+
# normalized is wrong because it can get changed before render. live is wrong
|
60
|
+
# because they can get changed after. current solution is a compromise.
|
61
|
+
# @return [Hash]
|
62
|
+
def slot_options
|
63
|
+
normalized_options.merge(view: requested_view).select do |k, _v|
|
64
|
+
Options.all_keys.include? k
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def closest_live_option key
|
69
|
+
if live_options.key? key
|
70
|
+
live_options[key]
|
71
|
+
elsif (ancestor = next_ancestor)
|
72
|
+
ancestor.closest_live_option key
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# ACCESSOR_HELPERS
|
77
|
+
# methods that follow the normalize_#{key} pattern are called by accessors
|
78
|
+
# (arguably that should be done during normalization!)
|
79
|
+
|
80
|
+
def normalize_editor value
|
81
|
+
value&.to_sym
|
82
|
+
end
|
83
|
+
|
84
|
+
def normalize_cache value
|
85
|
+
value&.to_sym
|
86
|
+
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
# option normalization includes standardizing options into a hash with
|
91
|
+
# symbols as keys, managing standard view inheritance, and special
|
92
|
+
# handling for main_views.
|
93
|
+
def normalize_options
|
94
|
+
@normalized_options = opts = options_to_hash @raw_options.clone
|
95
|
+
opts[:view] = @raw_view
|
96
|
+
inherit_from_parent if parent
|
97
|
+
opts[:main] = true if format.main?
|
98
|
+
@optional = opts.delete(:optional) || false
|
99
|
+
opts
|
100
|
+
end
|
101
|
+
|
102
|
+
# typically options are already a hash. this also handles an array of
|
103
|
+
# hashes and nil.
|
104
|
+
def options_to_hash opts
|
105
|
+
case opts
|
106
|
+
when ActionController::Parameters
|
107
|
+
opts.to_unsafe_h.deep_symbolize_keys
|
108
|
+
when Hash then opts.deep_symbolize_keys!
|
109
|
+
when Array then opts[0].merge(opts[1]).deep_symbolize_keys!
|
110
|
+
when nil then {}
|
111
|
+
else raise Card::Error, "bad view options: #{opts}"
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
# standard inheritance from parent view object
|
116
|
+
def inherit_from_parent
|
117
|
+
Options.heir_keys.each do |key|
|
118
|
+
parent_value = parent.live_options[key]
|
119
|
+
normalized_options[key] ||= parent_value if parent_value
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def process_live_options
|
124
|
+
@live_options = normalized_options.clone
|
125
|
+
if @live_options[:main_view]
|
126
|
+
@live_options.merge! format.main_nest_options
|
127
|
+
end
|
128
|
+
# main_nest_options are not processed in normalize_options so that
|
129
|
+
# they're NOT locked in the stub.
|
130
|
+
process_default_options
|
131
|
+
process_visibility_options
|
132
|
+
@live_options
|
133
|
+
end
|
134
|
+
|
135
|
+
# This method triggers the default_X_args methods which can alter the
|
136
|
+
# @live_options hash both directly and indirectly (via the voo API)
|
137
|
+
def process_default_options
|
138
|
+
format.view_options_with_defaults requested_view, live_options
|
139
|
+
end
|
140
|
+
|
141
|
+
# "foreign" options are non-standard options. They're allowed, but they
|
142
|
+
# prevent independent caching (and thus stubbing)
|
143
|
+
|
144
|
+
# non-standard options that are found in normalized_options
|
145
|
+
# @return [Hash] options Hash
|
146
|
+
def foreign_normalized_options
|
147
|
+
@foreign_normalize_options ||= foreign_options_in normalized_options
|
148
|
+
end
|
149
|
+
|
150
|
+
# non-standard options that are found in live_options
|
151
|
+
# @return [Hash] options Hash
|
152
|
+
def foreign_live_options
|
153
|
+
foreign_options_in live_options
|
154
|
+
end
|
155
|
+
|
156
|
+
# find non-standard option in Hash
|
157
|
+
# @param opts [Hash] options hash
|
158
|
+
# @return [Hash] options Hash
|
159
|
+
def foreign_options_in opts
|
160
|
+
opts.reject { |k, _v| Options.all_keys.include? k }
|
161
|
+
end
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
data/lib/cardio.rb
CHANGED
@@ -5,7 +5,7 @@ djar = "delayed_job_active_record"
|
|
5
5
|
require djar if Gem::Specification.find_all_by_name(djar).any?
|
6
6
|
require "cardio/schema.rb"
|
7
7
|
|
8
|
-
ActiveSupport.on_load :
|
8
|
+
ActiveSupport.on_load :after_card do
|
9
9
|
if Card.take
|
10
10
|
Card::Mod.load
|
11
11
|
else
|
@@ -128,6 +128,7 @@ module Cardio
|
|
128
128
|
add_path "db"
|
129
129
|
add_path "db/migrate"
|
130
130
|
add_path "db/migrate_core_cards"
|
131
|
+
add_path "db/migrate_deck", root: root, with: "db/migrate"
|
131
132
|
add_path "db/migrate_deck_cards", root: root, with: "db/migrate_cards"
|
132
133
|
add_path "db/seeds.rb", with: "db/seeds.rb"
|
133
134
|
end
|
@@ -135,6 +136,9 @@ module Cardio
|
|
135
136
|
def add_initializer_paths
|
136
137
|
add_path "config/initializers", glob: "**/*.rb"
|
137
138
|
add_initializers root
|
139
|
+
each_mod_path do |mod_path|
|
140
|
+
add_initializers mod_path, false, "core_initializers"
|
141
|
+
end
|
138
142
|
end
|
139
143
|
|
140
144
|
def add_mod_initializer_paths
|
@@ -144,8 +148,8 @@ module Cardio
|
|
144
148
|
end
|
145
149
|
end
|
146
150
|
|
147
|
-
def add_initializers
|
148
|
-
Dir.glob("#{
|
151
|
+
def add_initializers base_dir, mod=false, init_dir="initializers"
|
152
|
+
Dir.glob("#{base_dir}/config/#{init_dir}").each do |initializers_dir|
|
149
153
|
path_mark = mod ? "mod/config/initializers" : "config/initializers"
|
150
154
|
paths[path_mark] << initializers_dir
|
151
155
|
end
|
@@ -184,14 +188,19 @@ module Cardio
|
|
184
188
|
def migration_paths type
|
185
189
|
list = paths["db/migrate#{schema_suffix type}"].to_a
|
186
190
|
if type == :deck_cards
|
187
|
-
|
188
|
-
|
189
|
-
|
191
|
+
add_mod_migration_paths list
|
192
|
+
elsif type == :deck
|
193
|
+
add_mod_migration_paths list, "migrate"
|
190
194
|
end
|
191
|
-
|
192
195
|
list.flatten
|
193
196
|
end
|
194
197
|
|
198
|
+
def add_mod_migration_paths list, dir="migrate_cards"
|
199
|
+
Card::Mod.dirs.each("db/#{dir}") do |path|
|
200
|
+
list += Dir.glob path
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
195
204
|
private
|
196
205
|
|
197
206
|
def mod_name_from_gem_spec gem_spec
|