card 1.103.2 → 1.103.3

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.
Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/config/environments/production.rb +9 -9
  4. data/db/migrate_core_cards/20130411191151_renaming_for_menu.rb +0 -1
  5. data/db/migrate_core_cards/20140317035504_account_requests_to_signups.rb +0 -2
  6. data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +0 -2
  7. data/db/migrate_core_cards/20190417142612_reorganize_scripts_2.rb +1 -3
  8. data/db/migrate_core_cards/20190502130029_add_shark_and_help_desk_role.rb +1 -1
  9. data/db/migrate_core_cards/20190710090209_homepage_tweaks.rb +3 -7
  10. data/db/migrate_core_cards/20190823220018_cleanup_for_decko_1_0.rb +2 -4
  11. data/db/migrate_core_cards/20190902193208_input_type.rb +3 -8
  12. data/db/migrate_core_cards/20190904174403_token_upgrade.rb +1 -1
  13. data/db/migrate_core_cards/data/1.12_stylesheets/traditional.scss +1 -2
  14. data/db/seed/new/card_actions.yml +2381 -2381
  15. data/db/seed/new/card_acts.yml +3 -3
  16. data/db/seed/new/card_references.yml +1026 -1033
  17. data/db/seed/new/cards.yml +5291 -5293
  18. data/db/seed/test/fixtures/cards.yml +6 -6
  19. data/lib/card/content/chunk.rb +0 -1
  20. data/lib/card/content/diff/summary.rb +14 -18
  21. data/lib/card/content.rb +9 -1
  22. data/lib/card/director/act_direction.rb +5 -3
  23. data/lib/card/director/stages.rb +2 -0
  24. data/lib/card/fetch/results.rb +6 -6
  25. data/lib/card/{tasks/card/file_card_creator → file_card_creator}/abstract_file_card/migration_file.rb +0 -0
  26. data/lib/card/{tasks/card/file_card_creator → file_card_creator}/abstract_file_card/ruby_file.rb +0 -0
  27. data/lib/card/{tasks/card/file_card_creator → file_card_creator}/abstract_file_card/source_file.rb +0 -0
  28. data/lib/card/{tasks/card/file_card_creator → file_card_creator}/abstract_file_card.rb +0 -5
  29. data/lib/card/{tasks/card/file_card_creator → file_card_creator}/haml_card.rb +0 -0
  30. data/lib/card/{tasks/card/file_card_creator → file_card_creator}/output_helper.rb +0 -0
  31. data/lib/card/{tasks/card/file_card_creator → file_card_creator}/script_card.rb +0 -0
  32. data/lib/card/{tasks/card/file_card_creator → file_card_creator}/style_card.rb +0 -0
  33. data/lib/card/{tasks/card/file_card_creator.rb → file_card_creator.rb} +0 -5
  34. data/lib/card/format/content.rb +5 -7
  35. data/lib/card/format/render.rb +10 -10
  36. data/lib/card/format.rb +3 -8
  37. data/lib/card/lexicon.rb +30 -7
  38. data/lib/card/model/save_helper.rb +1 -1
  39. data/lib/card/name/card_class.rb +1 -1
  40. data/lib/card/name.rb +6 -6
  41. data/lib/card/set/card_methods.rb +13 -0
  42. data/lib/card/set/event/skip_and_trigger.rb +8 -0
  43. data/lib/card/set/format/abstract_format/wrapper.rb +1 -1
  44. data/lib/card/set/format/abstract_format.rb +2 -1
  45. data/lib/card/set/format.rb +2 -3
  46. data/lib/card/set/helpers.rb +55 -0
  47. data/lib/card/set/inheritance.rb +1 -1
  48. data/lib/card/set/pattern/all.rb +7 -6
  49. data/lib/card/set/pattern/class_methods.rb +2 -2
  50. data/lib/card/set/pattern.rb +30 -19
  51. data/lib/card/set/registrar.rb +8 -2
  52. data/lib/card/set.rb +14 -7
  53. data/lib/card/view/classy.rb +15 -27
  54. data/lib/card/view/options/voo_api.rb +3 -1
  55. data/lib/card/view.rb +1 -0
  56. data/lib/card.rb +9 -11
  57. data/lib/cardio/generators/deck_helper.rb +0 -4
  58. data/lib/cardio/mod/load_strategy/set_tmp_files.rb +10 -4
  59. data/lib/cardio/mod/load_strategy.rb +3 -4
  60. data/lib/cardio/mod/loader/set_loader.rb +13 -13
  61. data/lib/cardio/mod/loader.rb +1 -1
  62. data/lib/cardio/railtie.rb +6 -2
  63. data/lib/generators/deck/templates/Gemfile.erb +1 -1
  64. data/lib/generators/deck/templates/Rakefile.erb +6 -2
  65. data/lib/generators/deck/templates/simplecov.rb.erb +7 -11
  66. data/lib/{card/tasks → tasks}/card/asset.rake +0 -0
  67. data/lib/{card/tasks → tasks}/card/create.rake +0 -0
  68. data/lib/{card/tasks → tasks}/card/migrate.rake +0 -0
  69. data/lib/{card/tasks → tasks}/card/mod.rake +0 -0
  70. data/lib/{card/tasks → tasks}/card.rake +0 -0
  71. data/mod/admin/set/all/admin.rb +16 -0
  72. data/mod/admin/set/self/admin.rb +2 -6
  73. data/mod/admin/set/self/admin_info.rb +2 -5
  74. data/mod/core/locales/en.yml +4 -5
  75. data/mod/core/set/all/name_events.rb +1 -1
  76. data/mod/core/set/all/reference_events.rb +5 -10
  77. data/mod/core/set/all/trash.rb +2 -3
  78. data/mod/core/spec/set/all/name_events_spec.rb +10 -10
  79. data/mod/core/spec/set/all/trash_spec.rb +1 -1
  80. metadata +20 -19
  81. data/lib/card/set/basket.rb +0 -59
@@ -1486,8 +1486,8 @@ cards_072:
1486
1486
  references_expired:
1487
1487
  trash: false
1488
1488
  type_id: 3
1489
- db_content: "<p>Searches return a list of cards using [[http://decko.org/wagn/WQL|WQL,
1490
- the Wagn Query Language]]. See the [[http://decko.org/wagn/WQL syntax|syntax documentation]].</p>"
1489
+ db_content: "<p>Searches return a list of cards using [[http://decko.org/WQL|WQL,
1490
+ the Wagn Query Language]]. See the [[http://decko.org/WQL syntax|syntax documentation]].</p>"
1491
1491
  cards_073:
1492
1492
  id: 184
1493
1493
  name: by name
@@ -1595,7 +1595,7 @@ cards_078:
1595
1595
  references_expired:
1596
1596
  trash: false
1597
1597
  type_id: 3
1598
- db_content: "<p>These cards allow unrestricted HTML. [[http://decko.org/wagn/HTML|more]]</p>"
1598
+ db_content: "<p>These cards allow unrestricted HTML. [[http://decko.org/HTML|more]]</p>"
1599
1599
  cards_079:
1600
1600
  id: 205
1601
1601
  name:
@@ -1667,7 +1667,7 @@ cards_082:
1667
1667
  references_expired:
1668
1668
  trash: false
1669
1669
  type_id: 3
1670
- db_content: "<p>Toggles simply indicate yes or no. [[http://decko.org/wagn/Toggle|more]].</p>"
1670
+ db_content: "<p>Toggles simply indicate yes or no. [[http://decko.org/Toggle|more]].</p>"
1671
1671
  cards_083:
1672
1672
  id: 213
1673
1673
  name:
@@ -2397,7 +2397,7 @@ cards_122:
2397
2397
  references_expired:
2398
2398
  trash: false
2399
2399
  type_id: 3
2400
- db_content: "<div>Sets define a group of cards to which settings can apply. [[http://www.decko.org/wagn/Setting|Learn
2400
+ db_content: "<div>Sets define a group of cards to which settings can apply. [[http://www.decko.org/Setting|Learn
2401
2401
  more about settings.]]</div>"
2402
2402
  cards_123:
2403
2403
  id: 298
@@ -2419,7 +2419,7 @@ cards_123:
2419
2419
  db_content: |-
2420
2420
  <div>Settings affect how cards look and behave. Settings are available under each card's Options tab.</div>
2421
2421
  <p>&nbsp;</p>
2422
- <div><em>[[http://www.decko.org/wagn/Setting|Learn more about settings.]]</em></div>
2422
+ <div><em>[[http://www.decko.org/Setting|Learn more about settings.]]</em></div>
2423
2423
  cards_124:
2424
2424
  id: 300
2425
2425
  name:
@@ -89,7 +89,6 @@ class Card
89
89
  register_list :nest_only, [:Nest]
90
90
  register_list :query, [:QueryReference]
91
91
  register_list :stub, [:ViewStub]
92
- register_list :references_keep_escaping, %i[KeepEscapedLiteral Nest Link]
93
92
  end
94
93
  end
95
94
  end
@@ -7,21 +7,11 @@ class Card
7
7
  opts ||= {}
8
8
  @remaining_chars = opts[:length] || 50
9
9
  @joint = opts[:joint] || "..."
10
-
11
- @summary = nil
12
10
  @chunks = []
13
- @content_omitted = false
14
11
  end
15
12
 
16
13
  def rendered
17
- @summary ||=
18
- begin
19
- truncate_overlap
20
- @chunks.map do |chunk|
21
- @content_omitted ||= chunk[:action] == :ellipsis
22
- render_chunk chunk[:action], chunk[:text]
23
- end.join
24
- end
14
+ @rendered ||= render
25
15
  end
26
16
 
27
17
  def add text
@@ -44,6 +34,14 @@ class Card
44
34
 
45
35
  private
46
36
 
37
+ def render
38
+ truncate_overlap
39
+ @chunks.map do |chunk|
40
+ @content_omitted ||= chunk[:action] == :ellipsis
41
+ render_chunk chunk[:action], chunk[:text]
42
+ end.join
43
+ end
44
+
47
45
  def add_chunk text, action
48
46
  return unless @remaining_chars.positive?
49
47
 
@@ -119,16 +117,14 @@ class Card
119
117
  @chunks[index][:text] += @joint
120
118
  end
121
119
 
120
+ JOINT_REPLACEMENT = { added: :ellipis, deleted: :added }.freeze
121
+
122
122
  def replace_with_joint index
123
123
  @chunks.pop
124
- return unless index.positive?
124
+ return unless index.positive? &&
125
+ (previous_action = JOINT_REPLACEMENT[@chunks[index - 1][:action]])
125
126
 
126
- case @chunks[index - 1][:action]
127
- when :added
128
- add_chunk_to_list @joint, :ellipsis
129
- when :deleted
130
- add_chunk_to_list @joint, :added
131
- end
127
+ add_chunk_to_list @joint, previous_action
132
128
  end
133
129
  end
134
130
  end
data/lib/card/content.rb CHANGED
@@ -104,7 +104,7 @@ class Card
104
104
  end
105
105
 
106
106
  def without_references &block
107
- without_chunks Chunk::Nest, Chunk::Link, &block
107
+ without_chunks Chunk::Nest, Chunk::Link, Chunk::EscapedLiteral, &block
108
108
  end
109
109
 
110
110
  def without_chunks *chunk_classes
@@ -114,6 +114,14 @@ class Card
114
114
  unstash_chunks processed, stash
115
115
  end
116
116
 
117
+ def strip_nests
118
+ strip_chunks Chunk::Nest
119
+ end
120
+
121
+ def strip_chunks chunk_type
122
+ chunks.reject! { |c| c.is_a? chunk_type }
123
+ end
124
+
117
125
  private
118
126
 
119
127
  def interpret_chunk_type chunk_type
@@ -14,9 +14,11 @@ class Card
14
14
  end
15
15
 
16
16
  def run_act card
17
- self.act_card = card
18
- # add new_director(card)
19
- yield
17
+ Lexicon.rescuing do
18
+ self.act_card = card
19
+ # add new_director(card)
20
+ yield
21
+ end
20
22
  ensure
21
23
  clear
22
24
  end
@@ -26,6 +26,8 @@ class Card
26
26
  STAGE_INDEX[stage]
27
27
  when Integer
28
28
  stage
29
+ when nil
30
+ -1
29
31
  else
30
32
  raise Card::Error, "not a valid stage: #{stage}"
31
33
  end
@@ -28,7 +28,7 @@ class Card
28
28
  elsif opts[:skip_virtual]
29
29
  return nil
30
30
  else
31
- assign_name_from_mark
31
+ assign_name mark
32
32
  end
33
33
  yield
34
34
  end
@@ -53,9 +53,9 @@ class Card
53
53
  def quick_renew
54
54
  return false unless quick_renew?
55
55
 
56
- # Rails.logger.info "QUICK renewing: #{mark}, #{new_opts}"
57
56
  update_supercard
58
- assign_name_from_mark
57
+ opts_name = new_opts[:name]
58
+ assign_name(opts_name.present? ? opts_name : mark)
59
59
  true
60
60
  end
61
61
 
@@ -123,11 +123,11 @@ class Card
123
123
  @new_opts ||= opts[:new]
124
124
  end
125
125
 
126
- def assign_name_from_mark
126
+ def assign_name requested
127
127
  return if opts[:local_only]
128
- return unless mark&.to_s != card.name
128
+ return unless requested&.to_s != card.name
129
129
 
130
- card.name = mark.to_s
130
+ card.name = requested.to_s
131
131
  end
132
132
  end
133
133
  end
@@ -1,8 +1,3 @@
1
- require_relative "./output_helper"
2
- require_relative "./abstract_file_card/source_file"
3
- require_relative "./abstract_file_card/ruby_file"
4
- require_relative "./abstract_file_card/migration_file"
5
-
6
1
  class Card
7
2
  class FileCardCreator
8
3
  # A template class for generating cards that are linked to source files.
@@ -1,8 +1,3 @@
1
- require_relative "./file_card_creator/script_card"
2
- require_relative "./file_card_creator/style_card"
3
- require_relative "./file_card_creator/haml_card"
4
- require_relative "./file_card_creator/abstract_file_card"
5
-
6
1
  class Card
7
2
  # A Factory class
8
3
  # It chooses the class to create the file card according to the given type.
@@ -7,14 +7,12 @@ class Card
7
7
  content_obj.to_s
8
8
  end
9
9
 
10
- # Preserves the syntax in all nests. The content is yielded with placeholders
11
- # for all nests. After executing the given block the original nests are put back in.
12
- # Placeholders are numbers in double curly brackets like {{2}}.
10
+ # 1. Break out references (nests / links) into separate chunks
11
+ # 2. yields the other (non-ref) content
12
+ # 3. processes references
13
13
  def safe_process_content override_content=nil, content_opts=nil, &block
14
- content_obj =
15
- content_object override_content, chunk_list: :references_keep_escaping
16
- result = content_obj.without_references(&block)
17
- process_content result, content_opts
14
+ content_obj = content_object override_content, chunk_list: :references
15
+ process_content content_obj.without_references(&block), content_opts
18
16
  end
19
17
 
20
18
  # nested by another card's content
@@ -8,11 +8,9 @@ class Card
8
8
  voo = View.new self, view, view_options, @voo
9
9
  with_voo voo do
10
10
  voo.process do |final_view|
11
- final_render final_view
11
+ wrap_and_render final_view
12
12
  end
13
13
  end
14
- rescue StandardError => e
15
- rescue_view e, view
16
14
  end
17
15
 
18
16
  def with_voo voo
@@ -38,13 +36,15 @@ class Card
38
36
  end
39
37
 
40
38
  def final_render view
41
- current_view(view) do
42
- with_wrapper do
43
- method = view_method view
44
- rendered = final_render_call method
45
- add_debug_info view, method, rendered
46
- end
47
- end
39
+ method = view_method view
40
+ rendered = final_render_call method
41
+ add_debug_info view, method, rendered
42
+ end
43
+
44
+ def wrap_and_render view
45
+ current_view(view) { with_wrapper { final_render view } }
46
+ rescue StandardError => e
47
+ rescue_view e, view
48
48
  end
49
49
 
50
50
  def final_render_call method
data/lib/card/format.rb CHANGED
@@ -33,6 +33,9 @@ class Card
33
33
  attr_reader :card, :parent, :main_opts, :modal_opts
34
34
  attr_accessor :form, :error_status, :rendered
35
35
 
36
+ delegate :basket, to: Set
37
+ delegate :session, :params, to: Env
38
+
36
39
  def self.view_caching?
37
40
  true
38
41
  end
@@ -66,18 +69,10 @@ class Card
66
69
  end
67
70
  end
68
71
 
69
- def params
70
- Env.params
71
- end
72
-
73
72
  def controller
74
73
  @controller || Env[:controller] ||= CardController.new
75
74
  end
76
75
 
77
- def session
78
- Env.session
79
- end
80
-
81
76
  def mime_type
82
77
  "text/plain"
83
78
  end
data/lib/card/lexicon.rb CHANGED
@@ -28,15 +28,9 @@ class Card
28
28
  Card::Cache[Lexicon]
29
29
  end
30
30
 
31
- def add card
32
- lex = card.lex
33
- cache.write card.id.to_s, lex
34
- cache.write cache_key(lex), card.id
35
- end
36
-
37
31
  def update card
38
32
  add card
39
- cache.delete cache_key(card.lex_before_act)
33
+ expire_lex card.lex_before_act
40
34
  end
41
35
 
42
36
  # def delete card
@@ -50,8 +44,37 @@ class Card
50
44
  lex.map { |side_id| name side_id or return }.join(Card::Name.joint).to_name
51
45
  end
52
46
 
47
+ # this is to address problems whereby renaming errors leave the lexicon broken.
48
+ # NEEDS TESTING
49
+ def rescuing
50
+ @act_lexes = []
51
+ @act_ids = []
52
+ yield
53
+ rescue StandardError => e
54
+ @act_lexes.each { |lex| expire_lex lex }
55
+ @act_ids.each { |id| expire_id id }
56
+ @act_lexes = @act_ids = nil
57
+ raise e
58
+ end
59
+
53
60
  private
54
61
 
62
+ def add card
63
+ lex = card.lex
64
+ @act_lexes << lex
65
+ @act_ids << card.id
66
+ cache.write card.id.to_s, lex
67
+ cache.write cache_key(lex), card.id
68
+ end
69
+
70
+ def expire_lex lex
71
+ cache.delete cache_key(lex)
72
+ end
73
+
74
+ def expire_id id
75
+ cache.delete id.to_s
76
+ end
77
+
55
78
  def id_to_lex id
56
79
  cache.fetch id.to_s do
57
80
  result = Card.where(id: id).pluck(:name, :left_id, :right_id).first
@@ -60,7 +60,7 @@ class Card
60
60
 
61
61
  card = Card[name]
62
62
  card.update! codename: nil
63
- card.delete! update_referers: true
63
+ card.delete!
64
64
  end
65
65
 
66
66
  # create if card doesn't exist
@@ -3,7 +3,7 @@ class Card
3
3
  # Name-related Card class methods
4
4
  module CardClass
5
5
  def rename! oldname, newname
6
- Card[oldname].update! name: newname, update_referers: true
6
+ Card[oldname].update! name: newname
7
7
  end
8
8
 
9
9
  def uniquify_name name, rename=:new
data/lib/card/name.rb CHANGED
@@ -19,7 +19,7 @@ class Card
19
19
  case cardish
20
20
  when Card then cardish.name
21
21
  when Symbol, Integer then Card.fetch_name(cardish)
22
- when Array then smart_compose cardish
22
+ when Array then compose cardish
23
23
  when String, NilClass then new cardish
24
24
  else
25
25
  raise ArgumentError, "#{cardish.class} not supported as name identifier"
@@ -40,7 +40,7 @@ class Card
40
40
  str = str.to_s
41
41
 
42
42
  if !validated_parts && str.include?(joint)
43
- compose Cardname.split_parts(str)
43
+ string_compose Cardname.split_parts(str)
44
44
  elsif (id = Card.id_from_string str) # handles ~[id] and :[codename]
45
45
  Card.name_from_id_from_string id, str
46
46
  else
@@ -49,16 +49,16 @@ class Card
49
49
  end
50
50
 
51
51
  # interprets symbols/integers as codenames/ids
52
- def smart_compose parts
52
+ def compose parts
53
53
  new_from_parts(parts) { |part| self[part] }
54
54
  end
55
55
 
56
- def compose parts
56
+ private
57
+
58
+ def string_compose parts
57
59
  new_from_parts(parts) { |part| new part }
58
60
  end
59
61
 
60
- private
61
-
62
62
  def new_from_parts parts, &block
63
63
  name_parts = parts.flatten.map(&block)
64
64
  new name_parts.join(joint), true
@@ -0,0 +1,13 @@
1
+ class Card
2
+ module Set
3
+ # Set-related methods included in card class
4
+ # (note: Card::Set::All would follow our naming convention but is in use by the
5
+ # "all" set)
6
+ module CardMethods
7
+ include Event::All
8
+ include Pattern::All
9
+
10
+ delegate :basket, to: Set
11
+ end
12
+ end
13
+ end
@@ -34,6 +34,14 @@ class Card
34
34
  @trigger_hash ||= hash_with_value trigger, true
35
35
  end
36
36
 
37
+ def skip_event? event
38
+ full_skip_hash.key? event.to_s
39
+ end
40
+
41
+ def trigger_event? event
42
+ full_trigger_hash.key? event.to_s
43
+ end
44
+
37
45
  private
38
46
 
39
47
  # "applies always means event can run
@@ -75,7 +75,7 @@ class Card
75
75
  def define_wrap_with_method wrapper_name, wrapper_method_name
76
76
  class_exec(self) do |_format|
77
77
  define_method "wrap_with_#{wrapper_name}" do |*args, &interior|
78
- @interior, opts = interior ? [interior.call, args.first] : args
78
+ voo.interior, opts = interior ? [interior.call, args.first] : args
79
79
  send_wrapper_method wrapper_method_name, opts
80
80
  end
81
81
  end
@@ -7,12 +7,13 @@ class Card
7
7
  # Whenever you create a format block in a set module in a {Cardio::Mod mod}, you
8
8
  # create a format module that is extended with AbstractFormat.
9
9
  module AbstractFormat
10
- include Set::Basket
11
10
  include ViewOpts
12
11
  include ViewDefinition
13
12
  include HamlViews
14
13
  include Wrapper
15
14
 
15
+ delegate :basket, to: Set
16
+
16
17
  # _Views_ are the primary way that both sharks and monkeys interact with cards.
17
18
  # Sharks select views to use in _nests_. Monkeys can define and tweak those
18
19
  # views. These docs will introduce the basics of view definition.
@@ -114,13 +114,12 @@ class Card
114
114
 
115
115
  # make mod ready to include in base (non-set-specific) format classes
116
116
  def register_all_set_format format_class, mod
117
- add_to_array_val modules[:base_format], format_class, mod
117
+ add_to_array_val Set.modules[:base_format], format_class, mod
118
118
  end
119
119
 
120
120
  def register_standard_set_format format_class, mod
121
- format_type = abstract_set? ? :abstract_format : :nonbase_format
122
121
  # ready to include dynamically in set members' format singletons
123
- format_hash = modules[format_type][format_class] ||= {}
122
+ format_hash = Set.modules[set_format_type_key][format_class] ||= {}
124
123
  add_to_array_val format_hash, shortname, mod
125
124
  end
126
125
 
@@ -19,6 +19,20 @@ class Card
19
19
  Pattern.find(pattern_code).anchor_parts_count
20
20
  end
21
21
 
22
+ def set_format_type_key
23
+ :"#{set_type_key}_format"
24
+ end
25
+
26
+ def set_type_key
27
+ if all_set?
28
+ :base
29
+ elsif abstract_set?
30
+ :abstract
31
+ else
32
+ :nonbase
33
+ end
34
+ end
35
+
22
36
  def set_name_parts
23
37
  @set_name_parts ||= name.split "::"
24
38
  end
@@ -39,6 +53,47 @@ class Card
39
53
  def respond_to_missing? method_name, _include_private=false
40
54
  method_name.match? SET_PATTERN_TEST_REGEXP
41
55
  end
56
+
57
+ def modules
58
+ if all_set?
59
+ [self]
60
+ elsif abstract_set?
61
+ [test_set]
62
+ else
63
+ Set.modules[:nonbase][shortname] || []
64
+ end
65
+ end
66
+
67
+ def format_modules format_sym
68
+ type_key = set_format_type_key
69
+ if !type_key || type_key == :base_format
70
+ [format_module(format_sym)]
71
+ elsif abstract_set?
72
+ [test_set.format_module(format_sym)]
73
+ else
74
+ format_class = Card::Format.format_class format: format_sym
75
+ Card::Set.modules[type_key][format_class][shortname] || []
76
+ end
77
+ end
78
+
79
+ def format_module format_sym
80
+ const_get Card::Format.format_class_name(format_sym)
81
+ end
82
+
83
+ def test_set
84
+ # rubocop:disable Lint/Eval
85
+ ::Card::Set::Self.const_remove_if_defined :TestSet
86
+ eval <<-RUBY, binding, __FILE__, __LINE__ + 1
87
+ class ::Card::Set::Self
88
+ module TestSet
89
+ extend Card::Set
90
+ include_set #{name}
91
+ end
92
+ end
93
+ RUBY
94
+ ::Card::Set::Self::TestSet
95
+ # rubocop:enable Lint/Eval
96
+ end
42
97
  end
43
98
  end
44
99
  end
@@ -74,7 +74,7 @@ class Card
74
74
  def each_format_with_mods set
75
75
  set_type = set.abstract_set? ? :abstract : :nonbase
76
76
  format_type = "#{set_type}_format".to_sym
77
- modules[format_type].each_pair { |*args| yield(*args) }
77
+ Set.modules[format_type].each_pair { |*args| yield(*args) }
78
78
  end
79
79
 
80
80
  def applicable_format? format, except, only
@@ -7,18 +7,18 @@ class Card
7
7
  defined? @patterns
8
8
  end
9
9
 
10
- def all_patterns
11
- @all_patterns ||= set_patterns.map { |sub| sub.new self }.compact
10
+ def concrete_patterns
11
+ @concrete_patterns ||= Pattern.concrete.map { |sub| sub.new self }.compact
12
12
  end
13
13
 
14
14
  # new cards do not
15
15
  def patterns
16
- @patterns ||= (new_card? ? all_patterns[1..-1] : all_patterns)
16
+ @patterns ||= (new_card? ? concrete_patterns[1..-1] : concrete_patterns)
17
17
  end
18
18
 
19
19
  def reset_patterns
20
20
  # Rails.logger.info "resetting patterns: #{name}"
21
- @patterns = @all_patterns = nil
21
+ @patterns = @concrete_patterns = nil
22
22
  @template = @virtual = nil
23
23
  @set_mods_loaded = @set_modules = @set_names = @rule_set_keys = nil
24
24
  @junction_only = nil # only applies to set cards
@@ -30,13 +30,14 @@ class Card
30
30
  end
31
31
 
32
32
  def set_modules
33
- @set_modules ||= all_patterns[0..-2].reverse.map(&:module_list).flatten.compact
33
+ @set_modules ||=
34
+ concrete_patterns[0..-2].reverse.map(&:module_list).flatten.compact
34
35
  end
35
36
 
36
37
  def set_format_modules klass
37
38
  @set_format_modules ||= {}
38
39
  @set_format_modules[klass] =
39
- all_patterns[0..-2].reverse.map do |pattern|
40
+ concrete_patterns[0..-2].reverse.map do |pattern|
40
41
  pattern.format_module_list klass
41
42
  end.flatten.compact
42
43
  end
@@ -14,11 +14,11 @@ class Card
14
14
  def register pattern_code, opts={}
15
15
  if (self.pattern_id = Card::Codename.id(pattern_code))
16
16
  self.pattern_code = pattern_code
17
- Card.set_patterns.insert opts.delete(:index).to_i, self
17
+ Pattern.concrete.insert opts.delete(:index).to_i, self
18
18
  self.anchorless = !respond_to?(:anchor_name)
19
19
  opts.each { |key, val| send "#{key}=", val }
20
20
  else
21
- warn "no codename for pattern_code #{pattern_code}"
21
+ warn "no codename for pattern code: #{pattern_code}"
22
22
  end
23
23
  end
24
24