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
data/lib/card/location.rb CHANGED
@@ -7,19 +7,19 @@ class Card
7
7
 
8
8
  # TESTME
9
9
  def page_path title, opts={}
10
- Rails.logger.warn "Pass only Card::Name to page_path #{title.class}, #{title}" unless Card::Name===title
11
- format = opts[:format] ? ".#{opts.delete(:format)}" : ''
10
+ Rails.logger.warn "Pass only Card::Name to page_path #{title.class}, #{title}" unless Card::Name === title
11
+ format = opts[:format] ? ".#{opts.delete(:format)}" : ''
12
12
  action = opts[:action] ? "#{opts.delete(:action)}/" : ''
13
- query = opts.present? ? "?#{opts.to_param}" : ''
13
+ query = opts.present? ? "?#{opts.to_param}" : ''
14
14
  card_path "#{action}#{title.to_name.url_key}#{format}#{query}"
15
15
  end
16
16
 
17
17
  def card_path rel_path
18
- Rails.logger.warn "Pass only strings to card_path: #{rel_path.class}, #{rel_path}" unless String===rel_path
18
+ Rails.logger.warn "Pass only strings to card_path: #{rel_path.class}, #{rel_path}" unless String === rel_path
19
19
  if rel_path =~ /^\//
20
20
  rel_path
21
21
  else
22
- "#{ Card.config.relative_url_root }/#{ rel_path }"
22
+ "#{Card.config.relative_url_root}/#{rel_path}"
23
23
  end
24
24
  end
25
25
 
@@ -27,7 +27,7 @@ class Card
27
27
  if rel =~ /^https?\:/
28
28
  rel
29
29
  else
30
- "#{ Card::Env[:protocol] }#{ Card::Env[:host] }#{ card_path rel }"
30
+ "#{Card::Env[:protocol]}#{Card::Env[:host]}#{card_path rel}"
31
31
  end
32
32
  end
33
33
 
data/lib/card/mailer.rb CHANGED
@@ -1,10 +1,8 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
  require 'open-uri'
3
3
 
4
-
5
4
  class Card
6
5
  class Mailer < ActionMailer::Base
7
-
8
6
  @@defaults = Card.config.email_defaults || {}
9
7
  @@defaults.symbolize_keys!
10
8
  @@defaults[:return_path] ||= @@defaults[:from] if @@defaults[:from]
@@ -12,7 +10,7 @@ class Card
12
10
  default @@defaults
13
11
 
14
12
  class << self
15
- def new_mail(*args, &block)
13
+ def new_mail *args, &block
16
14
  mail = Mail.new(args, &block)
17
15
  method = Card::Mailer.delivery_method
18
16
  mail.delivery_method(method, Card::Mailer.send(:"#{method}_settings"))
@@ -20,18 +18,17 @@ class Card
20
18
  mail.raise_delivery_errors = Card::Mailer.raise_delivery_errors
21
19
  mail
22
20
  end
23
-
21
+
24
22
  def layout message
25
- %{
23
+ %(
26
24
  <!DOCTYPE html>
27
25
  <html>
28
26
  <body>
29
27
  #{message}
30
28
  </body>
31
29
  </html>
32
- }
30
+ )
33
31
  end
34
32
  end
35
33
  end
36
34
  end
37
-
@@ -79,7 +79,7 @@ class Card::Migration < ActiveRecord::Migration
79
79
 
80
80
  def import_json filename, merge_opts={}
81
81
  Card.config.action_mailer.perform_deliveries = false
82
- output_file = File.join data_path, "unmerged_#{ filename }"
82
+ output_file = File.join data_path, "unmerged_#{filename}"
83
83
  merge_opts[:output_file] ||= output_file
84
84
  Card.merge_list read_json(filename), merge_opts
85
85
  end
data/lib/card/name.rb CHANGED
@@ -38,7 +38,7 @@ class Card
38
38
 
39
39
  def trait tag_code
40
40
  name = trait_name(tag_code)
41
- name ? name.s : (fail Card::NotFound, "unknown codename: #{tag_code}")
41
+ name ? name.s : (raise Card::NotFound, "unknown codename: #{tag_code}")
42
42
  end
43
43
 
44
44
  def field tag_name
@@ -55,10 +55,8 @@ class Card
55
55
  when Symbol
56
56
  trait_name tag_name
57
57
  else
58
- if tag_name.to_s[0] == '+'
59
- tag_name = tag_name.to_s[1..-1]
60
- end
61
- [ self, tag_name ].to_name
58
+ tag_name = tag_name.to_s[1..-1] if tag_name.to_s[0] == '+'
59
+ [self, tag_name].to_name
62
60
  end
63
61
  end
64
62
 
@@ -100,7 +98,6 @@ class Card
100
98
  SetPattern.card_keys[tag_name.key]
101
99
  end
102
100
 
103
-
104
101
  def relative?
105
102
  s =~ RELATIVE_REGEXP || starts_with_joint?
106
103
  end
data/lib/card/query.rb CHANGED
@@ -59,16 +59,16 @@ class Card
59
59
  ignore: %w( prepend append view params vars size )
60
60
  }.inject({}) { |h, pair| pair[1].each { |v| h[v.to_sym] = pair[0] }; h }
61
61
 
62
- CONJUNCTIONS = { any: :or, in: :or, or: :or, all: :and, and: :and }
62
+ CONJUNCTIONS = { any: :or, in: :or, or: :or, all: :and, and: :and }.freeze
63
63
 
64
64
  MODIFIERS = %w( conj return sort sort_as group dir limit offset )
65
- .inject({}) { |h,v| h[v.to_sym] = nil; h }
65
+ .inject({}) { |h, v| h[v.to_sym] = nil; h }
66
66
 
67
- OPERATORS = %w( != = =~ < > in ~ ).inject({}) {|h,v| h[v]=v; h }.merge({
67
+ OPERATORS = %w( != = =~ < > in ~ ).inject({}) { |h, v| h[v] = v; h }.merge({
68
68
  eq: '=', gt: '>', lt: '<', match: '~', ne: '!=', 'not in' => nil
69
69
  }.stringify_keys)
70
70
 
71
- DEFAULT_ORDER_DIRS = { :update => "desc", :relevance => "desc" }
71
+ DEFAULT_ORDER_DIRS = { update: 'desc', relevance: 'desc' }.freeze
72
72
 
73
73
  attr_reader :statement, :mods, :conditions, :comment,
74
74
  :subqueries, :superquery
@@ -184,7 +184,7 @@ class Card
184
184
  when Hash then clause
185
185
  when String then { key: clause.to_name.key }
186
186
  when Integer then { id: clause }
187
- else fail BadQuery, "Invalid query args #{clause.inspect}"
187
+ else raise BadQuery, "Invalid query args #{clause.inspect}"
188
188
  end
189
189
  end
190
190
 
@@ -193,7 +193,7 @@ class Card
193
193
  when Integer, Float, Symbol, Hash then val
194
194
  when String, SmartName then normalize_string_value val
195
195
  when Array then val.map { |v| normalize_value v }
196
- else fail BadQuery, "unknown WQL value type: #{val.class}"
196
+ else raise BadQuery, "unknown WQL value type: #{val.class}"
197
197
  end
198
198
  end
199
199
 
@@ -251,7 +251,7 @@ class Card
251
251
  when :ref_relational then relate key, val, method: :join_references
252
252
  when :plus_relational then relate_compound key, val
253
253
  when :ignore then # noop
254
- else fail BadQuery, "Invalid attribute #{key}"
254
+ else raise BadQuery, "Invalid attribute #{key}"
255
255
  end
256
256
  end
257
257
 
@@ -285,7 +285,7 @@ class Card
285
285
 
286
286
  def all_joins
287
287
  @all_joins ||=
288
- (joins + subqueries.find_all(&:unjoined).map(&:all_joins)).flatten
288
+ (joins + subqueries.select(&:unjoined).map(&:all_joins)).flatten
289
289
  end
290
290
  end
291
291
  end
@@ -2,7 +2,7 @@
2
2
  class Card
3
3
  class Query
4
4
  module Attributes
5
- SORT_JOIN_TO_ITEM_MAP = { left: 'left_id', right: 'right_id' }
5
+ SORT_JOIN_TO_ITEM_MAP = { left: 'left_id', right: 'right_id' }.freeze
6
6
 
7
7
  # ~~~~~~ RELATIONAL
8
8
 
@@ -133,7 +133,7 @@ class Card
133
133
  "replace(#{table_alias}.name,'+',' ')",
134
134
  "#{table_alias}.db_content"
135
135
  ].map do |field|
136
- %{#{field} #{cxn.match quote("[[:<:]]#{v}[[:>:]]")}}
136
+ %(#{field} #{cxn.match quote("[[:<:]]#{v}[[:>:]]")})
137
137
  end
138
138
  "(#{name_or_content.join ' OR '})"
139
139
  end
@@ -209,7 +209,7 @@ class Card
209
209
  # FIXME: - SQL generated before SQL phase
210
210
  cs.joins << Join.new(
211
211
  from: cs,
212
- to: ['card_references', 'wr', 'referee_id']
212
+ to: %w(card_references wr referee_id)
213
213
  )
214
214
  cs.mods[:sort_join_field] = "#{cs.table_alias}.id as sort_join_field"
215
215
  # HACK!
@@ -260,13 +260,13 @@ class Card
260
260
  def all val
261
261
  conjoin val, :and
262
262
  end
263
- alias :and :all
263
+ alias and all
264
264
 
265
265
  def any val
266
266
  conjoin val, :or
267
267
  end
268
- alias_method :or, :any
269
- alias_method :in, :any
268
+ alias or any
269
+ alias in any
270
270
 
271
271
  def conjoin val, conj
272
272
  sq = subquery unjoined: true, conj: conj
@@ -1,18 +1,18 @@
1
1
 
2
2
  module Card::Query::Clause
3
- # attr_accessor :clause
3
+ # attr_accessor :clause
4
4
 
5
- def safe_sql(txt)
6
- txt = txt.to_s
7
- txt.match( /[^\w\*\(\)\s\.\,]/ ) ? raise( "WQL contains disallowed characters: #{txt}" ) : txt
8
- end
5
+ def safe_sql txt
6
+ txt = txt.to_s
7
+ txt =~ /[^\w\*\(\)\s\.\,]/ ? raise("WQL contains disallowed characters: #{txt}") : txt
8
+ end
9
9
 
10
- def quote(v) ActiveRecord::Base.connection.quote(v) end
10
+ def quote v
11
+ ActiveRecord::Base.connection.quote(v)
12
+ end
11
13
 
12
- def match_prep(v)
14
+ def match_prep v
13
15
  cxn ||= ActiveRecord::Base.connection
14
16
  [cxn, v]
15
17
  end
16
-
17
-
18
- end
18
+ end
@@ -2,11 +2,11 @@ class Card
2
2
  class Query
3
3
  class Join
4
4
  attr_accessor :conditions, :side,
5
- :from, :to,
6
- :from_table, :to_table,
7
- :from_alias, :to_alias,
8
- :from_field, :to_field,
9
- :superjoin, :subjoins
5
+ :from, :to,
6
+ :from_table, :to_table,
7
+ :from_alias, :to_alias,
8
+ :from_field, :to_field,
9
+ :superjoin, :subjoins
10
10
 
11
11
  def initialize opts={}
12
12
  from_and_to opts
@@ -28,7 +28,7 @@ class Card
28
28
  [:from, :to].each do |side|
29
29
  object = opts[side]
30
30
  case object
31
- when nil; next
31
+ when nil then next
32
32
  when Array
33
33
  { table: object.shift, alias: object.shift, field: object.shift }
34
34
  when Card::Query
@@ -36,7 +36,7 @@ class Card
36
36
  when Card::Query::Reference
37
37
  { table: 'card_references', alias: object.table_alias }
38
38
  when Card::Query::Join
39
- fail "to: cannot be Join" if side == :to
39
+ raise 'to: cannot be Join' if side == :to
40
40
  { table: object.to_table, alias: object.to_alias }
41
41
  else
42
42
  raise "invalid #{side} option: #{object}"
@@ -66,8 +66,6 @@ class Card
66
66
  @in_left = left? || (!@superjoin.nil? && @superjoin.in_left?)
67
67
  end
68
68
  end
69
-
70
69
  end
71
70
  end
72
71
  end
73
-
@@ -1,44 +1,44 @@
1
1
  class Card::Query
2
2
  class Reference
3
-
4
3
  DEFINITIONS = {
5
4
  # syntax:
6
5
  # wql query key => [ direction, {reference_type} ]
7
- # direction = :out | :in
8
- # reference_type = 'L' | 'I' | 'P'
6
+ # direction = :out | :in
7
+ # reference_type = 'L' | 'I' | 'P'
9
8
 
10
- refer_to: [ :out, 'L','I' ], referred_to_by: [ :in, 'L','I' ],
11
- link_to: [ :out, 'L' ], linked_to_by: [ :in, 'L' ],
12
- include: [ :out, 'I' ], included_by: [ :in, 'I' ]
13
- }
9
+ refer_to: [:out, 'L', 'I'], referred_to_by: [:in, 'L', 'I'],
10
+ link_to: [:out, 'L'], linked_to_by: [:in, 'L'],
11
+ include: [:out, 'I'], included_by: [:in, 'I']
12
+ }.freeze
14
13
 
15
14
  FIELDMAP = {
16
- out: [ :referer_id, :referee_id ],
17
- in: [ :referee_id, :referer_id ]
18
- }
15
+ out: [:referer_id, :referee_id],
16
+ in: [:referee_id, :referer_id]
17
+ }.freeze
19
18
 
20
19
  attr_accessor :conditions, :cardquery, :infield, :outfield
21
20
 
22
21
  def table_alias
23
- @table_alias ||= "cr#{@parent.table_id force=true}"
22
+ @table_alias ||= "cr#{@parent.table_id force = true}"
24
23
  end
25
24
 
26
-
27
25
  def initialize key, val, parent
28
- key, val, @parent = key, val, parent
26
+ key = key
27
+ val = val
28
+ @parent = parent
29
29
  @conditions = []
30
30
 
31
- direction, *reftype = DEFINITIONS[ key.to_sym ]
32
- @infield, @outfield = FIELDMAP[ direction ]
31
+ direction, *reftype = DEFINITIONS[key.to_sym]
32
+ @infield, @outfield = FIELDMAP[direction]
33
33
 
34
34
  if reftype.present?
35
- operator = (reftype.size==1 ? '=' : 'IN')
35
+ operator = (reftype.size == 1 ? '=' : 'IN')
36
36
  quoted_letters = reftype.map { |letter| "'#{letter}'" } * ', '
37
37
  @conditions << "ref_type #{operator} (#{quoted_letters})"
38
38
  end
39
39
 
40
40
  if val == '_none'
41
- @conditions << "present = 0"
41
+ @conditions << 'present = 0'
42
42
  else
43
43
  @cardquery = val
44
44
  end
@@ -47,5 +47,3 @@ class Card::Query
47
47
  end
48
48
  end
49
49
  end
50
-
51
-
@@ -218,8 +218,8 @@ class Card
218
218
 
219
219
  def safe_sql txt
220
220
  txt = txt.to_s
221
- if txt.match(/[^\w\*\(\)\s\.\,]/)
222
- fail "WQL contains disallowed characters: #{txt}"
221
+ if txt =~ /[^\w\*\(\)\s\.\,]/
222
+ raise "WQL contains disallowed characters: #{txt}"
223
223
  else
224
224
  txt
225
225
  end
@@ -1,7 +1,6 @@
1
1
  class Card
2
2
  class Query
3
3
  class Value
4
-
5
4
  include Clause
6
5
 
7
6
  attr_reader :query, :operator, :value
@@ -24,40 +23,40 @@ class Card
24
23
  if target = OPERATORS[@operator.to_s]
25
24
  @operator = target
26
25
  else
27
- fail BadQuery, "Invalid Operator #{@operator}"
26
+ raise BadQuery, "Invalid Operator #{@operator}"
28
27
  end
29
28
  end
30
29
 
31
-
32
30
  def sqlize v
33
31
  case v
34
- when Query; v.to_sql
35
- when Array; "(" + v.flatten.collect {|x| sqlize(x)}.join(',') + ")"
32
+ when Query then v.to_sql
33
+ when Array then '(' + v.flatten.map { |x| sqlize(x) }.join(',') + ')'
36
34
  else quote(v.to_s)
37
35
  end
38
36
  end
39
37
 
40
38
  def to_sql field
41
- op,v = @operator, @value
39
+ op = @operator
40
+ v = @value
42
41
  table = @query.table_alias
43
42
 
44
43
  field, v = case field.to_s
45
- when "name"
46
- ["#{table}.key", [v].flatten.map(&:to_name).map(&:key)]
47
- when "content"
48
- ["#{table}.db_content", v]
49
- else
50
- ["#{table}.#{safe_sql field}", v]
44
+ when 'name'
45
+ ["#{table}.key", [v].flatten.map(&:to_name).map(&:key)]
46
+ when 'content'
47
+ ["#{table}.db_content", v]
48
+ else
49
+ ["#{table}.#{safe_sql field}", v]
51
50
  end
52
51
 
53
- v = v[0] if Array===v && v.length==1 && op != 'in'
54
- if op=='~'
52
+ v = v[0] if Array === v && v.length == 1 && op != 'in'
53
+ if op == '~'
55
54
  cxn, v = match_prep(v)
56
- %{#{field} #{cxn.match(sqlize(v))}}
55
+ %(#{field} #{cxn.match(sqlize(v))})
57
56
  else
58
57
  "#{field} #{op} #{sqlize(v)}"
59
58
  end
60
59
  end
61
60
  end
62
61
  end
63
- end
62
+ end
data/lib/card/set.rb CHANGED
@@ -1,90 +1,90 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  class Card
4
-
5
4
  module Set
5
+ include Event
6
6
  mattr_accessor :modules, :traits
7
7
  @@modules = { base: [], base_format: {}, nonbase: {}, nonbase_format: {} }
8
8
 
9
- # A 'Set' is a group of Cards to which 'Rules' may be applied.
10
- # Sets can be as specific as a single card, as general as all cards, or
11
- # anywhere in between.
12
- #
13
- # Rules take two main forms: card rules and code rules.
14
- #
15
- # 'Card rules' are defined in card content. These are generally configured
16
- # via the web interface and are thus documented at http://wagn.org/rules.
17
- #
18
- # 'Code rules' can be defined in a 'set file' within any 'Mod' (short for
19
- # both 'module' and 'modification'). In accordance with Wagn's 'MoVE'
20
- # architecture, there are two main kinds of code rules you can create in
21
- # set file: Views, and Events.
22
- # Events are associated with the Card class, and Views are associated with
23
- # a Format class.
24
- # You can also use set files to add or override Card and/or Format methods
25
- # directly. The majority of Card code is contained in these files.
26
- #
27
- # (FIXME - define mod, add generator)
28
- #
29
- # Whenever you fetch or instantiate a card, it will automatically include
30
- # all the set modules defined in set files associated with sets of which it
31
- # is a member. This entails both simple model methods and 'events', which
32
- # are special methods explored in greater detail below.
33
- #
34
- # For example, say you have a Plaintext card named 'Philipp+address', and
35
- # you have set files for the following sets:
36
- #
37
- # * all cards
38
- # * all Plaintext cards
39
- # * all cards ending in +address
40
- #
41
- # When you run this:
42
- #
43
- # mycard = Card.fetch 'Philipp+address'
44
- #
45
- # ...then mycard will include the set modules associated with each of those
46
- # sets in the above order. (The order is determined by the set pattern;
47
- # see lib/card/set_pattern.rb for more information about set_ptterns and
48
- # mod/core/set/all/fetch.rb for more about fetching.)
49
- #
50
- # Similarly, whenever a Format object is instantiated for a card, it
51
- # includes all views associated with BOTH (a) sets of which the card is a
52
- # member and (b) the current format or its ancestors. More on defining
53
- # views below.
54
- #
55
- #
56
- # In order to have a set file associated with "all cards ending in
57
- # +address", you could create a file in
58
- # mywagn/mod/mymod/set/right/address.rb.
59
- # The recommended mechanism for doing so is running `wagn generate set
60
- # modname set_pattern set_anchor`. In the current example, this
61
- # would translate to `wagn generate set mymod right address`.
62
- # Note that both the set_pattern and the set_anchor must correspond to the
63
- # codename of a card in the database to function correctly but you can add
64
- # arbitrary subdirectories to organize your code rules. The rule above
65
- # for example could be saved in
66
- # mywagn/mod/mymod/set/right/address/america/north/canada.rb.
67
- #
68
- #
69
- # When a Card application loads, it uses these files to autogenerate a
70
- # tmp_file that uses this set file to create a Card::Set::Right::Address
71
- # module which itself is extended with Card::Set. A set file is 'just ruby'
72
- # but is generally quite concise because Card uses its file location to
73
- # autogenerate ruby module names and then uses Card::Set module to provide
74
- # additional API.
75
- #
76
- #
77
- # View definitions
78
- #
79
- # When you declare:
80
- # view :view_name do |args|
81
- # #...your code here
82
- # end
83
- #
84
- # Methods are defined on the format
85
- #
86
- # The external api with checks:
87
- # render(:viewname, args)
9
+ # A 'Set' is a group of Cards to which 'Rules' may be applied.
10
+ # Sets can be as specific as a single card, as general as all cards, or
11
+ # anywhere in between.
12
+ #
13
+ # Rules take two main forms: card rules and code rules.
14
+ #
15
+ # 'Card rules' are defined in card content. These are generally configured
16
+ # via the web interface and are thus documented at http://wagn.org/rules.
17
+ #
18
+ # 'Code rules' can be defined in a 'set file' within any 'Mod' (short for
19
+ # both 'module' and 'modification'). In accordance with Wagn's 'MoVE'
20
+ # architecture, there are two main kinds of code rules you can create in
21
+ # set file: Views, and Events.
22
+ # Events are associated with the Card class, and Views are associated with
23
+ # a Format class.
24
+ # You can also use set files to add or override Card and/or Format methods
25
+ # directly. The majority of Card code is contained in these files.
26
+ #
27
+ # (FIXME - define mod, add generator)
28
+ #
29
+ # Whenever you fetch or instantiate a card, it will automatically include
30
+ # all the set modules defined in set files associated with sets of which it
31
+ # is a member. This entails both simple model methods and 'events', which
32
+ # are special methods explored in greater detail below.
33
+ #
34
+ # For example, say you have a Plaintext card named 'Philipp+address', and
35
+ # you have set files for the following sets:
36
+ #
37
+ # * all cards
38
+ # * all Plaintext cards
39
+ # * all cards ending in +address
40
+ #
41
+ # When you run this:
42
+ #
43
+ # mycard = Card.fetch 'Philipp+address'
44
+ #
45
+ # ...then mycard will include the set modules associated with each of those
46
+ # ets in the above order. (The order is determined by the set pattern;
47
+ # ee lib/card/set_pattern.rb for more information about set_ptterns and
48
+ # od/core/set/all/fetch.rb for more about fetching.)
49
+ #
50
+ # imilarly, whenever a Format object is instantiated for a card, it
51
+ # ncludes all views associated with BOTH (a) sets of which the card is a
52
+ # ember and (b) the current format or its ancestors. More on defining
53
+ # iews below.
54
+ #
55
+ #
56
+ # In order to have a set file associated with "all cards ending in
57
+ # +address", you could create a file in
58
+ # mywagn/mod/mymod/set/right/address.rb.
59
+ # The recommended mechanism for doing so is running `wagn generate set
60
+ # modname set_pattern set_anchor`. In the current example, this
61
+ # would translate to `wagn generate set mymod right address`.
62
+ # Note that both the set_pattern and the set_anchor must correspond to the
63
+ # codename of a card in the database to function correctly but you can add
64
+ # arbitrary subdirectories to organize your code rules. The rule above
65
+ # for example could be saved in
66
+ # mywagn/mod/mymod/set/right/address/america/north/canada.rb.
67
+ #
68
+ #
69
+ # When a Card application loads, it uses these files to autogenerate a
70
+ # tmp_file that uses this set file to create a Card::Set::Right::Address
71
+ # module which itself is extended with Card::Set. A set file is 'just ruby'
72
+ # but is generally quite concise because Card uses its file location to
73
+ # autogenerate ruby module names and then uses Card::Set module to provide
74
+ # additional API.
75
+ #
76
+ #
77
+ # View definitions
78
+ #
79
+ # When you declare:
80
+ # view :view_name do |args|
81
+ # #...your code here
82
+ # end
83
+ #
84
+ # Methods are defined on the format
85
+ #
86
+ # The external api with checks:
87
+ # render(:viewname, args)
88
88
 
89
89
  module Format
90
90
  mattr_accessor :views
@@ -94,12 +94,12 @@ class Card
94
94
  view = view.to_viewname.key.to_sym
95
95
  views[self] ||= {}
96
96
  view_block = views[self][view] =
97
- if block_given?
98
- Card::Format.extract_class_vars view, args[0]
99
- block
100
- else
101
- alias_block view, args
102
- end
97
+ if block_given?
98
+ Card::Format.extract_class_vars view, args[0]
99
+ block
100
+ else
101
+ alias_block view, args
102
+ end
103
103
  define_method "_view_#{view}", view_block
104
104
  end
105
105
 
@@ -107,7 +107,7 @@ class Card
107
107
  opts = args[0].is_a?(Hash) ? args.shift : { view: args.shift }
108
108
  opts[:mod] ||= self
109
109
  opts[:view] ||= view
110
- views[opts[:mod]][opts[:view]] || fail
110
+ views[opts[:mod]][opts[:view]] || raise
111
111
  rescue
112
112
  raise "cannot find #{opts[:view]} view in #{opts[:mod]}; " \
113
113
  "failed to alias #{view} in #{self}"
@@ -146,39 +146,16 @@ class Card
146
146
  end
147
147
  end
148
148
 
149
- def event event, opts={}, &final
150
- perform_later = (opts[:before] == :subsequent) ||
151
- (opts[:after] == :subsequent)
152
- final_method = "#{event}_without_callbacks" # should be private?
153
- opts[:on] = [:create, :update] if opts[:on] == :save
154
-
155
- Card.define_callbacks event
156
-
157
- class_eval do
158
- define_method final_method, &final
159
- end
160
-
161
- if perform_later
162
- defer_method = "#{event}_perform_later"
163
- define_event_perform_later_method event, defer_method
164
- define_active_job event, final_method, opts[:queue_as]
165
- define_event_method event, defer_method, opts
166
- else
167
- define_event_method event, final_method, opts
168
- end
169
- set_event_callbacks event, opts
170
- end
171
-
172
- def phase_method method, opts={}, &block
149
+ def stage_method method, opts={}, &block
173
150
  class_eval do
174
151
  define_method "_#{method}", &block
175
152
  define_method method do |*args|
176
153
  error =
177
- if !phase_ok? opts
178
- if !phase
154
+ if !director.stage_ok? opts
155
+ if !stage
179
156
  "phase method #{method} called outside of event phases"
180
157
  else
181
- "#{opts.inspect} method #{method} called in phase #{phase}"
158
+ "#{opts.inspect} method #{method} called in phase #{stage}"
182
159
  end
183
160
  elsif !on_condition_applies?(opts[:on])
184
161
  "on: #{opts[:on]} method #{method} called on #{@action}"
@@ -192,65 +169,6 @@ class Card
192
169
  end
193
170
  end
194
171
 
195
- def define_event_perform_later_method event, method_name
196
- class_eval do
197
- define_method method_name, proc {
198
- s_attr =
199
- serializable_attributes.each_with_object({}) do |name, hash|
200
- value = instance_variable_get("@#{name}")
201
- hash[name] =
202
- # ActiveJob doesn't accept symbols as arguments
203
- if Symbol === value
204
- { value: value.to_s, symbol: true }
205
- else
206
- { value: value }
207
- end
208
- end
209
- Object.const_get(event.to_s.camelize).perform_later(self, s_attr)
210
- }
211
- end
212
- end
213
-
214
- def define_event_method event, call_method, _opts
215
- class_eval do
216
- define_method event do
217
- run_callbacks event do
218
- send call_method
219
- end
220
- end
221
- end
222
- end
223
-
224
- # creates an Active Job.
225
- # The scheduled job gets the card object as argument and all serializable
226
- # attributes of the card.
227
- # (when the job is executed ActiveJob fetches the card from the database so
228
- # all attributes get lost)
229
- # @param name [String] the name for the ActiveJob child class
230
- # @param final_method [String] the name of the card instance method to be
231
- # queued
232
- # @option queue [Symbol] (:default) the name of the queue
233
- def define_active_job name, final_method, queue=:default
234
- class_name = name.to_s.camelize
235
- eval %{
236
- class ::#{class_name} < ActiveJob::Base
237
- queue_as #{queue}
238
- end
239
- }
240
- Object.const_get(class_name).class_eval do
241
- define_method :perform, proc { |card, attributes|
242
- attributes.each do |attname, args|
243
- # symbols are not allowed so all symbols arrive here as strings
244
- # convert strings that were symbols before back to symbols
245
- value = args[:symbol] ? args[:value].to_sym : args[:value]
246
- card.instance_variable_set("@#{attname}", value)
247
- end
248
- card.include_set_modules
249
- card.send final_method
250
- }
251
- end
252
- end
253
-
254
172
  #
255
173
  # ActiveCard support: accessing plus cards as attributes
256
174
  #
@@ -270,21 +188,19 @@ class Card
270
188
  end
271
189
 
272
190
  def ensure_set &block
273
- begin
274
- set_module = block.call
275
- rescue NameError => e
276
- if e.message.match /uninitialized constant (?:Card::Set::)?(.+)$/
277
- $1.split('::').inject(Card::Set) do |set_mod, module_name|
278
- set_mod.const_get_or_set module_name do
279
- Module.new
280
- end
191
+ set_module = yield
192
+ rescue NameError => e
193
+ if e.message =~ /uninitialized constant (?:Card::Set::)?(.+)$/
194
+ Regexp.last_match(1).split('::').inject(Card::Set) do |set_mod, module_name|
195
+ set_mod.const_get_or_set module_name do
196
+ Module.new
281
197
  end
282
198
  end
283
- # try again - there might be another submodule that doesn't exist
284
- ensure_set &block
285
- else
286
- set_module.extend Card::Set
287
199
  end
200
+ # try again - there might be another submodule that doesn't exist
201
+ ensure_set &block
202
+ else
203
+ set_module.extend Card::Set
288
204
  end
289
205
  # the set loading process has two main phases:
290
206
 
@@ -323,7 +239,7 @@ class Card
323
239
  # -*- encoding : utf-8 -*-
324
240
  class Card; module Set; #{submodules} extend Card::Set
325
241
  # ~~~~~~~~~~~ above autogenerated; below pulled from #{from_file} ~~~~~~~~~~~
326
- #{ File.read from_file }
242
+ #{File.read from_file}
327
243
 
328
244
  # ~~~~~~~~~~~ below autogenerated; above pulled from #{from_file} ~~~~~~~~~~~
329
245
  end;end;#{'end;' * name_parts.size}
@@ -351,9 +267,7 @@ EOF
351
267
 
352
268
  def process_base_module_list list, klass
353
269
  list.each do |mod|
354
- if mod.instance_methods.any?
355
- klass.send :include, mod
356
- end
270
+ klass.send :include, mod if mod.instance_methods.any?
357
271
  if (class_methods = mod.const_get_if_defined(:ClassMethods))
358
272
  klass.send :extend, class_methods
359
273
  end
@@ -376,10 +290,10 @@ EOF
376
290
  end
377
291
 
378
292
  def register_set_format format_class, mod
379
- return if self.abstract_set? # noop; only used by explicit inclusion in
293
+ return if abstract_set? # noop; only used by explicit inclusion in
380
294
  # other set modules
381
295
 
382
- if self.all_set?
296
+ if all_set?
383
297
  # ready to include in base format classes
384
298
  modules[:base_format][format_class] ||= []
385
299
  modules[:base_format][format_class] << mod
@@ -410,23 +324,6 @@ EOF
410
324
 
411
325
  private
412
326
 
413
- def set_event_callbacks event, opts
414
- [:before, :after, :around].each do |kind|
415
- if (object_method = opts.delete(kind))
416
- this_set_module = self
417
- Card.class_eval do
418
- set_callback(
419
- object_method, kind, event,
420
- prepend: true, if: proc do |c|
421
- c.singleton_class.include?(this_set_module) &&
422
- c.event_applies?(opts)
423
- end
424
- )
425
- end
426
- end
427
- end
428
- end
429
-
430
327
  def get_traits mod
431
328
  Card::Set.traits ||= {}
432
329
  Card::Set.traits[mod] || Card::Set.traits[mod] = {}
@@ -438,7 +335,7 @@ EOF
438
335
  mod_traits = get_traits mod
439
336
 
440
337
  new_opts = options[:type] ? { type: options[:type] } : {}
441
- new_opts.merge!(default_content: options[:default]) if options[:default]
338
+ new_opts[:default_content] = options[:default] if options[:default]
442
339
 
443
340
  args.each do |trait|
444
341
  define_trait_card trait, new_opts