spontaneous 0.1.0.alpha1 → 0.2.0.alpha1

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 (413) hide show
  1. data/Gemfile +40 -35
  2. data/LICENSE +20 -0
  3. data/Rakefile +39 -42
  4. data/Readme.markdown +155 -0
  5. data/application/css/definitions.scss +3 -0
  6. data/application/css/editing.scss +9 -4
  7. data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +1 -0
  8. data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +1 -0
  9. data/application/css/min/d1b54ff4847c613618267ca1c15658e2aee0a4e5.css +1 -0
  10. data/application/css/v2.scss +144 -50
  11. data/application/js/add_alias_dialogue.js +18 -8
  12. data/application/js/ajax.js +1 -1
  13. data/application/js/authentication.js +8 -1
  14. data/application/js/box.js +37 -7
  15. data/application/js/box_container.js +1 -1
  16. data/application/js/compatibility.js +7 -0
  17. data/application/js/content.js +7 -0
  18. data/application/js/content_area.js +4 -0
  19. data/application/js/edit_panel.js +44 -18
  20. data/application/js/editing.js +12 -0
  21. data/application/js/event_source.js +17 -0
  22. data/application/js/extensions.js +2 -0
  23. data/application/js/field_types/file_field.js +2 -1
  24. data/application/js/field_types/image_field.js +35 -48
  25. data/application/js/field_types/long_string_field.js +12 -0
  26. data/application/js/field_types/markdown_field.js +2 -5
  27. data/application/js/field_types/string_field.js +5 -1
  28. data/application/js/field_types/webvideo_field.js +15 -0
  29. data/application/js/init.js +1 -0
  30. data/application/js/location.js +30 -19
  31. data/application/js/login.js +1 -2
  32. data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +3 -0
  33. data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +2 -0
  34. data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +3 -0
  35. data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +90 -0
  36. data/application/js/page.js +1 -0
  37. data/application/js/page_entry.js +6 -40
  38. data/application/js/preview.js +2 -3
  39. data/application/js/top_bar.js +76 -31
  40. data/application/js/upload.js +5 -2
  41. data/application/js/upload_manager.js +2 -81
  42. data/application/js/vendor/jquery-1.7.1.min.js +4 -0
  43. data/application/js/vendor/jquery-ui-1.8.16.custom.min.js +791 -0
  44. data/application/js/views.js +3 -3
  45. data/application/js/views/box_view.js +164 -83
  46. data/application/js/views/page_piece_view.js +2 -2
  47. data/application/js/views/page_view.js +46 -15
  48. data/application/js/views/piece_view.js +29 -8
  49. data/application/static/diagonal-texture.png +0 -0
  50. data/application/static/item-buttons-highlight.png +0 -0
  51. data/application/static/plus-box.png +0 -0
  52. data/application/static/plus_alt.svg +8 -0
  53. data/application/static/slot-up-arrow.png +0 -0
  54. data/application/views/{index.erubis → index.erb} +9 -5
  55. data/application/views/{login.erubis → login.erb} +14 -10
  56. data/application/views/schema_modification_error.html.erb +18 -6
  57. data/application/views/{unsupported.erubis → unsupported.erb} +0 -0
  58. data/bin/spot +15 -2
  59. data/db/migrations/20100610142136_init.rb +2 -2
  60. data/db/migrations/20101130104334_timestamps.rb +2 -2
  61. data/db/migrations/20110209152710_users_and_groups.rb +11 -11
  62. data/db/migrations/20120106171423_visibility_path.rb +19 -0
  63. data/db/migrations/20120107124541_owner_id.rb +19 -0
  64. data/docs/recipe-interface-screenshot.png +0 -0
  65. data/lib/cutaneous.rb +11 -10
  66. data/lib/cutaneous/context_helper.rb +119 -14
  67. data/lib/cutaneous/preview_context.rb +4 -3
  68. data/lib/cutaneous/preview_renderer.rb +1 -6
  69. data/lib/cutaneous/publish_context.rb +1 -0
  70. data/lib/cutaneous/{first_pass_renderer.rb → publish_renderer.rb} +2 -6
  71. data/lib/cutaneous/publish_template.rb +62 -0
  72. data/lib/cutaneous/publish_token_parser.rb +8 -0
  73. data/lib/cutaneous/renderer.rb +4 -2
  74. data/lib/cutaneous/request_context.rb +1 -0
  75. data/lib/cutaneous/{second_pass_renderer.rb → request_renderer.rb} +2 -5
  76. data/lib/cutaneous/request_template.rb +11 -0
  77. data/lib/cutaneous/request_token_parser.rb +9 -0
  78. data/lib/cutaneous/token_parser.rb +125 -0
  79. data/lib/sequel/plugins/content_table_inheritance.rb +19 -12
  80. data/lib/sequel/plugins/scoped_table_name.rb +45 -0
  81. data/lib/spontaneous.rb +123 -126
  82. data/lib/spontaneous/box.rb +127 -47
  83. data/lib/spontaneous/box_style.rb +39 -22
  84. data/lib/spontaneous/change.rb +2 -2
  85. data/lib/spontaneous/cli.rb +1 -0
  86. data/lib/spontaneous/cli/base.rb +12 -4
  87. data/lib/spontaneous/cli/console.rb +72 -0
  88. data/lib/spontaneous/cli/server.rb +36 -12
  89. data/lib/spontaneous/cli/site.rb +175 -1
  90. data/lib/spontaneous/collections/box_set.rb +19 -1
  91. data/lib/spontaneous/collections/entry_set.rb +70 -22
  92. data/lib/spontaneous/collections/field_set.rb +3 -3
  93. data/lib/spontaneous/collections/prototype_set.rb +28 -0
  94. data/lib/spontaneous/config.rb +14 -5
  95. data/lib/spontaneous/content.rb +23 -24
  96. data/lib/spontaneous/errors.rb +20 -4
  97. data/lib/spontaneous/extensions/array.rb +2 -2
  98. data/lib/spontaneous/extensions/json.rb +1 -1
  99. data/lib/spontaneous/extensions/nil.rb +13 -0
  100. data/lib/spontaneous/facet.rb +61 -7
  101. data/lib/spontaneous/field_types.rb +1 -3
  102. data/lib/spontaneous/field_types/date_field.rb +1 -0
  103. data/lib/spontaneous/field_types/field.rb +32 -15
  104. data/lib/spontaneous/field_types/image_field.rb +138 -69
  105. data/lib/spontaneous/field_types/location_field.rb +59 -0
  106. data/lib/spontaneous/field_types/long_string_field.rb +13 -0
  107. data/lib/spontaneous/field_types/markdown_field.rb +2 -1
  108. data/lib/spontaneous/field_types/string_field.rb +2 -2
  109. data/lib/spontaneous/field_types/webvideo_field.rb +255 -0
  110. data/lib/spontaneous/generators/page/inline.html.cut +1 -1
  111. data/lib/spontaneous/generators/page/page.html.cut.tt +5 -4
  112. data/lib/spontaneous/generators/page/page.rb.tt +1 -5
  113. data/lib/spontaneous/generators/site.rb +1 -0
  114. data/lib/spontaneous/generators/site/.gitignore +2 -0
  115. data/lib/spontaneous/generators/site/Gemfile.tt +3 -5
  116. data/lib/spontaneous/generators/site/config/environment.rb.tt +1 -0
  117. data/lib/spontaneous/generators/site/config/environments/development.rb.tt +3 -1
  118. data/lib/spontaneous/generators/site/config/environments/production.rb.tt +3 -1
  119. data/lib/spontaneous/generators/site/config/indexes.rb.tt +23 -0
  120. data/lib/spontaneous/generators/site/public/css/{site.css → site.scss} +0 -0
  121. data/lib/spontaneous/generators/site/schema/box.rb.tt +5 -0
  122. data/lib/spontaneous/generators/site/templates/layouts/standard.html.cut.tt +11 -5
  123. data/lib/spontaneous/image_size.rb +0 -1
  124. data/lib/spontaneous/loader.rb +335 -218
  125. data/lib/spontaneous/logger.rb +7 -2
  126. data/lib/spontaneous/media.rb +64 -59
  127. data/lib/spontaneous/media/file.rb +74 -0
  128. data/lib/spontaneous/page.rb +47 -18
  129. data/lib/spontaneous/page_piece.rb +29 -27
  130. data/lib/spontaneous/paths.rb +0 -1
  131. data/lib/spontaneous/permissions.rb +3 -21
  132. data/lib/spontaneous/permissions/user.rb +5 -1
  133. data/lib/spontaneous/permissions/user_level.rb +6 -7
  134. data/lib/spontaneous/piece.rb +12 -7
  135. data/lib/spontaneous/plugins/aliases.rb +76 -31
  136. data/lib/spontaneous/plugins/allowed_types.rb +36 -37
  137. data/lib/spontaneous/plugins/application/facets.rb +7 -10
  138. data/lib/spontaneous/plugins/application/features.rb +17 -0
  139. data/lib/spontaneous/plugins/application/paths.rb +25 -31
  140. data/lib/spontaneous/plugins/application/render.rb +1 -5
  141. data/lib/spontaneous/plugins/application/serialisation.rb +2 -0
  142. data/lib/spontaneous/plugins/application/state.rb +6 -9
  143. data/lib/spontaneous/plugins/boxes.rb +65 -40
  144. data/lib/spontaneous/plugins/controllers.rb +22 -22
  145. data/lib/spontaneous/plugins/entries.rb +149 -150
  146. data/lib/spontaneous/plugins/entry.rb +50 -35
  147. data/lib/spontaneous/plugins/field/editor_class.rb +13 -0
  148. data/lib/spontaneous/plugins/fields.rb +41 -33
  149. data/lib/spontaneous/plugins/instance_code.rb +9 -9
  150. data/lib/spontaneous/plugins/layouts.rb +31 -35
  151. data/lib/spontaneous/plugins/media.rb +31 -32
  152. data/lib/spontaneous/plugins/page/formats.rb +56 -31
  153. data/lib/spontaneous/plugins/page/request.rb +15 -9
  154. data/lib/spontaneous/plugins/page_search.rb +30 -31
  155. data/lib/spontaneous/plugins/page_tree.rb +59 -12
  156. data/lib/spontaneous/plugins/paths.rb +84 -79
  157. data/lib/spontaneous/plugins/permissions.rb +26 -28
  158. data/lib/spontaneous/plugins/prototypes.rb +42 -37
  159. data/lib/spontaneous/plugins/publishing.rb +50 -94
  160. data/lib/spontaneous/plugins/render.rb +8 -16
  161. data/lib/spontaneous/plugins/schema_hierarchy.rb +20 -21
  162. data/lib/spontaneous/plugins/schema_id.rb +33 -25
  163. data/lib/spontaneous/plugins/schema_title.rb +3 -4
  164. data/lib/spontaneous/plugins/serialisation.rb +32 -35
  165. data/lib/spontaneous/plugins/site/features.rb +32 -0
  166. data/lib/spontaneous/plugins/site/instance.rb +3 -2
  167. data/lib/spontaneous/plugins/site/level.rb +18 -0
  168. data/lib/spontaneous/plugins/site/map.rb +2 -1
  169. data/lib/spontaneous/plugins/site/publishing.rb +56 -59
  170. data/lib/spontaneous/plugins/site/revisions.rb +24 -19
  171. data/lib/spontaneous/plugins/site/schema.rb +33 -0
  172. data/lib/spontaneous/plugins/site/search.rb +43 -0
  173. data/lib/spontaneous/plugins/site/selectors.rb +35 -30
  174. data/lib/spontaneous/plugins/site/storage.rb +63 -0
  175. data/lib/spontaneous/plugins/site_map.rb +23 -25
  176. data/lib/spontaneous/plugins/styles.rb +35 -43
  177. data/lib/spontaneous/plugins/supertype.rb +3 -1
  178. data/lib/spontaneous/plugins/visibility.rb +90 -83
  179. data/lib/spontaneous/prototypes/box_prototype.rb +55 -25
  180. data/lib/spontaneous/prototypes/field_prototype.rb +66 -19
  181. data/lib/spontaneous/prototypes/style_prototype.rb +2 -2
  182. data/lib/spontaneous/publishing.rb +1 -1
  183. data/lib/spontaneous/publishing/immediate.rb +128 -49
  184. data/lib/spontaneous/publishing/simultaneous.rb +70 -0
  185. data/lib/spontaneous/rack.rb +38 -26
  186. data/lib/spontaneous/rack/around_back.rb +3 -23
  187. data/lib/spontaneous/rack/around_preview.rb +3 -8
  188. data/lib/spontaneous/rack/assets.rb +7 -6
  189. data/lib/spontaneous/rack/authentication.rb +21 -0
  190. data/lib/spontaneous/rack/back.rb +310 -331
  191. data/lib/spontaneous/rack/cacheable_file.rb +27 -0
  192. data/lib/spontaneous/rack/cookie_authentication.rb +38 -0
  193. data/lib/spontaneous/rack/css.rb +43 -0
  194. data/lib/spontaneous/rack/event_source.rb +31 -0
  195. data/lib/spontaneous/rack/front.rb +30 -8
  196. data/lib/spontaneous/rack/helpers.rb +31 -0
  197. data/lib/spontaneous/rack/media.rb +22 -21
  198. data/lib/spontaneous/rack/public.rb +2 -1
  199. data/lib/spontaneous/rack/query_authentication.rb +35 -0
  200. data/lib/spontaneous/rack/reloader.rb +6 -3
  201. data/lib/spontaneous/rack/user_helpers.rb +28 -0
  202. data/lib/spontaneous/render.rb +64 -23
  203. data/lib/spontaneous/render/context_base.rb +143 -0
  204. data/lib/spontaneous/render/format.rb +24 -19
  205. data/lib/spontaneous/render/helpers.rb +14 -0
  206. data/lib/spontaneous/render/helpers/html_helper.rb +69 -0
  207. data/lib/spontaneous/render/helpers/script_helper.rb +17 -0
  208. data/lib/spontaneous/render/helpers/stylesheet_helper.rb +16 -0
  209. data/lib/spontaneous/render/preview_context.rb +8 -0
  210. data/lib/spontaneous/render/preview_renderer.rb +6 -0
  211. data/lib/spontaneous/render/publish_context.rb +22 -0
  212. data/lib/spontaneous/render/published_renderer.rb +12 -13
  213. data/lib/spontaneous/render/publishing_renderer.rb +3 -0
  214. data/lib/spontaneous/render/render_cache.rb +26 -0
  215. data/lib/spontaneous/render/renderer.rb +5 -1
  216. data/lib/spontaneous/render/request_context.rb +8 -0
  217. data/lib/spontaneous/schema.rb +56 -24
  218. data/lib/spontaneous/schema/schema_modification.rb +2 -2
  219. data/lib/spontaneous/schema/uid.rb +22 -106
  220. data/lib/spontaneous/schema/uid_map.rb +120 -0
  221. data/lib/spontaneous/search.rb +11 -0
  222. data/lib/spontaneous/search/compound_indexer.rb +26 -0
  223. data/lib/spontaneous/search/database.rb +72 -0
  224. data/lib/spontaneous/search/field.rb +95 -0
  225. data/lib/spontaneous/search/index.rb +184 -0
  226. data/lib/spontaneous/search/results.rb +34 -0
  227. data/lib/spontaneous/server.rb +5 -1
  228. data/lib/spontaneous/site.rb +56 -16
  229. data/lib/spontaneous/storage.rb +22 -0
  230. data/lib/spontaneous/storage/backend.rb +10 -0
  231. data/lib/spontaneous/storage/cloud.rb +104 -0
  232. data/lib/spontaneous/storage/local.rb +52 -0
  233. data/lib/spontaneous/style.rb +27 -9
  234. data/lib/spontaneous/version.rb +1 -1
  235. data/spontaneous.gemspec +719 -0
  236. data/test/disabled/test_slots.rb +1 -1
  237. data/test/experimental/test_cutaneous.rb +309 -0
  238. data/test/experimental/test_features.rb +129 -0
  239. data/test/fixtures/application/views/{index.erubis → index.erb} +0 -0
  240. data/test/fixtures/back/public/css/sass_include.scss +5 -0
  241. data/test/fixtures/back/public/css/sass_template.scss +4 -0
  242. data/test/fixtures/example_application/templates/client_project.html.cut +4 -4
  243. data/test/fixtures/example_application/templates/client_project/images.html.cut +1 -1
  244. data/test/fixtures/example_application/templates/client_projects.html.cut +2 -2
  245. data/test/fixtures/example_application/templates/inline_image.html.cut +1 -1
  246. data/test/fixtures/example_application/templates/layouts/home.html.cut +7 -7
  247. data/test/fixtures/example_application/templates/layouts/info.html.cut +1 -1
  248. data/test/fixtures/example_application/templates/layouts/project.html.cut +4 -4
  249. data/test/fixtures/example_application/templates/layouts/projects.html.cut +2 -2
  250. data/test/fixtures/example_application/templates/project.html.cut +2 -2
  251. data/test/fixtures/example_application/templates/project/inline.html.cut +3 -3
  252. data/test/fixtures/example_application/templates/project_image.html.cut +1 -1
  253. data/test/fixtures/example_application/templates/text.html.cut +1 -1
  254. data/test/fixtures/fields/youtube_api_response.xml +102 -0
  255. data/test/fixtures/layouts/layouts/custom4.html.cut +0 -0
  256. data/test/fixtures/plugins/schema_plugin/public/css/plugin.css +1 -0
  257. data/test/fixtures/plugins/schema_plugin/public/js/plugin.js +1 -0
  258. data/test/fixtures/plugins/schema_plugin/public/static.html +1 -0
  259. data/test/fixtures/plugins/schema_plugin/public/subdir/image.gif +1 -0
  260. data/test/fixtures/plugins/schema_plugin/public/subdir/include1.scss +3 -0
  261. data/test/fixtures/plugins/schema_plugin/public/subdir/sass.scss +4 -0
  262. data/test/fixtures/plugins/schema_plugin/public/subdir/sass/include2.scss +4 -0
  263. data/test/fixtures/public/templates/layouts/default.html.cut +1 -1
  264. data/test/fixtures/public/templates/layouts/default.pdf.cut +1 -1
  265. data/test/fixtures/public/templates/layouts/default.rss.cut +1 -1
  266. data/test/fixtures/public/templates/layouts/dynamic.html.cut +1 -1
  267. data/test/fixtures/schema_modification/config/database.yml +0 -0
  268. data/test/fixtures/schema_modification/config/environment.rb +2 -0
  269. data/test/fixtures/schema_modification/schema/box.rb +1 -0
  270. data/test/fixtures/schema_modification/schema/custom_box.rb +1 -0
  271. data/test/fixtures/schema_modification/schema/page.rb +6 -0
  272. data/test/fixtures/schema_modification/schema/piece.rb +1 -0
  273. data/test/fixtures/search/config/database.yml +1 -0
  274. data/test/fixtures/search/config/indexes.rb +4 -0
  275. data/test/fixtures/serialisation/root_hash.yaml.erb +16 -20
  276. data/test/fixtures/storage/cloud/environment.rb +12 -0
  277. data/test/fixtures/storage/default/environment.rb +1 -0
  278. data/test/fixtures/templates/aliases/layouts/c_alias.html.cut +1 -1
  279. data/test/fixtures/templates/content/include.html.cut +1 -1
  280. data/test/fixtures/templates/content/include_dir.html.cut +1 -1
  281. data/test/fixtures/templates/content/included.epub.cut +1 -1
  282. data/test/fixtures/templates/content/included.html.cut +1 -1
  283. data/test/fixtures/templates/content/partial/included.html.cut +1 -1
  284. data/test/fixtures/templates/content/preprocess.html.cut +1 -1
  285. data/test/fixtures/templates/content/second.html.cut +1 -1
  286. data/test/fixtures/templates/content/template.epub.cut +1 -1
  287. data/test/fixtures/templates/content/template.html.cut +1 -1
  288. data/test/fixtures/templates/default_style_class.html.cut +1 -1
  289. data/test/fixtures/templates/engine/braces.html.cut +6 -0
  290. data/test/fixtures/templates/engine/multiline.html.cut +5 -0
  291. data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
  292. data/test/fixtures/templates/extended/main.html.cut +5 -5
  293. data/test/fixtures/templates/extended/parent.html.cut +10 -8
  294. data/test/fixtures/templates/extended/partial.html.cut +1 -0
  295. data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -0
  296. data/test/fixtures/templates/extended/with_includes.html.cut +9 -0
  297. data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +9 -0
  298. data/test/fixtures/templates/layouts/entries.html.cut +7 -7
  299. data/test/fixtures/templates/layouts/page_style.html.cut +1 -1
  300. data/test/fixtures/templates/layouts/params.html.cut +1 -1
  301. data/test/fixtures/templates/layouts/preview_render.html.cut +2 -2
  302. data/test/fixtures/templates/layouts/standard_page.html.cut +1 -1
  303. data/test/fixtures/templates/layouts/subdir_style.html.cut +1 -1
  304. data/test/fixtures/templates/layouts/template_params.html.cut +1 -1
  305. data/test/fixtures/templates/layouts/variables.html.cut +7 -0
  306. data/test/fixtures/templates/page_class/inline_style.html.cut +1 -1
  307. data/test/fixtures/templates/preview_render/variables.html.cut +1 -0
  308. data/test/fixtures/templates/publishing/templates/layouts/dynamic.html.cut +1 -0
  309. data/test/fixtures/templates/publishing/templates/layouts/dynamic.rtf.cut +1 -0
  310. data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -0
  311. data/test/fixtures/templates/template_class/anonymous_style.html.cut +2 -2
  312. data/test/fixtures/templates/template_class/complex_template.html.cut +4 -4
  313. data/test/fixtures/templates/template_class/complex_template.pdf.cut +4 -4
  314. data/test/fixtures/templates/template_class/default_template_style.html.cut +2 -2
  315. data/test/fixtures/templates/template_class/images_with_template.html.cut +3 -3
  316. data/test/fixtures/templates/template_class/slots_template.html.cut +3 -3
  317. data/test/fixtures/templates/template_class/slots_template.pdf.cut +3 -3
  318. data/test/fixtures/templates/template_class/this_template.epub.cut +1 -1
  319. data/test/fixtures/templates/template_class/this_template.html.cut +1 -1
  320. data/test/fixtures/templates/template_class/this_template.pdf.cut +1 -1
  321. data/test/fixtures/templates/with_default_style_class.html.cut +1 -1
  322. data/test/functional/test_application.rb +19 -15
  323. data/test/functional/test_back.rb +130 -98
  324. data/test/functional/test_front.rb +72 -28
  325. data/test/javascript/test_dom.rb +1 -1
  326. data/test/javascript/test_markdown.rb +1 -1
  327. data/test/slow/test_publishing.rb +94 -75
  328. data/test/slow/test_visibility.rb +47 -14
  329. data/test/test_helper.rb +30 -3
  330. data/test/ui/test_page_editing.rb +1 -1
  331. data/test/unit/test_alias.rb +200 -16
  332. data/test/unit/test_authentication.rb +26 -28
  333. data/test/unit/test_boxes.rb +146 -75
  334. data/test/unit/test_config.rb +42 -20
  335. data/test/unit/test_content.rb +156 -37
  336. data/test/unit/test_content_inheritance.rb +4 -2
  337. data/test/unit/test_extensions.rb +7 -1
  338. data/test/unit/test_fields.rb +558 -290
  339. data/test/{experimental → unit}/test_formats.rb +42 -3
  340. data/test/unit/test_generators.rb +3 -2
  341. data/test/unit/test_helpers.rb +54 -0
  342. data/test/unit/test_image_size.rb +1 -1
  343. data/test/unit/test_images.rb +51 -40
  344. data/test/unit/test_layouts.rb +21 -4
  345. data/test/unit/test_logger.rb +1 -1
  346. data/test/unit/test_media.rb +165 -7
  347. data/test/unit/test_page.rb +158 -27
  348. data/test/unit/test_permissions.rb +170 -187
  349. data/test/unit/test_piece.rb +27 -9
  350. data/test/unit/test_plugins.rb +153 -0
  351. data/test/unit/test_prototype_set.rb +60 -2
  352. data/test/unit/test_prototypes.rb +81 -20
  353. data/test/unit/test_render.rb +97 -9
  354. data/test/unit/test_schema.rb +167 -120
  355. data/test/unit/test_search.rb +588 -0
  356. data/test/unit/test_serialisation.rb +26 -10
  357. data/test/unit/test_site.rb +42 -25
  358. data/test/unit/test_storage.rb +88 -0
  359. data/test/unit/test_structure.rb +11 -5
  360. data/test/unit/test_styles.rb +64 -3
  361. data/test/unit/test_table_scoping.rb +76 -0
  362. data/test/unit/test_templates.rb +69 -31
  363. data/test/unit/test_type_hierarchy.rb +9 -1
  364. metadata +274 -208
  365. data/Gemfile.lock +0 -146
  366. data/application/css/min/54ee0ed3c7fac7632bd5c020d69e9a2503e0c88c.css +0 -1
  367. data/application/css/min/c256adc144e2bdd0b0539356b04eb62db01e1dc3.css +0 -1
  368. data/application/js/edit_dialogue.js +0 -137
  369. data/application/js/min/492a209de8ee955fa9c729a765377495001e11b1.js +0 -17
  370. data/application/js/min/80f684d77c940887a1d4a63e3a96102e993baa98.js +0 -88
  371. data/application/js/min/c7140ec9475e5bf868b901e0621338d7d162358b.js +0 -3
  372. data/application/js/min/f07f2bd6630ee31e1c2288ec223383d8f0658ba6.js +0 -2
  373. data/application/js/vendor/.DS_Store +0 -0
  374. data/application/js/vendor/JS.Class-2.1.5/src/command.js +0 -93
  375. data/application/js/vendor/JS.Class-2.1.5/src/comparable.js +0 -37
  376. data/application/js/vendor/JS.Class-2.1.5/src/constant_scope.js +0 -48
  377. data/application/js/vendor/JS.Class-2.1.5/src/core.js +0 -1060
  378. data/application/js/vendor/JS.Class-2.1.5/src/decorator.js +0 -50
  379. data/application/js/vendor/JS.Class-2.1.5/src/enumerable.js +0 -505
  380. data/application/js/vendor/JS.Class-2.1.5/src/forwardable.js +0 -22
  381. data/application/js/vendor/JS.Class-2.1.5/src/hash.js +0 -334
  382. data/application/js/vendor/JS.Class-2.1.5/src/linked_list.js +0 -114
  383. data/application/js/vendor/JS.Class-2.1.5/src/loader.js +0 -553
  384. data/application/js/vendor/JS.Class-2.1.5/src/method_chain.js +0 -172
  385. data/application/js/vendor/JS.Class-2.1.5/src/observable.js +0 -55
  386. data/application/js/vendor/JS.Class-2.1.5/src/package.js +0 -472
  387. data/application/js/vendor/JS.Class-2.1.5/src/proxy.js +0 -58
  388. data/application/js/vendor/JS.Class-2.1.5/src/ruby.js +0 -44
  389. data/application/js/vendor/JS.Class-2.1.5/src/set.js +0 -332
  390. data/application/js/vendor/JS.Class-2.1.5/src/stack_trace.js +0 -151
  391. data/application/js/vendor/JS.Class-2.1.5/src/state.js +0 -95
  392. data/application/js/vendor/JS.Class-2.1.5/src/stdlib.js +0 -2612
  393. data/application/js/vendor/jquery-1.4.2.min.js +0 -154
  394. data/application/js/vendor/jquery-1.4.3.min.js +0 -166
  395. data/application/js/vendor/jquery-1.5.1.min.js +0 -16
  396. data/application/js/vendor/jquery-1.5.1rc1.min.js +0 -24
  397. data/application/js/vendor/jquery-ui-1.8.6.custom.min.js +0 -265
  398. data/application/js/vendor/jquery-ui-1.8.custom.min.js +0 -106
  399. data/application/js/vendor/jquery.hotkeys-0.7.9.js +0 -248
  400. data/application/js/vendor/jquery.hotkeys-0.7.9.min.js +0 -19
  401. data/application/js/vendor/jsdiff.js +0 -169
  402. data/lib/cutaneous/first_pass_parser.rb +0 -23
  403. data/lib/cutaneous/parser_core.rb +0 -18
  404. data/lib/cutaneous/second_pass_parser.rb +0 -23
  405. data/lib/sequel/plugins/yajl_serialization.rb +0 -154
  406. data/lib/spontaneous/plugins.rb +0 -20
  407. data/lib/spontaneous/proxy_object.rb +0 -12
  408. data/lib/spontaneous/publishing/fire_and_forget.rb +0 -57
  409. data/lib/spontaneous/render/context.rb +0 -100
  410. data/spontaneous.gemspec.tmpl +0 -66
  411. data/test/experimental/test_plugins.rb +0 -64
  412. data/test/fixtures/templates/publishing/layouts/dynamic.html.cut +0 -1
  413. data/test/fixtures/templates/publishing/layouts/static.html.cut +0 -1
@@ -0,0 +1,12 @@
1
+ test_setting true
2
+
3
+ storage :s3 do |config|
4
+ config.update({
5
+ :provider => "AWS",
6
+ :aws_access_key_id => "ACCESS_KEY_ID",
7
+ :aws_secret_access_key => "SECRET_ACCESS_KEY",
8
+ :bucket => "media.example.com",
9
+ :endpoint => "http://media.example.com",
10
+ :host => "media.example.com"
11
+ })
12
+ end
@@ -0,0 +1 @@
1
+ test_setting true
@@ -1 +1 @@
1
- {{ aaa_field1 }}
1
+ ${ aaa_field1 }
@@ -1 +1 @@
1
- <html>{% include 'included' %}</html>
1
+ <html>%{ include 'included' }</html>
@@ -1 +1 @@
1
- <html>{% include 'partial/included' %}</html>
1
+ <html>%{ include 'partial/included' }</html>
@@ -1 +1 @@
1
- <epub>#{bell}{{ bell }}</epub>
1
+ <epub>{{ bell }}${bell}</epub>
@@ -1 +1 @@
1
- #{bell}{{ bell }}
1
+ {{bell}}${bell}
@@ -1 +1 @@
1
- #{bell}{{ bell }}
1
+ {{ bell }}${bell}
@@ -1 +1 @@
1
- <html><title>{{ title }}</title>#{bell}</html>
1
+ <html><title>${ title }</title>{{bell}}</html>
@@ -1 +1 @@
1
- <html><title>#{title}</title>#{bell}</html>
1
+ <html><title>{{title}}</title>{{bell}}</html>
@@ -1 +1 @@
1
- <epub>{% include 'included' %}</epub>
1
+ <epub>%{ include 'included' }</epub>
@@ -1 +1 @@
1
- <html><title>{{ title }}</title></html>
1
+ <html><title>${ title }</title></html>
@@ -1 +1 @@
1
- Title: {{ title }}
1
+ Title: ${ title }
@@ -0,0 +1,6 @@
1
+ %{
2
+ a = { :a => "a", :b => "b" }
3
+ b = { :c => "c", :d => "d" }
4
+ c = a.map { |k, v| "#{k}-#{v}"}.join("/")
5
+ }
6
+ ${ a[:a] }${ a[:b] }
@@ -0,0 +1,5 @@
1
+ %{
2
+ something = 3
3
+ nothing = 4; another = 5
4
+ }
5
+ ${ something + nothing + another }
@@ -1,10 +1,10 @@
1
- {% block :title %}Grandparent Title{% endblock %}
2
- {% block :navigation %}
1
+ %{ block :title }Grandparent Title%{ endblock }
2
+ %{ block :navigation }
3
3
  Grandparent Nav
4
- {% endblock %}
5
- {% block :body %}
4
+ %{ endblock }
5
+ %{ block :body }
6
6
  Grandparent Body
7
- {% endblock %}
8
- {% block :footer %}
7
+ %{ endblock }
8
+ %{ block :footer }
9
9
  Grandparent Footer
10
- {% endblock %}
10
+ %{ endblock }
@@ -1,6 +1,6 @@
1
- {% extends 'parent' %}
2
- {% block :title %}Main Title #{page.title}{% endblock %}
3
- {% block :body %}
1
+ %{ extends 'parent' }
2
+ %{ block :title }Main Title {{page.title}}%{ endblock }
3
+ %{ block :body }
4
4
  Main Body
5
- {% block_super %}
6
- {% endblock %}
5
+ %{ block_super }
6
+ %{ endblock }
@@ -1,10 +1,12 @@
1
- {% extends 'grandparent' %}
2
- {% block :title %}Parent Title{% endblock %}
3
- {% block :body %}
1
+ %{ extends 'grandparent' }
2
+ %{ block :title }Parent Title
3
+ %{ endblock }
4
+
5
+ %{ block :body }
4
6
  Parent Body
5
- {% block_super %}
6
- {% endblock %}
7
- {% block :footer %}
8
- {% block_super %}
7
+ %{ block_super }
8
+ %{ endblock }
9
+ %{ block :footer }
10
+ %{ block_super }
9
11
  Parent Footer
10
- {% endblock %}
12
+ %{ endblock }
@@ -0,0 +1 @@
1
+ PARTIAL
@@ -0,0 +1,9 @@
1
+ %{ extends 'parent' }
2
+ %{ block :navigation }
3
+
4
+ %{ endblock }
5
+ %{ block :body }
6
+ INCLUDE
7
+ %{ include 'partial' }
8
+ %{ endblock }
9
+
@@ -0,0 +1,9 @@
1
+ %{ extends 'parent' }
2
+ %{ block :navigation }
3
+
4
+ %{ endblock }
5
+ %{ block :body }
6
+ INCLUDE
7
+ %{ include 'partial_with_locals', :title => "local title" }
8
+ %{ endblock }
9
+
@@ -1,7 +1,7 @@
1
- {% images.each do |image| %}
2
- {{image.position}}{% if image.first? %}>{% end %}{% if image.last? %}<{% end %}{{ image.title }}
3
- {% end %}
4
- {% images.each_with_index do |image, i| %}
5
- {{ i }}:{{ image.title }}
6
- {% end %}
7
- {{ images.map { |i| i.title }.join('.') }}
1
+ %{ images.each do |image| }
2
+ ${image.position}%{ if image.first? }>%{ end }%{ if image.last? }<%{ end }${ image.title }
3
+ %{ end }
4
+ %{ images.each_with_index do |image, i| }
5
+ ${ i }:${ image.title }
6
+ %{ end }
7
+ ${ images.map do |i|; i.title end.join('.') }
@@ -1 +1 @@
1
- <html>{{ render_content }}</html>
1
+ <html>${ render_content }</html>
@@ -1 +1 @@
1
- {{title}} #{welcome}
1
+ ${title} {{welcome}}
@@ -1,2 +1,2 @@
1
- {{ title }} #{ description }
2
- {{ images }}
1
+ ${ title } {{ description }}
2
+ ${ images }
@@ -1 +1 @@
1
- /{{ title }}/
1
+ /${ title }/
@@ -1 +1 @@
1
- <{{ title }}>
1
+ <${ title }>
@@ -1 +1 @@
1
- {{ image(:alt => "Smelly") }}
1
+ ${ image(:alt => "Smelly") }
@@ -0,0 +1,7 @@
1
+ %{
2
+ local = "local"
3
+ @variable = "variable"
4
+ }
5
+ ${ param }
6
+ ${ images }
7
+ ${ local }
@@ -1 +1 @@
1
- {{ title }}
1
+ ${ title }
@@ -0,0 +1 @@
1
+ <${ @variable }/${ param }/${ local }>
@@ -0,0 +1 @@
1
+ Page: '${ title }' {{Time.now.to_i}}
@@ -1,4 +1,4 @@
1
1
  <root>
2
- {{ images.introduction }}
3
- {{ images }}
2
+ ${ images.introduction }
3
+ ${ images }
4
4
  </root>
@@ -1,6 +1,6 @@
1
1
  <complex>
2
- {{ title }}
3
- {% content.each do |piece| %}
4
- <piece>{{ piece }}</piece>
5
- {% end %}
2
+ ${ title }
3
+ %{ content.each do |piece| }
4
+ <piece>${ piece }</piece>
5
+ %{ end }
6
6
  </complex>
@@ -1,6 +1,6 @@
1
1
  <pdf>
2
- {{ title }}
3
- {% content.each do |piece| %}
4
- <piece>{{ piece }}</piece>
5
- {% end %}
2
+ ${ title }
3
+ %{ content.each do |piece| }
4
+ <piece>${ piece }</piece>
5
+ %{ end }
6
6
  </pdf>
@@ -1,4 +1,4 @@
1
1
  <root>
2
- {{ images_with_template.introduction }}
3
- {{ images_with_template }}
2
+ ${ images_with_template.introduction }
3
+ ${ images_with_template }
4
4
  </root>
@@ -1,5 +1,5 @@
1
1
  <images>
2
- {% pieces.each do |image| %}
3
- {{ image }}
4
- {% end %}
2
+ %{ pieces.each do |image| }
3
+ ${ image }
4
+ %{ end }
5
5
  </images>
@@ -1,5 +1,5 @@
1
1
  <boxes>
2
- {% images.entries.each do |image| %}
3
- <img>{{ image }}</img>
4
- {% end %}
2
+ %{ images.entries.each do |image| }
3
+ <img>${ image }</img>
4
+ %{ end }
5
5
  </boxes>
@@ -1,5 +1,5 @@
1
1
  <boxes-pdf>
2
- {% images.entries.each do |image| %}
3
- <img>{{ image }}</img>
4
- {% end %}
2
+ %{ images.entries.each do |image| }
3
+ <img>${ image }</img>
4
+ %{ end }
5
5
  </boxes-pdf>
@@ -1 +1 @@
1
- <EPUB><title>{{ title }}</title><body>{{ description }}</body></EPUB>
1
+ <EPUB><title>${ title }</title><body>${ description }</body></EPUB>
@@ -1 +1 @@
1
- <html><title>{{ title }}</title><body>{{ description }}</body></html>
1
+ <html><title>${ title }</title><body>${ description }</body></html>
@@ -1 +1 @@
1
- <PDF><title>{{ title }}</title><body>{{ description }}</body></PDF>
1
+ <PDF><title>${ title }</title><body>${ description }</body></PDF>
@@ -1 +1 @@
1
- Title: {{ title }}
1
+ Title: ${ title }
@@ -1,6 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'test_helper'
3
+ require File.expand_path('../../test_helper', __FILE__)
4
4
 
5
5
  # set :environment, :test
6
6
 
@@ -8,21 +8,24 @@ class ApplicationTest < MiniTest::Spec
8
8
  include Spontaneous
9
9
  include ::Rack::Test::Methods
10
10
 
11
- def setup
12
- @saved_schema_root = Spontaneous.schema_root
13
- Spontaneous.schema_root = nil
14
- Spontaneous.root = File.expand_path("../../fixtures/example_application", __FILE__)
15
- File.exists?(Spontaneous.root).should be_true
11
+ def self.site_root
12
+ @site_root
16
13
  end
17
14
 
18
- def teardown
19
- # to keep other tests working
20
- Spontaneous.schema_root = @saved_schema_root
15
+ def self.startup
16
+ @site_root = Dir.mktmpdir
17
+ app_root = File.expand_path('../../fixtures/example_application', __FILE__)
18
+ FileUtils.cp_r(app_root, @site_root)
19
+ @site_root += "/example_application"
20
+ end
21
+
22
+ def self.shutdown
23
+ teardown_site
21
24
  end
22
25
 
23
26
  context "schema" do
24
27
  setup do
25
- Spontaneous.init(:mode => :back, :environment => :development)
28
+ Spontaneous.init(:root => self.class.site_root, :mode => :back, :environment => :development)
26
29
  end
27
30
 
28
31
  should "load" do
@@ -32,7 +35,7 @@ class ApplicationTest < MiniTest::Spec
32
35
 
33
36
  context "Site" do
34
37
  setup do
35
- Spontaneous.init(:mode => :back, :environment => :development)
38
+ Spontaneous.init(:root => self.class.site_root, :mode => :back, :environment => :development)
36
39
  end
37
40
  should "have the same config as Spontaneous" do
38
41
  Site.config.should == Spontaneous.config
@@ -43,10 +46,11 @@ class ApplicationTest < MiniTest::Spec
43
46
  Site.config.butter.should == "yummy"
44
47
  end
45
48
  end
49
+
46
50
  context "back, development" do
47
51
 
48
52
  setup do
49
- Spontaneous.init(:mode => :back, :environment => :development)
53
+ Spontaneous.init(:root => self.class.site_root, :mode => :back, :environment => :development)
50
54
  Sequel::Migrator.apply(Spontaneous.database, 'db/migrations')
51
55
  end
52
56
 
@@ -98,7 +102,7 @@ class ApplicationTest < MiniTest::Spec
98
102
  context "front, development" do
99
103
 
100
104
  setup do
101
- Spontaneous.init(:mode => :front, :environment => :development)
105
+ Spontaneous.init(:root => self.class.site_root, :mode => :front, :environment => :development)
102
106
  end
103
107
 
104
108
  should "have the right mode setting" do
@@ -121,7 +125,7 @@ class ApplicationTest < MiniTest::Spec
121
125
 
122
126
  context "back, production" do
123
127
  setup do
124
- Spontaneous.init(:mode => :back, :environment => :production)
128
+ Spontaneous.init(:root => self.class.site_root, :mode => :back, :environment => :production)
125
129
  end
126
130
 
127
131
  should "have the right mode setting" do
@@ -153,7 +157,7 @@ class ApplicationTest < MiniTest::Spec
153
157
  context "front, production" do
154
158
 
155
159
  setup do
156
- Spontaneous.init(:mode => :front, :environment => :production)
160
+ Spontaneous.init(:root => self.class.site_root, :mode => :front, :environment => :production)
157
161
  end
158
162
 
159
163
  should "have the right mode setting" do
@@ -1,7 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'test_helper'
4
- require 'tmpdir'
3
+ require File.expand_path('../../test_helper', __FILE__)
5
4
 
6
5
  # set :environment, :test
7
6
 
@@ -10,30 +9,32 @@ class BackTest < MiniTest::Spec
10
9
  include ::Rack::Test::Methods
11
10
 
12
11
 
12
+ def self.site_root
13
+ @site_root
14
+ end
15
+
13
16
  def self.startup
14
- # Spontaneous.logger = nil
15
- Spontaneous.logger.silent!
17
+ @site_root = Dir.mktmpdir
18
+ app_root = File.expand_path('../../fixtures/back', __FILE__)
19
+ FileUtils.cp_r(app_root, @site_root)
20
+ @site_root += "/back"
21
+ FileUtils.mkdir_p(@site_root / "cache")
22
+ FileUtils.cp_r(File.join(File.dirname(__FILE__), "../fixtures/media"), @site_root / "cache")
16
23
  end
17
24
 
18
25
  def self.shutdown
26
+ teardown_site
19
27
  end
20
28
 
21
29
  def app
22
30
  Spontaneous::Rack::Back.application
23
31
  end
24
32
 
25
- def teardown
26
- # teardown_site_fixture
27
- end
28
-
29
33
  def setup
30
- @media_dir = File.expand_path('../../../tmp/media', __FILE__)
31
- Spontaneous.media_dir = @media_dir
32
- end
33
- def teardown
34
- ::FileUtils.rm_rf(@media_dir)
34
+ @site = setup_site(self.class.site_root)
35
35
  end
36
36
 
37
+
37
38
  def auth_post(path, params={})
38
39
  post(path, params.merge("__key" => @key))
39
40
  end
@@ -44,39 +45,47 @@ class BackTest < MiniTest::Spec
44
45
 
45
46
  context "Editing interface" do
46
47
  setup do
48
+ @storage = @site.default_storage
49
+ @site.stubs(:storage).with(anything).returns(@storage)
47
50
  config = mock()
48
51
  config.stubs(:reload_classes).returns(false)
49
52
  config.stubs(:auto_login).returns('root')
50
53
  config.stubs(:default_charset).returns('utf-8')
51
54
  config.stubs(:publishing_method).returns(:immediate)
52
- root = File.expand_path("../../fixtures/back", __FILE__)
53
- Spontaneous.root = root
54
- instance = Spontaneous::Site.instantiate(root, :test, :back)
55
- instance.stubs(:config).returns(config)
56
- Spontaneous.instance = instance
57
- app.send(:set, :raise_errors, true)
58
- app.send(:set, :dump_errors, true)
59
- app.send(:set, :show_exceptions, true)
60
- S::Schema.reset!
55
+ config.stubs(:site_domain).returns('example.org')
56
+ config.stubs(:site_id).returns('example_org')
57
+ config.stubs(:site_id).returns('example_org')
58
+ @site.stubs(:config).returns(config)
59
+
60
+ S::Rack::Back::EditingInterface.set :raise_errors, true
61
+ S::Rack::Back::EditingInterface.set :dump_errors, true
62
+ S::Rack::Back::EditingInterface.set :show_exceptions, false
63
+
61
64
  Content.delete
62
65
  Spontaneous::Permissions::User.delete
63
66
  self.template_root = File.expand_path('../../fixtures/back/templates', __FILE__)
64
67
  @app_dir = File.expand_path("../../fixtures/application", __FILE__)
65
68
  File.exists?(@app_dir).should be_true
66
69
  Spontaneous.stubs(:application_dir).returns(@app_dir)
67
- Spontaneous::Rack::Back.application.send :set, :show_exceptions, false
68
- # setup_site_fixture
70
+ # Spontaneous::Rack::Back.application.send :set, :show_exceptions, false
71
+
69
72
  # annoying to have to do this, but there you go
70
73
  @user = Spontaneous::Permissions::User.create(:email => "root@example.com", :login => "root", :name => "root", :password => "rootpass", :password_confirmation => "rootpass")
71
74
  @user.update(:level => Spontaneous::Permissions.root)
72
75
  @user.save
73
76
  @key = "c5AMX3r5kMHX2z9a5ExLKjAmCcnT6PFf22YQxzb4Codj"
74
- Spontaneous::Permissions.stubs(:active_user).returns(@user)
77
+ @key.stubs(:user).returns(@user)
78
+ @key.stubs(:key_id).returns(@key)
79
+ @user.stubs(:access_keys).returns([@key])
80
+
81
+ Spontaneous::Permissions::User.stubs(:[]).with(:login => 'root').returns(@user)
82
+ Spontaneous::Permissions::AccessKey.stubs(:authenticate).with(@key).returns(@key)
75
83
  Spontaneous::Permissions::AccessKey.stubs(:valid?).with(@key, @user).returns(true)
76
84
 
77
85
  class Page < Spot::Page
78
86
  field :title
79
87
  end
88
+
80
89
  class Piece < Spot::Piece; end
81
90
  class Project < Page; end
82
91
  class Image < Piece
@@ -95,7 +104,7 @@ class BackTest < MiniTest::Spec
95
104
  end
96
105
 
97
106
  class LinkedJob < Piece
98
- alias_of Job
107
+ alias_of proc { |owner, box| box.contents }
99
108
  end
100
109
 
101
110
  class HomePage < Page
@@ -148,8 +157,8 @@ class BackTest < MiniTest::Spec
148
157
 
149
158
  should "return application page" do
150
159
  get '/@spontaneous/'
151
- assert last_response.ok?
152
- last_response.body.should =~ /<title>Spontaneous<\/title>/
160
+ assert last_response.ok?, "Should have returned 200 but got #{last_response.status}"
161
+ last_response.body.should =~ /<title>Spontaneous/
153
162
  end
154
163
 
155
164
  should "return json for root page" do
@@ -171,7 +180,7 @@ class BackTest < MiniTest::Spec
171
180
  auth_get "/@spontaneous/types"
172
181
  assert last_response.ok?
173
182
  last_response.content_type.should == "application/json;charset=utf-8"
174
- assert_equal Schema.serialise_http, last_response.body
183
+ assert_equal Site.schema.serialise_http, last_response.body
175
184
  end
176
185
 
177
186
  should "return scripts from js dir" do
@@ -254,7 +263,7 @@ class BackTest < MiniTest::Spec
254
263
  assert last_response.ok?
255
264
  last_response.content_type.should == "application/json;charset=utf-8"
256
265
  @job1 = Content[@job1.id]
257
- last_response.body.should == @job1.serialise_http
266
+ last_response.body.should == @job1.serialise_http(@user)
258
267
  @job1.fields.title.value.should == "Updated field_name_1"
259
268
  end
260
269
 
@@ -267,7 +276,7 @@ class BackTest < MiniTest::Spec
267
276
  assert last_response.ok?
268
277
  last_response.content_type.should == "application/json;charset=utf-8"
269
278
  @home = Content[@home.id]
270
- last_response.body.should == @home.serialise_http
279
+ last_response.body.should == @home.serialise_http(@user)
271
280
  @home.fields.title.value.should == "Updated title"
272
281
  @home.fields.introduction.value.should == "<p>Updated intro</p>\n"
273
282
  end
@@ -285,11 +294,12 @@ class BackTest < MiniTest::Spec
285
294
  end
286
295
 
287
296
  should "generate an error if there is a field version conflict" do
297
+ field = @job1.fields.title
298
+ field.version = 3
299
+ @job1.save.reload
288
300
  field = @job1.fields.title
289
301
  sid = field.schema_id.to_s
290
302
  params = { "fields" => {sid => "2"} }
291
- field.stubs(:version).returns(3)
292
- Content.stubs(:[]).with(@job1.id.to_s).returns(@job1)
293
303
 
294
304
  auth_post "/@spontaneous/version/#{@job1.id}", params
295
305
  assert last_response.status == 409, "Should have recieved a 409 conflict but instead received a #{last_response.status}"
@@ -301,12 +311,14 @@ class BackTest < MiniTest::Spec
301
311
  end
302
312
 
303
313
  should "generate an error if there is a field version conflict for boxes" do
314
+ box = @job1.images
315
+ field = box.fields.title
316
+ field.version = 3
317
+ @job1.save.reload
304
318
  box = @job1.images
305
319
  field = box.fields.title
306
320
  sid = field.schema_id.to_s
307
321
  params = { "fields" => {sid => "2"} }
308
- field.stubs(:version).returns(3)
309
- Content.stubs(:[]).with(@job1.id.to_s).returns(@job1)
310
322
 
311
323
  auth_post "/@spontaneous/version/#{@job1.id}/#{box.schema_id.to_s}", params
312
324
  assert last_response.status == 409, "Should have recieved a 409 conflict but instead received a #{last_response.status}"
@@ -381,6 +393,12 @@ class BackTest < MiniTest::Spec
381
393
  end
382
394
  end
383
395
  end
396
+
397
+ should "render SASS templates" do
398
+ get "/css/sass_template.css"
399
+ assert last_response.ok?, "Should return 200 but got #{last_response.status}"
400
+ last_response.body.should =~ /color: #ffeeff/
401
+ end
384
402
  end
385
403
 
386
404
  context "static files" do
@@ -412,7 +430,7 @@ class BackTest < MiniTest::Spec
412
430
  context "media files" do
413
431
  setup do
414
432
  Spontaneous.stubs(:reload!)
415
- Spontaneous.media_dir = File.join(File.dirname(__FILE__), "../fixtures/media")
433
+ # Spontaneous.media_dir = File.join(File.dirname(__FILE__), "../fixtures/media")
416
434
  end
417
435
  teardown do
418
436
  end
@@ -432,17 +450,6 @@ class BackTest < MiniTest::Spec
432
450
  Spontaneous::Media.stubs(:upload_index).returns(23)
433
451
  end
434
452
 
435
- should "create a file in a safe subdirectory of media/tmp" do
436
- auth_post "@spontaneous/file/upload/9723", "file" => ::Rack::Test::UploadedFile.new(@src_file, "image/jpeg")
437
- assert last_response.ok?
438
- last_response.content_type.should == "application/json;charset=utf-8"
439
- assert_equal({
440
- :id => '9723',
441
- :src => "/media/tmp/1288882153.23/rose.jpg",
442
- :path => "#{Spontaneous.media_dir}/tmp/1288882153.23/rose.jpg"
443
- }.to_json, last_response.body)
444
- end
445
-
446
453
  should "replace values of fields immediately when required" do
447
454
  @image1.image.processed_value.should == ""
448
455
  auth_post "@spontaneous/file/replace/#{@image1.id}", "file" => ::Rack::Test::UploadedFile.new(@src_file, "image/jpeg"), "field" => @image1.image.schema_id.to_s
@@ -451,11 +458,11 @@ class BackTest < MiniTest::Spec
451
458
  @image1 = Content[@image1.id]
452
459
  src = @image1.image.src
453
460
  src.should =~ /^\/media(.+)\/rose\.jpg$/
454
- last_response.body.should == {
455
- :id => @image1.id,
456
- :src => src,
457
- :version => 1
458
- }.to_json
461
+ Spot::JSON.parse(last_response.body).should == @image1.image.export
462
+ # :id => @image1.id,
463
+ # :src => src,
464
+ # :version => 1
465
+ # }.to_json
459
466
  File.exist?(Media.to_filepath(src)).should be_true
460
467
  get src
461
468
  assert last_response.ok?
@@ -469,11 +476,11 @@ class BackTest < MiniTest::Spec
469
476
  @job1 = Content[@job1.id]
470
477
  src = @job1.images.image.src
471
478
  src.should =~ /^\/media(.+)\/rose\.jpg$/
472
- last_response.body.should == {
473
- :id => @job1.id,
474
- :src => src,
475
- :version => 1
476
- }.to_json
479
+ Spot::JSON.parse(last_response.body).should == @job1.images.image.export
480
+ # :id => @job1.id,
481
+ # :src => src,
482
+ # :version => 1
483
+ # }.to_json
477
484
  File.exist?(Media.to_filepath(src)).should be_true
478
485
  get src
479
486
  assert last_response.ok?
@@ -502,7 +509,7 @@ class BackTest < MiniTest::Spec
502
509
  setup do
503
510
  Spontaneous.stubs(:reload!)
504
511
  end
505
- should "be addable" do
512
+ should "default to being added at the top" do
506
513
  current_count = @home.in_progress.pieces.length
507
514
  first_id = @home.in_progress.pieces.first.id
508
515
  @home.in_progress.pieces.first.class.name.should_not == "BackTest::Image"
@@ -527,6 +534,24 @@ class BackTest < MiniTest::Spec
527
534
  last_response.content_type.should == "application/json;charset=utf-8"
528
535
  Content[target.id].should be_nil
529
536
  end
537
+
538
+ should "be addable at the bottom" do
539
+ current_count = @home.in_progress.pieces.length
540
+ last_id = @home.in_progress.pieces.last.id
541
+ @home.in_progress.pieces.last.class.name.should_not == "BackTest::Image"
542
+ auth_post "/@spontaneous/add/#{@home.id}/#{@home.in_progress.schema_id.to_s}/#{Image.schema_id.to_s}", :position => -1
543
+ assert last_response.ok?, "Recieved #{last_response.status} not 200"
544
+ last_response.content_type.should == "application/json;charset=utf-8"
545
+ @home.reload
546
+ @home.in_progress.pieces.length.should == current_count+1
547
+ @home.in_progress.pieces.last.id.should_not == last_id
548
+ @home.in_progress.pieces.last.class.name.should == "BackTest::Image"
549
+ required_response = {
550
+ :position => -1,
551
+ :entry => @home.in_progress.pieces.last.export
552
+ }
553
+ Spot::JSON.parse(last_response.body).should == required_response
554
+ end
530
555
  end
531
556
 
532
557
  context "Page paths" do
@@ -540,7 +565,7 @@ class BackTest < MiniTest::Spec
540
565
  last_response.content_type.should == "application/json;charset=utf-8"
541
566
  @project1.reload
542
567
  @project1.path.should == "/howabout"
543
- Spot::JSON.parse(last_response.body).should == {:path => '/howabout' }
568
+ Spot::JSON.parse(last_response.body).should == {:path => '/howabout', :slug => 'howabout' }
544
569
  end
545
570
  should "raise error when trying to save duplicate path" do
546
571
  auth_post "/@spontaneous/slug/#{@project1.id}", 'slug' => 'project2'
@@ -571,6 +596,7 @@ class BackTest < MiniTest::Spec
571
596
  Spot::JSON.parse(last_response.body).should == {:uid => uid}
572
597
  @project1.reload.uid.should == uid
573
598
  end
599
+
574
600
  should "not be editable by non-developer users" do
575
601
  @user.stubs(:developer?).returns(false)
576
602
  uid = "boom"
@@ -584,11 +610,6 @@ class BackTest < MiniTest::Spec
584
610
  context "Request cache" do
585
611
  setup do
586
612
  Spontaneous.stubs(:reload!)
587
- # @home = HomePage.new
588
- # @piece = Text.new
589
- # @home.in_progress << @piece
590
- # @home.save
591
- # @piece.save
592
613
  Change.delete
593
614
  end
594
615
  should "wrap all updates in a Change.record" do
@@ -649,13 +670,6 @@ class BackTest < MiniTest::Spec
649
670
  auth_post "/@spontaneous/publish/publish", :change_set_ids => [@c1.id, @c2.id]
650
671
  assert last_response.ok?
651
672
  end
652
-
653
- should "be able to retrieve the publishing status" do
654
- Site.publishing_method.status = "something:50"
655
- auth_get "/@spontaneous/publish/status"
656
- assert last_response.ok?
657
- last_response.body.should == {:status => "something", :progress => "50"}.to_json
658
- end
659
673
  end
660
674
 
661
675
  context "New sites" do
@@ -699,9 +713,9 @@ class BackTest < MiniTest::Spec
699
713
  end
700
714
 
701
715
  should "be able to retrieve a list of potential targets" do
702
- auth_get "/@spontaneous/targets/#{LinkedJob.schema_id}"
716
+ auth_get "/@spontaneous/targets/#{LinkedJob.schema_id}/#{@home.id}/#{@home.in_progress.schema_id}"
703
717
  assert last_response.ok?
704
- Spot::JSON.parse(last_response.body).should == LinkedJob.targets.map do |job|
718
+ Spot::JSON.parse(last_response.body).should == LinkedJob.targets(@home, @home.in_progress).map do |job|
705
719
  {
706
720
  :id => job.id,
707
721
  :title => job.title.to_s,
@@ -711,7 +725,7 @@ class BackTest < MiniTest::Spec
711
725
  end
712
726
  should "be able to add an alias to a box" do
713
727
  @home.featured_jobs.pieces.length.should == 0
714
- auth_post "/@spontaneous/alias/#{@home.id}/#{HomePage.boxes[:featured_jobs].schema_id.to_s}", 'alias_id' => LinkedJob.schema_id.to_s, 'target_id' => Job.first.id
728
+ auth_post "/@spontaneous/alias/#{@home.id}/#{HomePage.boxes[:featured_jobs].schema_id.to_s}", 'alias_id' => LinkedJob.schema_id.to_s, 'target_id' => Job.first.id, "position" => 0
715
729
  assert last_response.ok?, "Recieved #{last_response.status} not 200"
716
730
  last_response.content_type.should == "application/json;charset=utf-8"
717
731
  @home.reload
@@ -721,7 +735,27 @@ class BackTest < MiniTest::Spec
721
735
  a.target.should == Job.first
722
736
  required_response = {
723
737
  :position => 0,
724
- :entry => @home.featured_jobs.pieces.first.export
738
+ :entry => @home.featured_jobs.pieces.first.export(@user)
739
+ }
740
+ Spot::JSON.parse(last_response.body).should == required_response
741
+ end
742
+ should "be able to add an alias to a box at any position" do
743
+ @home.featured_jobs << Job.new
744
+ @home.featured_jobs << Job.new
745
+ @home.featured_jobs << Job.new
746
+ @home.save.reload
747
+ @home.featured_jobs.pieces.length.should == 3
748
+ auth_post "/@spontaneous/alias/#{@home.id}/#{HomePage.boxes[:featured_jobs].schema_id.to_s}", 'alias_id' => LinkedJob.schema_id.to_s, 'target_id' => Job.first.id, "position" => 2
749
+ assert last_response.ok?, "Recieved #{last_response.status} not 200"
750
+ last_response.content_type.should == "application/json;charset=utf-8"
751
+ @home.reload
752
+ @home.featured_jobs.pieces.length.should == 4
753
+ a = @home.featured_jobs[2]
754
+ a.alias?.should be_true
755
+ a.target.should == Job.first
756
+ required_response = {
757
+ :position => 2,
758
+ :entry => @home.featured_jobs[2].export(@user)
725
759
  }
726
760
  Spot::JSON.parse(last_response.body).should == required_response
727
761
  end
@@ -732,11 +766,10 @@ class BackTest < MiniTest::Spec
732
766
  # enable schema validation errors by creating and using a permanent map file
733
767
  @schema_map = File.join(Dir.tmpdir, "schema.yml")
734
768
  FileUtils.rm(@schema_map) if File.exists?(@schema_map)
735
- S::Schema.schema_map_file = @schema_map
736
- S::Schema.validate!
737
- S::Schema.write_schema
738
- S::Schema.schema_loader_class = S::Schema::PersistentMap
739
- S::Schema.reload!
769
+ S.schema.schema_map_file = @schema_map
770
+ S.schema.validate!
771
+ S.schema.write_schema
772
+ S.schema.schema_loader_class = S::Schema::PersistentMap
740
773
  Job.field :replaced
741
774
  @df1 = Job.field_prototypes[:title]
742
775
  @af1 = Job.field_prototypes[:replaced]
@@ -744,15 +777,14 @@ class BackTest < MiniTest::Spec
744
777
  @uid = @df1.schema_id.to_s
745
778
  Job.stubs(:field_prototypes).returns({:replaced => @af1, :image => @f1})
746
779
  Job.stubs(:fields).returns([@af1, @f1])
747
- S::Schema.reload!
748
- lambda { S::Schema.validate! }.must_raise(Spontaneous::SchemaModificationError)
780
+ lambda { S.schema.validate! }.must_raise(Spontaneous::SchemaModificationError)
749
781
  # hammer, meet nut
750
782
  S::Rack::Back::EditingInterface.use Spontaneous::Rack::Reloader
751
783
  Spontaneous::Loader.stubs(:reload!)
752
784
  end
753
785
 
754
786
  teardown do
755
- S::Schema.schema_loader_class = S::Schema::TransientMap
787
+ S.schema.schema_loader_class = S::Schema::TransientMap
756
788
  FileUtils.rm(@schema_map) if File.exists?(@schema_map)
757
789
  end
758
790
 
@@ -762,7 +794,7 @@ class BackTest < MiniTest::Spec
762
794
  end
763
795
 
764
796
  should "present a dialogue page with possible solutions" do
765
- get '/@spontaneous/'
797
+ auth_get '/@spontaneous/'
766
798
  assert last_response.status == 412, "Schema validation errors should raise a 412 but instead recieved a #{last_response.status}"
767
799
  last_response.body.should =~ %r{<form action="/@spontaneous/schema/delete" method="post"}
768
800
  last_response.body.should =~ %r{<input type="hidden" name="uid" value="#{@df1.schema_id}"}
@@ -776,7 +808,7 @@ class BackTest < MiniTest::Spec
776
808
  auth_post action, "uid" => @df1.schema_id, "ref" => @af1.schema_name, "origin" => "/@spontaneous"
777
809
  last_response.status.should == 302
778
810
  begin
779
- S::Schema.validate!
811
+ S.schema.validate!
780
812
  rescue Spontaneous::SchemaModificationError => e
781
813
  flunk("Schema modification link should have resolved schema errors")
782
814
  end
@@ -787,7 +819,7 @@ class BackTest < MiniTest::Spec
787
819
  auth_post action, "uid" => @df1.schema_id, "origin" => "/@spontaneous"
788
820
  last_response.status.should == 302
789
821
  begin
790
- S::Schema.validate!
822
+ S.schema.validate!
791
823
  rescue Spontaneous::SchemaModificationError => e
792
824
  flunk("Schema modification link should have resolved schema errors")
793
825
  end
@@ -797,21 +829,19 @@ class BackTest < MiniTest::Spec
797
829
  end
798
830
  context "sharded uploading" do
799
831
  setup do
800
- @temp_dir = Dir.mktmpdir
801
- @shard_dir = @temp_dir / "tmp"
832
+ Spontaneous.stubs(:reload!)
802
833
  @image = File.expand_path("../../fixtures/sharding/rose.jpg", __FILE__)
803
834
  # read the digest dynamically in case I change that image
804
835
  @image_digest = S::Media.digest(@image)
805
- FileUtils.mkdir(@shard_dir)
806
- Spontaneous.media_dir = @temp_dir
807
836
  end
837
+
808
838
  teardown do
809
- FileUtils.rm_rf(@temp_dir)
810
839
  end
811
840
 
812
841
  should "have the right setting for shard_dir" do
813
- Spontaneous.shard_path.should == @shard_dir
814
- Spontaneous.shard_path("abcdef0123").should == @shard_dir/ "ab/cd/abcdef0123"
842
+ shard_path = File.join(@site.root / 'cache/media/tmp')
843
+ Spontaneous.shard_path.should == shard_path
844
+ Spontaneous.shard_path("abcdef0123").should == shard_path/ "ab/cd/abcdef0123"
815
845
  end
816
846
 
817
847
  should "know when it already has a shard" do
@@ -852,6 +882,12 @@ class BackTest < MiniTest::Spec
852
882
  last_response.status.should == 200
853
883
  end
854
884
  @image1.image.processed_value.should == ""
885
+ dataset = mock()
886
+ S::Content.stubs(:for_update).returns(dataset)
887
+ dataset.stubs(:first).with(:id => @image1.id.to_s).returns(@image1)
888
+ dataset.stubs(:first).with(:id => @image1.id).returns(@image1)
889
+ # S::Content.stubs(:[]).with(@image1.id.to_s).returns(@image1)
890
+ # S::Content.stubs(:[]).with(@image1.id).returns(@image1)
855
891
  auth_post "/@spontaneous/shard/replace/#{@image1.id}", "filename" => "rose.jpg",
856
892
  "shards" => hashes, "field" => @image1.image.schema_id.to_s
857
893
  assert last_response.ok?
@@ -859,11 +895,7 @@ class BackTest < MiniTest::Spec
859
895
  @image1 = Content[@image1.id]
860
896
  src = @image1.image.src
861
897
  src.should =~ %r{^(.+)/rose\.jpg$}
862
- Spot::JSON.parse(last_response.body).should == {
863
- :id => @image1.id,
864
- :src => src,
865
- :version => 1
866
- }
898
+ Spot::JSON.parse(last_response.body).should == @image1.image.export
867
899
  File.exist?(Media.to_filepath(src)).should be_true
868
900
  S::Media.digest(Media.to_filepath(src)).should == @image_digest
869
901
  end