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
@@ -33,6 +33,10 @@ module Spontaneous::Collections
33
33
  self.map { |item| item.export }
34
34
  end
35
35
 
36
+ def group(group_name)
37
+ self.select { |box| box._prototype.group == group_name }
38
+ end
39
+
36
40
  protected
37
41
 
38
42
  def get_single(index)
@@ -51,6 +55,20 @@ module Spontaneous::Collections
51
55
  define_method(getter_name) { |*args| box.tap { |b| b.template_params = args } }
52
56
  end
53
57
  end
58
+
59
+ def box_groups
60
+ owner.class.box_prototypes.map { |prototype| prototype.group }.compact
61
+ end
62
+
63
+
64
+ def method_missing(method, *args)
65
+ # allow access by group name e.g. instance.boxes.group_name
66
+ if box_groups.include?(method)
67
+ group(method)
68
+ # self.select { |box| box._prototype.group == method }
69
+ else
70
+ super
71
+ end
72
+ end
54
73
  end
55
74
  end
56
-
@@ -2,39 +2,61 @@
2
2
 
3
3
 
4
4
  module Spontaneous::Collections
5
- class EntrySet < Array
6
- alias_method :array_insert, :insert
7
- alias_method :array_push, :push
8
- alias_method :array_delete, :delete
5
+ class EntrySet
6
+ include Enumerable
9
7
 
10
- attr_reader :owner
8
+ attr_reader :owner, :store, :length
11
9
 
12
- def initialize(owner, piece_store)
10
+ def initialize(owner, piece_store = [])
13
11
  @owner = owner
12
+ @store = Hash.new { |hash, key| hash[key] = [] }
14
13
  (piece_store || []).each do |data|
15
14
  id = data[0]
16
15
  entry = \
17
16
  if data.length == 2
18
17
  page = @owner._pieces.detect { |piece| piece.id == id }
19
- Spontaneous::PagePiece.new(@owner, page, data[1])
18
+ if page
19
+ Spontaneous::PagePiece.new(@owner, page, data[1])
20
+ else
21
+ nil
22
+ end
20
23
  else
21
24
  @owner._pieces.detect { |piece| piece.id == id }
22
25
  end
23
26
  # if the piece/page has been deleted or is invisible
24
27
  # then we just want to silently skip it
25
- array_push(entry) if entry
28
+ if entry
29
+ box_id = entry.box_sid.to_s
30
+ @store[box_id] << entry
31
+ end
26
32
  end
27
33
  end
28
34
 
35
+ def each(&block)
36
+ owner.boxes.each do |box|
37
+ store[box.schema_id.to_s].each(&block)
38
+ end
39
+ end
40
+
41
+ def last
42
+ owner.boxes.last.last
43
+ end
44
+
45
+ def length
46
+ store.values.inject(0) { |sum, e| sum += e.length }
47
+ end
48
+
49
+ alias_method :size, :length
50
+
29
51
  def for_box(box)
30
- sid = box.schema_id
31
- self.select { |e| e.box_sid == sid }
52
+ sid = box.schema_id.to_s
53
+ store[sid]
32
54
  end
33
55
 
34
- def insert(index, piece)
35
- # piece.piece_store = self
36
- array_insert(index, piece)
37
- owner.entry_modified!(piece)
56
+ def insert(index, box, entry)
57
+ box_id = box.schema_id.to_s
58
+ store[box_id].insert(index, entry)
59
+ owner.entry_modified!(entry)
38
60
  end
39
61
 
40
62
 
@@ -44,7 +66,9 @@ module Spontaneous::Collections
44
66
  end
45
67
 
46
68
  def destroy
47
- self.dup.each { |e| e.destroy(false) }
69
+ store.each do |box_id, entries|
70
+ entries.dup.each { |e| e.destroy(false) }
71
+ end
48
72
  end
49
73
 
50
74
  def remove(piece)
@@ -52,8 +76,9 @@ module Spontaneous::Collections
52
76
  end
53
77
 
54
78
 
55
- def delete(piece)
56
- e = array_delete(piece)
79
+ def delete(entry)
80
+ box_id = entry.box_sid.to_s
81
+ e = store[box_id].delete(entry)
57
82
  owner.entry_modified!(nil)
58
83
  end
59
84
 
@@ -63,21 +88,44 @@ module Spontaneous::Collections
63
88
 
64
89
 
65
90
  def set_position(content, position)
66
- piece = self.detect {|e| e.id == content.id }
67
- self.array_delete(piece)
68
- self.insert(position, piece)
91
+ entries = store[content.box_sid.to_s]
92
+ piece = entries.detect {|e| e.id == content.id }
93
+ entries.delete(piece)
94
+ entries.insert(position, piece)
69
95
  owner.entry_modified!(piece)
70
96
  end
71
97
 
72
98
  def export
73
- map do | piece |
99
+ self.map do | piece |
74
100
  piece.export
75
101
  end
76
102
  end
77
103
 
104
+ def freeze
105
+ super
106
+ store.values.each { |entries| entries.freeze }
107
+ self
108
+ end
109
+
110
+ # Returns a frozen version of this set containing only entries that are visible
78
111
  def visible!
79
- self.dup.reject { |e| e.nil? or e.hidden? }.freeze
112
+ set = EntrySet.new(owner)
113
+ store.each do |box_id, entries|
114
+ visible = entries.reject { |e| e.nil? || e.hidden? }
115
+ set.concat(box_id, visible)
116
+ end
117
+ set.freeze
80
118
  end
81
119
 
120
+ def ==(set)
121
+ super or entries == set
122
+ end
123
+
124
+ protected
125
+
126
+ def concat(box_id, entries)
127
+ store[box_id].concat(entries)
128
+ self
129
+ end
82
130
  end
83
131
  end
@@ -14,7 +14,7 @@ module Spontaneous::Collections
14
14
  def initialize_from_prototypes(initial_values)
15
15
  values = (initial_values || []).map do |value|
16
16
  value = S::FieldTypes.deserialize_field(value)
17
- [Spontaneous::Schema::UID[value[:id]], value]
17
+ [Spontaneous.schema.uids[value[:id]], value]
18
18
  end
19
19
  values = Hash[values]
20
20
  owner.field_prototypes.each do |field_prototype|
@@ -27,9 +27,9 @@ module Spontaneous::Collections
27
27
  self.map { |field| field.serialize_db }
28
28
  end
29
29
 
30
- def export
30
+ def export(user)
31
31
  owner.class.field_names.map do |name|
32
- self[name].export
32
+ self[name].export(user)
33
33
  end
34
34
  end
35
35
 
@@ -48,6 +48,30 @@ module Spontaneous::Collections
48
48
  named(order.last)
49
49
  end
50
50
 
51
+ def local_first
52
+ if (key = @order.first)
53
+ named(key)
54
+ else
55
+ superset? ? superset.local_first : nil
56
+ end
57
+ end
58
+
59
+ def hierarchy_detect(&block)
60
+ if (found = local_detect(&block))
61
+ found
62
+ else
63
+ superset? ? superset.hierarchy_detect(&block) : nil
64
+ end
65
+ end
66
+
67
+ def local_detect(&block)
68
+ local_values.detect(&block)
69
+ end
70
+
71
+ def local_values
72
+ @order.map { |name| named(name) }
73
+ end
74
+
51
75
  def sid(schema_id)
52
76
  values.detect { |e| e.schema_id == schema_id }
53
77
  end
@@ -108,6 +132,10 @@ module Spontaneous::Collections
108
132
  @store[name.to_sym] || (superset? ? superset.named(name) : nil)
109
133
  end
110
134
 
135
+ def index(entry)
136
+ order.index(entry.name)
137
+ end
138
+
111
139
  def superset?
112
140
  @has_superset
113
141
  end
@@ -4,17 +4,18 @@ module Spontaneous
4
4
  class Config
5
5
 
6
6
  class Loader
7
+ attr_reader :settings
7
8
 
8
9
  def self.read(settings, file, mode)
9
10
  self.new(settings, file, mode).load
10
11
  end
11
12
 
12
- def initialize(settings, file, mode)
13
+ def initialize(settings, file = nil, mode = nil)
13
14
  @settings, @file, @mode = settings, file, mode
14
15
  end
15
16
 
16
17
  def load
17
- instance_eval(File.read(@file))
18
+ instance_eval(File.read(@file)) if @file
18
19
  @settings
19
20
  end
20
21
 
@@ -33,11 +34,19 @@ module Spontaneous
33
34
  end
34
35
  end
35
36
 
36
- def method_missing(parameter, *args)
37
+ def method_missing(parameter, *args, &block)
38
+ setting = args
37
39
  if args.length == 1
38
- args = args[0]
40
+ setting = args[0]
41
+ if block_given?
42
+ key_name = setting
43
+ setting = @settings[parameter] || {}
44
+ values = setting[key_name] || {}
45
+ block.call(values)
46
+ setting.update({ key_name => values })
47
+ end
39
48
  end
40
- @settings[parameter] = args
49
+ @settings[parameter] = setting
41
50
  end
42
51
  end
43
52
 
@@ -1,7 +1,5 @@
1
1
  # encoding: UTF-8
2
2
 
3
-
4
- require File.expand_path("../../sequel/plugins/yajl_serialization", __FILE__)
5
3
  require File.expand_path("../../sequel/plugins/content_table_inheritance", __FILE__)
6
4
 
7
5
  module Spontaneous
@@ -13,16 +11,17 @@ module Spontaneous
13
11
  alias_method :each_attribute, :each
14
12
 
15
13
  # need to load this first because it's used by the ContentTableInheritance plugin
16
- plugin Plugins::SchemaId
14
+ include Plugins::SchemaId
17
15
 
18
16
  sequel_plugin :content_table_inheritance, :type_sid
19
- sequel_plugin :yajl_serialization, :field_store, :entry_store, :box_store
17
+ sequel_plugin :serialization, :yajl, :field_store, :entry_store, :box_store
20
18
  sequel_plugin :instance_hooks
21
19
  sequel_plugin :skip_create_refresh
22
20
  sequel_plugin :timestamps, :create=>:created_at, :update=>:modified_at
23
21
  sequel_plugin :identity_map
24
22
  sequel_plugin :association_dependencies
25
23
  sequel_plugin :defaults_setter
24
+ sequel_plugin :scoped_table_name
26
25
 
27
26
  # overwrite the sequel version defined in IdentityMap to support
28
27
  # revisions
@@ -39,29 +38,28 @@ module Spontaneous
39
38
  page?
40
39
  end
41
40
 
42
- many_to_one :container, :key => :container_id, :class => self, :reciprocal => :_pieces
43
- one_to_many :_pieces, :key => :container_id, :class => self, :reciprocal => :container
44
- many_to_one :page, :class => Content, :key => :page_id, :reciprocal => :content
41
+ many_to_one :owner, :key => :owner_id, :class => Content, :reciprocal => :_pieces
42
+ one_to_many :_pieces, :key => :owner_id, :class => Content, :reciprocal => :owner
43
+ many_to_one :page, :key => :page_id, :class => Content, :reciprocal => :content
45
44
 
46
- extend Plugins
47
45
  include Enumerable
48
46
 
49
- plugin Plugins::Entry
50
- plugin Plugins::Boxes
51
- plugin Plugins::Fields
52
- plugin Plugins::Entries
53
- plugin Plugins::Styles
54
- plugin Plugins::SchemaTitle
55
- plugin Plugins::Render
56
- plugin Plugins::SchemaHierarchy
57
- plugin Plugins::InstanceCode
58
- plugin Plugins::Serialisation
59
- plugin Plugins::Media
60
- plugin Plugins::Publishing
61
- plugin Plugins::Aliases
62
- plugin Plugins::Visibility
63
- plugin Plugins::Prototypes
64
- plugin Plugins::Permissions
47
+ include Plugins::Entry
48
+ include Plugins::Boxes
49
+ include Plugins::Fields
50
+ include Plugins::Entries
51
+ include Plugins::Styles
52
+ include Plugins::SchemaTitle
53
+ include Plugins::Render
54
+ include Plugins::SchemaHierarchy
55
+ include Plugins::InstanceCode
56
+ include Plugins::Serialisation
57
+ include Plugins::Media
58
+ include Plugins::Publishing
59
+ include Plugins::Aliases
60
+ include Plugins::Visibility
61
+ include Plugins::Prototypes
62
+ include Plugins::Permissions
65
63
 
66
64
  # marker method enabling a simple test for "cms content" vs "everything else"
67
65
  def spontaneous_content?
@@ -78,6 +76,7 @@ module Spontaneous
78
76
  alias_method :is_page?, :page?
79
77
 
80
78
 
79
+
81
80
  # terminate the supertype chain here
82
81
  def self.supertype
83
82
  nil
@@ -1,9 +1,22 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'forwardable'
3
+ require "forwardable"
4
+
4
5
  module Spontaneous
5
6
  class Error < StandardError; end
6
7
 
8
+ class UnknownTypeException < Error
9
+ def initialize(parent, type)
10
+ super("Unknown content type '#{type}' requested in class #{parent}")
11
+ end
12
+ end
13
+
14
+ class UnknownStyleException < Error
15
+ def initialize(style_name, klass)
16
+ super("Unknown style '#{style_name}' for class #{klass}")
17
+ end
18
+ end
19
+
7
20
  # raised when trying to show something that is not showable due to
8
21
  # ancestor being hidden
9
22
  class NotShowable < Error
@@ -24,12 +37,15 @@ module Spontaneous
24
37
  super("Format '#{unsupported_format}' has no matching mime type")
25
38
  end
26
39
  end
40
+
27
41
  class UnsupportedFormatException < Error
28
42
  def initialize(style, unsupported_format)
29
43
  super("'#{unsupported_format}' format not supported by style '#{style.name}'.\nTemplate path: #{style.directory}\n")
30
44
  end
31
45
  end
32
46
 
47
+ class InvalidPrototypeDefinitionError < Error; end
48
+
33
49
  class SchemaModificationError < Error
34
50
  extend Forwardable
35
51
 
@@ -40,9 +56,9 @@ module Spontaneous
40
56
  end
41
57
 
42
58
  def_delegators :@modification, :added_classes, :removed_classes
43
- def_delegators :@modification, :added_fields, :removed_fields
44
- def_delegators :@modification, :added_boxes, :removed_boxes
45
- def_delegators :@modification, :added_styles, :removed_styles
59
+ def_delegators :@modification, :added_fields, :removed_fields
60
+ def_delegators :@modification, :added_boxes, :removed_boxes
61
+ def_delegators :@modification, :added_styles, :removed_styles
46
62
  def_delegators :@modification, :added_layouts, :removed_layouts
47
63
  end
48
64
  end
@@ -3,8 +3,8 @@
3
3
  module Spontaneous
4
4
  module Extensions
5
5
  module Array
6
- def render(format = :html)
7
- self.map { |e| e.respond_to?(:render) ? e.render(format) : nil }.join
6
+ def render(*args)
7
+ self.map { |e| e.respond_to?(:render) ? e.render(*args) : e }.join
8
8
  end
9
9
  end
10
10
  end
@@ -7,7 +7,7 @@ module Spontaneous
7
7
  def to_json
8
8
  Spontaneous::JSON.encode(self)
9
9
  end
10
- def serialise_http
10
+ def serialise_http(user)
11
11
  Spontaneous.serialise_http(self)
12
12
  end
13
13
  end