spontaneous 0.2.0.alpha2 → 0.2.0.alpha3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. data/Gemfile +3 -40
  2. data/Rakefile +29 -41
  3. data/Readme.markdown +21 -8
  4. data/application/css/add_alias_dialogue.css.scss +79 -0
  5. data/application/css/{v2.scss → core.css.scss} +537 -550
  6. data/application/css/{definitions.scss → definitions.css.scss} +121 -33
  7. data/application/css/dialogue.css.scss +409 -0
  8. data/application/css/{editing.scss → editing.css.scss} +25 -262
  9. data/application/css/font.css.scss +8 -0
  10. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  11. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  12. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_flat_10_000000_40x100.png +0 -0
  13. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  14. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  15. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  16. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  17. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  18. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  19. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_222222_256x240.png +0 -0
  20. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_228ef1_256x240.png +0 -0
  21. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ef8c08_256x240.png +0 -0
  22. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ffd27a_256x240.png +0 -0
  23. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ffffff_256x240.png +0 -0
  24. data/application/css/jquery-ui-1.8.21.custom/ui-lightness.css.scss +565 -0
  25. data/application/css/{login.scss → login.css.scss} +4 -4
  26. data/application/css/meta.css.scss +331 -0
  27. data/application/css/{popover.scss → popover.css.scss} +9 -8
  28. data/application/css/{schema_error.scss → schema_error.css.scss} +4 -4
  29. data/application/css/spontaneous.css +5 -0
  30. data/application/css/unsupported.css.scss +42 -0
  31. data/application/js/add_alias_dialogue.js +72 -10
  32. data/application/js/ajax.js +50 -16
  33. data/application/js/compatibility.js +19 -15
  34. data/application/js/content.js +39 -36
  35. data/application/js/content_area.js +53 -5
  36. data/application/js/dialogue.js +17 -0
  37. data/application/js/dom.js +1 -1
  38. data/application/js/edit_panel.js +23 -8
  39. data/application/js/extensions.js +7 -2
  40. data/application/js/field_preview.js +2 -1
  41. data/application/js/field_types/date_field.js +11 -8
  42. data/application/js/field_types/file_field.js +188 -9
  43. data/application/js/field_types/image_field.js +46 -29
  44. data/application/js/field_types/markdown_field.js +57 -14
  45. data/application/js/field_types/select_field.js +72 -0
  46. data/application/js/field_types/string_field.js +8 -0
  47. data/application/js/field_types/webvideo_field.js +8 -0
  48. data/application/js/init.js +1 -7
  49. data/application/js/location.js +41 -13
  50. data/application/js/login.js +3 -0
  51. data/application/js/meta_view/user_admin.js +543 -0
  52. data/application/js/meta_view.js +1 -0
  53. data/application/js/metadata.js +20 -0
  54. data/application/js/page.js +17 -3
  55. data/application/js/page_browser.js +40 -30
  56. data/application/js/page_entry.js +4 -0
  57. data/application/js/panel/root_menu.js +66 -0
  58. data/application/js/popover.js +2 -2
  59. data/application/js/preview.js +1 -1
  60. data/application/js/publish.js +138 -30
  61. data/application/js/services.js +43 -0
  62. data/application/js/sharded_upload.js +2 -2
  63. data/application/js/spontaneous.js +64 -5
  64. data/application/js/state.js +20 -9
  65. data/application/js/top_bar.js +273 -150
  66. data/application/js/types.js +20 -15
  67. data/application/js/upload.js +1 -2
  68. data/application/js/user.js +18 -4
  69. data/application/js/vendor/date.js +104 -0
  70. data/application/js/vendor/jquery-ui-1.8.18.custom.min.js +356 -0
  71. data/application/js/views/box_view.js +15 -8
  72. data/application/js/views/page_piece_view.js +11 -8
  73. data/application/js/views/page_view.js +21 -3
  74. data/application/js/views/piece_view.js +19 -10
  75. data/application/js/views.js +3 -0
  76. data/application/static/chromelogo-200x52-45c7cbc93be080bea342df5fcda2ef8b.png +0 -0
  77. data/application/static/dot-texture-9eea29e4ac7ad9a772285252078ec127.png +0 -0
  78. data/application/static/editing-textarea-resize-s-b5af62365eb7e19ea4beccf7242d508e.png +0 -0
  79. data/application/static/editing-texture-1-42b06a3439752490988f30f2a06d5e7c.png +0 -0
  80. data/application/static/font/fontawesome-webfont-5c5c21100a346972a82c34c5e96ffcfe.ttf +0 -0
  81. data/application/static/loop_alt1-white-7894b458528e92216196cae26b4c2c96.svg +12 -0
  82. data/application/static/spontaneous-states-e91ec89db525c62da0105b97cdd781ce.png +0 -0
  83. data/application/views/index.erb +2 -2
  84. data/application/views/login.erb +4 -8
  85. data/application/views/schema_modification_error.html.erb +1 -4
  86. data/application/views/unsupported.erb +9 -7
  87. data/bin/spot +1 -1
  88. data/db/migrations/20110209152710_users_and_groups.rb +10 -10
  89. data/db/migrations/20120305112647_site_modification_time.rb +11 -0
  90. data/db/migrations/20120418153903_add_ownership_of_content.rb +14 -0
  91. data/db/migrations/20120423175416_add_pending_modifications.rb +21 -0
  92. data/db/migrations/20120525164947_add_field_versions.rb +27 -0
  93. data/lib/sequel/plugins/scoped_table_name.rb +10 -1
  94. data/lib/spontaneous/asset/file.rb +25 -0
  95. data/lib/spontaneous/asset/source.rb +28 -0
  96. data/lib/spontaneous/asset.rb +75 -0
  97. data/lib/spontaneous/box.rb +6 -4
  98. data/lib/spontaneous/capistrano/deploy.rb +47 -0
  99. data/lib/spontaneous/capistrano/sync.rb +81 -0
  100. data/lib/spontaneous/capistrano.rb +13 -0
  101. data/lib/spontaneous/change.rb +60 -68
  102. data/lib/spontaneous/cli/assets.rb +29 -0
  103. data/lib/spontaneous/cli/base.rb +0 -48
  104. data/lib/spontaneous/cli/console.rb +1 -1
  105. data/lib/spontaneous/cli/server.rb +6 -4
  106. data/lib/spontaneous/cli/site.rb +28 -17
  107. data/lib/spontaneous/cli/user.rb +107 -0
  108. data/lib/spontaneous/cli.rb +100 -4
  109. data/lib/spontaneous/collections/entry_set.rb +2 -2
  110. data/lib/spontaneous/collections/field_set.rb +48 -22
  111. data/lib/spontaneous/collections/prototype_set.rb +20 -13
  112. data/lib/spontaneous/constants.rb +3 -0
  113. data/lib/spontaneous/content.rb +22 -5
  114. data/lib/spontaneous/errors.rb +3 -3
  115. data/lib/spontaneous/extensions/array.rb +12 -0
  116. data/lib/spontaneous/extensions/enumerable.rb +30 -0
  117. data/lib/spontaneous/extensions/nil.rb +3 -1
  118. data/lib/spontaneous/extensions/string.rb +16 -0
  119. data/lib/spontaneous/field_types/date_field.rb +45 -2
  120. data/lib/spontaneous/field_types/field.rb +42 -9
  121. data/lib/spontaneous/field_types/file_field.rb +68 -0
  122. data/lib/spontaneous/field_types/image_field.rb +63 -0
  123. data/lib/spontaneous/field_types/select_field.rb +109 -0
  124. data/lib/spontaneous/field_types/string_field.rb +6 -1
  125. data/lib/spontaneous/field_types/webvideo_field.rb +85 -27
  126. data/lib/spontaneous/field_types.rb +1 -1
  127. data/lib/spontaneous/field_version.rb +8 -0
  128. data/lib/spontaneous/generators/page.rb +1 -1
  129. data/lib/spontaneous/generators/site/Capfile.tt +1 -4
  130. data/lib/spontaneous/generators/site/Gemfile.tt +13 -6
  131. data/lib/spontaneous/generators/site/config/deploy.rb.tt +28 -0
  132. data/lib/spontaneous/generators/site/config/environments/production.rb.tt +7 -2
  133. data/lib/spontaneous/generators/site.rb +1 -0
  134. data/lib/spontaneous/json.rb +34 -11
  135. data/lib/spontaneous/layout.rb +22 -0
  136. data/lib/spontaneous/media/file.rb +4 -0
  137. data/lib/spontaneous/output/assets/compression.rb +58 -0
  138. data/lib/spontaneous/output/assets.rb +32 -0
  139. data/lib/spontaneous/output/context.rb +179 -0
  140. data/lib/spontaneous/output/format/html.rb +5 -0
  141. data/lib/spontaneous/output/format/plain.rb +5 -0
  142. data/lib/spontaneous/output/format.rb +180 -0
  143. data/lib/spontaneous/output/helpers/classes_helper.rb +18 -0
  144. data/lib/spontaneous/{render/helpers/html_helper.rb → output/helpers/conditional_comment_helper.rb} +3 -12
  145. data/lib/spontaneous/output/helpers/script_helper.rb +73 -0
  146. data/lib/spontaneous/output/helpers/stylesheet_helper.rb +61 -0
  147. data/lib/spontaneous/output/helpers.rb +28 -0
  148. data/lib/spontaneous/output/template/engine.rb +59 -0
  149. data/lib/spontaneous/output/template/renderer.rb +153 -0
  150. data/lib/spontaneous/output/template.rb +21 -0
  151. data/lib/spontaneous/output.rb +163 -0
  152. data/lib/spontaneous/page.rb +2 -1
  153. data/lib/spontaneous/paths.rb +6 -1
  154. data/lib/spontaneous/permissions/access_key.rb +5 -5
  155. data/lib/spontaneous/permissions/user.rb +81 -35
  156. data/lib/spontaneous/permissions/user_level.rb +26 -22
  157. data/lib/spontaneous/plugins/aliases.rb +76 -12
  158. data/lib/spontaneous/plugins/allowed_types.rb +60 -18
  159. data/lib/spontaneous/plugins/application/paths.rb +0 -28
  160. data/lib/spontaneous/plugins/application/system.rb +35 -0
  161. data/lib/spontaneous/plugins/boxes.rb +4 -0
  162. data/lib/spontaneous/plugins/content_groups.rb +16 -0
  163. data/lib/spontaneous/plugins/entries.rb +50 -30
  164. data/lib/spontaneous/plugins/fields.rb +15 -0
  165. data/lib/spontaneous/plugins/layouts.rb +8 -2
  166. data/lib/spontaneous/plugins/modifications.rb +228 -0
  167. data/lib/spontaneous/plugins/page/formats.rb +67 -42
  168. data/lib/spontaneous/plugins/page/request.rb +10 -0
  169. data/lib/spontaneous/plugins/page/site_timestamps.rb +28 -0
  170. data/lib/spontaneous/plugins/paths.rb +15 -3
  171. data/lib/spontaneous/plugins/publishing.rb +124 -45
  172. data/lib/spontaneous/plugins/render.rb +13 -8
  173. data/lib/spontaneous/plugins/schema_hierarchy.rb +18 -6
  174. data/lib/spontaneous/plugins/site/helpers.rb +53 -0
  175. data/lib/spontaneous/plugins/site/hooks.rb +50 -0
  176. data/lib/spontaneous/plugins/site/map.rb +1 -1
  177. data/lib/spontaneous/plugins/site/paths.rb +13 -0
  178. data/lib/spontaneous/plugins/site/publishing.rb +6 -2
  179. data/lib/spontaneous/plugins/site/{revisions.rb → state.rb} +5 -1
  180. data/lib/spontaneous/plugins/site/storage.rb +4 -0
  181. data/lib/spontaneous/plugins/site/url.rb +15 -0
  182. data/lib/spontaneous/plugins/site_map.rb +13 -3
  183. data/lib/spontaneous/plugins/styles.rb +5 -1
  184. data/lib/spontaneous/plugins/visibility.rb +39 -12
  185. data/lib/spontaneous/prototypes/box_prototype.rb +4 -0
  186. data/lib/spontaneous/prototypes/field_prototype.rb +15 -10
  187. data/lib/spontaneous/publishing/event_client.rb +46 -0
  188. data/lib/spontaneous/publishing/immediate.rb +81 -44
  189. data/lib/spontaneous/publishing/simultaneous.rb +23 -6
  190. data/lib/spontaneous/publishing.rb +4 -3
  191. data/lib/spontaneous/rack/around_back.rb +1 -5
  192. data/lib/spontaneous/rack/around_front.rb +4 -4
  193. data/lib/spontaneous/rack/around_preview.rb +4 -3
  194. data/lib/spontaneous/rack/assets.rb +81 -54
  195. data/lib/spontaneous/rack/authentication.rb +0 -1
  196. data/lib/spontaneous/rack/back.rb +160 -72
  197. data/lib/spontaneous/rack/cookie_authentication.rb +2 -2
  198. data/lib/spontaneous/rack/css.rb +18 -15
  199. data/lib/spontaneous/rack/event_source.rb +9 -21
  200. data/lib/spontaneous/rack/fiber_pool.rb +26 -0
  201. data/lib/spontaneous/rack/front.rb +12 -4
  202. data/lib/spontaneous/rack/helpers.rb +35 -13
  203. data/lib/spontaneous/rack/js.rb +41 -0
  204. data/lib/spontaneous/rack/public.rb +34 -44
  205. data/lib/spontaneous/rack/sse.rb +18 -0
  206. data/lib/spontaneous/rack/static.rb +3 -0
  207. data/lib/spontaneous/rack/user_admin.rb +100 -0
  208. data/lib/spontaneous/rack/user_helpers.rb +1 -1
  209. data/lib/spontaneous/rack.rb +6 -2
  210. data/lib/spontaneous/schema.rb +31 -4
  211. data/lib/spontaneous/search/index.rb +19 -3
  212. data/lib/spontaneous/search/results.rb +1 -1
  213. data/lib/spontaneous/sequel.rb +17 -0
  214. data/lib/spontaneous/site.rb +11 -4
  215. data/lib/spontaneous/state.rb +11 -0
  216. data/lib/spontaneous/storage/cloud.rb +4 -0
  217. data/lib/spontaneous/storage/local.rb +11 -0
  218. data/lib/spontaneous/style.rb +2 -2
  219. data/lib/spontaneous/tasks/database.rake +21 -22
  220. data/lib/spontaneous/utils/database/mysql_dumper.rb +4 -0
  221. data/lib/spontaneous/utils/database/postgres_dumper.rb +78 -0
  222. data/lib/spontaneous/utils/database.rb +6 -3
  223. data/lib/spontaneous/utils/smart_quotes.rb +499 -0
  224. data/lib/spontaneous/utils/smush_it.rb +66 -0
  225. data/lib/spontaneous/utils.rb +3 -1
  226. data/lib/spontaneous/version.rb +2 -2
  227. data/lib/spontaneous.rb +25 -29
  228. data/spontaneous.gemspec +186 -106
  229. data/test/experimental/test_features.rb +1 -1
  230. data/test/fixtures/asset_pipeline/application/css/basic.css.scss +4 -0
  231. data/test/fixtures/asset_pipeline/application/css/complex.css.scss.erb +6 -0
  232. data/test/fixtures/asset_pipeline/application/css/simple.css +3 -0
  233. data/test/fixtures/asset_pipeline/application/css/spontaneous.css +7 -0
  234. data/test/fixtures/asset_pipeline/application/css/subdir/complex.css.scss.erb +6 -0
  235. data/test/fixtures/asset_pipeline/application/css/subdir/library.css.scss +1 -0
  236. data/test/fixtures/asset_pipeline/application/css/subdir/simple.css +3 -0
  237. data/test/fixtures/asset_pipeline/application/js/basic.js.coffee +1 -0
  238. data/test/fixtures/asset_pipeline/application/js/complex.js.coffee.erb +1 -0
  239. data/test/fixtures/asset_pipeline/application/js/login.js +1 -0
  240. data/test/fixtures/asset_pipeline/application/js/require.js +1 -0
  241. data/test/fixtures/asset_pipeline/application/js/simple.js +1 -0
  242. data/test/fixtures/asset_pipeline/application/js/spontaneous.js +5 -0
  243. data/test/fixtures/asset_pipeline/application/js/subdir/complex.js.coffee.erb +1 -0
  244. data/test/fixtures/asset_pipeline/application/js/subdir/library.js.coffee +1 -0
  245. data/test/fixtures/asset_pipeline/application/js/subdir/simple.js +1 -0
  246. data/test/fixtures/asset_pipeline/application/js/vendor/jquery.js +1 -0
  247. data/test/fixtures/asset_pipeline/application/static/dot-texture.png +0 -0
  248. data/test/fixtures/asset_pipeline/application/static/subdir/px.gif +0 -0
  249. data/test/fixtures/assets/public1/css/a.scss +1 -0
  250. data/test/fixtures/assets/public1/js/a.js +1 -0
  251. data/test/fixtures/assets/public1/js/m.coffee +1 -0
  252. data/test/fixtures/assets/public2/css/b.scss +1 -0
  253. data/test/fixtures/assets/public2/css/c.css +1 -0
  254. data/test/fixtures/assets/public2/js/b.js +1 -0
  255. data/test/fixtures/assets/public2/js/c.js +1 -0
  256. data/test/fixtures/assets/public2/js/n.coffee +1 -0
  257. data/test/fixtures/back/config/user_levels.yml +3 -0
  258. data/test/fixtures/back/public/js/coffeescript.coffee +1 -0
  259. data/test/fixtures/back/templates/layouts/standard.css.cut +1 -0
  260. data/test/fixtures/back/templates/layouts/standard.js.cut +1 -0
  261. data/test/fixtures/example_application/config/database.yml +4 -4
  262. data/test/fixtures/helpers/templates/layouts/standard.html.cut +1 -0
  263. data/test/fixtures/helpers/templates/layouts/standard.mobile.cut +1 -0
  264. data/test/fixtures/images/vimlogo.pdf +0 -0
  265. data/test/fixtures/outputs/templates/layouts/standard.atom.cut +1 -0
  266. data/test/fixtures/permissions/config/user_levels.yml +6 -3
  267. data/test/fixtures/serialisation/class_hash.yaml.erb +1 -0
  268. data/test/fixtures/serialisation/root_hash.yaml.erb +2 -2
  269. data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
  270. data/test/fixtures/templates/extended/main.html.cut +5 -5
  271. data/test/fixtures/templates/extended/parent.html.cut +8 -8
  272. data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -1
  273. data/test/fixtures/templates/extended/with_includes.html.cut +6 -6
  274. data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +6 -7
  275. data/test/fixtures/templates/layouts/entries.html.cut +4 -4
  276. data/test/fixtures/templates/layouts/standard.html.cut +1 -0
  277. data/test/fixtures/templates/layouts/variables.html.cut +1 -1
  278. data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -1
  279. data/test/fixtures/templates/publishing/templates/layouts/static.rtf.cut +1 -0
  280. data/test/fixtures/templates/template_class/complex_template.html.cut +2 -2
  281. data/test/fixtures/templates/template_class/complex_template.pdf.cut +2 -2
  282. data/test/fixtures/templates/template_class/default_template_style.html.cut +1 -1
  283. data/test/fixtures/templates/template_class/images_with_template.html.cut +2 -2
  284. data/test/fixtures/templates/template_class/slots_template.html.cut +2 -2
  285. data/test/fixtures/templates/template_class/slots_template.pdf.cut +2 -2
  286. data/test/fixtures/user_manager/config/user_levels.yml +9 -0
  287. data/test/functional/test_application.rb +7 -7
  288. data/test/functional/test_back.rb +352 -97
  289. data/test/functional/test_front.rb +71 -20
  290. data/test/functional/test_user_manager.rb +284 -0
  291. data/test/javascript/env.js +13505 -0
  292. data/test/javascript/test_markdown.rb +43 -3
  293. data/test/support/custom_matchers.rb +3 -2
  294. data/test/test_helper.rb +50 -9
  295. data/test/test_javascript.rb +13 -13
  296. data/test/ui_helper.rb +1 -1
  297. data/test/unit/test_alias.rb +79 -8
  298. data/test/unit/test_asset_bundler.rb +220 -0
  299. data/test/unit/test_assets.rb +213 -0
  300. data/test/unit/test_async.rb +55 -0
  301. data/test/unit/test_authentication.rb +52 -39
  302. data/test/unit/test_boxes.rb +20 -15
  303. data/test/unit/test_changesets.rb +261 -0
  304. data/test/unit/test_content.rb +73 -33
  305. data/test/unit/test_content_inheritance.rb +18 -18
  306. data/test/unit/test_extensions.rb +26 -0
  307. data/test/unit/test_fields.rb +303 -16
  308. data/test/unit/test_formats.rb +267 -34
  309. data/test/unit/test_helpers.rb +79 -2
  310. data/test/unit/test_images.rb +10 -0
  311. data/test/unit/test_layouts.rb +21 -13
  312. data/test/unit/test_modifications.rb +648 -0
  313. data/test/unit/test_page.rb +6 -2
  314. data/test/unit/test_permissions.rb +101 -27
  315. data/test/unit/test_piece.rb +4 -4
  316. data/test/unit/test_plugins.rb +3 -2
  317. data/test/unit/test_publishing.rb +332 -0
  318. data/test/unit/test_render.rb +118 -67
  319. data/test/unit/test_revisions.rb +546 -0
  320. data/test/unit/test_schema.rb +83 -1
  321. data/test/unit/test_search.rb +59 -0
  322. data/test/unit/test_serialisation.rb +2 -47
  323. data/test/unit/test_site.rb +217 -108
  324. data/test/unit/test_storage.rb +26 -0
  325. data/test/unit/test_structure.rb +2 -2
  326. data/test/unit/test_styles.rb +90 -75
  327. data/test/unit/test_table_scoping.rb +21 -17
  328. data/test/unit/test_templates.rb +75 -69
  329. data/test/{slow → unit}/test_visibility.rb +78 -22
  330. metadata +528 -221
  331. data/application/css/add_alias_dialogue.scss +0 -27
  332. data/application/css/min/14c2a35812c443001b15d8b12a4780f88c678035.css +0 -1
  333. data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +0 -1
  334. data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +0 -1
  335. data/application/css/spontaneous.scss +0 -111
  336. data/application/css/unsupported.scss +0 -16
  337. data/application/css/variables.scss +0 -80
  338. data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +0 -3
  339. data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +0 -2
  340. data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +0 -3
  341. data/application/js/min/b8abf302a824c35385ff517b34111e1710ff3b37.js +0 -2
  342. data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +0 -90
  343. data/application/static/diagonal-texture.png +0 -0
  344. data/application/static/editing-0-noise.png +0 -0
  345. data/application/static/editing-1-noise.png +0 -0
  346. data/application/static/editing-texture-1.png +0 -0
  347. data/application/static/editing-texture.png +0 -0
  348. data/application/static/editing-toolbar-shadow-bottom.png +0 -0
  349. data/application/static/editing-toolbar-shadow-top.png +0 -0
  350. data/application/static/inner-glow.png +0 -0
  351. data/application/static/item-buttons-highlight.png +0 -0
  352. data/application/static/item-buttons.png +0 -0
  353. data/application/static/paper-texture-dark.png +0 -0
  354. data/application/static/plus_alt.svg +0 -8
  355. data/application/static/select-arrow-root.png +0 -0
  356. data/application/static/slot-up-arrow.png +0 -0
  357. data/application/static/spontaneous.png +0 -0
  358. data/lib/cutaneous/context_helper.rb +0 -187
  359. data/lib/cutaneous/preview_context.rb +0 -32
  360. data/lib/cutaneous/preview_renderer.rb +0 -10
  361. data/lib/cutaneous/publish_context.rb +0 -10
  362. data/lib/cutaneous/publish_renderer.rb +0 -14
  363. data/lib/cutaneous/publish_template.rb +0 -62
  364. data/lib/cutaneous/publish_token_parser.rb +0 -8
  365. data/lib/cutaneous/renderer.rb +0 -124
  366. data/lib/cutaneous/request_context.rb +0 -9
  367. data/lib/cutaneous/request_renderer.rb +0 -15
  368. data/lib/cutaneous/request_template.rb +0 -11
  369. data/lib/cutaneous/request_token_parser.rb +0 -9
  370. data/lib/cutaneous/token_parser.rb +0 -125
  371. data/lib/cutaneous.rb +0 -48
  372. data/lib/spontaneous/render/context_base.rb +0 -143
  373. data/lib/spontaneous/render/development_renderer.rb +0 -14
  374. data/lib/spontaneous/render/engine.rb +0 -19
  375. data/lib/spontaneous/render/format/html.rb +0 -5
  376. data/lib/spontaneous/render/format.rb +0 -75
  377. data/lib/spontaneous/render/helpers/script_helper.rb +0 -17
  378. data/lib/spontaneous/render/helpers/stylesheet_helper.rb +0 -16
  379. data/lib/spontaneous/render/helpers.rb +0 -14
  380. data/lib/spontaneous/render/preview_context.rb +0 -8
  381. data/lib/spontaneous/render/preview_renderer.rb +0 -24
  382. data/lib/spontaneous/render/publish_context.rb +0 -22
  383. data/lib/spontaneous/render/published_renderer.rb +0 -53
  384. data/lib/spontaneous/render/publishing_renderer.rb +0 -16
  385. data/lib/spontaneous/render/render_cache.rb +0 -26
  386. data/lib/spontaneous/render/renderer.rb +0 -50
  387. data/lib/spontaneous/render/request_context.rb +0 -8
  388. data/lib/spontaneous/render.rb +0 -214
  389. data/test/experimental/test_cutaneous.rb +0 -309
  390. data/test/fixtures/application/css/test.less +0 -5
  391. data/test/slow/test_publishing.rb +0 -1006
  392. /data/application/css/{developer.scss → developer.css.scss} +0 -0
  393. /data/application/js/vendor/{jquery-1.7.1.min.js → jquery.js} +0 -0
  394. /data/application/static/{location-arrow.png → location-arrow-c1c1d3ca472481c61a0a5f8cb289d743.png} +0 -0
  395. /data/application/static/{missing.png → missing-911ce6dbd9f4602e0f3fbcd7e78846a2.png} +0 -0
  396. /data/application/static/{orange-down-arrow.png → orange-down-arrow-395ae1929e8662b2ff0977daf12c35bb.png} +0 -0
  397. /data/application/static/{page-browser-next.png → page-browser-next-ce781a242c23b980b99b9db7abc20b05.png} +0 -0
  398. /data/application/static/{plus-box.png → plus-box-dcde74a1e496f68298c9b443caa1c5d5.png} +0 -0
  399. /data/application/static/{select-arrow.png → select-arrow-6e7dd3745b00e934b0d7a3250c46558b.png} +0 -0
  400. /data/application/static/{slot-down-arrow.png → slot-down-arrow-59ad5f5ee5b52a7ebd00bca4b3104194.png} +0 -0
  401. /data/application/static/{splash.png → splash-65b493a714df9b8b3ab170103401b53d.png} +0 -0
  402. /data/application/static/{spot.png → spot-71fab1d2f065034f5fc15e7bea2ad36c.png} +0 -0
  403. /data/application/static/{spot.svg → spot-8505041082d8d3bbe8d34c29dddb3b7d.svg} +0 -0
  404. /data/application/static/{texture.png → texture-03f7627e8264b1d607113ab32c593a58.png} +0 -0
@@ -0,0 +1,213 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path('../../test_helper', __FILE__)
4
+ require 'ostruct'
5
+ require 'shine'
6
+
7
+ class AssetTest < MiniTest::Spec
8
+
9
+ module LiveSimulation
10
+ # simulate a production + publishing environment
11
+ def live?
12
+ true
13
+ end
14
+ # usually set as part of the render process
15
+ def revision
16
+ 99
17
+ end
18
+ end
19
+
20
+ def new_context(content = @page, format = :html, params = {})
21
+ renderer = Spontaneous::Output::Template::PublishRenderer.new
22
+ output = content.output(format)
23
+ context = renderer.context(output, params)
24
+ context.extend LiveSimulation
25
+ context
26
+ end
27
+
28
+ def setup
29
+ @site = setup_site
30
+ @fixture_root = File.expand_path("../../fixtures/assets", __FILE__)
31
+ @site.paths.add :public, @fixture_root / "public1", @fixture_root / "public2"
32
+ @page = S::Page.create
33
+ end
34
+
35
+ def teardown
36
+ S::Content.delete
37
+ teardown_site
38
+ end
39
+
40
+ context "Publishing context" do
41
+ should "be flagged as live" do
42
+ Spontaneous.stubs(:production?).returns(true)
43
+ new_context.live?.should be_true
44
+ end
45
+
46
+ should "be flagged as publishing" do
47
+ new_context.publishing?.should be_true
48
+ end
49
+ end
50
+
51
+ context "Javascript assets" do
52
+ should "be compressed in live environment" do
53
+ files = [@fixture_root / "public1/js/a.js", @fixture_root / "public2/js/b.js"]
54
+ src = files.map { |p| File.read(p) }.join
55
+ Shine.expects(:compress_string).with(src, :js, {}).once.returns("var A;\nvar B;\n")
56
+ context = new_context
57
+ result = context.scripts("/js/a", "/js/b")
58
+ result.should =~ /src="\/rev\/5dde6b3e04ce364ef23f51048006e5dd7e6f62ad\.js"/
59
+ on_disk = Spontaneous::Output.revision_root(context.revision) / "rev/5dde6b3e04ce364ef23f51048006e5dd7e6f62ad.js"
60
+ assert File.exist?(on_disk)
61
+ File.read(on_disk).should == "var A;\nvar B;\n"
62
+ end
63
+
64
+ should "use a cache to make sure identical file lists are only compressed once" do
65
+ files1 = [@fixture_root / "public1/js/a.js", @fixture_root / "public2/js/b.js"]
66
+ files2 = [@fixture_root / "public2/js/b.js", @fixture_root / "public2/js/c.js"]
67
+ src1 = files1.map { |p| File.read(p) }.join
68
+ src2 = files2.map { |p| File.read(p) }.join
69
+ Shine.expects(:compress_string).with(src1, :js, {}).once.returns("var A;\nvar B;\n")
70
+ Shine.expects(:compress_string).with(src2, :js, {}).once.returns("var B;\nvar C;\n")
71
+ context = new_context
72
+ result = context.scripts("/js/a", "/js/b")
73
+ result = context.scripts("/js/a", "/js/b")
74
+ result = context.scripts("/js/b", "/js/c")
75
+ result = context.scripts("/js/b", "/js/c")
76
+ result.should =~ /src="\/rev\/1458221916fde33ec803fbbae20af8ded0ee2ca1\.js"/
77
+ end
78
+
79
+ should "be compressed when publishing & passed a force_compression option" do
80
+ files = [@fixture_root / "public1/js/a.js", @fixture_root / "public2/js/b.js"]
81
+ src = files.map { |p| File.read(p) }.join
82
+ Shine.expects(:compress_string).with(src, :js, {}).once.returns("var A;\nvar B;\n")
83
+ context = new_context
84
+ context.stubs(:live?).returns(false)
85
+ context.stubs(:publishing?).returns(true)
86
+ result = context.scripts("/js/a", "/js/b", :force_compression => true)
87
+
88
+ Shine.expects(:compress_string).with(src, :js, {}).never
89
+ context.stubs(:publishing?).returns(false)
90
+ result = context.scripts("/js/a", "/js/b", :force_compression => true)
91
+ end
92
+
93
+ should "support UTF8 scripts" do
94
+ files = [@fixture_root / "public1/js/a.js", @fixture_root / "public2/js/b.js"]
95
+ src = files.map { |p| File.read(p) }.join
96
+ Shine.expects(:compress_string).with(src, :js, {}).once.returns("var A = \"\xC2\";\nvar B;\n".force_encoding("ASCII-8BIT"))
97
+ context = new_context
98
+ result = context.scripts("/js/a", "/js/b")
99
+ end
100
+
101
+ should "support scripts with full urls" do
102
+ context = new_context
103
+ result = context.scripts("http://jquery.com/jquery.js")
104
+ result.should =~ /src="http:\/\/jquery.com\/jquery.js"/
105
+ end
106
+ end
107
+
108
+ context "CoffeeScript assets" do
109
+ should "be compiled & compressed in live environment" do
110
+ files = [@fixture_root / "public1/js/m.js", @fixture_root / "public2/js/n.js"]
111
+ Shine.expects(:compress_string).with((<<-COMPILED), :js, {}).once.returns("var A;\nvar B;\n")
112
+ (function() {
113
+ var square;
114
+
115
+ square = function(x) {
116
+ return x * x;
117
+ };
118
+
119
+ if (typeof elvis !== "undefined" && elvis !== null) alert("I knew it!");
120
+
121
+ }).call(this);
122
+ COMPILED
123
+ context = new_context
124
+ result = context.scripts("/js/m", "/js/n")
125
+ result.should =~ /src="\/rev\/5dde6b3e04ce364ef23f51048006e5dd7e6f62ad\.js"/
126
+ on_disk = Spontaneous::Output.revision_root(context.revision) / "rev/5dde6b3e04ce364ef23f51048006e5dd7e6f62ad.js"
127
+ assert File.exist?(on_disk)
128
+ File.read(on_disk).should == "var A;\nvar B;\n"
129
+ end
130
+
131
+ should "be correctly compiled when mixed with plain js" do
132
+ Shine.expects(:compress_string).with((<<-COMPILED), :js, {}).once.returns("var A;\nvar B;\n")
133
+ var A;
134
+ (function() {
135
+ var square;
136
+
137
+ square = function(x) {
138
+ return x * x;
139
+ };
140
+
141
+ if (typeof elvis !== "undefined" && elvis !== null) alert("I knew it!");
142
+
143
+ }).call(this);
144
+ var B;
145
+ COMPILED
146
+ context = new_context
147
+ result = context.scripts("/js/a", "/js/m", "/js/n", "/js/b")
148
+ end
149
+ end
150
+
151
+ context "Stylesheet assets" do
152
+ should "be compressed in live environment" do
153
+ files = [@fixture_root / "public1/css/a.scss", @fixture_root / "public2/css/b.scss"]
154
+ context = new_context
155
+ Shine.expects(:compress_string).with(<<-CSS, :css, {}).once.returns("/* compressed */\n")
156
+ .a{width:8px}
157
+ .c { color: #fff; }
158
+ .b{height:42px}
159
+ CSS
160
+ result = context.stylesheets("/css/a", "/css/c", "/css/b")
161
+ result.should =~ /href="\/rev\/df3e2b3fa3409d8ca37faac7da80349098f0b28a\.css"/
162
+ on_disk = Spontaneous::Output.revision_root(context.revision) / "rev/df3e2b3fa3409d8ca37faac7da80349098f0b28a.css"
163
+
164
+ assert File.exist?(on_disk)
165
+ File.read(on_disk).should == "/* compressed */\n"
166
+ end
167
+
168
+ should "be compressed if publishing and passed a force option" do
169
+ files = [@fixture_root / "public1/css/a.scss", @fixture_root / "public2/css/b.scss"]
170
+ context = new_context
171
+ m = Module.new do
172
+ def live?; false; end
173
+ def publishing?; true; end
174
+ end
175
+ context.extend m
176
+ context.live?.should be_false
177
+ Shine.expects(:compress_string).with(anything, :css, {}).once.returns("/* compressed */\n")
178
+ result = context.stylesheets("/css/a", "/css/c", "/css/b", {:force_compression => true})
179
+
180
+ def context.publishing?; false; end
181
+ context.publishing?.should be_false
182
+ Shine.expects(:compress_string).with(anything, :css, {}).never
183
+ result = context.stylesheets("/css/a", "/css/c", "/css/b", {:force_compression => true})
184
+ end
185
+
186
+ should "use a cache to make sure identical file lists are only compressed once" do
187
+ context = new_context
188
+ Shine.expects(:compress_string).with(<<-CSS, :css, {}).once.returns("/* compressed1 */\n")
189
+ .a{width:8px}
190
+ .b{height:42px}
191
+ CSS
192
+ Shine.expects(:compress_string).with(<<-CSS, :css, {}).once.returns("/* compressed2 */\n")
193
+ .a{width:8px}
194
+ .c { color: #fff; }
195
+ CSS
196
+ result = context.stylesheets("/css/a", "/css/b")
197
+ result = context.stylesheets("/css/a", "/css/b")
198
+ result.should =~ /href="\/rev\/20aac22ae20e78ef1574a3a6635fa353148e9d9a\.css"/
199
+ result = context.stylesheets("/css/a", "/css/c")
200
+ result = context.stylesheets("/css/a", "/css/c")
201
+ result.should =~ /href="\/rev\/77ec1b6ee2907c65cf316b99b59c8cf8006dcddf\.css"/
202
+ end
203
+
204
+ should "support UTF8 styles" do
205
+ context = new_context
206
+ Shine.expects(:compress_string).with(<<-CSS, :css, {}).once.returns("/* \xC2 */\n".force_encoding("ASCII-8BIT"))
207
+ .a{width:8px}
208
+ .b{height:42px}
209
+ CSS
210
+ result = context.stylesheets("/css/a", "/css/b")
211
+ end
212
+ end
213
+ end
@@ -0,0 +1,55 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path('../../test_helper', __FILE__)
4
+ require 'eventmachine'
5
+
6
+ class AsyncTest < MiniTest::Spec
7
+
8
+ def setup
9
+ @site = setup_site
10
+ @filename = Time.now.to_i
11
+ @filepath = @site.root / @filename
12
+ File.exist?(@filepath).should be_false
13
+ end
14
+
15
+ def teardown
16
+ teardown_site
17
+ end
18
+
19
+ context "async system calls" do
20
+ should "be able to test for running EM reactor" do
21
+ Spontaneous.async?.should be_false
22
+ EM.run do
23
+ Spontaneous.async?.should be_true
24
+ EM.stop
25
+ end
26
+ Spontaneous.async?.should be_false
27
+ end
28
+
29
+ should "use fibers to simulate sync code if running in a fiber" do
30
+ EM.run do
31
+ Fiber.new {
32
+ result = Spontaneous.system("touch #{@filepath}")
33
+ File.exist?(@filepath).should be_true
34
+ }.resume
35
+ EM.stop
36
+ end
37
+ end
38
+
39
+ # TODO: can't get this to work at moment'
40
+ # should "resort to sync code if execution is not running in a fiber" do
41
+ # EM.run do
42
+ # result = Spontaneous.system("touch #{@filepath}")
43
+ # File.exist?(@filepath).should be_true
44
+ # EM.stop
45
+ # end
46
+ # end
47
+
48
+
49
+ should "run synchronously outside of EM reactor" do
50
+ result = Spontaneous.system("touch #{@filepath}")
51
+ File.exist?(@filepath).should be_true
52
+ result.should be_true
53
+ end
54
+ end
55
+ end
@@ -14,8 +14,7 @@ class AuthenticationTest < MiniTest::Spec
14
14
  :name => "#{name.capitalize}",
15
15
  :email => "#{name}@example.org",
16
16
  :login => name,
17
- :password => "#{name}_password",
18
- :password_confirmation => "#{name}_password"
17
+ :password => "#{name}_password"
19
18
  })
20
19
  user.update(:level => level)
21
20
  user
@@ -92,20 +91,13 @@ class AuthenticationTest < MiniTest::Spec
92
91
  def teardown
93
92
  teardown_site
94
93
  end
95
- def assert_login_page(path = nil, method = "GET")
96
- assert last_response.status == 401, "#{method} #{path} should have status 401 but has #{last_response.status}"
97
- last_response.body.should =~ %r{<form.+action="/@spontaneous/login"}
98
- last_response.body.should =~ %r{<form.+method="post"}
99
- last_response.body.should =~ %r{<input.+name="user\[login\]"}
100
- last_response.body.should =~ %r{<input.+name="user\[password\]"}
101
- end
102
94
 
103
95
  def post_paths
104
96
  %(/save/#{root.id} /savebox/#{root.id}/#{root.boxes[:editor_level].schema_id} /content/#{root.id}/position/0 /file/upload/#{root.id} /file/replace/#{root.id} /file/wrap/#{root.id}/#{root.boxes[:pages].schema_id} /add/#{root.id}/#{root.boxes[:pages].schema_id}/#{SitePage.schema_id} /destroy/#{root.id} /slug/#{root.id} /slug/#{root.id}/unavailable /toggle/#{root.id} /schema/delete /schema/rename)
105
97
  end
106
98
 
107
99
  def get_paths
108
- %(/root /page/#{root.id} /types /map /map/#{root.id} /location/about /user)
100
+ %(/root /page/#{root.id} /metadata /map /map/#{root.id} /location/about)
109
101
  end
110
102
 
111
103
  context "Authentication:" do
@@ -183,6 +175,7 @@ class AuthenticationTest < MiniTest::Spec
183
175
  Permissions::User.delete
184
176
  Permissions::AccessKey.delete
185
177
  Spontaneous.environment = :test
178
+ Permissions::UserLevel.reset!
186
179
  Permissions::UserLevel.stubs(:level_file).returns(File.expand_path('../../fixtures/permissions', __FILE__) / 'config/user_levels.yml')
187
180
 
188
181
  @root = SitePage.create
@@ -254,7 +247,7 @@ class AuthenticationTest < MiniTest::Spec
254
247
  end
255
248
 
256
249
  should "get access to CSS files" do
257
- get "/@spontaneous/css/v2.css"
250
+ get "/@spontaneous/css/spontaneous.css"
258
251
  assert last_response.status == 200
259
252
  end
260
253
 
@@ -291,6 +284,27 @@ class AuthenticationTest < MiniTest::Spec
291
284
  last_response.headers["Location"].should =~ %r{/@spontaneous/103/preview$}
292
285
  end
293
286
 
287
+ should "set the secure flag for cookies delivered behind https" do
288
+ clear_cookies
289
+ rack_mock_session.cookie_jar[S::Rack::AUTH_COOKIE].should be_nil
290
+ user = @admin_user
291
+ post "https://example.org/@spontaneous/login", {"user[login]" => user.login, "user[password]" => user.password}
292
+ cookies = rack_mock_session.cookie_jar.instance_variable_get("@cookies")
293
+ cookie = cookies.detect { |c| c.name == S::Rack::AUTH_COOKIE }
294
+ cookie.secure?.should be_true
295
+ end
296
+
297
+ should "set the secure flag for cookies delivered behind https when reauthenticating" do
298
+ clear_cookies
299
+ key = @admin_user.logged_in!
300
+ post "https://example.org/@spontaneous/reauthenticate", "api_key" => key.key_id, "origin" => "/99/edit"
301
+ cookies = rack_mock_session.cookie_jar.instance_variable_get("@cookies")
302
+ cookie = cookies.detect { |c| c.name == S::Rack::AUTH_COOKIE }
303
+ cookie.secure?.should be_true
304
+ cookie_options = cookie.instance_variable_get("@options")
305
+ cookie_options.key?("HttpOnly").should be_true
306
+ end
307
+
294
308
  should "succeed and return an api key value for correct login over XHR" do
295
309
  key = Spontaneous::Permissions::AccessKey.new
296
310
  Spontaneous::Permissions::AccessKey.expects(:new).returns(key)
@@ -347,18 +361,18 @@ class AuthenticationTest < MiniTest::Spec
347
361
  assert last_response.ok?, "Expected 200 but got #{last_response.status}"
348
362
  end
349
363
 
364
+ should "be able to logout" do
365
+ auth_post "/@spontaneous/logout"
366
+ assert last_response.status == 401
367
+ rack_mock_session.cookie_jar.merge(last_response.headers["set-cookie"])
368
+ rack_mock_session.cookie_jar[Spontaneous::Rack::AUTH_COOKIE].value.should == ""
369
+ end
370
+
350
371
  # context "providing an API key in the request" do
351
372
  # should "be able to see previously forbidden fruit" do
352
373
  # get "/@spontaneous/root"
353
374
  # assert last_response.ok?
354
375
  # end
355
-
356
- # should "be able to load info about themselves" do
357
- # get "/@spontaneous/user"
358
- # assert last_response.ok?
359
- # Spot::JSON.parse(last_response.body).should == @editor_user.export
360
- # end
361
- # end
362
376
  end
363
377
 
364
378
  end
@@ -400,7 +414,7 @@ class AuthenticationTest < MiniTest::Spec
400
414
  value = "Updated #{version}"
401
415
  field = root.fields[:root_level]
402
416
  auth_post "/@spontaneous/save/#{root.id}", "field[#{field.schema_id}][unprocessed_value]" => value
403
- assert last_response.status == 401, "Should have a permissions error 401 not #{last_response.status}"
417
+ assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
404
418
  root.reload.fields[:root_level].value.should == @root_copy.root_level.value
405
419
  end
406
420
 
@@ -414,12 +428,12 @@ class AuthenticationTest < MiniTest::Spec
414
428
 
415
429
  should "not be able to add to root level box" do
416
430
  auth_post "/@spontaneous/add/#{root.id}/#{root.boxes[:root_level].schema_id}/#{AuthenticationTest::C.schema_id}"
417
- assert last_response.status == 401, "Should have a permissions error 401 not #{last_response.status}"
431
+ assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
418
432
  end
419
433
 
420
434
  should "not be able to add root level types to admin level box" do
421
435
  auth_post "/@spontaneous/add/#{root.id}/#{root.boxes[:admin_level].schema_id}/#{AuthenticationTest::D.schema_id}"
422
- assert last_response.status == 401, "Should have a permissions error 401 not #{last_response.status}"
436
+ assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
423
437
  end
424
438
 
425
439
  should "be able to add to admin level box" do
@@ -432,27 +446,27 @@ class AuthenticationTest < MiniTest::Spec
432
446
  value = "Updated #{version}"
433
447
  field = root.fields[:editor_level]
434
448
  auth_post "/@spontaneous/savebox/#{root.id}/#{root.boxes[:root_level].schema_id}", "field[#{field.schema_id}][unprocessed_value]" => value
435
- assert last_response.status == 401, "Should have a permissions error 401 not #{last_response.status}"
449
+ assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
436
450
  end
437
451
 
438
452
  should "not be able to update root level fields from admin level box" do
439
453
  value = "Updated #{version}"
440
454
  field = root.boxes[:admin_level].fields[:root_level]
441
455
  auth_post "/@spontaneous/savebox/#{root.id}/#{root.boxes[:admin_level].schema_id}", "field[#{field.schema_id}][unprocessed_value]" => value
442
- assert last_response.status == 401, "Should have a permissions error 401 not #{last_response.status}"
456
+ assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
443
457
  end
444
458
 
445
459
  should "not be able to delete from root level box" do
446
- piece = root.boxes[:root_level].pieces.first
447
- pieces = root.reload.boxes[:root_level].pieces.length
460
+ piece = root.boxes[:root_level].contents.first
461
+ pieces = root.reload.boxes[:root_level].contents.length
448
462
  auth_post "/@spontaneous/destroy/#{piece.id}"
449
- assert last_response.status == 401, "Should have a permissions error 401 not #{last_response.status}"
450
- root.reload.boxes[:root_level].pieces.length.should == pieces
463
+ assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
464
+ root.reload.boxes[:root_level].contents.length.should == pieces
451
465
  end
452
466
  should "not be able to wrap files in root level box" do
453
467
  src_file = File.expand_path("../../fixtures/images/rose.jpg", __FILE__)
454
468
  auth_post "/@spontaneous/file/wrap/#{root.id}/#{root.boxes[:root_level].schema_id}", "file" => ::Rack::Test::UploadedFile.new(src_file, "image/jpeg")
455
- assert last_response.status == 401, "Should have a permissions error 401 not #{last_response.status}"
469
+ assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
456
470
  end
457
471
  should "not be able to wrap files in box if allow permissions don't permit it" do
458
472
  src_file = File.expand_path("../../fixtures/images/rose.jpg", __FILE__)
@@ -460,27 +474,27 @@ class AuthenticationTest < MiniTest::Spec
460
474
  # editor_level box allows addition of type C but only by root
461
475
  # so the following should throw a perms error:
462
476
  auth_post "/@spontaneous/file/wrap/#{root.id}/#{root.boxes[:editor_level].schema_id}", "file" => ::Rack::Test::UploadedFile.new(src_file, "image/jpeg")
463
- assert last_response.status == 401, "Should have a permissions error 401 not #{last_response.status}"
477
+ assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
464
478
  end
465
479
  should "not be able to re-order pieces in root level box" do
466
- piece = root.boxes[:root_level].pieces.last
480
+ piece = root.boxes[:root_level].contents.last
467
481
  auth_post "/@spontaneous/content/#{piece.id}/position/0"
468
- assert last_response.status == 401, "Should have a permissions error 401 not #{last_response.status}"
469
- root.reload.boxes[:root_level].pieces.last.id.should == piece.id
482
+ assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
483
+ root.reload.boxes[:root_level].contents.last.id.should == piece.id
470
484
  end
471
485
 
472
486
  should "not be able to replace root level fields" do
473
- piece = root.boxes[:root_level].pieces.first
487
+ piece = root.boxes[:root_level].contents.first
474
488
  src_file = File.expand_path("../../fixtures/images/rose.jpg", __FILE__)
475
489
  field = piece.fields[:photo]
476
490
  auth_post "/@spontaneous/file/replace/#{piece.id}", "file" => ::Rack::Test::UploadedFile.new(src_file, "image/jpeg"), "field" => field.schema_id
477
- assert last_response.status == 401, "Should have a permissions error 401 not #{last_response.status}"
491
+ assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
478
492
  end
479
493
 
480
494
  should "not be able to hide entries in root-level boxes" do
481
- piece = root.boxes[:root_level].pieces.first
495
+ piece = root.boxes[:root_level].contents.first
482
496
  auth_post "/@spontaneous/toggle/#{piece.id}"
483
- assert last_response.status == 401, "Should have a permissions error 401 not #{last_response.status}"
497
+ assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
484
498
  end
485
499
 
486
500
  should "not be allowed to update path of pages without permission"
@@ -496,9 +510,8 @@ class AuthenticationTest < MiniTest::Spec
496
510
  end
497
511
 
498
512
  should "not be able to retrieve the list of changes" do
499
- Change.delete
500
- get "/@spontaneous/publish/changes"
501
- assert last_response.status == 401, "Should have a permissions error 401 not #{last_response.status}"
513
+ auth_get "/@spontaneous/publish/changes"
514
+ assert last_response.status == 403, "Should have a permissions error 403 not #{last_response.status}"
502
515
  end
503
516
  end
504
517
  end
@@ -338,16 +338,16 @@ class BoxesTest < MiniTest::Spec
338
338
  @parent = Content[@parent.id]
339
339
  child1.reload; child2.reload; child3.reload
340
340
  @parent.images.contents.should == [child1]
341
- @parent.images.pieces.should == [child1]
341
+ @parent.images.contents.should == [child1]
342
+ @parent.words.contents.should == [child2]
342
343
  @parent.words.contents.should == [child2]
343
- @parent.words.pieces.should == [child2]
344
- @parent.pieces.should == [child1, child2]
345
- child1.images.pieces.should == [child3]
346
- child1.pieces.should == [child3]
344
+ @parent.contents.should == [child1, child2]
345
+ child1.images.contents.should == [child3]
346
+ child1.contents.should == [child3]
347
347
 
348
- @parent.images.pieces.first.box.should == @parent.images
349
- @parent.words.pieces.first.box.should == @parent.words
350
- @parent.pieces.first.box.should == @parent.images
348
+ @parent.images.contents.first.box.should == @parent.images
349
+ @parent.words.contents.first.box.should == @parent.words
350
+ @parent.contents.first.box.should == @parent.images
351
351
  end
352
352
 
353
353
  should "choose correct style" do
@@ -358,9 +358,10 @@ class BoxesTest < MiniTest::Spec
358
358
  styled.one << child1
359
359
  styled.two << child2
360
360
  styled.save
361
- styled = Content[styled.id]
362
- styled.one.pieces.first.style.name.should == :blank2
363
- styled.two.pieces.first.style.name.should == :blank3
361
+ styled = Content.first :id => styled.id
362
+
363
+ styled.one.contents.first.style.name.should == :blank2
364
+ styled.two.contents.first.style.name.should == :blank3
364
365
  end
365
366
 
366
367
  should "be insertable at any position" do
@@ -443,12 +444,12 @@ class BoxesTest < MiniTest::Spec
443
444
  # end
444
445
 
445
446
  should "allow all styles by default" do
446
- Parent.allowed[2].styles.should == Allowed3.styles
447
+ Parent.allowed[2].styles(nil).should == Allowed3.styles
447
448
  end
448
449
 
449
450
  should "have a list of allowable styles" do
450
- Parent.allowed[1].styles.length.should == 2
451
- Parent.allowed[1].styles.map { |s| s.name }.should == [:ringo, :george]
451
+ Parent.allowed[1].styles(nil).length.should == 2
452
+ Parent.allowed[1].styles(nil).map { |s| s.name }.should == [:ringo, :george]
452
453
  end
453
454
 
454
455
  # TODO: decide on whether verifying style names is a good idea
@@ -460,7 +461,7 @@ class BoxesTest < MiniTest::Spec
460
461
  a = Allowable.new
461
462
  b = Allowed2.new
462
463
  a.parents << b
463
- a.parents.pieces.first.style.prototype.should == Allowed2.styles[:ringo]
464
+ a.parents.contents.first.style.prototype.should == Allowed2.styles[:ringo]
464
465
  end
465
466
 
466
467
  should "know what the available styles are for an entry" do
@@ -563,6 +564,10 @@ class BoxesTest < MiniTest::Spec
563
564
  @c.boxes.inner.render.should == "[a][b][f]"
564
565
  @c.boxes.outer.render.should == "[c][d][e]"
565
566
  end
567
+
568
+ should "return an empty array when asking for an unknown box group" do
569
+ @a.boxes.group(:nothing).should == []
570
+ end
566
571
  end
567
572
  end
568
573