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,183 @@
1
+ class Card
2
+ class Format
3
+ module Nest
4
+ def subformat subcard
5
+ subcard = Card.fetch(subcard, new: {}) if subcard.is_a?(String)
6
+ self.class.new subcard,
7
+ parent: self, depth: @depth + 1, root: @root,
8
+ # FIXME: - the following four should not be hard-coded
9
+ # here. need a generalized mechanism
10
+ # for attribute inheritance
11
+ context_names: @context_names, mode: @mode,
12
+ mainline: @mainline, form: @form
13
+ end
14
+
15
+ def with_nest_mode mode
16
+ if (switch_mode = INCLUSION_MODES[mode]) && @mode != switch_mode
17
+ old_mode = @mode
18
+ @mode = switch_mode
19
+ @nest_defaults = nil
20
+ end
21
+ result = yield
22
+ if old_mode
23
+ @nest_defaults = nil
24
+ @mode = old_mode
25
+ end
26
+ result
27
+ end
28
+
29
+ def prepare_nest opts
30
+ @char_count ||= 0
31
+ opts ||= {}
32
+
33
+ case
34
+ when opts.key?(:comment)
35
+ # commented nest
36
+ opts[:comment]
37
+ when @mode == :closed && @char_count > Card.config.max_char_count
38
+ # move on; content out of view
39
+ ''
40
+ when opts[:inc_name] == '_main' && show_layout? && @depth == 0
41
+ # the main card within a layout
42
+ expand_main opts
43
+ else
44
+ # standard nest
45
+ result = nest fetch_nested_card(opts), opts
46
+ @char_count += result.length if @mode == :closed && result
47
+ result
48
+ end
49
+ end
50
+
51
+ def nest nested_card, opts={}
52
+ # ActiveSupport::Notifications.instrument('card', message:
53
+ # "nest: #{nested_card.name}, #{opts}") do
54
+ opts.delete_if { |_k, v| v.nil? }
55
+ opts.reverse_merge! nest_defaults(nested_card)
56
+
57
+ sub = nil
58
+ if opts[:inc_name] =~ /^_(self)?$/
59
+ sub = self
60
+ else
61
+ sub = subformat nested_card
62
+ sub.nest_opts = opts[:items] ? opts[:items].clone : {}
63
+ end
64
+
65
+ view = canonicalize_view opts.delete :view
66
+ opts[:home_view] = [:closed, :edit].member?(view) ? :open : view
67
+ # FIXME: special views should be represented in view definitions
68
+
69
+ view =
70
+ case @mode
71
+ when :edit then
72
+ view_in_edit_mode(view, nested_card)
73
+ when :template then
74
+ :template_rule
75
+ when :closed then
76
+ view_in_closed_mode(view, nested_card)
77
+ else
78
+ view
79
+ end
80
+
81
+ sub.optional_render view, opts
82
+ # end
83
+ end
84
+
85
+ def get_nest_content cardname
86
+ content = params[cardname.to_s.tr('+', '_')]
87
+
88
+ # CLEANME This is a hack so plus cards re-populate on failed signups
89
+ p = params['subcards']
90
+ if p && (card_params = p[cardname.to_s])
91
+ content = card_params['content']
92
+ end
93
+ content if content.present? # returns nil for empty string
94
+ end
95
+
96
+ def fetch_nested_card options
97
+ Card.fetch options[:inc_name], new: nest_new_args(options)
98
+ end
99
+
100
+ def nest_new_args options
101
+ args = { name: options[:inc_name], type: options[:type], supercard: card }
102
+ args.delete(:supercard) if options[:inc_name].strip.blank?
103
+ # special case. gets absolutized incorrectly. fix in smartname?
104
+ if options[:inc_name] =~ /^_main\+/
105
+ # FIXME: this is a rather hacky (and untested) way to get @superleft
106
+ # to work on new cards named _main+whatever
107
+ args[:name] = args[:name].gsub(/^_main\+/, '+')
108
+ args[:supercard] = root.card
109
+ end
110
+ if (content = get_nest_content options[:inc_name])
111
+ args[:content] = content
112
+ end
113
+ args
114
+ end
115
+
116
+ def wrap_main content
117
+ content # no wrapping in base format
118
+ end
119
+
120
+ def nest_defaults nested_card
121
+ @nest_defaults ||= begin
122
+ defaults = get_nest_defaults(nested_card).clone
123
+ defaults.merge! @nest_opts if @nest_opts
124
+ defaults
125
+ end
126
+ end
127
+
128
+ def get_nest_defaults _nested_card
129
+ { view: :name }
130
+ end
131
+
132
+ protected
133
+
134
+ def expand_main opts
135
+ opts.merge! root.main_opts if root.main_opts
136
+ legacy_main_opts_tweaks! opts
137
+
138
+ with_nest_mode :normal do
139
+ @mainline = true
140
+ result = wrap_main nest(root.card, opts)
141
+ @mainline = false
142
+ result
143
+ end
144
+ end
145
+
146
+ def legacy_main_opts_tweaks! opts
147
+ if (val = params[:size]) && val.present?
148
+ opts[:size] = val.to_sym
149
+ end
150
+
151
+ if (val = params[:item]) && val.present?
152
+ opts[:items] = (opts[:items] || {}).reverse_merge view: val.to_sym
153
+ end
154
+ end
155
+
156
+ def view_in_edit_mode homeview, nested_card
157
+ not_in_form =
158
+ Card::Format.perms[homeview] == :none || # view configured not to keep
159
+ # in form
160
+ nested_card.structure || # not yet nesting structures
161
+ nested_card.key.blank? # eg {{_self|type}} on new cards
162
+
163
+ not_in_form ? :blank : :edit_in_form
164
+ end
165
+
166
+ def view_in_closed_mode homeview, nested_card
167
+ approved_view = Card::Format.closed[homeview]
168
+ case
169
+ when approved_view == true then
170
+ homeview
171
+ when Card::Format.error_code[homeview] then
172
+ homeview
173
+ when approved_view then
174
+ approved_view
175
+ when !nested_card.known? then
176
+ :closed_missing
177
+ else
178
+ :closed_content
179
+ end
180
+ end
181
+ end
182
+ end
183
+ end
@@ -0,0 +1,63 @@
1
+ class Card
2
+ class Format
3
+ module Permission
4
+ def ok_view view, args={}
5
+ return view if args.delete :skip_permissions
6
+ approved_view = approved_view view, args
7
+ args[:denied_view] = view if approved_view != view
8
+ if focal? && (error_code = Card::Format.error_code[approved_view])
9
+ root.error_status = error_code
10
+ end
11
+ approved_view
12
+ end
13
+
14
+ def approved_view view, args={}
15
+ case
16
+ when @depth >= Card.config.max_depth
17
+ # prevent recursion. @depth tracks subformats
18
+ :too_deep
19
+ when Card::Format.perms[view] == :none
20
+ # permission skipping specified in view definition
21
+ view
22
+ when args.delete(:skip_permissions)
23
+ # permission skipping specified in args
24
+ view
25
+ when !card.known? && !tagged(view, :unknown_ok)
26
+ # handle unknown cards (where view not exempt)
27
+ view_for_unknown view, args
28
+ else
29
+ # run explicit permission checks
30
+ permitted_view view, args
31
+ end
32
+ end
33
+
34
+ def permitted_view view, args
35
+ perms_required = Card::Format.perms[view] || :read
36
+ args[:denied_task] =
37
+ if perms_required.is_a? Proc
38
+ :read unless perms_required.call(self) # read isn't quite right
39
+ else
40
+ [perms_required].flatten.find { |task| !ok? task }
41
+ end
42
+
43
+ if args[:denied_task]
44
+ Card::Format.denial[view] || :denial
45
+ else
46
+ view
47
+ end
48
+ end
49
+
50
+ def view_for_unknown _view, _args
51
+ # note: overridden in HTML
52
+ focal? ? :not_found : :missing
53
+ end
54
+
55
+ def ok? task
56
+ task = :create if task == :update && card.new_card?
57
+ @ok ||= {}
58
+ @ok[task] = card.ok? task if @ok[task].nil?
59
+ @ok[task]
60
+ end
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,140 @@
1
+ class Card
2
+ class Format
3
+ module Render
4
+ def page view, slot_opts
5
+ @card.run_callbacks :show_page do
6
+ show view, slot_opts
7
+ end
8
+ end
9
+
10
+ def render view, args={}
11
+ view = canonicalize_view view
12
+ return if hidden_view? view, args
13
+ view = ok_view view, args
14
+ current_view(view) do
15
+ args = default_render_args view, args
16
+ with_nest_mode view do
17
+ Card::ViewCache.fetch(self, view, args) do
18
+ method = view_method view, args
19
+ method.arity == 0 ? method.call : method.call(args)
20
+ end
21
+ end
22
+ end
23
+ rescue => e
24
+ rescue_view e, view
25
+ end
26
+
27
+ def view_method view, args
28
+ method "_view_#{view}"
29
+ rescue
30
+ args[:unsupported_view] = view
31
+ method '_view_unsupported_view'
32
+ end
33
+
34
+ def canonicalize_view view
35
+ return if view.blank?
36
+ view_key = view.to_viewname.key.to_sym
37
+ DEPRECATED_VIEWS[view_key] || view_key
38
+ end
39
+
40
+ def default_item_view
41
+ :name
42
+ end
43
+
44
+ def hidden_view? view, args
45
+ args.delete(:optional) && !show_view?(view, args)
46
+ end
47
+
48
+ def show_view? view, args
49
+ default = args.delete(:default_visibility) || :show # FIXME: - ugly
50
+ api_option = args["optional_#{view}".to_sym]
51
+ case api_option
52
+ # permanent visibility specified in code
53
+ when :always then true
54
+ when :never then false
55
+ else
56
+ # wagneer can override code settings
57
+ contextual_setting = nest_arg_visibility(view, args) || api_option
58
+ case contextual_setting
59
+ when :show then true
60
+ when :hide then false
61
+ else
62
+ default == :show
63
+ end
64
+ end
65
+ end
66
+
67
+ def nest_arg_visibility view, args
68
+ [:show, :hide].each do |setting|
69
+ return setting if parse_view_visibility(args[setting]).member?(view)
70
+ end
71
+ false
72
+ end
73
+
74
+ def parse_view_visibility val
75
+ case val
76
+ when NilClass then
77
+ []
78
+ when Array then
79
+ val
80
+ when String then
81
+ val.split(/[\s,]+/)
82
+ else
83
+ raise Card::Error, "bad show/hide argument: #{val}"
84
+ end.map { |view| canonicalize_view view }
85
+ end
86
+
87
+ def default_render_args view, a=nil
88
+ args =
89
+ case a
90
+ when nil then
91
+ {}
92
+ when Hash then
93
+ a.clone
94
+ when Array then
95
+ a[0].merge a[1]
96
+ else
97
+ raise Card::Error, "bad render args: #{a}"
98
+ end
99
+
100
+ default_method = "default_#{view}_args"
101
+ send default_method, args if respond_to?(default_method)
102
+ args
103
+ end
104
+
105
+ def rescue_view e, view
106
+ raise e if Rails.env =~ /^cucumber|test$/
107
+ Rails.logger.info "\nError rendering #{error_cardname} / #{view}: "\
108
+ "#{e.class} : #{e.message}"
109
+ Card::Error.current = e
110
+ card.notable_exception_raised
111
+ raise e if (debug = Card[:debugger]) && debug.content == 'on'
112
+ rendering_error e, view
113
+ end
114
+
115
+ def current_view view
116
+ old_view = @current_view
117
+ @current_view = view
118
+ yield
119
+ ensure
120
+ @current_view = old_view
121
+ end
122
+
123
+ def error_cardname
124
+ card && card.name.present? ? card.name : 'unknown card'
125
+ end
126
+
127
+ def rendering_error _exception, view
128
+ "Error rendering: #{error_cardname} (#{view} view)"
129
+ end
130
+
131
+ def add_class options, klass
132
+ options[:class] = [options[:class], klass].flatten.compact * ' '
133
+ end
134
+
135
+ def unique_id
136
+ "#{card.key}-#{Time.now.to_i}-#{rand(3)}"
137
+ end
138
+ end
139
+ end
140
+ end
data/lib/card/loader.rb CHANGED
@@ -21,9 +21,7 @@ class Card
21
21
  load_formats
22
22
  load_sets
23
23
 
24
- if ENV['RAILS_ENV'] == 'development'
25
- update_machine_output_hack
26
- end
24
+ update_machine_output_hack if ENV['RAILS_ENV'] == 'development'
27
25
  end
28
26
 
29
27
  def update_machine_output_hack
@@ -51,7 +49,7 @@ class Card
51
49
  return unless (mtime_output = style.machine_output_card.updated_at)
52
50
  style.machine_input_card.item_cards.each do |i_card|
53
51
  next unless i_card.codename
54
- ['03_machines', '06_bootstrap'].each do |mod|
52
+ %w(03_machines 06_bootstrap).each do |mod|
55
53
  style_dir = "#{Cardio.gem_root}/mod/#{mod}/lib/stylesheets"
56
54
  file_path = "#{style_dir}/#{i_card.codename}.scss"
57
55
  next unless File.exist? file_path
@@ -73,11 +71,11 @@ class Card
73
71
  def load_layouts
74
72
  mod_dirs.inject({}) do |hash, mod|
75
73
  dirname = "#{mod}/layout"
76
- if File.exists? dirname
74
+ if File.exist? dirname
77
75
  Dir.foreach(dirname) do |filename|
78
76
  next if filename =~ /^\./
79
77
  hash[filename.gsub /\.html$/, ''] =
80
- File.read([dirname, filename] * '/')
78
+ File.read([dirname, filename].join('/'))
81
79
  end
82
80
  end
83
81
  hash
@@ -97,9 +95,7 @@ class Card
97
95
  private
98
96
 
99
97
  def load_set_patterns
100
- if rewrite_tmp_files?
101
- generate_set_pattern_tmp_files
102
- end
98
+ generate_set_pattern_tmp_files if rewrite_tmp_files?
103
99
  load_dir "#{Card.paths['tmp/set_pattern'].first}/*.rb"
104
100
  end
105
101
 
@@ -108,15 +104,14 @@ class Card
108
104
  seq = 100
109
105
  mod_dirs.each do |mod|
110
106
  dirname = "#{mod}/set_pattern"
111
- if Dir.exists? dirname
112
- Dir.entries(dirname).sort.each do |filename|
113
- m = filename.match(/^(\d+_)?([^\.]*).rb/)
114
- key = m && m[2]
115
- next unless key
116
- filename = [dirname, filename] * '/'
117
- SetPattern.write_tmp_file key, filename, seq
118
- seq = seq + 1
119
- end
107
+ next unless Dir.exist? dirname
108
+ Dir.entries(dirname).sort.each do |filename|
109
+ m = filename.match(/^(\d+_)?([^\.]*).rb/)
110
+ key = m && m[2]
111
+ next unless key
112
+ filename = [dirname, filename].join('/')
113
+ SetPattern.write_tmp_file key, filename, seq
114
+ seq += 1
120
115
  end
121
116
  end
122
117
  end
@@ -146,19 +141,17 @@ class Card
146
141
  tmp_filename = "#{mod_tmp_dir}/#{rel_filename}"
147
142
  Set.write_tmp_file abs_filename, tmp_filename, rel_filename
148
143
  end
149
- seq = seq + 1
144
+ seq += 1
150
145
  end
151
146
  end
152
147
 
153
148
  def load_tmp_set_modules
154
149
  patterns = Card.set_patterns.reverse.map(&:pattern_code)
155
- .unshift 'abstract'
150
+ .unshift 'abstract'
156
151
  Dir.glob("#{Card.paths['tmp/set'].first}/*").sort.each do |tmp_mod|
157
152
  patterns.each do |pattern|
158
153
  pattern_dir = "#{tmp_mod}/#{pattern}"
159
- if Dir.exists? pattern_dir
160
- load_dir "#{pattern_dir}/**/*.rb"
161
- end
154
+ load_dir "#{pattern_dir}/**/*.rb" if Dir.exist? pattern_dir
162
155
  end
163
156
  end
164
157
  end
@@ -173,9 +166,7 @@ class Card
173
166
  def prepare_tmp_dir path
174
167
  return unless rewrite_tmp_files?
175
168
  p = Card.paths[path]
176
- if p.existent.first
177
- FileUtils.rm_rf p.first, secure: true
178
- end
169
+ FileUtils.rm_rf p.first, secure: true if p.existent.first
179
170
  Dir.mkdir p.first
180
171
  end
181
172