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
@@ -33,22 +33,22 @@ describe Card::Reference do
33
33
  end
34
34
 
35
35
  it 'in references should survive cardtype change' do
36
- newcard 'Banana', '[[Yellow]]'
37
- newcard 'Submarine', '[[Yellow]]'
38
- newcard 'Sun', '[[Yellow]]'
39
- newcard 'Yellow'
36
+ create! 'Banana', '[[Yellow]]'
37
+ create! 'Submarine', '[[Yellow]]'
38
+ create! 'Sun', '[[Yellow]]'
39
+ create! 'Yellow'
40
40
  yellow_refs = Card['Yellow'].referers.map(&:name).sort
41
- expect(yellow_refs).to eq(%w{ Banana Submarine Sun })
41
+ expect(yellow_refs).to eq(%w( Banana Submarine Sun ))
42
42
 
43
43
  y = Card['Yellow']
44
44
  y.type_id = Card.fetch_id 'UserForm'
45
45
  y.save!
46
46
 
47
47
  yellow_refs = Card['Yellow'].referers.map(&:name).sort
48
- expect(yellow_refs).to eq(%w{ Banana Submarine Sun })
48
+ expect(yellow_refs).to eq(%w( Banana Submarine Sun ))
49
49
  end
50
50
 
51
- it 'container inclusion' do
51
+ it 'container nest' do
52
52
  Card.create name: 'bob+city'
53
53
  Card.create name: 'address+*right+*default', content: '{{_L+city}}'
54
54
  Card.create name: 'bob+address'
@@ -57,17 +57,17 @@ describe Card::Reference do
57
57
  end
58
58
 
59
59
  it 'pickup new links on rename' do
60
- @l = newcard('L', '[[Ethan]]') # no Ethan card yet...
61
- @e = newcard('Earthman')
60
+ @l = create!('L', '[[Ethan]]') # no Ethan card yet...
61
+ @e = create!('Earthman')
62
62
  @e.update_attributes! name: 'Ethan' # NOW there is an Ethan card
63
63
  # do we need the links to be caught before reloading the card?
64
64
  expect(Card['Ethan'].referers.map(&:name).include?('L')).not_to eq(nil)
65
65
  end
66
66
 
67
67
  it 'should update references on rename when requested' do
68
- newcard 'watermelon', 'mmmm'
69
- newcard 'watermelon+seeds', 'black'
70
- lew = newcard('Lew', 'likes [[watermelon]] and [[watermelon+seeds|seeds]]')
68
+ create! 'watermelon', 'mmmm'
69
+ create! 'watermelon+seeds', 'black'
70
+ lew = create!('Lew', 'likes [[watermelon]] and [[watermelon+seeds|seeds]]')
71
71
 
72
72
  watermelon = Card['watermelon']
73
73
  watermelon.update_referers = true
@@ -90,9 +90,9 @@ describe Card::Reference do
90
90
  end
91
91
 
92
92
  it 'should not update references when not requested' do
93
- watermelon = newcard 'watermelon', 'mmmm'
94
- watermelon_seeds = newcard 'watermelon+seeds', 'black'
95
- lew = newcard('Lew', 'likes [[watermelon]] and [[watermelon+seeds|seeds]]')
93
+ watermelon = create! 'watermelon', 'mmmm'
94
+ watermelon_seeds = create! 'watermelon+seeds', 'black'
95
+ lew = create!('Lew', 'likes [[watermelon]] and [[watermelon+seeds|seeds]]')
96
96
 
97
97
  assert_equal [watermelon.id, watermelon_seeds.id],
98
98
  lew.references_out.order(:id).map(&:referee_id),
@@ -127,11 +127,11 @@ describe Card::Reference do
127
127
  expect(@x.content).to eq('[[A]] [[A+B]] [[T]]')
128
128
  end
129
129
 
130
- it 'template inclusion' do
130
+ it 'template nest' do
131
131
  Card.create! name: 'ColorType', type: 'Cardtype', content: ''
132
132
  Card.create! name: 'ColorType+*type+*structure', content: '{{+rgb}}'
133
133
  green = Card.create! name: 'green', type: 'ColorType'
134
- newcard 'rgb'
134
+ create! 'rgb'
135
135
  green_rgb = Card.create! name: 'green+rgb', content: '#00ff00'
136
136
 
137
137
  expect(green.reload.includees.map(&:name)).to eq(['green+rgb'])
@@ -152,7 +152,7 @@ describe Card::Reference do
152
152
  expect(Card['alpha card'].referers.map(&:name)).to eq(['beta card'])
153
153
  end
154
154
 
155
- it 'simple inclusion' do
155
+ it 'simple nest' do
156
156
  Card.create name: 'alpha'
157
157
  Card.create name: 'beta', content: 'I nest {{alpha}}'
158
158
  expect(Card['beta'].includees.map(&:name)).to eq(['alpha'])
@@ -176,7 +176,7 @@ describe Card::Reference do
176
176
  expect(y_referers).to include('search with references')
177
177
 
178
178
  search_referees = Card['search with references'].referees.map(&:name).sort
179
- expect(search_referees).to eq(%w{ A B X Y })
179
+ expect(search_referees).to eq(%w( A B X Y ))
180
180
  end
181
181
 
182
182
  it 'handles contextual names in Basic cards' do
@@ -191,19 +191,19 @@ describe Card::Reference do
191
191
  expect(Card['search w refs'].content).to eq '{"name":"_+AAA"}'
192
192
  end
193
193
 
194
- it 'should handle commented inclusion' do
195
- c = Card.create name: 'inclusion comment test', content: '{{## hi mom }}'
194
+ it 'should handle commented nest' do
195
+ c = Card.create name: 'nest comment test', content: '{{## hi mom }}'
196
196
  expect(c.errors.any?).to be_falsey
197
197
  end
198
198
 
199
199
  it 'pickup new links on create' do
200
- @l = newcard('woof', '[[Lewdog]]') # no Lewdog card yet...
201
- @e = newcard('Lewdog') # now there is
200
+ @l = create!('woof', '[[Lewdog]]') # no Lewdog card yet...
201
+ @e = create!('Lewdog') # now there is
202
202
  # NOTE @e.referers does not work, you have to reload
203
203
  expect(@e.reload.referers.map(&:name).include?('woof')).not_to eq(nil)
204
204
  end
205
205
 
206
- it 'pickup new inclusions on create' do
206
+ it 'pickup new nests on create' do
207
207
  @l = Card.create! name: 'woof', content: '{{Lewdog}}'
208
208
  # no Lewdog card yet...
209
209
  @e = Card.new name: 'Lewdog', content: 'grrr'
@@ -1,7 +1,7 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  module SetPatternSpecHelper
4
- def it_generates( opts )
4
+ def it_generates opts
5
5
  name = opts[:name]
6
6
  card = opts[:from]
7
7
  it "generates name '#{name}' for card '#{card.name}'" do
@@ -15,7 +15,7 @@ include SetPatternSpecHelper
15
15
  describe Card::SetPattern do
16
16
  end
17
17
 
18
- #FIXME - these should probably be in pattern-specific specs, though that may not leave much to test in the base class :)
18
+ # FIXME: - these should probably be in pattern-specific specs, though that may not leave much to test in the base class :)
19
19
 
20
20
  describe Card::RightSet do
21
21
  it_generates name: 'author+*right', from: Card.new(name: 'Iliad+author')
@@ -23,7 +23,7 @@ describe Card::RightSet do
23
23
  end
24
24
 
25
25
  describe Card::TypeSet do
26
- it_generates name: 'Book+*type', from: Card.new(type: "Book")
26
+ it_generates name: 'Book+*type', from: Card.new(type: 'Book')
27
27
  end
28
28
 
29
29
  describe Card::TypeSet do
@@ -0,0 +1,218 @@
1
+ describe Card::StageDirector do
2
+ describe 'abortion' do
3
+ let(:create_card) { Card.create name: 'a card' }
4
+ subject { Card.fetch 'a card' }
5
+ context 'when error added' do
6
+ it 'stops act in validation phase' do
7
+ in_stage :validate,
8
+ on: :save,
9
+ trigger: -> { create_card } do
10
+ errors.add :stop, "don't do this"
11
+ end
12
+ is_expected.to be_falsey
13
+ end
14
+
15
+ it 'does not stop act in storage phase' do
16
+ in_stage :store, on: :save,
17
+ trigger: -> { create_card } do
18
+ errors.add :stop, "don't do this"
19
+ end
20
+ is_expected.to be_truthy
21
+ end
22
+ end
23
+
24
+ context 'when exception raised' do
25
+ it 'rollbacks in finalize stage' do
26
+ begin
27
+ in_stage :finalize,
28
+ on: :save,
29
+ trigger: -> { create_card } do
30
+ raise Card::Error, 'rollback'
31
+ end
32
+ rescue Card::Error => e
33
+ ensure
34
+ is_expected.to be_falsey
35
+ end
36
+ end
37
+
38
+ it 'does not rollback in integrate stage' do
39
+ begin
40
+ Card::Auth.as_bot do
41
+ in_stage :integrate,
42
+ on: :save,
43
+ trigger: -> { create_card } do
44
+ raise Card::Abort, 'rollback'
45
+ end
46
+ end
47
+ rescue Card::Abort => e
48
+ ensure
49
+ is_expected.to be_truthy
50
+ end
51
+ end
52
+ end
53
+
54
+ context 'when abort :success called' do
55
+ it 'aborts storage in validation stage' do
56
+ in_stage :validate,
57
+ on: :create,
58
+ trigger: -> { create_card } do
59
+ abort :success
60
+ end
61
+ is_expected.to be_falsey
62
+ end
63
+
64
+ it 'aborts storage in store stage' do
65
+ in_stage :store,
66
+ on: :create,
67
+ trigger: -> { create_card } do
68
+ abort :success
69
+ end
70
+ is_expected.to be_falsey
71
+ end
72
+
73
+ it 'aborts storage in finalize stage' do
74
+ in_stage :store,
75
+ on: :create,
76
+ trigger: -> { create_card } do
77
+ abort :success
78
+ end
79
+ is_expected.to be_falsey
80
+ end
81
+
82
+ it 'does not abort storage in integrate stage' do
83
+ in_stage :integrate,
84
+ on: :create,
85
+ trigger: -> { create_card } do
86
+ abort :success
87
+ end
88
+ is_expected.to be_truthy
89
+ end
90
+ end
91
+ end
92
+
93
+ describe 'stage order' do
94
+ let(:create_card_with_subcards) do
95
+ Card.create name: '1',
96
+ subcards: {
97
+ '11' => { subcards: { '111' => 'A' } },
98
+ '12' => { subcards: { '121' => 'A' } }
99
+ }
100
+ end
101
+ let(:preorder) { %w(1 11 111 12 121) }
102
+ let(:postorder) { %w(111 11 121 12 1) }
103
+ describe 'validate' do
104
+ it 'is pre-order depth-first' do
105
+ order = []
106
+ in_stage :validate, on: :create,
107
+ trigger: -> { create_card_with_subcards } do
108
+ order << name
109
+ end
110
+ expect(order).to eq(preorder)
111
+ end
112
+
113
+ it 'executes all validate stages before next stage' do
114
+ order = []
115
+ with_test_events do
116
+ test_event :validate, on: :create do
117
+ order << "v:#{name}"
118
+ end
119
+ test_event :prepare_to_store, on: :create do
120
+ order << "pts:#{name}"
121
+ end
122
+ create_card_with_subcards
123
+ end
124
+ expect(order).to eq(
125
+ %w(v:1 v:11 v:111 v:12 v:121 pts:1 pts:11 pts:111 pts:12 pts:121)
126
+ )
127
+ end
128
+ end
129
+
130
+ describe 'finalize' do
131
+ it 'is post-order depth-first' do
132
+ order = []
133
+ in_stage :finalize, on: :create,
134
+ trigger: -> { create_card_with_subcards } do
135
+ order << name
136
+ end
137
+ expect(order).to eq(postorder)
138
+ end
139
+ end
140
+
141
+ describe 'store' do
142
+ it 'is pre-order depth-first' do
143
+ order = []
144
+ in_stage :store, on: :create,
145
+ trigger: -> { create_card_with_subcards } do
146
+ order << name
147
+ end
148
+ expect(order).to eq(preorder)
149
+ end
150
+ end
151
+
152
+ describe 'store and finalize' do
153
+ it 'executes finalize when all subcards are stored and finalized' do
154
+ order = []
155
+ with_test_events do
156
+ test_event :store, on: :create do
157
+ order << "store:#{name}"
158
+ end
159
+ test_event :finalize, on: :create do
160
+ order << "finalize:#{name}"
161
+ end
162
+ create_card_with_subcards
163
+ end
164
+ expect(order).to eq(
165
+ %w(store:1 store:11 store:111 finalize:111 finalize:11
166
+ store:12 store:121 finalize:121 finalize:12 finalize:1)
167
+ )
168
+ end
169
+ end
170
+
171
+ describe 'complete run' do
172
+ it 'is in correct order' do
173
+ order = []
174
+ with_test_events do
175
+ test_event :initialize, on: :create do
176
+ order << "i:#{name}"
177
+ end
178
+ test_event :prepare_to_validate, on: :create do
179
+ order << "ptv:#{name}"
180
+ end
181
+ test_event :validate, on: :create do
182
+ order << "v:#{name}"
183
+ add_subcard '112v' if name == '11'
184
+ end
185
+ test_event :prepare_to_store, on: :create do
186
+ order << "pts:#{name}"
187
+ end
188
+ test_event :store, on: :create do
189
+ order << "s:#{name}"
190
+ end
191
+ test_event :finalize, on: :create do
192
+ order << "f:#{name}"
193
+ end
194
+ test_event :integrate, on: :create do
195
+ order << "ig:#{name}"
196
+ end
197
+ test_event :integrate_with_delay, on: :create do
198
+ order << "igwd:#{name}"
199
+ end
200
+ create_card_with_subcards
201
+ end
202
+ expect(order).to eq(
203
+ %w(
204
+ i:1 i:11 i:111 i:12 i:121
205
+ ptv:1 ptv:11 ptv:111 ptv:12 ptv:121
206
+ v:1 v:11 v:111
207
+ i:112v ptv:112v v:112v
208
+ v:12 v:121
209
+ pts:1 pts:11 pts:111 pts:112v pts:12 pts:121
210
+ s:1 s:11 s:111 f:111 s:112v f:112v f:11 s:12 s:121 f:121 f:12 f:1
211
+ ig:1 ig:11 ig:111 ig:112v ig:12 ig:121
212
+ igwd:1 igwd:11 igwd:111 igwd:112v igwd:12 igwd:121
213
+ )
214
+ )
215
+ end
216
+ end
217
+ end
218
+ end
@@ -57,22 +57,22 @@ describe Card::Subcards do
57
57
  expect(Card['supermen+pseudonym'].name).to eq 'supermen+pseudonym'
58
58
  end
59
59
 
60
- it "cleans the cache for autonaming case" do
60
+ it 'cleans the cache for autonaming case' do
61
61
  Card::Auth.as_bot do
62
62
  Card.create!(
63
63
  name: 'Book+*type+*autoname', content: 'Book_1',
64
64
  type_id: Card::PhraseID
65
65
  )
66
66
  card = Card.create!(
67
- type: "Book",
68
- subcards: { '+editable' => 'yes'}
67
+ type: 'Book',
68
+ subcards: { '+editable' => 'yes' }
69
69
  )
70
70
  expect(card.errors).to be_empty
71
71
  expect(Card["#{card.name}+editable"]).to be_truthy
72
72
 
73
73
  @card = Card.create!(
74
- type: "Book",
75
- subcards: { '+editable' => 'sure'}
74
+ type: 'Book',
75
+ subcards: { '+editable' => 'sure' }
76
76
  )
77
77
  end
78
78
 
@@ -87,11 +87,11 @@ describe Card::Subcards do
87
87
  end
88
88
  subject { Card.fetch("#{@card.name}+sub", new: {}, local_only: true).content }
89
89
  it 'works with string' do
90
- @card._add_subfield 'sub', content: 'this is a sub'
90
+ @card.add_subfield 'sub', content: 'this is a sub'
91
91
  is_expected.to eq 'this is a sub'
92
92
  end
93
93
  it 'works with codename' do
94
- @card._add_subfield :phrase, content: 'this is a sub'
94
+ @card.add_subfield :phrase, content: 'this is a sub'
95
95
  subcard = Card.fetch('A+phrase', new: {}, local_only: true)
96
96
  expect(subcard.content).to eq 'this is a sub'
97
97
  end
@@ -103,12 +103,12 @@ describe Card::Subcards do
103
103
  end
104
104
  subject { Card.fetch("#{@card.name}+sub", new: {}, local_only: true).content }
105
105
  it 'works with string' do
106
- @card._add_subfield 'sub', content: 'this is a sub'
106
+ @card.add_subfield 'sub', content: 'this is a sub'
107
107
  expect(@card.subfield('sub').content).to eq 'this is a sub'
108
108
  end
109
109
 
110
110
  it 'works with codename' do
111
- @card._add_subfield :phrase, content: 'this is a sub'
111
+ @card.add_subfield :phrase, content: 'this is a sub'
112
112
  expect(@card.subfield(':phrase').content).to eq 'this is a sub'
113
113
  end
114
114
 
@@ -128,7 +128,7 @@ describe Card::Subcards do
128
128
  @card = Card['A']
129
129
  end
130
130
  it 'adds a subcard' do
131
- @card._add_subcard 'sub', content: 'sub content'
131
+ @card.add_subcard 'sub', content: 'sub content'
132
132
  @card.save!
133
133
  expect(Card['sub'].content).to eq 'sub content'
134
134
  end
@@ -136,9 +136,7 @@ describe Card::Subcards do
136
136
  describe 'two levels of subcards' do
137
137
  it 'creates cards with subcards with subcards' do
138
138
  Card::Auth.as_bot do
139
- in_phase before: :approve, trigger: -> {
140
- Card.create! name: 'test'
141
- } do
139
+ in_stage :validate, trigger: -> { Card.create!(name: 'test') } do
142
140
  if name == 'test'
143
141
  add_subfield('first-level')
144
142
  subfield('first-level').add_subfield 'second-level', content: 'yeah'
@@ -149,9 +147,7 @@ describe Card::Subcards do
149
147
  end
150
148
  it 'creates cards with subcards with subcards using codenames' do
151
149
  Card::Auth.as_bot do
152
- in_phase before: :approve, trigger: -> {
153
- Card.create! name: 'test'
154
- } do
150
+ in_stage :validate, trigger: -> { Card.create!(name: 'test') } do
155
151
  if name == 'test'
156
152
  add_subfield :children
157
153
  subfield(:children).add_subfield :title, content: 'yeah'