card 1.17.4 → 1.18.0

Sign up to get free protection for your applications and to get access to all the features.
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