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,3 +1,5 @@
1
+ # encoding: UTF-8
2
+
1
3
  ## Adapted from Padrino::Logger
2
4
  #
3
5
  # Defines our SPOT_LOG_LEVEL
@@ -223,10 +225,14 @@ module Spontaneous
223
225
  #
224
226
  def push(message = nil, level = nil)
225
227
  unless @silent
226
- self << @format_message % [colored_level(level), set_color(Time.now.strftime(@format_datetime), :yellow), message.to_s.strip]
228
+ message = format_backtrace(message) if message.class < Error
229
+ self << @format_message % [colored_level(level), set_color(Time.now.strftime(@format_datetime), :yellow), message.to_s.strip]
227
230
  end
228
231
  end
229
232
 
233
+ def format_backtrace(error)
234
+ [error.message].concat(error.backtrace).join("\n")
235
+ end
230
236
  ##
231
237
  # Directly append message to the log.
232
238
  #
@@ -366,4 +372,3 @@ module Kernel #:nodoc:
366
372
  Spontaneous.logger
367
373
  end
368
374
  end # Kernel
369
-
@@ -1,84 +1,89 @@
1
+ # encoding: UTF-8
2
+
1
3
  require 'digest/sha1'
2
4
 
3
5
  module Spontaneous
4
- class Media
5
- class << self
6
+ module Media
6
7
 
7
- include Spontaneous::Constants
8
+ autoload :File, "spontaneous/media/file"
8
9
 
9
- def media_path(*args)
10
- File.join(Spontaneous.media_dir, *args)
11
- end
10
+ include Spontaneous::Constants
12
11
 
13
- @@upload_uid_lock = Mutex.new
14
- @@upload_uid_index = 0
12
+ extend self
15
13
 
16
- def upload_index
17
- @@upload_uid_lock.synchronize do
18
- @@upload_uid_index = (@@upload_uid_index + 1) % 0xFFFFFF
19
- end
20
- end
14
+ def media_path(*args)
15
+ ::File.join(Spontaneous.media_dir, *args)
16
+ end
21
17
 
22
- def upload_path(filename)
23
- time = Time.now.to_i
24
- dir = "#{time}.#{upload_index}"
25
- Spontaneous.media_path("tmp", dir, filename)
26
- end
18
+ @@upload_uid_lock = Mutex.new
19
+ @@upload_uid_index = 0
27
20
 
28
- def to_urlpath(filepath)
29
- filepath.gsub(%r{^#{Spontaneous.media_dir}}, "/media")
21
+ def upload_index
22
+ @@upload_uid_lock.synchronize do
23
+ @@upload_uid_index = (@@upload_uid_index + 1) % 0xFFFFFF
30
24
  end
25
+ end
31
26
 
32
- def to_filepath(urlpath)
33
- parts = urlpath.split("/")
34
- parts[1] = Spontaneous.media_dir
35
- ::File.join(*parts)
36
- end
27
+ def upload_path(filename)
28
+ time = Time.now.to_i
29
+ dir = "#{time}.#{upload_index}"
30
+ Spontaneous.media_path("tmp", dir, filename)
31
+ end
37
32
 
38
- def to_filename(input)
39
- parts = input.strip.split(/\./)
40
- ext = parts.last
41
- name = parts[0..-2].join(DOT)
42
- name.gsub!(RE_QUOTES, EMPTY)
43
- name.gsub!(/[^\.A-Za-z0-9_-]+/, DASH)
44
- name.gsub!(RE_FLATTEN_REPEAT, DASH)
45
- name.gsub!(RE_FLATTEN_TRAILING, EMPTY)
46
- [name, ext].join(DOT)
47
- end
33
+ # def to_urlpath(filepath)
34
+ # filepath.gsub(%r{^#{Spontaneous.media_dir}}, "/media")
35
+ # end
48
36
 
37
+ def to_filepath(urlpath)
38
+ parts = urlpath.split("/")
39
+ parts[1] = Spontaneous.media_dir
40
+ ::File.join(*parts)
41
+ end
49
42
 
50
- def sha1(filepath)
51
- Digest::SHA1.file(filepath).hexdigest
52
- end
43
+ def to_filename(input)
44
+ parts = input.strip.split(/\./)
45
+ ext = parts.last
46
+ name = parts[0..-2].join(DOT)
47
+ name.gsub!(RE_QUOTES, EMPTY)
48
+ name.gsub!(/[^\.A-Za-z0-9_-]+/, DASH)
49
+ name.gsub!(RE_FLATTEN_REPEAT, DASH)
50
+ name.gsub!(RE_FLATTEN_TRAILING, EMPTY)
51
+ [name, ext].join(DOT)
52
+ end
53
53
 
54
- alias_method :digest, :sha1
55
54
 
56
- def combine_shards(hashes, &block)
57
- hashes = hashes.split(',') unless hashes.is_a?(Array)
58
- shards = hashes.map { |hash| Spontaneous.shard_path(hash) }
59
- combined = Tempfile.new('shard')
60
- combined.binmode
55
+ def sha1(filepath)
56
+ Digest::SHA1.file(filepath).hexdigest
57
+ end
58
+
59
+ alias_method :digest, :sha1
61
60
 
62
- shards.each do |shard|
63
- File.open(shard, 'rb') do |part|
64
- while data = part.read(131072)
65
- combined.write(data)
66
- end
61
+ def combine_shards(hashes, &block)
62
+ hashes = hashes.split(',') unless hashes.is_a?(Array)
63
+ shards = hashes.map { |hash| Spontaneous.shard_path(hash) }
64
+ combined = Tempfile.new('shard')
65
+ combined.binmode
66
+
67
+ shards.each do |shard|
68
+ ::File.open(shard, 'rb') do |part|
69
+ while data = part.read(131072)
70
+ combined.write(data)
67
71
  end
68
72
  end
69
- combined.close
73
+ end
74
+ combined.close
70
75
 
71
- if block_given?
72
- begin
73
- yield(combined)
74
- ensure
75
- combined.close!
76
- end
77
- else
78
- # caller's responsibility to close & delete tempfile
79
- combined
76
+ if block_given?
77
+ begin
78
+ yield(combined)
79
+ ensure
80
+ combined.close!
80
81
  end
82
+ else
83
+ # caller's responsibility to close & delete tempfile
84
+ combined
81
85
  end
82
86
  end
87
+
83
88
  end
84
89
  end
@@ -0,0 +1,74 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'fileutils'
4
+
5
+ module Spontaneous::Media
6
+ class File
7
+ F = ::File
8
+
9
+ attr_reader :filename, :owner, :source
10
+
11
+ def initialize(owner, filename, mimetype = nil)
12
+ @owner, @filename, @mimetype = owner, Spontaneous::Media.to_filename(filename), mimetype
13
+ end
14
+
15
+ def rename(new_filename)
16
+ self.class.new(owner, new_filename, nil)
17
+ end
18
+
19
+ def open(mode = 'wb', &block)
20
+ storage.open(storage_path, mimetype, mode, &block)
21
+ end
22
+
23
+ def copy(existing_file)
24
+ @source = existing_file.respond_to?(:path) ? existing_file.path : existing_file
25
+ storage.copy(existing_file, storage_path, mimetype)
26
+ end
27
+
28
+ def url
29
+ storage.public_url(storage_path)
30
+ end
31
+
32
+ def mimetype
33
+ @mimetype ||= ::Rack::Mime.mime_type(ext)
34
+ end
35
+
36
+ def ext
37
+ F.extname(filename)
38
+ end
39
+
40
+ def storage
41
+ @storage ||= Spontaneous::Site.storage(mimetype)
42
+ end
43
+
44
+ def padded_id
45
+ owner.media_id.to_s.rjust(5, "0")
46
+ end
47
+
48
+ def padded_revision
49
+ Spontaneous::Site.working_revision.to_s.rjust(4, "0")
50
+ end
51
+
52
+ def media_dir
53
+ F.join(padded_id, padded_revision)
54
+ end
55
+
56
+ def storage_path
57
+ [padded_id, padded_revision, filename]
58
+ end
59
+
60
+ def relative_path
61
+ F.join(*storage_path)
62
+ end
63
+
64
+ def path
65
+ F.join(storage.root, relative_path)
66
+ end
67
+
68
+ def dirname
69
+ F.join(storage.root, media_dir)
70
+ end
71
+
72
+ alias_method :filepath, :path
73
+ end
74
+ end
@@ -1,22 +1,20 @@
1
1
  # encoding: UTF-8
2
2
 
3
-
4
3
  module Spontaneous
5
4
  class Page < Content
6
-
7
- plugin Plugins::Supertype
8
- plugin Plugins::Page::Formats
9
- plugin Plugins::Layouts
10
- plugin Plugins::Paths
11
- plugin Plugins::PageTree
12
- plugin Plugins::SiteMap
13
- plugin Plugins::PageSearch
14
- plugin Plugins::Controllers
15
- plugin Plugins::Page::Request
5
+ include Plugins::Supertype
6
+ include Plugins::Page::Formats
7
+ include Plugins::Layouts
8
+ include Plugins::Paths
9
+ include Plugins::PageTree
10
+ include Plugins::SiteMap
11
+ include Plugins::PageSearch
12
+ include Plugins::Controllers
13
+ include Plugins::Page::Request
16
14
 
17
15
  many_to_one :parent, :class => Content, :reciprocal => :children
18
16
  one_to_many :children, :class => Content, :key => :parent_id, :reciprocal => :parent
19
- one_to_many :content, :class => Content, :key => :page_id, :reciprocal => :page
17
+ one_to_many :content, :class => Content, :key => :page_id, :reciprocal => :page
20
18
 
21
19
  # field :title, :string, :default => "New Page"
22
20
 
@@ -26,8 +24,8 @@ module Spontaneous
26
24
  true
27
25
  end
28
26
 
29
- def self.export
30
- super.merge(:title_field => self.title_field.to_s)
27
+ def self.export(user = nil)
28
+ super(user).merge(:title_field => self.title_field.to_s)
31
29
  end
32
30
 
33
31
  def self.title_field
@@ -40,6 +38,38 @@ module Spontaneous
40
38
 
41
39
  alias_method :is_page?, :page?
42
40
 
41
+ alias_method :unordered_children, :children
42
+
43
+ def children
44
+ @ordered_children ||= generate_ordered_children(super)
45
+ end
46
+
47
+ def generate_ordered_children(unordered_children)
48
+ return unordered_children if self.boxes.empty?
49
+ ordered_pages = unordered_children.sort { |a, b| a.page_order_string <=> b.page_order_string }
50
+ ordered_pages.freeze
51
+ end
52
+
53
+ def page_order_string
54
+ @page_order_string ||= (content_ancestors[1..-1].push(self)).map { |a| a.position.to_s.rjust(5, "0") }.join('.')
55
+ end
56
+
57
+ def content_ancestors
58
+ obj = self
59
+ ancestors = []
60
+ begin
61
+ obj = obj.container
62
+ ancestors.unshift obj
63
+ end until obj.nil? or obj.is_page?
64
+
65
+ ancestors
66
+ end
67
+
68
+ def reload
69
+ @ordered_children = @page_order_string = nil
70
+ super
71
+ end
72
+
43
73
  def before_save
44
74
  if parent
45
75
  self.depth = parent.depth+1
@@ -56,7 +86,7 @@ module Spontaneous
56
86
  end
57
87
 
58
88
  def resolve_entry
59
- container.all_pieces.find { |e| e.id == self.id }
89
+ owner.all_pieces.find { |e| e.id == self.id }
60
90
  end
61
91
 
62
92
  def page=(page)
@@ -76,8 +106,8 @@ module Spontaneous
76
106
  self.class.title_field
77
107
  end
78
108
 
79
- def shallow_export
80
- hash = super.merge({
109
+ def shallow_export(user)
110
+ hash = super(user).merge({
81
111
  :path => path,
82
112
  :title => page_title,
83
113
  :slug => slug,
@@ -87,6 +117,5 @@ module Spontaneous
87
117
  hash.delete(:name)
88
118
  hash
89
119
  end
90
-
91
120
  end
92
121
  end
@@ -1,16 +1,29 @@
1
1
  # encoding: UTF-8
2
2
 
3
+ require 'delegate'
3
4
 
4
5
  module Spontaneous
5
- class PagePiece < ProxyObject
6
- extend Plugins
7
- plugin Plugins::Render
6
+ class PagePiece < DelegateClass(Page)
7
+ include Plugins::Render
8
8
 
9
- attr_accessor :container
10
- attr_reader :target, :style_id
9
+ attr_accessor :owner
10
+ attr_reader :style_id
11
11
 
12
- def initialize(container, target, style_id)
13
- @container, @target, @style_id = container, target, style_id
12
+ def initialize(owner, target, style_id)
13
+ super(target)
14
+ @owner, @style_id = owner, style_id
15
+ end
16
+
17
+ alias_method :target, :__getobj__
18
+ alias_method :parent, :owner
19
+
20
+ # Public: when accessed as inner content, pages return
21
+ # the page at the top of the inner content tree as their
22
+ # #page, rather than themselves
23
+ #
24
+ # Returns: the owning Page object
25
+ def page
26
+ owner.page
14
27
  end
15
28
 
16
29
  def id
@@ -18,7 +31,7 @@ module Spontaneous
18
31
  end
19
32
 
20
33
  def depth
21
- container.content_depth + 1
34
+ owner.content_depth + 1
22
35
  end
23
36
 
24
37
  def style(format = :html)
@@ -29,17 +42,15 @@ module Spontaneous
29
42
  self
30
43
  end
31
44
 
32
- def export
33
- target.shallow_export.merge(export_styles).merge({
45
+ def export(user)
46
+ target.shallow_export(user).merge(export_styles).merge({
34
47
  :depth => self.depth
35
48
  })
36
49
  end
37
50
 
38
51
  def export_styles
39
- {
40
- :style => style_id.to_s,
41
- :styles => container.available_styles(target).map { |s| s.schema_id.to_s },
42
- }
52
+ { :style => style_id.to_s,
53
+ :styles => owner.available_styles(target).map { |s| s.schema_id.to_s } }
43
54
  end
44
55
 
45
56
  def serialize_db
@@ -49,12 +60,12 @@ module Spontaneous
49
60
  def style=(style)
50
61
  @style_id = style_to_schema_id(style)
51
62
  # because it's not obvious that a change to an entry
52
- # will affect the fields of the container piece
53
- # make sure that the container is saved using an instance hook
63
+ # will affect the fields of the owner piece
64
+ # make sure that the owner is saved using an instance hook
54
65
  target.after_save_hook do
55
- container.save
66
+ owner.save
56
67
  end
57
- container.entry_modified!(self)
68
+ owner.entry_modified!(self)
58
69
  end
59
70
 
60
71
  def style
@@ -64,14 +75,5 @@ module Spontaneous
64
75
  def template(format = :html)
65
76
  style.template(format)
66
77
  end
67
-
68
- def method_missing(method, *args)
69
- if block_given?
70
- self.target.__send__(method, *args, &Proc.new)
71
- else
72
- self.target.__send__(method, *args)
73
- end
74
- end
75
78
  end
76
79
  end
77
-