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
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Spontaneous::Plugins::Page
4
4
  module Request
5
+ extend ActiveSupport::Concern
6
+
5
7
  # liked this but it didn't work particularly well so wasn't used in the end
6
8
  # perhaps, when I re-write the bloody Public handler i can use it
7
9
  class PageResponse
@@ -61,6 +63,13 @@ module Spontaneous::Plugins::Page
61
63
  @request_blocks ||= {}
62
64
  end
63
65
 
66
+ # Tests for existance of a request handler for a method
67
+ # Used by the publishing mechanism to determine which template bucket a
68
+ # published page should be placed in.
69
+ def dynamic?(method = :get)
70
+ request_blocks.has_key?(method) && !request_blocks[method].nil?
71
+ end
72
+
64
73
  # unused at present
65
74
  def _request_response(instance, request, response, format)
66
75
  method = request.request_method.downcase.to_sym
@@ -74,16 +83,13 @@ module Spontaneous::Plugins::Page
74
83
  end # ClassMethods
75
84
 
76
85
 
77
- module InstanceMethods
78
- def request_block(request)
79
- method = request.request_method.downcase.to_sym
80
- self.class.request_blocks[method]
81
- end
86
+ def request_block(request)
87
+ method = request.request_method.downcase.to_sym
88
+ self.class.request_blocks[method]
89
+ end
82
90
 
83
- def is_dynamic?
84
- self.class.request_blocks.key?(:get)
85
- end
91
+ def dynamic?(method = :get)
92
+ self.class.dynamic?(method)
86
93
  end
87
94
  end # Request
88
95
  end
89
-
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module PageSearch
5
+ extend ActiveSupport::Concern
6
+
5
7
  module ClassMethods
6
8
  def root
7
9
  first_visible(:path => Spontaneous::SLASH)
@@ -13,7 +15,7 @@ module Spontaneous::Plugins
13
15
 
14
16
  def path(path)
15
17
  page = first_visible(:path => path)
16
- page = aliased_path(path) if page.nil?
18
+ # page = aliased_path(path) if page.nil?
17
19
  page
18
20
  end
19
21
 
@@ -27,38 +29,35 @@ module Spontaneous::Plugins
27
29
  page
28
30
  end
29
31
 
30
- def aliased_path(path)
31
- @_ps ||= Hash.new { |h, k| h[k] = prepare_aliased_path_query(k) }
32
- p = path.split(S::SLASH)
33
- root = p[0..-2].join(S::SLASH)
34
- visible = Spontaneous::Content.visible_only?
35
- @_ps[visible].call(:root => root, :slug => p.last)
36
- end
32
+ # def aliased_path(path)
33
+ # puts "looking for aliased path #{path}"
34
+ # @_ps ||= Hash.new { |h, k| h[k] = prepare_aliased_path_query(k) }
35
+ # p = path.split(S::SLASH)
36
+ # root = p[0..-2].join(S::SLASH)
37
+ # visible = Spontaneous::Content.visible_only?
38
+ # @_ps[visible].call(:root => root, :slug => p.last)
39
+ # end
37
40
 
38
41
  protected
39
42
 
40
- def prepare_aliased_path_query(visible_only=false)
41
- # select c2.*
42
- # from content as c1, content as c2, content as c3 \
43
- # where c1.path = '/aliases'
44
- # and c2.parent_id = c1.id
45
- # and c2.target_id = c3.id
46
- # and c3.slug = 'b';
47
- params = {
48
- :c1__path => :$root,
49
- :c2__parent_id => :c1__id,
50
- :c2__target_id => :c3__id,
51
- :c3__slug => :$slug
52
- }
53
- params.merge!(:c3__hidden => false) if visible_only
54
-
55
- query = S::Content._unfiltered_dataset.select(Sequel::LiteralString.new("c2.*")).from(:content___c1, :content___c2, :content___c3).where(params)
56
- query.prepare(:first)
57
- end
58
- end
59
-
60
- # module InstanceMethods
61
- # end
43
+ # def prepare_aliased_path_query(visible_only=false)
44
+ # # select c2.*
45
+ # # from content as c1, content as c2, content as c3 \\
46
+ # # where c1.path = '/aliases'
47
+ # # and c2.parent_id = c1.id
48
+ # # and c2.target_id = c3.id
49
+ # # and c3.slug = 'b';
50
+ # params = {
51
+ # :c1__path => :$root,
52
+ # :c2__parent_id => :c1__id,
53
+ # :c2__target_id => :c3__id,
54
+ # :c3__slug => :$slug
55
+ # }
56
+ # params.merge!(:c3__hidden => false) if visible_only
57
+
58
+ # query = S::Content._unfiltered_dataset.select(Sequel::LiteralString.new("c2.*")).from(:content___c1, :content___c2, :content___c3).where(params)
59
+ # query.prepare(:first, :aliased_page)
60
+ # end
61
+ end # ClassMethods
62
62
  end
63
63
  end
64
-
@@ -2,24 +2,71 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module PageTree
5
+ extend ActiveSupport::Concern
5
6
 
6
- module InstanceMethods
7
- def ancestors
8
- ancestor_path.map { |id| Spontaneous::Content[id] }
9
- end
7
+ # InstanceMethods
10
8
 
11
- def ancestor(depth)
12
- ancestors[depth]
13
- end
9
+ def ancestors
10
+ @ancestors ||= ancestor_path.map { |id| Spontaneous::Content[id] }
11
+ end
12
+
13
+ def ancestor(depth)
14
+ ancestors[depth]
15
+ end
14
16
 
15
- def generation
16
- parent ? parent.children : [root]
17
+ # Returns a list of all the pages at a certain depth in the page tree for any page
18
+ def at_depth(depth)
19
+ return root_at_depth(depth) if is_root?
20
+ parent_depth = [0, depth - 1].max
21
+ parent = ancestor(parent_depth)
22
+ unordered_pages = parent.children
23
+ # This is made more complex because the #children method is unordered
24
+ # whereas the actual page order must come from the boxes
25
+ return unordered_pages if parent.boxes.empty?
26
+ ordered_pages = []
27
+ # Iterate through the list of boxes and pull out of the
28
+ # unordered page list each page that belongs to the current box
29
+ parent.boxes.each do |box|
30
+ box_id = box.schema_id.to_s
31
+ in_box, unordered_pages = unordered_pages.partition { |p| p.box_sid == box_id }
32
+ ordered_pages.concat in_box.sort { |a, b| a.position <=> b.position }
17
33
  end
34
+ ordered_pages
35
+ end
18
36
 
19
- def siblings
20
- generation.reject { |p| p === self }
37
+ def root_at_depth(depth)
38
+ case depth
39
+ when 0
40
+ self
41
+ when 1
42
+ self.children
43
+ else
44
+ raise ArgumentError.new("Cannot calculate descendents of root beyond a depth of 1")
21
45
  end
22
46
  end
47
+
48
+ def ancestor?(page)
49
+ ancestor_path.include?(page.id)
50
+ end
51
+
52
+ def active?(page)
53
+ page.id == self.id or ancestor?(page)
54
+ end
55
+
56
+ def generation
57
+ parent ? parent.children : [root]
58
+ end
59
+
60
+ def siblings
61
+ generation.reject { |p| p === self }
62
+ end
63
+
64
+ def >(page)
65
+ page.ancestors.include?(self)
66
+ end
67
+
68
+ def >=(page)
69
+ page == self or self.>(page)
70
+ end
23
71
  end
24
72
  end
25
-
@@ -1,8 +1,8 @@
1
1
  # encoding: UTF-8
2
2
 
3
-
4
3
  module Spontaneous::Plugins
5
4
  module Paths
5
+ extend ActiveSupport::Concern
6
6
 
7
7
  module ClassMethods
8
8
  def generate_default_slug
@@ -14,111 +14,116 @@ module Spontaneous::Plugins
14
14
  end
15
15
  end
16
16
 
17
- module InstanceMethods
18
- ANCESTOR_SEP = "."
17
+ # InstanceMethods
19
18
 
20
- def after_initialize
21
- super
22
- self.slug = default_slug if slug.nil?
23
- end
19
+ ANCESTOR_SEP = "."
24
20
 
25
- def before_create
26
- place_in_page_tree
27
- super
28
- end
21
+ def after_initialize
22
+ super
23
+ self.slug = default_slug if slug.nil?
24
+ end
25
+
26
+ def before_create
27
+ place_in_page_tree
28
+ super
29
+ end
29
30
 
30
- def before_save
31
- unless new?
32
- if title = self.fields[:title]
33
- if title.modified? and !title.blank? and self.class.is_default_slug?(slug)
34
- self.slug = title.value
35
- end
31
+ def before_save
32
+ unless new?
33
+ if title = self.fields[:title]
34
+ if title.modified? and !title.blank? and self.class.is_default_slug?(slug)
35
+ self.slug = title.value
36
36
  end
37
37
  end
38
- super
39
38
  end
39
+ super
40
+ end
40
41
 
41
- def after_save
42
- super
43
- check_for_path_changes
44
- end
42
+ def after_save
43
+ super
44
+ check_for_path_changes
45
+ end
45
46
 
46
- def default_slug
47
- self.class.generate_default_slug
48
- end
47
+ def default_slug
48
+ self.class.generate_default_slug
49
+ end
49
50
 
50
- def parent=(parent)
51
- super
52
- end
51
+ def parent=(parent)
52
+ @__parent_changed = true
53
+ super
54
+ end
53
55
 
54
- def place_in_page_tree
55
- if self.parent_id.nil?
56
- if Spontaneous::Page.root.nil?
57
- make_root
58
- end
59
- else
60
- update_path
56
+ def place_in_page_tree
57
+ if self.parent_id.nil?
58
+ if Spontaneous::Page.root.nil?
59
+ make_root
61
60
  end
61
+ else
62
+ update_path
62
63
  end
64
+ end
63
65
 
64
- def make_root
65
- self[:path] = "/"
66
- self[:slug] = ""
67
- self[:ancestor_path] = ""
68
- end
66
+ def make_root
67
+ self[:path] = "/"
68
+ self[:slug] = ""
69
+ self[:ancestor_path] = ""
70
+ end
69
71
 
70
- def ancestor_path
71
- (self[:ancestor_path] || "").split(ANCESTOR_SEP).map { |id| id.to_i }
72
- end
72
+ def ancestor_path
73
+ (self[:ancestor_path] || "").split(ANCESTOR_SEP).map { |id| id.to_i }
74
+ end
73
75
 
74
- def root?
75
- path == Spontaneous::SLASH
76
- end
77
- alias_method :is_root?, :root?
76
+ def root?
77
+ path == Spontaneous::SLASH
78
+ end
79
+ alias_method :is_root?, :root?
78
80
 
79
- def root
80
- Spontaneous::Page.root
81
- end
81
+ def root
82
+ Spontaneous::Page.root
83
+ end
82
84
 
83
- def update_path
84
- self.path = calculate_path
85
- if parent
86
- self[:ancestor_path] = parent.ancestor_path.push(parent.id).join(ANCESTOR_SEP)
87
- end
85
+ def update_path
86
+ self.path = calculate_path
87
+ if parent
88
+ self[:ancestor_path] = parent.ancestor_path.push(parent.id).join(ANCESTOR_SEP)
88
89
  end
90
+ end
89
91
 
90
92
 
91
- def calculate_path
92
- if parent.nil?
93
- root? ? Spontaneous::SLASH : '' # bad case, no parent but not root
94
- else
95
- File.join(parent.path, slug)
96
- end
97
- end
98
-
99
- def slug=(s)
100
- if (new_slug = s.to_url) != self.slug
101
- @__slug_changed = true
102
- self[:slug] = new_slug
103
- self.update_path
104
- end
93
+ def calculate_path
94
+ if parent.nil?
95
+ root? ? Spontaneous::SLASH : '' # bad case, no parent but not root
96
+ else
97
+ File.join(parent.path, slug)
105
98
  end
99
+ end
106
100
 
107
- def check_for_path_changes
108
- if @__slug_changed
109
- @__slug_changed = false
110
- children.each do |child|
111
- child.propagate_path_changes
112
- end
113
- end
101
+ def slug=(s)
102
+ if (new_slug = s.to_url) != self.slug
103
+ @__slug_changed = true
104
+ # slugs can be max 255 characters long
105
+ self[:slug] = new_slug[0..254]
106
+ self.update_path
114
107
  end
108
+ end
115
109
 
116
- def propagate_path_changes
117
- self.update_path
118
- self.save
110
+ def check_for_path_changes
111
+ if @__slug_changed
112
+ @__slug_changed = false
119
113
  children.each do |child|
120
114
  child.propagate_path_changes
121
115
  end
116
+ aliases.each do |link|
117
+ link.propagate_path_changes if link.page?
118
+ end
119
+ end
120
+ end
121
+
122
+ def propagate_path_changes
123
+ self.update_path
124
+ self.save
125
+ children.each do |child|
126
+ child.propagate_path_changes
122
127
  end
123
128
  end
124
129
  end
@@ -1,27 +1,27 @@
1
1
  # encoding: UTF-8
2
2
 
3
-
4
3
  module Spontaneous::Plugins
5
4
  module Permissions
5
+ extend ActiveSupport::Concern
6
6
 
7
7
  module ClassMethods
8
- def box_readable?(box_name)
9
- box_permission(box_name, :read_level)
8
+ def box_readable?(user, box_name)
9
+ box_permission(user, box_name, :read_level)
10
10
  end
11
- def box_writable?(box_name)
12
- box_permission(box_name, :write_level)
11
+ def box_writable?(user, box_name)
12
+ box_permission(user, box_name, :write_level)
13
13
  end
14
14
 
15
- def field_readable?(field_name)
16
- field_permission(field_name, :read_level)
15
+ def field_readable?(user, field_name)
16
+ field_permission(user, field_name, :read_level)
17
17
  end
18
18
 
19
- def field_writable?(field_name)
20
- field_permission(field_name, :write_level)
19
+ def field_writable?(user, field_name)
20
+ field_permission(user, field_name, :write_level)
21
21
  end
22
22
 
23
- def field_permission(field_name, test)
24
- return true unless user = Spontaneous::Permissions.active_user
23
+ def field_permission(user, field_name, test)
24
+ return true unless user# = Spontaneous::Permissions.active_user
25
25
  if field = field_prototypes[field_name.to_sym]
26
26
  user.level >= field.__send__(test)
27
27
  else
@@ -29,8 +29,8 @@ module Spontaneous::Plugins
29
29
  end
30
30
  end
31
31
 
32
- def box_permission(box_name, test)
33
- return true unless user = Spontaneous::Permissions.active_user
32
+ def box_permission(user, box_name, test)
33
+ return true unless user# = Spontaneous::Permissions.active_user
34
34
  if box = boxes[box_name.to_sym]
35
35
  user.level >= box.__send__(test)
36
36
  else
@@ -40,24 +40,22 @@ module Spontaneous::Plugins
40
40
  end # ClassMethods
41
41
 
42
42
 
43
- module InstanceMethods
44
- def field_readable?(field_name)
45
- self.class.field_readable?(field_name)
46
- end
43
+ # InstanceMethods
47
44
 
48
- def field_writable?(field_name)
49
- self.class.field_writable?(field_name)
50
- end
45
+ def field_readable?(user, field_name)
46
+ self.class.field_readable?(user, field_name)
47
+ end
51
48
 
52
- def box_writable?(box_name)
53
- self.class.box_writable?(box_name)
54
- end
49
+ def field_writable?(user, field_name)
50
+ self.class.field_writable?(user, field_name)
51
+ end
55
52
 
56
- def box_readable?(box_name)
57
- self.class.box_readable?(box_name)
58
- end
59
- end # InstanceMethods
53
+ def box_writable?(user, box_name)
54
+ self.class.box_writable?(user, box_name)
55
+ end
60
56
 
57
+ def box_readable?(user, box_name)
58
+ self.class.box_readable?(user, box_name)
59
+ end
61
60
  end # Permissions
62
61
  end # Spontaneous::Plugins
63
-