spontaneous 0.1.0.alpha1 → 0.2.0.alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. data/Gemfile +40 -35
  2. data/LICENSE +20 -0
  3. data/Rakefile +39 -42
  4. data/Readme.markdown +155 -0
  5. data/application/css/definitions.scss +3 -0
  6. data/application/css/editing.scss +9 -4
  7. data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +1 -0
  8. data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +1 -0
  9. data/application/css/min/d1b54ff4847c613618267ca1c15658e2aee0a4e5.css +1 -0
  10. data/application/css/v2.scss +144 -50
  11. data/application/js/add_alias_dialogue.js +18 -8
  12. data/application/js/ajax.js +1 -1
  13. data/application/js/authentication.js +8 -1
  14. data/application/js/box.js +37 -7
  15. data/application/js/box_container.js +1 -1
  16. data/application/js/compatibility.js +7 -0
  17. data/application/js/content.js +7 -0
  18. data/application/js/content_area.js +4 -0
  19. data/application/js/edit_panel.js +44 -18
  20. data/application/js/editing.js +12 -0
  21. data/application/js/event_source.js +17 -0
  22. data/application/js/extensions.js +2 -0
  23. data/application/js/field_types/file_field.js +2 -1
  24. data/application/js/field_types/image_field.js +35 -48
  25. data/application/js/field_types/long_string_field.js +12 -0
  26. data/application/js/field_types/markdown_field.js +2 -5
  27. data/application/js/field_types/string_field.js +5 -1
  28. data/application/js/field_types/webvideo_field.js +15 -0
  29. data/application/js/init.js +1 -0
  30. data/application/js/location.js +30 -19
  31. data/application/js/login.js +1 -2
  32. data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +3 -0
  33. data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +2 -0
  34. data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +3 -0
  35. data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +90 -0
  36. data/application/js/page.js +1 -0
  37. data/application/js/page_entry.js +6 -40
  38. data/application/js/preview.js +2 -3
  39. data/application/js/top_bar.js +76 -31
  40. data/application/js/upload.js +5 -2
  41. data/application/js/upload_manager.js +2 -81
  42. data/application/js/vendor/jquery-1.7.1.min.js +4 -0
  43. data/application/js/vendor/jquery-ui-1.8.16.custom.min.js +791 -0
  44. data/application/js/views.js +3 -3
  45. data/application/js/views/box_view.js +164 -83
  46. data/application/js/views/page_piece_view.js +2 -2
  47. data/application/js/views/page_view.js +46 -15
  48. data/application/js/views/piece_view.js +29 -8
  49. data/application/static/diagonal-texture.png +0 -0
  50. data/application/static/item-buttons-highlight.png +0 -0
  51. data/application/static/plus-box.png +0 -0
  52. data/application/static/plus_alt.svg +8 -0
  53. data/application/static/slot-up-arrow.png +0 -0
  54. data/application/views/{index.erubis → index.erb} +9 -5
  55. data/application/views/{login.erubis → login.erb} +14 -10
  56. data/application/views/schema_modification_error.html.erb +18 -6
  57. data/application/views/{unsupported.erubis → unsupported.erb} +0 -0
  58. data/bin/spot +15 -2
  59. data/db/migrations/20100610142136_init.rb +2 -2
  60. data/db/migrations/20101130104334_timestamps.rb +2 -2
  61. data/db/migrations/20110209152710_users_and_groups.rb +11 -11
  62. data/db/migrations/20120106171423_visibility_path.rb +19 -0
  63. data/db/migrations/20120107124541_owner_id.rb +19 -0
  64. data/docs/recipe-interface-screenshot.png +0 -0
  65. data/lib/cutaneous.rb +11 -10
  66. data/lib/cutaneous/context_helper.rb +119 -14
  67. data/lib/cutaneous/preview_context.rb +4 -3
  68. data/lib/cutaneous/preview_renderer.rb +1 -6
  69. data/lib/cutaneous/publish_context.rb +1 -0
  70. data/lib/cutaneous/{first_pass_renderer.rb → publish_renderer.rb} +2 -6
  71. data/lib/cutaneous/publish_template.rb +62 -0
  72. data/lib/cutaneous/publish_token_parser.rb +8 -0
  73. data/lib/cutaneous/renderer.rb +4 -2
  74. data/lib/cutaneous/request_context.rb +1 -0
  75. data/lib/cutaneous/{second_pass_renderer.rb → request_renderer.rb} +2 -5
  76. data/lib/cutaneous/request_template.rb +11 -0
  77. data/lib/cutaneous/request_token_parser.rb +9 -0
  78. data/lib/cutaneous/token_parser.rb +125 -0
  79. data/lib/sequel/plugins/content_table_inheritance.rb +19 -12
  80. data/lib/sequel/plugins/scoped_table_name.rb +45 -0
  81. data/lib/spontaneous.rb +123 -126
  82. data/lib/spontaneous/box.rb +127 -47
  83. data/lib/spontaneous/box_style.rb +39 -22
  84. data/lib/spontaneous/change.rb +2 -2
  85. data/lib/spontaneous/cli.rb +1 -0
  86. data/lib/spontaneous/cli/base.rb +12 -4
  87. data/lib/spontaneous/cli/console.rb +72 -0
  88. data/lib/spontaneous/cli/server.rb +36 -12
  89. data/lib/spontaneous/cli/site.rb +175 -1
  90. data/lib/spontaneous/collections/box_set.rb +19 -1
  91. data/lib/spontaneous/collections/entry_set.rb +70 -22
  92. data/lib/spontaneous/collections/field_set.rb +3 -3
  93. data/lib/spontaneous/collections/prototype_set.rb +28 -0
  94. data/lib/spontaneous/config.rb +14 -5
  95. data/lib/spontaneous/content.rb +23 -24
  96. data/lib/spontaneous/errors.rb +20 -4
  97. data/lib/spontaneous/extensions/array.rb +2 -2
  98. data/lib/spontaneous/extensions/json.rb +1 -1
  99. data/lib/spontaneous/extensions/nil.rb +13 -0
  100. data/lib/spontaneous/facet.rb +61 -7
  101. data/lib/spontaneous/field_types.rb +1 -3
  102. data/lib/spontaneous/field_types/date_field.rb +1 -0
  103. data/lib/spontaneous/field_types/field.rb +32 -15
  104. data/lib/spontaneous/field_types/image_field.rb +138 -69
  105. data/lib/spontaneous/field_types/location_field.rb +59 -0
  106. data/lib/spontaneous/field_types/long_string_field.rb +13 -0
  107. data/lib/spontaneous/field_types/markdown_field.rb +2 -1
  108. data/lib/spontaneous/field_types/string_field.rb +2 -2
  109. data/lib/spontaneous/field_types/webvideo_field.rb +255 -0
  110. data/lib/spontaneous/generators/page/inline.html.cut +1 -1
  111. data/lib/spontaneous/generators/page/page.html.cut.tt +5 -4
  112. data/lib/spontaneous/generators/page/page.rb.tt +1 -5
  113. data/lib/spontaneous/generators/site.rb +1 -0
  114. data/lib/spontaneous/generators/site/.gitignore +2 -0
  115. data/lib/spontaneous/generators/site/Gemfile.tt +3 -5
  116. data/lib/spontaneous/generators/site/config/environment.rb.tt +1 -0
  117. data/lib/spontaneous/generators/site/config/environments/development.rb.tt +3 -1
  118. data/lib/spontaneous/generators/site/config/environments/production.rb.tt +3 -1
  119. data/lib/spontaneous/generators/site/config/indexes.rb.tt +23 -0
  120. data/lib/spontaneous/generators/site/public/css/{site.css → site.scss} +0 -0
  121. data/lib/spontaneous/generators/site/schema/box.rb.tt +5 -0
  122. data/lib/spontaneous/generators/site/templates/layouts/standard.html.cut.tt +11 -5
  123. data/lib/spontaneous/image_size.rb +0 -1
  124. data/lib/spontaneous/loader.rb +335 -218
  125. data/lib/spontaneous/logger.rb +7 -2
  126. data/lib/spontaneous/media.rb +64 -59
  127. data/lib/spontaneous/media/file.rb +74 -0
  128. data/lib/spontaneous/page.rb +47 -18
  129. data/lib/spontaneous/page_piece.rb +29 -27
  130. data/lib/spontaneous/paths.rb +0 -1
  131. data/lib/spontaneous/permissions.rb +3 -21
  132. data/lib/spontaneous/permissions/user.rb +5 -1
  133. data/lib/spontaneous/permissions/user_level.rb +6 -7
  134. data/lib/spontaneous/piece.rb +12 -7
  135. data/lib/spontaneous/plugins/aliases.rb +76 -31
  136. data/lib/spontaneous/plugins/allowed_types.rb +36 -37
  137. data/lib/spontaneous/plugins/application/facets.rb +7 -10
  138. data/lib/spontaneous/plugins/application/features.rb +17 -0
  139. data/lib/spontaneous/plugins/application/paths.rb +25 -31
  140. data/lib/spontaneous/plugins/application/render.rb +1 -5
  141. data/lib/spontaneous/plugins/application/serialisation.rb +2 -0
  142. data/lib/spontaneous/plugins/application/state.rb +6 -9
  143. data/lib/spontaneous/plugins/boxes.rb +65 -40
  144. data/lib/spontaneous/plugins/controllers.rb +22 -22
  145. data/lib/spontaneous/plugins/entries.rb +149 -150
  146. data/lib/spontaneous/plugins/entry.rb +50 -35
  147. data/lib/spontaneous/plugins/field/editor_class.rb +13 -0
  148. data/lib/spontaneous/plugins/fields.rb +41 -33
  149. data/lib/spontaneous/plugins/instance_code.rb +9 -9
  150. data/lib/spontaneous/plugins/layouts.rb +31 -35
  151. data/lib/spontaneous/plugins/media.rb +31 -32
  152. data/lib/spontaneous/plugins/page/formats.rb +56 -31
  153. data/lib/spontaneous/plugins/page/request.rb +15 -9
  154. data/lib/spontaneous/plugins/page_search.rb +30 -31
  155. data/lib/spontaneous/plugins/page_tree.rb +59 -12
  156. data/lib/spontaneous/plugins/paths.rb +84 -79
  157. data/lib/spontaneous/plugins/permissions.rb +26 -28
  158. data/lib/spontaneous/plugins/prototypes.rb +42 -37
  159. data/lib/spontaneous/plugins/publishing.rb +50 -94
  160. data/lib/spontaneous/plugins/render.rb +8 -16
  161. data/lib/spontaneous/plugins/schema_hierarchy.rb +20 -21
  162. data/lib/spontaneous/plugins/schema_id.rb +33 -25
  163. data/lib/spontaneous/plugins/schema_title.rb +3 -4
  164. data/lib/spontaneous/plugins/serialisation.rb +32 -35
  165. data/lib/spontaneous/plugins/site/features.rb +32 -0
  166. data/lib/spontaneous/plugins/site/instance.rb +3 -2
  167. data/lib/spontaneous/plugins/site/level.rb +18 -0
  168. data/lib/spontaneous/plugins/site/map.rb +2 -1
  169. data/lib/spontaneous/plugins/site/publishing.rb +56 -59
  170. data/lib/spontaneous/plugins/site/revisions.rb +24 -19
  171. data/lib/spontaneous/plugins/site/schema.rb +33 -0
  172. data/lib/spontaneous/plugins/site/search.rb +43 -0
  173. data/lib/spontaneous/plugins/site/selectors.rb +35 -30
  174. data/lib/spontaneous/plugins/site/storage.rb +63 -0
  175. data/lib/spontaneous/plugins/site_map.rb +23 -25
  176. data/lib/spontaneous/plugins/styles.rb +35 -43
  177. data/lib/spontaneous/plugins/supertype.rb +3 -1
  178. data/lib/spontaneous/plugins/visibility.rb +90 -83
  179. data/lib/spontaneous/prototypes/box_prototype.rb +55 -25
  180. data/lib/spontaneous/prototypes/field_prototype.rb +66 -19
  181. data/lib/spontaneous/prototypes/style_prototype.rb +2 -2
  182. data/lib/spontaneous/publishing.rb +1 -1
  183. data/lib/spontaneous/publishing/immediate.rb +128 -49
  184. data/lib/spontaneous/publishing/simultaneous.rb +70 -0
  185. data/lib/spontaneous/rack.rb +38 -26
  186. data/lib/spontaneous/rack/around_back.rb +3 -23
  187. data/lib/spontaneous/rack/around_preview.rb +3 -8
  188. data/lib/spontaneous/rack/assets.rb +7 -6
  189. data/lib/spontaneous/rack/authentication.rb +21 -0
  190. data/lib/spontaneous/rack/back.rb +310 -331
  191. data/lib/spontaneous/rack/cacheable_file.rb +27 -0
  192. data/lib/spontaneous/rack/cookie_authentication.rb +38 -0
  193. data/lib/spontaneous/rack/css.rb +43 -0
  194. data/lib/spontaneous/rack/event_source.rb +31 -0
  195. data/lib/spontaneous/rack/front.rb +30 -8
  196. data/lib/spontaneous/rack/helpers.rb +31 -0
  197. data/lib/spontaneous/rack/media.rb +22 -21
  198. data/lib/spontaneous/rack/public.rb +2 -1
  199. data/lib/spontaneous/rack/query_authentication.rb +35 -0
  200. data/lib/spontaneous/rack/reloader.rb +6 -3
  201. data/lib/spontaneous/rack/user_helpers.rb +28 -0
  202. data/lib/spontaneous/render.rb +64 -23
  203. data/lib/spontaneous/render/context_base.rb +143 -0
  204. data/lib/spontaneous/render/format.rb +24 -19
  205. data/lib/spontaneous/render/helpers.rb +14 -0
  206. data/lib/spontaneous/render/helpers/html_helper.rb +69 -0
  207. data/lib/spontaneous/render/helpers/script_helper.rb +17 -0
  208. data/lib/spontaneous/render/helpers/stylesheet_helper.rb +16 -0
  209. data/lib/spontaneous/render/preview_context.rb +8 -0
  210. data/lib/spontaneous/render/preview_renderer.rb +6 -0
  211. data/lib/spontaneous/render/publish_context.rb +22 -0
  212. data/lib/spontaneous/render/published_renderer.rb +12 -13
  213. data/lib/spontaneous/render/publishing_renderer.rb +3 -0
  214. data/lib/spontaneous/render/render_cache.rb +26 -0
  215. data/lib/spontaneous/render/renderer.rb +5 -1
  216. data/lib/spontaneous/render/request_context.rb +8 -0
  217. data/lib/spontaneous/schema.rb +56 -24
  218. data/lib/spontaneous/schema/schema_modification.rb +2 -2
  219. data/lib/spontaneous/schema/uid.rb +22 -106
  220. data/lib/spontaneous/schema/uid_map.rb +120 -0
  221. data/lib/spontaneous/search.rb +11 -0
  222. data/lib/spontaneous/search/compound_indexer.rb +26 -0
  223. data/lib/spontaneous/search/database.rb +72 -0
  224. data/lib/spontaneous/search/field.rb +95 -0
  225. data/lib/spontaneous/search/index.rb +184 -0
  226. data/lib/spontaneous/search/results.rb +34 -0
  227. data/lib/spontaneous/server.rb +5 -1
  228. data/lib/spontaneous/site.rb +56 -16
  229. data/lib/spontaneous/storage.rb +22 -0
  230. data/lib/spontaneous/storage/backend.rb +10 -0
  231. data/lib/spontaneous/storage/cloud.rb +104 -0
  232. data/lib/spontaneous/storage/local.rb +52 -0
  233. data/lib/spontaneous/style.rb +27 -9
  234. data/lib/spontaneous/version.rb +1 -1
  235. data/spontaneous.gemspec +719 -0
  236. data/test/disabled/test_slots.rb +1 -1
  237. data/test/experimental/test_cutaneous.rb +309 -0
  238. data/test/experimental/test_features.rb +129 -0
  239. data/test/fixtures/application/views/{index.erubis → index.erb} +0 -0
  240. data/test/fixtures/back/public/css/sass_include.scss +5 -0
  241. data/test/fixtures/back/public/css/sass_template.scss +4 -0
  242. data/test/fixtures/example_application/templates/client_project.html.cut +4 -4
  243. data/test/fixtures/example_application/templates/client_project/images.html.cut +1 -1
  244. data/test/fixtures/example_application/templates/client_projects.html.cut +2 -2
  245. data/test/fixtures/example_application/templates/inline_image.html.cut +1 -1
  246. data/test/fixtures/example_application/templates/layouts/home.html.cut +7 -7
  247. data/test/fixtures/example_application/templates/layouts/info.html.cut +1 -1
  248. data/test/fixtures/example_application/templates/layouts/project.html.cut +4 -4
  249. data/test/fixtures/example_application/templates/layouts/projects.html.cut +2 -2
  250. data/test/fixtures/example_application/templates/project.html.cut +2 -2
  251. data/test/fixtures/example_application/templates/project/inline.html.cut +3 -3
  252. data/test/fixtures/example_application/templates/project_image.html.cut +1 -1
  253. data/test/fixtures/example_application/templates/text.html.cut +1 -1
  254. data/test/fixtures/fields/youtube_api_response.xml +102 -0
  255. data/test/fixtures/layouts/layouts/custom4.html.cut +0 -0
  256. data/test/fixtures/plugins/schema_plugin/public/css/plugin.css +1 -0
  257. data/test/fixtures/plugins/schema_plugin/public/js/plugin.js +1 -0
  258. data/test/fixtures/plugins/schema_plugin/public/static.html +1 -0
  259. data/test/fixtures/plugins/schema_plugin/public/subdir/image.gif +1 -0
  260. data/test/fixtures/plugins/schema_plugin/public/subdir/include1.scss +3 -0
  261. data/test/fixtures/plugins/schema_plugin/public/subdir/sass.scss +4 -0
  262. data/test/fixtures/plugins/schema_plugin/public/subdir/sass/include2.scss +4 -0
  263. data/test/fixtures/public/templates/layouts/default.html.cut +1 -1
  264. data/test/fixtures/public/templates/layouts/default.pdf.cut +1 -1
  265. data/test/fixtures/public/templates/layouts/default.rss.cut +1 -1
  266. data/test/fixtures/public/templates/layouts/dynamic.html.cut +1 -1
  267. data/test/fixtures/schema_modification/config/database.yml +0 -0
  268. data/test/fixtures/schema_modification/config/environment.rb +2 -0
  269. data/test/fixtures/schema_modification/schema/box.rb +1 -0
  270. data/test/fixtures/schema_modification/schema/custom_box.rb +1 -0
  271. data/test/fixtures/schema_modification/schema/page.rb +6 -0
  272. data/test/fixtures/schema_modification/schema/piece.rb +1 -0
  273. data/test/fixtures/search/config/database.yml +1 -0
  274. data/test/fixtures/search/config/indexes.rb +4 -0
  275. data/test/fixtures/serialisation/root_hash.yaml.erb +16 -20
  276. data/test/fixtures/storage/cloud/environment.rb +12 -0
  277. data/test/fixtures/storage/default/environment.rb +1 -0
  278. data/test/fixtures/templates/aliases/layouts/c_alias.html.cut +1 -1
  279. data/test/fixtures/templates/content/include.html.cut +1 -1
  280. data/test/fixtures/templates/content/include_dir.html.cut +1 -1
  281. data/test/fixtures/templates/content/included.epub.cut +1 -1
  282. data/test/fixtures/templates/content/included.html.cut +1 -1
  283. data/test/fixtures/templates/content/partial/included.html.cut +1 -1
  284. data/test/fixtures/templates/content/preprocess.html.cut +1 -1
  285. data/test/fixtures/templates/content/second.html.cut +1 -1
  286. data/test/fixtures/templates/content/template.epub.cut +1 -1
  287. data/test/fixtures/templates/content/template.html.cut +1 -1
  288. data/test/fixtures/templates/default_style_class.html.cut +1 -1
  289. data/test/fixtures/templates/engine/braces.html.cut +6 -0
  290. data/test/fixtures/templates/engine/multiline.html.cut +5 -0
  291. data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
  292. data/test/fixtures/templates/extended/main.html.cut +5 -5
  293. data/test/fixtures/templates/extended/parent.html.cut +10 -8
  294. data/test/fixtures/templates/extended/partial.html.cut +1 -0
  295. data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -0
  296. data/test/fixtures/templates/extended/with_includes.html.cut +9 -0
  297. data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +9 -0
  298. data/test/fixtures/templates/layouts/entries.html.cut +7 -7
  299. data/test/fixtures/templates/layouts/page_style.html.cut +1 -1
  300. data/test/fixtures/templates/layouts/params.html.cut +1 -1
  301. data/test/fixtures/templates/layouts/preview_render.html.cut +2 -2
  302. data/test/fixtures/templates/layouts/standard_page.html.cut +1 -1
  303. data/test/fixtures/templates/layouts/subdir_style.html.cut +1 -1
  304. data/test/fixtures/templates/layouts/template_params.html.cut +1 -1
  305. data/test/fixtures/templates/layouts/variables.html.cut +7 -0
  306. data/test/fixtures/templates/page_class/inline_style.html.cut +1 -1
  307. data/test/fixtures/templates/preview_render/variables.html.cut +1 -0
  308. data/test/fixtures/templates/publishing/templates/layouts/dynamic.html.cut +1 -0
  309. data/test/fixtures/templates/publishing/templates/layouts/dynamic.rtf.cut +1 -0
  310. data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -0
  311. data/test/fixtures/templates/template_class/anonymous_style.html.cut +2 -2
  312. data/test/fixtures/templates/template_class/complex_template.html.cut +4 -4
  313. data/test/fixtures/templates/template_class/complex_template.pdf.cut +4 -4
  314. data/test/fixtures/templates/template_class/default_template_style.html.cut +2 -2
  315. data/test/fixtures/templates/template_class/images_with_template.html.cut +3 -3
  316. data/test/fixtures/templates/template_class/slots_template.html.cut +3 -3
  317. data/test/fixtures/templates/template_class/slots_template.pdf.cut +3 -3
  318. data/test/fixtures/templates/template_class/this_template.epub.cut +1 -1
  319. data/test/fixtures/templates/template_class/this_template.html.cut +1 -1
  320. data/test/fixtures/templates/template_class/this_template.pdf.cut +1 -1
  321. data/test/fixtures/templates/with_default_style_class.html.cut +1 -1
  322. data/test/functional/test_application.rb +19 -15
  323. data/test/functional/test_back.rb +130 -98
  324. data/test/functional/test_front.rb +72 -28
  325. data/test/javascript/test_dom.rb +1 -1
  326. data/test/javascript/test_markdown.rb +1 -1
  327. data/test/slow/test_publishing.rb +94 -75
  328. data/test/slow/test_visibility.rb +47 -14
  329. data/test/test_helper.rb +30 -3
  330. data/test/ui/test_page_editing.rb +1 -1
  331. data/test/unit/test_alias.rb +200 -16
  332. data/test/unit/test_authentication.rb +26 -28
  333. data/test/unit/test_boxes.rb +146 -75
  334. data/test/unit/test_config.rb +42 -20
  335. data/test/unit/test_content.rb +156 -37
  336. data/test/unit/test_content_inheritance.rb +4 -2
  337. data/test/unit/test_extensions.rb +7 -1
  338. data/test/unit/test_fields.rb +558 -290
  339. data/test/{experimental → unit}/test_formats.rb +42 -3
  340. data/test/unit/test_generators.rb +3 -2
  341. data/test/unit/test_helpers.rb +54 -0
  342. data/test/unit/test_image_size.rb +1 -1
  343. data/test/unit/test_images.rb +51 -40
  344. data/test/unit/test_layouts.rb +21 -4
  345. data/test/unit/test_logger.rb +1 -1
  346. data/test/unit/test_media.rb +165 -7
  347. data/test/unit/test_page.rb +158 -27
  348. data/test/unit/test_permissions.rb +170 -187
  349. data/test/unit/test_piece.rb +27 -9
  350. data/test/unit/test_plugins.rb +153 -0
  351. data/test/unit/test_prototype_set.rb +60 -2
  352. data/test/unit/test_prototypes.rb +81 -20
  353. data/test/unit/test_render.rb +97 -9
  354. data/test/unit/test_schema.rb +167 -120
  355. data/test/unit/test_search.rb +588 -0
  356. data/test/unit/test_serialisation.rb +26 -10
  357. data/test/unit/test_site.rb +42 -25
  358. data/test/unit/test_storage.rb +88 -0
  359. data/test/unit/test_structure.rb +11 -5
  360. data/test/unit/test_styles.rb +64 -3
  361. data/test/unit/test_table_scoping.rb +76 -0
  362. data/test/unit/test_templates.rb +69 -31
  363. data/test/unit/test_type_hierarchy.rb +9 -1
  364. metadata +274 -208
  365. data/Gemfile.lock +0 -146
  366. data/application/css/min/54ee0ed3c7fac7632bd5c020d69e9a2503e0c88c.css +0 -1
  367. data/application/css/min/c256adc144e2bdd0b0539356b04eb62db01e1dc3.css +0 -1
  368. data/application/js/edit_dialogue.js +0 -137
  369. data/application/js/min/492a209de8ee955fa9c729a765377495001e11b1.js +0 -17
  370. data/application/js/min/80f684d77c940887a1d4a63e3a96102e993baa98.js +0 -88
  371. data/application/js/min/c7140ec9475e5bf868b901e0621338d7d162358b.js +0 -3
  372. data/application/js/min/f07f2bd6630ee31e1c2288ec223383d8f0658ba6.js +0 -2
  373. data/application/js/vendor/.DS_Store +0 -0
  374. data/application/js/vendor/JS.Class-2.1.5/src/command.js +0 -93
  375. data/application/js/vendor/JS.Class-2.1.5/src/comparable.js +0 -37
  376. data/application/js/vendor/JS.Class-2.1.5/src/constant_scope.js +0 -48
  377. data/application/js/vendor/JS.Class-2.1.5/src/core.js +0 -1060
  378. data/application/js/vendor/JS.Class-2.1.5/src/decorator.js +0 -50
  379. data/application/js/vendor/JS.Class-2.1.5/src/enumerable.js +0 -505
  380. data/application/js/vendor/JS.Class-2.1.5/src/forwardable.js +0 -22
  381. data/application/js/vendor/JS.Class-2.1.5/src/hash.js +0 -334
  382. data/application/js/vendor/JS.Class-2.1.5/src/linked_list.js +0 -114
  383. data/application/js/vendor/JS.Class-2.1.5/src/loader.js +0 -553
  384. data/application/js/vendor/JS.Class-2.1.5/src/method_chain.js +0 -172
  385. data/application/js/vendor/JS.Class-2.1.5/src/observable.js +0 -55
  386. data/application/js/vendor/JS.Class-2.1.5/src/package.js +0 -472
  387. data/application/js/vendor/JS.Class-2.1.5/src/proxy.js +0 -58
  388. data/application/js/vendor/JS.Class-2.1.5/src/ruby.js +0 -44
  389. data/application/js/vendor/JS.Class-2.1.5/src/set.js +0 -332
  390. data/application/js/vendor/JS.Class-2.1.5/src/stack_trace.js +0 -151
  391. data/application/js/vendor/JS.Class-2.1.5/src/state.js +0 -95
  392. data/application/js/vendor/JS.Class-2.1.5/src/stdlib.js +0 -2612
  393. data/application/js/vendor/jquery-1.4.2.min.js +0 -154
  394. data/application/js/vendor/jquery-1.4.3.min.js +0 -166
  395. data/application/js/vendor/jquery-1.5.1.min.js +0 -16
  396. data/application/js/vendor/jquery-1.5.1rc1.min.js +0 -24
  397. data/application/js/vendor/jquery-ui-1.8.6.custom.min.js +0 -265
  398. data/application/js/vendor/jquery-ui-1.8.custom.min.js +0 -106
  399. data/application/js/vendor/jquery.hotkeys-0.7.9.js +0 -248
  400. data/application/js/vendor/jquery.hotkeys-0.7.9.min.js +0 -19
  401. data/application/js/vendor/jsdiff.js +0 -169
  402. data/lib/cutaneous/first_pass_parser.rb +0 -23
  403. data/lib/cutaneous/parser_core.rb +0 -18
  404. data/lib/cutaneous/second_pass_parser.rb +0 -23
  405. data/lib/sequel/plugins/yajl_serialization.rb +0 -154
  406. data/lib/spontaneous/plugins.rb +0 -20
  407. data/lib/spontaneous/proxy_object.rb +0 -12
  408. data/lib/spontaneous/publishing/fire_and_forget.rb +0 -57
  409. data/lib/spontaneous/render/context.rb +0 -100
  410. data/spontaneous.gemspec.tmpl +0 -66
  411. data/test/experimental/test_plugins.rb +0 -64
  412. data/test/fixtures/templates/publishing/layouts/dynamic.html.cut +0 -1
  413. data/test/fixtures/templates/publishing/layouts/static.html.cut +0 -1
@@ -0,0 +1,143 @@
1
+ # encoding: UTF-8
2
+
3
+
4
+ module Spontaneous::Render
5
+ module ContextBase
6
+ include Spontaneous::Render::Helpers
7
+
8
+ attr_reader :_format, :_target, :_locals
9
+
10
+ def initialize(target, format, parent={})
11
+ @_target, @_format = target, format
12
+ _update(parent)
13
+ end
14
+
15
+ def show_errors?
16
+ Spontaneous.development?
17
+ end
18
+
19
+ alias_method :format, :_format
20
+
21
+ def root
22
+ Spontaneous::Site.root
23
+ end
24
+
25
+ def navigation(depth = 1, &block)
26
+ case depth
27
+ when 0, :root
28
+ root
29
+ when 1, :section
30
+ navigation_at_depth(1, &block)
31
+ end
32
+ end
33
+
34
+ def navigation_at_depth(depth = 1)
35
+ _pages_at_depth(self.page, depth).each do |p|
36
+ yield(p, self.page.active?(p))
37
+ end
38
+ end
39
+
40
+ def _pages_at_depth(origin_page, depth)
41
+ origin_page.at_depth(depth)
42
+ end
43
+
44
+ def page
45
+ _target.page
46
+ end
47
+
48
+ def template
49
+ _target.template(_format)
50
+ end
51
+
52
+ def each
53
+ content.each { |c| yield(c) } if block_given?
54
+ end
55
+
56
+ def each_with_index
57
+ content.each_with_index { |c, i| yield(c, i) } if block_given?
58
+ end
59
+
60
+ def map
61
+ content.map { |c| yield(c) } if block_given?
62
+ end
63
+
64
+ def content
65
+ _target.iterable
66
+ end
67
+
68
+ def pieces
69
+ content
70
+ end
71
+
72
+ def first
73
+ content.first
74
+ end
75
+
76
+ def last
77
+ content.last
78
+ end
79
+
80
+ def first?
81
+ _target.owner.pieces.first == self
82
+ end
83
+
84
+ def last?
85
+ _target.owner.pieces.last == self
86
+ end
87
+
88
+ def render_content
89
+ _target.map do |c|
90
+ c.render(_format, self)
91
+ end.join("\n")
92
+ end
93
+
94
+ def render(format, *args)
95
+ _target.render(format, self, *args)
96
+ end
97
+
98
+ def respond_to?(method)
99
+ super || _target.respond_to?(method)
100
+ end
101
+
102
+ protected
103
+
104
+ def method_missing(method, *args)
105
+ if block_given?
106
+ _target.__send__(method, *args, &Proc.new)
107
+ else
108
+ _target.__send__(method, *args)
109
+ end
110
+ rescue => e
111
+ # TODO: sensible, configurable fallback for when template calls non-existant method
112
+ # - need line number and file that generated error
113
+ # - logging.warn when happens
114
+ # - an inline comment when in dev mode?
115
+ # - some placeholder text, perhaps the name of the missing method and line no.
116
+ logger.error(e)
117
+ # logger.error(_target)
118
+ # logger.error(e.backtrace.join("\\n"))
119
+ nil
120
+ end
121
+
122
+ # make each key of the params hash into a method call for speed
123
+ def _update(parent)
124
+ if parent.is_a?(Hash)
125
+ _update_with_hash(parent)
126
+ else
127
+ parent.instance_variables.reject { |var| /^@_/ === var.to_s }.each do |variable|
128
+ instance_variable_set(variable, parent.instance_variable_get(variable))
129
+ end
130
+ _update_with_hash(parent._locals) if parent.respond_to?(:_locals)
131
+ end
132
+ self
133
+ end
134
+
135
+ def _update_with_hash(hash)
136
+ @_locals = hash
137
+ hash.each do |key, val|
138
+ singleton_class.__send__(:define_method, key) { val }
139
+ end
140
+ end
141
+ end
142
+ end
143
+
@@ -1,17 +1,32 @@
1
1
 
2
2
  module Spontaneous::Render
3
- module Format; end
3
+ module Format
4
+ def self.for(format)
5
+ format_class = nil
6
+ begin
7
+ format_class = self.const_get("#{format.to_s.camelize}")
8
+ rescue NameError => e
9
+ # Assume that the missing format is compatilble with the standard HTML
10
+ # format in that each page generates a separate, self contained, file
11
+ # .. probably true in most cases
12
+ format_class = Class.new(Spontaneous::Render::FormatBase)
13
+ self.const_set(format.to_s.camelize, format_class)
14
+ end
15
+ format_class
16
+ end
17
+
18
+ def self.formats
19
+ self.constants.map { |const| const.to_s.downcase.to_sym }
20
+ end
21
+ end
4
22
 
5
23
  class FormatBase
6
24
  def self.format
7
25
  @format ||= self.name.demodulize.downcase.to_sym
8
26
  end
9
27
 
10
-
11
- attr_reader :progress
12
-
13
- def initialize(revision, pages, progress=nil)
14
- @revision, @pages, @progress = revision, pages.find_all { |page| page.formats.include?(format) }, progress
28
+ def initialize(revision, page)
29
+ @revision, @page = revision, page
15
30
  end
16
31
 
17
32
  def format
@@ -20,20 +35,10 @@ module Spontaneous::Render
20
35
 
21
36
  def render
22
37
  before_render
23
- delay = Spontaneous::Site.config.publishing_delay
24
- @pages.each_with_index do |page, n|
25
- render_page(page) if page.formats.include?(format)
26
- after_page_rendered(page)
27
- # sleep(delay) if delay
28
- # sleep(3)
29
- end
38
+ render_page(@page)
30
39
  after_render
31
40
  end
32
41
 
33
- def after_page_rendered(page)
34
- progress.page_rendered(page) if progress
35
- end
36
-
37
42
  def before_render; end
38
43
  def after_render; end
39
44
 
@@ -47,8 +52,8 @@ module Spontaneous::Render
47
52
 
48
53
  def output_path(page, output)
49
54
  ext = nil
50
- ext = renderer.extension if Spontaneous.template_engine.is_dynamic?(output)
51
- path = Spontaneous::Render.output_path(@revision, page, format, ext)
55
+ template_dynamic = Spontaneous.template_engine.is_dynamic?(output)
56
+ path = Spontaneous::Render.output_path(@revision, page, format, renderer.extension, template_dynamic)
52
57
 
53
58
  dir = File.dirname(path)
54
59
  FileUtils.mkdir_p(dir) unless File.exist?(dir)
@@ -0,0 +1,14 @@
1
+ # encoding: UTF-8
2
+
3
+ module Spontaneous::Render
4
+ module Helpers
5
+ autoload :StylesheetHelper, 'spontaneous/render/helpers/stylesheet_helper'
6
+ autoload :ScriptHelper, 'spontaneous/render/helpers/script_helper'
7
+ autoload :HTMLHelper, 'spontaneous/render/helpers/html_helper'
8
+
9
+ include StylesheetHelper
10
+ include ScriptHelper
11
+ include HTMLHelper
12
+ end
13
+ end
14
+
@@ -0,0 +1,69 @@
1
+ # encoding: UTF-8
2
+
3
+ module Spontaneous::Render::Helpers
4
+ module HTMLHelper
5
+ extend self
6
+
7
+ def classes(*args)
8
+ args = args.flatten
9
+ optional = args.extract_options!
10
+ optional.each do |class_name, active|
11
+ args << class_name if active
12
+ end
13
+ return "" if args.empty?
14
+ %(class="#{args.join(" ")}")
15
+ end
16
+
17
+ def ie_only(version = nil)
18
+ ie_conditional_comment(version)
19
+ end
20
+
21
+ def ie_only_gt(version)
22
+ ie_conditional_comment(version, "gt")
23
+ end
24
+
25
+ def ie_only_gte(version)
26
+ ie_conditional_comment(version, "gte")
27
+ end
28
+
29
+ def ie_only_lt(version)
30
+ ie_conditional_comment(version, "lt")
31
+ end
32
+
33
+ def ie_only_lte(version)
34
+ ie_conditional_comment(version, "lte")
35
+ end
36
+
37
+ def ie_only_end
38
+ "<![endif]-->"
39
+ end
40
+
41
+ def not_ie
42
+ "<!--[if !IE]> -->"
43
+ end
44
+
45
+ def not_ie_end
46
+ "<!-- <![endif]-->"
47
+ end
48
+
49
+ def ie_conditional_comment(version = nil, test = nil)
50
+ ie_conditional_comment_start(version, test)
51
+ end
52
+
53
+ def ie_conditional_comment_start(version = nil, test = nil)
54
+ ["<!--[if ", test_for_version(version, test), "]>"].join
55
+ end
56
+
57
+ def test_for_version(version, test)
58
+ if version.is_a?(Range)
59
+ version = version.to_a
60
+ lower = "(#{test_for_version(version.first, "gte")})"
61
+ upper = "(#{test_for_version(version.last, "lte")})"
62
+ [lower, upper].join("&")
63
+ else
64
+ [test, "IE", version].compact.join(" ")
65
+ end
66
+ end
67
+
68
+ end
69
+ end
@@ -0,0 +1,17 @@
1
+ # encoding: UTF-8
2
+
3
+ module Spontaneous::Render::Helpers
4
+ module ScriptHelper
5
+ extend self
6
+
7
+ def script(*args)
8
+ scripts = args.flatten
9
+ scripts.map do |script|
10
+ %(<script type="text/javascript" src="#{script}.js"></script>)
11
+ end.join("\n")
12
+ end
13
+
14
+ alias_method :scripts, :script
15
+ end
16
+ end
17
+
@@ -0,0 +1,16 @@
1
+ # encoding: UTF-8
2
+
3
+ module Spontaneous::Render::Helpers
4
+ module StylesheetHelper
5
+ extend self
6
+
7
+ def stylesheet(*args)
8
+ stylesheets = args
9
+ stylesheets.map do |stylesheet|
10
+ %(<link rel="stylesheet" href="#{stylesheet}.css" />)
11
+ end.join("\n")
12
+ end
13
+
14
+ alias_method :stylesheets, :stylesheet
15
+ end
16
+ end
@@ -0,0 +1,8 @@
1
+ # encoding: UTF-8
2
+
3
+
4
+ module Spontaneous::Render
5
+ module PreviewContext
6
+ include Spontaneous::Render::ContextBase
7
+ end # PreviewContext
8
+ end # Spontaneous::Render
@@ -12,6 +12,12 @@ module Spontaneous
12
12
 
13
13
  result
14
14
  end
15
+
16
+ def render_string(template_string, content, format=:html, params = {})
17
+ template = preview_renderer.render_string(template_string, content, format, params)
18
+ result = request_renderer.render_string(template, content, format, params)
19
+ result
20
+ end
15
21
  end # PreviewRenderer
16
22
  end # Render
17
23
  end # Spontaneous
@@ -0,0 +1,22 @@
1
+ # encoding: UTF-8
2
+
3
+
4
+ module Spontaneous::Render
5
+ module PublishContext
6
+ include Spontaneous::Render::ContextBase
7
+ include Spontaneous::Render::RenderCache
8
+
9
+ def root
10
+ _with_render_cache("site.root") do
11
+ super
12
+ end
13
+ end
14
+
15
+
16
+ def _pages_at_depth(origin_page, depth)
17
+ _with_render_cache("pages_at_depth.#{origin_page.id}.#{depth}") do
18
+ super
19
+ end
20
+ end
21
+ end # PublishContext
22
+ end # Spontaneous::Render
@@ -7,16 +7,18 @@ module Spontaneous
7
7
  NGINX_ACCEL_REDIRECT = "X-Accel-Redirect"
8
8
 
9
9
  def render_content(content, format=:html, params = {})
10
- request = params[:request]
10
+ request = params[:request]
11
11
  response = params[:response]
12
- headers = request.env
13
- render = nil
12
+ headers = request.env
13
+ revision = Content.revision
14
+ render = nil
15
+
14
16
  if Spontaneous.development? and Spontaneous.config.rerender_pages
15
17
  # in dev mode we just want to render the page dynamically, skipping the cached version
16
18
  render = rerender(content, format, params)
17
19
  else
18
20
  # first test for dynamic template
19
- template = Spontaneous::Render.output_path(Content.revision, content, format, extension)
21
+ template = Spontaneous::Render.output_path(revision, content, format, extension, true)
20
22
 
21
23
  if File.exists?(template)
22
24
  render = request_renderer.render_file(template, content, format, params)
@@ -25,17 +27,10 @@ module Spontaneous
25
27
  # if no dynamic template exists then try for a static file
26
28
  # this case will normally be handled by the proxy server (nginx, apache...)
27
29
  # in production environments
28
- template = Spontaneous::Render.output_path(Content.revision, content, format)
30
+ template = Spontaneous::Render.output_path(revision, content, format)
29
31
 
30
32
  if File.exists?(template)
31
- # first check to see if we're behind an nginx proxy
32
- if headers.key?(NGINX_DETECT_HEADER)
33
- # if so, then use nginx's sendfile mechanism to return the file
34
- response.headers[NGINX_ACCEL_REDIRECT] = Spontaneous::Render.redirect_path(Content.revision, content, format)
35
- else
36
- # if not, then return the file ourselves
37
- render = File.read(template)
38
- end
33
+ render = File.open(template)
39
34
  else
40
35
  # and if all else fails, just re-render the damn thing
41
36
  render = rerender(content, format, params)
@@ -49,6 +44,10 @@ module Spontaneous
49
44
  template = publishing_renderer.render_file(content.template(format), content, format)
50
45
  request_renderer.render_string(template, content, format, params)
51
46
  end
47
+
48
+ def render_string(template_string, content, format=:html, params = {})
49
+ request_renderer.render_string(template_string, content, format, params)
50
+ end
52
51
  end # PublishedRenderer
53
52
  end # Render
54
53
  end # Spontaneous
@@ -7,6 +7,9 @@ module Spontaneous
7
7
  def render_content(content, format=:html, params = {})
8
8
  publishing_renderer.render_file(content.template(format), content, format, params)
9
9
  end
10
+ def render_string(template_string, content, format=:html, params = {})
11
+ publishing_renderer.render_string(template_string, content, format, params)
12
+ end
10
13
  end # PublishingRenderer
11
14
  end # Render
12
15
  end # Spontaneous