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
@@ -1,15 +1,21 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'test_helper'
3
+ require File.expand_path('../../test_helper', __FILE__)
4
4
 
5
5
  class FormatsTest < MiniTest::Spec
6
6
  context "Pages" do
7
7
  setup do
8
- class FPage < Spontaneous::Page; end
8
+ @site = setup_site
9
+ class Page < Spontaneous::Page; end
10
+ class FPage < Page; end
9
11
  end
12
+
10
13
  teardown do
11
- self.class.send(:remove_const, :FPage)
14
+ self.class.send(:remove_const, :Page) rescue nil
15
+ self.class.send(:remove_const, :FPage) rescue nil
16
+ teardown_site
12
17
  end
18
+
13
19
  should "default to a single :html format" do
14
20
  FPage.formats.should == [:html]
15
21
  end
@@ -28,6 +34,7 @@ class FormatsTest < MiniTest::Spec
28
34
  FPage.mime_type(:atom).should == "application/atom+xml"
29
35
  end
30
36
 
37
+
31
38
  context "instances" do
32
39
  setup do
33
40
  @page = FPage.new
@@ -66,6 +73,11 @@ class FormatsTest < MiniTest::Spec
66
73
  should "accept new formats when accompanied by a mime-type" do
67
74
  FPage.formats [{:xyz => "application/xyz"}]
68
75
  end
76
+
77
+ should "allow addition of a single format" do
78
+ FPage.add_format :atom
79
+ FPage.formats.should == [:rss, :html, :json, :atom]
80
+ end
69
81
  end
70
82
 
71
83
  context "with custom mime-types" do
@@ -87,6 +99,33 @@ class FormatsTest < MiniTest::Spec
87
99
  page = FPage.new
88
100
  page.mime_type(:html).should == "application/xhtml+xml"
89
101
  end
102
+
103
+ should "allow addition of a single custom format" do
104
+ FPage.add_format :ddd => "application/ddd"
105
+ FPage.formats.should == [:html, :js, :ddd]
106
+ page = FPage.new
107
+ page.mime_type(:ddd).should == "application/ddd"
108
+ end
109
+ end
110
+
111
+ context "with subclasses" do
112
+ setup do
113
+ FPage.formats :html, :rss, { :xxx => "application/xxx" }
114
+ class FSubPage < FPage
115
+ end
116
+ end
117
+
118
+ teardown do
119
+ self.class.send(:remove_const, :FSubPage) rescue nil
120
+ end
121
+
122
+ should "inherit the list of provided formats" do
123
+ FSubPage.formats.should == FPage.formats
124
+ end
125
+ should "inherit any custom mimetypes" do
126
+ FPage.mime_type(:xxx).should == "application/xxx"
127
+ FSubPage.mime_type(:xxx).should == "application/xxx"
128
+ end
90
129
  end
91
130
  end
92
131
  end
@@ -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
  # borrowed from Padrino
6
6
  class GeneratorsTest < MiniTest::Spec
@@ -46,7 +46,7 @@ class GeneratorsTest < MiniTest::Spec
46
46
  %w(development.rb production.rb).each do |f|
47
47
  assert_file_exists(site_root, 'config/environments', f)
48
48
  end
49
- %w(back.ru front.ru boot.rb database.yml deploy.rb environment.rb user_levels.yml).each do |f|
49
+ %w(back.ru front.ru boot.rb database.yml deploy.rb environment.rb user_levels.yml indexes.rb).each do |f|
50
50
  assert_file_exists(site_root, 'config', f)
51
51
  end
52
52
  %w(favicon.ico robots.txt).each do |f|
@@ -59,6 +59,7 @@ class GeneratorsTest < MiniTest::Spec
59
59
  assert_file_exists(site_root, 'schema/page.rb')
60
60
  assert File.read(site_root / 'schema/page.rb') =~ /class Page < Spontaneous::Page/
61
61
  assert_file_exists(site_root, 'schema/piece.rb')
62
+ assert_file_exists(site_root, 'schema/box.rb')
62
63
  assert File.read(site_root / 'schema/piece.rb') =~ /class Piece < Spontaneous::Piece/
63
64
  assert_file_exists(site_root, 'public/js')
64
65
  assert_file_exists(site_root, 'public/css')
@@ -0,0 +1,54 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path('../../test_helper', __FILE__)
4
+
5
+ class HelpersTest < MiniTest::Spec
6
+
7
+ context "HTML helper" do
8
+ setup do
9
+ @helper = Spontaneous::Render::Helpers::HTMLHelper
10
+ end
11
+ should "enable easy addition of classes" do
12
+ classes = @helper.classes("a", "b", "c", :active => false, :invisible => true)
13
+ classes.should == %(class="a b c invisible")
14
+
15
+ classes = @helper.classes("a", "b", "c")
16
+ classes.should == %(class="a b c")
17
+
18
+ classes = @helper.classes(%w(a b c))
19
+ classes.should == %(class="a b c")
20
+
21
+ classes = @helper.classes(%w(a b c), "active" => false, "invisible" => true)
22
+ classes.should == %(class="a b c invisible")
23
+
24
+
25
+ classes = @helper.classes("a b c")
26
+ classes.should == %(class="a b c")
27
+
28
+ classes = @helper.classes("a b c", :active => false, :invisible => true)
29
+ classes.should == %(class="a b c invisible")
30
+ end
31
+
32
+ should "provide a wrapper around IE conditional comments" do
33
+ @helper.ie_only.should == "<!--[if IE]>"
34
+ @helper.ie_only(6).should == "<!--[if IE 6]>"
35
+ @helper.ie_only(7).should == "<!--[if IE 7]>"
36
+ @helper.ie_only_gt(7).should == "<!--[if gt IE 7]>"
37
+ @helper.ie_only_gte(7).should == "<!--[if gte IE 7]>"
38
+ @helper.ie_only_gte(8).should == "<!--[if gte IE 8]>"
39
+ @helper.ie_only_lt(7).should == "<!--[if lt IE 7]>"
40
+ @helper.ie_only_lte(9).should == "<!--[if lte IE 9]>"
41
+ @helper.ie_only_end.should == "<![endif]-->"
42
+ end
43
+
44
+ should "enable targeting a range of ie versions using ranges" do
45
+ @helper.ie_only(6..8).should == "<!--[if (gte IE 6)&(lte IE 8)]>"
46
+ @helper.ie_only(6...8).should == "<!--[if (gte IE 6)&(lte IE 7)]>"
47
+ end
48
+
49
+ should "provide a wrapper around only comments excluding IE" do
50
+ @helper.not_ie.should == "<!--[if !IE]> -->"
51
+ @helper.not_ie_end.should == "<!-- <![endif]-->"
52
+ end
53
+ end
54
+ end
@@ -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
  class ImageSizeTest < MiniTest::Spec
6
6
  context "Image size parser" do
@@ -1,11 +1,18 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
 
4
- require 'test_helper'
5
- # require 'openssl'
4
+ require File.expand_path('../../test_helper', __FILE__)
5
+ require 'fog'
6
6
 
7
7
  class ImagesTest < MiniTest::Spec
8
8
  include Spontaneous
9
+ def setup
10
+ @site = setup_site
11
+ end
12
+
13
+ def teardown
14
+ teardown_site
15
+ end
9
16
 
10
17
  context "Image fields set using absolute values" do
11
18
  setup do
@@ -30,8 +37,8 @@ class ImagesTest < MiniTest::Spec
30
37
 
31
38
  context "Image fields" do
32
39
  setup do
33
- tmp = File.join(File.dirname(__FILE__), "../../tmp/media")
34
- Spontaneous.media_dir = tmp
40
+ tmp = File.join(@site.root, "tmp/media")
41
+ # Spontaneous.media_dir = tmp
35
42
  @tmp_dir = Pathname.new(tmp)
36
43
  @upload_dir = @tmp_dir + "tmp/1234"
37
44
  @upload_dir.mkpath
@@ -44,8 +51,6 @@ class ImagesTest < MiniTest::Spec
44
51
  # @origin_image.make_link(@src_image.to_s) unless @origin_image.exist?
45
52
  FileUtils.cp(@src_image.to_s, @origin_image.to_s)
46
53
  @origin_image = @origin_image.realpath.to_s
47
- # @digest = OpenSSL::Digest::MD5.new.file(@origin_image).hexdigest
48
- # p @digest
49
54
 
50
55
  class ::ResizingImageField < FieldTypes::ImageField
51
56
  size :preview do
@@ -65,6 +70,9 @@ class ImagesTest < MiniTest::Spec
65
70
  greyscale
66
71
  gaussian_blur 10
67
72
  end
73
+ size :reformatted do
74
+ format 'png'
75
+ end
68
76
  end
69
77
 
70
78
  ResizingImageField.register
@@ -79,15 +87,14 @@ class ImagesTest < MiniTest::Spec
79
87
  @instance.stubs(:id).returns(@content_id)
80
88
  @image = @instance.photo
81
89
  @image.owner.should == @instance
82
- # silence_logger {
83
- @image.value = @origin_image.to_s
84
- # }
90
+ @image.value = @origin_image.to_s
91
+
92
+ @instance.save
85
93
  end
86
94
 
87
95
  teardown do
88
- Object.send(:remove_const, :ContentWithImage)
89
- Object.send(:remove_const, :ResizingImageField)
90
- (@tmp_dir + "..").rmtree
96
+ Object.send(:remove_const, :ContentWithImage) rescue nil
97
+ Object.send(:remove_const, :ResizingImageField) rescue nil
91
98
  end
92
99
 
93
100
  context "with defined sizes" do
@@ -101,6 +108,10 @@ class ImagesTest < MiniTest::Spec
101
108
  ImageSize.read(@image.icon.filepath).should == [50, 50]
102
109
  ImageSize.read(@image.greyscale.filepath).should == [38, 50]
103
110
  end
111
+
112
+ should "preserve new format if processing has altered it" do
113
+ @image.reformatted.src.should =~ /\.png$/
114
+ end
104
115
  end
105
116
  context "in templates" do
106
117
 
@@ -166,7 +177,7 @@ class ImagesTest < MiniTest::Spec
166
177
 
167
178
 
168
179
  should "have a 'sizes' config option that generates resized versions" do
169
- assert_same_elements ResizingImageField.size_definitions.keys, [:preview, :thumbnail, :icon, :tall, :greyscale]
180
+ assert_same_elements ResizingImageField.size_definitions.keys, [:preview, :thumbnail, :icon, :tall, :greyscale, :reformatted]
170
181
  end
171
182
 
172
183
  should "serialise attributes" do
@@ -181,7 +192,6 @@ class ImagesTest < MiniTest::Spec
181
192
  serialised[:thumbnail][:height].should == 50
182
193
  serialised[:icon][:width].should == 50
183
194
  serialised[:icon][:height].should == 50
184
- # pp serialised
185
195
  end
186
196
 
187
197
  should "persist attributes" do
@@ -199,29 +209,6 @@ class ImagesTest < MiniTest::Spec
199
209
  end
200
210
 
201
211
  context "defined anonymously" do
202
- setup do
203
- # class ::ContentWithImage < Content
204
- # field :photo, :image do
205
- # sizes :preview => { :width => 200 },
206
- # :tall => { :height => 200 },
207
- # :thumbnail => { :fit => [50, 50] },
208
- # :icon => { :crop => [50, 50] }
209
- # end
210
- # end
211
- # @instance = ContentWithImage.new
212
-
213
- # @content_id = 234
214
- # @instance.stubs(:id).returns(@content_id)
215
- # @image = @instance.photo
216
- # @image.owner.should == @instance
217
- # @image.value = @origin_image.to_s
218
- end
219
-
220
- teardown do
221
- # Object.send(:remove_const, :ContentWithImage)
222
- # (@tmp_dir + "..").rmtree
223
- end
224
-
225
212
  should "have image dimension and filesize information" do
226
213
  @image.src.should == "/media/00234/0010/rose.jpg"
227
214
  @image.filesize.should == 54746
@@ -235,8 +222,8 @@ class ImagesTest < MiniTest::Spec
235
222
  @image.original.filesize.should == @image.filesize
236
223
  end
237
224
  should "have a 'sizes' config option that generates resized versions" do
238
- assert_same_elements @image.class.size_definitions.keys, [:preview, :thumbnail, :icon, :tall, :greyscale]
239
- assert_same_elements @image.class.sizes.keys, [:preview, :thumbnail, :icon, :tall, :greyscale]
225
+ assert_same_elements @image.class.size_definitions.keys, [:preview, :thumbnail, :icon, :tall, :greyscale, :reformatted]
226
+ assert_same_elements @image.class.sizes.keys, [:preview, :thumbnail, :icon, :tall, :greyscale, :reformatted]
240
227
  end
241
228
 
242
229
  should "serialise attributes" do
@@ -251,15 +238,39 @@ class ImagesTest < MiniTest::Spec
251
238
  serialised[:thumbnail][:height].should == 50
252
239
  serialised[:icon][:width].should == 50
253
240
  serialised[:icon][:height].should == 50
254
- # pp serialised
255
241
  end
242
+
256
243
  should "persist attributes" do
257
244
  @instance.save
258
245
  @instance = ContentWithImage[@instance[:id]]
259
246
  @instance.photo.thumbnail.src.should == "/media/00234/0010/rose.thumbnail.jpg"
260
247
  @instance.photo.original.src.should == "/media/00234/0010/rose.jpg"
261
248
  end
249
+ end
250
+
251
+ context "with cloud storage" do
252
+ setup do
253
+ @bucket_name = "media.example.com"
254
+ @aws_credentials = {
255
+ :provider=>"AWS",
256
+ :aws_secret_access_key=>"SECRET_ACCESS_KEY",
257
+ :aws_access_key_id=>"ACCESS_KEY_ID",
258
+ :public_host => "http://media.example.com"
259
+ }
260
+ ::Fog.mock!
261
+ @storage = Spontaneous::Storage::Cloud.new(@aws_credentials, 'media.example.com')
262
+ @storage.backend.directories.create(:key => @bucket_name)
263
+ @site.stubs(:storage).with(anything).returns(@storage)
264
+ @image.value = @origin_image.to_s
265
+ end
266
+ teardown do
267
+ ::Fog::Mock.reset
268
+ end
262
269
 
270
+ should "have full urls for all the src attributes" do
271
+ @image.original.src.should == "http://media.example.com/00234-0010-rose.jpg"
272
+ @image.thumbnail.src.should == "http://media.example.com/00234-0010-rose.thumbnail.jpg"
273
+ end
263
274
  end
264
275
  end
265
276
  end
@@ -1,18 +1,22 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'test_helper'
3
+ require File.expand_path('../../test_helper', __FILE__)
4
4
 
5
5
  class LayoutsTest < MiniTest::Spec
6
6
 
7
7
  def setup
8
8
  Spontaneous::Render.use_development_renderer
9
9
  self.template_root = ::File.expand_path('../../fixtures/layouts', __FILE__)
10
+ @site = setup_site
11
+ end
12
+
13
+ def teardown
14
+ teardown_site
10
15
  end
11
16
 
12
17
  context "layouts" do
13
18
 
14
19
  setup do
15
- Spontaneous::Schema.reset!
16
20
  class ::LayoutPage < Spontaneous::Page; end
17
21
  class ::ABoxClass < Spontaneous::Box; end
18
22
  class ::SubPage < LayoutPage; end
@@ -79,15 +83,28 @@ class LayoutsTest < MiniTest::Spec
79
83
  # page.layout.template.should == 'layouts/custom2'
80
84
  end
81
85
 
82
- should "allow setting of layout in sub-classes" do
86
+ should "use the last definied layout in sub-classes" do
83
87
  LayoutPage.layout :custom1
84
88
  LayoutPage.layout :custom2
85
- SubPage.layout :custom3, :default => true
89
+ SubPage.layout :custom3
90
+ SubPage.layout :custom4
86
91
  page = SubPage.new
87
92
  assert_correct_template(page, 'layouts/custom3')
88
93
  page.layout = :custom2
89
94
  assert_correct_template(page, 'layouts/custom2')
90
95
  end
96
+
97
+ should "allow defining of default layout in sub-classes" do
98
+ LayoutPage.layout :custom1
99
+ LayoutPage.layout :custom2, :default => true
100
+ SubPage.layout :custom3
101
+ SubPage.layout :custom4, :default => true
102
+ page = SubPage.new
103
+ assert_correct_template(page, 'layouts/custom4')
104
+ page.layout = :custom3
105
+ assert_correct_template(page, 'layouts/custom3')
106
+ end
107
+
91
108
  # should "raise error when setting unknown layout" do
92
109
  # LayoutPage.layout :custom1
93
110
  # LayoutPage.layout :custom2
@@ -1,7 +1,7 @@
1
1
  # encoding: UTF-8
2
2
 
3
3
 
4
- require 'test_helper'
4
+ require File.expand_path('../../test_helper', __FILE__)
5
5
 
6
6
  # borrowed from Padrino
7
7
  class LoggerTest < MiniTest::Spec
@@ -1,31 +1,189 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'test_helper'
3
+ require File.expand_path('../../test_helper', __FILE__)
4
+ require 'fog'
4
5
 
5
6
  class MediaTest < MiniTest::Spec
6
- context "Utilitity methods" do
7
+ def setup
8
+ @site = setup_site
9
+ end
10
+
11
+ def teardown
12
+ teardown_site
13
+ S::Content.delete
14
+ end
15
+
16
+ context "Utility methods" do
7
17
  should "be able to sanitise filenames" do
8
18
  filename = "Something with-dodgy 'characters'.many.jpg"
9
19
  Media.to_filename(filename).should == "Something-with-dodgy-characters.many.jpg"
10
20
  end
11
21
  end
22
+
23
+ context "All media files" do
24
+ should "know their mimetype" do
25
+ file = Spontaneous::Media::File.new(@content, "file name.txt")
26
+ file.mimetype.should == "text/plain"
27
+ file = Spontaneous::Media::File.new(@content, "file name.jpg")
28
+ file.mimetype.should == "image/jpeg"
29
+ file = Spontaneous::Media::File.new(@content, "file name.jpg", "text/html")
30
+ file.mimetype.should == "text/html"
31
+ end
32
+
33
+ end
34
+
35
+ context "cloud media files" do
36
+ setup do
37
+ Fog.mock!
38
+ @bucket_name = "media.example.com"
39
+ @aws_credentials = {
40
+ :provider=>"AWS",
41
+ :aws_secret_access_key=>"SECRET_ACCESS_KEY",
42
+ :aws_access_key_id=>"ACCESS_KEY_ID",
43
+ :public_host => "http://media.example.com"
44
+ }
45
+ @storage = Spontaneous::Storage::Cloud.new(@aws_credentials, 'media.example.com')
46
+ @storage.backend.directories.create(:key => @bucket_name)
47
+ @site.stubs(:storage).with(anything).returns(@storage)
48
+ @content = S::Content.create
49
+ @content.stubs(:id).returns(99)
50
+ Spontaneous::State.stubs(:revision).returns(853)
51
+ end
52
+ should "return an absolute path for the url" do
53
+ file = Spontaneous::Media::File.new(@content, "file name.txt")
54
+ file.url.should == "http://media.example.com/00099-0853-file-name.txt"
55
+ end
56
+
57
+ should "create a new instance with a different name" do
58
+ file1 = Spontaneous::Media::File.new(@content, "file name.txt")
59
+ file2 = file1.rename("another.jpg")
60
+ file2.owner.should == file1.owner
61
+ file2.mimetype.should == "image/jpeg"
62
+ file2.url.should == "http://media.example.com/00099-0853-another.jpg"
63
+ end
64
+
65
+ should "be able to copy a file into place if passed the path of an existing file" do
66
+ @storage.bucket.files.expects(:create).with{ |args|
67
+ args[:key] == "00099-0853-file-name.txt" &&
68
+ args[:body].is_a?(File) &&
69
+ args[:public] == true
70
+ }
71
+ existing_file = File.expand_path("../../fixtures/images/rose.jpg", __FILE__)
72
+ ::File.exist?(existing_file).should be_true
73
+ file = Spontaneous::Media::File.new(@content, "file name.txt")
74
+ file.copy(existing_file)
75
+ end
76
+
77
+ should "be able to copy a file into place if passed the file handle of an existing file" do
78
+ @storage.bucket.files.expects(:create).with{ |args|
79
+ args[:key] == "00099-0853-file-name.txt" &&
80
+ args[:body].is_a?(File) &&
81
+ args[:public] == true
82
+ }
83
+ existing_file = File.expand_path("../../fixtures/images/rose.jpg", __FILE__)
84
+ ::File.exist?(existing_file).should be_true
85
+ file = Spontaneous::Media::File.new(@content, "file name.txt")
86
+ File.open(existing_file, 'rb') do |f|
87
+ file.copy(f)
88
+ end
89
+ end
90
+
91
+ should "provide an open method that writes files to the correct location" do
92
+ @storage.bucket.files.expects(:create).with() { |args|
93
+ args[:key] == "00099-0853-file-name.txt" &&
94
+ (args[:body].is_a?(File) || args[:body].is_a?(Tempfile)) &&
95
+ args[:public] == true
96
+ }
97
+
98
+ file = Spontaneous::Media::File.new(@content, "file name.txt")
99
+ content_string = "Hello"
100
+ file.open do |f|
101
+ f.write(content_string)
102
+ end
103
+ end
104
+ end
105
+
106
+ context "Local media files" do
107
+ setup do
108
+ @media_dir = Dir.mktmpdir
109
+ @storage = Spontaneous::Storage::Local.new(@media_dir, '/media')
110
+ @site.stubs(:storage).with(anything).returns(@storage)
111
+ @content = S::Content.create
112
+ @content.stubs(:id).returns(99)
113
+ Spontaneous::State.stubs(:revision).returns(853)
114
+ end
115
+
116
+ should "return an absolute path for the url" do
117
+ file = Spontaneous::Media::File.new(@content, "file name.txt")
118
+ file.url.should == "/media/00099/0853/file-name.txt"
119
+ end
120
+
121
+ should "place files into its configured root" do
122
+ file = Spontaneous::Media::File.new(@content, "file name.txt")
123
+ file.path.should == File.join(@media_dir, "/00099/0853/file-name.txt")
124
+ end
125
+
126
+ should "create a new instance with a different name" do
127
+ file1 = Spontaneous::Media::File.new(@content, "file name.txt")
128
+ file2 = file1.rename("another.jpg")
129
+ file2.owner.should == file1.owner
130
+ file2.mimetype.should == "image/jpeg"
131
+ file2.url.should == "/media/00099/0853/another.jpg"
132
+ end
133
+
134
+ should "be able to copy a file into place if passed the path of an existing file" do
135
+ file_path = File.join(@media_dir, "/00099/0853/file-name.txt")
136
+ existing_file = File.expand_path("../../fixtures/images/rose.jpg", __FILE__)
137
+ ::File.exist?(file_path).should be_false
138
+ ::File.exist?(existing_file).should be_true
139
+ file = Spontaneous::Media::File.new(@content, "file name.txt")
140
+ file.copy(existing_file)
141
+ ::File.exist?(file_path).should be_true
142
+ file.source.should == existing_file
143
+ end
144
+
145
+ should "be able to copy a file into place if passed the handle of an existing file" do
146
+ file_path = File.join(@media_dir, "/00099/0853/file-name.txt")
147
+ existing_file = File.expand_path("../../fixtures/images/rose.jpg", __FILE__)
148
+ ::File.exist?(file_path).should be_false
149
+ ::File.exist?(existing_file).should be_true
150
+ file = Spontaneous::Media::File.new(@content, "file name.txt")
151
+ File.open(existing_file, 'rb') do |f|
152
+ file.copy(f)
153
+ end
154
+ ::File.exist?(file_path).should be_true
155
+ file.source.should == existing_file
156
+ end
157
+
158
+ should "provide an open method that writes files to the correct location" do
159
+ file_path = File.join(@media_dir, "/00099/0853/file-name.txt")
160
+ ::File.exist?(file_path).should be_false
161
+ file = Spontaneous::Media::File.new(@content, "file name.txt")
162
+ content_string = "Hello"
163
+ file.open do |f|
164
+ f.write(content_string)
165
+ end
166
+ File.read(file_path).should == content_string
167
+ end
168
+ end
169
+
12
170
  context "Content items" do
13
171
  setup do
14
- @media_dir = File.expand_path(File.join(File.dirname(__FILE__), "../../tmp/media"))
15
- Spontaneous.media_dir = @media_dir
172
+ # @media_dir = File.expand_path(File.join(File.dirname(__FILE__), "../../tmp/media"))
173
+ # Spontaneous.media_dir = @media_dir
16
174
  Site.stubs(:working_revision).returns(74)
17
175
  @instance = Content.new
18
176
  @instance.stubs(:id).returns(101)
19
177
  end
20
178
 
21
179
  should "be able to generate a revision and id based media path" do
22
- @instance.media_filepath("something.jpg").should == File.join(@media_dir, "00101/0074/something.jpg")
180
+ @instance.media_filepath("something.jpg").should == File.join(@site.media_dir, "00101/0074/something.jpg")
23
181
  @instance.media_urlpath("something.jpg").should == "/media/00101/0074/something.jpg"
24
182
  end
25
183
 
26
184
  context "file manipulation" do
27
185
  setup do
28
- @tmp_dir = Pathname.new(@media_dir)
186
+ @tmp_dir = Pathname.new(Spontaneous.media_dir)
29
187
  @src_image = Pathname.new(File.join(File.dirname(__FILE__), "../fixtures/images/rose.jpg")).realpath
30
188
  @upload_dir = @tmp_dir + "tmp/1234"
31
189
  @upload_dir.mkpath
@@ -34,7 +192,7 @@ class MediaTest < MiniTest::Spec
34
192
  end
35
193
 
36
194
  teardown do
37
- (@tmp_dir + "..").rmtree
195
+ # (@tmp_dir + "..").rmtree
38
196
  end
39
197
 
40
198
  should "be able to move a file into the media path" do