card 1.101.0 → 1.101.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (287) 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 +2 -4
  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 +137 -525
  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 +3 -2
  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 +2 -2
  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/migrate_core_cards/data/decko_logo.svg +1 -59
  89. data/db/seed/new/card_actions.yml +2153 -2145
  90. data/db/seed/new/card_acts.yml +3 -3
  91. data/db/seed/new/card_references.yml +900 -858
  92. data/db/seed/new/cards.yml +4869 -4848
  93. data/db/seed/new/schema_migrations_deck_cards.yml +2 -0
  94. data/db/seed/test/fixtures/card_actions.yml +3563 -3547
  95. data/db/seed/test/fixtures/card_acts.yml +675 -675
  96. data/db/seed/test/fixtures/card_changes.yml +103 -103
  97. data/db/seed/test/fixtures/card_references.yml +2165 -2123
  98. data/db/seed/test/fixtures/cards.yml +7862 -7751
  99. data/db/seed/test/fixtures/rails.gif +0 -0
  100. data/db/seed/test/fixtures/schema_migrations_deck_cards.yml +2 -0
  101. data/db/test_seed.rb +33 -34
  102. data/lib/card.rb +18 -1
  103. data/lib/card/auth.rb +5 -2
  104. data/lib/card/auth/current.rb +39 -100
  105. data/lib/card/auth/proxy.rb +36 -16
  106. data/lib/card/auth/token.rb +8 -2
  107. data/lib/card/cache.rb +2 -1
  108. data/lib/card/cache/all.rb +88 -0
  109. data/lib/card/cache/card_class.rb +44 -0
  110. data/lib/card/cache/persistent.rb +3 -34
  111. data/lib/card/cache/persistent_class.rb +28 -0
  112. data/lib/card/codename.rb +3 -4
  113. data/lib/card/content.rb +20 -10
  114. data/lib/card/content/all.rb +59 -0
  115. data/lib/card/content/chunk.rb +1 -1
  116. data/lib/card/content/clean.rb +4 -3
  117. data/lib/card/content/diff.rb +3 -2
  118. data/lib/card/content/diff/l_c_s/processor.rb +1 -1
  119. data/lib/card/content/diff/result.rb +41 -29
  120. data/lib/card/content/parser.rb +2 -2
  121. data/lib/card/content/truncate.rb +6 -6
  122. data/lib/card/director.rb +1 -1
  123. data/lib/card/director/act_direction.rb +4 -0
  124. data/lib/card/director/all.rb +61 -0
  125. data/lib/card/director/card_class.rb +18 -0
  126. data/lib/card/director/card_methods.rb +1 -0
  127. data/lib/card/director/event_delay.rb +4 -6
  128. data/lib/card/director/phases.rb +0 -1
  129. data/lib/card/director/run.rb +2 -0
  130. data/lib/card/director/stages.rb +3 -2
  131. data/lib/card/dirty.rb +13 -3
  132. data/lib/card/env.rb +2 -2
  133. data/lib/card/env/location.rb +4 -3
  134. data/lib/card/env/success.rb +46 -103
  135. data/lib/card/env/success/target.rb +73 -0
  136. data/lib/card/error.rb +1 -2
  137. data/lib/card/fetch.rb +7 -4
  138. data/lib/card/fetch/all.rb +33 -0
  139. data/lib/card/fetch/card_class.rb +155 -0
  140. data/lib/card/fetch/results.rb +9 -0
  141. data/lib/card/fetch/retrieve.rb +2 -0
  142. data/lib/card/fetch/store.rb +1 -0
  143. data/lib/card/format.rb +1 -2
  144. data/lib/card/format/content.rb +1 -3
  145. data/lib/card/format/error.rb +8 -4
  146. data/lib/card/format/method_delegation.rb +10 -2
  147. data/lib/card/format/nest.rb +3 -2
  148. data/lib/card/format/nest/fetch.rb +3 -2
  149. data/lib/card/format/nesting/mode.rb +1 -1
  150. data/lib/card/format/nesting/subformat.rb +2 -1
  151. data/lib/card/format/render.rb +2 -2
  152. data/lib/card/format/wrapper.rb +1 -1
  153. data/lib/card/lexicon.rb +5 -4
  154. data/lib/card/mark.rb +17 -15
  155. data/lib/card/model/save_helper.rb +18 -184
  156. data/lib/card/model/save_helper/save_arguments.rb +94 -0
  157. data/lib/card/model/save_helper/save_helper_helper.rb +93 -0
  158. data/lib/card/name.rb +10 -9
  159. data/lib/card/name/all.rb +136 -0
  160. data/lib/card/name/all/descendants.rb +48 -0
  161. data/lib/card/name/all/parts.rb +67 -0
  162. data/lib/card/name/card_class.rb +28 -0
  163. data/lib/card/name/fields_and_traits.rb +4 -2
  164. data/lib/card/name/name_variants.rb +0 -1
  165. data/lib/card/query.rb +24 -19
  166. data/lib/card/query/card_query/interpretation.rb +3 -2
  167. data/lib/card/query/card_query/match_attributes.rb +2 -1
  168. data/lib/card/query/card_query/normalization.rb +1 -0
  169. data/lib/card/query/card_query/reference_attributes.rb +1 -1
  170. data/lib/card/query/card_query/sorting.rb +12 -4
  171. data/lib/card/query/join.rb +1 -1
  172. data/lib/card/query/sql_statement.rb +1 -1
  173. data/lib/card/query/value/match_value.rb +1 -0
  174. data/lib/card/reference/all.rb +136 -0
  175. data/lib/card/rule/all.rb +76 -0
  176. data/lib/card/rule/cache.rb +2 -0
  177. data/lib/card/set/advanced_api.rb +8 -4
  178. data/lib/card/set/event.rb +2 -2
  179. data/lib/card/set/event/all.rb +101 -0
  180. data/lib/card/set/event/delayed_event.rb +6 -6
  181. data/lib/card/set/event/options.rb +14 -5
  182. data/lib/card/set/event/skip_and_trigger.rb +89 -0
  183. data/lib/card/set/format.rb +16 -9
  184. data/lib/card/set/format/abstract_format/view_definition.rb +1 -0
  185. data/lib/card/set/format/abstract_format/view_opts.rb +1 -0
  186. data/lib/card/set/i18n_scope.rb +18 -13
  187. data/lib/card/set/inheritance.rb +8 -6
  188. data/lib/card/set/loader.rb +24 -13
  189. data/lib/card/set/pattern/all.rb +63 -0
  190. data/lib/card/set/pattern/base.rb +4 -74
  191. data/lib/card/set/pattern/class_methods.rb +75 -0
  192. data/lib/card/set/required_field.rb +4 -1
  193. data/lib/card/set/trait.rb +11 -8
  194. data/lib/card/setting.rb +13 -12
  195. data/lib/card/subcards.rb +3 -4
  196. data/lib/card/subcards/add.rb +3 -24
  197. data/lib/card/subcards/all.rb +103 -0
  198. data/lib/card/subcards/args.rb +42 -0
  199. data/lib/card/tasks/card/file_card_creator/abstract_file_card/ruby_file.rb +1 -1
  200. data/lib/card/tasks/card/file_card_creator/output_helper.rb +17 -14
  201. data/lib/card/tasks/card/migrate.rake +2 -2
  202. data/lib/card/view/cache.rb +6 -8
  203. data/lib/card/view/cache/cache_action.rb +1 -2
  204. data/lib/card/view/cache/stub.rb +1 -1
  205. data/lib/card/view/options.rb +5 -4
  206. data/lib/card/view/permission.rb +15 -3
  207. data/lib/cardio.rb +10 -67
  208. data/lib/cardio/defaults.yml +70 -0
  209. data/lib/cardio/migration.rb +2 -2
  210. data/lib/cardio/migration/deck_structure.rb +2 -4
  211. data/lib/cardio/migration/import.rb +3 -3
  212. data/lib/cardio/migration/import/import_data.rb +1 -0
  213. data/lib/cardio/mod.rb +1 -0
  214. data/lib/cardio/mod/dirs.rb +2 -2
  215. data/lib/cardio/mod/load_strategy.rb +2 -4
  216. data/lib/cardio/mod/loader/set_loader.rb +2 -1
  217. data/lib/cardio/mod/loader/set_pattern_loader.rb +0 -1
  218. data/lib/cardio/mod/module_template.rb +1 -0
  219. data/lib/cardio/modfiles.rb +2 -4
  220. data/lib/cardio/schema.rb +2 -4
  221. data/lib/cardio/utils.rb +9 -0
  222. data/lib/generators/card/format/format_generator.rb +1 -1
  223. data/lib/generators/card/migration/migration_generator.rb +2 -1
  224. data/lib/generators/card/mod/mod_generator.rb +3 -2
  225. data/lib/generators/card/set/set_generator.rb +3 -3
  226. data/lib/generators/card/template/template_generator.rb +1 -1
  227. data/mod/admin/set/self/admin.rb +6 -3
  228. data/mod/admin/set/self/admin_info.rb +3 -8
  229. data/mod/admin/set/self/trash.rb +3 -2
  230. data/mod/admin/spec/set/self/admin_spec.rb +4 -4
  231. data/mod/core/set/all/abort.rb +5 -5
  232. data/mod/core/set/all/assign_attributes.rb +12 -28
  233. data/mod/core/set/all/autoname.rb +17 -0
  234. data/mod/core/set/all/codename.rb +3 -2
  235. data/mod/core/set/all/collection.rb +4 -6
  236. data/mod/core/set/all/content.rb +55 -99
  237. data/mod/core/set/all/contextual_content.rb +2 -4
  238. data/mod/core/set/all/initialize.rb +9 -9
  239. data/mod/core/set/all/name_events.rb +78 -58
  240. data/mod/core/set/all/reference_events.rb +69 -0
  241. data/mod/core/set/all/states.rb +5 -5
  242. data/mod/core/set/all/subcards.rb +1 -101
  243. data/mod/core/set/all/trash.rb +16 -14
  244. data/mod/core/set/all/type.rb +11 -11
  245. data/mod/core/set/all/utils.rb +4 -1
  246. data/mod/{settings → core}/set/right/autoname.rb +0 -0
  247. data/mod/{settings → core}/set/self/autoname.rb +0 -0
  248. data/mod/core/set/type/cardtype.rb +28 -0
  249. data/mod/core/set_pattern/06_rule.rb +1 -1
  250. data/mod/core/spec/set/all/assign_attributes_spec.rb +10 -9
  251. data/mod/core/spec/set/all/{rules2_spec.rb → clean_me_spec.rb} +19 -4
  252. data/mod/core/spec/set/all/collection_spec.rb +1 -1
  253. data/mod/core/spec/set/all/export_spec.rb +1 -0
  254. data/mod/core/spec/set/all/initialize_spec.rb +11 -11
  255. data/mod/core/spec/set/all/name_events_spec.rb +204 -0
  256. data/mod/{standard → core}/spec/set/type/cardtype_spec.rb +3 -24
  257. data/mod/standard/file/logo/image-original.svg +1 -59
  258. metadata +50 -61
  259. data/config/initializers/uuid_state_file.rb +0 -3
  260. data/lib/card/mod_inflector.rb +0 -16
  261. data/mod/Modfile +0 -4
  262. data/mod/core/set/all/actify.rb +0 -68
  263. data/mod/core/set/all/cache.rb +0 -109
  264. data/mod/core/set/all/event_conditions.rb +0 -172
  265. data/mod/core/set/all/fetch.rb +0 -122
  266. data/mod/core/set/all/fetch_helper.rb +0 -35
  267. data/mod/core/set/all/i18n.rb +0 -11
  268. data/mod/core/set/all/name.rb +0 -229
  269. data/mod/core/set/all/pattern.rb +0 -54
  270. data/mod/core/set/all/references.rb +0 -191
  271. data/mod/core/set/all/rename.rb +0 -33
  272. data/mod/core/set/all/rules.rb +0 -81
  273. data/mod/core/spec/set/all/actify_spec.rb +0 -58
  274. data/mod/core/spec/set/all/content_spec.rb +0 -15
  275. data/mod/core/spec/set/all/event_conditions_spec.rb +0 -217
  276. data/mod/core/spec/set/all/fetch_helper_spec.rb +0 -65
  277. data/mod/core/spec/set/all/fetch_spec.rb +0 -338
  278. data/mod/core/spec/set/all/i18n_spec.rb +0 -17
  279. data/mod/core/spec/set/all/name_spec.rb +0 -11
  280. data/mod/core/spec/set/all/pattern_spec.rb +0 -101
  281. data/mod/core/spec/set/all/permissions/reader_rules_spec.rb +0 -166
  282. data/mod/core/spec/set/all/references_spec.rb +0 -62
  283. data/mod/core/spec/set/all/rename_spec.rb +0 -189
  284. data/mod/core/spec/set/all/rules_spec.rb +0 -100
  285. data/mod/core/spec/set/all/subcards_spec.rb +0 -102
  286. data/mod/standard/set/all/rich_html/html_views/info.rb +0 -84
  287. data/mod/standard/set/type/cardtype.rb +0 -119
@@ -2,10 +2,11 @@ class Card
2
2
  module Env
3
3
  # Success objects
4
4
  class Success
5
- include Card::Env::Location
5
+ include Location
6
+ include Target
6
7
 
7
- attr_accessor :redirect, :name, :name_context, :reload
8
- attr_writer :params, :card
8
+ attr_accessor :name, :name_context, :reload
9
+ attr_writer :params, :redirect, :card
9
10
  attr_reader :id
10
11
 
11
12
  def initialize name_context=nil, success_args=nil
@@ -15,102 +16,30 @@ class Card
15
16
  self << normalize_success_args(success_args)
16
17
  end
17
18
 
19
+ def to_url name_context=@name_context
20
+ target = target name_context
21
+ target.is_a?(Card) ? target.format.path(params) : target
22
+ end
23
+
18
24
  def in_context name_context
19
25
  self.name_context = name_context
20
26
  self
21
27
  end
22
28
 
23
- def normalize_success_args success_args
24
- case success_args
25
- when nil
26
- self.mark = "_self"
27
- {}
28
- when ActionController::Parameters
29
- success_args.to_unsafe_h
30
- else
31
- success_args
32
- end
33
- end
34
-
35
29
  def << value
36
30
  if value.is_a? Hash
37
31
  apply value
38
32
  else
39
- self.target = value
33
+ self.mark = value
40
34
  end
41
35
  end
42
36
 
43
- def reload?
44
- @reload.to_s == "true"
37
+ def redirect
38
+ @redirect.present? ? @redirect : false
45
39
  end
46
40
 
47
- # TODO: refactor to use cardish
48
- def mark= value
49
- case value
50
- when Integer then @id = value
51
- when String then @name = value
52
- when Card then @card = value
53
- else
54
- self.target = value
55
- end
56
- end
57
-
58
- # @deprecated
59
- def id= id
60
- # for backwards compatibility use mark here.
61
- # id was often used for the card name
62
- self.mark = id
63
- end
64
-
65
- def type= type
66
- @new_args[:type] = type
67
- end
68
-
69
- def type_id= type_id
70
- @new_args[:type_id] = type_id.to_i
71
- end
72
-
73
- def content= content
74
- @new_args[:content] = content
75
- end
76
-
77
- def target= value
78
- @id = @name = @card = nil
79
- @target = process_target value
80
- end
81
-
82
- def process_target value
83
- case value
84
- when "" then ""
85
- when "*previous", :previous then :previous
86
- when %r{^(http|/)} then value
87
- when /^REDIRECT:\s*(.+)/
88
- @redirect = true
89
- process_target Regexp.last_match(1)
90
- else self.mark = value
91
- end
92
- end
93
-
94
- def apply hash
95
- hash.each_pair do |key, value|
96
- self[key] = value
97
- end
98
- end
99
-
100
- def card name_context=@name_context
101
- if @card
102
- @card
103
- elsif @id
104
- Card.fetch @id
105
- elsif @name
106
- Card.fetch @name.to_name.absolute(name_context), new: @new_args
107
- end
108
- end
109
-
110
- def target name_context=@name_context
111
- card(name_context) ||
112
- (@target == :previous ? Card::Env.previous_location : @target) ||
113
- Card.fetch(name_context)
41
+ def reload?
42
+ @reload.to_s == "true"
114
43
  end
115
44
 
116
45
  def []= key, value
@@ -139,32 +68,46 @@ class Card
139
68
  @params.marshal_dump
140
69
  end
141
70
 
142
- def raw_params
143
- @params
71
+ def session
72
+ Card::Env.session
144
73
  end
145
74
 
146
- def to_url name_context=@name_context
147
- case (target = target(name_context))
148
- when Card
149
- target.format.path params
150
- else
151
- target
152
- end
75
+ private
76
+
77
+ def respond_to_missing? method, _include_private=false
78
+ method.match?(/^(\w+)=?$/) || super
153
79
  end
154
80
 
155
81
  def method_missing method, *args
156
- case method
157
- when /^(\w+)=$/
158
- self[Regexp.last_match(1).to_sym] = args[0]
159
- when /^(\w+)$/
160
- self[Regexp.last_match(1).to_sym]
161
- else
162
- super
82
+ return super unless (m = method.match(/^(\w+(=)?)/))
83
+
84
+ infer_bracket m[1].to_sym, m[2], args[0]
85
+ end
86
+
87
+ def infer_bracket method, assign, val
88
+ args = [method]
89
+ args << val if assign
90
+ @params.send(*args)
91
+ end
92
+
93
+ def apply hash
94
+ hash.each_pair do |key, value|
95
+ next unless value.present?
96
+
97
+ self[key] = value
163
98
  end
164
99
  end
165
100
 
166
- def session
167
- Card::Env.session
101
+ def normalize_success_args success_args
102
+ case success_args
103
+ when nil
104
+ self.mark = "_self"
105
+ {}
106
+ when ActionController::Parameters
107
+ success_args.to_unsafe_h
108
+ else
109
+ success_args
110
+ end
168
111
  end
169
112
  end
170
113
  end
@@ -0,0 +1,73 @@
1
+ class Card
2
+ module Env
3
+ class Success
4
+ # The success "target" is the destination upon success.
5
+ #
6
+ # @card, @name, @id, etc all refer to the target card
7
+ module Target
8
+ def target= value
9
+ @id = @name = @card = nil
10
+ @target = process_target value
11
+ end
12
+
13
+ def target name_context=@name_context
14
+ card(name_context) || @target || Card.fetch(name_context)
15
+ end
16
+
17
+ # TODO: refactor to use cardish
18
+ def mark= value
19
+ case value
20
+ when Integer then @id = value
21
+ when Card then @card = value
22
+ else
23
+ self.target = value
24
+ end
25
+ end
26
+
27
+ # @deprecated
28
+ def id= id
29
+ # for backwards compatibility use mark here.
30
+ # id was often used for the card name
31
+ self.mark = id
32
+ end
33
+
34
+ def type= type
35
+ @new_args[:type] = type
36
+ end
37
+
38
+ def type_id= type_id
39
+ @new_args[:type_id] = type_id.to_i
40
+ end
41
+
42
+ def content= content
43
+ @new_args[:content] = content
44
+ end
45
+
46
+ def card name_context=@name_context
47
+ if @card
48
+ @card
49
+ elsif @id
50
+ Card.fetch @id
51
+ elsif @name
52
+ Card.fetch @name.to_name.absolute(name_context), new: @new_args
53
+ end
54
+ end
55
+
56
+ private
57
+
58
+ def process_target value
59
+ case value
60
+ when ""
61
+ ""
62
+ when "*previous", ":previous", :previous
63
+ Card::Env.previous_location
64
+ when %r{^(http|/)}
65
+ value
66
+ else
67
+ @name = Name[value]
68
+ end
69
+ end
70
+ end
71
+ end
72
+ end
73
+ end
data/lib/card/error.rb CHANGED
@@ -22,8 +22,7 @@ class Card
22
22
  end
23
23
 
24
24
  def message_from_card
25
- I18n.t :exception_for_card,
26
- scope: %i[lib card error], cardname: card.name, message: card_message_text
25
+ Cardio.t :lib_exception_for_card, cardname: card.name, message: card_message_text
27
26
  end
28
27
 
29
28
  def backtrace
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
 
@@ -0,0 +1,33 @@
1
+ class Card
2
+ class Fetch
3
+ # fetch-related Card instance methods
4
+ module All
5
+ # fetching from the context of a card
6
+ def fetch traits, opts={}
7
+ opts[:new][:supercard] = self if opts[:new]
8
+ Array.wrap(traits).inject(self) do |card, trait|
9
+ Card.fetch card.name.trait(trait), opts
10
+ end
11
+ end
12
+
13
+ def newish opts
14
+ reset_patterns
15
+ Card.with_normalized_new_args opts do |norm_opts|
16
+ handle_type norm_opts do
17
+ assign_attributes norm_opts
18
+ self.name = name # trigger superize_name
19
+ end
20
+ end
21
+ end
22
+
23
+ def refresh force=false
24
+ return self unless force || frozen? || readonly?
25
+ return unless id
26
+
27
+ fresh_card = self.class.find id
28
+ fresh_card.include_set_modules
29
+ fresh_card
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,155 @@
1
+ class Card
2
+ class Fetch
3
+ # = Card#fetch
4
+ #
5
+ # A multipurpose retrieval operator that integrates caching, database lookups,
6
+ # and "virtual" card construction
7
+ module CardClass
8
+ # Look for cards in
9
+ # * cache
10
+ # * database
11
+ # * virtual cards
12
+ #
13
+ # @param args [Integer, String, Card::Name, Symbol, Array]
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
20
+ # If you pass more then one mark or an array of marks they get joined with a '+'.
21
+ # The final argument can be a Hash to set the following options
22
+ # :skip_virtual Real cards only
23
+ # :skip_modules Don't load Set modules
24
+ # :look_in_trash Return trashed card objects
25
+ # :local_only Use only local cache for lookup and storing
26
+ # new: { opts for Card#new } Return a new card when not found
27
+ # @return [Card]
28
+ def fetch *args
29
+ f = Card::Fetch.new(*args)
30
+ f.retrieve_or_new
31
+ rescue ActiveModel::RangeError => _e
32
+ Card.new name: "card id out of range: #{f.mark}"
33
+ end
34
+
35
+ # fetch only real (no virtual) cards
36
+ #
37
+ # @param mark - see #fetch
38
+ # @return [Card]
39
+ def [] *mark
40
+ fetch(*mark, skip_virtual: true)
41
+ end
42
+
43
+ # fetch real cards without set modules loaded. Should only be used for
44
+ # simple attributes
45
+ #
46
+ # @example
47
+ # quick_fetch "A", :self, :structure
48
+ #
49
+ # @param mark - see #fetch
50
+ # @return [Card]
51
+ def quick_fetch *mark
52
+ fetch(*mark, skip_virtual: true, skip_modules: true)
53
+ end
54
+
55
+ # @return [Card]
56
+ def fetch_from_cast cast
57
+ fetch_args = cast[:id] ? [cast[:id].to_i] : [cast[:name], { new: cast }]
58
+ fetch(*fetch_args)
59
+ end
60
+
61
+ #----------------------------------------------------------------------
62
+ # ATTRIBUTE FETCHING
63
+ # The following methods optimize fetching of specific attributes
64
+
65
+ def id cardish
66
+ case cardish
67
+ when Integer then cardish
68
+ when Card then cardish.id
69
+ when Symbol then Card::Codename.id cardish
70
+ else fetch_id cardish
71
+ end
72
+ end
73
+
74
+ # @param mark_parts - see #fetch
75
+ # @return [Integer]
76
+ def fetch_id *mark_parts
77
+ mark = Card::Fetch.new(*mark_parts)&.mark
78
+ mark.is_a?(Integer) ? mark : quick_fetch(mark.to_s)&.id
79
+ end
80
+
81
+ # @param mark - see #fetch
82
+ # @return [Card::Name]
83
+ def fetch_name *mark, &block
84
+ if (card = quick_fetch(*mark))
85
+ card.name
86
+ elsif block_given?
87
+ yield.to_name
88
+ end
89
+ rescue StandardError => e
90
+ rescue_fetch_name e, &block
91
+ end
92
+
93
+ # @param mark - see #fetch
94
+ # @return [Integer]
95
+ def fetch_type_id *mark
96
+ fetch(*mark, skip_modules: true)&.type_id
97
+ end
98
+
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"
110
+ # FIXME: we currently need a "new" card to catch duplicates
111
+ # (otherwise save will just act like a normal update)
112
+ # We may need a "#create" instance method to handle this checking?
113
+ Card.new card_opts
114
+ else
115
+ standard_uri_fetch params, card_opts
116
+ end
117
+ end
118
+
119
+ private
120
+
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?
127
+ card&.include_set_modules
128
+ card
129
+ end
130
+
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
136
+ end
137
+
138
+ def rescue_fetch_name error, &block
139
+ if rescued_fetch_name_to_name? error, &block
140
+ yield.to_name
141
+ elsif error.is_a? ActiveModel::RangeError
142
+ nil
143
+ else
144
+ raise error
145
+ end
146
+ end
147
+
148
+ def rescued_fetch_name_to_name? error
149
+ return unless block_given?
150
+
151
+ error.is_a?(ActiveModel::RangeError) || error.is_a?(Error::CodenameNotFound)
152
+ end
153
+ end
154
+ end
155
+ end