wagn 1.13.0.pre1 → 1.13.0.pre2
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/VERSION +1 -1
- data/app/controllers/card_controller.rb +3 -3
- data/db/migrate_cards/20140307231621_user_data_to_cards.rb +5 -1
- data/lib/card.rb +5 -7
- data/lib/card/chunk.rb +1 -0
- data/lib/card/codename.rb +48 -31
- data/lib/card/env.rb +0 -1
- data/lib/card/exceptions.rb +3 -3
- data/lib/card/format.rb +89 -166
- data/lib/card/generators/set/USAGE +1 -1
- data/lib/card/loader.rb +1 -1
- data/lib/card/set.rb +196 -112
- data/lib/card/set_pattern.rb +37 -71
- data/lib/wagn/cache.rb +8 -7
- data/lib/wagn/commands.rb +1 -1
- data/lib/wagn/config/environments/development.rb +1 -1
- data/lib/wagn/config/initializers/paperclip.rb +1 -0
- data/lib/wagn/generators/wagn/templates/Gemfile +59 -55
- data/lib/wagn/location.rb +2 -2
- data/mods/core/formats/html_format.rb +2 -6
- data/mods/core/formats/text_format.rb +1 -1
- data/mods/core/set_patterns/01_all.rb +0 -5
- data/mods/core/set_patterns/02_all_plus.rb +1 -3
- data/mods/core/set_patterns/07_type_plus_right.rb +0 -1
- data/mods/core/sets/all/active_card.rb +1 -1
- data/mods/core/sets/all/name.rb +3 -2
- data/mods/core/sets/all/pattern.rb +9 -23
- data/mods/core/sets/all/phases.rb +27 -13
- data/mods/core/sets/all/rules.rb +3 -3
- data/mods/core/sets/all/templating.rb +5 -2
- data/mods/core/sets/all/tracked_attributes.rb +2 -1
- data/mods/core/sets/right/structure.rb +13 -0
- data/mods/{standard → core}/sets/type/plain_text.rb +0 -0
- data/mods/standard/formats/email_html_format.rb +1 -1
- data/mods/standard/lib/card/machine.rb +16 -12
- data/mods/standard/lib/card/machine_input.rb +1 -1
- data/mods/standard/sets/all/attach.rb +1 -1
- data/mods/standard/sets/all/base.rb +92 -94
- data/mods/standard/sets/all/follow.rb +1 -1
- data/mods/standard/sets/all/rich_html.rb +5 -3
- data/mods/standard/sets/all/rss.rb +12 -5
- data/mods/standard/sets/right/account.rb +1 -1
- data/mods/standard/sets/right/add_help.rb +3 -1
- data/mods/standard/sets/right/comment.rb +92 -3
- data/mods/standard/sets/right/create.rb +2 -87
- data/mods/standard/sets/right/default.rb +3 -2
- data/mods/standard/sets/right/delete.rb +2 -5
- data/mods/standard/sets/right/help.rb +3 -1
- data/mods/standard/sets/right/machine_output.rb +9 -7
- data/mods/standard/sets/right/read.rb +2 -5
- data/mods/standard/sets/right/style.rb +3 -2
- data/mods/standard/sets/right/update.rb +2 -5
- data/mods/standard/sets/rstar/rules.rb +0 -2
- data/mods/standard/sets/self/head.rb +2 -3
- data/mods/standard/sets/self/navbox.rb +0 -7
- data/mods/standard/sets/self/recent.rb +2 -2
- data/mods/standard/sets/self/search.rb +10 -3
- data/mods/standard/sets/self/signin.rb +3 -3
- data/mods/standard/sets/type/cardtype.rb +2 -2
- data/mods/standard/sets/type/coffee_script.rb +4 -4
- data/mods/standard/sets/type/css.rb +12 -4
- data/mods/standard/sets/type/image.rb +19 -19
- data/mods/standard/sets/type/java_script.rb +1 -1
- data/mods/standard/sets/type/layout_type.rb +3 -2
- data/mods/standard/sets/type/pointer.rb +3 -2
- data/mods/standard/sets/type/scss.rb +6 -34
- data/mods/standard/sets/type/search_type.rb +22 -16
- data/mods/standard/sets/type/set.rb +2 -2
- data/mods/standard/sets/type/setting.rb +2 -2
- data/mods/standard/sets/type/skin.rb +4 -18
- data/spec/controllers/card_controller_spec.rb +2 -2
- data/spec/lib/card/flexmail_spec.rb +1 -0
- data/spec/lib/card/format_spec.rb +9 -9
- data/spec/lib/card/loader_spec.rb +1 -2
- data/spec/lib/card/name_spec.rb +7 -1
- data/spec/lib/card/set_pattern_spec.rb +5 -5
- data/spec/mods/core/sets/all/pattern_spec.rb +0 -9
- data/spec/mods/core/sets/all/phases_spec.rb +2 -1
- data/spec/mods/standard/lib/machine_input_spec.rb +20 -4
- data/spec/mods/standard/lib/machine_spec.rb +64 -14
- data/spec/mods/standard/sets/right/machine_output_spec.rb +2 -17
- data/spec/mods/standard/sets/right/script_spec.rb +9 -5
- data/spec/mods/standard/sets/right/style_spec.rb +11 -5
- data/spec/mods/standard/sets/type/coffeescript_spec.rb +5 -7
- data/spec/mods/standard/sets/type/css_spec.rb +3 -4
- data/spec/mods/standard/sets/type/javascript_spec.rb +3 -5
- data/spec/mods/standard/sets/type/scss_spec.rb +4 -7
- data/spec/mods/standard/sets/type/skin_spec.rb +29 -8
- metadata +5 -4
- data/mods/standard/sets/right/structure.rb +0 -12
data/lib/card/loader.rb
CHANGED
@@ -83,7 +83,7 @@ class Card
|
|
83
83
|
|
84
84
|
|
85
85
|
def load_sets_by_pattern
|
86
|
-
Card.set_patterns.reverse.map(&:
|
86
|
+
Card.set_patterns.reverse.map(&:pattern_code).each do |set_pattern|
|
87
87
|
pattern_tmp_dir = "#{Wagn.paths['tmp/sets'].first}/#{set_pattern}"
|
88
88
|
if rewrite_tmp_files?
|
89
89
|
Dir.mkdir pattern_tmp_dir
|
data/lib/card/set.rb
CHANGED
@@ -1,74 +1,148 @@
|
|
1
1
|
# -*- encoding : utf-8 -*-
|
2
2
|
|
3
|
-
|
4
3
|
class Card
|
5
4
|
module Set
|
6
5
|
|
7
|
-
mattr_accessor :
|
8
|
-
@@
|
6
|
+
mattr_accessor :modules, :traits
|
7
|
+
@@modules = { :base=>[], :base_format=>{}, :nonbase=>{}, :nonbase_format=>{} }
|
9
8
|
|
9
|
+
=begin
|
10
|
+
A "Set" is a group of cards to which "Rules" may be applied. Sets can be as specific as
|
11
|
+
a single card, as general as all cards, or anywhere in between.
|
10
12
|
|
11
|
-
|
12
|
-
#
|
13
|
-
# When you declare:
|
14
|
-
# view :view_name, "<set>" do |args|
|
15
|
-
#
|
16
|
-
# Methods are defined on the format
|
17
|
-
#
|
18
|
-
# The external api with checks:
|
19
|
-
# render(:viewname, args)
|
20
|
-
#
|
21
|
-
# Roughly equivalent to:
|
22
|
-
# render_viewname(args)
|
23
|
-
#
|
24
|
-
# The internal call that skips the checks:
|
25
|
-
# _render_viewname(args)
|
26
|
-
#
|
27
|
-
# Each of the above ultimately calls:
|
28
|
-
# _final(_set_key)_viewname(args)
|
13
|
+
Rules take two main forms: card rules and code rules.
|
29
14
|
|
30
|
-
|
31
|
-
|
32
|
-
#
|
15
|
+
"Card rules" are defined in card content. These are generally configured via the web
|
16
|
+
interface and are thus documented at http://wagn.org/rules.
|
33
17
|
|
34
|
-
|
35
|
-
|
18
|
+
"Code rules" can be defined in a "set file" within any "Mod" (short for both "module" and
|
19
|
+
"modification"). In accordance with Wagn's "MoVE" architecture, there are two main kinds of
|
20
|
+
code rules you can create in a set file: Views, and Events. Events are associated with the
|
21
|
+
Card class, and Views are associated with a Format class. You can also use set files to
|
22
|
+
add or override Card and/or Format methods directly. The majority of Wagn code is contained
|
23
|
+
in these files.
|
24
|
+
|
25
|
+
(FIXME - define mod, add generator)
|
26
|
+
|
27
|
+
Whenever you fetch or instantiate a card, it will automatically include all the
|
28
|
+
set modules defined in set files associated with sets of which it is a member. This
|
29
|
+
entails both simple model methods and "events", which are special methods explored
|
30
|
+
in greater detail below.
|
31
|
+
|
32
|
+
For example, say you have a Plaintext card named "Philipp+address", and you have set files
|
33
|
+
for the following sets:
|
34
|
+
|
35
|
+
* all cards
|
36
|
+
* all Plaintext cards
|
37
|
+
* all cards ending in +address
|
38
|
+
|
39
|
+
When you run this:
|
40
|
+
|
41
|
+
mycard = Card.fetch 'Philipp+address'
|
42
|
+
|
43
|
+
...then mycard will include the set modules associated with each of those sets in the above
|
44
|
+
order. (The order is determined by the set pattern; see lib/card/set_pattern.rb for more
|
45
|
+
information about set_ptterns and mods/core/sets/all/fetch.rb for more about fetching.)
|
46
|
+
|
47
|
+
Similarly, whenever a Format object is instantiated for a card, it includes all views
|
48
|
+
associated with BOTH (a) sets of which the card is a member and (b) the current format or
|
49
|
+
its ancestors. More on defining views below.
|
50
|
+
|
51
|
+
|
52
|
+
In order to have a set file associated with "all cards ending in +address", you could create
|
53
|
+
a file in mywagn/mods/mymod/sets/right/address.rb. The recommended mechanism for doing so
|
54
|
+
is running `wagn generate set modname set_pattern set_anchor`. In the current example, this
|
55
|
+
would translate to `wagn generate set mymod right address`. Note that both the set_pattern
|
56
|
+
and the set_anchor must correspond to the codename of a card in the database to function
|
57
|
+
correctly.
|
58
|
+
|
59
|
+
|
60
|
+
When Wagn loads, it uses these files to autogenerate a tmp_file that uses this set file to
|
61
|
+
createa Card::Set::Right::Address module which itself is extended with Card::Set. A set file
|
62
|
+
is "just ruby" but is generally quite concise because Wagn uses its file location to
|
63
|
+
autogenerate ruby module names and then uses Card::Set module to provide additional API.
|
64
|
+
|
65
|
+
|
66
|
+
View definitions
|
67
|
+
|
68
|
+
When you declare:
|
69
|
+
view :view_name do |args|
|
70
|
+
#...your code here
|
71
|
+
end
|
72
|
+
|
73
|
+
Methods are defined on the format
|
74
|
+
|
75
|
+
The external api with checks:
|
76
|
+
render(:viewname, args)
|
77
|
+
|
78
|
+
|
79
|
+
=end
|
80
|
+
|
81
|
+
module Format
|
82
|
+
mattr_accessor :views
|
83
|
+
@@views = {}
|
84
|
+
|
85
|
+
def view view, *args, &block
|
86
|
+
view = view.to_name.key.to_sym
|
87
|
+
views[self] ||= {}
|
88
|
+
view_block = views[self][view] = if block_given?
|
89
|
+
Card::Format.extract_class_vars view, args[0]
|
90
|
+
block
|
91
|
+
else
|
92
|
+
alias_block view, args
|
93
|
+
end
|
94
|
+
define_method "_view_#{ view }", view_block
|
95
|
+
end
|
96
|
+
|
97
|
+
def alias_block view, args
|
98
|
+
opts = Hash===args[0] ? args.shift : { :view => args.shift }
|
99
|
+
opts[:mod] ||= self
|
100
|
+
opts[:view] ||= view
|
101
|
+
views[ opts[:mod] ][ opts[:view] ] or fail
|
102
|
+
rescue
|
103
|
+
raise "cannot find #{ opts[:view] } view in #{ opts[:mod] }; failed to alias #{view} in #{self}"
|
104
|
+
end
|
105
|
+
|
36
106
|
end
|
37
107
|
|
38
|
-
def format
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
108
|
+
def format format=nil, &block
|
109
|
+
klass = Card::Format.format_class_name format # format class name, eg. HtmlFormat
|
110
|
+
mod = const_get_or_set klass do # called on current set module, eg Card::Set::Type::Pointer
|
111
|
+
m = Module.new # yielding set format module, eg Card::Set::Type::Pointer::HtmlFormat
|
112
|
+
register_set_format Card.const_get(klass), m
|
113
|
+
m.extend Card::Set::Format
|
114
|
+
m
|
115
|
+
end
|
116
|
+
mod.class_eval &block
|
117
|
+
end
|
118
|
+
|
119
|
+
def view *args, &block
|
120
|
+
format do
|
121
|
+
view *args, &block
|
45
122
|
end
|
46
123
|
end
|
124
|
+
|
47
125
|
|
48
126
|
def event event, opts={}, &final
|
49
127
|
opts[:on] = [:create, :update ] if opts[:on] == :save
|
50
128
|
|
51
|
-
mod = Card::Set.current[:module]
|
52
129
|
Card.define_callbacks event
|
53
130
|
|
54
|
-
|
131
|
+
class_eval do
|
55
132
|
final_method = "#{event}_without_callbacks" #should be private?
|
56
133
|
define_method final_method, &final
|
57
134
|
|
58
135
|
define_method event do
|
59
|
-
# Rails.logger.info "running #{event} for #{name}"
|
60
136
|
run_callbacks event do
|
61
|
-
# Rails.logger.info "calling event: #{event} for #{self}"
|
62
137
|
send final_method
|
63
138
|
end
|
64
139
|
end
|
65
140
|
end
|
66
141
|
|
67
|
-
set_event_callbacks event,
|
142
|
+
set_event_callbacks event, opts
|
68
143
|
end
|
69
144
|
|
70
145
|
|
71
|
-
|
72
146
|
#
|
73
147
|
# ActiveCard support: accessing plus cards as attributes
|
74
148
|
#
|
@@ -88,64 +162,35 @@ class Card
|
|
88
162
|
options = args.extract_options!
|
89
163
|
add_traits args, options.merge( :writer=>true )
|
90
164
|
end
|
91
|
-
|
92
|
-
|
93
|
-
def const_missing const
|
94
|
-
if const.to_s =~ /^([A-Z]\S*)ID$/ and code=$1.underscore.to_sym
|
95
|
-
if card_id = Codename[code]
|
96
|
-
const_set const, card_id
|
97
|
-
else
|
98
|
-
raise "Missing codename #{code} (#{const})"
|
99
|
-
end
|
100
|
-
else
|
101
|
-
super
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
#
|
106
|
-
# Singleton methods
|
107
|
-
#
|
108
165
|
|
166
|
+
|
167
|
+
|
168
|
+
|
169
|
+
# the set loading process has two main phases:
|
170
|
+
|
171
|
+
# 1. Definition: interpret each set file, creating/defining set and set_format modules
|
172
|
+
# 2. Organization: have base classes include modules associated with the "all" set, and
|
173
|
+
# clean up the other modules
|
174
|
+
|
109
175
|
class << self
|
176
|
+
|
177
|
+
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
178
|
+
# Definition Phase
|
110
179
|
|
111
|
-
|
112
|
-
|
180
|
+
# each set file calls `extend Card::Set` when loaded
|
181
|
+
def extended mod
|
113
182
|
register_set mod
|
114
183
|
end
|
115
|
-
|
116
|
-
def method_key opts
|
117
|
-
Card.set_patterns.each do |pclass|
|
118
|
-
if !pclass.opt_keys.map(&opts.method(:has_key?)).member? false;
|
119
|
-
return pclass.method_key_from_opts(opts)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
end
|
123
|
-
|
184
|
+
|
124
185
|
def register_set set_module
|
125
|
-
if all_set?
|
126
|
-
|
127
|
-
base_modules << set_module unless set_module == Card
|
186
|
+
if set_module.all_set?
|
187
|
+
modules[ :base ] << set_module
|
128
188
|
else
|
129
|
-
|
189
|
+
modules[ :nonbase ][ set_module.shortname ] ||= []
|
190
|
+
modules[ :nonbase ][ set_module.shortname ] << set_module
|
130
191
|
end
|
131
|
-
|
132
|
-
includable_modules[ set_module.name ] = set_module unless set_module == Card
|
133
|
-
end
|
134
|
-
|
135
|
-
def all_set? set_module
|
136
|
-
set_module == Card or set_module.name =~ /^Card::Set::All::/
|
137
192
|
end
|
138
|
-
|
139
|
-
def opts_from_module set_module
|
140
|
-
if name_parts = set_module.to_s.split('::')[2..-1]
|
141
|
-
#FIXME - does not handle set patterns with multiple opts (eg type plus right)
|
142
|
-
pattern, anchor = name_parts.map { |part| part.underscore.to_sym }
|
143
|
-
{ pattern => anchor }
|
144
|
-
else
|
145
|
-
{ }
|
146
|
-
end
|
147
|
-
end
|
148
|
-
|
193
|
+
|
149
194
|
def write_tmp_file set_pattern, anchor, from_file, seq
|
150
195
|
# FIXME - this does not properly handle anchorless sets
|
151
196
|
# There are special hacks for *all, but others (like *rstar) will not be found by
|
@@ -166,48 +211,87 @@ EOF
|
|
166
211
|
File.write to_file, file_content
|
167
212
|
to_file
|
168
213
|
end
|
214
|
+
|
215
|
+
|
216
|
+
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
217
|
+
# Organization Phase
|
169
218
|
|
170
|
-
|
219
|
+
# "base modules" are modules that are permanently included on the Card or Format class
|
220
|
+
# "nonbase modules" are included dynamically on singleton_classes
|
171
221
|
def process_base_modules
|
172
|
-
|
222
|
+
process_base_module_list modules[:base], Card
|
223
|
+
modules[:base_format].each do |format_class, modules_list|
|
224
|
+
process_base_module_list modules_list, format_class
|
225
|
+
end
|
226
|
+
modules.delete :base
|
227
|
+
modules.delete :base_format
|
228
|
+
end
|
229
|
+
|
230
|
+
def process_base_module_list list, klass
|
231
|
+
list.each do |mod|
|
173
232
|
if mod.instance_methods.any?
|
174
|
-
|
233
|
+
klass.send :include, mod
|
175
234
|
end
|
176
235
|
if class_methods = mod.const_get_if_defined( :ClassMethods )
|
177
|
-
|
236
|
+
klass.send :extend, class_methods
|
178
237
|
end
|
179
|
-
includable_modules.delete mod.name
|
180
238
|
end
|
181
|
-
@@base_modules = []
|
182
239
|
end
|
183
240
|
|
184
241
|
def clean_empty_modules
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
end
|
242
|
+
clean_empty_module_from_hash modules[ :nonbase ]
|
243
|
+
modules[ :nonbase_format ].values.each do |hash|
|
244
|
+
clean_empty_module_from_hash hash
|
189
245
|
end
|
190
246
|
end
|
191
|
-
|
247
|
+
|
248
|
+
def clean_empty_module_from_hash hash
|
249
|
+
hash.each do |mod_name, modlist|
|
250
|
+
modlist.delete_if { |x| x.instance_methods.empty? }
|
251
|
+
hash.delete mod_name if modlist.empty?
|
252
|
+
end
|
253
|
+
end
|
254
|
+
|
192
255
|
end
|
193
256
|
|
194
257
|
|
195
|
-
|
258
|
+
def register_set_format format_class, mod
|
259
|
+
if self.all_set?
|
260
|
+
modules[ :base_format ][ format_class ] ||= []
|
261
|
+
modules[ :base_format ][ format_class ] << mod
|
262
|
+
else
|
263
|
+
format_hash = modules[ :nonbase_format ][ format_class ] ||= {}
|
264
|
+
format_hash[ shortname ] ||= []
|
265
|
+
format_hash[ shortname ] << mod
|
266
|
+
end
|
267
|
+
end
|
268
|
+
|
269
|
+
def shortname
|
270
|
+
parts = name.split '::'
|
271
|
+
first = 2 # shortname eliminates Card::Set
|
272
|
+
set_class = Card::SetPattern.find parts[first].underscore
|
273
|
+
|
274
|
+
last = first + ( set_class.anchorless? ? 0 : 1 )
|
275
|
+
#FIXME - handle multi-anchor sets like type_plus_right
|
276
|
+
parts[first..last].join '::'
|
277
|
+
end
|
196
278
|
|
279
|
+
def all_set?
|
280
|
+
name =~ /^Card::Set::All::/
|
281
|
+
end
|
197
282
|
|
198
|
-
|
283
|
+
private
|
284
|
+
|
285
|
+
|
286
|
+
def set_event_callbacks event, opts
|
199
287
|
[:before, :after, :around].each do |kind|
|
200
288
|
if object_method = opts.delete(kind)
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
set_key = Card::Set.method_key( set_class_key => anchor_or_placeholder )
|
208
|
-
options[:if] = proc { |c| c.method_keys.member? set_key and c.event_applies? opts }
|
209
|
-
end
|
210
|
-
Card.class_eval { set_callback object_method, kind, event, options }
|
289
|
+
this_set_module = self
|
290
|
+
Card.class_eval do
|
291
|
+
set_callback object_method, kind, event, :prepend=>true, :if=> proc { |c|
|
292
|
+
c.singleton_class.include?( this_set_module ) and c.event_applies? opts
|
293
|
+
}
|
294
|
+
end
|
211
295
|
end
|
212
296
|
end
|
213
297
|
end
|
@@ -218,7 +302,7 @@ EOF
|
|
218
302
|
end
|
219
303
|
|
220
304
|
def add_traits args, options
|
221
|
-
mod =
|
305
|
+
mod = self
|
222
306
|
# raise "Can't define card traits on all set" if mod == Card
|
223
307
|
mod_traits = get_traits mod
|
224
308
|
|
data/lib/card/set_pattern.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
1
|
class Card
|
2
2
|
class SetPattern
|
3
|
-
|
3
|
+
|
4
4
|
class << self
|
5
|
-
attr_accessor :
|
5
|
+
attr_accessor :pattern_code, :pattern_id, :junction_only, :assigns_type, :anchorless
|
6
|
+
|
7
|
+
def find pattern_code
|
8
|
+
Card.set_patterns.find { |sub| sub.pattern_code == pattern_code }
|
9
|
+
end
|
6
10
|
|
7
11
|
def junction_only?
|
8
12
|
!!junction_only
|
@@ -16,37 +20,28 @@ class Card
|
|
16
20
|
super if pattern_applies? card
|
17
21
|
end
|
18
22
|
|
19
|
-
def
|
20
|
-
Card.fetch(self.
|
23
|
+
def pattern
|
24
|
+
Card.fetch(self.pattern_id, :skip_modules=>true).cardname
|
21
25
|
end
|
22
26
|
|
23
|
-
def register
|
24
|
-
if self.
|
25
|
-
self.
|
27
|
+
def register pattern_code, opts={}
|
28
|
+
if self.pattern_id = Card::Codename[pattern_code]
|
29
|
+
self.pattern_code = pattern_code
|
26
30
|
Card.set_patterns.insert opts.delete(:index).to_i, self
|
27
|
-
|
28
|
-
self.method_key = opts[:method_key] || key
|
29
|
-
end
|
30
|
-
self.opt_keys = Array.wrap( opts.delete(:opt_keys) || key.to_sym )
|
31
|
+
self.anchorless = !respond_to?( :anchor_name )
|
31
32
|
opts.each { |key, val| send "#{key}=", val }
|
32
33
|
else
|
33
|
-
warn "no codename for
|
34
|
+
warn "no codename for pattern_code #{pattern_code}"
|
34
35
|
end
|
35
36
|
end
|
36
37
|
|
37
|
-
def method_key_from_opts opts
|
38
|
-
method_key || ((opt_keys.map do |opt_key|
|
39
|
-
opts[opt_key].to_name.key.gsub('+', '-')
|
40
|
-
end << key) * '_' )
|
41
|
-
end
|
42
|
-
|
43
38
|
def pattern_applies? card
|
44
39
|
junction_only? ? card.cardname.junction? : true
|
45
40
|
end
|
46
41
|
|
47
|
-
def write_tmp_file
|
48
|
-
to_file = "#{Wagn.paths['tmp/set_patterns'].first}/#{seq}-#{
|
49
|
-
klass = "Card
|
42
|
+
def write_tmp_file pattern_code, from_file, seq
|
43
|
+
to_file = "#{Wagn.paths['tmp/set_patterns'].first}/#{seq}-#{pattern_code}.rb"
|
44
|
+
klass = "Card::#{pattern_code.camelize}Set"
|
50
45
|
file_content = <<EOF
|
51
46
|
# -*- encoding : utf-8 -*-
|
52
47
|
class #{klass} < Card::SetPattern
|
@@ -58,7 +53,7 @@ class #{klass} < Card::SetPattern
|
|
58
53
|
|
59
54
|
# ~~~~~~~~~~~ below autogenerated; above pulled from #{from_file} ~~~~~~~~~~~
|
60
55
|
end
|
61
|
-
register "#{
|
56
|
+
register "#{pattern_code}", (options || {})
|
62
57
|
end
|
63
58
|
|
64
59
|
EOF
|
@@ -71,93 +66,64 @@ EOF
|
|
71
66
|
# Instance methods
|
72
67
|
|
73
68
|
def initialize card
|
74
|
-
|
75
69
|
unless self.class.anchorless?
|
76
70
|
@anchor_name = self.class.anchor_name(card).to_name
|
77
|
-
|
78
71
|
@anchor_id = if self.class.respond_to? :anchor_id
|
79
72
|
self.class.anchor_id card
|
80
73
|
else
|
81
74
|
Card.fetch_id @anchor_name
|
82
75
|
end
|
83
76
|
end
|
84
|
-
|
85
77
|
self
|
86
78
|
end
|
87
79
|
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
80
|
+
def module_key
|
81
|
+
(defined? @module_key) ? @module_key : @module_key = begin
|
82
|
+
if self.class.anchorless?
|
83
|
+
self.class.pattern_code.camelize
|
84
|
+
elsif anchor_codenames
|
85
|
+
"#{self.class.pattern_code.camelize}::#{anchor_codenames.map(&:to_s).map(&:camelize) * '::'}"
|
94
86
|
end
|
95
|
-
tail && "Card::Set::#{ tail }"
|
96
|
-
end
|
97
|
-
|
98
|
-
def set_const
|
99
|
-
if set_module = self.set_module_name
|
100
|
-
Card::Set.includable_modules[ set_module ]
|
101
87
|
end
|
102
|
-
|
103
|
-
rescue Exception => e
|
104
|
-
warn "exception set_const #{e.inspect}, #{e.backtrace*"\n"}"
|
105
88
|
end
|
106
89
|
|
107
|
-
def
|
108
|
-
|
109
|
-
self.class.method_key
|
110
|
-
else
|
111
|
-
opts = {}
|
112
|
-
self.class.opt_keys.each_with_index do |key, index|
|
113
|
-
return nil unless opt_vals[index]
|
114
|
-
opts[key] = opt_vals[index]
|
115
|
-
end
|
116
|
-
self.class.method_key_from_opts opts
|
117
|
-
end
|
90
|
+
def module_list
|
91
|
+
module_key and Card::Set.modules[ :nonbase ][ module_key ]
|
118
92
|
end
|
119
93
|
|
120
|
-
def
|
121
|
-
|
122
|
-
@opt_vals = self.class.anchorless? ? [] : find_opt_vals
|
123
|
-
end
|
124
|
-
@opt_vals
|
94
|
+
def format_module_list klass
|
95
|
+
module_key and hash = Card::Set.modules[ :nonbase_format ][ klass ] and hash[ module_key ]
|
125
96
|
end
|
126
97
|
|
127
|
-
def
|
128
|
-
|
129
|
-
[ @anchor_name.left, @anchor_name.right ]
|
130
|
-
else
|
131
|
-
[ @anchor_name ]
|
132
|
-
end
|
133
|
-
anchor_parts.map do |part|
|
98
|
+
def anchor_codenames
|
99
|
+
@anchor_name.parts.map do |part|
|
134
100
|
part_id = Card.fetch_id part
|
135
|
-
part_id && Card::Codename[ part_id.to_i ] or return
|
101
|
+
part_id && Card::Codename[ part_id.to_i ] or return nil
|
136
102
|
end
|
137
103
|
end
|
138
104
|
|
139
|
-
def
|
140
|
-
@
|
105
|
+
def pattern
|
106
|
+
@pattern ||= self.class.pattern
|
141
107
|
end
|
142
108
|
|
143
109
|
def to_s
|
144
|
-
self.class.anchorless? ?
|
110
|
+
self.class.anchorless? ? pattern.s : "#{@anchor_name}+#{pattern}"
|
145
111
|
end
|
146
112
|
|
147
113
|
def inspect
|
148
114
|
"<#{self.class} #{to_s.to_name.inspect}>"
|
149
115
|
end
|
150
116
|
|
151
|
-
def safe_key
|
152
|
-
caps_part = self.class.
|
117
|
+
def safe_key
|
118
|
+
caps_part = self.class.pattern_code.gsub(' ','_').upcase
|
153
119
|
self.class.anchorless? ? caps_part : "#{caps_part}-#{@anchor_name.safe_key}"
|
154
120
|
end
|
155
121
|
|
156
122
|
def rule_set_key
|
157
123
|
if self.class.anchorless?
|
158
|
-
self.class.
|
124
|
+
self.class.pattern_code
|
159
125
|
elsif @anchor_id
|
160
|
-
[ @anchor_id, self.class.
|
126
|
+
[ @anchor_id, self.class.pattern_code ].map( &:to_s ) * '+'
|
161
127
|
end
|
162
128
|
end
|
163
129
|
|