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,15 +1,12 @@
1
1
  # encoding: UTF-8
2
2
 
3
-
4
3
  module Spontaneous::Plugins
5
4
  module Prototypes
6
- S = Spontaneous unless defined?(S)
5
+ extend ActiveSupport::Concern
7
6
 
8
- def self.configure(base)
9
- end
7
+ DEFAULT_PROTOTYPE_NAME = :__default_prototype unless defined?(DEFAULT_PROTOTYPE_NAME)
10
8
 
11
9
  module ClassMethods
12
-
13
10
  ## this is the Sequel default:
14
11
  #
15
12
  # def create(values = {}, &block)
@@ -36,49 +33,57 @@ module Spontaneous::Plugins
36
33
  end
37
34
  new(values.merge(:_prototype => prototype), &block).save
38
35
  end
39
- end # ClassMethods
40
36
 
41
- module InstanceMethods
42
37
 
43
- def after_create
44
- super
45
- apply_prototype
38
+ # Blocks passed to the prototype call are used to create instance methods on the class
39
+ # This enables the use of `super` within the blocks and solves the otherwise tricky
40
+ # inheritance implications.
41
+ def prototype(name = nil, &block)
42
+ raise Spontaneous::InvalidPrototypeDefinitionError.new \
43
+ "Prototype definitions must accept one parameter - " \
44
+ "the content instance which the prototype is about to be applied." \
45
+ unless block.arity == 1
46
+ define_method(prototype_method_name(name), &block)
46
47
  end
47
48
 
48
- protected
49
+ def prototype_method_name(name)
50
+ return Spontaneous::Plugins::Prototypes::DEFAULT_PROTOTYPE_NAME if name.blank?
51
+ "_apply_prototype_#{name}"
52
+ end
53
+ end # ClassMethods
49
54
 
50
- DEFAULT_PROTOTYPE_METHOD = :prototype unless defined?(DEFAULT_PROTOTYPE_METHOD)
55
+ # InstanceMethods
51
56
 
52
- def apply_prototype
53
- return if _prototype == false
54
- prototype_method = DEFAULT_PROTOTYPE_METHOD
55
- unless _prototype.blank?
56
- prototype_method = "#{_prototype}_prototype".to_sym
57
- end
57
+ def after_create
58
+ super
59
+ apply_prototype
60
+ end
58
61
 
59
- if respond_to?(prototype_method)
60
- self.__send__(prototype_method)
61
- save
62
- else
63
- logger.warn {
64
- "Invalid prototype name '#{_prototype}' being passed to class #{self.class}. No method #{prototype_method} available."
65
- } unless prototype_method == DEFAULT_PROTOTYPE_METHOD
66
- end
67
- end
62
+ # Add in an empty default prototype method for subclasses to override
63
+ define_method(Spontaneous::Plugins::Prototypes::DEFAULT_PROTOTYPE_NAME) { |instance| }
68
64
 
69
- def _prototype=(prototype)
70
- @_prototype = prototype
71
- end
65
+ protected
66
+
67
+ def apply_prototype
68
+ # passing _prototype => false to the initialisation skips the prototype
69
+ return if _prototype == false
70
+ method = self.class.prototype_method_name(_prototype)
72
71
 
73
- def _prototype
74
- @_prototype
72
+ if respond_to?(method)
73
+ self.send(method, self)
74
+ else
75
+ logger.warn {
76
+ "Invalid prototype name '#{_prototype}' being passed to class #{self.class}."
77
+ }
75
78
  end
79
+ end
76
80
 
77
- end # InstanceMethods
81
+ def _prototype=(prototype)
82
+ @_prototype = prototype
83
+ end
78
84
 
85
+ def _prototype
86
+ @_prototype
87
+ end
79
88
  end
80
89
  end
81
-
82
-
83
-
84
-
@@ -1,23 +1,9 @@
1
1
  # encoding: UTF-8
2
2
 
3
- # is this unforgivable?
4
- # i think it's kinda neat, if a tad fragile (to columns named 'content'...)
5
- module Sequel
6
- class Dataset
7
- alias_method :sequel_quote_identifier, :quote_identifier
8
-
9
-
10
- def quote_identifier(name)
11
- if name == :content or name == "content"
12
- name = Spontaneous::Content.current_revision_table
13
- end
14
- sequel_quote_identifier(name)
15
- end
16
- end
17
- end
18
3
 
19
4
  module Spontaneous::Plugins
20
5
  module Publishing
6
+ extend ActiveSupport::Concern
21
7
 
22
8
  module ClassMethods
23
9
  @@dataset = nil
@@ -53,18 +39,12 @@ module Spontaneous::Plugins
53
39
  @@revision
54
40
  end
55
41
 
56
- def reset_revision
57
- @@revision, @@dataset = revision_stack.first
58
- revision_stack.clear
59
- end
60
-
61
- def with_revision(revision=nil)
62
- revision_push(revision)
63
- begin
64
- yield
65
- ensure
66
- revision_pop
67
- end if block_given?
42
+ def with_revision(revision=nil, &block)
43
+ saved_revision = @@revision
44
+ @@revision = revision
45
+ self.with_table(revision_table(revision), &block)
46
+ ensure
47
+ @@revision = saved_revision
68
48
  end
69
49
 
70
50
  def with_editable(&block)
@@ -76,12 +56,6 @@ module Spontaneous::Plugins
76
56
  with_revision(revision, &block)
77
57
  end
78
58
 
79
- def revision_push(revision)
80
- revision_stack.push([@@revision, (@@dataset || self.dataset)])
81
- @@dataset = revision_dataset(revision)
82
- @@revision = revision
83
- end
84
-
85
59
  def database
86
60
  Spontaneous.database
87
61
  end
@@ -108,7 +82,7 @@ module Spontaneous::Plugins
108
82
  published = self.filter
109
83
 
110
84
  must_publish_all = (content.nil? || (!revision_exists?(revision-1)) || \
111
- (content.is_a?(Array) && content.empty?))
85
+ (content.is_a?(Array) && content.empty?))
112
86
 
113
87
  if must_publish_all
114
88
  create_revision(revision)
@@ -173,83 +147,65 @@ module Spontaneous::Plugins
173
147
  database.drop_table(table) if revision_table?(table)
174
148
  end
175
149
  end
150
+ end # ClassMethods
176
151
 
177
- def revision_pop
178
- @@revision, @@dataset = revision_stack.pop
179
- end
180
-
181
- def revision_stack
182
- @revision_stack ||= []
183
- end
152
+ # InstanceMethods
184
153
 
185
- def revision_dataset(revision=nil)
186
- Spontaneous.database.dataset.from(revision_table(revision))
187
- end
154
+ def after_update
155
+ super
156
+ page.modified!(page?) if page
188
157
  end
189
158
 
190
- module InstanceMethods
191
- def after_update
192
- super
193
- page.modified!(page?) if page
159
+ def modified!(caller_is_page)
160
+ unless caller_is_page
161
+ self.model.where(:id => self.id).update(:modified_at => Sequel.datetime_class.now)
194
162
  end
163
+ push_page_change
164
+ end
195
165
 
196
- # def after_create
197
- # super
198
- # push_page_change
199
- # end
200
-
201
- def modified!(caller_is_page)
202
- unless caller_is_page
203
- self.model.where(:id => self.id).update(:modified_at => Sequel.datetime_class.now)
204
- end
205
- push_page_change
206
- end
166
+ def push_page_change
167
+ Spontaneous::Change.push(self) if page?
168
+ end
207
169
 
208
- def push_page_change
209
- Spontaneous::Change.push(self) if page?
210
- end
211
170
 
171
+ def with_revision(revision, &block)
172
+ self.class.with_revision(revision, &block)
173
+ end
174
+ def with_editable(&block)
175
+ self.class.with_editable(&block)
176
+ end
212
177
 
213
- def with_revision(revision, &block)
214
- self.class.with_revision(revision, &block)
215
- end
216
- def with_editable(&block)
217
- self.class.with_editable(&block)
218
- end
219
-
220
- def sync_to_revision(revision, origin=true)
221
- # 'publish' is a lock to make sure the duplication doesn't cross
222
- # page boundaries unless that's necessary (such as in the case
223
- # of a page addition)
224
- publish = origin || !self.page?
225
-
226
- with_revision(revision) do
227
- published_copy = Spontaneous::Content[self.id]
228
- if published_copy
229
- if publish and published_copy.entry_store
230
- pieces_to_delete = published_copy.entry_store - self.entry_store
231
- pieces_to_delete.each do |entry|
232
- if c = Spontaneous::Content[entry[0]]
233
- c.destroy(false)
234
- end
178
+ def sync_to_revision(revision, origin=true)
179
+ # 'publish' is a lock to make sure the duplication doesn't cross
180
+ # page boundaries unless that's necessary (such as in the case
181
+ # of a page addition)
182
+ publish = origin || !self.page?
183
+
184
+ with_revision(revision) do
185
+ published_copy = Spontaneous::Content[self.id]
186
+ if published_copy
187
+ if publish and published_copy.entry_store
188
+ pieces_to_delete = published_copy.entry_store - self.entry_store
189
+ pieces_to_delete.each do |entry|
190
+ if c = Spontaneous::Content[entry[0]]
191
+ c.destroy(false)
235
192
  end
236
193
  end
237
- else # missing content (so force a publish)
238
- Spontaneous::Content.insert({:id => self.id})
239
- publish = true
240
194
  end
195
+ else # missing content (so force a publish)
196
+ Spontaneous::Content.insert({:id => self.id})
197
+ publish = true
198
+ end
241
199
 
242
- if publish
243
- with_editable do
244
- self.pieces.each do |entry|
245
- entry.sync_to_revision(revision, false)
246
- end
200
+ if publish
201
+ with_editable do
202
+ self.pieces.each do |entry|
203
+ entry.sync_to_revision(revision, false)
247
204
  end
248
- Spontaneous::Content.where(:id => self.id).update(self.values)
249
205
  end
206
+ Spontaneous::Content.where(:id => self.id).update(self.values)
250
207
  end
251
208
  end
252
209
  end
253
210
  end
254
211
  end
255
-
@@ -2,23 +2,15 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module Render
5
+ extend ActiveSupport::Concern
5
6
 
6
- module ClassMethods
7
- end
8
-
9
- module InstanceMethods
10
- def render(format=:html, params={}, *args)
11
- if format.is_a?(Hash)
12
- params = format
13
- format = :html
14
- end
15
- Spontaneous::Render.render(self, format, params)
7
+ # InstanceMethods
8
+ def render(format=:html, params={}, *args)
9
+ if format.is_a?(Hash)
10
+ params = format
11
+ format = :html
16
12
  end
17
-
18
- # [:html].each do |format|
19
- # module_eval("def to_#{format}(*args); render(:#{format}, *args); end")
20
- # end
13
+ Spontaneous::Render.render(self, format, params, *args)
21
14
  end
22
- end
15
+ end # Render
23
16
  end
24
-
@@ -2,47 +2,45 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module SchemaHierarchy
5
+ extend ActiveSupport::Concern
6
+
5
7
  module ClassMethods
6
8
  def schema_validate
7
9
  if schema_id.nil?
8
- Spontaneous::Schema.missing_id!(:type, self)
10
+ Spontaneous.schema.missing_id!(:type, self)
9
11
  else
10
12
  # only need to check internal consistency if class already existed
11
13
  fields.each do |field|
12
- if field.schema_id.nil?
13
- Spontaneous::Schema.missing_id!(:field, field)
14
+ if field.owner == self and field.schema_id.nil?
15
+ Spontaneous.schema.missing_id!(:field, field)
14
16
  end
15
17
  end
16
18
  # boxes don't have boxes
17
19
  if respond_to?(:boxes)
18
20
  boxes.each do |box|
19
- if box.schema_id.nil?
20
- Spontaneous::Schema.missing_id!(:box, box)
21
+ if box.owner == self and box.schema_id.nil?
22
+ Spontaneous.schema.missing_id!(:box, box)
21
23
  end
22
24
  end
23
25
  end
24
26
 
25
27
  styles.each do |style|
26
- if style.schema_id.nil?
27
- Spontaneous::Schema.missing_id!(:style, style)
28
+ if style.owner == self and style.schema_id.nil?
29
+ Spontaneous.schema.missing_id!(:style, style)
28
30
  end
29
31
  end
30
32
  if respond_to?(:layouts)
31
33
  layouts.each do |layout|
32
- if layout.schema_id.nil?
33
- Spontaneous::Schema.missing_id!(:layout, layout)
34
+ if layout.owner == self and layout.schema_id.nil?
35
+ Spontaneous.schema.missing_id!(:layout, layout)
34
36
  end
35
37
  end
36
38
  end
37
39
  end
38
40
  end
39
41
 
42
+ # TODO: Delete this?
40
43
  def schema_reset!
41
- @subclasses = nil
42
- end
43
-
44
- def subclasses
45
- @subclasses ||= []
46
44
  end
47
45
 
48
46
  def __source_file=(path)
@@ -55,22 +53,23 @@ module Spontaneous::Plugins
55
53
  @__source_file
56
54
  end
57
55
 
56
+ def subclasses
57
+ Spontaneous.schema.subclasses_of(self)
58
+ end
59
+
58
60
  def descendents
59
- subclasses.map{ |x| [x] + x.descendents}.flatten
61
+ Spontaneous.schema.descendents_of(self)
60
62
  end
61
63
 
62
64
  def inherited(subclass, real_caller = nil)
63
65
  subclass.__source_file = File.expand_path((real_caller || caller[0]).split(':')[0])
64
- Spontaneous::Schema.classes << subclass if subclass.schema_class?
65
- subclasses << subclass
66
+ Spontaneous.schema.add_class(self, subclass)# if subclass.schema_class?
66
67
  super(subclass)
67
68
  end
68
69
 
69
70
  def schema_class?
70
71
  true
71
72
  end
72
- end
73
- end
73
+ end # ClassMethods
74
+ end # SchemaHierarchy
74
75
  end
75
-
76
-
@@ -2,10 +2,11 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module SchemaId
5
+ extend ActiveSupport::Concern
5
6
 
6
7
  module ClassMethods
7
8
  def schema_id
8
- Spontaneous::Schema.schema_id(self)
9
+ Spontaneous.instance.schema_id(self)
9
10
  end
10
11
 
11
12
  def schema_name
@@ -19,42 +20,49 @@ module Spontaneous::Plugins
19
20
  def owner_sid
20
21
  nil
21
22
  end
23
+
24
+ # In the case where a new class has been added to the schema
25
+ # the STI values have been set up on a class whose schema id is undefined
26
+ # so we need to correct this once a new ID has been generated
27
+ # Bit dodgy, what I should do instead is rewrite the STI code to always defer
28
+ # to the schema for its values
29
+ def update_schema_id(new_id)
30
+ sti_key_array << new_id.to_s
31
+ superclass.sti_subclass_added(new_id.to_s, self) if superclass
32
+ end
22
33
  end # ClassMethods
23
34
 
24
- module InstanceMethods
25
- [:type, :style, :box].each do |c|
26
- column = "#{c}_sid"
27
- self.class_eval(<<-RUBY)
35
+ # InstanceMethods
36
+
37
+ [:type, :style, :box].each do |c|
38
+ column = "#{c}_sid"
39
+ self.class_eval(<<-RUBY)
28
40
  def #{column}
29
- @_#{column} ||= Spontaneous::Schema::UID[@values[:#{column}]]
41
+ @_#{column} ||= Spontaneous.schema.uids[@values[:#{column}]]
30
42
  end
31
43
 
32
44
  def #{column}=(sid)
33
- @_#{column} = Spontaneous::Schema::UID[sid]
45
+ @_#{column} = Spontaneous.schema.uids[sid]
34
46
  @values[:#{column}] = @_#{column}.to_s
35
47
  @_#{column}
36
48
  end
37
- RUBY
38
- end
49
+ RUBY
50
+ end
39
51
 
40
- def schema_id
41
- self.class.schema_id
42
- end
52
+ def schema_id
53
+ self.class.schema_id
54
+ end
43
55
 
44
- def schema_name
45
- self.class.schema_name
46
- end
56
+ def schema_name
57
+ self.class.schema_name
58
+ end
47
59
 
48
- def schema_owner
49
- self.class.schema_owner
50
- end
60
+ def schema_owner
61
+ self.class.schema_owner
62
+ end
51
63
 
52
- def owner_sid
53
- self.class.owner_sid
54
- end
55
- end # InstanceMethods
64
+ def owner_sid
65
+ self.class.owner_sid
66
+ end
56
67
  end # SchemaId
57
68
  end
58
-
59
-
60
-