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
@@ -7,7 +7,7 @@ class Card
7
7
  class HtmlFormat < Format
8
8
  include Diff
9
9
 
10
- attr_accessor :options_need_save, :start_time, :skip_autosave
10
+ attr_accessor :options_need_save, :start_time, :skip_autosave
11
11
 
12
12
  # builtin layouts allow for rescue / testing
13
13
  LAYOUTS = Loader.load_layouts.merge 'none' => '{{_main}}'
@@ -31,7 +31,7 @@ class Card
31
31
 
32
32
  def layout_from_card_or_code name
33
33
  layout_card = Card.fetch name.to_s, skip_virtual: true, skip_modules: true
34
- if layout_card and layout_card.ok? :read
34
+ if layout_card && layout_card.ok?(:read)
35
35
  layout_card.content
36
36
  elsif (hardcoded_layout = LAYOUTS[name])
37
37
  hardcoded_layout
@@ -40,8 +40,8 @@ class Card
40
40
  end
41
41
  end
42
42
 
43
- def get_inclusion_defaults nested_card
44
- {view: (nested_card.rule( :default_html_view ) || :titled) }
43
+ def get_nest_defaults nested_card
44
+ { view: (nested_card.rule(:default_html_view) || :titled) }
45
45
  end
46
46
 
47
47
  def default_item_view
@@ -50,23 +50,19 @@ class Card
50
50
 
51
51
  def output content
52
52
  case content
53
- when String; content
54
- when Array ; content.compact.join "\n"
53
+ when String then content
54
+ when Array then content.compact.join "\n"
55
55
  end
56
56
  end
57
57
 
58
58
  def html_escape_except_quotes s
59
59
  # to be used inside single quotes (makes for readable json attributes)
60
- s.to_s.gsub(/&/, "&amp;").gsub(/\'/, "&apos;").gsub(/>/, "&gt;").gsub(/</, "&lt;")
60
+ s.to_s.gsub(/&/, '&amp;').gsub(/\'/, '&apos;').gsub(/>/, '&gt;').gsub(/</, '&lt;')
61
61
  end
62
62
 
63
-
64
-
65
-
66
-
67
63
  def main?
68
64
  if show_layout?
69
- @depth == 1 && @mainline #assumes layout includes {{_main}}
65
+ @depth == 1 && @mainline # assumes layout includes {{_main}}
70
66
  else
71
67
  @depth == 0 && params[:is_main]
72
68
  end
@@ -3,7 +3,7 @@
3
3
  class Card
4
4
  Format.register :text
5
5
  Format.register :txt
6
-
6
+
7
7
  class TextFormat < Format
8
8
  @@aliases['txt'] = 'text'
9
9
  end
@@ -0,0 +1,96 @@
1
+
2
+ # The Card#abort method is for cleanly exiting an action without continuing
3
+ # to process any further events.
4
+ #
5
+ # Three statuses are supported:
6
+ #
7
+ # failure: adds an error, returns false on save
8
+ # success: no error, returns true on save
9
+ # triumph: similar to success, but if called on a subcard
10
+ # it causes the entire action to abort (not just the subcard)
11
+ def abort status, msg='action canceled'
12
+ if status == :failure && errors.empty?
13
+ errors.add :abort, msg
14
+ elsif status.is_a?(Hash) && status[:success]
15
+ success << status[:success]
16
+ status = :success
17
+ end
18
+ raise Card::Abort.new(status, msg)
19
+ end
20
+
21
+ module ClassMethods
22
+ def create! opts
23
+ card = Card.new opts
24
+ card.act do
25
+ card.save!
26
+ end
27
+ card
28
+ end
29
+
30
+ def create opts
31
+ card = Card.new opts
32
+ card.act do
33
+ card.save
34
+ end
35
+ card
36
+ end
37
+ end
38
+
39
+ def delete
40
+ act do
41
+ super
42
+ end
43
+ end
44
+
45
+ def delete!
46
+ act do
47
+ super
48
+ end
49
+ end
50
+
51
+ def update_attributes opts
52
+ act do
53
+ super opts
54
+ end
55
+ end
56
+
57
+ def update_attributes! opts
58
+ act do
59
+ super opts
60
+ end
61
+ end
62
+
63
+ def abortable
64
+ yield
65
+ rescue Card::Abort => e
66
+ if e.status == :triumph
67
+ @supercard ? raise(e) : true
68
+ elsif e.status == :success
69
+ if @supercard
70
+ @supercard.subcards.delete key
71
+ @supercard.director.subdirectors.delete self
72
+ expire_soft
73
+ end
74
+ true
75
+ end
76
+ end
77
+
78
+ # this is an override of standard rails behavior that rescues abort
79
+ # makes it so that :success abortions do not rollback
80
+ def with_transaction_returning_status
81
+ status = nil
82
+ self.class.transaction do
83
+ add_to_transaction
84
+ status = abortable { yield }
85
+ raise ActiveRecord::Rollback unless status
86
+ end
87
+ status
88
+ end
89
+
90
+ event :notable_exception_raised do
91
+ Rails.logger.debug "BT: #{Card::Error.current.backtrace * "\n "}"
92
+ end
93
+
94
+ def success
95
+ Env.success(cardname)
96
+ end
@@ -19,17 +19,17 @@ end
19
19
 
20
20
  =end
21
21
 
22
- def trait_var var_name, &block
23
- # FIXME - following optimization attempt needs to handle cache clearing!
24
- # instance_variable_get var_name or begin
25
- # instance_variable_set var_name, block_given? ? yield : raise("no block?")
26
- # end
22
+ def trait_var _var_name, &_block
23
+ # FIXME: - following optimization attempt needs to handle cache clearing!
24
+ # instance_variable_get var_name or begin
25
+ # instance_variable_set var_name, block_given? ? yield : raise("no block?")
26
+ # end
27
27
  yield
28
28
  end
29
29
 
30
- #fixme -this needs a better home!
30
+ # FIXME: -this needs a better home!
31
31
  def format opts={}
32
32
  opts = { format: opts.to_sym } if [Symbol, String].member? opts.class
33
33
 
34
34
  Card::Format.new self, opts
35
- end
35
+ end
@@ -75,7 +75,7 @@ def insert_item index, name
75
75
  self.content = new_names.join "\n"
76
76
  end
77
77
 
78
- def extended_item_cards context = nil
78
+ def extended_item_cards context=nil
79
79
  context = (context ? context.cardname : cardname)
80
80
  args = { limit: '' }
81
81
  items = item_cards(args.merge(context: context))
@@ -128,7 +128,7 @@ format do
128
128
 
129
129
  def item_view args
130
130
  args[:item] ||
131
- (@inclusion_opts && @inclusion_opts[:view]) ||
131
+ (@nest_opts && @nest_opts[:view]) ||
132
132
  default_item_view
133
133
  end
134
134
 
@@ -170,7 +170,7 @@ format do
170
170
  params.each do |key, val|
171
171
  case key.to_s
172
172
  when '_wql' then hash.merge! val
173
- when /^\_(\w+)$/ then hash[:vars][$1.to_sym] = val
173
+ when /^\_(\w+)$/ then hash[:vars][Regexp.last_match(1).to_sym] = val
174
174
  end
175
175
  end
176
176
  end
@@ -197,10 +197,10 @@ format do
197
197
  result
198
198
  end
199
199
 
200
- def unique_chunks chunk, processed_set, &block
200
+ def unique_chunks chunk, processed_set, &_block
201
201
  return if processed_set.include? chunk.referee_name.key
202
202
  processed_set << chunk.referee_name.key
203
- block.call(chunk)
203
+ yield(chunk)
204
204
  end
205
205
 
206
206
  def each_nested_field args, &block
@@ -208,26 +208,25 @@ format do
208
208
 
209
209
  each_nested_chunk(args) do |chunk|
210
210
  # TODO: handle structures that are non-virtual
211
- if chunk.referee_name.to_name.field_of? card.name
212
- if chunk.referee_card &&
213
- chunk.referee_card.virtual? &&
214
- !processed_chunk_keys.include?(chunk.referee_name.key)
215
-
216
- processed_chunk_keys << chunk.referee_name.key
217
- subformat(chunk.referee_card).each_nested_field(args) do |sub_chunk|
218
- unique_chunks sub_chunk, processed_chunk_keys, &block
219
- end
220
- else
221
- unique_chunks chunk, processed_chunk_keys, &block
211
+ next unless chunk.referee_name.to_name.field_of? card.name
212
+ if chunk.referee_card &&
213
+ chunk.referee_card.virtual? &&
214
+ !processed_chunk_keys.include?(chunk.referee_name.key)
215
+
216
+ processed_chunk_keys << chunk.referee_name.key
217
+ subformat(chunk.referee_card).each_nested_field(args) do |sub_chunk|
218
+ unique_chunks sub_chunk, processed_chunk_keys, &block
222
219
  end
220
+ else
221
+ unique_chunks chunk, processed_chunk_keys, &block
223
222
  end
224
223
  end
225
224
  end
226
225
 
227
- def map_references_with_args args={}, &block
226
+ def map_references_with_args args={}, &_block
228
227
  result = []
229
228
  each_reference_with_args args do |name, n_args|
230
- result << block.call(name, n_args)
229
+ result << yield(name, n_args)
231
230
  end
232
231
  result
233
232
  end
@@ -235,7 +234,7 @@ format do
235
234
  # process args for links and nests
236
235
  def nest_args args, chunk=nil
237
236
  r_args = item_args(args)
238
- r_args.merge! @inclusion_opts.clone if @inclusion_opts
237
+ r_args.merge! @nest_opts.clone if @nest_opts
239
238
 
240
239
  case chunk
241
240
  when Card::Chunk::Include
@@ -276,7 +275,7 @@ format :html do
276
275
  args[:tab_type] ||= 'tabs'
277
276
  end
278
277
 
279
- # create a path for a nest with respect ot the inclusion options
278
+ # create a path for a nest with respect ot the nest options
280
279
  def nest_path name, nest_args
281
280
  path_args = {}
282
281
  path_args[:view] = nest_args[:view]
@@ -46,15 +46,17 @@ def last_draft_content
46
46
  drafts.last.card_changes.last.value
47
47
  end
48
48
 
49
- event :save_draft,
50
- before: :store, on: :update,
51
- when: proc { Env.params['draft'] == 'true' } do
49
+ event :save_draft, :store,
50
+ on: :update, when: proc { Env.params['draft'] == 'true' } do
52
51
  save_content_draft content
53
52
  abort :success
54
53
  end
55
54
 
56
- event :set_default_content, on: :create, before: :approve do
57
- if !db_content_changed? && template && template.db_content.present?
58
- self.db_content = template.db_content
59
- end
55
+ event :set_default_content, :prepare_to_validate,
56
+ on: :create, when: proc { |c| c.use_default_content? } do
57
+ self.db_content = template.db_content
58
+ end
59
+
60
+ def use_default_content?
61
+ !db_content_changed? && template && template.db_content.present?
60
62
  end
@@ -1,11 +1,11 @@
1
1
  format do
2
2
  def render_erb locals={}, template=nil, a_binding=nil, &block
3
- template ||= block.call
3
+ template ||= yield
4
4
  a_binding ||= binding
5
- locals.each do |k,v|
6
- #a_binding.local_variable_set(k, v) # needs ruby 2.1
7
- instance_variable_set("@#{k}",v)
5
+ locals.each do |k, v|
6
+ # a_binding.local_variable_set(k, v) # needs ruby 2.1
7
+ instance_variable_set("@#{k}", v)
8
8
  end
9
- ERB.new(template,nil,'-').result(binding)
9
+ ERB.new(template, nil, '-').result(binding)
10
10
  end
11
11
  end
@@ -0,0 +1,60 @@
1
+ def event_applies? opts
2
+ on_condition_applies?(opts[:on]) &&
3
+ changed_condition_applies?(opts[:changed]) &&
4
+ when_condition_applies?(opts[:when])
5
+ end
6
+
7
+ def rescue_event e
8
+ @action = nil
9
+ expire_pieces
10
+ subcards.each(&:expire_pieces)
11
+ raise e
12
+ # rescue Card::Cancel
13
+ # false
14
+ end
15
+
16
+ private
17
+
18
+ def on_condition_applies? action
19
+ if action
20
+ Array.wrap(action).member? @action
21
+ else
22
+ true
23
+ end
24
+ end
25
+
26
+ def changed_condition_applies? db_columns
27
+ case db_columns
28
+ when Symbol
29
+ return single_changed_condition_applies?(db_columns)
30
+ when Array
31
+ db_columns.each do |col|
32
+ return true if single_changed_condition_applies? col
33
+ end
34
+ else
35
+ return true
36
+ end
37
+ false
38
+ end
39
+
40
+ def single_changed_condition_applies? db_column
41
+ if db_column
42
+ db_column =
43
+ case db_column.to_sym
44
+ when :content then 'db_content'
45
+ when :type then 'type_id'
46
+ else db_column.to_s
47
+ end
48
+ @action != :delete && changes[db_column]
49
+ else
50
+ true
51
+ end
52
+ end
53
+
54
+ def when_condition_applies? block
55
+ if block
56
+ block.call self
57
+ else
58
+ true
59
+ end
60
+ end
@@ -100,15 +100,10 @@ module ClassMethods
100
100
  Card.cache.hard.delete "~#{card.id}" if card.id
101
101
  end
102
102
 
103
- def expire name, subcards=false
103
+ def expire name
104
104
  # note: calling instance method breaks on dirty names
105
105
  key = name.to_name.key
106
106
  return unless (card = Card.cache.read key)
107
- if subcards
108
- card.expire_subcards
109
- else
110
- card.preserve_subcards
111
- end
112
107
  Card.cache.delete key
113
108
  Card.cache.delete "~#{card.id}" if card.id
114
109
  end
@@ -120,9 +115,14 @@ module ClassMethods
120
115
  set_cache_list.nil? ? [] : set_cache_list.keys
121
116
  end
122
117
 
118
+ # updates the members hash for all sets self is a member of
119
+ # QUESTION: why map and not each?
120
+ # I don't see where that array is useful. It contains
121
+ # nil for all sets for which self was already cached as a member
123
122
  def set_members set_names, key
124
- set_names.compact.map(&:to_name).map(&:key).map do |set_key|
125
- skey = "$#{set_key}" # dollar sign avoids conflict with card keys
123
+ set_names.compact.map do |set_name|
124
+ # dollar sign avoids conflict with card keys
125
+ skey = "$#{set_name.to_name.key}"
126
126
  h = Card.cache.read skey
127
127
  if h.nil?
128
128
  h = {}
@@ -137,7 +137,7 @@ module ClassMethods
137
137
 
138
138
  def validate_fetch_opts! opts
139
139
  return unless opts[:new] && opts[:skip_virtual]
140
- fail Card::Error, 'fetch called with new args and skip_virtual'
140
+ raise Card::Error, 'fetch called with new args and skip_virtual'
141
141
  end
142
142
 
143
143
  def cache
@@ -196,7 +196,6 @@ module ClassMethods
196
196
  query = { mark_type => mark_key }
197
197
  query[:trash] = false unless opts[:look_in_trash]
198
198
  card = Card.where(query).take
199
- card.restore_subcards if card
200
199
  card
201
200
  end
202
201
 
@@ -288,7 +287,7 @@ end
288
287
 
289
288
  def expire_pieces
290
289
  cardname.piece_names.each do |piece|
291
- Card.expire piece, !cardname.field_of?(piece)
290
+ Card.expire piece
292
291
  end
293
292
  end
294
293
 
@@ -298,19 +297,14 @@ def expire_hard
298
297
  Card.cache.hard.delete "~#{id}" if id
299
298
  end
300
299
 
301
- def expire_soft subcards=false
302
- if subcards
303
- expire_subcards
304
- else
305
- preserve_subcards
306
- end
300
+ def expire_soft
307
301
  Card.cache.soft.delete key
308
302
  Card.cache.soft.delete "~#{id}" if id
309
303
  end
310
304
 
311
- def expire subcards=false
305
+ def expire
312
306
  expire_hard
313
- expire_soft subcards
307
+ expire_soft
314
308
  end
315
309
 
316
310
  def refresh force=false