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
@@ -75,7 +75,7 @@ end
75
75
 
76
76
  # delete references from this card
77
77
  def delete_references_out
78
- fail 'id required to delete references' if id.nil?
78
+ raise 'id required to delete references' if id.nil?
79
79
  Card::Reference.delete_all referer_id: id
80
80
  end
81
81
 
@@ -124,32 +124,32 @@ end
124
124
  protected
125
125
 
126
126
  # test for updating referer content & preload referer list
127
- event :prepare_referer_update, before: :approve, on: :update, changed: :name do
127
+ event :prepare_referer_update, :validate, on: :update, changed: :name do
128
128
  self.update_referers = ![nil, false, 'false'].member?(update_referers)
129
129
  family_referers
130
130
  end
131
131
 
132
132
  # when name changes, update references to card
133
- event :refresh_references_in, after: :store, on: :save, changed: :name do
133
+ event :refresh_references_in, :finalize, on: :save, changed: :name do
134
134
  Card::Reference.unmap_referees id if @action == :update && !update_referers
135
135
  Card::Reference.map_referees key, id
136
136
  end
137
137
 
138
138
  # when content changes, update references to other cards
139
- event :refresh_references_out, after: :store, on: :save, changed: :content do
139
+ event :refresh_references_out, :finalize, on: :save, changed: :content do
140
140
  update_references_out
141
141
  end
142
142
 
143
143
  # clean up reference table when card is deleted
144
- event :clear_references, after: :store, on: :delete do
144
+ event :clear_references, :finalize, on: :delete do
145
145
  delete_references_out
146
146
  Card::Reference.unmap_referees id
147
147
  end
148
148
 
149
149
  # on rename, update names in cards that refer to self by name (as directed)
150
- event :update_referer_content,
151
- after: :store, on: :update, changed: :name,
152
- when: proc { |c| c.update_referers } do
150
+ event :update_referer_content, :finalize,
151
+ on: :update, changed: :name,
152
+ when: proc { |card| card.update_referers } do
153
153
  # FIXME: break into correct stages
154
154
  Auth.as_bot do
155
155
  family_referers.each do |card|
@@ -165,8 +165,8 @@ end
165
165
  # that partial references are correctly tracked
166
166
  # eg. A links to X+Y. if X+Y is renamed and we're not updating the link in A,
167
167
  # then we need to be sure that A has a partial reference
168
- event :update_referer_references_out,
169
- after: :store, on: :update, changed: :name,
168
+ event :update_referer_references_out, :finalize,
169
+ on: :update, changed: :name,
170
170
  when: proc { |c| !c.update_referers } do
171
171
  family_referers.map(&:update_references_out)
172
172
  end
@@ -120,9 +120,7 @@ def related_sets with_self=false
120
120
  if known? && type_id == Card::CardtypeID # FIXME: belongs in type/cardtype
121
121
  sets << ["#{name}+*type", Card::TypeSet.label(name)]
122
122
  end
123
- if with_self
124
- sets << ["#{name}+*self", Card::SelfSet.label(name)]
125
- end
123
+ sets << ["#{name}+*self", Card::SelfSet.label(name)] if with_self
126
124
  if known? && cardname.simple?
127
125
  sets << ["#{name}+*right", Card::RightSet.label(name)]
128
126
  end
@@ -240,7 +238,8 @@ module ClassMethods
240
238
 
241
239
  # all users that have a user-specific rule for a given rule key
242
240
  def user_ids_cache
243
- Card.cache.read('USER_IDS') || begin
241
+ Card.cache.read('USER_IDS') ||
242
+ begin
244
243
  clear_rule_cache
245
244
  rule_cache
246
245
  @user_ids_hash
@@ -0,0 +1,24 @@
1
+ attr_writer :director
2
+ delegate :stage, to: :director
3
+
4
+ def director
5
+ @director ||= Card::DirectorRegister.fetch self
6
+ end
7
+
8
+ def identify_action
9
+ @action =
10
+ case
11
+ when trash then :delete
12
+ when new_card? then :create
13
+ else :update
14
+ end
15
+ end
16
+
17
+ def current_act= act
18
+ raise Card::Error, 'not allowed to override current act' if Card.current_act
19
+ Card.current_act = act
20
+ end
21
+
22
+ def current_act
23
+ @current_act ||= Card.current_act
24
+ end
@@ -1,8 +1,8 @@
1
1
  def new_card?
2
- new_record? || # not yet in db (from ActiveRecord)
3
- !!@from_trash # in process of restoration from trash, not yet "re-created"
2
+ new_record? || # not yet in db (from ActiveRecord)
3
+ !!@from_trash # in process of restoration from trash, not yet "re-created"
4
4
  end
5
- alias_method :new?, :new_card?
5
+ alias new? new_card?
6
6
 
7
7
  def known?
8
8
  real? || virtual?
@@ -18,5 +18,5 @@ end
18
18
 
19
19
  def pristine?
20
20
  # has not been edited directly by human users. bleep blorp.
21
- new_card? or !actions.joins(:act).where('card_acts.actor_id != ?', Card::WagnBotID).exists?
21
+ new_card? || !actions.joins(:act).where('card_acts.actor_id != ?', Card::WagnBotID).exists?
22
22
  end
@@ -10,11 +10,14 @@ def subfield field_name
10
10
  subcards.field field_name
11
11
  end
12
12
 
13
- phase_method :add_subcard, before: :approve do |name_or_card, args=nil|
13
+ # phase_method :add_subcard, before: :store do |name_or_card, args=nil|
14
+ # TODO: handle differently in different stages
15
+ def add_subcard name_or_card, args=nil
14
16
  subcards.add name_or_card, args
15
17
  end
16
18
 
17
- phase_method :add_subfield, before: :approve do |name_or_card, args=nil|
19
+ # phase_method :add_subfield, before: :approve do |name_or_card, args=nil|
20
+ def add_subfield name_or_card, args=nil
18
21
  subcards.add_field name_or_card, args
19
22
  end
20
23
 
@@ -30,43 +33,30 @@ def clear_subcards
30
33
  subcards.clear
31
34
  end
32
35
 
36
+ def deep_clear_subcards
37
+ subcards.deep_clear
38
+ end
39
+
33
40
  def unfilled?
34
41
  (content.empty? || content.strip.empty?) &&
35
42
  (comment.blank? || comment.strip.blank?) &&
36
43
  !subcards.present?
37
44
  end
38
45
 
39
- event :approve_subcards, after: :approve, on: :save do
46
+ event :handle_subcard_errors do
40
47
  subcards.each do |subcard|
41
- if !subcard.valid_subcard?
42
- subcard.errors.each do |field, err|
43
- err = "#{field} #{err}" unless [:content, :abort].member? field
44
- errors.add subcard.relative_name.s, err
45
- end
48
+ subcard.errors.each do |field, err|
49
+ err = "#{field} #{err}" unless [:content, :abort].member? field
50
+ errors.add subcard.relative_name.s, err
46
51
  end
47
52
  end
48
53
  end
49
54
 
50
- event :reject_empty_subcards, before: :approve_subcards do
55
+ event :reject_empty_subcards, :prepare_to_validate do
51
56
  subcards.each_with_key do |subcard, key|
52
57
  if subcard.new? && subcard.unfilled?
53
- remove_subcard key
58
+ remove_subcard(key)
59
+ director.subdirectors.delete(subcard)
54
60
  end
55
61
  end
56
62
  end
57
-
58
- # deprecated; left for compatibility reasons because other events refer to this
59
- # especially wikirate
60
- event :process_subcards, after: :reject_empty_subcards, on: :save do
61
- end
62
-
63
- event :store_subcards, after: :store do
64
- subcards.each do |subcard|
65
- subcard.save! validate: false if subcard != self # unless @draft
66
- end
67
-
68
- # ensures that a supercard can access subcards of self
69
- # eg. <user> creates <user+*account> creates <user+*account+*status>
70
- # <user> changes <user+*account+*status> in event activate_account
71
- Card.write_to_soft_cache self
72
- end
@@ -59,9 +59,7 @@ end
59
59
 
60
60
  def virtual?
61
61
  return false unless new_card?
62
- if @virtual.nil?
63
- cardname.simple? ? (@virtual = false) : template
64
- end
62
+ cardname.simple? ? (@virtual = false) : template if @virtual.nil?
65
63
  @virtual
66
64
  end
67
65
 
@@ -32,9 +32,7 @@ protected
32
32
  def extract_subcard_args! args
33
33
  subcards = args.delete('subcards') || {}
34
34
  args.keys.each do |key|
35
- if key =~ /^\+/
36
- subcards[key] = args.delete(key)
37
- end
35
+ subcards[key] = args.delete(key) if key =~ /^\+/
38
36
  end
39
37
  subcards
40
38
  end
@@ -54,13 +52,13 @@ def extract_type_id! args={}
54
52
  return nil
55
53
  end
56
54
 
57
- if !type_id
55
+ unless type_id
58
56
  errors.add :type, "#{args[:type] || args[:type_code]} is not a known type."
59
57
  end
60
58
  type_id
61
59
  end
62
60
 
63
- event :set_content, before: :store, on: :save do
61
+ event :set_content, :store, on: :save do
64
62
  self.db_content = content || '' # necessary?
65
63
  self.db_content = Card::Content.clean!(db_content) if clean_html?
66
64
  @selected_action_id = @selected_content = nil
@@ -71,7 +69,7 @@ end
71
69
  # FIXME: the following don't really belong here, but they have to come after
72
70
  # the reference stuff. we need to organize a bit!
73
71
 
74
- event :update_ruled_cards, after: :store do
72
+ event :update_ruled_cards, :finalize do
75
73
  if is_rule?
76
74
  # warn "updating ruled cards for #{name}"
77
75
  self.class.clear_rule_cache
@@ -79,67 +77,68 @@ event :update_ruled_cards, after: :store do
79
77
  set.reset_set_patterns
80
78
 
81
79
  if right_id == Card::ReadID && (name_changed? || trash_changed?)
82
- self.class.clear_read_rule_cache
83
- Card.cache.reset # maybe be more surgical, just Auth.user related
84
- expire # probably shouldn't be necessary,
85
- # but was sometimes getting cached version when card should be in the
86
- # trash. could be related to other bugs?
87
- in_set = {}
88
- if !trash && set && (set_class = set.tag)
89
- if (class_id = set_class.id)
90
- rule_class_ids = set_patterns.map &:pattern_id
91
- # warn "rule_class_id #{class_id}, #{rule_class_ids.inspect}"
92
-
93
- # first update all cards in set that aren't governed by narrower rule
94
- Auth.as_bot do
95
- cur_index = rule_class_ids.index Card[read_rule_class].id
96
- if (rule_class_index = rule_class_ids.index(class_id))
97
- set.item_cards(limit: 0).each do |item_card|
98
- in_set[item_card.key] = true
99
- next if cur_index < rule_class_index
100
- if cur_index >= rule_class_index
101
- item_card.update_read_rule
102
- end
103
- end
104
- else warn "No current rule index #{class_id}, " \
105
- "#{rule_class_ids.inspect}"
106
- end
107
- end
108
-
109
- end
110
- end
80
+ update_read_ruled_cards set
81
+ end
82
+ end
83
+ end
111
84
 
112
- # then find all cards with me as read_rule_id that were not just updated
113
- # and regenerate their read_rules
114
- if !new_card?
115
- Card.search(read_rule_id: self.id) do |card|
116
- card.update_read_rule unless in_set[card.key]
117
- end
85
+ def update_read_rules_of_set_members_not_governed_by_narrower_rules set
86
+ return {} if trash || !set || !(set_class = set.tag) ||
87
+ !(class_id = set_class.id)
88
+ in_set = {}
89
+ rule_class_ids = set_patterns.map(&:pattern_id)
90
+ Auth.as_bot do
91
+ cur_index = rule_class_ids.index Card[read_rule_class].id
92
+ if (rule_class_index = rule_class_ids.index(class_id))
93
+ set.item_cards(limit: 0).each do |item_card|
94
+ in_set[item_card.key] = true
95
+ next if cur_index < rule_class_index
96
+ item_card.update_read_rule if cur_index >= rule_class_index
118
97
  end
98
+ else
99
+ warn "No current rule index #{class_id}, #{rule_class_ids.inspect}"
119
100
  end
120
101
  end
102
+ in_set
121
103
  end
122
104
 
123
- event :process_read_rule_update_queue, after: :store do
105
+ def update_read_ruled_cards set
106
+ self.class.clear_read_rule_cache
107
+ Card.cache.reset # maybe be more surgical, just Auth.user related
108
+ expire # probably shouldn't be necessary,
109
+ # but was sometimes getting cached version when card should be in the
110
+ # trash. could be related to other bugs?
111
+
112
+ updated = update_read_rules_of_set_members_not_governed_by_narrower_rules set
113
+
114
+ # then find all cards with me as read_rule_id that were not just updated
115
+ # and regenerate their read_rules
116
+ return if new_card?
117
+ Card.search(read_rule_id: id) do |card|
118
+ card.update_read_rule unless updated[card.key]
119
+ end
120
+ end
121
+
122
+ event :process_read_rule_update_queue, :finalize do
124
123
  Array.wrap(@read_rule_update_queue).each(&:update_read_rule)
125
124
  @read_rule_update_queue = []
126
125
  end
127
126
 
128
- event :expire_related, after: :store do
127
+ event :expire_related, :finalize do
129
128
  subcards.keys.each do |key|
130
129
  Card.cache.soft.delete key
131
130
  end
132
- expire true
133
-
131
+ expire # FIXME: where do we put this. Here it deletes @stage
132
+ reset_patterns
134
133
  if is_structure?
135
134
  structuree_names.each do |name|
136
- Card.expire name, true
135
+ Card.expire name
137
136
  end
138
137
  end
139
138
  end
140
139
 
141
140
  event :expire_related_names, before: :expire_related, changed: :name do
142
141
  # FIXME: look for opportunities to avoid instantiating the following
143
- descendants.each { |c| c.expire(true) }
144
- name_referers.each { |c| c.expire(true) }
142
+ descendants.each(&:expire)
143
+ name_referers.each(&:expire)
145
144
  end
@@ -6,7 +6,7 @@ def delete!
6
6
  update_attributes! trash: true unless new_card?
7
7
  end
8
8
 
9
- event :pull_from_trash, before: :store, on: :create do
9
+ event :pull_from_trash, :prepare_to_store, on: :create do
10
10
  if (trashed_card = Card.find_by_key_and_trash(key, true))
11
11
  # a. (Rails way) tried Card.where(key: 'wagn_bot').select(:id), but it
12
12
  # wouldn't work. This #select generally breaks on cards. I think our
@@ -16,6 +16,7 @@ event :pull_from_trash, before: :store, on: :create do
16
16
  # likely low ROI, but would be nice to have interface to retrieve cards
17
17
  # from trash...m
18
18
  self.id = trashed_card.id
19
+ # update instead of create
19
20
  @from_trash = true
20
21
  @new_record = false
21
22
  end
@@ -23,13 +24,13 @@ event :pull_from_trash, before: :store, on: :create do
23
24
  true
24
25
  end
25
26
 
26
- event :validate_delete, before: :approve, on: :delete do
27
- if !codename.blank?
27
+ event :validate_delete, :validate, on: :delete do
28
+ unless codename.blank?
28
29
  errors.add :delete, "#{name} is is a system card. (#{codename})"
29
30
  end
30
31
 
31
32
  undeletable_all_rules_tags =
32
- %w{ default style layout create read update delete }
33
+ %w( default style layout create read update delete )
33
34
  # FIXME: HACK! should be configured in the rule
34
35
 
35
36
  if junction? && (l = left) && l.codename == 'all' &&
@@ -37,20 +38,19 @@ event :validate_delete, before: :approve, on: :delete do
37
38
  errors.add :delete, "#{name} is an indestructible rule"
38
39
  end
39
40
 
40
- if account && self.has_edits?
41
+ if account && has_edits?
41
42
  errors.add :delete, "Edits have been made with #{name}'s user account.\n" \
42
43
  'Deleting this card would mess up our history.'
43
44
  end
44
45
  end
45
46
 
46
- event :validate_delete_children, after: :approve, on: :delete do
47
+ event :validate_delete_children, :validate, on: :delete do
47
48
  children.each do |child|
48
49
  child.trash = true
49
50
  add_subcard child
50
- unless child.valid?
51
- child.errors.each do |field, message|
52
- errors.add field, "can't delete #{child.name}: #{message}"
53
- end
51
+ next if child.valid?
52
+ child.errors.each do |field, message|
53
+ errors.add field, "can't delete #{child.name}: #{message}"
54
54
  end
55
55
  end
56
56
  end
@@ -36,17 +36,15 @@ def get_type_id_from_structure
36
36
  t.type_id
37
37
  end
38
38
 
39
- event :validate_type_change, before: :approve, on: :update, changed: :type_id do
39
+ event :validate_type_change, :validate, on: :update, changed: :type_id do
40
40
  if (c = dup) && c.action == :create && !c.valid?
41
- errors.add :type, "of #{ name } can't be changed; errors creating new " \
42
- "#{ type_id }: #{ c.errors.full_messages * ', ' }"
41
+ errors.add :type, "of #{name} can't be changed; errors creating new " \
42
+ "#{type_id}: #{c.errors.full_messages * ', '}"
43
43
  end
44
44
  end
45
45
 
46
- event :validate_type, before: :approve, changed: :type_id do
47
- if !type_name
48
- errors.add :type, 'No such type'
49
- end
46
+ event :validate_type, :validate, changed: :type_id do
47
+ errors.add :type, 'No such type' unless type_name
50
48
 
51
49
  if (rt = structure) && rt.assigns_type? && type_id != rt.type_id
52
50
  errors.add :type, "can't be changed because #{name} is hard templated " \
@@ -54,7 +52,10 @@ event :validate_type, before: :approve, changed: :type_id do
54
52
  end
55
53
  end
56
54
 
57
- event :reset_type_specific_fields, after: :store do
55
+ event :reset_type_specific_fields, :finalize do
56
+ # Example: if you save a card of type Phrase
57
+ # then reset set patterns for update all
58
+ # "Phrase+Something+*type plus right" cards
58
59
  wql = { left: { left_id: type_id },
59
60
  right: { codename: 'type_plus_right' }
60
61
  }