spontaneous 0.2.0.alpha2 → 0.2.0.alpha3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (404) hide show
  1. data/Gemfile +3 -40
  2. data/Rakefile +29 -41
  3. data/Readme.markdown +21 -8
  4. data/application/css/add_alias_dialogue.css.scss +79 -0
  5. data/application/css/{v2.scss → core.css.scss} +537 -550
  6. data/application/css/{definitions.scss → definitions.css.scss} +121 -33
  7. data/application/css/dialogue.css.scss +409 -0
  8. data/application/css/{editing.scss → editing.css.scss} +25 -262
  9. data/application/css/font.css.scss +8 -0
  10. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  11. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  12. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_flat_10_000000_40x100.png +0 -0
  13. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  14. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  15. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  16. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  17. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  18. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  19. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_222222_256x240.png +0 -0
  20. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_228ef1_256x240.png +0 -0
  21. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ef8c08_256x240.png +0 -0
  22. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ffd27a_256x240.png +0 -0
  23. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ffffff_256x240.png +0 -0
  24. data/application/css/jquery-ui-1.8.21.custom/ui-lightness.css.scss +565 -0
  25. data/application/css/{login.scss → login.css.scss} +4 -4
  26. data/application/css/meta.css.scss +331 -0
  27. data/application/css/{popover.scss → popover.css.scss} +9 -8
  28. data/application/css/{schema_error.scss → schema_error.css.scss} +4 -4
  29. data/application/css/spontaneous.css +5 -0
  30. data/application/css/unsupported.css.scss +42 -0
  31. data/application/js/add_alias_dialogue.js +72 -10
  32. data/application/js/ajax.js +50 -16
  33. data/application/js/compatibility.js +19 -15
  34. data/application/js/content.js +39 -36
  35. data/application/js/content_area.js +53 -5
  36. data/application/js/dialogue.js +17 -0
  37. data/application/js/dom.js +1 -1
  38. data/application/js/edit_panel.js +23 -8
  39. data/application/js/extensions.js +7 -2
  40. data/application/js/field_preview.js +2 -1
  41. data/application/js/field_types/date_field.js +11 -8
  42. data/application/js/field_types/file_field.js +188 -9
  43. data/application/js/field_types/image_field.js +46 -29
  44. data/application/js/field_types/markdown_field.js +57 -14
  45. data/application/js/field_types/select_field.js +72 -0
  46. data/application/js/field_types/string_field.js +8 -0
  47. data/application/js/field_types/webvideo_field.js +8 -0
  48. data/application/js/init.js +1 -7
  49. data/application/js/location.js +41 -13
  50. data/application/js/login.js +3 -0
  51. data/application/js/meta_view/user_admin.js +543 -0
  52. data/application/js/meta_view.js +1 -0
  53. data/application/js/metadata.js +20 -0
  54. data/application/js/page.js +17 -3
  55. data/application/js/page_browser.js +40 -30
  56. data/application/js/page_entry.js +4 -0
  57. data/application/js/panel/root_menu.js +66 -0
  58. data/application/js/popover.js +2 -2
  59. data/application/js/preview.js +1 -1
  60. data/application/js/publish.js +138 -30
  61. data/application/js/services.js +43 -0
  62. data/application/js/sharded_upload.js +2 -2
  63. data/application/js/spontaneous.js +64 -5
  64. data/application/js/state.js +20 -9
  65. data/application/js/top_bar.js +273 -150
  66. data/application/js/types.js +20 -15
  67. data/application/js/upload.js +1 -2
  68. data/application/js/user.js +18 -4
  69. data/application/js/vendor/date.js +104 -0
  70. data/application/js/vendor/jquery-ui-1.8.18.custom.min.js +356 -0
  71. data/application/js/views/box_view.js +15 -8
  72. data/application/js/views/page_piece_view.js +11 -8
  73. data/application/js/views/page_view.js +21 -3
  74. data/application/js/views/piece_view.js +19 -10
  75. data/application/js/views.js +3 -0
  76. data/application/static/chromelogo-200x52-45c7cbc93be080bea342df5fcda2ef8b.png +0 -0
  77. data/application/static/dot-texture-9eea29e4ac7ad9a772285252078ec127.png +0 -0
  78. data/application/static/editing-textarea-resize-s-b5af62365eb7e19ea4beccf7242d508e.png +0 -0
  79. data/application/static/editing-texture-1-42b06a3439752490988f30f2a06d5e7c.png +0 -0
  80. data/application/static/font/fontawesome-webfont-5c5c21100a346972a82c34c5e96ffcfe.ttf +0 -0
  81. data/application/static/loop_alt1-white-7894b458528e92216196cae26b4c2c96.svg +12 -0
  82. data/application/static/spontaneous-states-e91ec89db525c62da0105b97cdd781ce.png +0 -0
  83. data/application/views/index.erb +2 -2
  84. data/application/views/login.erb +4 -8
  85. data/application/views/schema_modification_error.html.erb +1 -4
  86. data/application/views/unsupported.erb +9 -7
  87. data/bin/spot +1 -1
  88. data/db/migrations/20110209152710_users_and_groups.rb +10 -10
  89. data/db/migrations/20120305112647_site_modification_time.rb +11 -0
  90. data/db/migrations/20120418153903_add_ownership_of_content.rb +14 -0
  91. data/db/migrations/20120423175416_add_pending_modifications.rb +21 -0
  92. data/db/migrations/20120525164947_add_field_versions.rb +27 -0
  93. data/lib/sequel/plugins/scoped_table_name.rb +10 -1
  94. data/lib/spontaneous/asset/file.rb +25 -0
  95. data/lib/spontaneous/asset/source.rb +28 -0
  96. data/lib/spontaneous/asset.rb +75 -0
  97. data/lib/spontaneous/box.rb +6 -4
  98. data/lib/spontaneous/capistrano/deploy.rb +47 -0
  99. data/lib/spontaneous/capistrano/sync.rb +81 -0
  100. data/lib/spontaneous/capistrano.rb +13 -0
  101. data/lib/spontaneous/change.rb +60 -68
  102. data/lib/spontaneous/cli/assets.rb +29 -0
  103. data/lib/spontaneous/cli/base.rb +0 -48
  104. data/lib/spontaneous/cli/console.rb +1 -1
  105. data/lib/spontaneous/cli/server.rb +6 -4
  106. data/lib/spontaneous/cli/site.rb +28 -17
  107. data/lib/spontaneous/cli/user.rb +107 -0
  108. data/lib/spontaneous/cli.rb +100 -4
  109. data/lib/spontaneous/collections/entry_set.rb +2 -2
  110. data/lib/spontaneous/collections/field_set.rb +48 -22
  111. data/lib/spontaneous/collections/prototype_set.rb +20 -13
  112. data/lib/spontaneous/constants.rb +3 -0
  113. data/lib/spontaneous/content.rb +22 -5
  114. data/lib/spontaneous/errors.rb +3 -3
  115. data/lib/spontaneous/extensions/array.rb +12 -0
  116. data/lib/spontaneous/extensions/enumerable.rb +30 -0
  117. data/lib/spontaneous/extensions/nil.rb +3 -1
  118. data/lib/spontaneous/extensions/string.rb +16 -0
  119. data/lib/spontaneous/field_types/date_field.rb +45 -2
  120. data/lib/spontaneous/field_types/field.rb +42 -9
  121. data/lib/spontaneous/field_types/file_field.rb +68 -0
  122. data/lib/spontaneous/field_types/image_field.rb +63 -0
  123. data/lib/spontaneous/field_types/select_field.rb +109 -0
  124. data/lib/spontaneous/field_types/string_field.rb +6 -1
  125. data/lib/spontaneous/field_types/webvideo_field.rb +85 -27
  126. data/lib/spontaneous/field_types.rb +1 -1
  127. data/lib/spontaneous/field_version.rb +8 -0
  128. data/lib/spontaneous/generators/page.rb +1 -1
  129. data/lib/spontaneous/generators/site/Capfile.tt +1 -4
  130. data/lib/spontaneous/generators/site/Gemfile.tt +13 -6
  131. data/lib/spontaneous/generators/site/config/deploy.rb.tt +28 -0
  132. data/lib/spontaneous/generators/site/config/environments/production.rb.tt +7 -2
  133. data/lib/spontaneous/generators/site.rb +1 -0
  134. data/lib/spontaneous/json.rb +34 -11
  135. data/lib/spontaneous/layout.rb +22 -0
  136. data/lib/spontaneous/media/file.rb +4 -0
  137. data/lib/spontaneous/output/assets/compression.rb +58 -0
  138. data/lib/spontaneous/output/assets.rb +32 -0
  139. data/lib/spontaneous/output/context.rb +179 -0
  140. data/lib/spontaneous/output/format/html.rb +5 -0
  141. data/lib/spontaneous/output/format/plain.rb +5 -0
  142. data/lib/spontaneous/output/format.rb +180 -0
  143. data/lib/spontaneous/output/helpers/classes_helper.rb +18 -0
  144. data/lib/spontaneous/{render/helpers/html_helper.rb → output/helpers/conditional_comment_helper.rb} +3 -12
  145. data/lib/spontaneous/output/helpers/script_helper.rb +73 -0
  146. data/lib/spontaneous/output/helpers/stylesheet_helper.rb +61 -0
  147. data/lib/spontaneous/output/helpers.rb +28 -0
  148. data/lib/spontaneous/output/template/engine.rb +59 -0
  149. data/lib/spontaneous/output/template/renderer.rb +153 -0
  150. data/lib/spontaneous/output/template.rb +21 -0
  151. data/lib/spontaneous/output.rb +163 -0
  152. data/lib/spontaneous/page.rb +2 -1
  153. data/lib/spontaneous/paths.rb +6 -1
  154. data/lib/spontaneous/permissions/access_key.rb +5 -5
  155. data/lib/spontaneous/permissions/user.rb +81 -35
  156. data/lib/spontaneous/permissions/user_level.rb +26 -22
  157. data/lib/spontaneous/plugins/aliases.rb +76 -12
  158. data/lib/spontaneous/plugins/allowed_types.rb +60 -18
  159. data/lib/spontaneous/plugins/application/paths.rb +0 -28
  160. data/lib/spontaneous/plugins/application/system.rb +35 -0
  161. data/lib/spontaneous/plugins/boxes.rb +4 -0
  162. data/lib/spontaneous/plugins/content_groups.rb +16 -0
  163. data/lib/spontaneous/plugins/entries.rb +50 -30
  164. data/lib/spontaneous/plugins/fields.rb +15 -0
  165. data/lib/spontaneous/plugins/layouts.rb +8 -2
  166. data/lib/spontaneous/plugins/modifications.rb +228 -0
  167. data/lib/spontaneous/plugins/page/formats.rb +67 -42
  168. data/lib/spontaneous/plugins/page/request.rb +10 -0
  169. data/lib/spontaneous/plugins/page/site_timestamps.rb +28 -0
  170. data/lib/spontaneous/plugins/paths.rb +15 -3
  171. data/lib/spontaneous/plugins/publishing.rb +124 -45
  172. data/lib/spontaneous/plugins/render.rb +13 -8
  173. data/lib/spontaneous/plugins/schema_hierarchy.rb +18 -6
  174. data/lib/spontaneous/plugins/site/helpers.rb +53 -0
  175. data/lib/spontaneous/plugins/site/hooks.rb +50 -0
  176. data/lib/spontaneous/plugins/site/map.rb +1 -1
  177. data/lib/spontaneous/plugins/site/paths.rb +13 -0
  178. data/lib/spontaneous/plugins/site/publishing.rb +6 -2
  179. data/lib/spontaneous/plugins/site/{revisions.rb → state.rb} +5 -1
  180. data/lib/spontaneous/plugins/site/storage.rb +4 -0
  181. data/lib/spontaneous/plugins/site/url.rb +15 -0
  182. data/lib/spontaneous/plugins/site_map.rb +13 -3
  183. data/lib/spontaneous/plugins/styles.rb +5 -1
  184. data/lib/spontaneous/plugins/visibility.rb +39 -12
  185. data/lib/spontaneous/prototypes/box_prototype.rb +4 -0
  186. data/lib/spontaneous/prototypes/field_prototype.rb +15 -10
  187. data/lib/spontaneous/publishing/event_client.rb +46 -0
  188. data/lib/spontaneous/publishing/immediate.rb +81 -44
  189. data/lib/spontaneous/publishing/simultaneous.rb +23 -6
  190. data/lib/spontaneous/publishing.rb +4 -3
  191. data/lib/spontaneous/rack/around_back.rb +1 -5
  192. data/lib/spontaneous/rack/around_front.rb +4 -4
  193. data/lib/spontaneous/rack/around_preview.rb +4 -3
  194. data/lib/spontaneous/rack/assets.rb +81 -54
  195. data/lib/spontaneous/rack/authentication.rb +0 -1
  196. data/lib/spontaneous/rack/back.rb +160 -72
  197. data/lib/spontaneous/rack/cookie_authentication.rb +2 -2
  198. data/lib/spontaneous/rack/css.rb +18 -15
  199. data/lib/spontaneous/rack/event_source.rb +9 -21
  200. data/lib/spontaneous/rack/fiber_pool.rb +26 -0
  201. data/lib/spontaneous/rack/front.rb +12 -4
  202. data/lib/spontaneous/rack/helpers.rb +35 -13
  203. data/lib/spontaneous/rack/js.rb +41 -0
  204. data/lib/spontaneous/rack/public.rb +34 -44
  205. data/lib/spontaneous/rack/sse.rb +18 -0
  206. data/lib/spontaneous/rack/static.rb +3 -0
  207. data/lib/spontaneous/rack/user_admin.rb +100 -0
  208. data/lib/spontaneous/rack/user_helpers.rb +1 -1
  209. data/lib/spontaneous/rack.rb +6 -2
  210. data/lib/spontaneous/schema.rb +31 -4
  211. data/lib/spontaneous/search/index.rb +19 -3
  212. data/lib/spontaneous/search/results.rb +1 -1
  213. data/lib/spontaneous/sequel.rb +17 -0
  214. data/lib/spontaneous/site.rb +11 -4
  215. data/lib/spontaneous/state.rb +11 -0
  216. data/lib/spontaneous/storage/cloud.rb +4 -0
  217. data/lib/spontaneous/storage/local.rb +11 -0
  218. data/lib/spontaneous/style.rb +2 -2
  219. data/lib/spontaneous/tasks/database.rake +21 -22
  220. data/lib/spontaneous/utils/database/mysql_dumper.rb +4 -0
  221. data/lib/spontaneous/utils/database/postgres_dumper.rb +78 -0
  222. data/lib/spontaneous/utils/database.rb +6 -3
  223. data/lib/spontaneous/utils/smart_quotes.rb +499 -0
  224. data/lib/spontaneous/utils/smush_it.rb +66 -0
  225. data/lib/spontaneous/utils.rb +3 -1
  226. data/lib/spontaneous/version.rb +2 -2
  227. data/lib/spontaneous.rb +25 -29
  228. data/spontaneous.gemspec +186 -106
  229. data/test/experimental/test_features.rb +1 -1
  230. data/test/fixtures/asset_pipeline/application/css/basic.css.scss +4 -0
  231. data/test/fixtures/asset_pipeline/application/css/complex.css.scss.erb +6 -0
  232. data/test/fixtures/asset_pipeline/application/css/simple.css +3 -0
  233. data/test/fixtures/asset_pipeline/application/css/spontaneous.css +7 -0
  234. data/test/fixtures/asset_pipeline/application/css/subdir/complex.css.scss.erb +6 -0
  235. data/test/fixtures/asset_pipeline/application/css/subdir/library.css.scss +1 -0
  236. data/test/fixtures/asset_pipeline/application/css/subdir/simple.css +3 -0
  237. data/test/fixtures/asset_pipeline/application/js/basic.js.coffee +1 -0
  238. data/test/fixtures/asset_pipeline/application/js/complex.js.coffee.erb +1 -0
  239. data/test/fixtures/asset_pipeline/application/js/login.js +1 -0
  240. data/test/fixtures/asset_pipeline/application/js/require.js +1 -0
  241. data/test/fixtures/asset_pipeline/application/js/simple.js +1 -0
  242. data/test/fixtures/asset_pipeline/application/js/spontaneous.js +5 -0
  243. data/test/fixtures/asset_pipeline/application/js/subdir/complex.js.coffee.erb +1 -0
  244. data/test/fixtures/asset_pipeline/application/js/subdir/library.js.coffee +1 -0
  245. data/test/fixtures/asset_pipeline/application/js/subdir/simple.js +1 -0
  246. data/test/fixtures/asset_pipeline/application/js/vendor/jquery.js +1 -0
  247. data/test/fixtures/asset_pipeline/application/static/dot-texture.png +0 -0
  248. data/test/fixtures/asset_pipeline/application/static/subdir/px.gif +0 -0
  249. data/test/fixtures/assets/public1/css/a.scss +1 -0
  250. data/test/fixtures/assets/public1/js/a.js +1 -0
  251. data/test/fixtures/assets/public1/js/m.coffee +1 -0
  252. data/test/fixtures/assets/public2/css/b.scss +1 -0
  253. data/test/fixtures/assets/public2/css/c.css +1 -0
  254. data/test/fixtures/assets/public2/js/b.js +1 -0
  255. data/test/fixtures/assets/public2/js/c.js +1 -0
  256. data/test/fixtures/assets/public2/js/n.coffee +1 -0
  257. data/test/fixtures/back/config/user_levels.yml +3 -0
  258. data/test/fixtures/back/public/js/coffeescript.coffee +1 -0
  259. data/test/fixtures/back/templates/layouts/standard.css.cut +1 -0
  260. data/test/fixtures/back/templates/layouts/standard.js.cut +1 -0
  261. data/test/fixtures/example_application/config/database.yml +4 -4
  262. data/test/fixtures/helpers/templates/layouts/standard.html.cut +1 -0
  263. data/test/fixtures/helpers/templates/layouts/standard.mobile.cut +1 -0
  264. data/test/fixtures/images/vimlogo.pdf +0 -0
  265. data/test/fixtures/outputs/templates/layouts/standard.atom.cut +1 -0
  266. data/test/fixtures/permissions/config/user_levels.yml +6 -3
  267. data/test/fixtures/serialisation/class_hash.yaml.erb +1 -0
  268. data/test/fixtures/serialisation/root_hash.yaml.erb +2 -2
  269. data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
  270. data/test/fixtures/templates/extended/main.html.cut +5 -5
  271. data/test/fixtures/templates/extended/parent.html.cut +8 -8
  272. data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -1
  273. data/test/fixtures/templates/extended/with_includes.html.cut +6 -6
  274. data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +6 -7
  275. data/test/fixtures/templates/layouts/entries.html.cut +4 -4
  276. data/test/fixtures/templates/layouts/standard.html.cut +1 -0
  277. data/test/fixtures/templates/layouts/variables.html.cut +1 -1
  278. data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -1
  279. data/test/fixtures/templates/publishing/templates/layouts/static.rtf.cut +1 -0
  280. data/test/fixtures/templates/template_class/complex_template.html.cut +2 -2
  281. data/test/fixtures/templates/template_class/complex_template.pdf.cut +2 -2
  282. data/test/fixtures/templates/template_class/default_template_style.html.cut +1 -1
  283. data/test/fixtures/templates/template_class/images_with_template.html.cut +2 -2
  284. data/test/fixtures/templates/template_class/slots_template.html.cut +2 -2
  285. data/test/fixtures/templates/template_class/slots_template.pdf.cut +2 -2
  286. data/test/fixtures/user_manager/config/user_levels.yml +9 -0
  287. data/test/functional/test_application.rb +7 -7
  288. data/test/functional/test_back.rb +352 -97
  289. data/test/functional/test_front.rb +71 -20
  290. data/test/functional/test_user_manager.rb +284 -0
  291. data/test/javascript/env.js +13505 -0
  292. data/test/javascript/test_markdown.rb +43 -3
  293. data/test/support/custom_matchers.rb +3 -2
  294. data/test/test_helper.rb +50 -9
  295. data/test/test_javascript.rb +13 -13
  296. data/test/ui_helper.rb +1 -1
  297. data/test/unit/test_alias.rb +79 -8
  298. data/test/unit/test_asset_bundler.rb +220 -0
  299. data/test/unit/test_assets.rb +213 -0
  300. data/test/unit/test_async.rb +55 -0
  301. data/test/unit/test_authentication.rb +52 -39
  302. data/test/unit/test_boxes.rb +20 -15
  303. data/test/unit/test_changesets.rb +261 -0
  304. data/test/unit/test_content.rb +73 -33
  305. data/test/unit/test_content_inheritance.rb +18 -18
  306. data/test/unit/test_extensions.rb +26 -0
  307. data/test/unit/test_fields.rb +303 -16
  308. data/test/unit/test_formats.rb +267 -34
  309. data/test/unit/test_helpers.rb +79 -2
  310. data/test/unit/test_images.rb +10 -0
  311. data/test/unit/test_layouts.rb +21 -13
  312. data/test/unit/test_modifications.rb +648 -0
  313. data/test/unit/test_page.rb +6 -2
  314. data/test/unit/test_permissions.rb +101 -27
  315. data/test/unit/test_piece.rb +4 -4
  316. data/test/unit/test_plugins.rb +3 -2
  317. data/test/unit/test_publishing.rb +332 -0
  318. data/test/unit/test_render.rb +118 -67
  319. data/test/unit/test_revisions.rb +546 -0
  320. data/test/unit/test_schema.rb +83 -1
  321. data/test/unit/test_search.rb +59 -0
  322. data/test/unit/test_serialisation.rb +2 -47
  323. data/test/unit/test_site.rb +217 -108
  324. data/test/unit/test_storage.rb +26 -0
  325. data/test/unit/test_structure.rb +2 -2
  326. data/test/unit/test_styles.rb +90 -75
  327. data/test/unit/test_table_scoping.rb +21 -17
  328. data/test/unit/test_templates.rb +75 -69
  329. data/test/{slow → unit}/test_visibility.rb +78 -22
  330. metadata +528 -221
  331. data/application/css/add_alias_dialogue.scss +0 -27
  332. data/application/css/min/14c2a35812c443001b15d8b12a4780f88c678035.css +0 -1
  333. data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +0 -1
  334. data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +0 -1
  335. data/application/css/spontaneous.scss +0 -111
  336. data/application/css/unsupported.scss +0 -16
  337. data/application/css/variables.scss +0 -80
  338. data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +0 -3
  339. data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +0 -2
  340. data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +0 -3
  341. data/application/js/min/b8abf302a824c35385ff517b34111e1710ff3b37.js +0 -2
  342. data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +0 -90
  343. data/application/static/diagonal-texture.png +0 -0
  344. data/application/static/editing-0-noise.png +0 -0
  345. data/application/static/editing-1-noise.png +0 -0
  346. data/application/static/editing-texture-1.png +0 -0
  347. data/application/static/editing-texture.png +0 -0
  348. data/application/static/editing-toolbar-shadow-bottom.png +0 -0
  349. data/application/static/editing-toolbar-shadow-top.png +0 -0
  350. data/application/static/inner-glow.png +0 -0
  351. data/application/static/item-buttons-highlight.png +0 -0
  352. data/application/static/item-buttons.png +0 -0
  353. data/application/static/paper-texture-dark.png +0 -0
  354. data/application/static/plus_alt.svg +0 -8
  355. data/application/static/select-arrow-root.png +0 -0
  356. data/application/static/slot-up-arrow.png +0 -0
  357. data/application/static/spontaneous.png +0 -0
  358. data/lib/cutaneous/context_helper.rb +0 -187
  359. data/lib/cutaneous/preview_context.rb +0 -32
  360. data/lib/cutaneous/preview_renderer.rb +0 -10
  361. data/lib/cutaneous/publish_context.rb +0 -10
  362. data/lib/cutaneous/publish_renderer.rb +0 -14
  363. data/lib/cutaneous/publish_template.rb +0 -62
  364. data/lib/cutaneous/publish_token_parser.rb +0 -8
  365. data/lib/cutaneous/renderer.rb +0 -124
  366. data/lib/cutaneous/request_context.rb +0 -9
  367. data/lib/cutaneous/request_renderer.rb +0 -15
  368. data/lib/cutaneous/request_template.rb +0 -11
  369. data/lib/cutaneous/request_token_parser.rb +0 -9
  370. data/lib/cutaneous/token_parser.rb +0 -125
  371. data/lib/cutaneous.rb +0 -48
  372. data/lib/spontaneous/render/context_base.rb +0 -143
  373. data/lib/spontaneous/render/development_renderer.rb +0 -14
  374. data/lib/spontaneous/render/engine.rb +0 -19
  375. data/lib/spontaneous/render/format/html.rb +0 -5
  376. data/lib/spontaneous/render/format.rb +0 -75
  377. data/lib/spontaneous/render/helpers/script_helper.rb +0 -17
  378. data/lib/spontaneous/render/helpers/stylesheet_helper.rb +0 -16
  379. data/lib/spontaneous/render/helpers.rb +0 -14
  380. data/lib/spontaneous/render/preview_context.rb +0 -8
  381. data/lib/spontaneous/render/preview_renderer.rb +0 -24
  382. data/lib/spontaneous/render/publish_context.rb +0 -22
  383. data/lib/spontaneous/render/published_renderer.rb +0 -53
  384. data/lib/spontaneous/render/publishing_renderer.rb +0 -16
  385. data/lib/spontaneous/render/render_cache.rb +0 -26
  386. data/lib/spontaneous/render/renderer.rb +0 -50
  387. data/lib/spontaneous/render/request_context.rb +0 -8
  388. data/lib/spontaneous/render.rb +0 -214
  389. data/test/experimental/test_cutaneous.rb +0 -309
  390. data/test/fixtures/application/css/test.less +0 -5
  391. data/test/slow/test_publishing.rb +0 -1006
  392. /data/application/css/{developer.scss → developer.css.scss} +0 -0
  393. /data/application/js/vendor/{jquery-1.7.1.min.js → jquery.js} +0 -0
  394. /data/application/static/{location-arrow.png → location-arrow-c1c1d3ca472481c61a0a5f8cb289d743.png} +0 -0
  395. /data/application/static/{missing.png → missing-911ce6dbd9f4602e0f3fbcd7e78846a2.png} +0 -0
  396. /data/application/static/{orange-down-arrow.png → orange-down-arrow-395ae1929e8662b2ff0977daf12c35bb.png} +0 -0
  397. /data/application/static/{page-browser-next.png → page-browser-next-ce781a242c23b980b99b9db7abc20b05.png} +0 -0
  398. /data/application/static/{plus-box.png → plus-box-dcde74a1e496f68298c9b443caa1c5d5.png} +0 -0
  399. /data/application/static/{select-arrow.png → select-arrow-6e7dd3745b00e934b0d7a3250c46558b.png} +0 -0
  400. /data/application/static/{slot-down-arrow.png → slot-down-arrow-59ad5f5ee5b52a7ebd00bca4b3104194.png} +0 -0
  401. /data/application/static/{splash.png → splash-65b493a714df9b8b3ab170103401b53d.png} +0 -0
  402. /data/application/static/{spot.png → spot-71fab1d2f065034f5fc15e7bea2ad36c.png} +0 -0
  403. /data/application/static/{spot.svg → spot-8505041082d8d3bbe8d34c29dddb3b7d.svg} +0 -0
  404. /data/application/static/{texture.png → texture-03f7627e8264b1d607113ab32c593a58.png} +0 -0
@@ -0,0 +1,61 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'sass'
4
+
5
+ module Spontaneous::Output::Helpers
6
+ module StylesheetHelper
7
+ extend self
8
+
9
+ def stylesheets(*args)
10
+ stylesheets = args.flatten
11
+ options = stylesheets.extract_options!
12
+ compress_stylesheets = (live? or (publishing? and options[:force_compression]))
13
+
14
+ return compressed_stylesheets(stylesheets) if compress_stylesheets
15
+
16
+ stylesheets.map do |stylesheet|
17
+ stylesheet_tag(stylesheet)
18
+ end.join("\n")
19
+ end
20
+
21
+ alias_method :stylesheet, :stylesheets
22
+
23
+ def stylesheet_tag(href)
24
+ href = "#{href}.css" unless href =~ /\.css$/o
25
+ %(<link rel="stylesheet" href="#{href}" />)
26
+ end
27
+
28
+ def compressed_stylesheets(stylesheets)
29
+ file_paths = stylesheets.map { |style| [style, S::Output::Assets.find_file("#{style}.scss", "#{style}.css")] }
30
+ invalid, file_paths = file_paths.partition { |url, path| path.nil? }
31
+ roots = Spontaneous.instance.paths.expanded(:public)
32
+
33
+ tags = []
34
+ css = file_paths.map { |url, path|
35
+ case path
36
+ when /\.scss$/o
37
+ load_paths = roots + [File.dirname(path), File.dirname(path) / "sass"]
38
+ ::Sass::Engine.for_file(path, {
39
+ :load_paths => load_paths,
40
+ :cache => false,
41
+ :style => :compressed
42
+ }).render
43
+ else
44
+ File.read(path)
45
+ end
46
+ }.join
47
+ compressed, hash = compress_css_string(css)
48
+ output_path = Spontaneous::Output::Assets.path_for(revision, "#{hash}.css")
49
+ FileUtils.mkdir_p(File.dirname(output_path))
50
+ File.open(output_path, "w") { |file| file.write(compressed) }
51
+ tags = [stylesheet_tag(Spontaneous::Output::Assets.url(hash))]
52
+ tags.join("\n")
53
+ end
54
+
55
+ def compress_css_string(css_string)
56
+ Spontaneous::Output::Assets::Compression.shine_compress_string(css_string, :css)
57
+ end
58
+
59
+ Spontaneous::Output::Helpers.register_helper(self, :html)
60
+ end
61
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: UTF-8
2
+
3
+ module Spontaneous::Output
4
+ module Helpers
5
+ # Helpers needs a separate helper registration mechanism outside of the Site scope
6
+ # because loading of these modules happens before we instantiate the site object.
7
+ # I don't want to pass calls to Site.register_helper here because Site based helpers
8
+ # should be disposed of with the Site instance whereas these core helpers should persist
9
+ def self.register_helper(helper_module, *formats)
10
+ if formats.empty?
11
+ registered_helpers[:*] << helper_module
12
+ else
13
+ formats.each do |format|
14
+ registered_helpers[format.to_sym] << helper_module
15
+ end
16
+ end
17
+ end
18
+
19
+ def self.registered_helpers
20
+ @registered_helpers ||= Hash.new { |hash, key| hash[key] = [] }
21
+ end
22
+
23
+ require 'spontaneous/output/helpers/stylesheet_helper'
24
+ require 'spontaneous/output/helpers/script_helper'
25
+ require 'spontaneous/output/helpers/classes_helper'
26
+ require 'spontaneous/output/helpers/conditional_comment_helper'
27
+ end
28
+ end
@@ -0,0 +1,59 @@
1
+
2
+ module Spontaneous::Output::Template
3
+ class PublishEngine
4
+ # Should be initialized with the Site template roots
5
+ def initialize(template_roots, cache = Spontaneous::Output.cache_templates?)
6
+ @engine = template_engine_class(cache).new(template_roots, syntax)
7
+ self.write_compiled_scripts = Spontaneous::Output.write_compiled_scripts?
8
+ end
9
+
10
+ def write_compiled_scripts=(state)
11
+ @engine.write_compiled_scripts = state if @engine.respond_to?(:write_compiled_scripts=)
12
+ end
13
+
14
+ def syntax
15
+ PublishSyntax
16
+ end
17
+
18
+ def roots
19
+ @engine.roots
20
+ end
21
+
22
+ def render(content, context, format = "html")
23
+ render_template(template_path(content, format), context, format)
24
+ end
25
+
26
+ def render_template(template_path, context, format = "html")
27
+ @engine.render(template_path, context, format)
28
+ end
29
+
30
+ def render_string(template_string, context, format = "html")
31
+ @engine.render_string(template_string, context, format)
32
+ end
33
+
34
+ def template_path(content, format)
35
+ content.template(format)
36
+ end
37
+
38
+ def template_exists?(root, template, format)
39
+ @engine.template_exists?(root, template, format)
40
+ end
41
+
42
+ def template_engine_class(cache)
43
+ ::Spontaneous::Output.template_engine_class(cache)
44
+ end
45
+ end
46
+
47
+ # Should be initialized with the path to the current rendered revision
48
+ class RequestEngine < PublishEngine
49
+ def syntax
50
+ RequestSyntax
51
+ end
52
+
53
+ def template_path(content, format)
54
+ path = content.path.gsub(%r{^/}, "")
55
+ path = "index" if path.empty?
56
+ path
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,153 @@
1
+
2
+ module Spontaneous::Output::Template
3
+ # Renderers are responsible for creating contexts from objects & passing these
4
+ # onto the right template engine
5
+ # You only have one renderer instance per spontaneous role:
6
+ #
7
+ # - editing/previewing : PreviewRenderer
8
+ # - publishing : PublishRenderer
9
+ # - the live site : PublishedRenderer
10
+ #
11
+ # these should be shared between requests/renders so that the
12
+ # caching can be effective
13
+
14
+ class Renderer
15
+ def initialize(cache = Spontaneous::Output.cache_templates?)
16
+ @cache = cache
17
+ end
18
+
19
+ def render(output, params = {})
20
+ Spontaneous::Content.with_visible do
21
+ engine.render(output.content, context(output, params), output.name.to_s)
22
+ end
23
+ end
24
+
25
+ def render_string(template_string, output, params = {})
26
+ Spontaneous::Content.with_visible do
27
+ engine.render_string(template_string, context(output, params), output.name.to_s)
28
+ end
29
+ end
30
+
31
+ def context(output, params)
32
+ context_class(output).new(output.content, params).tap do |context|
33
+ context.__renderer = self
34
+ end
35
+ end
36
+
37
+ def context_class(output)
38
+ context_cache[output.name] ||= generate_context_class(output)
39
+ end
40
+
41
+ def context_cache
42
+ @context_cache ||= {}
43
+ end
44
+
45
+ def generate_context_class(output)
46
+ context_class = Class.new(Spontaneous::Output.context_class) do
47
+ include Spontaneous::Output::Context::ContextCore
48
+ include output.context
49
+ end
50
+ context_extensions.each do |mod|
51
+ context_class.send :include, mod
52
+ end
53
+ context_class
54
+ end
55
+
56
+ def context_extensions
57
+ []
58
+ end
59
+
60
+ def write_compiled_scripts=(state)
61
+ end
62
+
63
+ def template_exists?(root, template, format)
64
+ engine.template_exists?(root, template, format)
65
+ end
66
+
67
+ def engine
68
+ @engine ||= Spontaneous::Output::Template::PublishEngine.new(Spontaneous::Site.paths(:templates), @cache)
69
+ end
70
+ end
71
+
72
+ class PublishRenderer < Renderer
73
+ def initialize(cache = Spontaneous::Output.cache_templates?)
74
+ super
75
+ Thread.current[:_render_cache] = {}
76
+ end
77
+
78
+ def render_cache
79
+ Thread.current[:_render_cache]
80
+ end
81
+
82
+ def write_compiled_scripts=(state)
83
+ engine.write_compiled_scripts = state
84
+ end
85
+
86
+ def context_extensions
87
+ [Spontaneous::Output::Context::PublishContext]
88
+ end
89
+ end
90
+
91
+ class RequestRenderer < Renderer
92
+ def engine
93
+ @engine ||= Spontaneous::Output::Template::RequestEngine.new(Spontaneous::Site.paths(:templates), @cache)
94
+ end
95
+ end
96
+
97
+ class PublishedRenderer < Renderer
98
+ def initialize(revision, cache = Spontaneous::Output.cache_templates?)
99
+ super(cache)
100
+ @revision = revision
101
+ end
102
+
103
+ def render(output, params = {})
104
+ request = params[:request]
105
+ response = params[:response]
106
+ headers = request.env
107
+ # Test for static template
108
+ path = template_path(output, false, request)
109
+ return static_template(path) if ::File.exist?(path)
110
+ # Attempt to render a published template
111
+ super
112
+ rescue Cutaneous::UnknownTemplateError => e
113
+ template = publish_renderer.render(output, params)
114
+ render_string(template, output, params)
115
+ end
116
+
117
+ def static_template(template_path)
118
+ File.open(template_path)
119
+ end
120
+
121
+ def template_path(output, dynamic, request)
122
+ Spontaneous::Output.output_path(@revision, output, dynamic, request.request_method)
123
+ end
124
+
125
+ def engine
126
+ @engine ||= Spontaneous::Output::Template::RequestEngine.new(revision_root, @cache)
127
+ end
128
+
129
+ def publish_renderer
130
+ @publish_renderer ||= PublishRenderer.new
131
+ end
132
+
133
+ def revision_root
134
+ [Spontaneous::Site.revision_dir(@revision)/ "dynamic"]
135
+ end
136
+ end
137
+
138
+ class PreviewRenderer < Renderer
139
+ def render(output, params = {})
140
+ rendered = super(output)
141
+ request_renderer.render_string(rendered, output, params)
142
+ end
143
+
144
+ def render_string(template_string, output, params = {})
145
+ rendered = super(template_string, output)
146
+ request_renderer.render_string(rendered, output, params)
147
+ end
148
+
149
+ def request_renderer
150
+ @request_renderer ||= RequestRenderer.new
151
+ end
152
+ end
153
+ end
@@ -0,0 +1,21 @@
1
+ require 'spontaneous/output/template/renderer'
2
+ require 'spontaneous/output/template/engine'
3
+
4
+ module Spontaneous::Output
5
+ module Template
6
+
7
+ PublishSyntax = Cutaneous::FirstPassSyntax
8
+ RequestSyntax = Cutaneous::SecondPassSyntax
9
+
10
+
11
+ def extension
12
+ Cutaneous.extension
13
+ end
14
+
15
+ def is_dynamic?(template_string)
16
+ RequestSyntax.is_dynamic?(template_string)
17
+ end
18
+
19
+ extend self
20
+ end
21
+ end
@@ -0,0 +1,163 @@
1
+
2
+ module Spontaneous
3
+ module Output
4
+ def self.create(output_name, options = {})
5
+ options[:format] ||= generate_format(output_name)
6
+ c = (output_class(output_name, options)).tap do |klass|
7
+ klass.configure(output_name, options)
8
+ end
9
+ end
10
+
11
+ def self.generate_format(output_name)
12
+ if format_class_map.key?(output_name) or real_format?(output_name)
13
+ output_name
14
+ else
15
+ :html
16
+ end
17
+ end
18
+
19
+ def self.output_class(output_name, options)
20
+ format = options[:format]
21
+ unless (output_class = format_class_map[format])
22
+ output_class = create_output_class(format_class_map[:plain], format)
23
+ format_class_map[format] = output_class
24
+ end
25
+ c = Class.new(output_class)
26
+ end
27
+
28
+ def self.real_format?(format)
29
+ return format.to_sym if ::Rack::Mime::MIME_TYPES.key?(".#{format}")
30
+ nil
31
+ end
32
+
33
+ def self.create_output_class(baseclass, format)
34
+ output_class = Class.new(baseclass) do
35
+ end
36
+ self.register_format(output_class, format)
37
+ self.const_set(format.to_s.upcase, output_class)
38
+ output_class
39
+ end
40
+
41
+ def self.unknown_format?(format)
42
+ !format_class_map.key?(format.to_sym)
43
+ end
44
+
45
+ def self.format_class_map
46
+ @format_class_map ||= {}
47
+ end
48
+
49
+ def self.register_format(klass, *formats)
50
+ formats.each do |f|
51
+ format_class_map[f] = klass
52
+ end
53
+ end
54
+
55
+ def self.output_path(revision, output, template_dynamic = false, request_method = "GET")
56
+ output_path_with_root(revision_root(revision), revision, output, template_dynamic, request_method)
57
+ end
58
+
59
+ def self.output_path_with_root(root, revision, output, template_dynamic = false, request_method = "GET")
60
+ segment = case
61
+ when template_dynamic || output.dynamic?
62
+ "dynamic"
63
+ when output.page.dynamic?(request_method)
64
+ "protected"
65
+ else
66
+ "static"
67
+ end
68
+ path = output.page.path
69
+ dir = root / segment / path
70
+ ext = output.extension(template_dynamic)
71
+
72
+ file = "#{dir}#{ext}"
73
+ file = dir / "/index#{ext}" if path == "/" # root is a special case, as always
74
+ file
75
+ end
76
+
77
+ # TODO: Is this ever used? Delete it & see what breaks
78
+ def self.revision_dir(revision=nil, root = nil)
79
+ Site.instance.revision_dir(revision, root)
80
+ end
81
+
82
+ def self.revision_root(revision)
83
+ Site.instance.revision_dir(revision)
84
+ end
85
+
86
+ def self.context_class
87
+ Cutaneous::Context
88
+ end
89
+
90
+ def self.cache_templates?
91
+ @cache_templates ||= Spontaneous.production?
92
+ end
93
+
94
+ def self.cache_templates=(value)
95
+ @cache_templates = value
96
+ end
97
+
98
+ def self.write_compiled_scripts=(state)
99
+ @write_compiled_scripts = !!state
100
+ end
101
+
102
+ def self.write_compiled_scripts?
103
+ @write_compiled_scripts = Spontaneous.production? unless defined?(@write_compiled_scripts)
104
+ @write_compiled_scripts
105
+ end
106
+
107
+ def self.template_engine_class(cache = cache_templates?)
108
+ if cache
109
+ cached_engine_class
110
+ else
111
+ uncached_engine_class
112
+ end
113
+ end
114
+
115
+ def self.cached_engine_class
116
+ Cutaneous::CachingEngine
117
+ end
118
+
119
+ def self.uncached_engine_class
120
+ Cutaneous::Engine
121
+ end
122
+
123
+ def self.renderer
124
+ @renderer ||= default_renderer
125
+ end
126
+
127
+ def self.renderer=(renderer)
128
+ @renderer = renderer
129
+ end
130
+
131
+ def self.default_renderer
132
+ Template::Renderer.new
133
+ end
134
+
135
+ def self.published_renderer(revision = Spontaneous::State.published_revision)
136
+ Template::PublishedRenderer.new(revision)
137
+ end
138
+
139
+ def self.preview_renderer
140
+ Template::PreviewRenderer.new
141
+ end
142
+
143
+ def self.template_exists?(root, template, format)
144
+ renderer.template_exists?(root, template, format)
145
+ end
146
+
147
+ def self.asset_url(file = nil)
148
+ File.join ["/rev", file].compact
149
+ end
150
+
151
+ def self.asset_path(revision = nil)
152
+ Spontaneous.revision_dir(revision) / asset_url
153
+ end
154
+
155
+ autoload :Template, "spontaneous/output/template"
156
+ autoload :Context, "spontaneous/output/context"
157
+ autoload :Helpers, "spontaneous/output/helpers"
158
+ autoload :Assets, "spontaneous/output/assets"
159
+ end
160
+ end
161
+
162
+ # Loads in the default HTML & Plain formats
163
+ require 'spontaneous/output/format'
@@ -11,6 +11,7 @@ module Spontaneous
11
11
  include Plugins::PageSearch
12
12
  include Plugins::Controllers
13
13
  include Plugins::Page::Request
14
+ include Plugins::Page::SiteTimestamps
14
15
 
15
16
  many_to_one :parent, :class => Content, :reciprocal => :children
16
17
  one_to_many :children, :class => Content, :key => :parent_id, :reciprocal => :parent
@@ -86,7 +87,7 @@ module Spontaneous
86
87
  end
87
88
 
88
89
  def resolve_entry
89
- owner.all_pieces.find { |e| e.id == self.id }
90
+ owner.all_contents.find { |e| e.id == self.id }
90
91
  end
91
92
 
92
93
  def page=(page)
@@ -4,6 +4,10 @@ require 'pathname'
4
4
 
5
5
  module Spontaneous
6
6
  class Paths < ::Hash
7
+ def self.pad_revision_number(revision)
8
+ revision.to_s.rjust(5, "0")
9
+ end
10
+
7
11
  def initialize(root)
8
12
  @root = File.expand_path(root)
9
13
  super()
@@ -15,7 +19,8 @@ module Spontaneous
15
19
 
16
20
  def expanded(category)
17
21
  self[category].map do |path, glob|
18
- path = Pathname.new(@root) + path
22
+ path = Pathname.new(path)
23
+ path = Pathname.new(@root) + path unless (path.absolute? && path.exist?)
19
24
  if path.exist?
20
25
  path = path.cleanpath
21
26
  path += glob if glob
@@ -5,16 +5,16 @@ module Spontaneous::Permissions
5
5
  plugin :timestamps
6
6
  many_to_one :user, :class => :'Spontaneous::Permissions::User'
7
7
 
8
- def self.authenticate(key_id)
8
+ def self.authenticate(key_id, ip_address = nil)
9
9
  if key = self.for_id(key_id)
10
- key.access!
10
+ key.access!(ip_address)
11
11
  return key
12
12
  end
13
13
  nil
14
14
  end
15
15
 
16
16
  def self.valid?(key_id, user)
17
- return true if (key = self.for_id(key_id)) and key.user == user
17
+ return true if (key = self.for_id(key_id)) && (key.user == user) && (key.user.enabled?)
18
18
  false
19
19
  end
20
20
 
@@ -28,8 +28,8 @@ module Spontaneous::Permissions
28
28
  super
29
29
  end
30
30
 
31
- def access!
32
- self.update(:last_access_at => Time.now)
31
+ def access!(ip_address = nil)
32
+ self.update(:last_access_at => Time.now, :last_access_ip => ip_address)
33
33
  end
34
34
  end
35
35
  end