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
@@ -1,4 +1,5 @@
1
- # the events method is a developer's tool for visualizing the event order for a given card.
1
+ # the events method is a developer's tool for visualizing the event order
2
+ # for a given card.
2
3
  # For example, from a console you might run
3
4
  #
4
5
  # puts mycard.events :update
@@ -7,17 +8,17 @@
7
8
  # The indention and arrows (^v) indicate event dependencies.
8
9
  #
9
10
  # Note: as of yet, the functionality is a bit rough. It does not display events
10
- # that are called directly from within other events (like :stored), and certain event
11
- # requirements (like the presence of a "current_act") may prevent events from showing
12
- # up in the tree.
11
+ # that are called directly from within other events,
12
+ # and certain event requirements (like the presence of a 'current_act') may
13
+ # prevent events from showing up in the tree.
13
14
  def events action
14
15
  @action = action
15
- events = [ events_tree(:validation), events_tree(:save) ]
16
+ events = [events_tree(:validation), events_tree(:save)]
16
17
  @action = nil
17
18
  puts_events events
18
19
  end
19
20
 
20
- #private
21
+ # private
21
22
 
22
23
  def puts_events events, prefix='', depth=0
23
24
  r = ''
@@ -25,45 +26,31 @@ def puts_events events, prefix='', depth=0
25
26
  events.each do |e|
26
27
  space = ' ' * (depth * 2)
27
28
 
28
- #FIXME - this is not right. before and around callbacks are processed in declaration order regardless of kind.
29
- # not all befores then all arounds
30
-
31
- if e[:before]
32
- r += puts_events( e[:before], space+'v ', depth)
33
- end
34
- if e[:around]
35
- r += puts_events( e[:around], space+'vv ', depth )
36
- end
37
-
38
-
39
- output = "#{prefix}#{e[:name]}"
40
- #warn output
41
- r+= "#{output}\n"
42
-
43
- if e[:after]
44
- r += puts_events( e[:after ].reverse, space+'^ ', depth )
45
- end
29
+ # FIXME: this is not right. before and around callbacks are processed in
30
+ # declaration order regardless of kind. not all befores then all arounds
31
+ e[:before] && r += puts_events(e[:before], space + 'v ', depth)
32
+ e[:around] && r += puts_events(e[:around], space + 'vv ', depth)
33
+ r += "#{prefix}#{e[:name]}\n"
34
+ e[:after] && r += puts_events(e[:after].reverse, space + '^ ', depth)
46
35
  end
47
36
  r
48
37
  end
49
38
 
50
39
  def events_tree filt
51
- hash = {name: filt }
40
+ hash = { name: filt }
52
41
  if respond_to? "_#{filt}_callbacks"
53
- send( "_#{filt}_callbacks" ).each do |callback|
42
+ send("_#{filt}_callbacks").each do |callback|
54
43
  next unless callback.applies? self
55
44
  hash[callback.kind] ||= []
56
- hash[callback.kind] << events_tree( callback.filter )
45
+ hash[callback.kind] << events_tree(callback.filter)
57
46
  end
58
47
  end
59
48
 
60
49
  hash
61
50
  end
62
51
 
63
-
64
52
  class ::ActiveSupport::Callbacks::Callback
65
53
  def applies? object
66
54
  conditions_lambdas.all? { |c| c.call(object, nil) }
67
55
  end
68
56
  end
69
-
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  format do
4
2
  # link is called by web_link, card_link, and view_link
5
3
  # (and is overridden in other formats)
@@ -35,15 +33,19 @@ format do
35
33
  text = opts.delete(:text) || href
36
34
  new_class =
37
35
  case href
38
- when /^https?\:/ then 'external-link'
39
- when /^mailto\:/ then 'email-link'
40
- when /^([a-zA-Z][\-+\.a-zA-Z\d]*):/ then $1 + '-link'
36
+ when /^https?\:/
37
+ opts[:target] = '_blank'
38
+ 'external-link'
39
+ when /^mailto\:/
40
+ 'email-link'
41
+ when /^([a-zA-Z][\-+\.a-zA-Z\d]*):/
42
+ Regexp.last_match(1) + '-link'
41
43
  when /^\//
42
- (href = internal_url href[1..-1]) ; 'internal-link'
44
+ href = internal_url href[1..-1]
45
+ 'internal-link'
43
46
  else
44
47
  return card_link href, opts
45
48
  end
46
- opts[:target] = "_blank" if new_class == 'external-link'
47
49
  add_class opts, new_class
48
50
  link_to text, href, opts
49
51
  end
@@ -69,7 +71,7 @@ format do
69
71
  # link to a specific view (defaults to current card)
70
72
  # this is generally used for ajax calls
71
73
  def view_link text, view, opts={}
72
- path_opts = opts.delete( :path_opts ) || {}
74
+ path_opts = opts.delete(:path_opts) || {}
73
75
  path_opts[:view] = view unless view == :home
74
76
  opts[:remote] = true
75
77
  opts[:rel] = 'nofollow'
@@ -84,41 +86,34 @@ format do
84
86
  when Card then name_or_card.cardname
85
87
  else name_or_card
86
88
  end
87
- opts[:path_opts] ||= {view: :related}
88
- opts[:path_opts][:related] = {name: "+#{name}"}
89
- opts[:path_opts][:related].merge! opts[:related_opts] if opts[:related_opts]
90
- view_link( opts[:text] || name, :related, opts)
89
+ opts[:path_opts] ||= { view: :related }
90
+ opts[:path_opts][:related] = { name: "+#{name}" }
91
+ opts[:path_opts][:related].merge! opts[:related_opts] if opts[:related_opts]
92
+ view_link(opts[:text] || name, :related, opts)
91
93
  end
92
94
 
93
-
94
-
95
95
  def path opts={}
96
- if opts[:action] == :new && opts[:type] && !(opts[:name] || opts[:card] || opts[:id])
96
+ if opts[:action] == :new && opts[:type] &&
97
+ !(opts[:name] || opts[:card] || opts[:id])
97
98
  opts.delete(:action)
98
99
  base = "new/#{opts.delete(:type)}"
99
100
  else
100
101
  name = opts.delete(:name) || card.name
101
- base = opts[:action] ? "card/#{ opts.delete :action }/" : ''
102
+ base = opts[:action] ? "card/#{opts.delete :action}/" : ''
102
103
 
103
104
  opts[:no_id] = true if [:new, :create].member? opts[:action]
104
- #generalize. dislike hardcoding views/actions here
105
+ # generalize. dislike hardcoding views/actions here
105
106
 
106
107
  linkname = name.to_name.url_key
107
108
  unless name.empty? || opts.delete(:no_id)
108
- base += ( opts[:id] ? "~#{ opts.delete :id }" : linkname )
109
+ base += (opts[:id] ? "~#{opts.delete :id}" : linkname)
109
110
  end
110
111
 
111
- opts[:card] ||= {}
112
- opts[:card][:name] = name if opts.delete(:known)==false && name.present? && name.to_s != linkname
113
-
114
- if type = opts.delete(:type) and Card.known?( type )
115
- opts[:card][:type] = type
116
- end
117
- opts.delete(:card) if opts[:card].empty?
112
+ process_path_card_opts opts, name, linkname
118
113
  end
119
114
 
120
115
  query = opts.empty? ? '' : "?#{opts.to_param}"
121
- internal_url( base + query )
116
+ internal_url(base + query)
122
117
  end
123
118
 
124
119
  def internal_url relative_path
@@ -126,32 +121,38 @@ format do
126
121
  end
127
122
 
128
123
  def interpret_href href
129
- Hash===href ? path(href) : href
124
+ href.is_a?(Hash) ? path(href) : href
130
125
  end
131
126
 
127
+ def process_path_card_opts opts, name, linkname
128
+ opts[:card] ||= {}
129
+ if opts.delete(:known) == false && name.present? && name.to_s != linkname
130
+ opts[:card][:name] = name
131
+ end
132
+
133
+ if (type = opts.delete(:type)) && Card.known?(type)
134
+ opts[:card][:type] = type
135
+ end
136
+ opts.delete(:card) if opts[:card].empty?
137
+ end
132
138
  end
133
139
 
134
140
  format :html do
135
-
136
-
137
141
  def link_to text, href, opts={}
138
142
  href = interpret_href href
139
143
 
140
144
  [:remote, :method].each do |key|
141
- if val = opts.delete(key)
145
+ if (val = opts.delete(key))
142
146
  opts["data-#{key}"] = val
143
147
  end
144
148
  end
145
149
 
146
150
  content_tag :a, raw(text), opts.merge(href: href)
147
151
  end
148
-
149
152
  end
150
153
 
151
-
152
154
  format :css do
153
- def link_to text, href, opts={}
155
+ def link_to _text, href, _opts={}
154
156
  interpret_href href
155
157
  end
156
-
157
158
  end
@@ -1,6 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
-
4
3
  def list_fields
5
4
  Card.search({ left: name, type_id: Card::ListID }, 'list fields')
6
5
  end
@@ -14,8 +13,8 @@ def linker_lists
14
13
  "lists that link to #{name}")
15
14
  end
16
15
 
17
- event :trunk_cardtype_of_a_list_relation_changed,
18
- changed: :type, after: :store, on: :update,
16
+ event :trunk_cardtype_of_a_list_relation_changed, :finalize,
17
+ changed: :type, on: :update,
19
18
  when: proc { Codename[:list] } do
20
19
  type_key_was = (tk = Card.quick_fetch(type_id_was)) && tk.key
21
20
 
@@ -26,8 +25,8 @@ event :trunk_cardtype_of_a_list_relation_changed,
26
25
  listed_by_fields.each &:update_cached_list
27
26
  end
28
27
 
29
- event :trunk_name_of_a_list_relation_changed,
30
- changed: :name, after: :store, on: :update,
28
+ event :trunk_name_of_a_list_relation_changed, :finalize,
29
+ changed: :name, on: :update,
31
30
  when: proc { Codename[:list] } do
32
31
  list_fields.each do |card|
33
32
  card.update_listed_by_cache_for card.item_keys
@@ -35,14 +34,13 @@ event :trunk_name_of_a_list_relation_changed,
35
34
  listed_by_fields.each &:update_cached_list
36
35
  end
37
36
 
38
- event :cardtype_of_list_item_changed,
39
- changed: :type, before: :approve, on: :save,
37
+ event :cardtype_of_list_item_changed, :validate,
38
+ changed: :type, on: :save,
40
39
  when: proc { Codename[:list] } do
41
40
  linker_lists.each do |card|
42
- if card.item_type_id != type_id
43
- errors.add(:type,
44
- "can't be changed because #{name} " \
45
- "is referenced by list card #{card.name}")
46
- end
41
+ next unless card.item_type_id != type_id
42
+ errors.add(:type,
43
+ "can't be changed because #{name} " \
44
+ "is referenced by list card #{card.name}")
47
45
  end
48
46
  end
@@ -5,12 +5,12 @@ end
5
5
  format :html do
6
6
  def show view, args
7
7
  if show_layout?
8
- args.merge! view: view if view
8
+ args[:view] = view if view
9
9
  @main_opts = args
10
10
  render :layout
11
11
  else
12
12
  view ||= args[:home_view] || :open
13
- @inclusion_opts = (args[:items] || {}).clone
13
+ @nest_opts = (args[:items] || {}).clone
14
14
  render view, args
15
15
  end
16
16
  end
@@ -42,7 +42,7 @@ format :html do
42
42
  [
43
43
  _optional_render(:menu, args, :hide),
44
44
  _render_core(args)
45
- ] * "\n"
45
+ ].join("\n")
46
46
  end
47
47
  end
48
48
  end
@@ -86,9 +86,9 @@ format :html do
86
86
  end
87
87
 
88
88
  view :type_info do
89
- link_args = { text: "#{card.type_name}", class: 'navbar-link' }
89
+ link_args = { text: card.type_name.to_s, class: 'navbar-link' }
90
90
  link = card_link card.type_name, link_args
91
- %{<span class="type-info pull-right">#{link}</span>}.html_safe
91
+ %(<span class="type-info pull-right">#{link}</span>).html_safe
92
92
  end
93
93
 
94
94
  view :title_editable do |args|
@@ -179,7 +179,7 @@ format :html do
179
179
  Card.fetch rcardname, new: {}
180
180
  end
181
181
 
182
- subheader = with_name_context(card.name) do
182
+ subheader = with_name_context(card.name) do
183
183
  subformat(rcard)._render_title(args)
184
184
  end
185
185
  add_name_context card.name
@@ -206,17 +206,17 @@ format :html do
206
206
  setting = card.new_card? ? [:add_help, { fallback: :help }] : :help
207
207
  help_card = card.rule_card(*setting)
208
208
  if help_card && help_card.ok?(:read)
209
- with_inclusion_mode :normal do
209
+ with_nest_mode :normal do
210
210
  raw_help_content = _render_raw args.merge(structure: help_card.name)
211
211
  process_content raw_help_content, content_opts:
212
212
  { chunk_list: :references }
213
213
  # render help card with current card's format
214
- # so current card's context is used in help card inclusions
214
+ # so current card's context is used in help card nests
215
215
  end
216
216
  end
217
217
  end
218
218
  klass = [args[:help_class], 'help-text'].compact * ' '
219
- %{<div class="#{klass}">#{raw text}</div>} if text
219
+ %(<div class="#{klass}">#{raw text}</div>) if text
220
220
  end
221
221
 
222
222
  view :last_action do
@@ -236,19 +236,19 @@ format :html do
236
236
  )
237
237
  end
238
238
 
239
- %{
239
+ %(
240
240
  <span class="last-update">
241
241
  #{action_verb} #{_render_acted_at} ago by
242
242
  #{subformat(card.last_actor)._render_link}
243
243
  </span>
244
- }
244
+ )
245
245
  end
246
246
 
247
247
  private
248
248
 
249
249
  def fancy_title title=nil, title_class=nil
250
250
  klasses = ['card-title', title_class].compact * ' '
251
- title = showname(title).to_name.parts.join %{<span class="joint">+</span>}
252
- raw %{<span class="#{klasses}">#{title}</span>}
251
+ title = showname(title).to_name.parts.join %(<span class="joint">+</span>)
252
+ raw %(<span class="#{klasses}">#{title}</span>)
253
253
  end
254
254
  end
@@ -85,12 +85,12 @@ format :html do
85
85
  args[:optional_help] ||= :show
86
86
  args[:optional_toolbar] ||= :show
87
87
 
88
- args[:buttons] ||= %{
88
+ args[:buttons] ||= %(
89
89
  #{submit_button class: 'submit-button'}
90
90
  #{cancel_button href: (args[:cancel_path] || path),
91
91
  class: 'cancel-button',
92
92
  'data-slot-selector' => args[:cancel_slot_selector]}
93
- }
93
+ )
94
94
  end
95
95
 
96
96
  view :edit_name, perms: :update do |args|
@@ -127,7 +127,7 @@ format :html do
127
127
  effects << "affect at least #{count} #{refs} to \"#{card.name}\""
128
128
  options = 'You may choose to <em>update or ignore</em> the referers.'
129
129
  end
130
- effects = effects.map { |effect| "<li>#{effect}</li>" }
130
+ effects = effects.map { |effect| "<li>#{effect}</li>" }.join('')
131
131
  "<h6>This change will...</h6><ul>#{effects}</ul><p>#{options}</p>"
132
132
  end
133
133
 
@@ -213,7 +213,7 @@ format :html do
213
213
 
214
214
  view :edit_nests do |args|
215
215
  frame args do
216
- with_inclusion_mode :edit do
216
+ with_nest_mode :edit do
217
217
  process_relative_tags optional_toolbar: :hide
218
218
  end
219
219
  end
@@ -225,7 +225,7 @@ format :html do
225
225
  view :edit_nest_rules do |args|
226
226
  view = args[:rule_view] || :field_related_rules
227
227
  frame args do
228
- # with_inclusion_mode :edit do
228
+ # with_nest_mode :edit do
229
229
  nested_fields(args).map do |chunk|
230
230
  nest Card.fetch("#{chunk.referee_name}+*self"),
231
231
  view: :titled, title: chunk.referee_name, rule_view: view,
@@ -46,10 +46,10 @@ format :html do
46
46
  hidden_args = opts.delete :hidden
47
47
  form_for card, card_form_opts(action, opts) do |form|
48
48
  @form = form
49
- %{
49
+ %(
50
50
  #{hidden_tags hidden_args if hidden_args}
51
51
  #{yield form}
52
- }
52
+ )
53
53
  end
54
54
  end
55
55
 
@@ -98,13 +98,13 @@ format :html do
98
98
 
99
99
  def formgroup title, content, opts={}
100
100
  wrap_with :div, formgroup_div_args(opts[:class]) do
101
- %{
101
+ %(
102
102
  <label>#{title}</label>
103
103
  <div>
104
104
  #{editor_wrap(opts[:editor]) { content }}
105
105
  #{formgroup_help_text opts[:help]}
106
106
  </div>
107
- }
107
+ )
108
108
  end
109
109
  end
110
110
 
@@ -128,16 +128,15 @@ format :html do
128
128
  hash ||= {}
129
129
  hash.each do |key, val|
130
130
  result += if Hash === val
131
- hidden_tags val, key
132
- else
133
- name = base ? "#{base}[#{key}]" : key
131
+ hidden_tags val, key
132
+ else
133
+ name = base ? "#{base}[#{key}]" : key
134
134
  hidden_field_tag name, val
135
135
  end
136
136
  end
137
137
  result
138
138
  end
139
139
 
140
-
141
140
  # FIELDSET VIEWS
142
141
 
143
142
  view :name_formgroup do |args|
@@ -145,25 +144,24 @@ format :html do
145
144
  end
146
145
 
147
146
  view :type_formgroup do |args|
148
- field = if args[:variety] == :edit #FIXME dislike this api -ef
149
- type_field class: 'type-field edit-type-field'
150
- else
151
- type_field class: "type-field live-type-field", href: path(view: :new), 'data-remote'=>true
147
+ field = if args[:variety] == :edit # FIXME: dislike this api -ef
148
+ type_field class: 'type-field edit-type-field'
149
+ else
150
+ type_field class: 'type-field live-type-field', href: path(view: :new), 'data-remote' => true
152
151
  end
153
152
  formgroup 'type', field, editor: 'type', class: 'type-formgroup'
154
153
  end
155
154
 
156
-
157
155
  view :button_formgroup do |args|
158
- %{<div class="form-group"><div>#{ args[:buttons] }</div></div>}
156
+ %(<div class="form-group"><div>#{args[:buttons]}</div></div>)
159
157
  end
160
158
 
161
159
  view :content_formgroup do |args|
162
- raw %{
160
+ raw %(
163
161
  <fieldset class="card-editor editor">
164
- #{ edit_slot args }
162
+ #{edit_slot args}
165
163
  </fieldset>
166
- }
164
+ )
167
165
  end
168
166
 
169
167
  def name_field form=nil, options={}
@@ -202,10 +200,10 @@ format :html do
202
200
  # hidden_field_tag 'card[last_action_id_before_edit]',
203
201
  # card.last_action_id, class: 'current_revision_id'
204
202
  end
205
- %{
203
+ %(
206
204
  #{revision_tracking}
207
205
  #{_render_editor options}
208
- }
206
+ )
209
207
  end
210
208
 
211
209
  # FIELD VIEWS
@@ -218,12 +216,10 @@ format :html do
218
216
  view :edit_in_form, perms: :update, tags: :unknown_ok do |args|
219
217
  eform = form_for_multi
220
218
  content = content_field eform, args.merge(nested: true)
221
- if card.new_card?
222
- content += raw("\n #{ eform.hidden_field :type_id }")
223
- end
219
+ content += raw("\n #{eform.hidden_field :type_id}") if card.new_card?
224
220
  opts = { editor: 'content', help: true, class: 'card-editor' }
225
221
  if card.cardname.junction?
226
- opts[:class] += " RIGHT-#{ card.cardname.tag_name.safe_key }"
222
+ opts[:class] += " RIGHT-#{card.cardname.tag_name.safe_key}"
227
223
  end
228
224
  formgroup fancy_title(args[:title]), content, opts
229
225
  end
@@ -238,12 +234,12 @@ format :html do
238
234
  # form helpers
239
235
 
240
236
  FIELD_HELPERS =
241
- %w{
237
+ %w(
242
238
  hidden_field color_field date_field datetime_field datetime_local_field
243
239
  email_field month_field number_field password_field phone_field
244
240
  range_field search_field telephone_field text_area text_field time_field
245
241
  url_field week_field file_field
246
- }
242
+ ).freeze
247
243
 
248
244
  FIELD_HELPERS.each do |method_name|
249
245
  define_method(method_name) do |name, options={}|
@@ -251,7 +247,7 @@ format :html do
251
247
  end
252
248
  end
253
249
 
254
- def check_box method, options={}, checked_value = '1', unchecked_value = '0'
250
+ def check_box method, options={}, checked_value='1', unchecked_value='0'
255
251
  form.check_box method, options, checked_value, unchecked_value
256
252
  end
257
253