wagn 1.13.0 → 1.14.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (459) hide show
  1. checksums.yaml +4 -4
  2. data/Guardfile +3 -2
  3. data/VERSION +1 -1
  4. data/app/controllers/card_controller.rb +33 -38
  5. data/config/routes.rb +2 -2
  6. data/config/version.txt +1 -1
  7. data/db/bootstrap/card_actions.yml +3543 -0
  8. data/db/bootstrap/card_acts.yml +7 -0
  9. data/db/bootstrap/card_changes.yml +9150 -0
  10. data/db/bootstrap/card_references.yml +666 -344
  11. data/db/bootstrap/cards.yml +3256 -1702
  12. data/db/migrate/20140822073704_create_new_revision_tables.rb +43 -0
  13. data/db/migrate/20141001105348_move_revisions_to_actions.rb +62 -0
  14. data/db/migrate_cards/20130411191151_renaming_for_menu.rb +42 -45
  15. data/db/migrate_cards/20130411211600_delete_old_related_tab_cards.rb +13 -16
  16. data/db/migrate_cards/20130419215612_import_help_text.rb +7 -10
  17. data/db/migrate_cards/20130823192433_add_style_cards.rb +77 -81
  18. data/db/migrate_cards/20130910183318_move_styles_to_content.rb +4 -7
  19. data/db/migrate_cards/20130920214038_jsonize_tinymce.rb +9 -12
  20. data/db/migrate_cards/20130920291703_update_stylesheets.rb +10 -13
  21. data/db/migrate_cards/20130927191728_account_events.rb +15 -18
  22. data/db/migrate_cards/20131016172445_common_css_patch.rb +5 -8
  23. data/db/migrate_cards/20140110193325_reset_account_request_type.rb +4 -7
  24. data/db/migrate_cards/20140307231621_user_data_to_cards.rb +50 -53
  25. data/db/migrate_cards/20140317035504_account_requests_to_signups.rb +39 -42
  26. data/db/migrate_cards/20140512155840_add_script_cards.rb +56 -59
  27. data/db/migrate_cards/20140629222005_add_email_cards.rb +168 -0
  28. data/db/migrate_cards/20140725180118_config_card_updates.rb +4 -7
  29. data/db/migrate_cards/data/mailer/follower_notification_email.html +9 -0
  30. data/db/migrate_cards/data/mailer/follower_notification_email.txt +11 -0
  31. data/db/migrate_cards/data/mailer/mail_config.json +22 -0
  32. data/db/migrate_cards/data/mailer/password_reset_email.html +10 -0
  33. data/db/migrate_cards/data/mailer/password_reset_email.txt +11 -0
  34. data/db/migrate_cards/data/mailer/signup_alert_email.html +7 -0
  35. data/db/migrate_cards/data/mailer/signup_alert_email.txt +5 -0
  36. data/db/migrate_cards/data/mailer/verification_email.html +9 -0
  37. data/db/migrate_cards/data/mailer/verification_email.txt +8 -0
  38. data/db/schema.rb +31 -1
  39. data/features/conflict.feature +39 -0
  40. data/features/flexmail.feature +54 -54
  41. data/features/notifications.feature +4 -2
  42. data/features/reset_password.feature +1 -1
  43. data/features/step_definitions/wagn_steps.rb +20 -2
  44. data/features/step_definitions/window_steps.rb +23 -0
  45. data/features/support/env.rb +1 -0
  46. data/features/update_includers.feature +16 -10
  47. data/features/watch.feature +2 -2
  48. data/lib/card.rb +11 -10
  49. data/lib/card/act.rb +63 -0
  50. data/lib/card/action.rb +194 -0
  51. data/lib/card/change.rb +29 -0
  52. data/lib/card/content.rb +1 -1
  53. data/lib/card/diff.rb +229 -276
  54. data/lib/card/env.rb +4 -3
  55. data/lib/card/format.rb +2 -5
  56. data/lib/card/generators/card_migration/USAGE +15 -3
  57. data/lib/card/generators/card_migration/card_migration_generator.rb +22 -2
  58. data/lib/card/generators/card_migration/templates/card_migration.erb +4 -5
  59. data/lib/card/generators/format/USAGE +2 -2
  60. data/lib/card/generators/format/format_generator.rb +2 -2
  61. data/lib/card/generators/set/USAGE +2 -2
  62. data/lib/card/mailer.rb +21 -100
  63. data/lib/card/name.rb +4 -3
  64. data/lib/card/query.rb +2 -2
  65. data/lib/card/query/card_spec.rb +20 -30
  66. data/lib/card/query/value_spec.rb +2 -3
  67. data/lib/card/set.rb +3 -0
  68. data/lib/wagn/all.rb +6 -0
  69. data/lib/wagn/application.rb +16 -6
  70. data/lib/wagn/commands.rb +87 -27
  71. data/lib/wagn/config/environments/development.rb +17 -0
  72. data/lib/wagn/config/environments/test.rb +14 -1
  73. data/lib/wagn/config/initializers/airbrake.rb +1 -1
  74. data/lib/wagn/generators/wagn/templates/Gemfile +27 -9
  75. data/lib/wagn/generators/wagn/templates/config/application.rb +12 -3
  76. data/lib/wagn/generators/wagn/templates/simplecov +5 -0
  77. data/lib/wagn/generators/wagn/templates/spec/spec_helper.rb +1 -0
  78. data/lib/wagn/generators/wagn/wagn_generator.rb +75 -45
  79. data/lib/wagn/location.rb +9 -0
  80. data/lib/wagn/migration.rb +96 -0
  81. data/lib/wagn/mods_spec_helper.rb +16 -8
  82. data/lib/wagn/simplecov_helper.rb +61 -0
  83. data/lib/wagn/{wagn_spec_helper.rb → spec_helper.rb} +11 -3
  84. data/lib/wagn/tasks/test.rake +1 -1
  85. data/lib/wagn/tasks/wagn.rake +100 -34
  86. data/lib/wagn/version.rb +7 -2
  87. data/mod/{core → 01_core}/chunk/include.rb +0 -0
  88. data/mod/{core → 01_core}/chunk/link.rb +0 -0
  89. data/mod/{core → 01_core}/chunk/literal.rb +0 -0
  90. data/mod/{core → 01_core}/chunk/reference.rb +15 -3
  91. data/mod/{core → 01_core}/chunk/uri.rb +0 -0
  92. data/mod/{core → 01_core}/format/data_format.rb +0 -0
  93. data/mod/{core → 01_core}/format/html_format.rb +5 -2
  94. data/mod/{core → 01_core}/format/text_format.rb +0 -0
  95. data/mod/{core → 01_core}/layout/blank.html +0 -0
  96. data/mod/{core → 01_core}/layout/default.html +0 -0
  97. data/mod/{core → 01_core}/layout/noside.html +0 -0
  98. data/mod/{core → 01_core}/layout/pre.html +0 -0
  99. data/mod/{core → 01_core}/layout/simple.html +0 -0
  100. data/mod/{core → 01_core}/set/all/active_card.rb +0 -0
  101. data/mod/{core → 01_core}/set/all/collection.rb +33 -5
  102. data/mod/01_core/set/all/content.rb +144 -0
  103. data/mod/01_core/set/all/erb.rb +11 -0
  104. data/mod/{core → 01_core}/set/all/fetch.rb +8 -1
  105. data/mod/01_core/set/all/haml.rb +7 -0
  106. data/mod/{core → 01_core}/set/all/initialize.rb +4 -2
  107. data/mod/{core → 01_core}/set/all/name.rb +2 -3
  108. data/mod/01_core/set/all/notify.rb +215 -0
  109. data/mod/{core → 01_core}/set/all/pattern.rb +0 -0
  110. data/mod/{core → 01_core}/set/all/permissions.rb +1 -1
  111. data/mod/{core → 01_core}/set/all/phases.rb +24 -8
  112. data/mod/{core → 01_core}/set/all/references.rb +2 -2
  113. data/mod/{core → 01_core}/set/all/rules.rb +2 -2
  114. data/mod/{core → 01_core}/set/all/states.rb +1 -1
  115. data/mod/{core → 01_core}/set/all/templating.rb +4 -4
  116. data/mod/{core → 01_core}/set/all/tracked_attributes.rb +15 -64
  117. data/mod/{core → 01_core}/set/all/trash.rb +6 -5
  118. data/mod/{core → 01_core}/set/all/type.rb +0 -0
  119. data/mod/{core → 01_core}/set/all/utils.rb +1 -1
  120. data/mod/{core → 01_core}/set_pattern/01_all.rb +0 -0
  121. data/mod/{core → 01_core}/set_pattern/02_all_plus.rb +0 -0
  122. data/mod/{core → 01_core}/set_pattern/03_type.rb +0 -0
  123. data/mod/{core → 01_core}/set_pattern/04_star.rb +0 -0
  124. data/mod/{core → 01_core}/set_pattern/05_rstar.rb +0 -0
  125. data/mod/{core → 01_core}/set_pattern/06_right.rb +0 -0
  126. data/mod/{core → 01_core}/set_pattern/07_type_plus_right.rb +0 -0
  127. data/mod/{core → 01_core}/set_pattern/08_self.rb +0 -0
  128. data/mod/01_core/spec/chunk/literal_spec.rb +14 -0
  129. data/{spec/mod/core → mod/01_core/spec}/chunk/uri_spec.rb +3 -3
  130. data/{spec/mod/core → mod/01_core/spec}/format/data_format_spec.rb +0 -0
  131. data/{spec/mod/core → mod/01_core/spec}/format/html_format_spec.rb +9 -8
  132. data/{spec/mod/core → mod/01_core/spec}/format/text_format_spec.rb +0 -0
  133. data/{spec/mod/core → mod/01_core/spec}/set/all/active_card_spec.rb +0 -0
  134. data/mod/01_core/spec/set/all/attribute_tracking_spec.rb +21 -0
  135. data/mod/01_core/spec/set/all/collection_spec.rb +65 -0
  136. data/mod/01_core/spec/set/all/content_spec.rb +15 -0
  137. data/{spec/mod/core → mod/01_core/spec}/set/all/fetch_spec.rb +70 -68
  138. data/{spec/mod/core → mod/01_core/spec}/set/all/initialize_spec.rb +12 -12
  139. data/{spec/mod/core → mod/01_core/spec}/set/all/name_spec.rb +7 -7
  140. data/mod/01_core/spec/set/all/notify_spec.rb +199 -0
  141. data/{spec/mod/core → mod/01_core/spec}/set/all/pattern_spec.rb +16 -16
  142. data/{spec/mod/core → mod/01_core/spec}/set/all/permissions_spec.rb +62 -62
  143. data/{spec/mod/core → mod/01_core/spec}/set/all/phases_spec.rb +0 -0
  144. data/{spec/mod/core → mod/01_core/spec}/set/all/references_spec.rb +1 -1
  145. data/{spec/mod/core → mod/01_core/spec}/set/all/rules2_spec.rb +57 -57
  146. data/mod/01_core/spec/set/all/rules_spec.rb +81 -0
  147. data/{spec/mod/core → mod/01_core/spec}/set/all/states_spec.rb +0 -0
  148. data/{spec/mod/core → mod/01_core/spec}/set/all/templating_spec.rb +16 -12
  149. data/{spec/mod/core → mod/01_core/spec}/set/all/tracked_attributes_spec.rb +24 -22
  150. data/{spec/mod/core → mod/01_core/spec}/set/all/trash_spec.rb +2 -2
  151. data/{spec/mod/core → mod/01_core/spec}/set/all/type_spec.rb +13 -13
  152. data/{spec/mod/core → mod/01_core/spec}/set/all/utils_spec.rb +0 -0
  153. data/mod/{core → 02_basic_types}/set/type/plain_text.rb +0 -0
  154. data/mod/{standard → 02_basic_types}/set/type/pointer.rb +21 -8
  155. data/{spec/mod/standard/set/type → mod/02_basic_types/spec/set}/plain_text_spec.rb +0 -0
  156. data/{spec/mod/standard/set/type → mod/02_basic_types/spec/set}/pointer_spec.rb +22 -9
  157. data/mod/{standard → 03_machines}/lib/card/machine.rb +3 -2
  158. data/mod/{standard → 03_machines}/lib/card/machine_input.rb +1 -1
  159. data/mod/{standard → 03_machines}/lib/javascript/html5shiv-printshiv.js +0 -0
  160. data/mod/{standard → 03_machines}/lib/javascript/jquery-ui.js +0 -0
  161. data/mod/{standard → 03_machines}/lib/javascript/jquery.autosize.js +0 -0
  162. data/mod/{standard → 03_machines}/lib/javascript/jquery.fileupload.js +0 -0
  163. data/mod/{standard → 03_machines}/lib/javascript/jquery.iframe-transport.js +0 -0
  164. data/mod/{standard → 03_machines}/lib/javascript/jquery.js +0 -0
  165. data/mod/{standard → 03_machines}/lib/javascript/jquery.ui.autocomplete.html.js +0 -0
  166. data/mod/{standard → 03_machines}/lib/javascript/jquery_ujs.js +0 -0
  167. data/mod/{standard → 03_machines}/lib/javascript/jquerymobile.js +0 -0
  168. data/mod/{standard → 03_machines}/lib/javascript/tinymce.js +0 -0
  169. data/mod/{standard → 03_machines}/lib/javascript/wagn.js.coffee +17 -9
  170. data/mod/{standard → 03_machines}/lib/javascript/wagn_menu.js +0 -0
  171. data/mod/{standard → 03_machines}/lib/javascript/wagn_mod.js.coffee +1 -1
  172. data/mod/{standard → 03_machines}/lib/stylesheets/functional.scss +1 -1
  173. data/mod/{standard → 03_machines}/lib/stylesheets/jquery-ui-smoothness.css +0 -0
  174. data/mod/{standard → 03_machines}/lib/stylesheets/standard.scss +126 -21
  175. data/mod/{standard → 03_machines}/set/right/machine_output.rb +3 -2
  176. data/mod/{standard → 03_machines}/set/self/script_card_menu.rb +1 -1
  177. data/mod/{standard → 03_machines}/set/self/script_html5shiv_printshiv.rb +1 -1
  178. data/mod/{standard → 03_machines}/set/self/script_jquery.rb +1 -1
  179. data/mod/{standard → 03_machines}/set/self/script_jquery_helper.rb +1 -1
  180. data/mod/{standard → 03_machines}/set/self/script_slot.rb +1 -1
  181. data/mod/{standard → 03_machines}/set/self/script_tinymce.rb +1 -1
  182. data/mod/{standard → 03_machines}/set/self/style_functional.rb +1 -1
  183. data/mod/{standard → 03_machines}/set/self/style_jquery_ui_smoothness.rb +1 -1
  184. data/mod/{standard → 03_machines}/set/self/style_standard.rb +1 -1
  185. data/mod/{standard → 03_machines}/set/type/coffee_script.rb +0 -0
  186. data/mod/{standard → 03_machines}/set/type/css.rb +0 -0
  187. data/mod/{standard → 03_machines}/set/type/java_script.rb +0 -0
  188. data/mod/{standard → 03_machines}/set/type/scss.rb +0 -0
  189. data/mod/{standard → 03_machines}/set/type/skin.rb +0 -0
  190. data/{spec/mod/standard → mod/03_machines/spec}/lib/machine_input_spec.rb +0 -0
  191. data/{spec/mod/standard → mod/03_machines/spec}/lib/machine_spec.rb +4 -4
  192. data/{spec/mod/standard → mod/03_machines/spec}/set/right/machine_output_spec.rb +0 -0
  193. data/{spec/mod/standard → mod/03_machines/spec}/set/self/style_functional_spec.rb +0 -0
  194. data/{spec/mod/standard → mod/03_machines/spec}/set/self/style_jquery_ui_smoothness_spec.rb +0 -0
  195. data/{spec/mod/standard → mod/03_machines/spec}/set/self/style_standard_spec.rb +0 -0
  196. data/{spec/mod/standard → mod/03_machines/spec}/set/type/coffeescript_spec.rb +0 -0
  197. data/{spec/mod/standard → mod/03_machines/spec}/set/type/css_spec.rb +0 -0
  198. data/{spec/mod/standard → mod/03_machines/spec}/set/type/javascript_spec.rb +0 -0
  199. data/{spec/mod/standard → mod/03_machines/spec}/set/type/scss_spec.rb +1 -1
  200. data/{spec/mod/standard → mod/03_machines/spec}/set/type/skin_spec.rb +22 -0
  201. data/mod/04_settings/lib/card/setting.rb +57 -0
  202. data/mod/{core/set/right/structure.rb → 04_settings/set/right/add_help.rb} +0 -2
  203. data/mod/{standard → 04_settings}/set/right/comment.rb +0 -1
  204. data/mod/{standard → 04_settings}/set/right/create.rb +0 -1
  205. data/mod/04_settings/set/right/default.rb +3 -0
  206. data/mod/{standard → 04_settings}/set/right/delete.rb +2 -0
  207. data/mod/04_settings/set/right/help.rb +3 -0
  208. data/mod/{standard → 04_settings}/set/right/read.rb +0 -0
  209. data/mod/{standard → 04_settings}/set/right/script.rb +0 -0
  210. data/mod/04_settings/set/right/structure.rb +4 -0
  211. data/mod/{standard → 04_settings}/set/right/style.rb +0 -0
  212. data/mod/{standard → 04_settings}/set/right/update.rb +0 -0
  213. data/mod/04_settings/set/self/accountable.rb +2 -0
  214. data/mod/04_settings/set/self/add_help.rb +2 -0
  215. data/mod/04_settings/set/self/autoname.rb +2 -0
  216. data/mod/04_settings/set/self/captcha.rb +2 -0
  217. data/mod/04_settings/set/self/comment.rb +2 -0
  218. data/mod/04_settings/set/self/create.rb +2 -0
  219. data/mod/04_settings/set/self/default.rb +2 -0
  220. data/mod/04_settings/set/self/delete.rb +2 -0
  221. data/mod/04_settings/set/self/help.rb +2 -0
  222. data/mod/04_settings/set/self/input.rb +2 -0
  223. data/mod/04_settings/set/self/layout.rb +2 -0
  224. data/mod/04_settings/set/self/on_create.rb +2 -0
  225. data/mod/04_settings/set/self/on_delete.rb +2 -0
  226. data/mod/04_settings/set/self/on_update.rb +2 -0
  227. data/mod/04_settings/set/self/options.rb +2 -0
  228. data/mod/04_settings/set/self/options_label.rb +2 -0
  229. data/mod/04_settings/set/self/read.rb +2 -0
  230. data/mod/04_settings/set/self/script.rb +2 -0
  231. data/mod/04_settings/set/self/structure.rb +2 -0
  232. data/mod/04_settings/set/self/style.rb +2 -0
  233. data/mod/04_settings/set/self/table_of_contents.rb +2 -0
  234. data/mod/04_settings/set/self/thanks.rb +2 -0
  235. data/mod/04_settings/set/self/update.rb +2 -0
  236. data/mod/{standard → 04_settings}/set/type/setting.rb +8 -14
  237. data/{spec/mod/standard → mod/04_settings/spec}/set/right/add_help_spec.rb +0 -0
  238. data/{spec/mod/standard → mod/04_settings/spec}/set/right/comment_spec.rb +5 -5
  239. data/{spec/mod/standard → mod/04_settings/spec}/set/right/create_spec.rb +0 -0
  240. data/{spec/mod/standard → mod/04_settings/spec}/set/right/default_spec.rb +0 -0
  241. data/{spec/mod/standard → mod/04_settings/spec}/set/right/delete_spec.rb +0 -0
  242. data/{spec/mod/standard → mod/04_settings/spec}/set/right/help_spec.rb +0 -0
  243. data/{spec/mod/standard → mod/04_settings/spec}/set/right/read_spec.rb +0 -0
  244. data/{spec/mod/standard → mod/04_settings/spec}/set/right/script_spec.rb +0 -0
  245. data/{spec/mod/standard → mod/04_settings/spec}/set/right/structure_spec.rb +4 -2
  246. data/{spec/mod/standard → mod/04_settings/spec}/set/right/style_spec.rb +1 -1
  247. data/{spec/mod/standard → mod/04_settings/spec}/set/right/update_spec.rb +0 -0
  248. data/{spec/mod/standard → mod/04_settings/spec}/set/type/setting_spec.rb +0 -0
  249. data/mod/{standard → 05_standard}/file/103/icon-6566.ico +0 -0
  250. data/mod/{standard → 05_standard}/file/103/large-6566.ico +0 -0
  251. data/mod/{standard → 05_standard}/file/103/medium-6566.ico +0 -0
  252. data/mod/{standard → 05_standard}/file/103/original-6566.ico +0 -0
  253. data/mod/{standard → 05_standard}/file/103/small-6566.ico +0 -0
  254. data/mod/{standard → 05_standard}/file/79/icon-6556.png +0 -0
  255. data/mod/{standard → 05_standard}/file/79/large-6556.png +0 -0
  256. data/mod/{standard → 05_standard}/file/79/medium-6556.png +0 -0
  257. data/mod/{standard → 05_standard}/file/79/original-6556.png +0 -0
  258. data/mod/{standard → 05_standard}/file/79/small-6556.png +0 -0
  259. data/mod/{standard → 05_standard}/file/790/icon-6419.png +0 -0
  260. data/mod/{standard → 05_standard}/file/790/large-6419.png +0 -0
  261. data/mod/{standard → 05_standard}/file/790/medium-6419.png +0 -0
  262. data/mod/{standard → 05_standard}/file/790/original-6419.png +0 -0
  263. data/mod/{standard → 05_standard}/file/790/small-6419.png +0 -0
  264. data/mod/{standard → 05_standard}/format/css_format.rb +0 -0
  265. data/mod/{standard → 05_standard}/format/csv_format.rb +0 -0
  266. data/mod/{standard → 05_standard}/format/file_format.rb +0 -0
  267. data/mod/{standard → 05_standard}/format/js_format.rb +0 -0
  268. data/mod/{standard → 05_standard}/format/json_format.rb +0 -0
  269. data/mod/{standard → 05_standard}/format/rss_format.rb +0 -0
  270. data/mod/{standard → 05_standard}/format/xml_format.rb +0 -0
  271. data/mod/{standard → 05_standard}/set/all/account.rb +0 -0
  272. data/mod/{standard → 05_standard}/set/all/all_css.rb +0 -0
  273. data/mod/{standard → 05_standard}/set/all/all_csv.rb +1 -1
  274. data/mod/05_standard/set/all/all_js.rb +7 -0
  275. data/mod/{standard → 05_standard}/set/all/attach.rb +33 -33
  276. data/mod/{standard → 05_standard}/set/all/base.rb +0 -0
  277. data/mod/{standard → 05_standard}/set/all/comment.rb +0 -0
  278. data/mod/{standard → 05_standard}/set/all/event_viz.rb +0 -0
  279. data/mod/{standard → 05_standard}/set/all/file.rb +0 -0
  280. data/mod/05_standard/set/all/follow.rb +51 -0
  281. data/mod/05_standard/set/all/history.rb +294 -0
  282. data/mod/{standard → 05_standard}/set/all/json.rb +2 -1
  283. data/mod/05_standard/set/all/observer.rb +27 -0
  284. data/mod/{standard → 05_standard}/set/all/rich_html.rb +21 -28
  285. data/mod/{standard → 05_standard}/set/all/rss.rb +0 -0
  286. data/mod/{standard → 05_standard}/set/all/text.rb +0 -0
  287. data/mod/{standard → 05_standard}/set/right/account.rb +53 -7
  288. data/mod/{standard → 05_standard}/set/right/email.rb +0 -1
  289. data/mod/{standard → 05_standard}/set/right/password.rb +1 -1
  290. data/mod/{standard → 05_standard}/set/right/salt.rb +0 -0
  291. data/mod/{standard → 05_standard}/set/right/stats.rb +1 -1
  292. data/mod/{standard → 05_standard}/set/right/status.rb +0 -0
  293. data/mod/{standard → 05_standard}/set/right/token.rb +0 -0
  294. data/mod/{standard → 05_standard}/set/right/when_created.rb +0 -0
  295. data/mod/{standard → 05_standard}/set/right/when_last_edited.rb +0 -0
  296. data/mod/{standard → 05_standard}/set/rstar/rules.rb +8 -7
  297. data/mod/{standard → 05_standard}/set/self/account_links.rb +0 -0
  298. data/mod/{standard → 05_standard}/set/self/alerts.rb +0 -0
  299. data/mod/{standard → 05_standard}/set/self/all.rb +1 -1
  300. data/mod/{standard → 05_standard}/set/self/foot.rb +0 -0
  301. data/mod/{standard → 05_standard}/set/self/head.rb +21 -6
  302. data/mod/{standard → 05_standard}/set/self/navbox.rb +0 -0
  303. data/mod/{standard → 05_standard}/set/self/now.rb +0 -0
  304. data/mod/{standard → 05_standard}/set/self/recent.rb +0 -0
  305. data/mod/{standard → 05_standard}/set/self/search.rb +0 -0
  306. data/mod/{standard → 05_standard}/set/self/signin.rb +1 -1
  307. data/mod/{standard → 05_standard}/set/self/stats.rb +2 -2
  308. data/mod/{standard → 05_standard}/set/self/version.rb +0 -0
  309. data/mod/{standard → 05_standard}/set/type/basic.rb +0 -0
  310. data/mod/{standard → 05_standard}/set/type/cardtype.rb +4 -6
  311. data/mod/{standard → 05_standard}/set/type/date.rb +0 -0
  312. data/mod/{standard → 05_standard}/set/type/file.rb +0 -0
  313. data/mod/{standard → 05_standard}/set/type/html.rb +0 -0
  314. data/mod/{standard → 05_standard}/set/type/image.rb +7 -6
  315. data/mod/{standard → 05_standard}/set/type/layout_type.rb +0 -0
  316. data/mod/{standard → 05_standard}/set/type/number.rb +0 -0
  317. data/mod/{standard → 05_standard}/set/type/phrase.rb +0 -0
  318. data/mod/{standard → 05_standard}/set/type/search_type.rb +6 -3
  319. data/mod/{standard → 05_standard}/set/type/set.rb +16 -9
  320. data/mod/{standard → 05_standard}/set/type/signup.rb +16 -17
  321. data/mod/{standard → 05_standard}/set/type/toggle.rb +0 -0
  322. data/mod/{standard → 05_standard}/set/type/user.rb +10 -11
  323. data/{spec/mod/standard → mod/05_standard/spec}/chunk/include_spec.rb +39 -39
  324. data/mod/05_standard/spec/chunk/link_spec.rb +61 -0
  325. data/{spec/mod/standard → mod/05_standard/spec}/format/css_format_spec.rb +0 -0
  326. data/{spec/mod/standard → mod/05_standard/spec}/format/csv_format_spec.rb +0 -0
  327. data/{spec/mod/standard → mod/05_standard/spec}/format/email_html_format_spec.rb +0 -0
  328. data/{spec/mod/standard → mod/05_standard/spec}/format/file_format_spec.rb +0 -0
  329. data/{spec/mod/standard → mod/05_standard/spec}/format/js_format_spec.rb +0 -0
  330. data/{spec/mod/standard → mod/05_standard/spec}/format/json_format_spec.rb +0 -0
  331. data/{spec/mod/standard → mod/05_standard/spec}/format/rss_format_spec.rb +0 -0
  332. data/{spec/mod/standard → mod/05_standard/spec}/format/xml_format_spec.rb +0 -0
  333. data/{spec/mod/standard → mod/05_standard/spec}/set/all/account_spec.rb +16 -16
  334. data/{spec/mod/standard → mod/05_standard/spec}/set/all/all_css_spec.rb +1 -1
  335. data/{spec/mod/standard → mod/05_standard/spec}/set/all/all_csv_spec.rb +1 -1
  336. data/{spec/mod/standard → mod/05_standard/spec}/set/all/attach_spec.rb +1 -1
  337. data/{spec/mod/standard → mod/05_standard/spec}/set/all/base_spec.rb +10 -10
  338. data/{spec/mod/standard → mod/05_standard/spec}/set/all/comment_spec.rb +0 -0
  339. data/mod/05_standard/spec/set/all/email_html_spec.rb +15 -0
  340. data/{spec/mod/standard → mod/05_standard/spec}/set/all/event_viz_spec.rb +1 -1
  341. data/{spec/mod/standard → mod/05_standard/spec}/set/all/file_spec.rb +0 -0
  342. data/mod/05_standard/spec/set/all/follow_spec.rb +83 -0
  343. data/mod/05_standard/spec/set/all/history_spec.rb +161 -0
  344. data/{spec/mod/standard → mod/05_standard/spec}/set/all/json_spec.rb +4 -4
  345. data/mod/05_standard/spec/set/all/observer_spec.rb +74 -0
  346. data/{spec/mod/standard → mod/05_standard/spec}/set/all/rich_html_spec.rb +14 -14
  347. data/{spec/mod/standard → mod/05_standard/spec}/set/all/rss_spec.rb +1 -1
  348. data/{spec/mod/standard → mod/05_standard/spec}/set/all/text_spec.rb +0 -0
  349. data/mod/05_standard/spec/set/right/account_spec.rb +162 -0
  350. data/{spec/mod/standard → mod/05_standard/spec}/set/right/email_spec.rb +7 -7
  351. data/{spec/mod/standard → mod/05_standard/spec}/set/right/password_spec.rb +7 -7
  352. data/{spec/mod/standard → mod/05_standard/spec}/set/right/salt_spec.rb +0 -0
  353. data/{spec/mod/standard → mod/05_standard/spec}/set/right/stats_spec.rb +0 -0
  354. data/{spec/mod/standard → mod/05_standard/spec}/set/right/status_spec.rb +0 -0
  355. data/{spec/mod/standard → mod/05_standard/spec}/set/right/token_spec.rb +0 -0
  356. data/{spec/mod/standard → mod/05_standard/spec}/set/right/when_created_spec.rb +1 -1
  357. data/{spec/mod/standard → mod/05_standard/spec}/set/right/when_last_edited_spec.rb +1 -1
  358. data/{spec/mod/standard → mod/05_standard/spec}/set/rstar/rules_spec.rb +4 -4
  359. data/{spec/mod/standard → mod/05_standard/spec}/set/self/account_links_spec.rb +0 -0
  360. data/{spec/mod/standard → mod/05_standard/spec}/set/self/alerts_spec.rb +0 -0
  361. data/{spec/mod/standard → mod/05_standard/spec}/set/self/all_spec.rb +7 -6
  362. data/{spec/mod/standard → mod/05_standard/spec}/set/self/foot_spec.rb +0 -0
  363. data/{spec/mod/standard → mod/05_standard/spec}/set/self/head_spec.rb +0 -0
  364. data/{spec/mod/standard → mod/05_standard/spec}/set/self/navbox_spec.rb +0 -0
  365. data/{spec/mod/standard → mod/05_standard/spec}/set/self/now_spec.rb +1 -1
  366. data/{spec/mod/standard → mod/05_standard/spec}/set/self/recent_spec.rb +0 -0
  367. data/{spec/mod/standard → mod/05_standard/spec}/set/self/search_spec.rb +0 -0
  368. data/{spec/mod/standard → mod/05_standard/spec}/set/self/signin_spec.rb +12 -12
  369. data/{spec/mod/standard → mod/05_standard/spec}/set/self/stats_spec.rb +0 -0
  370. data/{spec/mod/standard → mod/05_standard/spec}/set/self/version_spec.rb +1 -1
  371. data/{spec/mod/standard → mod/05_standard/spec}/set/type/basic_spec.rb +0 -0
  372. data/{spec/mod/standard → mod/05_standard/spec}/set/type/cardtype_spec.rb +0 -0
  373. data/{spec/mod/standard → mod/05_standard/spec}/set/type/date_spec.rb +0 -0
  374. data/mod/05_standard/spec/set/type/email_template_spec.rb +130 -0
  375. data/{spec/mod/standard → mod/05_standard/spec}/set/type/file_spec.rb +0 -0
  376. data/{spec/mod/standard → mod/05_standard/spec}/set/type/html_spec.rb +3 -3
  377. data/{spec/mod/standard → mod/05_standard/spec}/set/type/image_spec.rb +1 -1
  378. data/{spec/mod/standard → mod/05_standard/spec}/set/type/layout_type_spec.rb +1 -1
  379. data/{spec/mod/standard → mod/05_standard/spec}/set/type/number_spec.rb +0 -0
  380. data/{spec/mod/standard → mod/05_standard/spec}/set/type/phrase_spec.rb +0 -0
  381. data/mod/05_standard/spec/set/type/search_type_spec.rb +27 -0
  382. data/mod/05_standard/spec/set/type/set_spec.rb +26 -0
  383. data/mod/05_standard/spec/set/type/signup_spec.rb +209 -0
  384. data/{spec/mod/standard → mod/05_standard/spec}/set/type/toggle_spec.rb +2 -2
  385. data/{spec/mod/standard → mod/05_standard/spec}/set/type/user_spec.rb +0 -0
  386. data/mod/{standard → 06_email}/format/email_html_format.rb +0 -0
  387. data/mod/06_email/format/email_text_format.rb +7 -0
  388. data/mod/06_email/set/all/email_html.rb +9 -0
  389. data/mod/{standard/set/all/email_html.rb → 06_email/set/all/email_text.rb} +2 -1
  390. data/mod/06_email/set/right/bcc.rb +31 -0
  391. data/mod/06_email/set/right/cc.rb +2 -0
  392. data/mod/06_email/set/right/from.rb +2 -0
  393. data/mod/06_email/set/right/html_message.rb +3 -0
  394. data/mod/06_email/set/right/to.rb +2 -0
  395. data/mod/06_email/set/type/email_template.rb +99 -0
  396. data/spec/controllers/card_controller_spec.rb +34 -46
  397. data/spec/lib/card/action_spec.rb +14 -0
  398. data/spec/lib/card/chunk_spec.rb +3 -3
  399. data/spec/lib/card/codename_spec.rb +5 -5
  400. data/spec/lib/card/content_spec.rb +25 -25
  401. data/spec/lib/card/diff_spec.rb +107 -107
  402. data/spec/lib/card/format_spec.rb +11 -11
  403. data/spec/lib/card/loader_spec.rb +35 -29
  404. data/spec/lib/card/name_spec.rb +82 -82
  405. data/spec/lib/card/query_spec.rb +83 -82
  406. data/spec/lib/card/reference_spec.rb +30 -30
  407. data/spec/lib/card/set_pattern_spec.rb +1 -1
  408. data/spec/lib/card/set_spec.rb +86 -82
  409. data/spec/lib/wagn/cache_spec.rb +24 -24
  410. data/spec/mailers/mailer_spec.rb +41 -30
  411. data/spec/models/card/cardtype_spec.rb +19 -19
  412. data/spec/models/card/create_spec.rb +14 -14
  413. data/spec/models/card/trash_spec.rb +37 -36
  414. data/spec/models/card/type_transition_spec.rb +13 -13
  415. data/spec/models/card/validation_spec.rb +6 -6
  416. data/spec/models/card_spec.rb +40 -39
  417. data/spec/spec_helper.rb +37 -11
  418. data/test/fixtures/card_actions.yml +4726 -0
  419. data/test/fixtures/card_acts.yml +589 -0
  420. data/test/fixtures/card_changes.yml +12644 -0
  421. data/test/fixtures/card_references.yml +976 -591
  422. data/test/fixtures/cards.yml +4544 -2781
  423. data/test/seed.rb +14 -13
  424. data/wagn.gemspec +4 -0
  425. metadata +404 -403
  426. data/db/bootstrap/card_revisions.yml +0 -3379
  427. data/lib/card/flexmail.rb +0 -53
  428. data/lib/card/mailer/change_notice.html.erb +0 -32
  429. data/lib/card/mailer/confirmation_email.html.erb +0 -12
  430. data/lib/card/mailer/flexmail.html.erb +0 -6
  431. data/lib/card/mailer/password_reset.html.erb +0 -9
  432. data/lib/card/mailer/signup_alert.html.erb +0 -14
  433. data/lib/card/revision.rb +0 -47
  434. data/lib/wagn/migration_helper.rb +0 -34
  435. data/mod/core/set/all/attribute_tracking.rb +0 -85
  436. data/mod/core/set/all/content.rb +0 -94
  437. data/mod/standard/set/all/flexmail.rb +0 -3
  438. data/mod/standard/set/all/follow.rb +0 -119
  439. data/mod/standard/set/all/history.rb +0 -107
  440. data/mod/standard/set/right/add_help.rb +0 -3
  441. data/mod/standard/set/right/default.rb +0 -3
  442. data/mod/standard/set/right/help.rb +0 -3
  443. data/spec/lib/card/flexmail_spec.rb +0 -209
  444. data/spec/lib/card/revision_spec.rb +0 -30
  445. data/spec/mod/core/chunk/literal_spec.rb +0 -14
  446. data/spec/mod/core/set/all/attribute_tracking_spec.rb +0 -21
  447. data/spec/mod/core/set/all/collection_spec.rb +0 -45
  448. data/spec/mod/core/set/all/content_spec.rb +0 -14
  449. data/spec/mod/core/set/all/rules_spec.rb +0 -98
  450. data/spec/mod/standard/chunk/link_spec.rb +0 -59
  451. data/spec/mod/standard/set/all/email_html_spec.rb +0 -13
  452. data/spec/mod/standard/set/all/flexmail_spec.rb +0 -5
  453. data/spec/mod/standard/set/all/follow_spec.rb +0 -95
  454. data/spec/mod/standard/set/all/history_spec.rb +0 -10
  455. data/spec/mod/standard/set/right/account_spec.rb +0 -90
  456. data/spec/mod/standard/set/type/search_type_spec.rb +0 -27
  457. data/spec/mod/standard/set/type/set_spec.rb +0 -26
  458. data/spec/mod/standard/set/type/signup_spec.rb +0 -169
  459. data/test/fixtures/card_revisions.yml +0 -4560
@@ -14,8 +14,13 @@ module Wagn
14
14
  end
15
15
 
16
16
  def schema_stamp_path type
17
- stamp_dir = ENV['SCHEMA_STAMP_PATH'] || File.join( Wagn.gem_root, 'config' )
18
- File.join stamp_dir, "version#{ '_cards' if type.to_s =~ /card/ }.txt"
17
+ stamp_dir = ENV['SCHEMA_STAMP_PATH'] || if type.to_s =~ /deck/
18
+ File.join( Wagn.root, 'config' )
19
+ else
20
+ File.join( Wagn.gem_root, 'config' )
21
+ end
22
+
23
+ File.join stamp_dir, "version#{ '_cards' if type.to_s =~ /card|deck/ }.txt"
19
24
  end
20
25
 
21
26
  end
File without changes
File without changes
File without changes
@@ -5,15 +5,27 @@ module Card::Chunk
5
5
 
6
6
  def referee_name
7
7
  return if name.nil?
8
-
9
- @referee_name ||= ( render_obj name ).to_name
8
+
9
+ @referee_name ||= begin
10
+ rendered_name = render_obj( name )
11
+ ref_card = case rendered_name
12
+ when /^\~(\d+)$/ # get by id
13
+ Card.fetch $1.to_i
14
+ when /^\:(\w+)$/ # get by codename
15
+ Card.fetch $1.to_sym
16
+ end
17
+ if ref_card
18
+ ref_card.cardname
19
+ else
20
+ rendered_name.to_name
21
+ end
22
+ end
10
23
  @referee_name = @referee_name.to_absolute(card.cardname).to_name
11
24
  end
12
25
 
13
26
  def referee_card
14
27
  @referee_card ||= referee_name && Card.fetch( referee_name )
15
28
  end
16
-
17
29
  def referee_id
18
30
  referee_card and referee_card.id
19
31
  end
File without changes
@@ -255,11 +255,14 @@ class Card
255
255
  def content_field form, options={}
256
256
  @form = form
257
257
  @nested = options[:nested]
258
+ card.last_action_id_before_edit = card.last_action_id
258
259
  revision_tracking = if card && !card.new_card? && !options[:skip_rev_id]
259
- form.hidden_field :current_revision_id, :class=>'current_revision_id'
260
+ form.hidden_field :last_action_id_before_edit, :class=>'current_revision_id'
261
+ #hidden_field_tag 'card[last_action_id_before_edit]', card.last_action_id, :class=>'current_revision_id'
260
262
  end
261
263
  %{
262
- #{ revision_tracking }
264
+ #{ revision_tracking
265
+ }
263
266
  #{ _render_editor options }
264
267
  }
265
268
  end
File without changes
File without changes
File without changes
File without changes
@@ -1,6 +1,5 @@
1
1
 
2
2
  module ClassMethods
3
-
4
3
  def search spec
5
4
  results = ::Card::Query.new(spec).run
6
5
  if block_given? and Array===results
@@ -28,6 +27,36 @@ def item_type
28
27
  nil
29
28
  end
30
29
 
30
+ def include_item? cardname
31
+ ::Set.new(item_names).member? cardname
32
+ end
33
+
34
+ def extended_item_cards context = nil
35
+ context = (context ? context.cardname : self.cardname)
36
+ args={ :limit=>'' }
37
+ items = self.item_cards(args.merge(:context=>context))
38
+ extended_list = []
39
+ already_extended = ::Set.new # avoid loops
40
+
41
+ while items.size > 0
42
+ item = items.shift
43
+ if already_extended.include? item
44
+ next
45
+ elsif item.item_cards == [item] # no further level of items
46
+ extended_list << item
47
+ already_extended << item
48
+ else
49
+ items.unshift(*item.item_cards) # keep items in order
50
+ already_extended << item
51
+ end
52
+ end
53
+ extended_list
54
+ end
55
+
56
+ def extended_item_contents context = nil
57
+ extended_item_cards(context).map(&:item_names).flatten
58
+ end
59
+
31
60
  def extended_list context = nil
32
61
  context = (context ? context.cardname : self.cardname)
33
62
  args={ :limit=>'' }
@@ -41,10 +70,9 @@ def extended_list context = nil
41
70
  # this could go on and on. more elegant to recurse until you don't have a collection
42
71
  end
43
72
 
44
- def contextual_content context_card, format_args={}
45
- format_args[:not_current] = true
73
+ def contextual_content context_card, format_args={}, view_args={}
46
74
  context_card.format(format_args).process_content(
47
- self.format(:not_current=>true)._render_raw
75
+ self.format(format_args)._render_raw(view_args), view_args
48
76
  )
49
77
  end
50
78
 
@@ -84,4 +112,4 @@ format do
84
112
  end
85
113
  end
86
114
  end
87
- end
115
+ end
@@ -0,0 +1,144 @@
1
+ ::Card.error_codes[:conflict] = [:conflict, 409]
2
+
3
+ def content
4
+ if @selected_action_id
5
+ @selected_content ||= begin
6
+ change = last_change_on( :db_content, :not_after=> @selected_action_id ) and change.value
7
+ end
8
+ else
9
+ db_content or (new_card? && template.db_content)
10
+ end
11
+ end
12
+
13
+ def content=(value)
14
+ @selected_content = nil
15
+ self.db_content = value
16
+ end
17
+
18
+ def raw_content
19
+ structure ? template.db_content : db_content
20
+ end
21
+
22
+ def chunk_list #override to customize by set
23
+ :default
24
+ end
25
+
26
+ def last_change_on(field, opts={})
27
+ where_sql = 'card_actions.card_id = :card_id AND field = :field AND (draft = 0 OR draft IS NULL)'
28
+ where_sql += if opts[:before]
29
+ 'AND card_action_id < :action_id'
30
+ elsif opts[:not_after]
31
+ 'AND card_action_id <= :action_id'
32
+ else
33
+ ''
34
+ end
35
+
36
+ action_arg = opts[:before] || opts[:not_after]
37
+ action_id = (action_arg.kind_of?(Card::Action) && action_arg.id) or action_arg
38
+ field_index = Card::TRACKED_FIELDS.index(field.to_s)
39
+ Change.joins(:action).where( where_sql,
40
+ {:card_id=>id, :field=>field_index, :action_id=>action_id}
41
+ ).order(:id).last
42
+ end
43
+
44
+ def selected_action_id
45
+ @selected_action_id || (@current_action and @current_action.id) || last_action_id
46
+ end
47
+
48
+ def selected_action_id= action_id
49
+ @selected_content = nil
50
+ @selected_action_id = action_id
51
+ end
52
+
53
+ def selected_action
54
+ selected_action_id and Action.fetch(selected_action_id)
55
+ end
56
+
57
+ def selected_content_action_id
58
+ @selected_action_id ||
59
+ (@current_action and @current_action.new_content? and @current_action.id) ||
60
+ last_content_action_id
61
+ end
62
+
63
+ def last_action_id
64
+ last_action and last_action.id
65
+ end
66
+ def last_action
67
+ actions.where('id IS NOT NULL').last
68
+ end
69
+ def last_content_action
70
+ l_c = last_change_on(:db_content) and l_c.action
71
+ end
72
+ def last_content_action_id
73
+ l_c = last_change_on(:db_content) and l_c.card_action_id
74
+ end
75
+
76
+
77
+ def previous_action action_id
78
+ if action_id
79
+ action_index = actions.find_index do |a|
80
+ a.id == action_id
81
+ end
82
+ actions[action_index - 1] if action_index.to_i != 0
83
+ end
84
+ end
85
+
86
+ def revised_at
87
+ (last_action and act=last_action.act and act.acted_at) or Time.now
88
+ end
89
+
90
+ def creator
91
+ Card[ creator_id ]
92
+ end
93
+
94
+ def updater
95
+ Card[ updater_id ]
96
+ end
97
+
98
+ def clean_html?
99
+ true
100
+ end
101
+
102
+
103
+ def draft_acts
104
+ drafts.created_by(Card::Auth.current_id).map(&:act)
105
+ end
106
+
107
+ def save_content_draft( content )
108
+ clear_drafts
109
+ acts.create do |act|
110
+ act.actions.build(:draft => true, :card_id=>id).changes.build(:field=>:db_content, :value=>content)
111
+ end
112
+ end
113
+
114
+ def clear_drafts
115
+ drafts.created_by(Card::Auth.current_id).each do |draft|
116
+ draft.delete
117
+ end
118
+ end
119
+
120
+
121
+ event :save_draft, :before=>:store, :on=>:update, :when=>proc{ |c| Env.params['draft'] == 'true' } do
122
+ save_content_draft content
123
+ abort :success
124
+ end
125
+
126
+
127
+ event :set_default_content, :on=>:create, :before=>:approve do
128
+ if !db_content_changed? and template and template.db_content.present?
129
+ self.db_content = template.db_content
130
+ end
131
+ end
132
+
133
+ event :protect_structured_content, :before=>:approve, :on=>:update, :changed=>:db_content do
134
+ if structure
135
+ errors.add :content, "can't change; structured by #{template.name}"
136
+ end
137
+ end
138
+
139
+
140
+ event :detect_conflict, :before=>:approve, :on=>:update do
141
+ if last_action_id_before_edit and last_action_id_before_edit.to_i != last_action_id and last_action.act.actor_id != Auth.current_id
142
+ errors.add :conflict, "changes not based on latest revision"
143
+ end
144
+ end
@@ -0,0 +1,11 @@
1
+ format do
2
+ def render_erb locals={}, template=nil, a_binding=nil, &block
3
+ template ||= block.call
4
+ a_binding ||= binding
5
+ locals.each do |k,v|
6
+ #a_binding.local_variable_set(k, v) # needs ruby 2.1
7
+ instance_variable_set("@#{k}",v)
8
+ end
9
+ ERB.new(template,nil,'-').result(binding)
10
+ end
11
+ end
@@ -21,7 +21,14 @@ module ClassMethods
21
21
 
22
22
 
23
23
  def fetch mark, opts={}
24
-
24
+ if String === mark
25
+ case mark
26
+ when /^\~(\d+)$/ # get by id
27
+ mark = $1.to_i
28
+ when /^\:(\w+)$/ # get by codename
29
+ mark = $1.to_sym
30
+ end
31
+ end
25
32
  mark = Card::Codename[mark] if Symbol === mark # id from codename
26
33
 
27
34
  if mark.present?
@@ -0,0 +1,7 @@
1
+ format do
2
+ def render_haml locals={}, template=nil, a_binding=nil, &block
3
+ template ||= block.call
4
+ a_binding ||= binding
5
+ ::Haml::Engine.new(template).render(a_binding, locals)
6
+ end
7
+ end
@@ -20,6 +20,8 @@ def initialize args={}
20
20
  :type_code => args.delete('type_code'),
21
21
  :type_id => args[ 'type_id' ]
22
22
  }
23
+
24
+ args['db_content'] = args.delete('content') if args['content']
23
25
 
24
26
  #FIXME -- too much of the above is duplicated by assign_attributes (tracked_attributes.rb)
25
27
 
@@ -27,11 +29,11 @@ def initialize args={}
27
29
  skip_modules = args.delete 'skip_modules'
28
30
 
29
31
  super args # ActiveRecord #initialize
30
-
32
+
31
33
  if tid = get_type_id( @type_args )
32
34
  self.type_id = tid
33
35
  end
34
-
36
+
35
37
  include_set_modules unless skip_modules
36
38
  self
37
39
  end
@@ -195,7 +195,7 @@ event :set_name, :before=>:store, :changed=>:name do
195
195
  suspend_name(sidename) if old_name_in_way
196
196
  send "#{side}_id=", begin
197
197
  if !sidecard || old_name_in_way
198
- Card.create! :name=>sidename
198
+ Card.create! :name=>sidename, :supercard => self
199
199
  else
200
200
  sidecard
201
201
  end.id
@@ -213,7 +213,6 @@ event :rename, :after=>:set_name, :on=>:update do
213
213
  existing_card.rename_without_callbacks
214
214
  existing_card.save!
215
215
  end
216
- @name_or_content_changed=true
217
216
  end
218
217
 
219
218
  def suspend_name(name)
@@ -259,7 +258,7 @@ event :cascade_name_changes, :after=>:store, :on=>:update, :changed=>:name do
259
258
  Rails.logger.debug "------------------ UPDATE REFERER #{card.name} ------------------------"
260
259
  unless card == self or card.structure
261
260
  card = card.refresh
262
- card.content = card.replace_references name_was, name
261
+ card.db_content = card.replace_references name_was, name
263
262
  card.save!
264
263
  end
265
264
  end
@@ -0,0 +1,215 @@
1
+
2
+ class FollowerStash
3
+ def initialize card=nil
4
+ @followed_affected_cards = Hash.new { |h,v| h[v]=[] }
5
+ @visited = ::Set.new
6
+ add_affected_card(card) if card
7
+ end
8
+
9
+ def add_affected_card card
10
+ Auth.as_bot do
11
+ if !@visited.include? card.name
12
+ @visited.add card.name
13
+ # add card followers
14
+ Card.search( :right_plus=>[{:codename=> "following"},
15
+ {:link_to=>card.name} ]
16
+ ).each do |follower|
17
+ notify follower, :of => card.name
18
+ end
19
+ # add cardtype followers
20
+ Card.search( :right_plus=>[{:codename=> "following"},
21
+ {:link_to=>card.type_name} ]
22
+ ).each do |follower|
23
+ notify follower, :of => card.type_name
24
+ end
25
+ Card.search(:include=>card.name).each do |includer|
26
+ add_affected_card includer unless @visited.include? includer.name
27
+ end
28
+ if card.left and !@visited.include?(card.left.name) and
29
+ includee_set = Card.search(:included_by=>card.left.name).map(&:name) and
30
+ !@visited.intersection(includee_set).empty?
31
+ add_affected_card card.left
32
+ end
33
+ end
34
+ end
35
+ end
36
+
37
+ def followers
38
+ @followed_affected_cards.keys
39
+ end
40
+
41
+ def each_follower_followed_pair # "follower" is a card object, "followed" a card name
42
+ @followed_affected_cards.each do |user, card_names|
43
+ yield(user,card_names.first)
44
+ end
45
+ end
46
+
47
+ private
48
+
49
+ def notify follower, because
50
+ @followed_affected_cards[follower] << because[:of]
51
+ end
52
+
53
+ end
54
+
55
+ def act_card
56
+ @supercard || self
57
+ end
58
+
59
+ event :stash_followers, :after=>:approve, :on=>:delete do
60
+ act_card.follower_stash ||= FollowerStash.new
61
+ act_card.follower_stash.add_affected_card self
62
+ end
63
+
64
+ event :notify_followers, :after=>:extend, :when=>proc{ |c|
65
+ !c.supercard and c.current_act and Card::Auth.current_id != WagnBotID
66
+ } do
67
+
68
+ begin
69
+ @current_act.reload
70
+ @follower_stash ||= FollowerStash.new
71
+ @current_act.actions.each do |a|
72
+ @follower_stash.add_affected_card a.card
73
+ end
74
+ @follower_stash.each_follower_followed_pair do |follower, followed|
75
+ if follower.account and follower != @current_act.actor
76
+ follower.account.send_change_notice @current_act, followed
77
+ end
78
+ end
79
+ rescue =>e #this error handling should apply to all extend callback exceptions
80
+ Airbrake.notify e if Airbrake.configuration.api_key
81
+ Rails.logger.info "\nController exception: #{e.message}"
82
+ Rails.logger.debug "BT: #{e.backtrace*"\n"}"
83
+ end
84
+ end
85
+
86
+ format do
87
+ view :list_of_changes, :denial=>:blank do |args|
88
+ action = get_action(args)
89
+
90
+ relevant_fields = case action.action_type
91
+ when :create then [:cardtype, :content]
92
+ when :update then [:name, :cardtype, :content]
93
+ when :delete then [:content]
94
+ end
95
+
96
+ relevant_fields.map do |type|
97
+ edit_info_for(type, action)
98
+ end.compact.join
99
+ end
100
+
101
+
102
+ view :subedits do |args|
103
+ subedits = get_act(args).relevant_actions_for(card).map do |action|
104
+ if action.card_id != card.id
105
+ action.card.format(:format=>@format).render_subedit_notice(:action=>action)
106
+ end
107
+ end.compact.join
108
+
109
+ if subedits.present?
110
+ wrap_subedits subedits
111
+ else
112
+ ''
113
+ end
114
+ end
115
+
116
+ view :subedit_notice, :denial=>:blank do |args|
117
+ action = get_action(args)
118
+ name_before_action = (action.new_values[:name] && action.old_values[:name]) || card.name
119
+
120
+ wrap_subedit_item %{#{name_before_action} #{action.action_type}d
121
+ #{ render_list_of_changes(args) }}
122
+ end
123
+
124
+ view :followed do |args|
125
+ args[:followed] || 'followed card'
126
+ end
127
+
128
+ view :follower do |args|
129
+ args[:follower] || 'follower'
130
+ end
131
+
132
+ view :unfollow_url do |args|
133
+ if args[:followed] and args[:follower] and follower = Card.fetch( args[:follower] )
134
+ following_card = follower.fetch( :trait=>:following, :new=>{} )
135
+ wagn_url( "update/#{following_card.cardname.url_key}?drop_item=#{args[:followed].to_name.url_key}" )
136
+ end
137
+ end
138
+
139
+ def edit_info_for field, action
140
+ return nil unless action.new_values[field]
141
+
142
+ item_title = case action.action_type
143
+ when :update then 'new '
144
+ when :delete then 'deleted '
145
+ else ''
146
+ end
147
+ item_title += "#{field}: "
148
+
149
+ item_value = if action.action_type == :delete
150
+ action.old_values[field]
151
+ else
152
+ action.new_values[field]
153
+ end
154
+
155
+ wrap_list_item "#{item_title}#{item_value}"
156
+ end
157
+
158
+ def get_act args
159
+ @notification_act ||= args[:act] || (args[:act_id] and Act.find(args[:act_id])) || card.acts.last
160
+ end
161
+
162
+ def get_action args
163
+ args[:action] || (args[:action_id] and Action.fetch(args[:action_id])) || card.last_action
164
+ end
165
+
166
+
167
+ def wrap_subedits subedits
168
+ "\nThis update included the following changes:#{wrap_list subedits}"
169
+ end
170
+
171
+ def wrap_list list
172
+ "\n#{list}\n"
173
+ end
174
+
175
+ def wrap_list_item item
176
+ " #{item}\n"
177
+ end
178
+
179
+ def wrap_subedit_item text
180
+ "\n#{text}\n"
181
+ end
182
+ end
183
+
184
+
185
+ format :email_text do
186
+ view :last_action do |args|
187
+ act = get_act(args)
188
+ action_on_card = act.action_on(act.card_id) || act.actions.first
189
+ "#{action_on_card.action_type}d"
190
+ end
191
+ end
192
+
193
+ format :email_html do
194
+ view :last_action do |args|
195
+ act = get_act(args)
196
+ action_on_card = act.action_on(act.card_id) || act.actions.first
197
+ "#{action_on_card.action_type}d"
198
+ end
199
+
200
+ def wrap_list list
201
+ "<ul>#{list}</ul>\n"
202
+ end
203
+
204
+ def wrap_list_item item
205
+ "<li>#{item}</li>\n"
206
+ end
207
+
208
+ def wrap_subedit_item text
209
+ "<li>#{text}</li>\n"
210
+ end
211
+ end
212
+
213
+
214
+
215
+