card 1.17.4 → 1.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (389) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/card.gemspec +24 -25
  4. data/config/initializers/01_init_ruby_extensions.rb +0 -4
  5. data/config/initializers/inflections.rb +1 -1
  6. data/config/initializers/notification.rb +2 -2
  7. data/db/migrate/20110511221913_require_earlier_migrations.rb +3 -3
  8. data/db/migrate/20120105203350_require_1_8_migrations.rb +3 -3
  9. data/db/migrate/20121111025347_require_1_10_migrations.rb +3 -3
  10. data/db/migrate/20130106052640_table_cleanup.rb +4 -4
  11. data/db/migrate/20130411210957_update_codenames.rb +2 -2
  12. data/db/migrate/20141001105348_move_revisions_to_actions.rb +4 -4
  13. data/db/migrate/20141121172918_rename_card_migration_table.rb +2 -2
  14. data/db/migrate/20141208132159_remove_present_from_reference_table.rb +2 -2
  15. data/db/migrate/20141216053032_better_index_names.rb +9 -9
  16. data/db/migrate_core_cards/20120611203506_rails_inflection_updates.rb +29 -32
  17. data/db/migrate_core_cards/20130411191151_renaming_for_menu.rb +3 -4
  18. data/db/migrate_core_cards/20130411211600_delete_old_related_tab_cards.rb +1 -1
  19. data/db/migrate_core_cards/20130419215612_import_help_text.rb +1 -2
  20. data/db/migrate_core_cards/20130823192433_add_style_cards.rb +3 -3
  21. data/db/migrate_core_cards/20130910183318_move_styles_to_content.rb +2 -3
  22. data/db/migrate_core_cards/20130920214038_jsonize_tinymce.rb +2 -2
  23. data/db/migrate_core_cards/20130920291703_update_stylesheets.rb +1 -2
  24. data/db/migrate_core_cards/20130927191728_account_events.rb +5 -6
  25. data/db/migrate_core_cards/20131016172445_common_css_patch.rb +2 -3
  26. data/db/migrate_core_cards/20140110193325_reset_account_request_type.rb +0 -1
  27. data/db/migrate_core_cards/20140307231621_user_data_to_cards.rb +23 -32
  28. data/db/migrate_core_cards/20140317035504_account_requests_to_signups.rb +1 -7
  29. data/db/migrate_core_cards/20140512155840_add_script_cards.rb +21 -24
  30. data/db/migrate_core_cards/20140629222005_add_email_cards.rb +17 -22
  31. data/db/migrate_core_cards/20140725180118_config_card_updates.rb +2 -2
  32. data/db/migrate_core_cards/20141111083921_delete_machine_output.rb +1 -3
  33. data/db/migrate_core_cards/20141115034214_config_descriptions_etc.rb +2 -2
  34. data/db/migrate_core_cards/20141119001955_make_symlinks_relative.rb +3 -3
  35. data/db/migrate_core_cards/20141120120605_fix_notification_html_message.rb +1 -1
  36. data/db/migrate_core_cards/20141204061304_watchers_to_following.rb +8 -12
  37. data/db/migrate_core_cards/20141208162106_add_ace_script.rb +2 -3
  38. data/db/migrate_core_cards/20141216155251_add_more_following_cards.rb +10 -10
  39. data/db/migrate_core_cards/20150202143810_import_bootstrap_layout.rb +10 -12
  40. data/db/migrate_core_cards/20150220134731_following_to_follow_rule.rb +4 -4
  41. data/db/migrate_core_cards/20150317162412_bootstrap_themes.rb +3 -3
  42. data/db/migrate_core_cards/20150326205655_bootswatch_themes.rb +7 -7
  43. data/db/migrate_core_cards/20150429090551_search_card_context.rb +18 -20
  44. data/db/migrate_core_cards/20150508212032_menu_compatibility.rb +3 -7
  45. data/db/migrate_core_cards/20150510031118_fix_skin_images.rb +2 -3
  46. data/db/migrate_core_cards/20150528084659_add_session_cardtype.rb +3 -3
  47. data/db/migrate_core_cards/20150601133433_add_recent_setting_session_card.rb +4 -4
  48. data/db/migrate_core_cards/20150610171702_add_debugger_session_card.rb +4 -4
  49. data/db/migrate_core_cards/20150610180019_add_recaptcha_key_and_admin_info_cards.rb +5 -11
  50. data/db/migrate_core_cards/20150724123438_update_file_and_image_cards.rb +29 -35
  51. data/db/migrate_core_cards/20150824135418_update_file_history.rb +10 -14
  52. data/db/migrate_core_cards/20150903130006_attachment_upload_cards.rb +1 -1
  53. data/db/schema.rb +92 -94
  54. data/db/seed/new/card_actions.yml +461 -469
  55. data/db/seed/new/card_acts.yml +154 -172
  56. data/db/seed/new/card_changes.yml +4076 -4031
  57. data/db/seed/new/card_references.yml +1584 -1927
  58. data/db/seed/new/cards.yml +2095 -2112
  59. data/db/seed/test/fixtures/card_actions.yml +1497 -1505
  60. data/db/seed/test/fixtures/card_acts.yml +454 -472
  61. data/db/seed/test/fixtures/card_changes.yml +7309 -7263
  62. data/db/seed/test/fixtures/card_references.yml +2263 -2613
  63. data/db/seed/test/fixtures/cards.yml +3298 -3316
  64. data/db/seed/test/seed.rb +3 -0
  65. data/lib/card.rb +17 -9
  66. data/lib/card/active_record_ext.rb +6 -8
  67. data/lib/card/active_record_helper.rb +42 -32
  68. data/lib/card/auth.rb +3 -3
  69. data/lib/card/cache.rb +4 -4
  70. data/lib/card/cache/persistent.rb +9 -5
  71. data/lib/card/cache/temporary.rb +5 -5
  72. data/lib/card/chunk.rb +1 -1
  73. data/lib/card/codename.rb +3 -2
  74. data/lib/card/content.rb +62 -57
  75. data/lib/card/core_ext.rb +20 -30
  76. data/lib/card/diff.rb +88 -76
  77. data/lib/card/director_register.rb +66 -0
  78. data/lib/card/env.rb +14 -17
  79. data/lib/card/exceptions.rb +7 -9
  80. data/lib/card/format.rb +18 -367
  81. data/lib/card/format/nest.rb +183 -0
  82. data/lib/card/format/permission.rb +63 -0
  83. data/lib/card/format/render.rb +140 -0
  84. data/lib/card/loader.rb +17 -26
  85. data/lib/card/location.rb +6 -6
  86. data/lib/card/mailer.rb +4 -7
  87. data/lib/card/migration.rb +1 -1
  88. data/lib/card/name.rb +3 -6
  89. data/lib/card/query.rb +8 -8
  90. data/lib/card/query/attributes.rb +6 -6
  91. data/lib/card/query/clause.rb +10 -10
  92. data/lib/card/query/join.rb +7 -9
  93. data/lib/card/query/reference.rb +17 -19
  94. data/lib/card/query/sql_statement.rb +2 -2
  95. data/lib/card/query/value.rb +15 -16
  96. data/lib/card/set.rb +106 -209
  97. data/lib/card/set/event.rb +126 -0
  98. data/lib/card/set_pattern.rb +42 -29
  99. data/lib/card/simplecov_helper.rb +19 -19
  100. data/lib/card/spec_helper.rb +40 -16
  101. data/lib/card/stage.rb +72 -0
  102. data/lib/card/stage_director.rb +231 -0
  103. data/lib/card/subcards.rb +56 -24
  104. data/lib/card/subdirector_array.rb +31 -0
  105. data/lib/card/success.rb +15 -18
  106. data/lib/card/version.rb +1 -2
  107. data/lib/card/view_cache.rb +4 -4
  108. data/lib/card/view_name.rb +10 -8
  109. data/lib/cardio.rb +1 -1
  110. data/lib/generators/card.rb +2 -4
  111. data/lib/generators/card/format/format_generator.rb +4 -4
  112. data/lib/generators/card/migration/migration_generator.rb +6 -6
  113. data/lib/generators/card/set/set_generator.rb +5 -6
  114. data/mod/01_core/chunk/include.rb +2 -1
  115. data/mod/01_core/chunk/link.rb +2 -2
  116. data/mod/01_core/chunk/literal.rb +6 -9
  117. data/mod/01_core/chunk/query_reference.rb +1 -1
  118. data/mod/01_core/chunk/reference.rb +2 -2
  119. data/mod/01_core/chunk/uri.rb +52 -63
  120. data/mod/01_core/format/html_format.rb +8 -12
  121. data/mod/01_core/format/text_format.rb +1 -1
  122. data/mod/01_core/set/all/actify.rb +96 -0
  123. data/mod/01_core/set/all/active_card.rb +7 -7
  124. data/mod/01_core/set/all/collection.rb +19 -20
  125. data/mod/01_core/set/all/content.rb +9 -7
  126. data/mod/01_core/set/all/erb.rb +5 -5
  127. data/mod/01_core/set/all/event.rb +60 -0
  128. data/mod/01_core/set/all/fetch.rb +13 -19
  129. data/mod/01_core/set/all/haml.rb +1 -1
  130. data/mod/01_core/set/all/initialize.rb +35 -41
  131. data/mod/01_core/set/all/location_history.rb +3 -5
  132. data/mod/01_core/set/all/name.rb +19 -68
  133. data/mod/01_core/set/all/name_validations.rb +56 -0
  134. data/mod/01_core/set/all/pattern.rb +2 -2
  135. data/mod/01_core/set/all/permissions.rb +14 -20
  136. data/mod/01_core/set/all/phases.rb +9 -200
  137. data/mod/01_core/set/all/references.rb +10 -10
  138. data/mod/01_core/set/all/rules.rb +3 -4
  139. data/mod/01_core/set/all/stages.rb +24 -0
  140. data/mod/01_core/set/all/states.rb +4 -4
  141. data/mod/01_core/set/all/subcards.rb +16 -26
  142. data/mod/01_core/set/all/templating.rb +1 -3
  143. data/mod/01_core/set/all/tracked_attributes.rb +47 -48
  144. data/mod/01_core/set/all/trash.rb +10 -10
  145. data/mod/01_core/set/all/type.rb +9 -8
  146. data/mod/01_core/set/all/utils.rb +10 -14
  147. data/mod/01_core/set/all/view_cache.rb +2 -2
  148. data/mod/01_core/set_pattern/01_all.rb +3 -3
  149. data/mod/01_core/set_pattern/02_all_plus.rb +3 -3
  150. data/mod/01_core/set_pattern/03_type.rb +2 -2
  151. data/mod/01_core/set_pattern/04_star.rb +3 -3
  152. data/mod/01_core/set_pattern/05_rstar.rb +3 -3
  153. data/mod/01_core/set_pattern/06_right.rb +2 -2
  154. data/mod/01_core/set_pattern/07_type_plus_right.rb +2 -2
  155. data/mod/01_core/set_pattern/08_self.rb +1 -1
  156. data/mod/01_core/spec/chunk/literal_spec.rb +7 -8
  157. data/mod/01_core/spec/chunk/uri_spec.rb +140 -142
  158. data/mod/01_core/spec/format/html_format_spec.rb +72 -57
  159. data/mod/01_core/spec/set/all/collection_spec.rb +63 -43
  160. data/mod/01_core/spec/set/all/content_spec.rb +4 -4
  161. data/mod/01_core/spec/set/all/fetch_spec.rb +12 -3
  162. data/mod/01_core/spec/set/all/name_spec.rb +3 -4
  163. data/mod/01_core/spec/set/all/pattern_spec.rb +32 -35
  164. data/mod/01_core/spec/set/all/permissions_spec.rb +17 -5
  165. data/mod/01_core/spec/set/all/phases_spec.rb +0 -1
  166. data/mod/01_core/spec/set/all/references_spec.rb +1 -1
  167. data/mod/01_core/spec/set/all/rules2_spec.rb +79 -91
  168. data/mod/01_core/spec/set/all/rules_spec.rb +63 -56
  169. data/mod/01_core/spec/set/all/templating_spec.rb +0 -1
  170. data/mod/01_core/spec/set/all/tracked_attributes_spec.rb +4 -5
  171. data/mod/01_core/spec/set/all/trash_spec.rb +23 -1
  172. data/mod/01_core/spec/set/all/type_spec.rb +2 -5
  173. data/mod/01_history/lib/card/action.rb +8 -10
  174. data/mod/01_history/set/all/actions.rb +2 -4
  175. data/mod/01_history/set/all/content_history.rb +38 -32
  176. data/mod/01_history/set/all/history.rb +20 -17
  177. data/mod/02_basic_types/format/rss_format.rb +0 -1
  178. data/mod/02_basic_types/set/all/all_css.rb +9 -13
  179. data/mod/02_basic_types/set/all/all_csv.rb +14 -17
  180. data/mod/02_basic_types/set/all/all_js.rb +3 -4
  181. data/mod/02_basic_types/set/all/base.rb +2 -2
  182. data/mod/02_basic_types/set/all/file.rb +2 -5
  183. data/mod/02_basic_types/set/all/json.rb +19 -18
  184. data/mod/02_basic_types/set/all/rss.rb +3 -3
  185. data/mod/02_basic_types/set/all/text.rb +1 -3
  186. data/mod/02_basic_types/set/type/html.rb +4 -8
  187. data/mod/02_basic_types/set/type/plain_text.rb +2 -3
  188. data/mod/02_basic_types/set/type/pointer.rb +82 -92
  189. data/mod/02_basic_types/spec/set/all/all_css_spec.rb +2 -2
  190. data/mod/02_basic_types/spec/set/all/all_csv_spec.rb +6 -4
  191. data/mod/02_basic_types/spec/set/all/base_spec.rb +6 -6
  192. data/mod/02_basic_types/spec/set/all/json_spec.rb +8 -8
  193. data/mod/02_basic_types/spec/set/type/plain_text_spec.rb +3 -3
  194. data/mod/02_basic_types/spec/set/type/pointer_spec.rb +29 -32
  195. data/mod/03_machines/lib/card/machine.rb +95 -81
  196. data/mod/03_machines/lib/card/machine_input.rb +35 -34
  197. data/mod/03_machines/set/right/machine_input.rb +1 -1
  198. data/mod/03_machines/set/self/script_ace.rb +2 -3
  199. data/mod/03_machines/set/self/script_card_menu.rb +2 -3
  200. data/mod/03_machines/set/self/script_jquery_helper.rb +2 -2
  201. data/mod/03_machines/set/self/script_slot.rb +2 -2
  202. data/mod/03_machines/set/self/style_bootstrap_compatible.rb +1 -1
  203. data/mod/03_machines/set/self/style_cards.rb +1 -1
  204. data/mod/03_machines/set/self/style_jquery_ui_smoothness.rb +0 -1
  205. data/mod/03_machines/set/type/coffee_script.rb +9 -13
  206. data/mod/03_machines/set/type/css.rb +12 -13
  207. data/mod/03_machines/set/type/java_script.rb +6 -8
  208. data/mod/03_machines/set/type/scss.rb +4 -5
  209. data/mod/03_machines/set/type/skin.rb +3 -6
  210. data/mod/03_machines/spec/lib/shared_machine_examples.rb +31 -38
  211. data/mod/03_machines/spec/lib/shared_machine_input_examples.rb +7 -8
  212. data/mod/03_machines/spec/set/type/coffeescript_spec.rb +19 -13
  213. data/mod/03_machines/spec/set/type/css_spec.rb +22 -16
  214. data/mod/03_machines/spec/set/type/scss_spec.rb +28 -21
  215. data/mod/03_machines/spec/set/type/skin_spec.rb +28 -30
  216. data/mod/04_settings/lib/card/setting.rb +4 -4
  217. data/mod/04_settings/set/abstract/permission.rb +30 -37
  218. data/mod/04_settings/set/right/add_help.rb +3 -3
  219. data/mod/04_settings/set/right/script.rb +4 -5
  220. data/mod/04_settings/set/right/structure.rb +3 -4
  221. data/mod/04_settings/set/right/style.rb +3 -3
  222. data/mod/04_settings/set/self/add_help.rb +1 -1
  223. data/mod/04_settings/set/self/input.rb +1 -1
  224. data/mod/04_settings/set/self/on_create.rb +1 -1
  225. data/mod/04_settings/set/self/options.rb +1 -1
  226. data/mod/04_settings/set/self/options_label.rb +1 -1
  227. data/mod/04_settings/set/type/setting.rb +29 -44
  228. data/mod/04_settings/spec/set/right/comment_spec.rb +9 -12
  229. data/mod/04_settings/spec/set/right/script_spec.rb +7 -7
  230. data/mod/04_settings/spec/set/right/structure_spec.rb +13 -12
  231. data/mod/04_settings/spec/set/right/style_spec.rb +13 -13
  232. data/mod/04_settings/spec/set/type/setting_spec.rb +1 -1
  233. data/mod/05_email/format/email_html_format.rb +1 -1
  234. data/mod/05_email/format/email_text_format.rb +2 -2
  235. data/mod/05_email/lib/card/follow_option.rb +12 -15
  236. data/mod/05_email/set/all/email_html.rb +2 -3
  237. data/mod/05_email/set/all/email_text.rb +3 -3
  238. data/mod/05_email/set/all/follow.rb +14 -22
  239. data/mod/05_email/set/all/notify.rb +11 -11
  240. data/mod/05_email/set/all/observer.rb +7 -8
  241. data/mod/05_email/set/right/bcc.rb +4 -9
  242. data/mod/05_email/set/right/follow.rb +26 -39
  243. data/mod/05_email/set/right/follow_fields.rb +2 -2
  244. data/mod/05_email/set/right/followers.rb +3 -1
  245. data/mod/05_email/set/right/following.rb +13 -16
  246. data/mod/05_email/set/self/always.rb +1 -2
  247. data/mod/05_email/set/self/created.rb +4 -6
  248. data/mod/05_email/set/self/edited.rb +3 -7
  249. data/mod/05_email/set/self/follow_defaults.rb +11 -12
  250. data/mod/05_email/set/self/never.rb +2 -4
  251. data/mod/05_email/set/type/email_template.rb +40 -27
  252. data/mod/05_email/set/type_plus_right/user/follow.rb +159 -157
  253. data/mod/05_email/spec/set/all/follow_spec.rb +28 -37
  254. data/mod/05_email/spec/set/all/notify_spec.rb +21 -26
  255. data/mod/05_email/spec/set/all/observer_spec.rb +58 -37
  256. data/mod/05_email/spec/set/right/followers_spec.rb +9 -14
  257. data/mod/05_email/spec/set/right/following_spec.rb +1 -1
  258. data/mod/05_email/spec/set/self/follow_defaults_spec.rb +1 -1
  259. data/mod/05_standard/lib/carrier_wave/cardmount.rb +9 -9
  260. data/mod/05_standard/lib/file_uploader.rb +8 -13
  261. data/mod/05_standard/lib/image_uploader.rb +8 -9
  262. data/mod/05_standard/set/abstract/attachment.rb +26 -43
  263. data/mod/05_standard/set/all/account.rb +2 -2
  264. data/mod/05_standard/set/all/comment.rb +11 -13
  265. data/mod/05_standard/set/all/error.rb +18 -18
  266. data/mod/05_standard/set/all/event_viz.rb +16 -29
  267. data/mod/05_standard/set/all/links.rb +35 -34
  268. data/mod/05_standard/set/all/list_changes.rb +10 -12
  269. data/mod/05_standard/set/all/rich_html/content.rb +13 -13
  270. data/mod/05_standard/set/all/rich_html/editing.rb +5 -5
  271. data/mod/05_standard/set/all/rich_html/form.rb +22 -26
  272. data/mod/05_standard/set/all/rich_html/header.rb +18 -25
  273. data/mod/05_standard/set/all/rich_html/menu.rb +20 -22
  274. data/mod/05_standard/set/all/rich_html/modal.rb +3 -3
  275. data/mod/05_standard/set/all/rich_html/toolbar.rb +49 -58
  276. data/mod/05_standard/set/all/rich_html/wrapper.rb +40 -41
  277. data/mod/05_standard/set/right/account.rb +26 -14
  278. data/mod/05_standard/set/right/email.rb +2 -2
  279. data/mod/05_standard/set/right/password.rb +6 -5
  280. data/mod/05_standard/set/right/salt.rb +2 -2
  281. data/mod/05_standard/set/right/stats.rb +17 -20
  282. data/mod/05_standard/set/right/token.rb +1 -1
  283. data/mod/05_standard/set/right/when_created.rb +1 -1
  284. data/mod/05_standard/set/right/when_last_edited.rb +1 -1
  285. data/mod/05_standard/set/rstar/rules.rb +3 -3
  286. data/mod/05_standard/set/rstar/rules_editor.rb +39 -39
  287. data/mod/05_standard/set/self/account_links.rb +21 -22
  288. data/mod/05_standard/set/self/admin_info.rb +5 -5
  289. data/mod/05_standard/set/self/alerts.rb +1 -1
  290. data/mod/05_standard/set/self/all.rb +1 -1
  291. data/mod/05_standard/set/self/foot.rb +1 -1
  292. data/mod/05_standard/set/self/head.rb +19 -22
  293. data/mod/05_standard/set/self/navbox.rb +3 -7
  294. data/mod/05_standard/set/self/now.rb +1 -1
  295. data/mod/05_standard/set/self/recent.rb +19 -25
  296. data/mod/05_standard/set/self/search.rb +2 -4
  297. data/mod/05_standard/set/self/signin.rb +6 -6
  298. data/mod/05_standard/set/self/stats.rb +31 -38
  299. data/mod/05_standard/set/self/version.rb +1 -2
  300. data/mod/05_standard/set/type/basic.rb +15 -17
  301. data/mod/05_standard/set/type/cardtype.rb +3 -3
  302. data/mod/05_standard/set/type/date.rb +1 -2
  303. data/mod/05_standard/set/type/file.rb +22 -33
  304. data/mod/05_standard/set/type/image.rb +30 -23
  305. data/mod/05_standard/set/type/layout_type.rb +4 -4
  306. data/mod/05_standard/set/type/list.rb +32 -38
  307. data/mod/05_standard/set/type/listed_by.rb +11 -13
  308. data/mod/05_standard/set/type/number.rb +5 -6
  309. data/mod/05_standard/set/type/phrase.rb +1 -1
  310. data/mod/05_standard/set/type/search_type.rb +25 -23
  311. data/mod/05_standard/set/type/session.rb +2 -3
  312. data/mod/05_standard/set/type/set.rb +46 -51
  313. data/mod/05_standard/set/type/signup.rb +18 -19
  314. data/mod/05_standard/set/type/toggle.rb +5 -5
  315. data/mod/05_standard/set/type/user.rb +6 -6
  316. data/mod/05_standard/spec/chunk/include_spec.rb +115 -98
  317. data/mod/05_standard/spec/chunk/link_spec.rb +58 -31
  318. data/mod/05_standard/spec/chunk/query_reference_spec.rb +12 -14
  319. data/mod/05_standard/spec/set/all/email_html_spec.rb +3 -3
  320. data/mod/05_standard/spec/set/all/error_spec.rb +3 -3
  321. data/mod/05_standard/spec/set/all/history_spec.rb +52 -38
  322. data/mod/05_standard/spec/set/all/links_spec.rb +2 -2
  323. data/mod/05_standard/spec/set/all/rich_html/editing_spec.rb +0 -1
  324. data/mod/05_standard/spec/set/all/rich_html/form_spec.rb +11 -11
  325. data/mod/05_standard/spec/set/all/rich_html/wrapper_spec.rb +4 -4
  326. data/mod/05_standard/spec/set/right/email_spec.rb +1 -4
  327. data/mod/05_standard/spec/set/right/password_spec.rb +4 -7
  328. data/mod/05_standard/spec/set/right/stats_spec.rb +2 -3
  329. data/mod/05_standard/spec/set/right/when_created_spec.rb +1 -1
  330. data/mod/05_standard/spec/set/right/when_last_edited_spec.rb +1 -1
  331. data/mod/05_standard/spec/set/rstar/rules_spec.rb +6 -6
  332. data/mod/05_standard/spec/set/self/all_spec.rb +11 -13
  333. data/mod/05_standard/spec/set/self/head_spec.rb +1 -3
  334. data/mod/05_standard/spec/set/self/navbox_spec.rb +1 -1
  335. data/mod/05_standard/spec/set/self/now_spec.rb +2 -2
  336. data/mod/05_standard/spec/set/self/signin_spec.rb +1 -1
  337. data/mod/05_standard/spec/set/self/stats_spec.rb +1 -1
  338. data/mod/05_standard/spec/set/self/version_spec.rb +2 -2
  339. data/mod/05_standard/spec/set/type/cardtype_spec.rb +3 -4
  340. data/mod/05_standard/spec/set/type/date_spec.rb +1 -1
  341. data/mod/05_standard/spec/set/type/email_template_spec.rb +5 -5
  342. data/mod/05_standard/spec/set/type/file_spec.rb +50 -28
  343. data/mod/05_standard/spec/set/type/html_spec.rb +12 -7
  344. data/mod/05_standard/spec/set/type/image_spec.rb +55 -45
  345. data/mod/05_standard/spec/set/type/layout_type_spec.rb +2 -2
  346. data/mod/05_standard/spec/set/type/listed_by_spec.rb +2 -2
  347. data/mod/05_standard/spec/set/type/number_spec.rb +1 -1
  348. data/mod/05_standard/spec/set/type/phrase_spec.rb +1 -1
  349. data/mod/05_standard/spec/set/type/search_type_spec.rb +15 -16
  350. data/mod/05_standard/spec/set/type/set_spec.rb +16 -17
  351. data/mod/05_standard/spec/set/type/signup_spec.rb +7 -5
  352. data/mod/05_standard/spec/set/type/toggle_spec.rb +4 -4
  353. data/mod/05_standard/spec/set/type/uri_spec.rb +11 -11
  354. data/mod/05_standard/spec/set/type/user_spec.rb +0 -1
  355. data/mod/06_bootstrap/set/all/bootstrap/form.rb +9 -10
  356. data/mod/06_bootstrap/set/all/bootstrap/helper.rb +22 -27
  357. data/mod/06_bootstrap/set/all/bootstrap/wrapper.rb +1 -2
  358. data/mod/06_bootstrap/set/all/rich_bootstrap.rb +1 -3
  359. data/mod/06_bootstrap/set/self/bootstrap_cards.rb +2 -2
  360. data/mod/06_bootstrap/set/self/bootstrap_js.rb +2 -2
  361. data/mod/06_bootstrap/set/self/bootswatch_shared.rb +19 -19
  362. data/mod/06_bootstrap/set/self/smartmenu_css.rb +2 -2
  363. data/mod/06_bootstrap/set/self/smartmenu_js.rb +3 -3
  364. data/mod/06_bootstrap/spec/set/all/bootstrap/form_spec.rb +5 -5
  365. data/spec/lib/card/action_spec.rb +4 -4
  366. data/spec/lib/card/cache_spec.rb +3 -5
  367. data/spec/lib/card/chunk_spec.rb +6 -8
  368. data/spec/lib/card/codename_spec.rb +4 -6
  369. data/spec/lib/card/content_spec.rb +12 -17
  370. data/spec/lib/card/diff_spec.rb +59 -61
  371. data/spec/lib/card/format_spec.rb +55 -34
  372. data/spec/lib/card/loader_spec.rb +35 -37
  373. data/spec/lib/card/name_spec.rb +159 -145
  374. data/spec/lib/card/query_spec.rb +4 -4
  375. data/spec/lib/card/reference_spec.rb +24 -24
  376. data/spec/lib/card/set_pattern_spec.rb +3 -3
  377. data/spec/lib/card/stage_director_spec.rb +218 -0
  378. data/spec/lib/card/subcards_spec.rb +12 -16
  379. data/spec/lib/card/success_spec.rb +16 -18
  380. data/spec/lib/card/view_cache_spec.rb +1 -1
  381. data/spec/mailers/mailer_spec.rb +3 -5
  382. data/spec/models/card/cardtype_spec.rb +40 -51
  383. data/spec/models/card/create_spec.rb +58 -39
  384. data/spec/models/card/trash_spec.rb +23 -32
  385. data/spec/models/card/type_transition_spec.rb +41 -32
  386. data/spec/models/card/validation_spec.rb +13 -15
  387. data/spec/models/card_spec.rb +48 -59
  388. data/spec/spec_helper.rb +26 -31
  389. metadata +16 -2
@@ -1,21 +1,19 @@
1
1
  include Card::FollowOption
2
2
 
3
- self.restrictive_follow_opts position: 1
3
+ restrictive_follow_opts position: 1
4
4
 
5
- self.follower_candidate_ids do |card|
6
- [ card.creator_id ]
5
+ follower_candidate_ids do |card|
6
+ [card.creator_id]
7
7
  end
8
8
 
9
-
10
9
  def title
11
10
  'Following content you created'
12
11
  end
13
12
 
14
13
  def label
15
- "follow if I created"
14
+ 'follow if I created'
16
15
  end
17
16
 
18
17
  def description set_card
19
18
  "#{set_card.follow_label} I created"
20
19
  end
21
-
@@ -1,24 +1,20 @@
1
1
  include Card::FollowOption
2
2
 
3
- self.restrictive_follow_opts position: 2
3
+ restrictive_follow_opts position: 2
4
4
 
5
- self.follower_candidate_ids do |card|
5
+ follower_candidate_ids do |card|
6
6
  # FIXME? - could optimize by not using cards table...
7
7
  Card.search editor_of: card.name, return: :id
8
8
  end
9
9
 
10
-
11
10
  def title
12
11
  'Following content you edited'
13
12
  end
14
13
 
15
14
  def label
16
- "follow if I edited"
15
+ 'follow if I edited'
17
16
  end
18
17
 
19
18
  def description set_card
20
19
  "#{set_card.follow_label} I edited"
21
20
  end
22
-
23
-
24
-
@@ -1,5 +1,5 @@
1
- event :update_follow_rules,
2
- after: :store, on: :save, when: proc { |c| c.update_all_users } do
1
+ event :update_follow_rules, :finalize,
2
+ on: :save, when: proc { |c| c.update_all_users } do
3
3
  defaults = item_names.map do |item|
4
4
  if (set_card = Card.fetch item.to_name.left) && set_card.type_code == :set
5
5
  option_card = Card.fetch(item.to_name.right) ||
@@ -18,12 +18,11 @@ event :update_follow_rules,
18
18
  Card.search(type: 'user').each do |user|
19
19
  defaults.each do |set_card, option|
20
20
  follow_rule = Card.fetch(set_card.follow_rule_name(user.name), new: {})
21
- if follow_rule
22
- follow_rule.drop_item '*never'
23
- follow_rule.drop_item '*always'
24
- follow_rule.add_item option
25
- follow_rule.save!
26
- end
21
+ next unless follow_rule
22
+ follow_rule.drop_item '*never'
23
+ follow_rule.drop_item '*always'
24
+ follow_rule.add_item option
25
+ follow_rule.save!
27
26
  end
28
27
  end
29
28
  end
@@ -44,11 +43,11 @@ format :html do
44
43
  view :confirm_update_all do |args|
45
44
  wrap args do
46
45
  alert 'info' do
47
- %{
46
+ %(
48
47
  <h1>Are you sure you want to change the default follow rules?</h1>
49
48
  <p>You may choose to update all existing users.
50
49
  This may take a while. </p>
51
- }
50
+ )
52
51
  end
53
52
  end
54
53
  end
@@ -59,11 +58,11 @@ format :html do
59
58
  success: '_self',
60
59
  card: { update_all_users: false }
61
60
  )
62
- args[:buttons] = %{
61
+ args[:buttons] = %(
63
62
  #{submit_button text: 'Submit and update all users',
64
63
  disable_with: 'Updating', class: 'follow-updater'}
65
64
  #{button_tag 'Submit', class: 'follow'}
66
65
  #{cancel_button href: path(view: :edit, id: card.id)}
67
- }
66
+ )
68
67
  end
69
68
  end
@@ -1,9 +1,8 @@
1
1
  include Card::FollowOption
2
2
 
3
- self.follow_opts position: 3
4
-
5
- self.follow_test { |follower_id, accounted_ids| false }
3
+ follow_opts position: 3
6
4
 
5
+ follow_test { |_follower_id, _accounted_ids| false }
7
6
 
8
7
  def title
9
8
  'Ignoring'
@@ -12,4 +11,3 @@ end
12
11
  def label
13
12
  'ignore'
14
13
  end
15
-
@@ -4,22 +4,21 @@ def clean_html?
4
4
  end
5
5
 
6
6
  def deliver args={}
7
- begin
8
- mail = format.render_mail(args)
9
- mail.deliver
10
- rescue Net::SMTPError => exception
11
- errors.add :exception, exception.message
12
- end
7
+ mail = format.render_mail(args)
8
+ mail.deliver
9
+ rescue Net::SMTPError => exception
10
+ errors.add :exception, exception.message
13
11
  end
14
12
 
15
13
  def process_email_field field, config, args
16
14
  config[field] =
17
15
  if args[field]
18
16
  args[field]
19
- elsif field_card = fetch(trait: field)
17
+ elsif (field_card = fetch(trait: field))
20
18
  # configuration can be anything visible to configurer
21
- user = ( args[:follower] and Card.fetch(args[:follower]) ) || field_card.updater
22
- Auth.as( user ) do
19
+ user = (args[:follower] && Card.fetch(args[:follower])) ||
20
+ field_card.updater
21
+ Auth.as(user) do
23
22
  yield(field_card)
24
23
  end
25
24
  else
@@ -28,10 +27,11 @@ def process_email_field field, config, args
28
27
  end
29
28
 
30
29
  def process_message_field field, config, args, format, special_args=nil
31
- process_email_field( field, config, args ) do |field_card|
30
+ process_email_field(field, config, args) do |field_card|
32
31
  content_args = args.clone
33
32
  content_args.merge! special_args if special_args
34
- field_card.contextual_content args[:context], { format: format }, content_args
33
+ field_card.contextual_content args[:context], { format: format },
34
+ content_args
35
35
  end
36
36
  end
37
37
 
@@ -40,31 +40,44 @@ def email_config args={}
40
40
  args[:context] ||= self
41
41
 
42
42
  [:to, :from, :cc, :bcc].each do |field_name|
43
- process_email_field( field_name, config, args ) do |field_card|
44
- field_card.process_email_addresses args[:context], {format: 'email_text'}, args
43
+ process_email_field(field_name, config, args) do |field_card|
44
+ field_card.process_email_addresses(
45
+ args[:context], { format: 'email_text' }, args
46
+ )
45
47
  end
46
48
  end
47
- process_email_field( :attach, config, args ) do |field_card|
49
+ process_email_field(:attach, config, args) do |field_card|
48
50
  field_card.extended_item_contents args[:context]
49
51
  end
50
- process_message_field :subject, config, args, 'email_text', content_opts: { chunk_list: :inclusion_only }
52
+ process_message_field :subject, config, args, 'email_text',
53
+ content_opts: { chunk_list: :nest_only }
51
54
  process_message_field :text_message, config, args, 'email_text'
52
55
  process_message_field :html_message, config, args, 'email_html'
53
- config[:html_message] = Card::Mailer.layout config[:html_message] if config[:html_message].present?
54
-
56
+ if config[:html_message].present?
57
+ config[:html_message] = Card::Mailer.layout config[:html_message]
58
+ end
55
59
 
56
- from_name, from_email = (config[:from] =~ /(.*)\<(.*)>/) ? [$1.strip, $2] : [nil, config[:from]]
60
+ from_name, from_email =
61
+ if config[:from] =~ /(.*)\<(.*)>/
62
+ [Regexp.last_match(1).strip, Regexp.last_match(2)]
63
+ else
64
+ [nil, config[:from]]
65
+ end
57
66
 
58
- if default_from=Card::Mailer.default[:from]
59
- config[:from] = from_email ? %["#{from_name || from_email}" <#{default_from}>] : default_from
67
+ if (default_from = Card::Mailer.default[:from])
68
+ config[:from] =
69
+ if from_email
70
+ %("#{from_name || from_email}" <#{default_from}>)
71
+ else
72
+ default_from
73
+ end
60
74
  config[:reply_to] ||= config[:from]
61
75
  elsif config[:from].blank?
62
76
  config[:from] = Card[Card::WagnBotID].account.email
63
77
  end
64
- config.select {|k,v| v.present? }
78
+ config.select { |_k, v| v.present? }
65
79
  end
66
80
 
67
-
68
81
  format do
69
82
  view :mail, perms: :none do |args|
70
83
  args = card.email_config(args)
@@ -74,7 +87,7 @@ format do
74
87
  alternative = (text_message.present? && html_message.present?)
75
88
  mail = Card::Mailer.new_mail(args) do
76
89
  if alternative
77
- if attachment_list and !attachment_list.empty?
90
+ if attachment_list && !attachment_list.empty?
78
91
  content_type 'multipart/mixed'
79
92
  part content_type: 'multipart/alternative' do |copy|
80
93
  copy.part content_type: 'text/plain' do |plain|
@@ -101,13 +114,13 @@ format do
101
114
 
102
115
  if attachment_list
103
116
  attachment_list.each_with_index do |cardname, i|
104
- if (c = Card[ cardname ]) && c.respond_to?(:attachment)
105
- add_file filename: "attachment-#{i + 1}.#{c.attachment.extension}", content: File.read( c.attachment.path )
117
+ if (c = Card[cardname]) && c.respond_to?(:attachment)
118
+ add_file filename: "attachment-#{i + 1}.#{c.attachment.extension}",
119
+ content: File.read(c.attachment.path)
106
120
  end
107
121
  end
108
122
  end
109
- end #TODO add error handling
123
+ end # TODO: add error handling
110
124
  mail
111
125
  end
112
-
113
126
  end
@@ -1,176 +1,178 @@
1
-
2
1
  include Card::Set::Type::Pointer
3
2
 
4
3
  def raw_content
5
- @raw_content ||= if left
4
+ @raw_content ||=
5
+ if left
6
6
  items = if left.type_id == Card::UserID
7
- user = left
8
- follow_rules = Card.preference_cards left.name, 'follow'
9
- follow_rules.map {|card| "[[#{card.name}]]" }
10
- end.join "\n"
7
+ user = left
8
+ follow_rules = Card.preference_cards left.name, 'follow'
9
+ follow_rules.map { |card| "[[#{card.name}]]" }
10
+ end.join "\n"
11
11
  else
12
12
  ''
13
13
  end
14
14
  end
15
15
 
16
- def virtual?; !real? end
17
-
18
-
19
-
20
- format() { include Card::Set::Type::Pointer::Format }
16
+ def virtual?
17
+ !real?
18
+ end
21
19
 
20
+ format { include Card::Set::Type::Pointer::Format }
22
21
 
23
22
  format :html do
24
- include Card::Set::Type::Pointer::HtmlFormat
23
+ include Card::Set::Type::Pointer::HtmlFormat
25
24
 
25
+ view :closed_content do |_args|
26
+ ''
27
+ end
26
28
 
27
- view :closed_content do |args|
28
- ''
29
- end
30
-
31
-
32
- view :core do |args|
33
- %{
29
+ view :core do |args|
30
+ <<-HTML
34
31
  <div role="tabpanel">
35
- <ul class="nav nav-tabs" role="tablist" id="myTab">
36
- <li role="presentation" class="active"><a href="#following" aria-controls="following" role="tab" data-toggle="tab">Follow</a></li>
37
- <li role="presentation"><a href="#ignoring" aria-controls="ignoring" role="tab" data-toggle="tab">Ignore</a></li>
38
- </ul>
39
-
40
- <div class="tab-content">
41
- <div role="tabpanel" class="tab-pane active" id="following">#{render_following_list args}</div>
42
- <div role="tabpanel" class="tab-pane" id="ignoring">#{render_ignoring_list}</div>
43
- </div>
32
+ <ul class="nav nav-tabs" role="tablist" id="myTab">
33
+ <li role="presentation" class="active">
34
+ <a href="#following" aria-controls="following"
35
+ role="tab" data-toggle="tab">Follow</a>
36
+ </li>
37
+ <li role="presentation">
38
+ <a href="#ignoring" aria-controls="ignoring"
39
+ role="tab" data-toggle="tab">Ignore</a>
40
+ </li>
41
+ </ul>
42
+ <div class="tab-content">
43
+ <div role="tabpanel" class="tab-pane active" id="following">
44
+ #{render_following_list args}
45
+ </div>
46
+ <div role="tabpanel" class="tab-pane" id="ignoring">
47
+ #{render_ignoring_list}
48
+ </div>
49
+ </div>
44
50
  </div>
45
- }
46
- end
47
-
48
-
49
- def followed_by_option
50
- hash = Hash.new { |h,k| h[k] = [] }
51
- card.item_cards.each do |follow_rule|
52
- follow_rule.item_cards.each do |follow_option|
53
- hash[follow_option.codename.to_sym] << follow_rule
54
- end
55
- end
56
- end
57
-
58
- def each_suggestion
59
- if (suggestions = Card["follow suggestions"])
60
- suggestions.item_names.each do |sug|
61
- if ((set_card = Card.fetch sug.to_name.left) && set_card.type_code == :set)
62
- option_card = Card.fetch(sug.to_name.right) || Card[sug.to_name.right.to_sym]
63
- option = if option_card.follow_option?
64
- option_card.name
65
- else
66
- '*always'
67
- end
68
- yield(set_card, option)
69
- elsif ((set_card = Card.fetch sug) && set_card.type_code == :set)
70
- yield(set_card, '*always')
71
- end
72
- end
73
- end
74
- end
75
-
76
- # returns hashes with existing and suggested follow options
77
- # structure:
78
- # set_pattern_class => [ {card: rule_card, options: ['*always', '*created'] },.... ]
79
- def followed_by_set
80
- res = Hash.new { |h,k| h[k] = [] }
81
- never = Card[:never].name
82
- card.item_cards.each do |follow_rule|
83
- options = follow_rule.item_names.reject { |item| item == never}
84
- res[follow_rule.rule_set.subclass_for_set] << { card: follow_rule, options: options }
85
- end
86
-
87
- if Auth.signed_in? && Auth.current_id == card.left.id
88
- each_suggestion do |set_card, option|
89
- suggested_rule_name = set_card.follow_rule_name(card.trunk)
90
- if (rule = res[set_card.subclass_for_set].find { |rule| rule[:card].name == suggested_rule_name })
91
- if !rule[:options].include? option
92
- rule[:options] << option
93
- end
94
- else
95
- rule_card = Card.new(name: suggested_rule_name)
96
- res[set_card.subclass_for_set] << {card: rule_card, options: [option]}
97
- end
98
- end
99
- end
100
- res
101
- end
102
-
103
-
104
- view :following_list do |args|
105
- if !Auth.signed_in? || Auth.current_id != card.left.id
106
- hide_buttons = [:delete_follow_rule_button, :add_follow_rule_button]
107
- end
108
-
109
- sets = followed_by_set
110
- wrap_with :div, class: 'pointer-list-editor' do
111
- wrap_with :ul, class: 'delete-list list-group' do
112
-
113
- Card.set_patterns.select{|p| sets[p]}.reverse.map do |set_pattern|
114
- sets[set_pattern].map do |rule|
115
- rule[:options].map do |option|
116
-
117
- content_tag :li, class: 'list-group-item' do
118
- subformat(rule[:card]).render_follow_item condition: option, hide: hide_buttons
119
- end
120
-
121
- end.join("\n")
122
- end.join("\n")
123
- end.join("\n")
124
-
125
- end
126
- end
127
- end
128
-
129
-
130
- view :ignoring_list do |args|
131
- ignore_list = []
132
- card.item_cards.each do |follow_rule|
133
- follow_rule.item_cards.each do |follow_option|
134
- if follow_option.codename.to_sym == :never
135
- ignore_list << follow_rule
136
- end
137
- end
138
- end
139
- if !Auth.signed_in? || Auth.current_id != card.left.id
140
- hide_buttons = [:delete_follow_rule_button, :add_follow_rule_button]
141
- end
142
- never = Card[:never].name
143
- wrap_with :div, class: 'pointer-list-editor' do
144
- wrap_with :ul, class: 'delete-list list-group' do
145
-
146
- ignore_list.map do |rule_card|
147
- content_tag :li, class: 'list-group-item' do
148
- subformat(rule_card).render_follow_item condition: never, hide: hide_buttons
149
- end
150
- end.join "\n"
151
-
152
- end
153
- end
154
- end
155
-
156
- view :pointer_items, tags: :unknown_ok do |args|
157
- super(args.merge(item: :link))
158
- end
159
-
160
- view :errors, perms: :none do |args|
161
- if card.errors.any?
162
- if card.errors.find { |attrib,msg| attrib == :permission_denied }
163
- Env.save_interrupted_action(request.env['REQUEST_URI'])
164
- title = "Problems with #{card.name}"
165
- frame args.merge(panel_class: "panel panel-warning", title: title, hide: 'menu' ) do
166
- "Please #{ link_to 'sign in', card_url(':signin') }" #" #{to_task}"
167
- end
168
- else
169
- super(args)
170
- end
171
- end
172
- end
51
+ HTML
52
+ end
53
+
54
+ def followed_by_option
55
+ hash = Hash.new { |h, k| h[k] = [] }
56
+ card.item_cards.each do |follow_rule|
57
+ follow_rule.item_cards.each do |follow_option|
58
+ hash[follow_option.codename.to_sym] << follow_rule
59
+ end
60
+ end
61
+ end
62
+
63
+ def each_suggestion
64
+ if (suggestions = Card['follow suggestions'])
65
+ suggestions.item_names.each do |sug|
66
+ if (set_card = Card.fetch sug.to_name.left) &&
67
+ set_card.type_code == :set
68
+ option_card = Card.fetch(sug.to_name.right) ||
69
+ Card[sug.to_name.right.to_sym]
70
+ option = if option_card.follow_option?
71
+ option_card.name
72
+ else
73
+ '*always'
74
+ end
75
+ yield(set_card, option)
76
+ elsif (set_card = Card.fetch sug) && set_card.type_code == :set
77
+ yield(set_card, '*always')
78
+ end
79
+ end
80
+ end
81
+ end
82
+
83
+ # returns hashes with existing and suggested follow options
84
+ # structure:
85
+ # set_pattern_class => [ {card: rule_card, options: ['*always', '*created'] },.... ]
86
+ def followed_by_set
87
+ res = Hash.new { |h, k| h[k] = [] }
88
+ never = Card[:never].name
89
+ card.item_cards.each do |follow_rule|
90
+ options = follow_rule.item_names.reject { |item| item == never }
91
+ res[follow_rule.rule_set.subclass_for_set] << { card: follow_rule,
92
+ options: options }
93
+ end
173
94
 
95
+ if Auth.signed_in? && Auth.current_id == card.left.id
96
+ each_suggestion do |set_card, option|
97
+ suggested_rule_name = set_card.follow_rule_name(card.trunk)
98
+ rule = res[set_card.subclass_for_set].find do |rule|
99
+ rule[:card].name == suggested_rule_name
100
+ end
101
+ if rule
102
+ rule[:options] << option unless rule[:options].include? option
103
+ else
104
+ rule_card = Card.new(name: suggested_rule_name)
105
+ res[set_card.subclass_for_set] << { card: rule_card,
106
+ options: [option] }
107
+ end
108
+ end
109
+ end
110
+ res
111
+ end
112
+
113
+ view :following_list do |_args|
114
+ if !Auth.signed_in? || Auth.current_id != card.left.id
115
+ hide_buttons = [:delete_follow_rule_button, :add_follow_rule_button]
116
+ end
117
+
118
+ sets = followed_by_set
119
+ wrap_with :div, class: 'pointer-list-editor' do
120
+ wrap_with :ul, class: 'delete-list list-group' do
121
+ Card.set_patterns.select { |p| sets[p] }.reverse.map do |set_pattern|
122
+ sets[set_pattern].map do |rule|
123
+ rule[:options].map do |option|
124
+ content_tag :li, class: 'list-group-item' do
125
+ subformat(rule[:card]).render_follow_item condition: option,
126
+ hide: hide_buttons
127
+ end
128
+ end.join("\n")
129
+ end.join("\n")
130
+ end.join("\n")
131
+ end
132
+ end
133
+ end
134
+
135
+ view :ignoring_list do |_args|
136
+ ignore_list = []
137
+ card.item_cards.each do |follow_rule|
138
+ follow_rule.item_cards.each do |follow_option|
139
+ ignore_list << follow_rule if follow_option.codename.to_sym == :never
140
+ end
141
+ end
142
+ if !Auth.signed_in? || Auth.current_id != card.left.id
143
+ hide_buttons = [:delete_follow_rule_button, :add_follow_rule_button]
144
+ end
145
+ never = Card[:never].name
146
+ wrap_with :div, class: 'pointer-list-editor' do
147
+ wrap_with :ul, class: 'delete-list list-group' do
148
+ ignore_list.map do |rule_card|
149
+ content_tag :li, class: 'list-group-item' do
150
+ subformat(rule_card).render_follow_item condition: never,
151
+ hide: hide_buttons
152
+ end
153
+ end.join "\n"
154
+ end
155
+ end
156
+ end
157
+
158
+ view :pointer_items, tags: :unknown_ok do |args|
159
+ super(args.merge(item: :link))
160
+ end
161
+
162
+ view :errors, perms: :none do |args|
163
+ if card.errors.any?
164
+ if card.errors.find { |attrib, _msg| attrib == :permission_denied }
165
+ Env.save_interrupted_action(request.env['REQUEST_URI'])
166
+ title = "Problems with #{card.name}"
167
+ frame args.merge(panel_class: 'panel panel-warning',
168
+ title: title, hide: 'menu') do
169
+ "Please #{link_to 'sign in', card_url(':signin')}" # " #{to_task}"
170
+ end
171
+ else
172
+ super(args)
173
+ end
174
+ end
175
+ end
174
176
  end
175
177
 
176
- format(:css ) { include Card::Set::Type::Pointer::CssFormat }
178
+ format(:css) { include Card::Set::Type::Pointer::CssFormat }