card 1.104.2 → 1.105.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (390) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -6
  3. data/VERSION +1 -1
  4. data/config/environments/development.rb +1 -1
  5. data/config/environments/test.rb +1 -0
  6. data/config/initializers/01_core_extensions/object.rb +10 -0
  7. data/config/initializers/01_core_extensions/string.rb +9 -0
  8. data/config/initializers/core_extensions.rb +1 -0
  9. data/db/migrate/{20160122153608_new_indeces.rb → 20160122153608_new_indices.rb} +2 -2
  10. data/db/migrate/{20200805200729_add_unique_pair_indeces.rb → 20200805200729_add_unique_pair_indices.rb} +1 -1
  11. data/db/migrate/20221031182227_remove_referee_key_requirement.rb +11 -0
  12. data/db/migrate_core_cards/20130920291703_update_stylesheets.rb +1 -9
  13. data/db/migrate_core_cards/20140307231621_user_data_to_cards.rb +1 -38
  14. data/db/migrate_core_cards/20161103154836_update_keys.rb +1 -1
  15. data/db/migrate_core_cards/20180905061537_migrate_layouts.rb +1 -1
  16. data/db/migrate_core_cards/20190125125150_add_script_rules_card.rb +1 -1
  17. data/db/migrate_core_cards/20190320091257_upgrade_recaptcha_to_v3.rb +1 -1
  18. data/db/migrate_core_cards/20190502130029_add_shark_and_help_desk_role.rb +2 -20
  19. data/db/migrate_core_cards/20190528131330_enabled_roles.rb +0 -3
  20. data/db/migrate_core_cards/20190625153616_pointer_overhaul.rb +0 -2
  21. data/db/migrate_core_cards/20190718140126_add_guides.rb +1 -1
  22. data/db/migrate_core_cards/20190822093633_move_help_text_to_code.rb +1 -1
  23. data/db/migrate_core_cards/20190829205148_remove_add_help.rb +1 -1
  24. data/db/migrate_core_cards/20190902193208_input_type.rb +1 -1
  25. data/db/migrate_core_cards/20190909104250_add_cardtype_input_types.rb +2 -2
  26. data/db/schema.rb +2 -2
  27. data/db/seeds.rb +14 -1
  28. data/db/version.txt +1 -1
  29. data/lib/card/auth/current.rb +4 -2
  30. data/lib/card/auth/permissions.rb +1 -1
  31. data/lib/card/auth/setup.rb +1 -1
  32. data/lib/card/auth/token.rb +1 -1
  33. data/lib/card/cache/persistent.rb +4 -1
  34. data/lib/card/codename.rb +2 -6
  35. data/lib/card/content/all.rb +2 -2
  36. data/lib/card/content/clean.rb +1 -1
  37. data/lib/card/content/parser.rb +0 -2
  38. data/lib/card/content.rb +1 -8
  39. data/lib/card/director/all.rb +67 -0
  40. data/lib/card/director/card_class.rb +158 -2
  41. data/lib/card/director/{act_direction.rb → class_methods.rb} +13 -3
  42. data/lib/card/director/phases.rb +7 -4
  43. data/lib/card/director/run.rb +51 -50
  44. data/lib/card/director/stages.rb +18 -16
  45. data/lib/card/director/store.rb +1 -1
  46. data/lib/card/director.rb +6 -7
  47. data/lib/card/env/location.rb +1 -1
  48. data/lib/card/env/serializable.rb +2 -0
  49. data/lib/card/env/serialization.rb +2 -3
  50. data/lib/card/env.rb +2 -2
  51. data/lib/card/error.rb +9 -5
  52. data/lib/card/format/error.rb +6 -12
  53. data/lib/card/format/nest.rb +1 -1
  54. data/lib/card/format/wrapper.rb +1 -1
  55. data/lib/card/format.rb +4 -0
  56. data/lib/card/model/save_helper/save_arguments.rb +0 -44
  57. data/lib/card/model/save_helper/save_helper_helper.rb +0 -37
  58. data/lib/card/model/save_helper.rb +0 -82
  59. data/lib/card/name/all.rb +1 -4
  60. data/lib/card/name/card_class.rb +0 -2
  61. data/lib/card/name/name_variants.rb +4 -0
  62. data/lib/card/name.rb +0 -5
  63. data/lib/card/query/abstract_query/query_helper.rb +3 -5
  64. data/lib/card/query/abstract_query/tie.rb +1 -1
  65. data/lib/card/query/abstract_query.rb +36 -17
  66. data/lib/card/query/card_class.rb +36 -0
  67. data/lib/card/query/card_query/custom.rb +12 -0
  68. data/lib/card/query/card_query/interpretation.rb +1 -0
  69. data/lib/card/query/card_query/normalization.rb +11 -3
  70. data/lib/card/query/card_query/reference_attributes.rb +3 -2
  71. data/lib/card/query/card_query/sorting.rb +5 -4
  72. data/lib/card/query/card_query.rb +1 -0
  73. data/lib/card/query/sql_statement/order.rb +12 -10
  74. data/lib/card/query/sql_statement/where.rb +2 -2
  75. data/lib/card/query.rb +5 -1
  76. data/lib/card/reference/all.rb +10 -10
  77. data/lib/card/set/advanced_api.rb +1 -1
  78. data/lib/card/set/event/all.rb +9 -1
  79. data/lib/card/set/event/delayed_event.rb +4 -2
  80. data/lib/card/set/event/options.rb +1 -1
  81. data/lib/card/set/event/skip_and_trigger.rb +34 -10
  82. data/lib/card/set/format/abstract_format/haml_views.rb +3 -3
  83. data/lib/card/set/format/abstract_format.rb +1 -1
  84. data/lib/card/set/format/haml_paths.rb +5 -21
  85. data/lib/card/set/inheritance.rb +4 -4
  86. data/lib/card/set/pattern/all.rb +1 -1
  87. data/lib/card/set/pattern/base.rb +1 -1
  88. data/lib/card/set/pattern/class_methods.rb +4 -4
  89. data/lib/card/set/trait.rb +1 -1
  90. data/lib/card/set/type.rb +0 -41
  91. data/lib/card/setting.rb +0 -1
  92. data/lib/card/subcards/all.rb +6 -8
  93. data/lib/card/subcards/args.rb +9 -9
  94. data/lib/card/view/cache/cache_action.rb +1 -1
  95. data/lib/card/view/options/visibility.rb +4 -0
  96. data/lib/card/view/options.rb +1 -0
  97. data/lib/card/view/permission.rb +12 -4
  98. data/lib/card/view.rb +4 -0
  99. data/lib/card.rb +18 -27
  100. data/lib/cardio/cli.rb +3 -1
  101. data/lib/cardio/command/application.rb +5 -0
  102. data/lib/cardio/{commands/command.rb → command/command_base.rb} +2 -2
  103. data/lib/cardio/{commands → command}/custom.rb +16 -13
  104. data/lib/cardio/{commands → command}/rake_command/parser.rb +3 -3
  105. data/lib/cardio/{commands → command}/rake_command.rb +4 -4
  106. data/lib/cardio/{commands → command}/rspec_command/parser.rb +2 -2
  107. data/lib/cardio/{commands → command}/rspec_command.rb +7 -9
  108. data/lib/cardio/command.rb +129 -0
  109. data/lib/cardio/commands.rb +17 -116
  110. data/lib/cardio/generators/deck_generator_loader.rb +1 -0
  111. data/lib/cardio/generators.rb +2 -2
  112. data/lib/cardio/migration.rb +3 -53
  113. data/lib/cardio/mod/class_methods.rb +26 -22
  114. data/lib/cardio/mod/dirs.rb +29 -22
  115. data/lib/cardio/mod/eat/edibles.rb +22 -15
  116. data/lib/cardio/mod/eat.rb +18 -14
  117. data/lib/cardio/mod/load_strategy/set_tmp_files.rb +1 -1
  118. data/lib/cardio/mod/load_strategy.rb +12 -2
  119. data/lib/cardio/mod/modfile_api.rb +18 -18
  120. data/lib/cardio/mod/{poop.rb → sow.rb} +10 -18
  121. data/lib/cardio/mod.rb +21 -30
  122. data/lib/cardio/railtie.rb +19 -56
  123. data/lib/cardio/schema.rb +2 -1
  124. data/lib/cardio/script_loader.rb +3 -1
  125. data/lib/cardio/seed.rb +101 -8
  126. data/lib/cardio/utils.rb +39 -1
  127. data/lib/generators/deck/deck_generator.rb +5 -2
  128. data/lib/generators/deck/templates/config/puma.rb +1 -1
  129. data/lib/generators/deck/templates/script/decko_rspec +1 -1
  130. data/lib/generators/deck/templates/simplecov.rb.erb +10 -8
  131. data/lib/generators/mod/USAGE +1 -1
  132. data/lib/generators/set/USAGE +2 -2
  133. data/mod/core/data/fixtures/real/card_actions.yml +78 -0
  134. data/{db/seed/new → mod/core/data/fixtures/real}/card_acts.yml +2 -2
  135. data/{db/seed/new → mod/core/data/fixtures/real}/card_changes.yml +0 -0
  136. data/mod/core/data/fixtures/real/card_references.yml +8 -0
  137. data/mod/core/data/fixtures/real/cards.yml +135 -0
  138. data/{db/seed/new → mod/core/data/fixtures/real}/schema_migrations.yml +0 -0
  139. data/{db/seed/new → mod/core/data/fixtures/real}/schema_migrations_core_cards.yml +0 -0
  140. data/{db/seed/new → mod/core/data/fixtures/real}/schema_migrations_deck.yml +0 -0
  141. data/{db/seed/new → mod/core/data/fixtures/real}/schema_migrations_deck_cards.yml +0 -0
  142. data/mod/core/data/real.yml +79 -0
  143. data/mod/core/data/test/cardtype.yml +38 -0
  144. data/mod/core/data/test/sample.yml +50 -0
  145. data/mod/core/data/test/user.yml +41 -0
  146. data/mod/core/data/test.yml +79 -28
  147. data/mod/core/lib/tasks/card/assets.rake +17 -0
  148. data/{lib → mod/core/lib}/tasks/card/create.rake +0 -0
  149. data/{lib → mod/core/lib}/tasks/card/migrate.rake +4 -0
  150. data/{lib → mod/core/lib}/tasks/card/mod.rake +4 -3
  151. data/mod/core/lib/tasks/card/seed.rake +58 -0
  152. data/mod/core/lib/tasks/card.rake +115 -0
  153. data/mod/core/locales/de.yml +4 -0
  154. data/mod/core/locales/en.yml +13 -0
  155. data/mod/core/set/all/admin.rb +14 -0
  156. data/mod/core/set/all/codename.rb +4 -0
  157. data/mod/core/set/all/content.rb +8 -4
  158. data/mod/core/set/all/{abort.rb → result.rb} +11 -15
  159. data/mod/core/set/all/states.rb +15 -1
  160. data/mod/core/set/all/trash.rb +25 -73
  161. data/mod/core/set/all/type.rb +2 -2
  162. data/mod/core/set/all/utils.rb +3 -87
  163. data/mod/core/set/right/autoname.rb +2 -0
  164. data/mod/core/set/self/admin/warning_alert.haml +3 -0
  165. data/mod/core/set/self/admin.rb +173 -0
  166. data/mod/core/set/type/cardtype.rb +2 -0
  167. data/mod/core/set_pattern/02_all_plus.rb +1 -1
  168. data/mod/core/set_pattern/05_rstar.rb +1 -1
  169. data/mod/core/set_pattern/06_rule.rb +1 -1
  170. data/mod/core/set_pattern/07_right.rb +1 -1
  171. data/mod/core/set_pattern/08_type_plus_right.rb +1 -1
  172. data/mod/core/spec/set/all/assign_attributes_spec.rb +3 -3
  173. data/mod/core/spec/set/all/autoname_spec.rb +25 -0
  174. data/mod/core/spec/set/all/codename_spec.rb +1 -1
  175. data/mod/core/spec/set/all/name_events_spec.rb +43 -66
  176. data/mod/core/spec/set/all/trash_spec.rb +149 -68
  177. data/mod/{admin → core}/spec/set/self/admin_spec.rb +25 -22
  178. data/mod/core/spec/set/self/trash_spec.rb +5 -0
  179. metadata +88 -251
  180. data/db/migrate_core_cards/20130411211600_delete_old_related_tab_cards.rb +0 -18
  181. data/db/migrate_core_cards/20130419215612_import_help_text.rb +0 -13
  182. data/db/migrate_core_cards/20130823192433_add_style_cards.rb +0 -100
  183. data/db/migrate_core_cards/20130910183318_move_styles_to_content.rb +0 -11
  184. data/db/migrate_core_cards/20130927191728_account_events.rb +0 -20
  185. data/db/migrate_core_cards/20131016172445_common_css_patch.rb +0 -9
  186. data/db/migrate_core_cards/20140110193325_reset_account_request_type.rb +0 -8
  187. data/db/migrate_core_cards/20140512155840_add_script_cards.rb +0 -86
  188. data/db/migrate_core_cards/20140629222005_add_email_cards.rb +0 -132
  189. data/db/migrate_core_cards/20140725180118_config_card_updates.rb +0 -9
  190. data/db/migrate_core_cards/20141111083921_delete_machine_output.rb +0 -7
  191. data/db/migrate_core_cards/20141115034214_config_descriptions_etc.rb +0 -14
  192. data/db/migrate_core_cards/20141119001955_make_symlinks_relative.rb +0 -15
  193. data/db/migrate_core_cards/20141120120605_fix_notification_html_message.rb +0 -10
  194. data/db/migrate_core_cards/20141216155251_add_more_following_cards.rb +0 -26
  195. data/db/migrate_core_cards/20141230204340_uri_codename.rb +0 -13
  196. data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +0 -76
  197. data/db/migrate_core_cards/20150317162412_bootstrap_themes.rb +0 -41
  198. data/db/migrate_core_cards/20150326205655_bootswatch_themes.rb +0 -36
  199. data/db/migrate_core_cards/20150331135745_new_card_menu.rb +0 -8
  200. data/db/migrate_core_cards/20150501010515_responsive_sidebar.rb +0 -11
  201. data/db/migrate_core_cards/20150508212032_menu_compatibility.rb +0 -24
  202. data/db/migrate_core_cards/20150528084659_add_session_cardtype.rb +0 -18
  203. data/db/migrate_core_cards/20150601133433_add_recent_setting_session_card.rb +0 -18
  204. data/db/migrate_core_cards/20150610171702_add_debugger_session_card.rb +0 -12
  205. data/db/migrate_core_cards/20150610180019_add_recaptcha_key_and_admin_info_cards.rb +0 -58
  206. data/db/migrate_core_cards/20150627205133_fix_script_bootstrap_card_type.rb +0 -7
  207. data/db/migrate_core_cards/20150702130543_remove_edit_toolbar_pinned.rb +0 -9
  208. data/db/migrate_core_cards/20150708224756_add_list_cards.rb +0 -29
  209. data/db/migrate_core_cards/20150903130006_attachment_upload_cards.rb +0 -15
  210. data/db/migrate_core_cards/20150910085603_remove_performance_log_card.rb +0 -10
  211. data/db/migrate_core_cards/20151120180631_add_token_expiration.rb +0 -7
  212. data/db/migrate_core_cards/20160801143221_change_bootstrap_card_type_to_scss.rb +0 -10
  213. data/db/migrate_core_cards/20160804112510_reorganize_scripts.rb +0 -27
  214. data/db/migrate_core_cards/20160908154210_add_trash_card.rb +0 -7
  215. data/db/migrate_core_cards/20161102202156_tweak_recaptcha_setting_cards.rb +0 -17
  216. data/db/migrate_core_cards/20170209132834_email_test_context.rb +0 -49
  217. data/db/migrate_core_cards/20170314175313_add_notification_event_card.rb +0 -20
  218. data/db/migrate_core_cards/20170515101262_add_advanced_edit_cards.rb +0 -20
  219. data/db/migrate_core_cards/20170608083819_add_full_width_layout_card.rb +0 -23
  220. data/db/migrate_core_cards/20170608200649_add_input_options_codename.rb +0 -8
  221. data/db/migrate_core_cards/20180423120222_add_mod_styles_card.rb +0 -20
  222. data/db/migrate_core_cards/20180508210903_add_json_type.rb +0 -10
  223. data/db/migrate_core_cards/20180515175726_add_codenames.rb +0 -8
  224. data/db/migrate_core_cards/20180712042655_head_rule.rb +0 -13
  225. data/db/migrate_core_cards/20181120200937_update_layout.rb +0 -7
  226. data/db/migrate_core_cards/20190204195039_add_rule_card.rb +0 -10
  227. data/db/migrate_core_cards/20190321085735_wagn_to_decko_logo.rb +0 -11
  228. data/db/migrate_core_cards/20190417142612_reorganize_scripts_2.rb +0 -17
  229. data/db/migrate_core_cards/20190424100531_update_credit_image.rb +0 -76
  230. data/db/migrate_core_cards/20190424101004_add_read_anyone_rules.rb +0 -13
  231. data/db/migrate_core_cards/20190503122739_update_pristine_data.rb +0 -18
  232. data/db/migrate_core_cards/20190605133556_tweak_config_cards.rb +0 -10
  233. data/db/migrate_core_cards/20190618110446_add_dropdown_divider.rb +0 -8
  234. data/db/migrate_core_cards/20190621143156_add_role_assign_permissions.rb +0 -9
  235. data/db/migrate_core_cards/20190710090209_homepage_tweaks.rb +0 -13
  236. data/db/migrate_core_cards/20190820155833_update_cardtype_type_structure.rb +0 -7
  237. data/db/migrate_core_cards/20190823220018_cleanup_for_decko_1_0.rb +0 -19
  238. data/db/migrate_core_cards/20190826132738_add_more_guides.rb +0 -7
  239. data/db/migrate_core_cards/20190829093961_cardtype_grouping.rb +0 -16
  240. data/db/migrate_core_cards/20190830131820_setting_settings_aside.rb +0 -17
  241. data/db/migrate_core_cards/20190902161223_add_style_media.rb +0 -7
  242. data/db/migrate_core_cards/20190918200115_ensure_description_card.rb +0 -13
  243. data/db/migrate_core_cards/20191008201046_fixture_fix.rb +0 -11
  244. data/db/migrate_core_cards/20191028135243_add_link_editor_to_tiny_mce_config.rb +0 -9
  245. data/db/migrate_core_cards/20191118145629_codename_fixes.rb +0 -5
  246. data/db/migrate_core_cards/20200821231558_add_nest_list_type.rb +0 -9
  247. data/db/migrate_core_cards/data/1.11_help_text.json +0 -410
  248. data/db/migrate_core_cards/data/1.12_stylesheets/classic_cards.scss +0 -104
  249. data/db/migrate_core_cards/data/1.12_stylesheets/common.scss +0 -228
  250. data/db/migrate_core_cards/data/1.12_stylesheets/right_sidebar.scss +0 -27
  251. data/db/migrate_core_cards/data/1.12_stylesheets/traditional.scss +0 -143
  252. data/db/migrate_core_cards/data/1.13_config_text.json +0 -32
  253. data/db/migrate_core_cards/data/1.14_config_descriptions_etc.json +0 -77
  254. data/db/migrate_core_cards/data/bootstrap_layout.json +0 -96
  255. data/db/migrate_core_cards/data/cards/Xaccount +0 -22
  256. data/db/migrate_core_cards/data/cards/Xaccount_setting-Xright-Xstructure +0 -12
  257. data/db/migrate_core_cards/data/cards/Xall-Xlayout +0 -1
  258. data/db/migrate_core_cards/data/cards/Xcredit +0 -2
  259. data/db/migrate_core_cards/data/cards/Xfooter +0 -3
  260. data/db/migrate_core_cards/data/cards/Xgetting_started +0 -31
  261. data/db/migrate_core_cards/data/cards/Xgetting_started-shark +0 -66
  262. data/db/migrate_core_cards/data/cards/Xgetting_started_link +0 -6
  263. data/db/migrate_core_cards/data/cards/Xheader +0 -19
  264. data/db/migrate_core_cards/data/cards/Xhome +0 -1
  265. data/db/migrate_core_cards/data/cards/Xlogo +0 -1
  266. data/db/migrate_core_cards/data/cards/Xmain_menu +0 -2
  267. data/db/migrate_core_cards/data/cards/Xrecaptcha_setting-Xself-Xstructure +0 -1
  268. data/db/migrate_core_cards/data/cards/Xsidebar +0 -7
  269. data/db/migrate_core_cards/data/cards/Xstructure-Xright-Xguide +0 -12
  270. data/db/migrate_core_cards/data/cards/Xtitle +0 -1
  271. data/db/migrate_core_cards/data/cards/administrator-dashboard +0 -23
  272. data/db/migrate_core_cards/data/cards/administrator-description +0 -1
  273. data/db/migrate_core_cards/data/cards/anyone_signed_in-dashboard +0 -0
  274. data/db/migrate_core_cards/data/cards/cardtype-Xtype-Xguide +0 -24
  275. data/db/migrate_core_cards/data/cards/cardtype-Xtype-Xstructure +0 -3
  276. data/db/migrate_core_cards/data/cards/default_layout +0 -6
  277. data/db/migrate_core_cards/data/cards/full_width_layout +0 -5
  278. data/db/migrate_core_cards/data/cards/help_desk-dashboard +0 -7
  279. data/db/migrate_core_cards/data/cards/help_desk-description +0 -1
  280. data/db/migrate_core_cards/data/cards/home +0 -2
  281. data/db/migrate_core_cards/data/cards/home-Xself-Xlayout +0 -1
  282. data/db/migrate_core_cards/data/cards/home-original +0 -22
  283. data/db/migrate_core_cards/data/cards/home_layout +0 -6
  284. data/db/migrate_core_cards/data/cards/left_sidebar_layout +0 -6
  285. data/db/migrate_core_cards/data/cards/menu +0 -1
  286. data/db/migrate_core_cards/data/cards/right_thin_sidebar_layout +0 -8
  287. data/db/migrate_core_cards/data/cards/role-Xtype-Xstructure +0 -2
  288. data/db/migrate_core_cards/data/cards/shark-dashboard +0 -19
  289. data/db/migrate_core_cards/data/cards/shark-description +0 -1
  290. data/db/migrate_core_cards/data/cards/shark_menu +0 -2
  291. data/db/migrate_core_cards/data/cards.yml +0 -138
  292. data/db/migrate_core_cards/data/decko_logo.svg +0 -1
  293. data/db/migrate_core_cards/data/mailer/follower_notification_email.html +0 -9
  294. data/db/migrate_core_cards/data/mailer/follower_notification_email.txt +0 -11
  295. data/db/migrate_core_cards/data/mailer/mail_config.json +0 -22
  296. data/db/migrate_core_cards/data/mailer/password_reset_email.html +0 -13
  297. data/db/migrate_core_cards/data/mailer/password_reset_email.txt +0 -11
  298. data/db/migrate_core_cards/data/mailer/signup_alert_email.html +0 -7
  299. data/db/migrate_core_cards/data/mailer/signup_alert_email.txt +0 -5
  300. data/db/migrate_core_cards/data/mailer/verification_email.html +0 -12
  301. data/db/migrate_core_cards/data/mailer/verification_email.txt +0 -9
  302. data/db/migrate_core_cards/data/skin_images.json +0 -91
  303. data/db/migrate_core_cards/data/themes/bootstrap_default/_bootswatch.scss +0 -0
  304. data/db/migrate_core_cards/data/themes/bootstrap_default/_variables.scss +0 -867
  305. data/db/migrate_core_cards/data/themes/cerulean/_bootswatch.scss +0 -125
  306. data/db/migrate_core_cards/data/themes/cerulean/_variables.scss +0 -861
  307. data/db/migrate_core_cards/data/themes/cosmo/_bootswatch.scss +0 -237
  308. data/db/migrate_core_cards/data/themes/cosmo/_variables.scss +0 -861
  309. data/db/migrate_core_cards/data/themes/cyborg/_bootswatch.scss +0 -210
  310. data/db/migrate_core_cards/data/themes/cyborg/_variables.scss +0 -861
  311. data/db/migrate_core_cards/data/themes/darkly/_bootswatch.scss +0 -330
  312. data/db/migrate_core_cards/data/themes/darkly/_variables.scss +0 -861
  313. data/db/migrate_core_cards/data/themes/flatly/_bootswatch.scss +0 -313
  314. data/db/migrate_core_cards/data/themes/flatly/_variables.scss +0 -861
  315. data/db/migrate_core_cards/data/themes/journal/_bootswatch.scss +0 -120
  316. data/db/migrate_core_cards/data/themes/journal/_variables.scss +0 -861
  317. data/db/migrate_core_cards/data/themes/lumen/_bootswatch.scss +0 -496
  318. data/db/migrate_core_cards/data/themes/lumen/_variables.scss +0 -861
  319. data/db/migrate_core_cards/data/themes/paper/_bootswatch.scss +0 -607
  320. data/db/migrate_core_cards/data/themes/paper/_variables.scss +0 -861
  321. data/db/migrate_core_cards/data/themes/readable/_bootswatch.scss +0 -174
  322. data/db/migrate_core_cards/data/themes/readable/_variables.scss +0 -861
  323. data/db/migrate_core_cards/data/themes/sandstone/_bootswatch.scss +0 -194
  324. data/db/migrate_core_cards/data/themes/sandstone/_variables.scss +0 -861
  325. data/db/migrate_core_cards/data/themes/simplex/_bootswatch.scss +0 -142
  326. data/db/migrate_core_cards/data/themes/simplex/_variables.scss +0 -861
  327. data/db/migrate_core_cards/data/themes/slate/_bootswatch.scss +0 -417
  328. data/db/migrate_core_cards/data/themes/slate/_variables.scss +0 -861
  329. data/db/migrate_core_cards/data/themes/spacelab/_bootswatch.scss +0 -137
  330. data/db/migrate_core_cards/data/themes/spacelab/_variables.scss +0 -861
  331. data/db/migrate_core_cards/data/themes/superhero/_bootswatch.scss +0 -332
  332. data/db/migrate_core_cards/data/themes/superhero/_variables.scss +0 -861
  333. data/db/migrate_core_cards/data/themes/united/_bootswatch.scss +0 -42
  334. data/db/migrate_core_cards/data/themes/united/_variables.scss +0 -861
  335. data/db/migrate_core_cards/data/themes/yeti/_bootswatch.scss +0 -437
  336. data/db/migrate_core_cards/data/themes/yeti/_variables.scss +0 -861
  337. data/db/seed/README.md +0 -2
  338. data/db/seed/new/card_actions.yml +0 -5913
  339. data/db/seed/new/card_references.yml +0 -6532
  340. data/db/seed/new/cards.yml +0 -14595
  341. data/db/seed/test/fixtures/card_actions.yml +0 -8153
  342. data/db/seed/test/fixtures/card_acts.yml +0 -1039
  343. data/db/seed/test/fixtures/card_changes.yml +0 -230
  344. data/db/seed/test/fixtures/card_references.yml +0 -8471
  345. data/db/seed/test/fixtures/cards.yml +0 -20171
  346. data/db/seed/test/fixtures/file1.txt +0 -1
  347. data/db/seed/test/fixtures/file2.txt +0 -1
  348. data/db/seed/test/fixtures/mao2.jpg +0 -0
  349. data/db/seed/test/fixtures/rails.gif +0 -0
  350. data/db/seed/test/fixtures/schema_migrations.yml +0 -67
  351. data/db/seed/test/fixtures/schema_migrations_core_cards.yml +0 -347
  352. data/db/seed/test/fixtures/schema_migrations_deck.yml +0 -1
  353. data/db/seed/test/fixtures/schema_migrations_deck_cards.yml +0 -5
  354. data/db/test_seed.rb +0 -322
  355. data/lib/card/content/truncate.rb +0 -67
  356. data/lib/card/director/card_methods.rb +0 -45
  357. data/lib/card/file_card_creator/abstract_file_card/migration_file.rb +0 -50
  358. data/lib/card/file_card_creator/abstract_file_card/ruby_file.rb +0 -30
  359. data/lib/card/file_card_creator/abstract_file_card/source_file.rb +0 -36
  360. data/lib/card/file_card_creator/abstract_file_card.rb +0 -44
  361. data/lib/card/file_card_creator/haml_card.rb +0 -42
  362. data/lib/card/file_card_creator/output_helper.rb +0 -53
  363. data/lib/card/file_card_creator/script_card.rb +0 -35
  364. data/lib/card/file_card_creator/style_card.rb +0 -25
  365. data/lib/card/file_card_creator.rb +0 -25
  366. data/lib/card/name/fields_and_traits.rb +0 -42
  367. data/lib/cardio/commands/application.rb +0 -10
  368. data/lib/cardio/migration/import/import_data/card_attributes.rb +0 -64
  369. data/lib/cardio/migration/import/import_data/card_content.rb +0 -30
  370. data/lib/cardio/migration/import/import_data.rb +0 -119
  371. data/lib/cardio/migration/import/merger.rb +0 -46
  372. data/lib/cardio/migration/import.rb +0 -125
  373. data/lib/tasks/card.rake +0 -65
  374. data/mod/admin/locales/de.yml +0 -4
  375. data/mod/admin/locales/en.yml +0 -4
  376. data/mod/admin/set/all/admin.rb +0 -16
  377. data/mod/admin/set/self/admin.rb +0 -144
  378. data/mod/admin/set/self/admin_info.rb +0 -40
  379. data/mod/admin/set/self/debugger.rb +0 -3
  380. data/mod/admin/spec/set/self/admin_info_spec.rb +0 -9
  381. data/mod/core/data/production.yml +0 -7
  382. data/mod/core/set/all/collection.rb +0 -53
  383. data/mod/core/spec/set/all/collection_spec.rb +0 -170
  384. data/mod/core/spec/set/all/utils_spec.rb +0 -5
  385. data/mod/standard/data/files/favicon/image-icon.png +0 -0
  386. data/mod/standard/data/files/favicon/image-large.png +0 -0
  387. data/mod/standard/data/files/favicon/image-medium.png +0 -0
  388. data/mod/standard/data/files/favicon/image-original.png +0 -0
  389. data/mod/standard/data/files/favicon/image-small.png +0 -0
  390. data/mod/standard/data/files/logo/image-original.svg +0 -1
@@ -1,30 +1,81 @@
1
- - :name: Author
2
- :type: :cardtype
3
- - :name: Fruit
4
- :type: :cardtype
1
+ ---
2
+ - user
3
+ - cardtype
4
+ - sample
5
+ - :name: colors
6
+ - :name: c1
7
+ - :name: c2
8
+ - :name: c3
9
+ - :name: Z
10
+ :content: I'm here to be referenced to
11
+ - :name: A
12
+ :content: Alpha [[Z]]
13
+ :user: Joe User
14
+ - :name: B
15
+ :content: Beta {{Z}}
16
+ :user: Joe User
17
+ - :name: T
18
+ :content: Theta
19
+ - :name: X
20
+ :content: "[[A]] [[A+B]] [[T]]"
21
+ - :name: Y
22
+ :content: "{{B}} {{A+B}} {{A}} {{T}}"
23
+ - :name:
24
+ - A
25
+ - B
26
+ :content: AlphaBeta
27
+ - :name:
28
+ - A
29
+ - B
30
+ - Y
31
+ - Z
32
+ :content: more letters
33
+ - :name: Link to unknown
34
+ :content: "[[Mister X]]"
35
+ - :name:
36
+ - One
37
+ - Two
38
+ - Three
39
+ - :name:
40
+ - Four
41
+ - One
42
+ - Five
43
+ - :name: basicname
44
+ :content: basiccontent
45
+ - :name: Blue
46
+ - :name: blue includer 1
47
+ :content: "{{Blue}}"
48
+ - :name: blue includer 2
49
+ :content: "{{blue|closed;other:stuff}}"
50
+ - :name: blue linker 1
51
+ :content: "[[Blue]]"
52
+ - :name: blue linker 2
53
+ :content: "[[blue]]"
54
+ - :name: "*write"
55
+ :codename: write
56
+ - :name:
57
+ - A
58
+ - C
59
+ - :name:
60
+ - A
61
+ - D
62
+ - :name:
63
+ - A
64
+ - E
65
+ - :name:
66
+ - C
67
+ - A
68
+ - :name:
69
+ - D
70
+ - A
71
+ - :name:
72
+ - F
73
+ - A
74
+ - :name:
75
+ - A
76
+ - B
77
+ - C
78
+
5
79
  - :name: self aware
6
80
  :type: :cardtype
7
- - :name: Cardtype A
8
- :type: :cardtype
9
- :codename: :cardtype_a
10
- - :name: Cardtype B
11
- :type: :cardtype
12
- :codename: :cardtype_b
13
- - :name: Cardtype C
14
- :type: :cardtype
15
- :codename: :cardtype_c
16
- - :name: Cardtype D
17
- :type: :cardtype
18
- :codename: :cardtype_d
19
- - :name: Cardtype E
20
- :type: :cardtype
21
- :codename: :cardtype_e
22
- - :name: Cardtype F
23
- :type: :cardtype
24
- :codename: :cardtype_f
25
- - :name: UserForm
26
- :type: :cardtype
27
- - :name: Book
28
- :type: :cardtype
29
- - :name: Sample Cardtype
30
- :type: :cardtype
81
+ :content: "[[/new/{{_self|name}}|new]]"
@@ -0,0 +1,17 @@
1
+ namespace :card do
2
+ namespace :assets do
3
+ task refresh: :environment do
4
+ Card::Assets.refresh force: true
5
+ end
6
+
7
+ task code: :environment do
8
+ Cardio.config.compress_assets = true
9
+ Card::Cache.reset_all
10
+ Card::Assets.make_output_coded
11
+ end
12
+
13
+ task wipe: :environment do
14
+ Card::Assets.wipe
15
+ end
16
+ end
17
+ end
File without changes
@@ -146,5 +146,9 @@ namespace :card do
146
146
  end
147
147
  end
148
148
  end
149
+
150
+ def version
151
+ ENV["VERSION"] ? ENV["VERSION"].to_i : nil
152
+ end
149
153
  end
150
154
  end
@@ -25,13 +25,14 @@ namespace :card do
25
25
 
26
26
  desc "install all mods"
27
27
  task install: :environment do
28
- Cardio.config.compress_assets = true
28
+ # Cardio.config.compress_assets = true # should not be here, imo #efm
29
29
  Cardio::Mod.ensure_installed
30
30
  end
31
31
 
32
+ private
33
+
32
34
  def public_mod_dir subdir=nil
33
- parts = [Rails.public_path, "mod", subdir].compact
34
- File.join(*parts)
35
+ File.join(*[Rails.public_path, "mod", subdir].compact)
35
36
  end
36
37
  end
37
38
  end
@@ -0,0 +1,58 @@
1
+ namespace :card do
2
+ namespace :seed do
3
+ desc "regenerate seed fixtures quickly from current fixtures. " \
4
+ "create and update only (no delete)"
5
+ task update: %i[replant polish dump]
6
+
7
+ # desc "replant, polish, and dump seed. " \
8
+ # "Good when mods/assets have changed but pods haven't."
9
+ # # note: this will not delete anything; it just eats new stuff.
10
+ # task modify: %i[replant polish dump]
11
+
12
+ desc "Truncates tables of each database for current environment and loads the seeds" \
13
+ "(alias for db:seed:replant)"
14
+ task replant: ["db:seed:replant"]
15
+
16
+ desc "finalize seed data with migrations, installations, asset coding, and cleaning"
17
+ task polish: :environment do
18
+ ENV["STAMP_MIGRATIONS"] = "true"
19
+
20
+ invoke_card_tasks %w[update assets:code]
21
+ invoke_card_task "seed:clean" unless Rails.env.test?
22
+ # It's important NOT to clean the test data and lose history, creator info, etc.
23
+ end
24
+
25
+ desc "remove unneeded cards, acts, actions, changes, and references"
26
+ task clean: :environment do
27
+ Cardio::Seed.clean
28
+ Cardio::Utils.empty_trash
29
+ Card::Cache.reset_all
30
+ end
31
+
32
+ desc "dump db to bootstrap fixtures"
33
+ task dump: :environment do
34
+ Card::Cache.reset_all
35
+ Cardio::Seed.dump
36
+ end
37
+
38
+ desc "completely regenerate seed fixtures starting with dependee seed fixtures"
39
+ task build: %i[plow polish dump]
40
+
41
+ desc "reseed from the fixtures of the dependee seed mod"
42
+ task plow: :environment do
43
+ ENV["CARD_UPDATE_SEED"] = "true"
44
+ # tells Cardio::Seed to use fixtures upon which the seeds being updated depend
45
+
46
+ invoke_card_tasks %w[reset_tmp seed:replant]
47
+ end
48
+
49
+ def invoke_card_tasks tasks
50
+ tasks.each { |task| invoke_card_task task }
51
+ end
52
+
53
+ def invoke_card_task task
54
+ puts "invoking: #{task}".green
55
+ Rake::Task["card:#{task}"].invoke
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,115 @@
1
+ require "optparse"
2
+
3
+ namespace :card do
4
+ desc "Creates the database, loads the schema, initializes seed data, " \
5
+ "and adds symlinks to public directories"
6
+ task setup: %w[db:setup card:mod:symlink]
7
+
8
+ desc "Runs migrations, installs mods, and updates symlinks"
9
+ task :update do
10
+ failing_loudly "decko update" do
11
+ ENV["NO_RAILS_CACHE"] = "true"
12
+ # Benchmark.bm do |x|
13
+ [:migrate, :eat, :reset_tmp, :reset_cache,
14
+ "mod:uninstall", "mod:install", "mod:symlink"].each do |task|
15
+ # x.report(task) do
16
+ Rake::Task["card:#{task}"].invoke
17
+ # end
18
+ end
19
+ # end
20
+ end
21
+ end
22
+
23
+ desc "Ingests card data from mod yaml"
24
+ task eat: :environment do
25
+ parse_options :eat do
26
+ add_opt :m, :mod, "only eat cards in given mod"
27
+ add_opt :u, :user, "user to credit unless specified (otherwise uses Decko Bot)"
28
+ add_opt :t, :type, "pod type: real, test, or all"
29
+ flag_opt :v, :verbose, "output progress info and error backtraces"
30
+ end
31
+ rake_result(:eat) { Cardio::Mod::Eat.new(**options).up }
32
+ end
33
+
34
+ desc "Exports card data to mod yaml"
35
+ task sow: :environment do
36
+ parse_options :sow do
37
+ add_opt :n, :name, "export card with name/mark (handles : and ~ prefixes)"
38
+ flag_opt :i, :items, "also export card items (with -n)"
39
+ flag_opt :o, :only_items, "also export card items (with -n)", items: :only
40
+ add_opt :c, :cql, "export cards found by CQL (in JSON format)"
41
+ add_opt :m, :mod, "output yaml to data/environment.yml file in mod"
42
+ add_opt :e, :env, "environment to dump to (default is current env)"
43
+ add_opt :t, :field_tags, "comma-separated list of field tag marks"
44
+ end
45
+ rake_result(:sow) { Cardio::Mod::Sow.new(**options).out }
46
+ end
47
+
48
+ desc "Resets cache"
49
+ task reset_cache: :environment do
50
+ Card::Cache.reset_all
51
+ end
52
+
53
+ desc "reset with an empty tmp directory"
54
+ task :reset_tmp do
55
+ tmp_dir = Cardio.paths["tmp"].first
56
+ if Cardio.paths["tmp"].existent
57
+ Dir.foreach(tmp_dir) do |filename|
58
+ next if filename.match?(/^\./)
59
+
60
+ FileUtils.rm_rf File.join(tmp_dir, filename), secure: true
61
+ end
62
+ else
63
+ Dir.mkdir tmp_dir
64
+ end
65
+ end
66
+
67
+ desc "Loads seed data"
68
+ task seed: ["db:seed"]
69
+
70
+ def options
71
+ @options ||= {}
72
+ end
73
+
74
+ def rake_result task
75
+ result = yield
76
+ if result == :success
77
+ exit 0 if @options.present? # otherwise rake tries to run the arguments as tasks
78
+ else
79
+ puts "ERROR in card #{task}:\n #{result}".red
80
+ exit 1
81
+ end
82
+ end
83
+
84
+ def flag_opt letter, key, desc, hash=nil
85
+ hash ||= { key => true }
86
+ op.on("-#{letter}", "--#{key.to_s.tr '_', '-'}", desc) { options.merge! hash }
87
+ end
88
+
89
+ def add_opt letter, key, desc
90
+ op.on "-#{letter}", "--#{key.to_s.tr '_', '-'} #{key.to_s.upcase}", desc do |val|
91
+ options[key] = val
92
+ end
93
+ end
94
+
95
+ def op
96
+ @op ||= OptionParser.new
97
+ end
98
+
99
+ def parse_options task
100
+ op.banner = "Usage: rake card:#{task} -- [options]"
101
+ yield if block_given?
102
+ args = op.order!(ARGV) {}
103
+ # args << "-h" if args.empty?
104
+ op.parse! args
105
+ end
106
+
107
+ def failing_loudly task
108
+ yield
109
+ rescue StandardError
110
+ # TODO: fix this so that message appears *after* the errors.
111
+ # Solution should ensure that rake still exits with error code 1!
112
+ raise "\n>>>>>> FAILURE! #{task} did not complete successfully." \
113
+ "\n>>>>>> Please address errors and re-run:\n\n\n"
114
+ end
115
+ end
@@ -26,3 +26,7 @@ de:
26
26
  core_rename_confirm: "Sind Sie sicher, dass Sie die Karte umbenennen wollen?"
27
27
  skip_update_referer_content:
28
28
  Verweise auf diesen Namen nicht aktualisieren
29
+
30
+ core_admin_warn: Administrator Warnung
31
+ core_admin_email_off:
32
+ E-Mail-Versand ist ausgeschaltet. Ändere die Einstellungen in %{path}, damit Benachrichtigungen verschickt werden, wenn sich neue Nutzer registrieren.
@@ -25,5 +25,18 @@ en:
25
25
  core_rename: "Rename"
26
26
  core_rename_confirm: "Are you sure you want to rename?"
27
27
 
28
+ core_task_clear_cache_link_text: "Clear Cache"
29
+ core_task_clear_cache_description: "Clear Cache!"
30
+
31
+ core_task_empty_trash_link_text: "Empty Trash"
32
+ core_task_empty_trash_description: "Empty Trash!"
33
+
34
+ core_task_regenerate_assets_link_text: "Regenerate Assets"
35
+ core_task_regenerate_assets_description: "Regen!"
36
+
37
+ core_admin_warn: Administrator Warning
38
+ core_admin_email_off:
39
+ Email delivery is turned off. Change settings in %{path} to send sign up notifications.
40
+
28
41
  skip_update_referer_content:
29
42
  do not update references to this name
@@ -0,0 +1,14 @@
1
+
2
+ basket[:tasks] = {}
3
+ # to add an admin task:
4
+ #
5
+ # basket[:tasks][TASK_NAME] = {
6
+ # irreversible: TRUE/FALSE,
7
+ # execute_policy: -> { TASK_CODE },
8
+ # mod: MODNAME
9
+ # }
10
+ #
11
+ # Then add two lines in the locales containing the link text and the description:
12
+
13
+ # MOD_task_TASK_NAME_link_text: LINK_TEXT
14
+ # MOD_task_TASK_NAME_description: DESCRIPTION
@@ -2,6 +2,10 @@ def codename
2
2
  super&.to_sym
3
3
  end
4
4
 
5
+ def codename?
6
+ codename.present?
7
+ end
8
+
5
9
  event :validate_codename, :validate, on: :update, changed: :codename do
6
10
  validate_codename_permission
7
11
  validate_codename_uniqueness
@@ -9,10 +9,9 @@ event :save_draft, :store, on: :update, when: :draft? do
9
9
  abort :success
10
10
  end
11
11
 
12
- event :set_default_content,
13
- :prepare_to_validate,
12
+ event :set_default_content, :prepare_to_validate,
14
13
  on: :create, when: :use_default_content? do
15
- self.db_content = template.db_content
14
+ self.db_content = default_content
16
15
  end
17
16
 
18
17
  def draft?
@@ -23,8 +22,13 @@ def clean_html?
23
22
  true
24
23
  end
25
24
 
25
+ # TODO: let default_content in card_accessor override template
26
+ def default_content
27
+ template&.db_content
28
+ end
29
+
26
30
  def use_default_content?
27
- !db_content_changed? && template && template.db_content.present?
31
+ !db_content_changed? && default_content.present?
28
32
  end
29
33
 
30
34
  def unfilled?
@@ -1,3 +1,12 @@
1
+ event :notable_exception_raised do
2
+ error = Card::Error.current
3
+ Rails.logger.debug "#{error.message}\n#{error.backtrace * "\n "}"
4
+ end
5
+
6
+ def success
7
+ Env.success name
8
+ end
9
+
1
10
  # The Card#abort method is for cleanly exiting an action without continuing
2
11
  # to process any further events.
3
12
  #
@@ -42,10 +51,10 @@ end
42
51
 
43
52
  def abort_success
44
53
  if @supercard
45
- @supercard.subcards.delete key
54
+ @supercard.subcards.remove key
46
55
  @supercard.director.subdirectors.delete self
47
- expire :soft
48
56
  end
57
+ expire :soft
49
58
  true
50
59
  end
51
60
 
@@ -61,16 +70,3 @@ def with_transaction_returning_status &block
61
70
  end
62
71
  status
63
72
  end
64
-
65
- # FIXME: these two do not belong here!
66
-
67
- public
68
-
69
- event :notable_exception_raised do
70
- error = Card::Error.current
71
- Rails.logger.debug "#{error.message}\n#{error.backtrace * "\n "}"
72
- end
73
-
74
- def success
75
- Env.success(name)
76
- end
@@ -74,9 +74,23 @@ end
74
74
  alias_method :new_card?, :new?
75
75
  alias_method :unreal?, :new?
76
76
 
77
+ def purity
78
+ case
79
+ when new? then :new
80
+ when pristine? then :pristine
81
+ else :altered
82
+ end
83
+ end
84
+
77
85
  # has not been edited directly by human users. bleep blorp.
78
86
  def pristine?
79
- new_card? || !user_changes?
87
+ new_card? ||
88
+ (created_at == updated_at && creator_id == WagnBotID) ||
89
+ !user_changes?
90
+ end
91
+
92
+ def altered?
93
+ !pristine?
80
94
  end
81
95
 
82
96
  def user_changes?
@@ -1,55 +1,9 @@
1
- basket[:tasks] << {
2
- name: :empty_trash,
1
+ basket[:tasks][:empty_trash] = {
2
+ mod: :core,
3
3
  irreversible: true,
4
- execute_policy: -> { Card.empty_trash },
5
- stats: {
6
- title: "trashed cards",
7
- count: -> { Card.where(trash: true) },
8
- link_text: "empty trash",
9
- task: "empty_trash"
10
- }
4
+ execute_policy: -> { Cardio::Utils.empty_trash }
11
5
  }
12
6
 
13
- module ClassMethods
14
- def empty_trash
15
- Card.delete_trashed_files
16
- Card.where(trash: true).in_batches.update_all(left_id: nil, right_id: nil)
17
- Card.where(trash: true).in_batches.delete_all
18
- Card::Action.delete_cardless
19
- Card::Change.delete_actionless
20
- Card::Act.delete_actionless
21
- Card::Reference.clean
22
- end
23
-
24
- # deletes any file not associated with a real card.
25
- def delete_trashed_files
26
- dir = Cardio.paths["files"].existent.first
27
- # TODO: handle cloud files
28
- return unless dir
29
-
30
- (all_trashed_card_ids & all_file_ids).each do |file_id|
31
- delete_files_with_id dir, file_id
32
- end
33
- end
34
-
35
- def delete_files_with_id dir, file_id
36
- raise Card::Error, t(:core_exception_almost_deleted) if Card.exists?(file_id)
37
-
38
- ::FileUtils.rm_rf "#{dir}/#{file_id}", secure: true
39
- end
40
-
41
- def all_file_ids
42
- dir = Card.paths["files"].existent.first
43
- Dir.entries(dir)[2..-1].map(&:to_i)
44
- end
45
-
46
- def all_trashed_card_ids
47
- trashed_card_sql = %( select id from cards where trash is true )
48
- sql_results = Card.connection.select_all(trashed_card_sql)
49
- sql_results.map(&:values).flatten.map(&:to_i)
50
- end
51
- end
52
-
53
7
  def trash?
54
8
  trash
55
9
  end
@@ -66,35 +20,12 @@ def delete! args={}
66
20
  end
67
21
  end
68
22
 
69
- def add_to_trash args
70
- return if new_card?
71
-
72
- yield args.merge trash: true
73
- end
74
-
75
23
  event :manage_trash, :prepare_to_store, on: :create do
76
24
  pull_from_trash!
77
25
  self.trash = false
78
26
  true
79
27
  end
80
28
 
81
- def pull_from_trash!
82
- return unless (id = Card::Lexicon.id key) # name is already known
83
- return unless (trashed_card = Card.where(id: id).take)&.trash
84
-
85
- # confirm name is actually in trash
86
-
87
- db_attributes["id"] = trashed_card.db_attributes["id"]
88
- # id_in_database returns existing card id
89
-
90
- @from_trash = true
91
- @new_record = false
92
- end
93
-
94
- def db_attributes
95
- send(:mutations_from_database).send :attributes
96
- end
97
-
98
29
  event :validate_delete, :validate, on: :delete do
99
30
  unless codename.blank?
100
31
  errors.add :delete, t(:core_error_system_card, name: name, codename: codename)
@@ -112,7 +43,7 @@ event :validate_delete, :validate, on: :delete do
112
43
  errors.add :delete, t(:core_error_user_edits, name: name) if account && has_edits?
113
44
  end
114
45
 
115
- event :validate_delete_children, after: :validate_delete, on: :delete do
46
+ event :delete_children, after: :validate_delete, on: :delete do
116
47
  return if errors.any?
117
48
 
118
49
  each_child do |child|
@@ -125,6 +56,27 @@ event :validate_delete_children, after: :validate_delete, on: :delete do
125
56
  end
126
57
  end
127
58
 
59
+ def pull_from_trash!
60
+ return unless (id = Card::Lexicon.id key) # name is already known
61
+ return unless (trashed_card = Card.where(id: id).take)&.trash
62
+
63
+ # confirm name is actually in trash
64
+
65
+ db_attributes["id"] = trashed_card.db_attributes["id"]
66
+ # id_in_database returns existing card id
67
+
68
+ @from_trash = true
69
+ @new_record = false
70
+ end
71
+
72
+ def add_to_trash args
73
+ yield args.merge(trash: true) unless new_card?
74
+ end
75
+
76
+ def db_attributes
77
+ send(:mutations_from_database).send :attributes
78
+ end
79
+
128
80
  def delete_as_subcard subcard
129
81
  subcard.trash = true
130
82
  subcard subcard
@@ -5,7 +5,7 @@ module ClassMethods
5
5
  end
6
6
 
7
7
  event :validate_type_change, :validate, on: :update, changed: :type_id do
8
- return unless (c = dup) && c.action == :create && !c.valid?
8
+ return unless (c = dup) && (c.action == :create) && !c.valid?
9
9
 
10
10
  errors.add :type, t(:core_error_cant_change_errors,
11
11
  name: name,
@@ -67,7 +67,7 @@ end
67
67
  def type_id_from_code
68
68
  return if simple?
69
69
  each_type_assigning_module_key do |module_key|
70
- type_id = Card::Set::Type.assignment[module_key]
70
+ type_id = Card::Set::Type.assignment[module_key]&.card_id
71
71
  return type_id if type_id
72
72
  end
73
73
  nil