card 1.18.3 → 1.18.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (56) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/card.gemspec +5 -3
  4. data/db/schema.rb +1 -1
  5. data/lib/card/active_record_helper.rb +2 -1
  6. data/lib/card/core_ext.rb +8 -0
  7. data/lib/card/format/nest.rb +13 -2
  8. data/lib/card/format/render.rb +7 -1
  9. data/lib/card/migration.rb +2 -1
  10. data/lib/card/set.rb +55 -70
  11. data/lib/card/set/trait.rb +70 -0
  12. data/lib/card/stage.rb +33 -8
  13. data/lib/card/stage_director.rb +3 -1
  14. data/lib/cardio.rb +2 -1
  15. data/mod/01_core/chunk/link.rb +7 -6
  16. data/mod/01_core/set/all/collection.rb +15 -52
  17. data/mod/01_core/set/all/fetch.rb +26 -6
  18. data/mod/01_core/set/all/references.rb +11 -3
  19. data/mod/01_core/set/all/subcards.rb +2 -2
  20. data/mod/01_core/set/all/tracked_attributes.rb +5 -1
  21. data/mod/01_core/set/all/utils.rb +1 -1
  22. data/mod/01_core/spec/set/all/collection_spec.rb +2 -2
  23. data/mod/01_history/set/all/content_history.rb +10 -11
  24. data/mod/02_basic_types/set/abstract/code_file.rb +57 -0
  25. data/mod/02_basic_types/set/type/pointer.rb +9 -5
  26. data/mod/03_machines/lib/javascript/wagn.js.coffee +4 -1
  27. data/mod/03_machines/lib/javascript/wagn_mod.js.coffee +29 -24
  28. data/mod/03_machines/set/self/script_ace.rb +1 -11
  29. data/mod/03_machines/set/self/script_card_menu.rb +1 -10
  30. data/mod/03_machines/set/self/script_html5shiv_printshiv.rb +1 -2
  31. data/mod/03_machines/set/self/script_jquery.rb +1 -2
  32. data/mod/03_machines/set/self/script_jquery_helper.rb +4 -7
  33. data/mod/03_machines/set/self/script_slot.rb +4 -6
  34. data/mod/03_machines/set/self/script_tinymce.rb +1 -2
  35. data/mod/03_machines/set/self/style_bootstrap_compatible.rb +1 -5
  36. data/mod/03_machines/set/self/style_cards.rb +1 -6
  37. data/mod/03_machines/set/self/style_jquery_ui_smoothness.rb +1 -2
  38. data/mod/03_machines/set/type/coffee_script.rb +1 -1
  39. data/mod/03_machines/set/type/css.rb +10 -1
  40. data/mod/03_machines/set/type/java_script.rb +16 -1
  41. data/mod/03_machines/set/type/scss.rb +3 -2
  42. data/mod/05_standard/lib/image_uploader.rb +15 -0
  43. data/mod/05_standard/set/all/rich_html/editing.rb +2 -2
  44. data/mod/05_standard/set/all/rich_html/form.rb +40 -19
  45. data/mod/05_standard/set/all/rich_html/modal.rb +4 -2
  46. data/mod/05_standard/set/all/rich_html/toolbar.rb +88 -39
  47. data/mod/05_standard/set/type/search_type.rb +6 -3
  48. data/mod/06_bootstrap/set/all/bootstrap/table.rb +55 -0
  49. data/mod/06_bootstrap/set/all/bootstrap/tabs.rb +81 -0
  50. data/mod/06_bootstrap/set/self/bootstrap_cards.rb +1 -9
  51. data/mod/06_bootstrap/set/self/bootstrap_js.rb +4 -6
  52. data/mod/06_bootstrap/set/self/bootswatch_shared.rb +11 -3
  53. data/mod/06_bootstrap/set/self/smartmenu_css.rb +3 -5
  54. data/mod/06_bootstrap/set/self/smartmenu_js.rb +3 -5
  55. data/spec/lib/card/set/trait_spec.rb +62 -0
  56. metadata +24 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 79f534a7d9b3208b5b7143640ad679318942a002
4
- data.tar.gz: 14cf3b61c892dda96b7f2ac8bf722adc852f1e87
3
+ metadata.gz: 4e23b9e82cf314afb35cdffb4bbbd0702ec4fd43
4
+ data.tar.gz: 0ec7fdb9104bd4a9a0e24477337d641deaaeb0b0
5
5
  SHA512:
6
- metadata.gz: 439daf4172199571908880128f72ed6ee9beac8f4be926c3235e2802104909abc945838eac4a0268fa2fa4dcb794112dd6326f184be12009baeb3a4cb1829db5
7
- data.tar.gz: 309648a222f5583ffba3c83055e20357f705fd2edc3d08d3a126609466505a6f9f12bdbc6c60f1c88f469bf17383e76049a53db3c5a95e37e84613e113f72653
6
+ metadata.gz: 62199dc7a8d4f352ecf7e0f6239379881200ce30b6c66968cb7509538322c82770b1dc70f6b1d6bb15b4cf5b18678fbd80d20030ae414d06f881e46101f62bcb
7
+ data.tar.gz: 127ba24fe1f23acb5ae669896c8255cb244245956481095846c175cd95471fbbb6e58a5cc4706e1485293959df5e177742e60fe3fb606bbe02ece2eb620a180c
data/VERSION CHANGED
@@ -1 +1 @@
1
- 1.18.3
1
+ 1.18.4
@@ -13,7 +13,7 @@ Gem::Specification.new do |s|
13
13
  'Cards are data atoms grouped into Sets to which Rules can apply. '\
14
14
  'Cards can formatted with Views and transformed with Events.'
15
15
  s.homepage = 'http://wagn.org'
16
- s.license = 'GPL'
16
+ s.licenses = ['GPL-2.0', 'GPL-3.0']
17
17
 
18
18
  s.files = `git ls-files`.split $INPUT_RECORD_SEPARATOR
19
19
 
@@ -43,7 +43,6 @@ Gem::Specification.new do |s|
43
43
  ['mini_magick', '~> 4.2'],
44
44
  ['recaptcha', '~> 0.4.0'],
45
45
  # 0.4.0 is last version that doesn't require ruby 2.0
46
-
47
46
  ['coderay', '~> 1.0'],
48
47
  ['sass', '~> 3.2'],
49
48
  ['coffee-script', '~> 2.2'],
@@ -53,7 +52,10 @@ Gem::Specification.new do |s|
53
52
  ['kaminari', '~> 0.16'],
54
53
 
55
54
  ['bootstrap-kaminari-views', '~> 0'],
56
- ['diff-lcs', '~> 1.2']
55
+ ['diff-lcs', '~> 1.2'],
56
+ # mime-types can be removed if we drop support for ruby 1.9.3
57
+ # mime-types 3.0 uses mime-types-data which isn't compatible with 1.9.3
58
+ ['mime-types', '2.99.1']
57
59
  ].each do |dep|
58
60
  s.add_runtime_dependency(*dep)
59
61
  end
@@ -11,7 +11,7 @@
11
11
  #
12
12
  # It's strongly recommended that you check this file into your version control system.
13
13
 
14
- ActiveRecord::Schema.define(version: 20160122153608) do
14
+ ActiveRecord::Schema.define(version: 20160229134221) do
15
15
 
16
16
  create_table "card_actions", force: :cascade do |t|
17
17
  t.integer "card_id", limit: 4
@@ -5,8 +5,9 @@ class Card
5
5
  Card.create! args
6
6
  end
7
7
 
8
+ # if card with same name exists move it out of the way
8
9
  def create_card! args
9
- create_card args.reverse_merge(rename_if_conflict: :new)
10
+ create_card args.reverse_merge(rename_if_conflict: :old)
10
11
  end
11
12
 
12
13
  def update_card name, args
@@ -67,6 +67,14 @@ class Hash
67
67
  end
68
68
  end
69
69
 
70
+ class Array
71
+ def to_pointer_content
72
+ map do |item|
73
+ "[[#{item}]]"
74
+ end.join "\n"
75
+ end
76
+ end
77
+
70
78
  class Kaminari::Helpers::Tag
71
79
  def page_url_for page
72
80
  p = params_for(page)
@@ -12,6 +12,19 @@ class Card
12
12
  mainline: @mainline, form: @form
13
13
  end
14
14
 
15
+ def field_subformat field
16
+ field = card.cardname.field(field) unless field.is_a?(Card)
17
+ subformat field
18
+ end
19
+
20
+ def field_nest field, opts={}
21
+ if field.is_a?(Card)
22
+ nest field, opts
23
+ else
24
+ prepare_nest opts.merge(inc_name: card.cardname.field(field))
25
+ end
26
+ end
27
+
15
28
  def with_nest_mode mode
16
29
  if (switch_mode = INCLUSION_MODES[mode]) && @mode != switch_mode
17
30
  old_mode = @mode
@@ -77,9 +90,7 @@ class Card
77
90
  else
78
91
  view
79
92
  end
80
-
81
93
  sub.optional_render view, opts
82
- # end
83
94
  end
84
95
 
85
96
  def get_nest_content cardname
@@ -132,8 +132,14 @@ class Card
132
132
  options[:class] = [options[:class], klass].flatten.compact * ' '
133
133
  end
134
134
 
135
+ def id_counter
136
+ return @parent.id_counter if @parent
137
+ @id_counter ||= 0
138
+ @id_counter += 1
139
+ end
140
+
135
141
  def unique_id
136
- "#{card.key}-#{Time.now.to_i}-#{rand(3)}"
142
+ "#{card.key}-#{id_counter}"
137
143
  end
138
144
  end
139
145
  end
@@ -44,7 +44,8 @@ class Card::Migration < ActiveRecord::Migration
44
44
 
45
45
  ActiveRecord::Base.table_name_suffix = new_suffix
46
46
  ActiveRecord::SchemaMigration.reset_table_name
47
- yield
47
+ paths = Cardio.migration_paths(type)
48
+ yield(paths)
48
49
  ActiveRecord::Base.table_name_suffix = original_suffix
49
50
  ActiveRecord::SchemaMigration.reset_table_name
50
51
  end
@@ -3,8 +3,10 @@
3
3
  class Card
4
4
  module Set
5
5
  include Event
6
+ include Trait
6
7
  mattr_accessor :modules, :traits
7
- @@modules = { base: [], base_format: {}, nonbase: {}, nonbase_format: {} }
8
+ @@modules = { base: [], base_format: {}, nonbase: {}, nonbase_format: {},
9
+ abstract: {}, abstract_format: {} }
8
10
 
9
11
  # A 'Set' is a group of Cards to which 'Rules' may be applied.
10
12
  # Sets can be as specific as a single card, as general as all cards, or
@@ -129,6 +131,7 @@ class Card
129
131
  def define_on_format format_name=:base, &block
130
132
  # format class name, eg. HtmlFormat
131
133
  klass = Card::Format.format_class_name format_name
134
+
132
135
  # called on current set module, eg Card::Set::Type::Pointer
133
136
  mod = const_get_or_set klass do
134
137
  # yielding set format module, eg Card::Set::Type::Pointer::HtmlFormat
@@ -169,22 +172,49 @@ class Card
169
172
  end
170
173
  end
171
174
 
172
- #
173
- # ActiveCard support: accessing plus cards as attributes
174
- #
175
- def card_accessor *args
176
- options = args.extract_options!
177
- add_traits args, options.merge(reader: true, writer: true)
175
+ # include a set module and all its format modules
176
+ # @param [Module] set
177
+ # @param [Hash] opts choose the formats you want to include
178
+ # @option opts [Symbol, Array<Symbol>] :only include only these formats
179
+ # @option opts [Symbol, Array<Symbol>] :except don't include these formats
180
+ # @example
181
+ # include_set Type::Basic, except: :css
182
+ def include_set set, opts={}
183
+ set_type = set.abstract_set? ? :abstract : :nonbase
184
+ @@modules[set_type][set.shortname].each do |set_mod|
185
+ include set_mod
186
+ end
187
+ include_set_formats set, opts
178
188
  end
179
189
 
180
- def card_reader *args
181
- options = args.extract_options!
182
- add_traits args, options.merge(reader: true)
190
+ def each_format set
191
+ set_type = set.abstract_set? ? :abstract : :nonbase
192
+ format_type = "#{set_type}_format".to_sym
193
+ @@modules[format_type].each_pair do |format, set_format_mod_hash|
194
+ next unless (format_mods = set_format_mod_hash[set.shortname])
195
+ yield format, format_mods
196
+ end
183
197
  end
184
198
 
185
- def card_writer *args
186
- options = args.extract_options!
187
- add_traits args, options.merge(writer: true)
199
+ # include a format modules of a set
200
+ # @param [Module] set
201
+ # @param [Hash] opts choose the formats you want to include
202
+ # @option opts [Symbol, Array<Symbol>] :only include only these formats
203
+ # @option opts [Symbol, Array<Symbol>] :except don't include these formats
204
+ # @example
205
+ # include_set Type::Basic, except: :css
206
+ def include_set_formats set, opts={}
207
+ each_format set do |format, format_mods|
208
+ match = format.to_s.match(/::(?<format>[^:]+)Format/)
209
+ format_sym = match ? match[:format] : :base
210
+ next if opts[:except] && Array(opts[:except]).include?(format_sym)
211
+ next if opts[:only] && !Array(opts[:only]).include?(format_sym)
212
+ format_mods.each do |format_mod|
213
+ define_on_format format_sym do
214
+ include format_mod
215
+ end
216
+ end
217
+ end
188
218
  end
189
219
 
190
220
  def ensure_set &block
@@ -220,15 +250,14 @@ class Card
220
250
 
221
251
  # make the set available for use
222
252
  def register_set set_module
223
- return if set_module.abstract_set? # noop; only used by explicit
224
- # inclusion in other set modules
225
253
  if set_module.all_set?
226
254
  # automatically included in Card class
227
255
  modules[:base] << set_module
228
256
  else
257
+ set_type = set_module.abstract_set? ? :abstract : :nonbase
229
258
  # made ready for dynamic loading via #include_set_modules
230
- modules[:nonbase][set_module.shortname] ||= []
231
- modules[:nonbase][set_module.shortname] << set_module
259
+ modules[set_type][set_module.shortname] ||= []
260
+ modules[set_type][set_module.shortname] << set_module
232
261
  end
233
262
  end
234
263
 
@@ -290,16 +319,14 @@ EOF
290
319
  end
291
320
 
292
321
  def register_set_format format_class, mod
293
- return if abstract_set? # noop; only used by explicit inclusion in
294
- # other set modules
295
-
296
322
  if all_set?
297
323
  # ready to include in base format classes
298
324
  modules[:base_format][format_class] ||= []
299
325
  modules[:base_format][format_class] << mod
300
326
  else
327
+ format_type = abstract_set? ? :abstract_format : :nonbase_format
301
328
  # ready to include dynamically in set members' format singletons
302
- format_hash = modules[:nonbase_format][format_class] ||= {}
329
+ format_hash = modules[format_type][format_class] ||= {}
303
330
  format_hash[shortname] ||= []
304
331
  format_hash[shortname] << mod
305
332
  end
@@ -308,9 +335,13 @@ EOF
308
335
  def shortname
309
336
  parts = name.split '::'
310
337
  first = 2 # shortname eliminates Card::Set
311
- set_class = Card::SetPattern.find parts[first].underscore
312
-
313
- last = first + set_class.anchor_parts_count
338
+ pattern_name = parts[first].underscore
339
+ last = if pattern_name == 'abstract'
340
+ first + 1
341
+ else
342
+ set_class = Card::SetPattern.find pattern_name
343
+ first + set_class.anchor_parts_count
344
+ end
314
345
  parts[first..last].join '::'
315
346
  end
316
347
 
@@ -324,52 +355,6 @@ EOF
324
355
 
325
356
  private
326
357
 
327
- def get_traits mod
328
- Card::Set.traits ||= {}
329
- Card::Set.traits[mod] || Card::Set.traits[mod] = {}
330
- end
331
-
332
- def add_traits args, options
333
- mod = self
334
- # raise "Can't define card traits on all set" if mod == Card
335
- mod_traits = get_traits mod
336
-
337
- new_opts = options[:type] ? { type: options[:type] } : {}
338
- new_opts[:default_content] = options[:default] if options[:default]
339
-
340
- args.each do |trait|
341
- define_trait_card trait, new_opts
342
- define_trait_reader trait if options[:reader]
343
- define_trait_writer trait if options[:writer]
344
-
345
- mod_traits[trait.to_sym] = options
346
- end
347
- end
348
-
349
- def define_trait_card trait, opts
350
- define_method "#{trait}_card" do
351
- trait_var "@#{trait}_card" do
352
- fetch trait: trait.to_sym, new: opts.clone
353
- end
354
- end
355
- end
356
-
357
- def define_trait_reader trait
358
- define_method trait do
359
- trait_var "@#{trait}" do
360
- send("#{trait}_card").content
361
- end
362
- end
363
- end
364
-
365
- def define_trait_writer trait
366
- define_method "#{trait}=" do |value|
367
- card = send "#{trait}_card"
368
- subcards.add name: card.name, type_id: card.type_id, content: value
369
- instance_variable_set "@#{trait}", value
370
- end
371
- end
372
-
373
358
  def set_specific_attributes *args
374
359
  Card.set_specific_attributes ||= []
375
360
  Card.set_specific_attributes += args.map(&:to_s)
@@ -0,0 +1,70 @@
1
+ class Card
2
+ module Set
3
+ #
4
+ # ActiveCard support: accessing plus cards as attributes
5
+ module Trait
6
+ def card_accessor *args
7
+ options = args.extract_options!
8
+ add_traits args, options.merge(reader: true, writer: true)
9
+ end
10
+
11
+ def card_reader *args
12
+ options = args.extract_options!
13
+ add_traits args, options.merge(reader: true)
14
+ end
15
+
16
+ def card_writer *args
17
+ options = args.extract_options!
18
+ add_traits args, options.merge(writer: true)
19
+ end
20
+
21
+ private
22
+
23
+ def get_traits mod
24
+ Card::Set.traits ||= {}
25
+ Card::Set.traits[mod] || Card::Set.traits[mod] = {}
26
+ end
27
+
28
+ def add_traits args, options
29
+ mod = self
30
+ # raise "Can't define card traits on all set" if mod == Card
31
+ mod_traits = get_traits mod
32
+
33
+ new_opts = options[:type] ? { type: options[:type] } : {}
34
+ new_opts[:default_content] = options[:default] if options[:default]
35
+
36
+ args.each do |trait|
37
+ define_trait_card trait, new_opts
38
+ define_trait_reader trait if options[:reader]
39
+ define_trait_writer trait if options[:writer]
40
+
41
+ mod_traits[trait.to_sym] = options
42
+ end
43
+ end
44
+
45
+ def define_trait_card trait, opts
46
+ define_method "#{trait}_card" do
47
+ trait_var "@#{trait}_card" do
48
+ fetch trait: trait.to_sym, new: opts.clone
49
+ end
50
+ end
51
+ end
52
+
53
+ def define_trait_reader trait
54
+ define_method trait do
55
+ trait_var "@#{trait}" do
56
+ send("#{trait}_card").content
57
+ end
58
+ end
59
+ end
60
+
61
+ def define_trait_writer trait
62
+ define_method "#{trait}=" do |value|
63
+ card = send "#{trait}_card"
64
+ subcards.add name: card.name, type_id: card.type_id, content: value
65
+ instance_variable_set "@#{trait}", value
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -3,18 +3,43 @@ class Card
3
3
  # 8 stages that are grouped in 3 phases.
4
4
  #
5
5
  # 'validation phase'
6
- # * initialize stage
7
- # * prepare_to_validate stage
8
- # * validate stage
6
+ # * initialize stage (I)
7
+ # * prepare_to_validate stage (P2V)
8
+ # * validate stage (V)
9
9
  #
10
10
  # 'storage phase'
11
- # * prepare_to_store stage
12
- # * store stage
13
- # * finalize stage
11
+ # * prepare_to_store stage (P2S)
12
+ # * store stage (S)
13
+ # * finalize stage (F)
14
14
  #
15
15
  # 'integration phase'
16
- # * integrate stage
17
- # * integrate_with_delay stage
16
+ # * integrate stage (IG)
17
+ # * integrate_with_delay stage (IGwD)
18
+ #
19
+ #
20
+ # Explanation:
21
+ # yes! the recommended stage to do that
22
+ # yes ok to do it here if necessary
23
+ # no not recommended; chance to mess things up
24
+ # but if something forces you to do it here you can try
25
+ # no! never do it here. it won't work or will break things
26
+ #
27
+ # if there is only a single entry in a phase column it counts for all stages
28
+ # of that phase
29
+ #
30
+ # validation | storage | integrate
31
+ # I P2V V | P2S S F | IG IGwD
32
+ #----------------------------------------------------------------------
33
+ # add subcard yes! yes! yes | yes yes yes | yes
34
+ # remove subcard yes! yes! yes | yes no no! | no!
35
+ # validate yes yes yes! | no | no
36
+ # unsecure change yes yes! no | no! | no!
37
+ # secure change yes | yes! no! no! | no!
38
+ # abort yes! | yes | yes?
39
+ # fail
40
+ # create other cards
41
+ # has id no | no no? yes | yes
42
+ # dirty attributes yes | yes | no
18
43
  #
19
44
  #
20
45
  module Stage