card 1.104.1 → 1.105.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (396) 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 -39
  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 +8 -8
  48. data/lib/card/env/serializable.rb +35 -0
  49. data/lib/card/env/serialization.rb +16 -9
  50. data/lib/card/env/slot_options.rb +1 -1
  51. data/lib/card/env/support.rb +30 -0
  52. data/lib/card/env.rb +13 -68
  53. data/lib/card/error.rb +9 -5
  54. data/lib/card/format/error.rb +6 -12
  55. data/lib/card/format/nest.rb +1 -1
  56. data/lib/card/format/wrapper.rb +1 -1
  57. data/lib/card/format.rb +5 -1
  58. data/lib/card/model/save_helper/save_arguments.rb +0 -44
  59. data/lib/card/model/save_helper/save_helper_helper.rb +0 -37
  60. data/lib/card/model/save_helper.rb +0 -82
  61. data/lib/card/name/all.rb +1 -4
  62. data/lib/card/name/card_class.rb +0 -2
  63. data/lib/card/name/name_variants.rb +4 -0
  64. data/lib/card/name.rb +0 -5
  65. data/lib/card/query/abstract_query/query_helper.rb +3 -5
  66. data/lib/card/query/abstract_query/tie.rb +1 -1
  67. data/lib/card/query/abstract_query.rb +36 -17
  68. data/lib/card/query/card_class.rb +36 -0
  69. data/lib/card/query/card_query/custom.rb +12 -0
  70. data/lib/card/query/card_query/interpretation.rb +1 -0
  71. data/lib/card/query/card_query/normalization.rb +11 -3
  72. data/lib/card/query/card_query/reference_attributes.rb +3 -2
  73. data/lib/card/query/card_query/sorting.rb +5 -4
  74. data/lib/card/query/card_query.rb +1 -0
  75. data/lib/card/query/sql_statement/order.rb +12 -10
  76. data/lib/card/query/sql_statement/where.rb +2 -2
  77. data/lib/card/query.rb +5 -1
  78. data/lib/card/reference/all.rb +10 -10
  79. data/lib/card/set/advanced_api.rb +1 -1
  80. data/lib/card/set/event/all.rb +9 -1
  81. data/lib/card/set/event/delayed_event.rb +4 -2
  82. data/lib/card/set/event/options.rb +1 -1
  83. data/lib/card/set/event/skip_and_trigger.rb +34 -10
  84. data/lib/card/set/format/abstract_format/haml_views.rb +3 -3
  85. data/lib/card/set/format/abstract_format.rb +1 -1
  86. data/lib/card/set/format/haml_paths.rb +5 -21
  87. data/lib/card/set/inheritance.rb +4 -4
  88. data/lib/card/set/pattern/all.rb +1 -1
  89. data/lib/card/set/pattern/base.rb +1 -1
  90. data/lib/card/set/pattern/class_methods.rb +4 -4
  91. data/lib/card/set/trait.rb +1 -1
  92. data/lib/card/set/type.rb +0 -41
  93. data/lib/card/setting.rb +0 -1
  94. data/lib/card/subcards/all.rb +6 -8
  95. data/lib/card/subcards/args.rb +9 -9
  96. data/lib/card/view/cache/cache_action.rb +1 -1
  97. data/lib/card/view/options/visibility.rb +4 -0
  98. data/lib/card/view/options.rb +1 -0
  99. data/lib/card/view/permission.rb +12 -4
  100. data/lib/card/view.rb +4 -0
  101. data/lib/card.rb +18 -27
  102. data/lib/cardio/cli.rb +3 -1
  103. data/lib/cardio/command/application.rb +5 -0
  104. data/lib/cardio/{commands/command.rb → command/command_base.rb} +2 -2
  105. data/lib/cardio/{commands → command}/custom.rb +16 -13
  106. data/lib/cardio/{commands → command}/rake_command/parser.rb +3 -3
  107. data/lib/cardio/{commands → command}/rake_command.rb +4 -4
  108. data/lib/cardio/{commands → command}/rspec_command/parser.rb +2 -2
  109. data/lib/cardio/{commands → command}/rspec_command.rb +7 -9
  110. data/lib/cardio/command.rb +129 -0
  111. data/lib/cardio/commands.rb +17 -116
  112. data/lib/cardio/generators/deck_generator_loader.rb +1 -0
  113. data/lib/cardio/generators.rb +2 -2
  114. data/lib/cardio/migration.rb +3 -53
  115. data/lib/cardio/mod/class_methods.rb +26 -22
  116. data/lib/cardio/mod/dirs.rb +29 -22
  117. data/lib/cardio/mod/eat/edibles.rb +22 -15
  118. data/lib/cardio/mod/eat.rb +18 -14
  119. data/lib/cardio/mod/load_strategy/set_tmp_files.rb +1 -1
  120. data/lib/cardio/mod/load_strategy.rb +12 -2
  121. data/lib/cardio/mod/modfile_api.rb +18 -18
  122. data/lib/cardio/mod/{poop.rb → sow.rb} +10 -18
  123. data/lib/cardio/mod.rb +21 -30
  124. data/lib/cardio/railtie.rb +20 -59
  125. data/lib/cardio/schema.rb +2 -1
  126. data/lib/cardio/script_loader.rb +3 -1
  127. data/lib/cardio/seed.rb +101 -8
  128. data/lib/cardio/utils.rb +39 -1
  129. data/lib/cardio/version.rb +1 -1
  130. data/lib/cardio.rb +8 -0
  131. data/lib/generators/deck/deck_generator.rb +5 -2
  132. data/lib/generators/deck/templates/config/application.rb.erb +74 -55
  133. data/lib/generators/deck/templates/config/puma.rb +1 -1
  134. data/lib/generators/deck/templates/script/decko_rspec +1 -1
  135. data/lib/generators/deck/templates/simplecov.rb.erb +10 -8
  136. data/lib/generators/mod/USAGE +1 -1
  137. data/lib/generators/set/USAGE +2 -2
  138. data/mod/core/data/fixtures/real/card_actions.yml +78 -0
  139. data/{db/seed/new → mod/core/data/fixtures/real}/card_acts.yml +2 -2
  140. data/{db/seed/new → mod/core/data/fixtures/real}/card_changes.yml +0 -0
  141. data/mod/core/data/fixtures/real/card_references.yml +8 -0
  142. data/mod/core/data/fixtures/real/cards.yml +135 -0
  143. data/{db/seed/new → mod/core/data/fixtures/real}/schema_migrations.yml +0 -0
  144. data/{db/seed/new → mod/core/data/fixtures/real}/schema_migrations_core_cards.yml +0 -0
  145. data/{db/seed/new → mod/core/data/fixtures/real}/schema_migrations_deck.yml +0 -0
  146. data/{db/seed/new → mod/core/data/fixtures/real}/schema_migrations_deck_cards.yml +0 -0
  147. data/mod/core/data/real.yml +79 -0
  148. data/mod/core/data/test/cardtype.yml +38 -0
  149. data/mod/core/data/test/sample.yml +50 -0
  150. data/mod/core/data/test/user.yml +41 -0
  151. data/mod/core/data/test.yml +79 -28
  152. data/mod/core/lib/tasks/card/assets.rake +17 -0
  153. data/{lib → mod/core/lib}/tasks/card/create.rake +0 -0
  154. data/{lib → mod/core/lib}/tasks/card/migrate.rake +4 -0
  155. data/{lib → mod/core/lib}/tasks/card/mod.rake +4 -3
  156. data/mod/core/lib/tasks/card/seed.rake +58 -0
  157. data/mod/core/lib/tasks/card.rake +115 -0
  158. data/mod/core/locales/de.yml +4 -0
  159. data/mod/core/locales/en.yml +13 -0
  160. data/mod/core/set/all/admin.rb +14 -0
  161. data/mod/core/set/all/codename.rb +4 -0
  162. data/mod/core/set/all/content.rb +8 -4
  163. data/mod/core/set/all/{abort.rb → result.rb} +11 -15
  164. data/mod/core/set/all/states.rb +15 -1
  165. data/mod/core/set/all/trash.rb +25 -73
  166. data/mod/core/set/all/type.rb +2 -2
  167. data/mod/core/set/all/utils.rb +3 -87
  168. data/mod/core/set/right/autoname.rb +2 -0
  169. data/mod/core/set/self/admin/warning_alert.haml +3 -0
  170. data/mod/core/set/self/admin.rb +173 -0
  171. data/mod/core/set/type/cardtype.rb +2 -0
  172. data/mod/core/set_pattern/02_all_plus.rb +1 -1
  173. data/mod/core/set_pattern/05_rstar.rb +1 -1
  174. data/mod/core/set_pattern/06_rule.rb +1 -1
  175. data/mod/core/set_pattern/07_right.rb +1 -1
  176. data/mod/core/set_pattern/08_type_plus_right.rb +1 -1
  177. data/mod/core/spec/set/all/assign_attributes_spec.rb +3 -3
  178. data/mod/core/spec/set/all/autoname_spec.rb +25 -0
  179. data/mod/core/spec/set/all/codename_spec.rb +1 -1
  180. data/mod/core/spec/set/all/name_events_spec.rb +43 -66
  181. data/mod/core/spec/set/all/trash_spec.rb +149 -68
  182. data/mod/{admin → core}/spec/set/self/admin_spec.rb +25 -22
  183. data/mod/core/spec/set/self/trash_spec.rb +5 -0
  184. metadata +90 -252
  185. data/db/migrate_core_cards/20130411211600_delete_old_related_tab_cards.rb +0 -18
  186. data/db/migrate_core_cards/20130419215612_import_help_text.rb +0 -13
  187. data/db/migrate_core_cards/20130823192433_add_style_cards.rb +0 -100
  188. data/db/migrate_core_cards/20130910183318_move_styles_to_content.rb +0 -11
  189. data/db/migrate_core_cards/20130927191728_account_events.rb +0 -20
  190. data/db/migrate_core_cards/20131016172445_common_css_patch.rb +0 -9
  191. data/db/migrate_core_cards/20140110193325_reset_account_request_type.rb +0 -8
  192. data/db/migrate_core_cards/20140512155840_add_script_cards.rb +0 -86
  193. data/db/migrate_core_cards/20140629222005_add_email_cards.rb +0 -132
  194. data/db/migrate_core_cards/20140725180118_config_card_updates.rb +0 -9
  195. data/db/migrate_core_cards/20141111083921_delete_machine_output.rb +0 -7
  196. data/db/migrate_core_cards/20141115034214_config_descriptions_etc.rb +0 -14
  197. data/db/migrate_core_cards/20141119001955_make_symlinks_relative.rb +0 -15
  198. data/db/migrate_core_cards/20141120120605_fix_notification_html_message.rb +0 -10
  199. data/db/migrate_core_cards/20141216155251_add_more_following_cards.rb +0 -26
  200. data/db/migrate_core_cards/20141230204340_uri_codename.rb +0 -13
  201. data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +0 -76
  202. data/db/migrate_core_cards/20150317162412_bootstrap_themes.rb +0 -41
  203. data/db/migrate_core_cards/20150326205655_bootswatch_themes.rb +0 -36
  204. data/db/migrate_core_cards/20150331135745_new_card_menu.rb +0 -8
  205. data/db/migrate_core_cards/20150501010515_responsive_sidebar.rb +0 -11
  206. data/db/migrate_core_cards/20150508212032_menu_compatibility.rb +0 -24
  207. data/db/migrate_core_cards/20150528084659_add_session_cardtype.rb +0 -18
  208. data/db/migrate_core_cards/20150601133433_add_recent_setting_session_card.rb +0 -18
  209. data/db/migrate_core_cards/20150610171702_add_debugger_session_card.rb +0 -12
  210. data/db/migrate_core_cards/20150610180019_add_recaptcha_key_and_admin_info_cards.rb +0 -58
  211. data/db/migrate_core_cards/20150627205133_fix_script_bootstrap_card_type.rb +0 -7
  212. data/db/migrate_core_cards/20150702130543_remove_edit_toolbar_pinned.rb +0 -9
  213. data/db/migrate_core_cards/20150708224756_add_list_cards.rb +0 -29
  214. data/db/migrate_core_cards/20150903130006_attachment_upload_cards.rb +0 -15
  215. data/db/migrate_core_cards/20150910085603_remove_performance_log_card.rb +0 -10
  216. data/db/migrate_core_cards/20151120180631_add_token_expiration.rb +0 -7
  217. data/db/migrate_core_cards/20160801143221_change_bootstrap_card_type_to_scss.rb +0 -10
  218. data/db/migrate_core_cards/20160804112510_reorganize_scripts.rb +0 -27
  219. data/db/migrate_core_cards/20160908154210_add_trash_card.rb +0 -7
  220. data/db/migrate_core_cards/20161102202156_tweak_recaptcha_setting_cards.rb +0 -17
  221. data/db/migrate_core_cards/20170209132834_email_test_context.rb +0 -49
  222. data/db/migrate_core_cards/20170314175313_add_notification_event_card.rb +0 -20
  223. data/db/migrate_core_cards/20170515101262_add_advanced_edit_cards.rb +0 -20
  224. data/db/migrate_core_cards/20170608083819_add_full_width_layout_card.rb +0 -23
  225. data/db/migrate_core_cards/20170608200649_add_input_options_codename.rb +0 -8
  226. data/db/migrate_core_cards/20180423120222_add_mod_styles_card.rb +0 -20
  227. data/db/migrate_core_cards/20180508210903_add_json_type.rb +0 -10
  228. data/db/migrate_core_cards/20180515175726_add_codenames.rb +0 -8
  229. data/db/migrate_core_cards/20180712042655_head_rule.rb +0 -13
  230. data/db/migrate_core_cards/20181120200937_update_layout.rb +0 -7
  231. data/db/migrate_core_cards/20190204195039_add_rule_card.rb +0 -10
  232. data/db/migrate_core_cards/20190321085735_wagn_to_decko_logo.rb +0 -11
  233. data/db/migrate_core_cards/20190417142612_reorganize_scripts_2.rb +0 -17
  234. data/db/migrate_core_cards/20190424100531_update_credit_image.rb +0 -76
  235. data/db/migrate_core_cards/20190424101004_add_read_anyone_rules.rb +0 -13
  236. data/db/migrate_core_cards/20190503122739_update_pristine_data.rb +0 -18
  237. data/db/migrate_core_cards/20190605133556_tweak_config_cards.rb +0 -10
  238. data/db/migrate_core_cards/20190618110446_add_dropdown_divider.rb +0 -8
  239. data/db/migrate_core_cards/20190621143156_add_role_assign_permissions.rb +0 -9
  240. data/db/migrate_core_cards/20190710090209_homepage_tweaks.rb +0 -13
  241. data/db/migrate_core_cards/20190820155833_update_cardtype_type_structure.rb +0 -7
  242. data/db/migrate_core_cards/20190823220018_cleanup_for_decko_1_0.rb +0 -19
  243. data/db/migrate_core_cards/20190826132738_add_more_guides.rb +0 -7
  244. data/db/migrate_core_cards/20190829093961_cardtype_grouping.rb +0 -16
  245. data/db/migrate_core_cards/20190830131820_setting_settings_aside.rb +0 -17
  246. data/db/migrate_core_cards/20190902161223_add_style_media.rb +0 -7
  247. data/db/migrate_core_cards/20190918200115_ensure_description_card.rb +0 -13
  248. data/db/migrate_core_cards/20191008201046_fixture_fix.rb +0 -11
  249. data/db/migrate_core_cards/20191028135243_add_link_editor_to_tiny_mce_config.rb +0 -9
  250. data/db/migrate_core_cards/20191118145629_codename_fixes.rb +0 -5
  251. data/db/migrate_core_cards/20200821231558_add_nest_list_type.rb +0 -9
  252. data/db/migrate_core_cards/data/1.11_help_text.json +0 -410
  253. data/db/migrate_core_cards/data/1.12_stylesheets/classic_cards.scss +0 -104
  254. data/db/migrate_core_cards/data/1.12_stylesheets/common.scss +0 -228
  255. data/db/migrate_core_cards/data/1.12_stylesheets/right_sidebar.scss +0 -27
  256. data/db/migrate_core_cards/data/1.12_stylesheets/traditional.scss +0 -143
  257. data/db/migrate_core_cards/data/1.13_config_text.json +0 -32
  258. data/db/migrate_core_cards/data/1.14_config_descriptions_etc.json +0 -77
  259. data/db/migrate_core_cards/data/bootstrap_layout.json +0 -96
  260. data/db/migrate_core_cards/data/cards/Xaccount +0 -22
  261. data/db/migrate_core_cards/data/cards/Xaccount_setting-Xright-Xstructure +0 -12
  262. data/db/migrate_core_cards/data/cards/Xall-Xlayout +0 -1
  263. data/db/migrate_core_cards/data/cards/Xcredit +0 -2
  264. data/db/migrate_core_cards/data/cards/Xfooter +0 -3
  265. data/db/migrate_core_cards/data/cards/Xgetting_started +0 -31
  266. data/db/migrate_core_cards/data/cards/Xgetting_started-shark +0 -66
  267. data/db/migrate_core_cards/data/cards/Xgetting_started_link +0 -6
  268. data/db/migrate_core_cards/data/cards/Xheader +0 -19
  269. data/db/migrate_core_cards/data/cards/Xhome +0 -1
  270. data/db/migrate_core_cards/data/cards/Xlogo +0 -1
  271. data/db/migrate_core_cards/data/cards/Xmain_menu +0 -2
  272. data/db/migrate_core_cards/data/cards/Xrecaptcha_setting-Xself-Xstructure +0 -1
  273. data/db/migrate_core_cards/data/cards/Xsidebar +0 -7
  274. data/db/migrate_core_cards/data/cards/Xstructure-Xright-Xguide +0 -12
  275. data/db/migrate_core_cards/data/cards/Xtitle +0 -1
  276. data/db/migrate_core_cards/data/cards/administrator-dashboard +0 -23
  277. data/db/migrate_core_cards/data/cards/administrator-description +0 -1
  278. data/db/migrate_core_cards/data/cards/anyone_signed_in-dashboard +0 -0
  279. data/db/migrate_core_cards/data/cards/cardtype-Xtype-Xguide +0 -24
  280. data/db/migrate_core_cards/data/cards/cardtype-Xtype-Xstructure +0 -3
  281. data/db/migrate_core_cards/data/cards/default_layout +0 -6
  282. data/db/migrate_core_cards/data/cards/full_width_layout +0 -5
  283. data/db/migrate_core_cards/data/cards/help_desk-dashboard +0 -7
  284. data/db/migrate_core_cards/data/cards/help_desk-description +0 -1
  285. data/db/migrate_core_cards/data/cards/home +0 -2
  286. data/db/migrate_core_cards/data/cards/home-Xself-Xlayout +0 -1
  287. data/db/migrate_core_cards/data/cards/home-original +0 -22
  288. data/db/migrate_core_cards/data/cards/home_layout +0 -6
  289. data/db/migrate_core_cards/data/cards/left_sidebar_layout +0 -6
  290. data/db/migrate_core_cards/data/cards/menu +0 -1
  291. data/db/migrate_core_cards/data/cards/right_thin_sidebar_layout +0 -8
  292. data/db/migrate_core_cards/data/cards/role-Xtype-Xstructure +0 -2
  293. data/db/migrate_core_cards/data/cards/shark-dashboard +0 -19
  294. data/db/migrate_core_cards/data/cards/shark-description +0 -1
  295. data/db/migrate_core_cards/data/cards/shark_menu +0 -2
  296. data/db/migrate_core_cards/data/cards.yml +0 -138
  297. data/db/migrate_core_cards/data/decko_logo.svg +0 -1
  298. data/db/migrate_core_cards/data/mailer/follower_notification_email.html +0 -9
  299. data/db/migrate_core_cards/data/mailer/follower_notification_email.txt +0 -11
  300. data/db/migrate_core_cards/data/mailer/mail_config.json +0 -22
  301. data/db/migrate_core_cards/data/mailer/password_reset_email.html +0 -13
  302. data/db/migrate_core_cards/data/mailer/password_reset_email.txt +0 -11
  303. data/db/migrate_core_cards/data/mailer/signup_alert_email.html +0 -7
  304. data/db/migrate_core_cards/data/mailer/signup_alert_email.txt +0 -5
  305. data/db/migrate_core_cards/data/mailer/verification_email.html +0 -12
  306. data/db/migrate_core_cards/data/mailer/verification_email.txt +0 -9
  307. data/db/migrate_core_cards/data/skin_images.json +0 -91
  308. data/db/migrate_core_cards/data/themes/bootstrap_default/_bootswatch.scss +0 -0
  309. data/db/migrate_core_cards/data/themes/bootstrap_default/_variables.scss +0 -867
  310. data/db/migrate_core_cards/data/themes/cerulean/_bootswatch.scss +0 -125
  311. data/db/migrate_core_cards/data/themes/cerulean/_variables.scss +0 -861
  312. data/db/migrate_core_cards/data/themes/cosmo/_bootswatch.scss +0 -237
  313. data/db/migrate_core_cards/data/themes/cosmo/_variables.scss +0 -861
  314. data/db/migrate_core_cards/data/themes/cyborg/_bootswatch.scss +0 -210
  315. data/db/migrate_core_cards/data/themes/cyborg/_variables.scss +0 -861
  316. data/db/migrate_core_cards/data/themes/darkly/_bootswatch.scss +0 -330
  317. data/db/migrate_core_cards/data/themes/darkly/_variables.scss +0 -861
  318. data/db/migrate_core_cards/data/themes/flatly/_bootswatch.scss +0 -313
  319. data/db/migrate_core_cards/data/themes/flatly/_variables.scss +0 -861
  320. data/db/migrate_core_cards/data/themes/journal/_bootswatch.scss +0 -120
  321. data/db/migrate_core_cards/data/themes/journal/_variables.scss +0 -861
  322. data/db/migrate_core_cards/data/themes/lumen/_bootswatch.scss +0 -496
  323. data/db/migrate_core_cards/data/themes/lumen/_variables.scss +0 -861
  324. data/db/migrate_core_cards/data/themes/paper/_bootswatch.scss +0 -607
  325. data/db/migrate_core_cards/data/themes/paper/_variables.scss +0 -861
  326. data/db/migrate_core_cards/data/themes/readable/_bootswatch.scss +0 -174
  327. data/db/migrate_core_cards/data/themes/readable/_variables.scss +0 -861
  328. data/db/migrate_core_cards/data/themes/sandstone/_bootswatch.scss +0 -194
  329. data/db/migrate_core_cards/data/themes/sandstone/_variables.scss +0 -861
  330. data/db/migrate_core_cards/data/themes/simplex/_bootswatch.scss +0 -142
  331. data/db/migrate_core_cards/data/themes/simplex/_variables.scss +0 -861
  332. data/db/migrate_core_cards/data/themes/slate/_bootswatch.scss +0 -417
  333. data/db/migrate_core_cards/data/themes/slate/_variables.scss +0 -861
  334. data/db/migrate_core_cards/data/themes/spacelab/_bootswatch.scss +0 -137
  335. data/db/migrate_core_cards/data/themes/spacelab/_variables.scss +0 -861
  336. data/db/migrate_core_cards/data/themes/superhero/_bootswatch.scss +0 -332
  337. data/db/migrate_core_cards/data/themes/superhero/_variables.scss +0 -861
  338. data/db/migrate_core_cards/data/themes/united/_bootswatch.scss +0 -42
  339. data/db/migrate_core_cards/data/themes/united/_variables.scss +0 -861
  340. data/db/migrate_core_cards/data/themes/yeti/_bootswatch.scss +0 -437
  341. data/db/migrate_core_cards/data/themes/yeti/_variables.scss +0 -861
  342. data/db/seed/README.md +0 -2
  343. data/db/seed/new/card_actions.yml +0 -5913
  344. data/db/seed/new/card_references.yml +0 -6532
  345. data/db/seed/new/cards.yml +0 -14595
  346. data/db/seed/test/fixtures/card_actions.yml +0 -8153
  347. data/db/seed/test/fixtures/card_acts.yml +0 -1039
  348. data/db/seed/test/fixtures/card_changes.yml +0 -230
  349. data/db/seed/test/fixtures/card_references.yml +0 -8471
  350. data/db/seed/test/fixtures/cards.yml +0 -20171
  351. data/db/seed/test/fixtures/file1.txt +0 -1
  352. data/db/seed/test/fixtures/file2.txt +0 -1
  353. data/db/seed/test/fixtures/mao2.jpg +0 -0
  354. data/db/seed/test/fixtures/rails.gif +0 -0
  355. data/db/seed/test/fixtures/schema_migrations.yml +0 -67
  356. data/db/seed/test/fixtures/schema_migrations_core_cards.yml +0 -347
  357. data/db/seed/test/fixtures/schema_migrations_deck.yml +0 -1
  358. data/db/seed/test/fixtures/schema_migrations_deck_cards.yml +0 -5
  359. data/db/test_seed.rb +0 -322
  360. data/lib/card/content/truncate.rb +0 -67
  361. data/lib/card/director/card_methods.rb +0 -45
  362. data/lib/card/env/request_assignments.rb +0 -24
  363. data/lib/card/file_card_creator/abstract_file_card/migration_file.rb +0 -50
  364. data/lib/card/file_card_creator/abstract_file_card/ruby_file.rb +0 -30
  365. data/lib/card/file_card_creator/abstract_file_card/source_file.rb +0 -36
  366. data/lib/card/file_card_creator/abstract_file_card.rb +0 -44
  367. data/lib/card/file_card_creator/haml_card.rb +0 -42
  368. data/lib/card/file_card_creator/output_helper.rb +0 -53
  369. data/lib/card/file_card_creator/script_card.rb +0 -35
  370. data/lib/card/file_card_creator/style_card.rb +0 -25
  371. data/lib/card/file_card_creator.rb +0 -25
  372. data/lib/card/name/fields_and_traits.rb +0 -42
  373. data/lib/cardio/commands/application.rb +0 -10
  374. data/lib/cardio/migration/import/import_data/card_attributes.rb +0 -64
  375. data/lib/cardio/migration/import/import_data/card_content.rb +0 -30
  376. data/lib/cardio/migration/import/import_data.rb +0 -119
  377. data/lib/cardio/migration/import/merger.rb +0 -46
  378. data/lib/cardio/migration/import.rb +0 -125
  379. data/lib/tasks/card.rake +0 -65
  380. data/mod/admin/locales/de.yml +0 -4
  381. data/mod/admin/locales/en.yml +0 -4
  382. data/mod/admin/set/all/admin.rb +0 -16
  383. data/mod/admin/set/self/admin.rb +0 -144
  384. data/mod/admin/set/self/admin_info.rb +0 -40
  385. data/mod/admin/set/self/debugger.rb +0 -3
  386. data/mod/admin/spec/set/self/admin_info_spec.rb +0 -9
  387. data/mod/core/data/production.yml +0 -7
  388. data/mod/core/set/all/collection.rb +0 -53
  389. data/mod/core/spec/set/all/collection_spec.rb +0 -170
  390. data/mod/core/spec/set/all/utils_spec.rb +0 -5
  391. data/mod/standard/data/files/favicon/image-icon.png +0 -0
  392. data/mod/standard/data/files/favicon/image-large.png +0 -0
  393. data/mod/standard/data/files/favicon/image-medium.png +0 -0
  394. data/mod/standard/data/files/favicon/image-original.png +0 -0
  395. data/mod/standard/data/files/favicon/image-small.png +0 -0
  396. data/mod/standard/data/files/logo/image-original.svg +0 -1
@@ -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
@@ -1,95 +1,11 @@
1
- module ClassMethods
2
- def merge_list attribs, opts={}
3
- unmerged = []
4
- attribs.each do |row|
5
- if merge row["name"], row, opts
6
- Rails.logger.info "merged #{row['name']}"
7
- else
8
- unmerged.push row
9
- end
10
- end
11
1
 
12
- if unmerged.empty?
13
- Rails.logger.info "successfully merged all!"
14
- else
15
- unmerged_json = JSON.pretty_generate unmerged
16
- report_unmerged_json unmerged_json, opts[:output_file]
17
- end
18
- unmerged
19
- end
20
-
21
- def report_unmerged_json unmerged_json, output_file
22
- if output_file
23
- ::File.open output_file, "w" do |f|
24
- f.write unmerged_json
25
- end
26
- else
27
- Rails.logger.info "failed to merge:\n\n#{unmerged_json}"
28
- end
29
- end
30
-
31
- def merge name, attribs={}, opts={}
32
- # puts "merging #{name}"
33
- card = fetch name, new: {}
34
- return unless mergeable? card, opts[:pristine]
35
-
36
- resolve_file_attributes! attribs
37
- card.safe_update! attribs
38
- end
39
-
40
- private
41
-
42
- def resolve_file_attributes! attribs
43
- %i[image file].each do |attach|
44
- next unless attribs[attach].is_a?(String)
45
-
46
- attribs[attach] = ::File.open(attribs[attach])
47
- end
48
- end
49
-
50
- def mergeable? card, pristine_only
51
- return true unless pristine_only
52
-
53
- !card.pristine?
54
- end
55
- end
56
-
57
- # separate name and other attributes
58
- def safe_update! attribs
59
- separate_name_update! attribs.delete("name") unless new?
60
- update! attribs if attribs.present?
61
- end
62
-
63
- def separate_name_update! new_name
64
- return if new_name.to_s == name.to_s
65
-
66
- update! name: new_name
67
- end
68
-
69
- # rubocop:disable Style/GlobalVars
70
- def measure desc
71
- $times ||= {}
72
- res = nil
73
- t = Benchmark.measure do
74
- res = yield
75
- end
76
- $times[desc] = $times.key?(desc) ? t + $times[desc] : t
77
- puts "#{desc}: #{t}".red
78
- res
79
- end
80
- # rubocop:enable Style/GlobalVars
81
-
82
- def mod_root modname
83
- if (spec = Gem::Specification.find_by_name "card-mod-#{modname}")
84
- spec.full_gem_path
85
- else
86
- "#{Cardio.gem_root}/mod/#{modname}"
87
- end
2
+ def mod_path modname
3
+ Cardio::Mod.dirs.path modname
88
4
  end
89
5
 
90
6
  delegate :t, to: ::I18n
91
7
 
92
8
  format do
93
9
  delegate :t, to: ::I18n
94
- delegate :measure, to: :card
10
+ delegate :mod_path, to: :card
95
11
  end
@@ -1,3 +1,5 @@
1
+ assign_type :phrase
2
+
1
3
  def history?
2
4
  false
3
5
  end
@@ -0,0 +1,3 @@
1
+ %h5
2
+ = t :core_admin_warn
3
+ = list_tag warnings
@@ -0,0 +1,173 @@
1
+ basket[:tasks].merge!(
2
+ clear_cache: {
3
+ mod: :core,
4
+ execute_policy: -> { Card::Cache.reset_all }
5
+ },
6
+ regenerate_assets: {
7
+ mod: :core,
8
+ execute_policy: -> { Card::Assets.refresh force: true }
9
+ }
10
+ )
11
+
12
+ basket[:warnings] = [:no_email_delivery]
13
+ # For each warning in the basket (eg :my_warning), the core view
14
+ # will run a test by appending a question mark (eg #my_warning?).
15
+ # If it fails it will generate a message by appending message
16
+ # (eg #my_warning_message).
17
+
18
+ def no_email_delivery?
19
+ Card.config.action_mailer.perform_deliveries == false
20
+ end
21
+
22
+ event :admin_tasks, :initialize, on: :update do
23
+ return unless (task = Env.params[:task]&.to_sym) && (task_config = basket[:tasks][task])
24
+ raise Card::Error::PermissionDenied, self unless Auth.always_ok?
25
+
26
+ # when :repair_references then Card::Reference.repair_all
27
+ # when :repair_permissions then Card.repair_all_permissions
28
+ # # when :regenerate_scripts then Card::Assets.refresh_scripts
29
+ # when :clear_history
30
+ # not_allowed "clear history" unless irreversibles_tasks_allowed?
31
+ # Card::Action.delete_old
32
+
33
+ run_task_from_task_basket task, task_config
34
+ abort :success
35
+ end
36
+
37
+ def run_task_from_task_basket task, task_config
38
+ if !irreversibles_tasks_allowed? && task_config[:irreversible]
39
+ not_allowed t("#{task_config[:mod]}_task_#{task}_link_text")
40
+ else
41
+ task_config[:execute_policy]&.call
42
+ end
43
+ end
44
+
45
+ def not_allowed task
46
+ raise Card::Error::PermissionDenied,
47
+ "The admin task '#{task}' is disabled for security reasons.<br>"\
48
+ "You can enable it with the config option 'allow_irreversible_admin_tasks'"
49
+ end
50
+
51
+ def irreversibles_tasks_allowed?
52
+ Cardio.config.allow_irreversible_admin_tasks
53
+ end
54
+
55
+ format :html do
56
+ view :core, cache: :never do
57
+ table_content = basket[:tasks].map do |task, task_config|
58
+ task_row task, task_config[:mod]
59
+ end
60
+ table table_content, header: %w[Task Description]
61
+ end
62
+
63
+ def task_row task, mod
64
+ base = "#{mod}_task_#{task}"
65
+ [
66
+ link_to_card(:admin, t("#{base}_link_text"), path: { action: :update, task: task }),
67
+ t("#{base}_description")
68
+ ]
69
+ end
70
+
71
+ view :warning do
72
+ warnings = basket[:warnings].map do |warning|
73
+ card.send("#{warning}?") ? send("#{warning}_message") : nil
74
+ end
75
+ warnings.compact!
76
+ warnings.empty? ? "" : warning_alert(warnings)
77
+ end
78
+
79
+ def warning_alert warnings
80
+ # 'ADMINISTRATOR WARNING'
81
+ alert(:warning, true) { haml :warning_alert, warnings: warnings }
82
+ end
83
+
84
+ def no_email_delivery_message
85
+ # "Email delivery is turned off."
86
+ # "Change settings in config/application.rb to send sign up notifications."
87
+ t :core_admin_email_off, path: "config/application.rb"
88
+ end
89
+
90
+ # def card_stats
91
+ # [
92
+ # { title: "cards",
93
+ # count: Card.where(trash: false) },
94
+ # { title: "actions",
95
+ # count: Card::Action },
96
+ # # link_text: "clear history",
97
+ # # task: "clear_history" },
98
+ # { title: "references",
99
+ # count: Card::Reference }
100
+ # # link_text: "repair all",
101
+ # # task: "repair_references" }
102
+ # ]
103
+ # end
104
+
105
+ # def cache_stats
106
+ # [
107
+ # { title: "style assets",
108
+ # link_text: "regenerate styles and scripts",
109
+ # task: "regenerate_assets" } # ,
110
+ # # { title: "script assets",
111
+ # # link_text: "regenerate scripts",
112
+ # # task: "regenerate_scripts" }
113
+ # ]
114
+ # # return stats unless Card.config.view_cache#
115
+ # # stats << { title: "view cache",
116
+ # # count: Card::View,
117
+ # # link_text: "clear view cache",
118
+ # # task: "clear_view_cache" }
119
+ # end
120
+
121
+ # def memory_stats
122
+ # oldmem = session[:memory]
123
+ # session[:memory] = newmem = card.profile_memory
124
+ # stats = [
125
+ # { title: "memory now",
126
+ # count: newmem, unit: "M",
127
+ # link_text: "clear cache", task: "clear_cache" }
128
+ # ]
129
+ # return stats unless oldmem
130
+ #
131
+ # stats << { title: "memory prev", count: oldmem, unit: "M" }
132
+ # stats << { title: "memory diff", count: newmem - oldmem, unit: "M" }
133
+ # stats
134
+ # end
135
+ #
136
+ # def stat_row args={}
137
+ # res = [(args[:title] || "")]
138
+ # res << "#{count(args[:count])}#{args[:unit]}"
139
+ # return res unless args[:task]
140
+ #
141
+ # res << link_to_card(:admin, (args[:link_text] || args[:task]),
142
+ # path: { action: :update, task: args[:task] })
143
+ # res
144
+ # end
145
+ #
146
+ # def count counter
147
+ # counter = counter.call if counter.is_a?(Proc)
148
+ # counter.respond_to?(:count) ? counter.count : counter
149
+ # end
150
+
151
+ # def asset_input_cache_count
152
+ # Card.where(right_id: AssetInputCacheID).count
153
+ # end
154
+ #
155
+ # def delete_sessions_link months
156
+ # link_to_card :admin, months, path: { action: :update, months: months,
157
+ # task: "delete_old_sessions" }
158
+ # end
159
+ end
160
+
161
+ # def current_memory_usage
162
+ # `ps -o rss= -p #{Process.pid}`.to_i
163
+ # end
164
+ #
165
+ # def profile_memory &block
166
+ # before = current_memory_usage
167
+ # if block_given?
168
+ # instance_eval(&block)
169
+ # else
170
+ # before = 0
171
+ # end
172
+ # (current_memory_usage - before) / 1024.to_i
173
+ # end