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,17 +1,26 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'hwia'
4
3
 
5
4
  module Spontaneous::Prototypes
6
5
  class BoxPrototype
7
6
 
8
7
  attr_reader :name, :options, :owner
9
8
 
10
- def initialize(owner, name, options, &block)
9
+ def initialize(owner, name, options, blocks = [], &block)
11
10
  @owner = owner
12
11
  @name = name.to_sym
13
12
  @options = options
14
- @extend = block
13
+ @extend = [blocks].flatten.push(block).compact
14
+ instance_class
15
+ self
16
+ end
17
+
18
+ def position
19
+ owner.box_position(self)
20
+ end
21
+
22
+ def __source_file
23
+ owner.__source_file
15
24
  end
16
25
 
17
26
  def field_prototypes
@@ -23,10 +32,9 @@ module Spontaneous::Prototypes
23
32
  end
24
33
 
25
34
  def schema_id
26
- instance_class.schema_id
35
+ Spontaneous.schema.uids[@_inherited_schema_id] || instance_class.schema_id
27
36
  end
28
37
 
29
-
30
38
  def schema_name
31
39
  instance_class.schema_name
32
40
  end
@@ -47,12 +55,33 @@ module Spontaneous::Prototypes
47
55
  @options[:fields]
48
56
  end
49
57
 
58
+ def group
59
+ @options[:group]
60
+ end
61
+
50
62
  def instance_class
51
63
  @_instance_class ||= create_instance_class
52
64
  end
53
65
 
66
+ def inherit_schema_id(schema_id)
67
+ @_inherited_schema_id = instance_class.schema_id = schema_id.to_s
68
+ end
69
+
70
+ def merge(subclass_owner, subclass_options, &subclass_block)
71
+ options = @options.merge(subclass_options)
72
+ Spontaneous::Prototypes::BoxPrototype.new(subclass_owner, name, options, @extend, &subclass_block).tap do |prototype|
73
+ # We want merged boxes, which are essentially monkey-patched box definitions
74
+ # to use the same schema id as the supertype version because otherwise removing the
75
+ # subtype version and falling back to the original supertype definition would remove
76
+ # all the content from the box while the box itself would still remain visible in the UI
77
+ prototype.inherit_schema_id self.schema_id
78
+ end
79
+ end
80
+
54
81
  def create_instance_class
55
82
  Class.new(box_base_class).tap do |instance_class|
83
+ # doing this means we get proper names for the anonymous box classes
84
+ owner.const_set("#{name.to_s.camelize}Box", instance_class)
56
85
  box_owner = owner
57
86
  box_name = name
58
87
  instance_class.instance_eval do
@@ -66,17 +95,14 @@ module Spontaneous::Prototypes
66
95
  box_owner.schema_id
67
96
  end
68
97
  end
69
- if @extend
70
- instance_class.class_eval(&@extend)
71
- end
72
- end.tap do |klass|
73
- # doing this means we get proper names for the anonymous box classes
74
- owner.const_set("#{name.to_s.camelize}Box", klass)
98
+ @extend.each { |block|
99
+ instance_class.class_eval(&block) if block
100
+ }
75
101
  end
76
102
  end
77
103
 
78
104
  def box_base_class
79
- box_class = Spontaneous::Box # AnonymousBox
105
+ box_class = default_box_class
80
106
  class_name = @options[:type] || @options[:class]
81
107
  box_class = class_name.to_s.constantize if class_name
82
108
  # box_class = Class.new(box_class) do
@@ -87,6 +113,10 @@ module Spontaneous::Prototypes
87
113
  box_class
88
114
  end
89
115
 
116
+ def default_box_class
117
+ defined?(::Box) ? ::Box : Spontaneous::Box
118
+ end
119
+
90
120
  ## failed attempt to exclude anonymous boxes from the list of schema classes
91
121
  ## actually easier to keep them in, despite later problems with UID creation
92
122
  ## because this way their fields & styles are automatically validated
@@ -125,26 +155,26 @@ module Spontaneous::Prototypes
125
155
  end
126
156
 
127
157
  # TODO: must be able to make these into a module
128
- def readable?
129
- Spontaneous::Permissions.has_level?(read_level)
158
+ def readable?(user)
159
+ Spontaneous::Permissions.has_level?(user, read_level)
130
160
  end
131
161
 
132
- def writable?
133
- Spontaneous::Permissions.has_level?(write_level)
162
+ def writable?(user)
163
+ Spontaneous::Permissions.has_level?(user, write_level)
134
164
  end
135
165
 
136
166
  def style
137
167
  @options[:style]# || name
138
168
  end
139
169
 
140
- def readable_fields
141
- instance_class.readable_fields
170
+ def readable_fields(user)
171
+ instance_class.readable_fields(user)
142
172
  end
143
173
 
144
- def allowed_types
145
- if writable?
174
+ def allowed_types(user)
175
+ if writable?(user)
146
176
  types = []
147
- instance_class.allowed.select { |a| a.readable? }.each do |a|
177
+ instance_class.allowed.select { |a| a.readable?(user) }.each do |a|
148
178
  types.concat(a.instance_classes)
149
179
  end
150
180
  types
@@ -153,15 +183,15 @@ module Spontaneous::Prototypes
153
183
  end
154
184
  end
155
185
 
156
- def export
157
- allowed = allowed_types.map { |c| c.ui_class }
186
+ def export(user)
187
+ allowed = allowed_types(user).map { |c| c.ui_class }
158
188
  {
159
189
  :name => name.to_s,
160
190
  :id => schema_id.to_s,
161
191
  :title => title,
162
- :writable => writable?,
192
+ :writable => writable?(user),
163
193
  :allowed_types => allowed,
164
- :fields => readable_fields.map { |name| instance_class.field_prototypes[name].export },
194
+ :fields => readable_fields(user).map { |name| instance_class.field_prototypes[name].export(user) },
165
195
  }
166
196
  end
167
197
  end
@@ -3,33 +3,33 @@
3
3
 
4
4
  module Spontaneous::Prototypes
5
5
  class FieldPrototype
6
- attr_reader :owner, :name
6
+ attr_reader :owner, :name, :options
7
7
 
8
- def initialize(owner, name, type, options={})
8
+ def initialize(owner, name, type, options={}, blocks = [], &block)
9
9
  @owner = owner
10
10
  @name = name
11
+ @extend = [blocks].flatten.push(block).compact
12
+
13
+ parse_options(options)
14
+
11
15
  # if the type is nil then try the name, this will assign sensible defaults
12
16
  # to fields like 'image' or 'date'
13
- base_class = Spontaneous::FieldTypes[type || name]
14
- if block_given?
15
- @field_class = Class.new(base_class, &Proc.new)
16
- @field_class.singleton_class.send(:define_method, :name) do
17
- base_class.name
18
- end
19
- else
20
- @field_class = base_class
21
- end
17
+ @base_class = Spontaneous::FieldTypes[type || name]
22
18
 
23
- # @field_class.prototype = self
24
- parse_options(options)
19
+ owner.const_set("#{name.to_s.camelize}Field", instance_class)
20
+
21
+ self
25
22
  end
26
23
 
27
24
  def schema_name
28
25
  "field/#{owner.schema_id}/#{name}"
29
26
  end
30
27
 
28
+ # def schema_id
29
+ # Spontaneous.schema.schema_id(self)
30
+ # end
31
31
  def schema_id
32
- Spontaneous::Schema.schema_id(self)
32
+ Spontaneous.schema.uids[@_inherited_schema_id] || Spontaneous.schema.schema_id(self)
33
33
  end
34
34
 
35
35
  def schema_owner
@@ -62,8 +62,27 @@ module Spontaneous::Prototypes
62
62
  }.merge(options)
63
63
  end
64
64
 
65
+ def instance_class
66
+ @_instance_class ||= create_instance_class
67
+ end
68
+
69
+ def create_instance_class
70
+ base_class = @base_class
71
+ Class.new(@base_class).tap do |instance_class|
72
+ # although we're subclassing the base field class, we don't want the ui
73
+ # to use a different editor. FieldClass::editor_class is used in the serialisation
74
+ # routine
75
+ # instance_class.singleton_class.send(:define_method, :editor_class) do
76
+ # base_class.editor_class
77
+ # end
78
+ @extend.each { |block|
79
+ instance_class.class_eval(&block) if block
80
+ }
81
+ end
82
+ end
83
+
65
84
  def field_class
66
- @field_class
85
+ instance_class
67
86
  end
68
87
 
69
88
  def default
@@ -87,25 +106,53 @@ module Spontaneous::Prototypes
87
106
  Spontaneous::Permissions[level_name]
88
107
  end
89
108
 
109
+ def in_index?(index)
110
+ search.in_index?(index)
111
+ end
112
+
113
+ def index_id(index)
114
+ search.index_id(index)
115
+ end
116
+
117
+ def options_for_index(index)
118
+ search.field_definition(index)
119
+ end
120
+
121
+ def search
122
+ @search ||= S::Search::Field.new(self, @options[:index])
123
+ end
124
+
125
+ def inherit_schema_id(schema_id)
126
+ @_inherited_schema_id = schema_id.to_s
127
+ # instance_class.schema_id = schema_id
128
+ end
129
+
130
+ def merge(subclass_owner, field_type, subclass_options, &subclass_block)
131
+ options = @options.merge(subclass_options)
132
+ self.class.new(subclass_owner, name, field_type, options, @extend, &subclass_block).tap do |prototype|
133
+ prototype.inherit_schema_id self.schema_id
134
+ end
135
+ end
136
+
90
137
  def to_field(values=nil)
91
138
  default_values = values.nil?
92
139
  values = {
93
140
  :name => self.name,
94
141
  :unprocessed_value => default
95
142
  }.merge(values || {})
96
- self.field_class.new(values, !default_values).tap do |field|
143
+ self.instance_class.new(values, !default_values).tap do |field|
97
144
  field.prototype = self
98
145
  end
99
146
  end
100
147
 
101
- def export
148
+ def export(user)
102
149
  {
103
150
  :name => name.to_s,
104
151
  :schema_id => schema_id.to_s,
105
- :type => field_class.ui_class,
152
+ :type => instance_class.editor_class,
106
153
  :title => title,
107
154
  :comment => comment || "",
108
- :writable => Spontaneous::Permissions.has_level?(write_level)
155
+ :writable => Spontaneous::Permissions.has_level?(user, write_level)
109
156
  }
110
157
  end
111
158
  end
@@ -29,10 +29,10 @@ module Spontaneous::Prototypes
29
29
  end
30
30
 
31
31
  def schema_id
32
- Spontaneous::Schema.schema_id(self)
32
+ Spontaneous.schema.schema_id(self)
33
33
  end
34
34
 
35
- def export
35
+ def export(user)
36
36
  {
37
37
  :name => name.to_s,
38
38
  :schema_id => schema_id.to_s
@@ -4,7 +4,7 @@ module Spontaneous
4
4
  module Publishing
5
5
  autoload :Immediate, "spontaneous/publishing/immediate"
6
6
  autoload :Threaded, "spontaneous/publishing/threaded"
7
- autoload :FireAndForget, "spontaneous/publishing/fire_and_forget"
7
+ autoload :Simultaneous, "spontaneous/publishing/simultaneous"
8
8
  end # Publishing
9
9
  end # Spontaneous
10
10
 
@@ -1,16 +1,21 @@
1
1
  # encoding: UTF-8
2
2
 
3
+ require 'simultaneous'
4
+ require 'sass'
5
+
3
6
  module Spontaneous
4
7
  module Publishing
5
8
  class Immediate
6
9
 
7
- def self.status
8
- @status ||= ""
9
- end
10
+ # def self.status
11
+ # @status ||= ""
12
+ # end
10
13
 
11
- def self.status=(status)
12
- @status = status
13
- end
14
+ # def self.status=(status)
15
+ # @status = status
16
+ # end
17
+
18
+ include ::Simultaneous::Task
14
19
 
15
20
  attr_reader :revision
16
21
 
@@ -50,36 +55,33 @@ module Spontaneous
50
55
  end
51
56
  end
52
57
 
53
- # Called from the Format#render method to provide progress reports
54
- def page_rendered(page)
58
+ protected
59
+
60
+ def page_rendered(page, event = "rendering")
55
61
  @pages_rendered += 1
56
- set_status("rendering", percent_complete)
57
- logger.info { "Rendered page #{page.path}" }
62
+ update_progress(event, percent_complete)
63
+ logger.info { "Done: #{event} page #{page.path} #{percent_complete.round(1)}%" }
58
64
  end
59
65
 
60
- protected
61
66
 
62
67
  def pages
63
68
  @pages ||= S::Page.order(:depth)
64
69
  end
65
70
 
66
- def formats
67
- # TODO: read the actual config for the available formats
68
- [:html]
69
- end
70
-
71
- def render_stages
72
- # TODO: when search infrastructure is in place modify this to include the indexing steps
73
- 1
71
+ # The number of times the publisher has to run through the site's pages
72
+ # in order to generate the search indexes.
73
+ # Returns either 0 or 1
74
+ def index_stages
75
+ [1, S::Site.indexes.length].min
74
76
  end
75
77
 
76
- def publish(pages)
78
+ def publish(modified_page_list)
77
79
  at_exit {
78
80
  abort_publish_at_exit
79
81
  }
80
82
  before_publish
81
83
  begin
82
- S::Content.publish(revision, pages) do
84
+ S::Content.publish(revision, modified_page_list) do
83
85
  render_revision
84
86
  end
85
87
  after_publish
@@ -90,44 +92,75 @@ module Spontaneous
90
92
  end
91
93
 
92
94
  def render_revision
95
+ update_progress("rendering", 0)
93
96
  @pages_rendered = 0
94
97
  S::Content.with_identity_map do
95
- S::Render.with_publishing_renderer do
96
- set_status("rendering:0")
97
- formats.each do |format|
98
- S::Render.render_pages(revision, pages, format, self)
98
+ S::Content.with_visible do
99
+ S::Render.with_publishing_renderer do
100
+ render_pages
101
+ index_pages unless index_stages == 0
99
102
  end
100
- # only set this after indexing is complete (if any)
101
- set_status("rendering:100")
102
103
  end
103
104
  end
104
- set_status("copying_files")
105
105
  copy_static_files
106
106
  generate_rackup_file
107
107
  end
108
108
 
109
+ def render_pages
110
+ # the delay is purely used in interface testing
111
+ delay = Spontaneous::Site.config.publishing_delay
112
+ pages.each do |page|
113
+ page.formats.each do |format|
114
+ render_page(page, format)
115
+ end
116
+ sleep(delay) if delay
117
+ end
118
+ end
119
+
120
+ def render_page(page, format)
121
+ logger.info { "#{page.path}" }
122
+ formatter = Spontaneous::Render::Format.for(format)
123
+ renderer = formatter.new(revision, page)
124
+ renderer.render
125
+ page_rendered(page)
126
+ end
127
+
128
+ def index_pages
129
+ S::Site.indexer(revision) do |indexer|
130
+ pages.each { |page|
131
+ indexer << page
132
+ page_rendered(page, 'indexing')
133
+ }
134
+ end
135
+ end
136
+
109
137
  # Used to calculate the progress percentage
138
+ # Calculated by (pages * indexes) * (pages * formats)
139
+ # where indexes = Site.indexes.length > 0 ? 1 : 0
140
+ # although not all pages are included by a format
110
141
  def total_pages_to_render
111
- @total_pages ||= formats.inject(0) do |total, format|
112
- total += pages.find_all { |page| page.formats.include?(format) }.count
142
+ @total_pages ||= (index_stages * pages.count) + pages.inject(0) do |total, page|
143
+ total += page.formats.length#count { |page| page.formats.include?(format) }
113
144
  end
114
145
  end
115
146
 
116
147
  def percent_complete
117
- ((@pages_rendered || 0).to_f / (total_pages_to_render * render_stages).to_f) * 100.0
148
+ ((@pages_rendered || 0).to_f / (total_pages_to_render).to_f) * 100.0
118
149
  end
119
150
 
120
- def set_status(state, progress='*')
121
- self.class.status = "#{state}:#{progress}"
151
+ def update_progress(state, progress='*')
152
+ simultaneous_event('publish_progress', {:state => state, :progress => progress}.to_json)
122
153
  end
123
154
 
124
155
  def generate_rackup_file
125
156
  # use the real path to the app rather than the symlink in order to sandbox the live site
126
157
  # not sure that this is a good idea: it would force a publish for every deploy
127
158
  # which is only sometimes appropriate/desirable
159
+ # UPDATE: What was I on about there? The true downside to this is that it would force a restart/HUP for
160
+ # every publish. Not sure that the comment above this one is based on truth or some mad momentary fantasy
128
161
  path = Pathname.new(Spontaneous.root).realpath.to_s
129
- # TODO: enable custom rack middleware by changing config/front into a proper rackup file
130
162
  rackup = 'config/front.ru'
163
+
131
164
  template = (<<-RACKUP).gsub(/^ +/, '')
132
165
  # This is an automatically generated file *DO NOT EDIT*
133
166
  # To configure your Rack application make your changes in
@@ -141,41 +174,87 @@ module Spontaneous
141
174
  root = '#{path}'
142
175
  Dir.chdir(root)
143
176
  eval(::File.read('#{rackup}'), binding, ::File.join(root, '#{rackup}'), __LINE__)
144
-
145
177
  RACKUP
146
178
  rack_file = Spontaneous.revision_dir(revision) / 'config.ru'
147
179
  File.open(rack_file, 'w') { |f| f.write(template) }
148
- end
180
+ end
149
181
 
150
182
  def copy_static_files
183
+ update_progress("copying_files")
151
184
  public_dest = Pathname.new(Spontaneous.revision_dir(revision) / 'public')
152
- public_src = Pathname.new(Spontaneous.root / 'public').realpath
153
185
  FileUtils.mkdir_p(public_dest) unless File.exists?(public_dest)
154
- Dir[public_src.to_s / "**/*"].each do |src|
155
- src = Pathname.new(src)
156
- dest = (public_dest + src.relative_path_from(public_src))
157
- if src.directory?
158
- dest.mkpath
159
- else
160
- FileUtils.ln(src, dest, :force => true)
186
+ facets = Spontaneous.instance.facets
187
+ public_dirs = facets.map { |facet| facet.paths.expanded(:public) }.flatten
188
+ facets.each do |facet|
189
+ copy_facet_public_files(facet, public_dest)
190
+ end
191
+ end
192
+
193
+ def copy_facet_public_files(facet, public_dest)
194
+ public_dirs = facet.paths.expanded(:public).map { |dir| Pathname.new(dir) }
195
+ public_dirs.each do |public_src|
196
+ if public_src.exist?
197
+ public_src = public_src.realpath
198
+ Dir[public_src.to_s / "**/*"].each do |src|
199
+ src = Pathname.new(src)
200
+ # insert facet namespace in front of path to keep URLs consistent across
201
+ # the back & front servers
202
+ dest = [facet.file_namespace, src.relative_path_from(public_src).to_s].compact
203
+ dest = (public_dest + File.join(dest))
204
+ if src.directory?
205
+ dest.mkpath
206
+ else
207
+ case src.extname
208
+ when ".scss"
209
+ render_sass_template(src, dest)
210
+ else
211
+ FileUtils.ln(src, dest, :force => true)
212
+ end
213
+ end
214
+ end
215
+ end
216
+ end
217
+ end
218
+
219
+ def render_sass_template(template, dest)
220
+ dest_css = [dest.basename('.scss'), "css"].join(".")
221
+ dest = (dest.dirname + dest_css)
222
+
223
+ dir = File.dirname(template)
224
+ load_paths = [dir, File.join(dir, "sass")]
225
+
226
+ File.open(dest, 'w') do |file|
227
+ begin
228
+ engine = Sass::Engine.for_file(template.to_s, {
229
+ :filename => template.to_s,
230
+ :load_paths => load_paths,
231
+ :cache => false,
232
+ :style => :compressed
233
+ })
234
+ file.write(engine.render)
235
+ rescue Sass::SyntaxError => e
236
+ # it's likely that the error is coming from rendering an include file that isn't designed to
237
+ # be rendered singly (i.e. it depends on another include file)
238
+ # but let's show an error anyway
239
+ logger.warn(e)
161
240
  end
162
241
  end
163
242
  end
164
243
 
165
244
  def before_publish
166
- set_status("initialising")
245
+ update_progress("initialising")
167
246
  S::Site.send(:pending_revision=, revision)
168
247
  end
169
248
 
170
249
  def after_publish
171
- set_status("finalising")
250
+ update_progress("finalising")
172
251
  S::Revision.create(:revision => revision, :published_at => Time.now)
173
252
  S::Site.send(:set_published_revision, revision)
174
253
  S::Site.send(:pending_revision=, nil)
175
254
  tmp = Spontaneous.revision_dir(revision) / "tmp"
176
255
  FileUtils.mkdir_p(tmp) unless ::File.exists?(tmp)
177
256
  system("ln -nsf #{Spontaneous.revision_dir(revision)} #{Spontaneous.revision_dir}")
178
- set_status("complete")
257
+ update_progress("complete")
179
258
  end
180
259
 
181
260
  def abort_publish_at_exit
@@ -184,12 +263,12 @@ module Spontaneous
184
263
 
185
264
  def abort_publish(exception)
186
265
  if r = S::Site.pending_revision
187
- set_status("aborting")
266
+ update_progress("aborting")
188
267
  FileUtils.rm_r(Spontaneous.revision_dir(revision)) if File.exists?(Spontaneous.revision_dir(revision))
189
268
  S::Site.send(:pending_revision=, nil)
190
269
  S::Content.delete_revision(revision)
191
270
  puts exception.backtrace.join("\n")
192
- set_status("error", exception)
271
+ update_progress("error", exception)
193
272
  end
194
273
  end
195
274
  end # Immediate