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
@@ -0,0 +1,126 @@
1
+ class Card
2
+ module Set
3
+ module Event
4
+ def event event, stage_or_opts={}, opts={}, &final
5
+ if stage_or_opts.is_a? Symbol
6
+ opts[:in] = stage_or_opts
7
+ else
8
+ opts = stage_or_opts
9
+ end
10
+ process_stage_opts opts
11
+
12
+ Card.define_callbacks event
13
+ define_event event, opts, &final
14
+ set_event_callbacks event, opts
15
+ end
16
+
17
+ def define_event event, opts, &final
18
+ final_method_name = "#{event}_without_callbacks" # should be private?
19
+ class_eval do
20
+ define_method final_method_name, &final
21
+ end
22
+
23
+ if with_delay? opts
24
+ delaying_method = "#{event}_with_delay"
25
+ define_event_delaying_method event, delaying_method
26
+ define_event_method event, delaying_method, opts
27
+ define_active_job event, final_method_name, opts[:queue_as]
28
+ else
29
+ define_event_method event, final_method_name, opts
30
+ end
31
+ end
32
+
33
+ private
34
+
35
+ def with_delay? opts
36
+ opts[:after] == :integrate_with_delay_stage
37
+ end
38
+
39
+ def process_stage_opts opts
40
+ case
41
+ when opts[:after] || opts[:before]
42
+ # ignore :in options
43
+ when opts[:in]
44
+ opts[:after] = :"#{opts.delete(:in)}_stage" if opts[:in]
45
+ end
46
+ opts[:on] = [:create, :update] if opts[:on] == :save
47
+ end
48
+
49
+ def define_event_delaying_method event, method_name
50
+ class_eval do
51
+ define_method method_name, proc {
52
+ s_attr =
53
+ serializable_attributes.each_with_object({}) do |name, hash|
54
+ value = instance_variable_get("@#{name}")
55
+ hash[name] =
56
+ # ActiveJob doesn't accept symbols as arguments
57
+ if value.is_a? Symbol
58
+ { value: value.to_s, symbol: true }
59
+ else
60
+ { value: value }
61
+ end
62
+ end
63
+ Object.const_get(event.to_s.camelize).perform_later(self, s_attr)
64
+ }
65
+ end
66
+ end
67
+
68
+ def define_event_method event, call_method, _opts
69
+ class_eval do
70
+ define_method event do
71
+ # puts "#{name}:#{event}".green
72
+ run_callbacks event do
73
+ send call_method
74
+ end
75
+ end
76
+ end
77
+ end
78
+
79
+ # creates an Active Job.
80
+ # The scheduled job gets the card object as argument and all serializable
81
+ # attributes of the card.
82
+ # (when the job is executed ActiveJob fetches the card from the database
83
+ # so all attributes get lost)
84
+ # @param name [String] the name for the ActiveJob child class
85
+ # @param final_method [String] the name of the card instance method to be
86
+ # queued
87
+ # @option queue [Symbol] (:default) the name of the queue8
88
+ def define_active_job name, final_method, queue=:default
89
+ class_name = name.to_s.camelize
90
+ eval %(
91
+ class ::#{class_name} < ActiveJob::Base
92
+ queue_as #{queue}
93
+ end
94
+ )
95
+ Object.const_get(class_name).class_eval do
96
+ define_method :perform, proc { |card, attributes|
97
+ attributes.each do |attname, args|
98
+ # symbols are not allowed so all symbols arrive here as strings
99
+ # convert strings that were symbols before back to symbols
100
+ value = args[:symbol] ? args[:value].to_sym : args[:value]
101
+ card.instance_variable_set("@#{attname}", value)
102
+ end
103
+ card.include_set_modules
104
+ card.send final_method
105
+ }
106
+ end
107
+ end
108
+
109
+ def set_event_callbacks event, opts
110
+ [:before, :after, :around].each do |kind|
111
+ next unless (object_method = opts.delete(kind))
112
+ this_set_module = self
113
+ Card.class_eval do
114
+ set_callback(
115
+ object_method, kind, event,
116
+ prepend: true, if: proc do |c|
117
+ c.singleton_class.include?(this_set_module) &&
118
+ c.event_applies?(opts)
119
+ end
120
+ )
121
+ end
122
+ end
123
+ end
124
+ end
125
+ end
126
+ end
@@ -29,14 +29,14 @@ class Card
29
29
  end
30
30
 
31
31
  def pattern
32
- Card.fetch(self.pattern_id, skip_modules: true).cardname
32
+ Card.fetch(pattern_id, skip_modules: true).cardname
33
33
  end
34
34
 
35
35
  def register pattern_code, opts={}
36
- if self.pattern_id = Card::Codename[pattern_code]
36
+ if (self.pattern_id = Card::Codename[pattern_code])
37
37
  self.pattern_code = pattern_code
38
38
  Card.set_patterns.insert opts.delete(:index).to_i, self
39
- self.anchorless = !respond_to?( :anchor_name )
39
+ self.anchorless = !respond_to?(:anchor_name)
40
40
  opts.each { |key, val| send "#{key}=", val }
41
41
  else
42
42
  warn "no codename for pattern_code #{pattern_code}"
@@ -48,11 +48,12 @@ class Card
48
48
  end
49
49
 
50
50
  def anchor_parts_count
51
- @anchor_parts_count ||= ( anchorless? ? 0 : 1 )
51
+ @anchor_parts_count ||= (anchorless? ? 0 : 1)
52
52
  end
53
53
 
54
54
  def write_tmp_file pattern_code, from_file, seq
55
- to_file = "#{Card.paths['tmp/set_pattern'].first}/#{seq}-#{pattern_code}.rb"
55
+ to_file = "#{Card.paths['tmp/set_pattern'].first}/" \
56
+ "#{seq}-#{pattern_code}.rb"
56
57
  klass = "Card::#{pattern_code.camelize}Set"
57
58
  file_content = <<EOF
58
59
  # -*- encoding : utf-8 -*-
@@ -61,7 +62,7 @@ class #{klass} < Card::SetPattern
61
62
  class << self
62
63
  # ~~~~~~~~~~~ above autogenerated; below pulled from #{from_file} ~~~~~~~~~~~
63
64
 
64
- #{ File.read from_file }
65
+ #{File.read from_file}
65
66
 
66
67
  # ~~~~~~~~~~~ below autogenerated; above pulled from #{from_file} ~~~~~~~~~~~
67
68
  end
@@ -74,17 +75,16 @@ EOF
74
75
  end
75
76
  end
76
77
 
77
-
78
78
  # Instance methods
79
79
 
80
80
  def initialize card
81
81
  unless self.class.anchorless?
82
82
  @anchor_name = self.class.anchor_name(card).to_name
83
83
  @anchor_id = if self.class.respond_to? :anchor_id
84
- self.class.anchor_id card
85
- else
86
- Card.fetch_id @anchor_name
87
- end
84
+ self.class.anchor_id card
85
+ else
86
+ Card.fetch_id @anchor_name
87
+ end
88
88
  end
89
89
  self
90
90
  end
@@ -100,21 +100,21 @@ EOF
100
100
  end
101
101
 
102
102
  def lookup_module_list modules_hash
103
- module_key && modules_hash[ module_key ]
103
+ module_key && modules_hash[module_key]
104
104
  end
105
105
 
106
106
  def module_list
107
- lookup_module_list Card::Set.modules[ :nonbase ]
107
+ lookup_module_list Card::Set.modules[:nonbase]
108
108
  end
109
109
 
110
110
  def format_module_list klass
111
- hash = Card::Set.modules[ :nonbase_format ][ klass ] and lookup_module_list hash
111
+ (hash = Card::Set.modules[:nonbase_format][klass]) && lookup_module_list(hash)
112
112
  end
113
113
 
114
114
  def anchor_codenames
115
115
  @anchor_name.parts.map do |part|
116
116
  part_id = Card.fetch_id part
117
- part_id && Card::Codename[ part_id.to_i ] or return nil
117
+ part_id && Card::Codename[part_id.to_i] || (return nil)
118
118
  end
119
119
  end
120
120
 
@@ -131,15 +131,19 @@ EOF
131
131
  end
132
132
 
133
133
  def safe_key
134
- caps_part = self.class.pattern_code.gsub(' ','_').upcase
135
- self.class.anchorless? ? caps_part : "#{caps_part}-#{@anchor_name.safe_key}"
134
+ caps_part = self.class.pattern_code.tr(' ', '_').upcase
135
+ if self.class.anchorless?
136
+ caps_part
137
+ else
138
+ "#{caps_part}-#{@anchor_name.safe_key}"
139
+ end
136
140
  end
137
141
 
138
142
  def rule_set_key
139
143
  if self.class.anchorless?
140
144
  self.class.pattern_code
141
145
  elsif @anchor_id
142
- [ @anchor_id, self.class.pattern_code ].map( &:to_s ) * '+'
146
+ "#{@anchor_id}+#{self.class.pattern_code}"
143
147
  end
144
148
  end
145
149
  end
@@ -152,24 +156,33 @@ EOF
152
156
 
153
157
  def lookup_inherited_key
154
158
  return unless @inherit_card
155
- card, @inherit_card = @inherit_card, nil
156
-
157
- default_rule = card.rule_card(:default) and
158
- type_code = default_rule.type_code and
159
- #default_rule.cardname.size > 2 and
160
- #default_rule.left.right.codename == self.class.pattern_code
161
- mod_key = "Type::#{type_code.to_s.camelize}" and
162
- ( Card::Set.modules[:nonbase_format].values +
163
- [Card::Set.modules[:nonbase]] ).any?{|hash| hash[mod_key]} and
159
+ card = @inherit_card
160
+ @inherit_card = nil
161
+
162
+ (default_rule = card.rule_card(:default)) &&
163
+ (type_code = default_rule.type_code) &&
164
+ # default_rule.cardname.size > 2 and
165
+ # default_rule.left.right.codename == self.class.pattern_code
166
+ (mod_key = "Type::#{type_code.to_s.camelize}") &&
167
+ (Card::Set.modules[:nonbase_format].values +
168
+ [Card::Set.modules[:nonbase]]).any? { |hash| hash[mod_key] } &&
164
169
  mod_key
165
170
  end
166
171
 
167
172
  def inherited_key
168
- (defined? @inherited_key) ? @inherited_key : @inherited_key = lookup_inherited_key
173
+ if defined?(@inherited_key)
174
+ @inherited_key
175
+ else
176
+ @inherited_key = lookup_inherited_key
177
+ end
169
178
  end
170
179
 
171
180
  def lookup_module_list modules_hash
172
- module_key ? modules_hash[ module_key ] : inherited_key && modules_hash[ inherited_key ]
181
+ if module_key
182
+ modules_hash[module_key]
183
+ else
184
+ inherited_key && modules_hash[inherited_key]
185
+ end
173
186
  end
174
187
  end
175
188
  end
@@ -1,41 +1,41 @@
1
- def is_in_mod? file,mod_path
1
+ def is_in_mod? file, mod_path
2
2
  mod_msg = "below pulled from #{Rails.root}/mod/#{mod_path}/"
3
- file.src.join("") =~ /#{mod_msg}/
3
+ file.src.join('') =~ /#{mod_msg}/
4
4
  end
5
+
5
6
  def card_simplecov_filters
6
7
  add_filter 'spec/'
7
8
  add_filter '/config/'
8
9
  add_filter '/tasks/'
9
10
  # filter all card mods
10
11
  add_filter do |src_file|
11
- src_file.filename =~ /tmp\// and not
12
- /\d+-(.+\.rb)/.match(src_file.filename) do |m|
13
- Dir["mod/**/#{m[1].gsub("-","/").sub("/","/set/")}"].present?
12
+ src_file.filename =~ /tmp\// && !/\d+-(.+\.rb)/.match(src_file.filename) do |m|
13
+ Dir["mod/**/#{m[1].tr('-', '/').sub('/', '/set/')}"].present?
14
14
  end
15
15
  end
16
16
  # add group for each deck mod
17
- Dir['mod/*'].map{ |path| path.sub('mod/','') }.each do |mod|
17
+ Dir['mod/*'].map { |path| path.sub('mod/', '') }.each do |mod|
18
18
  add_group mod.capitalize do |src_file|
19
- src_file.filename =~ /mod\/#{mod}\// or
19
+ src_file.filename =~ /mod\/#{mod}\// ||
20
20
  (
21
- src_file.filename =~ /tmp\// and
22
- match = /\d+-(.+\.rb)/.match(src_file.filename) do |m|
21
+ src_file.filename =~ /tmp\// &&
22
+ (match = /\d+-(.+\.rb)/.match(src_file.filename) do |m|
23
23
  # '/set' is not in the path anymore after some updates
24
24
  # but `set` exists in the path of the source files
25
- Dir["mod/**/#{m[1].gsub("-","/").sub("/","/set/")}"].present?
26
- end and
27
- is_in_mod? src_file,mod
25
+ Dir["mod/**/#{m[1].tr('-', '/').sub('/', '/set/')}"].present?
26
+ end) &&
27
+ is_in_mod?(src_file, mod)
28
28
  )
29
29
  end
30
30
  end
31
31
 
32
32
  add_group 'Sets' do |src_file|
33
- src_file.filename =~ /tmp\/set\// and
34
- /\d+-(.+\.rb)/.match(src_file.filename) { |m| Dir["mod/**/#{m[1]}"].present? }
33
+ src_file.filename =~ /tmp\/set\// &&
34
+ /\d+-(.+\.rb)/.match(src_file.filename) { |m| Dir["mod/**/#{m[1]}"].present? }
35
35
  end
36
36
  add_group 'Set patterns' do |src_file|
37
- src_file.filename =~ /tmp\/set_pattern\// and
38
- /\d+-(.+\.rb)/.match(src_file.filename) { |m| Dir["mod/**/#{m[1]}"].present? }
37
+ src_file.filename =~ /tmp\/set_pattern\// &&
38
+ /\d+-(.+\.rb)/.match(src_file.filename) { |m| Dir["mod/**/#{m[1]}"].present? }
39
39
  end
40
40
  add_group 'Formats' do |src_file|
41
41
  src_file.filename =~ /mod\/[^\/]+\/formats/
@@ -49,8 +49,8 @@ def card_core_dev_simplecov_filters
49
49
  filters.clear # This will remove the :root_filter that comes via simplecov's defaults
50
50
  add_filter do |src|
51
51
  !(src.filename =~ /^#{SimpleCov.root}/) unless src.filename =~ /card/
52
- end
53
-
52
+ end
53
+
54
54
  add_filter '/spec/'
55
55
  add_filter '/features/'
56
56
  add_filter '/config/'
@@ -58,7 +58,7 @@ def card_core_dev_simplecov_filters
58
58
  add_filter '/generators/'
59
59
  add_filter 'lib/card'
60
60
 
61
- add_group 'Card', 'lib/card'
61
+ add_group 'Card', 'lib/card'
62
62
  add_group 'Set Patterns', 'tmp/set_pattern/'
63
63
  add_group 'Sets', 'tmp/set/'
64
64
  add_group 'Formats' do |src_file|
@@ -11,8 +11,7 @@ module Card::SpecHelper
11
11
  # warn "(ath)login_as #{user.inspect}, #{Card::Auth.current_id}, #{@request.session[:user]}"
12
12
  end
13
13
 
14
- def newcard name, content=''
15
- #FIXME - misleading name; sounds like it doesn't save.
14
+ def create! name, content=''
16
15
  Card.create! name: name, content: content
17
16
  end
18
17
 
@@ -27,7 +26,7 @@ module Card::SpecHelper
27
26
 
28
27
  def debug_assert_view_select view_html, *args, &block
29
28
  Rails.logger.rspec %(
30
- #{CodeRay.scan(Nokogiri::XML(view_html, &:noblanks).to_s, :html).div}
29
+ #{CodeRay.scan(Nokogiri::XML(view_html, &:noblanks).to_s, :html).div}
31
30
  <style>
32
31
  .CodeRay {
33
32
  background-color: #FFF;
@@ -75,19 +74,27 @@ module Card::SpecHelper
75
74
  end
76
75
 
77
76
  # Make expectations in the event phase.
78
- # Takes the usual event options :on and :before/:after/:around
79
- # and registers the event_block with these options as an event.
77
+ # Takes a stage and registers the event_block in this stage as an event.
80
78
  # Unknown methods in the event_block are executed in the rspec context
81
79
  # instead of the card's context.
82
- # An additionaly :trigger block in opts is expected that is called
80
+ # An additionally :trigger block in opts is expected that is called
83
81
  # to start the event phase.
82
+ # Other event options like :on or :when are not supported yet.
84
83
  # Example:
85
- # in_phase before: :approve, on: :save,
84
+ # in_stage :initialize,
86
85
  # trigger: ->{ test_card.update_attributes! content: '' } do
87
86
  # expect(item_names).to eq []
88
87
  # end
89
- def in_phase opts, &event_block
88
+ def in_stage stage, opts={}, &event_block
89
+ stage_sym = :"#{stage}_stage"
90
90
  $rspec_binding = binding
91
+ add_test_event stage_sym, :in_stage_test, &event_block
92
+ opts[:trigger].call
93
+ ensure
94
+ remove_test_event stage_sym, :in_stage_test
95
+ end
96
+
97
+ def add_test_event stage, name, &event_block
91
98
  Card.class_eval do
92
99
  def method_missing m, *args
93
100
  begin
@@ -102,16 +109,33 @@ module Card::SpecHelper
102
109
  rescue NameError
103
110
  end
104
111
  super
105
- # raise NoMethodError
112
+ # raise NoMethodError
106
113
  end
107
- define_method :in_phase_test, event_block
114
+
115
+ define_method name, event_block
108
116
  end
109
- Card.define_callbacks :in_phase_test
110
- kind = ([:before, :after, :around] & opts.keys).first
111
- name = opts.delete(kind)
112
- Card.set_callback name, kind, :in_phase_test, prepend: true
113
- opts[:trigger].call
117
+ Card.define_callbacks name
118
+ Card.set_callback stage, :before, name, prepend: true
119
+ end
120
+
121
+ def remove_test_event stage, name
122
+ Card.skip_callback stage, :before, name
123
+ end
124
+
125
+ def test_event stage, _opts, &block
126
+ event_name = :"test_event_#{@events.size}"
127
+ stage_sym = :"#{stage}_stage"
128
+ @events << [stage_sym, event_name]
129
+ add_test_event stage_sym, event_name, &block
130
+ end
131
+
132
+ def with_test_events
133
+ @events = []
134
+ $rspec_binding = binding
135
+ yield
114
136
  ensure
115
- Card.skip_callback name, kind, :in_phase_test
137
+ @events.each do |stage, name|
138
+ remove_test_event stage, name
139
+ end
116
140
  end
117
141
  end