card 1.101.4 → 1.101.5

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 (216) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/config/i18n-tasks.yml +0 -5
  4. data/config/initializers/01_core_extensions/array.rb +2 -1
  5. data/config/initializers/01_core_extensions/hash.rb +1 -0
  6. data/config/initializers/01_core_extensions/object.rb +15 -11
  7. data/config/initializers/02_patches/active_job.rb +1 -1
  8. data/config/initializers/02_patches/active_record.rb +1 -3
  9. data/config/initializers/02_patches/better_errors.rb +1 -3
  10. data/config/initializers/02_patches/kaminari.rb +2 -2
  11. data/config/initializers/deck_config.rb +1 -1
  12. data/config/initializers/inflections.rb +1 -0
  13. data/config/initializers/internationalization.rb +23 -21
  14. data/config/initializers/mime_types.rb +1 -0
  15. data/config/initializers/notification.rb +1 -0
  16. data/config/initializers/patches.rb +6 -5
  17. data/config/locales/en.yml +10 -16
  18. data/db/migrate/20110511221913_require_earlier_migrations.rb +1 -0
  19. data/db/migrate/20121111025347_require_1_10_migrations.rb +1 -0
  20. data/db/migrate/20121118114000_split_link_type.rb +1 -0
  21. data/db/migrate/20121118115000_update_link_type.rb +1 -0
  22. data/db/migrate/20130106052640_table_cleanup.rb +2 -2
  23. data/db/migrate/20130109015336_trunk_left.rb +1 -0
  24. data/db/migrate/20130411210957_update_codenames.rb +1 -0
  25. data/db/migrate/20140822073704_create_new_revision_tables.rb +1 -0
  26. data/db/migrate/20141001105348_move_revisions_to_actions.rb +9 -3
  27. data/db/migrate/20141216053032_better_index_names.rb +9 -6
  28. data/db/migrate/20170908114442_create_delayed_jobs.rb +1 -1
  29. data/db/migrate/20170908114452_increase_text_size_for_delayed_jobs.rb +1 -1
  30. data/db/migrate/20180514152037_add_card_virtuals_table.rb +1 -1
  31. data/db/migrate_core_cards/20120611203506_rails_inflection_updates.rb +2 -1
  32. data/db/migrate_core_cards/20130411191151_renaming_for_menu.rb +9 -9
  33. data/db/migrate_core_cards/20130419215612_import_help_text.rb +3 -2
  34. data/db/migrate_core_cards/20130823192433_add_style_cards.rb +5 -5
  35. data/db/migrate_core_cards/20130910183318_move_styles_to_content.rb +3 -2
  36. data/db/migrate_core_cards/20130920291703_update_stylesheets.rb +2 -4
  37. data/db/migrate_core_cards/20131016172445_common_css_patch.rb +1 -3
  38. data/db/migrate_core_cards/20140110193325_reset_account_request_type.rb +1 -3
  39. data/db/migrate_core_cards/20140307231621_user_data_to_cards.rb +12 -8
  40. data/db/migrate_core_cards/20140317035504_account_requests_to_signups.rb +2 -4
  41. data/db/migrate_core_cards/20140512155840_add_script_cards.rb +16 -9
  42. data/db/migrate_core_cards/20140629222005_add_email_cards.rb +19 -11
  43. data/db/migrate_core_cards/20140725180118_config_card_updates.rb +1 -1
  44. data/db/migrate_core_cards/20141115034214_config_descriptions_etc.rb +1 -1
  45. data/db/migrate_core_cards/20141119001955_make_symlinks_relative.rb +1 -1
  46. data/db/migrate_core_cards/20141204061304_watchers_to_following.rb +2 -0
  47. data/db/migrate_core_cards/20141216155251_add_more_following_cards.rb +4 -2
  48. data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +1 -1
  49. data/db/migrate_core_cards/20150220134731_following_to_follow_rule.rb +3 -4
  50. data/db/migrate_core_cards/20150317162412_bootstrap_themes.rb +8 -4
  51. data/db/migrate_core_cards/20150326205655_bootswatch_themes.rb +14 -7
  52. data/db/migrate_core_cards/20150429090551_search_card_context.rb +6 -4
  53. data/db/migrate_core_cards/20150508212032_menu_compatibility.rb +4 -2
  54. data/db/migrate_core_cards/20150510031118_fix_skin_codenames.rb +2 -1
  55. data/db/migrate_core_cards/20150601133433_add_recent_setting_session_card.rb +3 -3
  56. data/db/migrate_core_cards/20150610171702_add_debugger_session_card.rb +2 -1
  57. data/db/migrate_core_cards/20150610180019_add_recaptcha_key_and_admin_info_cards.rb +4 -3
  58. data/db/migrate_core_cards/20150724123438_update_file_and_image_cards.rb +6 -2
  59. data/db/migrate_core_cards/20150807205221_create_references_for_search_cards.rb +1 -1
  60. data/db/migrate_core_cards/20150824135418_update_file_history.rb +2 -0
  61. data/db/migrate_core_cards/20160804112510_reorganize_scripts.rb +1 -1
  62. data/db/migrate_core_cards/20160811115836_rename_stats_to_admin.rb +1 -0
  63. data/db/migrate_core_cards/20160914132636_fix_mod_files.rb +2 -0
  64. data/db/migrate_core_cards/20161102202156_tweak_recaptcha_setting_cards.rb +6 -6
  65. data/db/migrate_core_cards/20161103154836_update_keys.rb +2 -1
  66. data/db/migrate_core_cards/20170209132834_email_test_context.rb +2 -0
  67. data/db/migrate_core_cards/20170314175313_add_notification_event_card.rb +3 -3
  68. data/db/migrate_core_cards/20170515101262_add_advanced_edit_cards.rb +1 -1
  69. data/db/migrate_core_cards/20170608200649_add_input_options_codename.rb +1 -1
  70. data/db/migrate_core_cards/20180712042655_head_rule.rb +3 -4
  71. data/db/migrate_core_cards/20180905061537_migrate_layouts.rb +4 -4
  72. data/db/migrate_core_cards/20181120200937_update_layout.rb +1 -1
  73. data/db/migrate_core_cards/20190320091257_upgrade_recaptcha_to_v3.rb +7 -7
  74. data/db/migrate_core_cards/20190424100531_update_credit_image.rb +1 -0
  75. data/db/migrate_core_cards/20190502130029_add_shark_and_help_desk_role.rb +15 -14
  76. data/db/migrate_core_cards/20190503122739_update_pristine_data.rb +1 -1
  77. data/db/migrate_core_cards/20190625153616_pointer_overhaul.rb +9 -5
  78. data/db/migrate_core_cards/20190718140126_add_guides.rb +3 -3
  79. data/db/migrate_core_cards/20190822093633_move_help_text_to_code.rb +1 -2
  80. data/db/migrate_core_cards/20190823220018_cleanup_for_decko_1_0.rb +1 -1
  81. data/db/migrate_core_cards/20190829093961_cardtype_grouping.rb +7 -7
  82. data/db/migrate_core_cards/20190902193208_input_type.rb +1 -3
  83. data/db/migrate_core_cards/20190909104250_add_cardtype_input_types.rb +2 -2
  84. data/db/migrate_core_cards/20191028135243_add_link_editor_to_tiny_mce_config.rb +1 -0
  85. data/db/migrate_core_cards/20191115160748_history_cleanup.rb +0 -1
  86. data/db/migrate_core_cards/20191118145629_codename_fixes.rb +1 -2
  87. data/db/migrate_core_cards/20200821231558_add_nest_list_type.rb +1 -1
  88. data/db/seed/new/card_actions.yml +2153 -2145
  89. data/db/seed/new/card_acts.yml +3 -3
  90. data/db/seed/new/card_references.yml +900 -858
  91. data/db/seed/new/cards.yml +4869 -4848
  92. data/db/seed/new/schema_migrations_deck_cards.yml +2 -0
  93. data/db/seed/test/fixtures/card_actions.yml +3563 -3547
  94. data/db/seed/test/fixtures/card_acts.yml +675 -675
  95. data/db/seed/test/fixtures/card_changes.yml +103 -103
  96. data/db/seed/test/fixtures/card_references.yml +2165 -2123
  97. data/db/seed/test/fixtures/cards.yml +7862 -7751
  98. data/db/seed/test/fixtures/schema_migrations_deck_cards.yml +2 -0
  99. data/db/test_seed.rb +33 -34
  100. data/lib/card.rb +1 -0
  101. data/lib/card/auth/token.rb +2 -2
  102. data/lib/card/cache.rb +2 -1
  103. data/lib/card/cache/all.rb +5 -0
  104. data/lib/card/cache/card_class.rb +3 -0
  105. data/lib/card/codename.rb +1 -1
  106. data/lib/card/content.rb +4 -8
  107. data/lib/card/content/chunk.rb +1 -1
  108. data/lib/card/content/clean.rb +4 -3
  109. data/lib/card/content/diff.rb +3 -2
  110. data/lib/card/content/diff/l_c_s/processor.rb +1 -1
  111. data/lib/card/content/diff/result.rb +1 -0
  112. data/lib/card/content/parser.rb +2 -2
  113. data/lib/card/content/truncate.rb +6 -6
  114. data/lib/card/director.rb +1 -1
  115. data/lib/card/director/all.rb +2 -2
  116. data/lib/card/director/card_methods.rb +1 -0
  117. data/lib/card/director/event_delay.rb +4 -6
  118. data/lib/card/director/run.rb +2 -0
  119. data/lib/card/director/stages.rb +3 -2
  120. data/lib/card/env/location.rb +4 -3
  121. data/lib/card/fetch.rb +7 -4
  122. data/lib/card/fetch/all.rb +1 -0
  123. data/lib/card/fetch/card_class.rb +35 -27
  124. data/lib/card/fetch/results.rb +9 -0
  125. data/lib/card/fetch/retrieve.rb +2 -0
  126. data/lib/card/fetch/store.rb +1 -0
  127. data/lib/card/format/content.rb +1 -3
  128. data/lib/card/format/error.rb +6 -1
  129. data/lib/card/format/method_delegation.rb +10 -2
  130. data/lib/card/format/nest.rb +2 -1
  131. data/lib/card/format/nest/fetch.rb +2 -0
  132. data/lib/card/format/nesting/mode.rb +1 -1
  133. data/lib/card/format/nesting/subformat.rb +2 -1
  134. data/lib/card/format/render.rb +2 -2
  135. data/lib/card/format/wrapper.rb +1 -1
  136. data/lib/card/lexicon.rb +3 -2
  137. data/lib/card/mark.rb +17 -15
  138. data/lib/card/model/save_helper.rb +3 -3
  139. data/lib/card/name.rb +10 -9
  140. data/lib/card/name/all.rb +3 -0
  141. data/lib/card/name/all/descendants.rb +3 -4
  142. data/lib/card/name/card_class.rb +2 -0
  143. data/lib/card/name/fields_and_traits.rb +4 -2
  144. data/lib/card/name/name_variants.rb +0 -1
  145. data/lib/card/query.rb +17 -17
  146. data/lib/card/query/card_query/interpretation.rb +1 -0
  147. data/lib/card/query/card_query/match_attributes.rb +2 -1
  148. data/lib/card/query/card_query/normalization.rb +1 -0
  149. data/lib/card/query/card_query/reference_attributes.rb +1 -1
  150. data/lib/card/query/join.rb +1 -1
  151. data/lib/card/query/value/match_value.rb +1 -0
  152. data/lib/card/reference/all.rb +7 -2
  153. data/lib/card/rule/all.rb +1 -0
  154. data/lib/card/rule/cache.rb +2 -0
  155. data/lib/card/set/advanced_api.rb +3 -2
  156. data/lib/card/set/event.rb +2 -2
  157. data/lib/card/set/event/all.rb +6 -0
  158. data/lib/card/set/event/delayed_event.rb +6 -6
  159. data/lib/card/set/event/options.rb +1 -0
  160. data/lib/card/set/format/abstract_format/view_definition.rb +1 -0
  161. data/lib/card/set/format/abstract_format/view_opts.rb +1 -0
  162. data/lib/card/set/i18n_scope.rb +4 -2
  163. data/lib/card/set/inheritance.rb +0 -1
  164. data/lib/card/set/loader.rb +0 -2
  165. data/lib/card/set/pattern/base.rb +3 -2
  166. data/lib/card/set/pattern/class_methods.rb +2 -2
  167. data/lib/card/set/required_field.rb +4 -1
  168. data/lib/card/setting.rb +3 -0
  169. data/lib/card/subcards.rb +3 -4
  170. data/lib/card/tasks/card/file_card_creator/abstract_file_card/ruby_file.rb +1 -1
  171. data/lib/card/tasks/card/file_card_creator/output_helper.rb +2 -4
  172. data/lib/card/tasks/card/migrate.rake +2 -2
  173. data/lib/card/view/cache.rb +6 -8
  174. data/lib/card/view/cache/cache_action.rb +1 -2
  175. data/lib/card/view/cache/stub.rb +1 -1
  176. data/lib/card/view/options.rb +3 -3
  177. data/lib/card/view/permission.rb +1 -0
  178. data/lib/cardio.rb +1 -1
  179. data/lib/cardio/migration.rb +1 -1
  180. data/lib/cardio/migration/deck_structure.rb +2 -4
  181. data/lib/cardio/migration/import.rb +2 -2
  182. data/lib/cardio/migration/import/import_data.rb +1 -0
  183. data/lib/cardio/mod.rb +1 -0
  184. data/lib/cardio/mod/load_strategy.rb +2 -4
  185. data/lib/cardio/mod/loader/set_loader.rb +2 -1
  186. data/lib/cardio/mod/module_template.rb +1 -0
  187. data/lib/cardio/modfiles.rb +2 -4
  188. data/lib/cardio/schema.rb +2 -4
  189. data/lib/cardio/utils.rb +1 -0
  190. data/lib/generators/card/format/format_generator.rb +1 -1
  191. data/lib/generators/card/migration/migration_generator.rb +2 -1
  192. data/lib/generators/card/mod/mod_generator.rb +3 -2
  193. data/lib/generators/card/set/set_generator.rb +3 -3
  194. data/lib/generators/card/template/template_generator.rb +1 -1
  195. data/mod/admin/set/self/admin.rb +6 -3
  196. data/mod/admin/set/self/trash.rb +1 -0
  197. data/mod/admin/spec/set/self/admin_spec.rb +4 -4
  198. data/mod/core/set/all/abort.rb +5 -5
  199. data/mod/core/set/all/assign_attributes.rb +5 -8
  200. data/mod/core/set/all/codename.rb +1 -0
  201. data/mod/core/set/all/collection.rb +4 -6
  202. data/mod/core/set/all/content.rb +3 -2
  203. data/mod/core/set/all/contextual_content.rb +2 -4
  204. data/mod/core/set/all/name_events.rb +13 -6
  205. data/mod/core/set/all/reference_events.rb +2 -0
  206. data/mod/core/set/all/states.rb +3 -3
  207. data/mod/core/set/all/subcards.rb +1 -1
  208. data/mod/core/set/all/trash.rb +5 -1
  209. data/mod/core/set/all/type.rb +4 -2
  210. data/mod/core/set/all/utils.rb +1 -1
  211. data/mod/core/spec/set/all/assign_attributes_spec.rb +10 -9
  212. data/mod/core/spec/set/all/clean_me_spec.rb +19 -4
  213. data/mod/core/spec/set/all/collection_spec.rb +1 -1
  214. data/mod/core/spec/set/all/export_spec.rb +1 -0
  215. data/mod/core/spec/set/all/initialize_spec.rb +11 -11
  216. metadata +4 -4
data/lib/card/director.rb CHANGED
@@ -202,7 +202,7 @@ class Card
202
202
  def main_director
203
203
  return self if main?
204
204
 
205
- Director.act_director || (@parent&.main_director)
205
+ Director.act_director || @parent&.main_director
206
206
  end
207
207
 
208
208
  def to_s level=1
@@ -44,10 +44,10 @@ class Card
44
44
 
45
45
  private
46
46
 
47
- def start_new_act
47
+ def start_new_act &block
48
48
  self.director = nil
49
49
  Director.run_act(self) do
50
- run_callbacks(:act) { yield }
50
+ run_callbacks(:act, &block)
51
51
  end
52
52
  end
53
53
 
@@ -2,6 +2,7 @@ class Card
2
2
  class Director
3
3
  module CardMethods
4
4
  attr_writer :director
5
+
5
6
  delegate :validation_phase, :storage_phase, :integration_phase,
6
7
  :validation_phase_callback?, :integration_phase_callback?, to: :director
7
8
 
@@ -8,11 +8,11 @@ class Card
8
8
  # effect that params changes in the CardController get lost
9
9
  # (a crucial example are success params that are processed in
10
10
  # CardController#soft_redirect)
11
- def contextualize_delayed_event act_id, card, env, auth
11
+ def contextualize_delayed_event act_id, card, env, auth, &block
12
12
  return yield unless delaying?
13
13
 
14
14
  with_env_and_auth env, auth do
15
- with_delay_act(act_id, card) { yield }
15
+ with_delay_act(act_id, card, &block)
16
16
  end
17
17
  end
18
18
 
@@ -32,11 +32,9 @@ class Card
32
32
  end
33
33
  end
34
34
 
35
- def with_env_and_auth env, auth
35
+ def with_env_and_auth env, auth, &block
36
36
  Card::Auth.with auth do
37
- Card::Env.with env do
38
- yield
39
- end
37
+ Card::Env.with env, &block
40
38
  end
41
39
  end
42
40
  end
@@ -40,6 +40,7 @@ class Card
40
40
  @stage ||= -1
41
41
  return false if in_or_after?(next_stage) || ahead_of_parent?(next_stage)
42
42
  return false unless valid_card? next_stage
43
+
43
44
  check_skipped_stage next_stage
44
45
  true
45
46
  end
@@ -50,6 +51,7 @@ class Card
50
51
 
51
52
  def check_skipped_stage stage
52
53
  return unless before? previous_stage_index(stage)
54
+
53
55
  raise Card::Error, "stage #{previous_stage_symbol stage} was " \
54
56
  "skipped for card #{@card}"
55
57
  end
@@ -22,9 +22,9 @@ class Card
22
22
 
23
23
  def stage_index stage
24
24
  case stage
25
- when Symbol then
25
+ when Symbol
26
26
  STAGE_INDEX[stage]
27
- when Integer then
27
+ when Integer
28
28
  stage
29
29
  else
30
30
  raise Card::Error, "not a valid stage: #{stage}"
@@ -33,6 +33,7 @@ class Card
33
33
 
34
34
  def stage_ok? opts
35
35
  return false unless stage
36
+
36
37
  test = %i[during before after].find { |t| opts[t] }
37
38
  test ? send("#{test}?", opts[t]) : true
38
39
  end
@@ -9,7 +9,7 @@ class Card
9
9
  Rails.logger.warn "Pass only strings to card_path. "\
10
10
  "(#{rel_path} = #{rel_path.class})"
11
11
  end
12
- if rel_path =~ %r{^(https?\:)?/}
12
+ if rel_path.match? %r{^(https?:)?/}
13
13
  rel_path
14
14
  else
15
15
  "#{Card.config.relative_url_root}/#{rel_path}"
@@ -17,7 +17,7 @@ class Card
17
17
  end
18
18
 
19
19
  def card_url rel
20
- rel =~ /^https?\:/ ? rel : "#{protocol_and_host}#{card_path rel}"
20
+ rel.match?(/^https?:/) ? rel : "#{protocol_and_host}#{card_path rel}"
21
21
  end
22
22
 
23
23
  def protocol_and_host
@@ -26,6 +26,7 @@ class Card
26
26
 
27
27
  def cardname_from_url url
28
28
  return unless (cardname = cardname_from_url_regexp)
29
+
29
30
  m = url.match cardname
30
31
  m ? Card::Name[m[:mark]] : nil
31
32
  end
@@ -35,7 +36,7 @@ class Card
35
36
  def cardname_from_url_regexp
36
37
  return unless Env[:host]
37
38
 
38
- %r{#{Regexp.escape Env[:host]}/(?<mark>[^\?]+)}
39
+ %r{#{Regexp.escape Env[:host]}/(?<mark>[^?]+)}
39
40
  end
40
41
 
41
42
  extend Location # allows calls on Location constant, eg Location.card_url
data/lib/card/fetch.rb CHANGED
@@ -10,7 +10,6 @@ class Card
10
10
  # see arg options in all/fetch
11
11
  def initialize *args
12
12
  normalize_args args
13
- absolutize_mark
14
13
  validate_opts!
15
14
  end
16
15
 
@@ -31,15 +30,19 @@ class Card
31
30
  def normalize_args args
32
31
  @opts = args.last.is_a?(Hash) ? args.pop : {}
33
32
  @mark = Card.id_or_name args
33
+ normalize_mark
34
34
  end
35
35
 
36
- def absolutize_mark
37
- return unless mark.name? && (supercard = opts.dig(:new, :supercard))
38
- @mark = mark.absolute_name supercard.name
36
+ def normalize_mark
37
+ return unless mark.name?
38
+
39
+ supercard = opts.dig :new, :supercard
40
+ @mark = mark.absolute_name supercard.name if supercard
39
41
  end
40
42
 
41
43
  def validate_opts!
42
44
  return unless opts[:new] && opts[:skip_virtual]
45
+
43
46
  raise Card::Error, "fetch called with new args and skip_virtual"
44
47
  end
45
48
 
@@ -23,6 +23,7 @@ class Card
23
23
  def refresh force=false
24
24
  return self unless force || frozen? || readonly?
25
25
  return unless id
26
+
26
27
  fresh_card = self.class.find id
27
28
  fresh_card.include_set_modules
28
29
  fresh_card
@@ -11,12 +11,14 @@ class Card
11
11
  # * virtual cards
12
12
  #
13
13
  # @param args [Integer, String, Card::Name, Symbol, Array]
14
- # one or more of the three unique identifiers
15
- # 1. a numeric id (Integer)
16
- # 2. a name/key (String or Card::Name)
17
- # 3. a codename (Symbol)
14
+ # Initials args must be one or more "marks," which uniquely idenfify cards:
15
+ # 1. a name/key. (String or Card::Name)
16
+ # 2. a numeric id. Can be (a) an Integer or (b) a String with an integer
17
+ # prefixed with a tilde, eg "~1234"
18
+ # 3. a codename. Can be (a) a Symbol or (b) a String with a colon prefix,
19
+ # eg :mycodename
18
20
  # If you pass more then one mark or an array of marks they get joined with a '+'.
19
- # The final argument can be a hash to set the following options
21
+ # The final argument can be a Hash to set the following options
20
22
  # :skip_virtual Real cards only
21
23
  # :skip_modules Don't load Set modules
22
24
  # :look_in_trash Return trashed card objects
@@ -24,9 +26,10 @@ class Card
24
26
  # new: { opts for Card#new } Return a new card when not found
25
27
  # @return [Card]
26
28
  def fetch *args
27
- Card::Fetch.new(*args)&.retrieve_or_new
29
+ f = Card::Fetch.new(*args)
30
+ f.retrieve_or_new
28
31
  rescue ActiveModel::RangeError => _e
29
- return Card.new name: "card id out of range: #{f.mark}"
32
+ Card.new name: "card id out of range: #{f.mark}"
30
33
  end
31
34
 
32
35
  # fetch only real (no virtual) cards
@@ -83,8 +86,8 @@ class Card
83
86
  elsif block_given?
84
87
  yield.to_name
85
88
  end
86
- rescue => error
87
- rescue_fetch_name error, &block
89
+ rescue StandardError => e
90
+ rescue_fetch_name e, &block
88
91
  end
89
92
 
90
93
  # @param mark - see #fetch
@@ -93,38 +96,43 @@ class Card
93
96
  fetch(*mark, skip_modules: true)&.type_id
94
97
  end
95
98
 
96
- # a fetch method to support the needs of the card controller.
97
- # should be in Decko?
98
- def controller_fetch args
99
- card_opts = controller_fetch_opts args
100
- if args[:action] == "create"
99
+ # Specialized fetching appropriate for cards requested by URI
100
+ # @param params [Hash] hash in the style of parameters expected by Decko
101
+ # @option params [Hash] :card arguments for Card.new
102
+ # @option params [String] :mark.
103
+ # @option params [String] :type shortcut for card[:type]
104
+ # @option params [True/False] :look_in_trash - passed to Card.fetch
105
+ # @option params [True/False] :assign - override attributes of fetched card with
106
+ # card hash
107
+ def uri_fetch params
108
+ card_opts = uri_fetch_opts params
109
+ if params[:action] == "create"
101
110
  # FIXME: we currently need a "new" card to catch duplicates
102
111
  # (otherwise save will just act like a normal update)
103
112
  # We may need a "#create" instance method to handle this checking?
104
113
  Card.new card_opts
105
114
  else
106
- standard_controller_fetch args, card_opts
115
+ standard_uri_fetch params, card_opts
107
116
  end
108
117
  end
109
118
 
110
119
  private
111
120
 
112
- def standard_controller_fetch args, card_opts
113
- mark = args[:mark] || card_opts[:name]
114
- card = Card.fetch mark, skip_modules: true,
115
- look_in_trash: args[:look_in_trash],
116
- new: card_opts
117
- card.assign_attributes card_opts if args[:assign] && card&.real?
121
+ def standard_uri_fetch params, card_opts
122
+ mark = params[:mark] || card_opts[:name]
123
+ card = fetch mark, new: card_opts,
124
+ skip_modules: true,
125
+ look_in_trash: params[:look_in_trash]
126
+ card.assign_attributes card_opts if params[:assign] && card&.real?
118
127
  card&.include_set_modules
119
128
  card
120
129
  end
121
130
 
122
- def controller_fetch_opts args
123
- opts = Env.hash args[:card]
124
- opts[:type] ||= args[:type] if args[:type]
125
- # for /new/:type shortcut. we should handle in routing and deprecate this
126
- opts[:name] ||= Name.url_key_to_standard args[:mark]
127
- opts
131
+ def uri_fetch_opts params
132
+ Env.hash(params[:card]).tap do |opts|
133
+ opts[:type] ||= params[:type] if params[:type] # for /new/:type shortcut.
134
+ opts[:name] ||= Name[params[:mark]]&.tr "_", " "
135
+ end
128
136
  end
129
137
 
130
138
  def rescue_fetch_name error, &block
@@ -4,6 +4,7 @@ class Card
4
4
  module Results
5
5
  def results
6
6
  return if card.nil?
7
+
7
8
  card.new_card? ? new_result_card : finalize_result_card
8
9
  end
9
10
 
@@ -34,6 +35,7 @@ class Card
34
35
 
35
36
  def renew
36
37
  return if new_opts.blank?
38
+
37
39
  # Rails.logger.info "renewing: #{mark}, #{new_opts}"
38
40
  @card = card.dup
39
41
  @card.newish newish_opts
@@ -59,6 +61,7 @@ class Card
59
61
 
60
62
  def update_supercard
61
63
  return unless (sc = new_opts[:supercard])
64
+
62
65
  @card.supercard = sc
63
66
  @card.update_superleft @card.name
64
67
  end
@@ -67,6 +70,7 @@ class Card
67
70
  return true if new_opts.blank?
68
71
  return false if type_change? || name_change?
69
72
  return false if fancy_renew?
73
+
70
74
  quick_content
71
75
  true
72
76
  end
@@ -84,19 +88,23 @@ class Card
84
88
 
85
89
  def quick_content
86
90
  return unless (content = assignable_content(new_opts[:default_content]))
91
+
87
92
  @card.content = content
88
93
  end
89
94
 
90
95
  def name_change?
91
96
  return false unless (new_name = new_opts[:name]&.to_name)
92
97
  return false if new_name.relative? && mark.name? && mark.absolute?
98
+
93
99
  new_name.to_s != @card.name.to_s
94
100
  end
95
101
 
96
102
  def type_change?
97
103
  return true if @card.type_id.nil?
104
+
98
105
  type_id = type_id_from_new_opts
99
106
  return true if !type_id && supercard_might_change_type?
107
+
100
108
  type_id && (type_id != @card.type_id)
101
109
  end
102
110
 
@@ -118,6 +126,7 @@ class Card
118
126
  def assign_name_from_mark
119
127
  return if opts[:local_only]
120
128
  return unless mark&.to_s != card.name
129
+
121
130
  card.name = mark.to_s
122
131
  end
123
132
  end
@@ -5,6 +5,7 @@ class Card
5
5
  # look for card in cache. if that doesn't work, look in database
6
6
  def retrieve_existing
7
7
  return unless mark.present?
8
+
8
9
  retrieve_from_cache || retrieve_from_db
9
10
  end
10
11
 
@@ -26,6 +27,7 @@ class Card
26
27
 
27
28
  def retrieval_from_db_query
28
29
  return unless (query = retrieval_from_db_query_base)
30
+
29
31
  query[:trash] = false unless look_in_trash?
30
32
  query
31
33
  end
@@ -20,6 +20,7 @@ class Card
20
20
  # instantiate a card as a cache placeholder
21
21
  def new_for_cache
22
22
  return unless new_for_cache?
23
+
23
24
  args = { name: mark, skip_modules: true }
24
25
  args[:type_lookup] = :skip if skip_type_lookup?
25
26
  args.merge! new_opts.slice(:type, :type_id, :type_code) if eager_caching?
@@ -2,7 +2,7 @@ class Card
2
2
  class Format
3
3
  module Content
4
4
  def process_content override_content=nil, content_opts=nil, &block
5
- content_obj = content_object override_content , content_opts
5
+ content_obj = content_object override_content, content_opts
6
6
  content_obj.process_chunks(&block)
7
7
  content_obj.to_s
8
8
  end
@@ -82,8 +82,6 @@ class Card
82
82
  content ||= render_raw || ""
83
83
  Card::Content.new content, self, content_opts
84
84
  end
85
-
86
-
87
85
  end
88
86
  end
89
87
  end
@@ -8,6 +8,7 @@ class Card
8
8
 
9
9
  def anyone_can? task
10
10
  return false unless task.is_a? Symbol
11
+
11
12
  @anyone_can ||= {}
12
13
  @anyone_can[task] = card.anyone_can? task if @anyone_can[task].nil?
13
14
  @anyone_can[task]
@@ -29,7 +30,11 @@ class Card
29
30
  end
30
31
 
31
32
  def monitor_depth
32
- raise Card::Error::UserError, t(:format_too_deep) if depth >= Card.config.max_depth
33
+ if depth >= Card.config.max_depth
34
+ raise Card::Error::UserError,
35
+ t(:format_too_deep)
36
+ end
37
+
33
38
  yield
34
39
  end
35
40
 
@@ -46,12 +46,20 @@ class Card
46
46
 
47
47
  def render_args underscore, bang, opts
48
48
  # opts is a list; args is a hash. we're using various inputs to build the hash
49
- (opts[0] ? opts.shift.clone : {}).tap do |args|
50
- args[:optional] = (opts.shift || args[:optional] || :show) unless bang
49
+ interpret_render_opts opts do |args|
50
+ args[:optional] = optional_render_opt opts, args unless bang
51
51
  args[:skip_perms] = true if underscore
52
52
  end
53
53
  end
54
54
 
55
+ def interpret_render_opts opts, &block
56
+ (opts[0] ? opts.shift.clone : {}).tap(&block)
57
+ end
58
+
59
+ def optional_render_opt opts, args
60
+ opts.shift || args[:optional] || :show
61
+ end
62
+
55
63
  def new_action_view
56
64
  CardActionView.new(controller).tap do |t|
57
65
  t.extend CardController._helpers
@@ -5,13 +5,14 @@ class Card
5
5
  include Nest::Fetch
6
6
 
7
7
  attr_accessor :format, :card, :view, :view_opts, :format_opts
8
+
8
9
  def initialize format, cardish, view_opts={}, format_opts={}
9
10
  @format = format
10
11
  @view_opts = view_opts
11
12
  @format_opts = format_opts.clone
12
13
  @override = @format_opts.delete(:override) != false
13
14
  @card ||= fetch_card cardish
14
- # note: fetch_card can alter view and view_opts[:nest_name]
15
+ # NOTE: fetch_card can alter view and view_opts[:nest_name]
15
16
  end
16
17
 
17
18
  def prepare