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,41 +1,46 @@
1
1
  # encoding: UTF-8
2
2
 
3
- module Spontaneous::Plugins
4
- module Site
5
- module Selectors
6
- module ClassMethods
7
- def root
8
- Spontaneous::Page.root
9
- end
3
+ module Spontaneous::Plugins::Site
4
+ module Selectors
5
+ extend ActiveSupport::Concern
10
6
 
11
- def [](path_or_uid)
12
- case path_or_uid
13
- when /^\//
14
- by_path(path_or_uid)
15
- when /^#/
16
- by_uid(path_or_uid[1..-1])
17
- else
18
- by_uid(path_or_uid)
19
- end
20
- end
7
+ module ClassMethods
8
+ def root
9
+ Spontaneous::Page.root
10
+ end
21
11
 
22
- def by_path(path)
23
- Spontaneous::Page.path(path)
12
+ def [](path_or_uid)
13
+ case path_or_uid
14
+ when Fixnum, /\A\d+\z/o
15
+ by_id(path_or_uid)
16
+ when /^\//o
17
+ by_path(path_or_uid)
18
+ when /^#/o
19
+ by_uid(path_or_uid[1..-1])
20
+ else
21
+ by_uid(path_or_uid)
24
22
  end
23
+ end
25
24
 
26
- def by_uid(uid)
27
- Spontaneous::Page.uid(uid)
28
- end
25
+ def by_id(id)
26
+ Spontaneous::Page[id]
27
+ end
29
28
 
30
- def method_missing(method, *args)
31
- if page = self[method.to_s]
32
- page
33
- else
34
- super
35
- end
36
- end
29
+ def by_path(path)
30
+ Spontaneous::Page.path(path)
31
+ end
37
32
 
33
+ def by_uid(uid)
34
+ Spontaneous::Page.uid(uid)
35
+ end
36
+
37
+ def method_missing(method, *args)
38
+ if page = self[method.to_s]
39
+ page
40
+ else
41
+ super
42
+ end
38
43
  end
39
- end
44
+ end # ClassMethods
40
45
  end
41
46
  end
@@ -0,0 +1,63 @@
1
+ # encoding: UTF-8
2
+
3
+
4
+ # storage :s3 do |config|
5
+ # config[:provider] = "AWS",
6
+ # config[:aws_access_key_id] = "key",
7
+ # config[:aws_secret_access_key] = "secret",
8
+ # config[:region] = 'eu-west-1'
9
+ # config[:bucket] => "name_of_bucket"
10
+ # config[:accepts] => "image/*"
11
+ # end
12
+
13
+ # storage :another_local do |config|
14
+ # config.update({
15
+ # :provider => "Local"
16
+ # })
17
+ # end
18
+
19
+ module Spontaneous::Plugins::Site
20
+ module Storage
21
+ extend ActiveSupport::Concern
22
+
23
+ module ClassMethods
24
+ def storage(mimetype = nil)
25
+ instance.storage(mimetype)
26
+ end
27
+
28
+ def local_storage
29
+ instance.local_storage
30
+ end
31
+ end # ClassMethods
32
+
33
+ def storage(mimetype = nil)
34
+ storage_for_mimetype(mimetype)
35
+ end
36
+
37
+ def storage_for_mimetype(mimetype)
38
+ storage_backends.detect { |storage| storage.accepts?(mimetype) }
39
+ end
40
+
41
+ def local_storage
42
+ storage_backends.select { |storage| storage.local? }
43
+ end
44
+
45
+ def storage_backends
46
+ @storage_backends ||= configure_storage
47
+ end
48
+
49
+ def configure_storage
50
+ storage_backends = []
51
+ storage_settings = config[:storage] || []
52
+ storage_settings.each do |name, config|
53
+ backend = Spontaneous::Storage.create(config)
54
+ storage_backends << backend
55
+ end
56
+ storage_backends << default_storage
57
+ end
58
+
59
+ def default_storage
60
+ @default_storage ||= Spontaneous::Storage::Local.new(Spontaneous.media_dir, '/media', accepts=nil)
61
+ end
62
+ end
63
+ end
@@ -1,34 +1,32 @@
1
1
  # encoding: UTF-8
2
2
 
3
-
4
3
  module Spontaneous::Plugins
5
4
  module SiteMap
6
- module ClassMethods
7
- end
5
+ extend ActiveSupport::Concern
8
6
 
9
- module InstanceMethods
10
- def map_children
11
- self.children.map { |c| c.map_entry }
12
- end
7
+ # InstanceMethods
8
+ def map_children
9
+ self.children.map { |c| c.map_entry }
10
+ end
13
11
 
14
- def map_entry
15
- shallow_map_entry.merge({
16
- :children => self.children.map {|c| c.shallow_map_entry },
17
- :generation => self.generation.map {|c| c.shallow_map_entry },
18
- :ancestors => self.ancestors.map {|c| c.shallow_map_entry },
19
- })
20
- end
21
- def shallow_map_entry
22
- {
23
- :id => id,
24
- :title => fields.title.value,
25
- :path => path,
26
- :type => self.class.ui_class,
27
- :type_id => self.class.schema_id,
28
- :children => self.children.length,
29
- :depth => depth
30
- }
31
- end
12
+ def map_entry
13
+ shallow_map_entry.merge({
14
+ :children => self.children.map {|c| c.shallow_map_entry },
15
+ :generation => self.generation.map {|c| c.shallow_map_entry },
16
+ :ancestors => self.ancestors.map {|c| c.shallow_map_entry },
17
+ })
18
+ end
19
+ def shallow_map_entry
20
+ {
21
+ :id => id,
22
+ :title => fields.title.value,
23
+ :path => path,
24
+ :slug => slug,
25
+ :type => self.class.ui_class,
26
+ :type_id => self.class.schema_id,
27
+ :children => self.children.length,
28
+ :depth => depth
29
+ }
32
30
  end
33
31
  end
34
32
  end
@@ -2,9 +2,7 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module Styles
5
-
6
- def self.configure(base)
7
- end
5
+ extend ActiveSupport::Concern
8
6
 
9
7
  module ClassMethods
10
8
  def style(name, options={})
@@ -38,7 +36,6 @@ module Spontaneous::Plugins
38
36
  Spontaneous::Style
39
37
  end
40
38
 
41
-
42
39
  def find_style(style_sid)
43
40
  if prototype = style_prototypes.sid(style_sid)
44
41
  prototype.style(self)
@@ -64,56 +61,51 @@ module Spontaneous::Plugins
64
61
  end
65
62
  end # ClassMethods
66
63
 
67
- module InstanceMethods
64
+ # InstanceMethods
68
65
 
69
- def style=(style)
70
- self.style_sid = style_to_schema_id(style)
71
- end
66
+ def style=(style)
67
+ self.style_sid = style_to_schema_id(style)
68
+ end
72
69
 
73
- # converts a symbol or string into a Schema::UID instance
74
- def style_to_schema_id(style)
75
- return nil if style.nil?
76
- sid = nil
77
- if style.respond_to?(:schema_id)
78
- sid = style.schema_id
70
+ # converts a symbol or string into a Schema::UID instance
71
+ def style_to_schema_id(style)
72
+ return nil if style.nil?
73
+ sid = nil
74
+ if style.respond_to?(:schema_id)
75
+ sid = style.schema_id
76
+ else
77
+ if Spontaneous::Schema::UID === style
78
+ sid = style
79
79
  else
80
- if Spontaneous::Schema::UID === style
81
- sid = style
82
- else
83
- if s = self.find_named_style(style)
84
- sid = s.schema_id
85
- end
80
+ if s = self.find_named_style(style)
81
+ sid = s.schema_id
86
82
  end
87
83
  end
88
84
  end
85
+ end
89
86
 
90
- def find_named_style(style_name)
91
- self.class.find_named_style(style_name)
92
- end
93
-
94
- def style
95
- resolve_style(self.style_sid)
96
- end
97
-
98
- def default_style
99
- self.class.default_style
100
- end
101
-
102
- def resolve_style(style_sid)
103
- self.class.resolve_style(style_sid)
104
- end
87
+ def find_named_style(style_name)
88
+ self.class.find_named_style(style_name)
89
+ end
105
90
 
106
- def styles
107
- self.class.styles
108
- end
91
+ def style
92
+ resolve_style(self.style_sid)
93
+ end
109
94
 
110
- def template(format = :html)
111
- style.template(format)
112
- end
95
+ def default_style
96
+ self.class.default_style
97
+ end
113
98
 
99
+ def resolve_style(style_sid)
100
+ self.class.resolve_style(style_sid)
101
+ end
114
102
 
115
- end # InstanceMethods
103
+ def styles
104
+ self.class.styles
105
+ end
116
106
 
107
+ def template(format = :html)
108
+ style.template(format)
109
+ end
117
110
  end
118
111
  end
119
-
@@ -2,10 +2,12 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module Supertype
5
+ extend ActiveSupport::Concern
6
+
5
7
  module ClassMethods
6
8
  def supertype
7
9
  superclass
8
10
  end
9
- end
11
+ end # ClassMethods
10
12
  end
11
13
  end
@@ -1,12 +1,8 @@
1
1
  # encoding: UTF-8
2
2
 
3
-
4
3
  module Spontaneous::Plugins
5
4
  module Visibility
6
- S = Spontaneous unless defined?(S)
7
-
8
- def self.configure(base)
9
- end
5
+ extend ActiveSupport::Concern
10
6
 
11
7
  module ClassMethods
12
8
  @@visible_filter = false
@@ -26,7 +22,7 @@ module Spontaneous::Plugins
26
22
  end
27
23
 
28
24
  def _content_classes
29
- [Spontaneous::Content, Spontaneous::Page, Spontaneous::Piece] + Spontaneous::Schema.content_classes
25
+ [Spontaneous::Content, Spontaneous::Page, Spontaneous::Piece] + Spontaneous.schema.content_classes
30
26
  end
31
27
 
32
28
  def _unfiltered_dataset
@@ -38,12 +34,12 @@ module Spontaneous::Plugins
38
34
  yield
39
35
  else
40
36
  begin
41
- _content_classes.each { |content_class| content_class._set_visible_dataset! }
37
+ Spontaneous::Content._set_visible_dataset!
42
38
  @@visible_filter = true
43
39
  yield
44
40
  ensure
45
41
  @@visible_filter = false
46
- _content_classes.each { |content_class| content_class._restore_dataset! }
42
+ Spontaneous::Content._restore_dataset!
47
43
  end
48
44
  end
49
45
  end
@@ -51,101 +47,112 @@ module Spontaneous::Plugins
51
47
  def visible_only?
52
48
  @@visible_filter
53
49
  end
54
- end # ClassMethods
55
50
 
56
- module InstanceMethods
57
- def visible?
58
- !self.hidden
51
+ def visible
52
+ self.dataset.filter(:hidden => false)
59
53
  end
54
+ end # ClassMethods
60
55
 
61
- def hidden?
62
- self.hidden
63
- end
56
+ # InstanceMethods
64
57
 
65
- def hide!
66
- set_visible!(false)
67
- end
58
+ def visible?
59
+ !self.hidden
60
+ end
68
61
 
69
- def show!
70
- set_visible!(true)
71
- end
62
+ def hidden?
63
+ self.hidden
64
+ end
72
65
 
73
- def toggle_visibility!
74
- if hidden?
75
- show!
76
- else
77
- hide!
78
- end
79
- end
66
+ def hide!
67
+ set_visible!(false)
68
+ end
80
69
 
81
- ##
82
- # Is true when the current object is hidden independently of its ancestors
83
- # and false when hidden because one of its ancestors is hidden (so to show
84
- # this you need to show that ancestor)
85
- def showable?
86
- hidden? && hidden_origin.blank?
87
- end
70
+ def show!
71
+ set_visible!(true)
72
+ end
88
73
 
89
- def visible=(visible)
90
- protect_root_visibility!
91
- set_visible(visible)
74
+ def toggle_visibility!
75
+ if hidden?
76
+ show!
77
+ else
78
+ hide!
92
79
  end
80
+ end
81
+
82
+ ##
83
+ # Is true when the current object is hidden independently of its ancestors
84
+ # and false when hidden because one of its ancestors is hidden (so to show
85
+ # this you need to show that ancestor)
86
+ def showable?
87
+ hidden? && hidden_origin.blank?
88
+ end
93
89
 
90
+ def visible=(visible)
91
+ protect_root_visibility!
92
+ set_visible(visible)
93
+ end
94
94
 
95
- protected
96
95
 
97
- def set_visible!(state)
98
- self.set_visible(state)
99
- self.save
100
- self
101
- end
96
+ protected
102
97
 
103
- def set_visible(visible)
104
- protect_root_visibility!
105
- if self.visible? != visible
106
- raise Spontaneous::NotShowable.new(self, hidden_origin) if hidden? && visible && !showable?
107
- self[:hidden] = !visible
108
- self[:hidden_origin] = nil
109
- @_visibility_modified = true
110
- end
98
+ def set_visible!(state)
99
+ self.set_visible(state)
100
+ self.save
101
+ self
102
+ end
103
+
104
+ def set_visible(visible)
105
+ protect_root_visibility!
106
+ if self.visible? != visible
107
+ raise Spontaneous::NotShowable.new(self, hidden_origin) if hidden? && visible && !showable?
108
+ self[:hidden] = !visible
109
+ self[:hidden_origin] = nil
110
+ @_visibility_modified = true
111
111
  end
112
+ end
112
113
 
113
- def after_save
114
- super
115
- if @_visibility_modified
116
- hide_descendents(self.visible?)
117
- @_visibility_modified = false
118
- end
114
+ def after_save
115
+ super
116
+ if @_visibility_modified
117
+ hide_descendents(self.visible?)
118
+ hide_aliases(self.visible?)
119
+ @_visibility_modified = false
119
120
  end
121
+ end
120
122
 
121
- def hide_descendents(visible)
122
- path_like = :content_path.like("#{self[:content_path]}.#{self.id}%")
123
- origin = visible ? nil : self.id
124
- dataset = Spontaneous::Content.filter(path_like).filter(:hidden => visible)
125
- # if a child item has been made invisible *before* its parent then it exists
126
- # with hidden = true and hidden_origin = nil
127
- if visible
128
- dataset = dataset.filter(:hidden_origin => self.id)
129
- end
130
- dataset.update(:hidden => !visible, :hidden_origin => origin)
131
-
132
- ## I'm saving these for posterity: I worked out some Sequel magic and I don't want to lose it
133
- #
134
- # Spontaneous::Content.from(:content___p).filter(path_like).update(:visible => visible, :hidden_origin => origin)
135
- # Spontaneous::Content.filter(:page_id => self.id).set(:visible => visible, :hidden_origin => origin)
136
- ## Update with join:
137
- # Spontaneous::Content.from(:content___n, :content___p).filter(path_like).filter(:n__page_id => :p__id).set(:n__visible => visible, :n__hidden_origin => origin)
123
+ def hide_aliases(visible)
124
+ dataset = Spontaneous::Content.filter(:target_id => self.id)
125
+ origin = visible ? nil : self.id
126
+ dataset.update(:hidden => !visible, :hidden_origin => origin)
127
+ end
128
+
129
+ def hide_descendents(visible)
130
+ path_like = :visibility_path.like("#{self[:visibility_path]}.#{self.id}%")
131
+ origin = visible ? nil : self.id
132
+ dataset = Spontaneous::Content.filter(path_like).filter(:hidden => visible)
133
+ # if a child item has been made invisible *before* its parent then it exists
134
+ # with hidden = true and hidden_origin = nil
135
+ if visible
136
+ dataset = dataset.filter(:hidden_origin => self.id)
138
137
  end
138
+ dataset.update(:hidden => !visible, :hidden_origin => origin)
139
139
 
140
- def protect_root_visibility!
141
- if self.is_page? && self.is_root?
142
- raise "Root page is not hidable"
143
- end
140
+ dataset.each do |content|
141
+ content.aliases.update(:hidden => !visible, :hidden_origin => origin)
144
142
  end
145
- end # InstanceMethods
146
143
 
144
+ ## I'm saving these for posterity: I worked out some Sequel magic and I don't want to lose it
145
+ #
146
+ # Spontaneous::Content.from(:content___p).filter(path_like).update(:visible => visible, :hidden_origin => origin)
147
+ # Spontaneous::Content.filter(:page_id => self.id).set(:visible => visible, :hidden_origin => origin)
148
+ ## Update with join:
149
+ # Spontaneous::Content.from(:content___n, :content___p).filter(path_like).filter(:n__page_id => :p__id).set(:n__visible => visible, :n__hidden_origin => origin)
150
+ end
151
+
152
+ def protect_root_visibility!
153
+ if self.is_page? && self.is_root?
154
+ raise "Root page is not hidable"
155
+ end
156
+ end
147
157
  end
148
158
  end
149
-
150
-
151
-