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
@@ -5,78 +5,80 @@ describe Card::Set::All::Rules do
5
5
  Card::Auth.current_id = Card::WagnBotID
6
6
  end
7
7
 
8
- describe "setting data setup" do
9
- it "should make Set of +*type" do
10
- Card.create! name: "SpeciForm", type: 'Cardtype'
11
- expect(Card.create!( name: "SpeciForm+*type" ).type_code).to eq(:set)
8
+ describe 'setting data setup' do
9
+ it 'should make Set of +*type' do
10
+ Card.create! name: 'SpeciForm', type: 'Cardtype'
11
+ expect(Card.create!(name: 'SpeciForm+*type').type_code).to eq(:set)
12
12
  end
13
13
  end
14
14
 
15
- describe "#rule" do
16
- it "retrieves Set based value" do
17
- Card.create name: "Book+*type+*add help", content: "authorize"
18
- expect(Card.new( type: "Book" ).rule(:add_help, fallback: :help)).to eq("authorize")
15
+ describe '#rule' do
16
+ it 'retrieves Set based value' do
17
+ Card.create name: 'Book+*type+*add help', content: 'authorize'
18
+ add_help_rule = Card.new(type: 'Book').rule(:add_help, fallback: :help)
19
+ expect(add_help_rule).to eq('authorize')
19
20
  end
20
21
 
21
- it "retrieves default values" do
22
- #Card.create name: "all Basic cards", type: "Set", content: "{\"type\": \"Basic\"}" #defaults should work when other Sets are present
23
- assert c=Card.create(name: "*all+*add help", content: "lobotomize")
24
- # Card.default_rule(:add_help, fallback: :help).should == "lobotomize"
25
- expect(Card.new( type: "Basic" ).rule(:add_help, fallback: :help)).to eq("lobotomize")
22
+ it 'retrieves default values' do
23
+ # Card.create name: 'all Basic cards', type: 'Set',
24
+ # content: "{\"type\": \"Basic\'}'
25
+ # defaults should work when other Sets are present
26
+ assert Card.create(name: '*all+*add help', content: 'lobotomize')
27
+ # Card.default_rule(:add_help, fallback: :help).should == 'lobotomize'
28
+ add_help_rule = Card.new(type: 'Basic').rule(:add_help, fallback: :help)
29
+ expect(add_help_rule).to eq('lobotomize')
26
30
  end
27
31
 
28
- it "retrieves single values" do
29
- Card.create! name: "banana+*self+*help", content: "pebbles"
30
- expect(Card["banana"].rule(:help)).to eq("pebbles")
32
+ it 'retrieves single values' do
33
+ Card.create! name: 'banana+*self+*help', content: 'pebbles'
34
+ expect(Card['banana'].rule(:help)).to eq('pebbles')
31
35
  end
32
36
 
33
37
  context 'with fallback' do
34
38
  before do
35
- Card.create name: "*all+*help", content: "edit any kind of card"
39
+ Card.create name: '*all+*help', content: 'edit any kind of card'
36
40
  end
37
-
38
- it "retrieves default setting" do
39
- expect(Card.new( type: "Book" ).rule(:add_help, fallback: :help)).to eq("edit any kind of card")
41
+ subject { Card.new(type: 'Book').rule(:add_help, fallback: :help) }
42
+ it 'retrieves default setting' do
43
+ expect(subject).to eq('edit any kind of card')
40
44
  end
41
45
 
42
- it "retrieves primary setting" do
43
- Card.create name: "*all+*add help", content: "add any kind of card"
44
- expect(Card.new( type: "Book" ).rule(:add_help, fallback: :help)).to eq("add any kind of card")
46
+ it 'retrieves primary setting' do
47
+ Card.create name: '*all+*add help', content: 'add any kind of card'
48
+ expect(subject).to eq('add any kind of card')
45
49
  end
46
50
 
47
- it "retrieves more specific default setting" do
48
- Card.create name: "*all+*add help", content: "add any kind of card"
49
- Card.create name: "*Book+*type+*help", content: "edit a Book"
50
- expect(Card.new( type: "Book" ).rule(:add_help, fallback: :help)).to eq("add any kind of card")
51
+ it 'retrieves more specific default setting' do
52
+ Card.create name: '*all+*add help', content: 'add any kind of card'
53
+ Card.create name: '*Book+*type+*help', content: 'edit a Book'
54
+ expect(subject).to eq('add any kind of card')
51
55
  end
52
56
  end
53
57
  end
54
58
 
55
-
56
- describe "#setting_codenames_by_group" do
59
+ describe '#setting_codenames_by_group' do
57
60
  before do
58
- @pointer_settings = [ :options, :options_label, :input ]
61
+ @pointer_settings = [:options, :options_label, :input]
59
62
  end
60
63
  it "doesn't fail on nonexistent trunks" do
61
- expect(Card.new(name: 'foob+*right').setting_codenames_by_group.class).to eq(Hash)
64
+ codenames = Card.new(name: 'foob+*right').setting_codenames_by_group
65
+ expect(codenames.class).to eq(Hash)
62
66
  end
63
67
 
64
- it "returns universal setting names for non-pointer set" do
65
- skip "Different api, we should just put the tests in a new spec for that"
68
+ it 'returns universal setting names for non-pointer set' do
69
+ skip 'Different api, we should just put the tests in a new spec for that'
66
70
  snbg = Card.fetch('*star').setting_codenames_by_group
67
- #warn "snbg #{snbg.class} #{snbg.inspect}"
71
+ # warn "snbg #{snbg.class} #{snbg.inspect}"
68
72
  expect(snbg.keys.length).to eq(4)
69
73
  expect(snbg.keys.first).to be_a Symbol
70
- expect(snbg.keys.member?( :pointer )).not_to be_truthy
74
+ expect(snbg.keys.member?(:pointer)).not_to be_truthy
71
75
  end
72
76
 
73
-
74
- it "returns pointer-specific setting names for pointer card" do
77
+ it 'returns pointer-specific setting names for pointer card' do
75
78
  c = Card.fetch 'Fruit+*type+*create+*self', new: {}
76
79
  snbg = c.setting_codenames_by_group
77
80
  expect(snbg[:pointer]).to eq(@pointer_settings)
78
81
  end
79
-
80
82
  end
81
83
 
82
84
  describe 'user specific rules' do
@@ -84,45 +86,50 @@ describe Card::Set::All::Rules do
84
86
  Card::Auth.current_id = Card.fetch('Joe User').id
85
87
  end
86
88
 
87
- it "user rule is recognized as rule" do
89
+ it 'user rule is recognized as rule' do
88
90
  Card::Auth.as_bot do
89
- card = Card.create(name: "Book+*type+Joe User+*follow", content: "[[*always]]")
91
+ card = Card.create name: 'Book+*type+Joe User+*follow',
92
+ content: '[[*always]]'
90
93
  expect(card.is_rule?).to be_truthy
91
94
  end
92
95
  end
93
96
 
94
- it "retrieves Set based value" do
97
+ it 'retrieves Set based value' do
95
98
  Card::Auth.as_bot do
96
- Card.create name: "Book+*type+Joe User+*follow", content: "[[*always]]"
99
+ Card.create name: 'Book+*type+Joe User+*follow', content: '[[*always]]'
97
100
  end
98
- expect(Card.new( type: "Book" ).rule(:follow)).to eq("[[*always]]")
101
+ expect(Card.new(type: 'Book').rule(:follow)).to eq('[[*always]]')
99
102
  end
100
103
 
101
- it "retrieves user indepedent Set based value" do
104
+ it 'retrieves user indepedent Set based value' do
102
105
  Card::Auth.as_bot do
103
- Card.create name: "Book+*type+*all+*follow", content: "[[Home]]"
106
+ Card.create name: 'Book+*type+*all+*follow', content: '[[Home]]'
104
107
  end
105
- expect(Card.new( type: "Book" ).rule(:follow)).to eq("[[Home]]")
108
+ expect(Card.new(type: 'Book').rule(:follow)).to eq('[[Home]]')
106
109
  end
107
110
 
108
- it "uses *all user rule when no super.s"
111
+ it 'uses *all user rule when no super.s'
109
112
 
110
- it "user-specific value overwrites user-independent value" do
113
+ it 'user-specific value overwrites user-independent value' do
111
114
  Card::Auth.as_bot do
112
- Card.create name: "Book+*type+Joe User+*follow", content: "[[*never]]"
113
- Card.create name: "Book+*type+*all+*follow", content: "[[*always]]"
115
+ Card.create name: 'Book+*type+Joe User+*follow', content: '[[*never]]'
116
+ Card.create name: 'Book+*type+*all+*follow', content: '[[*always]]'
114
117
  end
115
- expect(Card.new( type: "Book" ).rule(:follow)).to eq("[[*never]]")
118
+ expect(Card.new(type: 'Book').rule(:follow)).to eq('[[*never]]')
116
119
  end
117
120
 
118
121
  describe '#all_user_ids_with_rule_for' do
119
- it "returns all user with values for the given Set and rule" do
122
+ it 'returns all user with values for the given Set and rule' do
120
123
  Card::Auth.as_bot do
121
- Card.create(name: "Book+*type+Joe User+*follow", content: "[[Home]]")
124
+ Card.create(name: 'Book+*type+Joe User+*follow', content: '[[Home]]')
122
125
  Card::Auth.current_id = Card.fetch('Joe Admin').id
123
- Card.create(name: "Book+*type+Joe Admin+*follow", content: "[[Home]]")
124
- user_ids = Card.all_user_ids_with_rule_for( Card.fetch("Book+*type"), :follow ).sort
125
- expect(user_ids).to eq [Card['Joe User'].id, Card['Joe Admin'].id].sort
126
+ Card.create(name: 'Book+*type+Joe Admin+*follow', content: '[[Home]]')
127
+ user_ids = Card.all_user_ids_with_rule_for(
128
+ Card.fetch('Book+*type'), :follow
129
+ )
130
+ expect(user_ids.sort).to eq(
131
+ [Card['Joe User'].id, Card['Joe Admin'].id].sort
132
+ )
126
133
  end
127
134
  end
128
135
  end
@@ -117,4 +117,3 @@ describe Card::Set::All::Templating do
117
117
  end
118
118
  end
119
119
  end
120
-
@@ -29,9 +29,9 @@ module RenameMethods
29
29
  end
30
30
  end
31
31
 
32
- include RenameMethods
33
-
34
32
  describe Card::Set::All::TrackedAttributes do
33
+ include RenameMethods
34
+
35
35
  describe 'set_name' do
36
36
  it 'should handle case variants' do
37
37
  @c = Card.create! name: 'chump'
@@ -266,7 +266,6 @@ describe Card::Set::All::TrackedAttributes do
266
266
  end
267
267
  end
268
268
 
269
-
270
269
  context 'blues' do
271
270
  before do
272
271
  Card::Auth.as_bot do
@@ -281,7 +280,7 @@ describe Card::Set::All::TrackedAttributes do
281
280
  end
282
281
  end
283
282
 
284
- it 'test_updates_inclusions_when_renaming' do
283
+ it 'test_updates_nests_when_renaming' do
285
284
  c1 = Card['Blue']
286
285
  c2 = Card['blue includer 1']
287
286
  c3 = Card['blue includer 2']
@@ -291,7 +290,7 @@ describe Card::Set::All::TrackedAttributes do
291
290
  assert_equal '{{Red|closed;other:stuff}}', Card.find(c3.id).content
292
291
  end
293
292
 
294
- it 'test_updates_inclusions_when_renaming_to_plus' do
293
+ it 'test_updates_nests_when_renaming_to_plus' do
295
294
  c1 = Card['Blue']
296
295
  c2 = Card['blue includer 1']
297
296
  c1.update_attributes name: 'blue includer 1+color',
@@ -40,6 +40,28 @@ describe Card::Set::All::Trash do
40
40
  end
41
41
  end
42
42
 
43
+ it 'deletes children under a set' do
44
+ Card::Auth.as_bot do
45
+ type = Card.create! name: 'Metric Value', type_id: Card::CardtypeID
46
+ Card.create! name: 'Metric value+value+*type plus right',
47
+ type_id: Card::SetID
48
+ mv1_name = 'Richard Mills+Annual Sales+CA+2014'
49
+ mv2_name = 'Richard Mills+Annual Profits+CA+2014'
50
+ Card.create! name: mv1_name, type_id: type.id
51
+ Card.create! name: mv2_name, type_id: type.id
52
+ Card.create! name: "#{mv1_name}+value", type_id: Card::BasicID
53
+ Card.create! name: "#{mv2_name}+value", type_id: Card::BasicID
54
+
55
+ expect(Card['CA']).to be
56
+ Card['CA'].delete
57
+ expect(Card['CA']).not_to be
58
+ expect(Card[mv1_name]).not_to be
59
+ expect(Card["#{mv1_name}+value"]).not_to be
60
+ expect(Card[mv2_name]).not_to be
61
+ expect(Card["#{mv2_name}+value"]).not_to be
62
+ end
63
+ end
64
+
43
65
  it 'deletes account of user' do
44
66
  Card::Auth.as_bot do
45
67
  @signup = Card.create!(
@@ -51,7 +73,7 @@ describe Card::Set::All::Trash do
51
73
  Card::Cache.reset_all
52
74
 
53
75
  Card::Auth.as_bot do
54
- expect(Card.search :right=>'*account').not_to be_empty
76
+ expect(Card.search right: '*account').not_to be_empty
55
77
  Card['born to die'].delete!
56
78
  end
57
79
  expect(Card['born to die+*account']).not_to be
@@ -6,7 +6,7 @@ describe Card::Set::All::Type do
6
6
  Card::Auth.as_bot do
7
7
  @type = Card.create! name: 'Hat', type: 'Cardtype'
8
8
  end
9
- @hat = Card.new type: 'Hat'
9
+ @hat = Card.new type: 'Hat'
10
10
  end
11
11
 
12
12
  it 'should have a type_name' do
@@ -24,10 +24,8 @@ describe Card::Set::All::Type do
24
24
  it 'should have a type_card' do
25
25
  expect(@hat.type_card).to eq(@type)
26
26
  end
27
-
28
27
  end
29
28
 
30
-
31
29
  describe 'card with structured type' do
32
30
  before do
33
31
  Card::Auth.as_bot do
@@ -37,7 +35,7 @@ describe Card::Set::All::Type do
37
35
  end
38
36
  end
39
37
 
40
- it "should clear cache of structured nested card after saving" do
38
+ it 'should clear cache of structured nested card after saving' do
41
39
  Card::Auth.as_bot do
42
40
  expect(Card.fetch('t1+results', new: {}).type_name).to eq('Basic')
43
41
 
@@ -48,5 +46,4 @@ describe Card::Set::All::Type do
48
46
  end
49
47
  end
50
48
  end
51
-
52
49
  end
@@ -15,7 +15,7 @@ class Card
15
15
  }
16
16
 
17
17
  # replace with enum if we start using rails 4
18
- TYPE = [:create, :update, :delete]
18
+ TYPE = [:create, :update, :delete].freeze
19
19
 
20
20
  def expire
21
21
  self.class.cache.delete id.to_s
@@ -40,9 +40,7 @@ class Card
40
40
  end
41
41
 
42
42
  def delete_old
43
- Card.find_each do |card|
44
- card.delete_old_actions
45
- end
43
+ Card.find_each(&:delete_old_actions)
46
44
  Card::Act.delete_actionless
47
45
  end
48
46
  end
@@ -83,12 +81,12 @@ class Card
83
81
 
84
82
  def new_values
85
83
  @new_values ||=
86
- {
87
- content: new_value_for(:db_content),
88
- name: new_value_for(:name),
89
- cardtype: ((typecard = Card[new_value_for(:type_id).to_i]) &&
90
- typecard.name.capitalize)
91
- }
84
+ {
85
+ content: new_value_for(:db_content),
86
+ name: new_value_for(:name),
87
+ cardtype: ((typecard = Card[new_value_for(:type_id).to_i]) &&
88
+ typecard.name.capitalize)
89
+ }
92
90
  end
93
91
 
94
92
  def old_values
@@ -25,15 +25,13 @@ def nth_action index
25
25
  index = index.to_i
26
26
  return unless id && index > 0
27
27
  Action.where("draft is not true AND card_id = #{id}")
28
- .order(:id).limit(1).offset(index - 1).first
28
+ .order(:id).limit(1).offset(index - 1).first
29
29
  end
30
30
 
31
31
  def revision action
32
32
  # a "revision" refers to the state of all tracked fields
33
33
  # at the time of a given action
34
- if action.is_a? Integer
35
- action = Card::Action.fetch(action)
36
- end
34
+ action = Card::Action.fetch(action) if action.is_a? Integer
37
35
  action && Card::TRACKED_FIELDS.inject({}) do |attr_changes, field|
38
36
  last_change = action.card_changes.find_by_field_name(field) ||
39
37
  last_change_on(field, not_after: action)
@@ -1,10 +1,13 @@
1
1
 
2
- # if these aren't in a nested module, the methods just overwrite the base methods,
3
- # but we need a distict module so that super will be able to refer to the base methods.
2
+ # if these aren't in a nested module, the methods just overwrite the base
3
+ # methods, but we need a distict module so that super will be able to refer to
4
+ # the base methods.
4
5
  def content
5
6
  if @selected_action_id
6
7
  @selected_content ||= begin
7
- (change = last_change_on( :db_content, not_after: @selected_action_id, including_drafts: true ) and change.value) || db_content
8
+ change = last_change_on :db_content, not_after: @selected_action_id,
9
+ including_drafts: true
10
+ (change && change.value) || db_content
8
11
  end
9
12
  else
10
13
  super
@@ -19,33 +22,33 @@ end
19
22
  def save_content_draft content
20
23
  super
21
24
  acts.create do |act|
22
- act.actions.build(draft: true, card_id: id).card_changes.build(field: :db_content, value: content)
25
+ act.actions.build(draft: true, card_id: id)
26
+ .card_changes.build(field: :db_content, value: content)
23
27
  end
24
28
  end
25
29
 
26
- def last_change_on(field, opts={})
27
- where_sql = 'card_actions.card_id = :card_id AND field = :field '
28
- if !opts[:including_drafts]
29
- where_sql += 'AND (draft is not true) '
30
- end
30
+ def last_change_on field, opts={}
31
+ where_sql = 'card_actions.card_id = :card_id AND field = :field '
32
+ where_sql += 'AND (draft is not true) ' unless opts[:including_drafts]
31
33
  where_sql += if opts[:before]
32
- 'AND card_action_id < :action_id'
33
- elsif opts[:not_after]
34
- 'AND card_action_id <= :action_id'
35
- else
36
- ''
37
- end
34
+ 'AND card_action_id < :action_id'
35
+ elsif opts[:not_after]
36
+ 'AND card_action_id <= :action_id'
37
+ else
38
+ ''
39
+ end
38
40
 
39
41
  action_arg = opts[:before] || opts[:not_after]
40
- action_id = action_arg.kind_of?(Card::Action) ? action_arg.id : action_arg
42
+ action_id = action_arg.is_a?(Card::Action) ? action_arg.id : action_arg
41
43
  field_index = Card::TRACKED_FIELDS.index(field.to_s)
42
- Change.joins(:action).where( where_sql,
43
- {card_id: id, field: field_index, action_id: action_id}
44
+ Change.joins(:action).where(
45
+ where_sql, card_id: id, field: field_index, action_id: action_id
44
46
  ).order(:id).last
45
47
  end
46
48
 
47
49
  def selected_action_id
48
- @selected_action_id || (@current_action and @current_action.id) || last_action_id
50
+ @selected_action_id || (@current_action && @current_action.id) ||
51
+ last_action_id
49
52
  end
50
53
 
51
54
  def selected_action_id= action_id
@@ -54,7 +57,7 @@ def selected_action_id= action_id
54
57
  end
55
58
 
56
59
  def selected_action
57
- selected_action_id and Action.fetch(selected_action_id)
60
+ selected_action_id && Action.fetch(selected_action_id)
58
61
  end
59
62
 
60
63
  def with_selected_action_id action_id
@@ -74,13 +77,14 @@ def selected_content_action_id
74
77
  end
75
78
 
76
79
  def new_content_action_id
77
- if @current_action && (new_card? || @current_action.new_content? || db_content_changed?)
80
+ if @current_action && (new_card? || @current_action.new_content? ||
81
+ db_content_changed?)
78
82
  @current_action.id
79
83
  end
80
84
  end
81
85
 
82
86
  def last_action_id
83
- la = last_action and la.id
87
+ (la = last_action) && la.id
84
88
  end
85
89
 
86
90
  def last_action
@@ -104,7 +108,9 @@ end
104
108
  def last_act
105
109
  if (action = last_action)
106
110
  last_act_on_self = acts.last
107
- if last_act_on_self and ( action.act==last_act_on_self || last_act_on_self.acted_at>action.act.acted_at )
111
+ if last_act_on_self &&
112
+ (action.act == last_act_on_self ||
113
+ last_act_on_self.acted_at > action.act.acted_at)
108
114
  last_act_on_self
109
115
  else
110
116
  action.act
@@ -116,7 +122,6 @@ def acted_at
116
122
  last_act.acted_at
117
123
  end
118
124
 
119
-
120
125
  def previous_action action_id
121
126
  if action_id
122
127
  action_index = actions.find_index do |a|
@@ -127,15 +132,15 @@ def previous_action action_id
127
132
  end
128
133
 
129
134
  def revised_at
130
- (last_action and act=last_action.act and act.acted_at) or Time.now
135
+ (last_action && (act = last_action.act) && act.acted_at) || Time.zone.now
131
136
  end
132
137
 
133
138
  def creator
134
- Card[ creator_id ]
139
+ Card[creator_id]
135
140
  end
136
141
 
137
142
  def updater
138
- Card[ updater_id ]
143
+ Card[updater_id]
139
144
  end
140
145
 
141
146
  def clean_html?
@@ -146,10 +151,11 @@ def draft_acts
146
151
  drafts.created_by(Card::Auth.current_id).map(&:act)
147
152
  end
148
153
 
149
- event :detect_conflict, before: :approve, on: :update, when: proc {|c| c.history? } do
150
- if last_action_id_before_edit and last_action_id_before_edit.to_i != last_action_id and last_action.act.actor_id != Auth.current_id
151
- errors.add :conflict, "changes not based on latest revision"
154
+ event :detect_conflict, :validate,
155
+ on: :update, when: proc { |c| c.history? } do
156
+ if last_action_id_before_edit &&
157
+ last_action_id_before_edit.to_i != last_action_id &&
158
+ last_action.act.actor_id != Auth.current_id
159
+ errors.add :conflict, 'changes not based on latest revision'
152
160
  end
153
161
  end
154
-
155
-