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
@@ -0,0 +1,26 @@
1
+ # encoding: UTF-8
2
+
3
+
4
+ module Spontaneous::Render
5
+ module RenderCache
6
+ def _render_cache_value(key)
7
+ Spontaneous::Render.render_cache_value(key)
8
+ end
9
+
10
+ def _render_cache_set_value(key, value)
11
+ Spontaneous::Render.render_cache_set_value(key, value)
12
+ end
13
+
14
+ def _render_cache_key?(key)
15
+ Spontaneous::Render.render_cache_key?(key)
16
+ end
17
+
18
+ def _with_render_cache(key, &value_block)
19
+ if _render_cache_key?(key)
20
+ self._render_cache_value(key)
21
+ else
22
+ self._render_cache_set_value(key, yield)
23
+ end
24
+ end
25
+ end # RenderCache
26
+ end # Spontaneous::Render
@@ -15,6 +15,10 @@ module Spontaneous
15
15
  # overwrite in subclasses
16
16
  end
17
17
 
18
+ def render_string(template_string, content, format=:html, params = {})
19
+ # overwrite in subclasses
20
+ end
21
+
18
22
  def template_file(filename, format)
19
23
  Render.template_file(template_root, filename, format)
20
24
  end
@@ -23,7 +27,7 @@ module Spontaneous
23
27
  Spontaneous.template_engine.extension
24
28
  end
25
29
 
26
- protected
30
+ # protected
27
31
 
28
32
  def preview_renderer
29
33
  Spontaneous.template_engine.preview_renderer.new(template_root, cache?)
@@ -0,0 +1,8 @@
1
+ # encoding: UTF-8
2
+
3
+
4
+ module Spontaneous::Render
5
+ module RequestContext
6
+ include Spontaneous::Render::ContextBase
7
+ end # RequestContext
8
+ end # Spontaneous::Render
@@ -5,13 +5,14 @@
5
5
  module Spontaneous
6
6
  module Schema
7
7
  autoload :UID, 'spontaneous/schema/uid'
8
+ autoload :UIDMap, 'spontaneous/schema/uid_map'
8
9
  autoload :SchemaModification, 'spontaneous/schema/schema_modification'
9
10
  # schema class <=> uid map backed by a file
10
11
  class PersistentMap
11
- attr_reader :map, :inverse_map
12
+ attr_reader :map, :inverse_map, :uids
12
13
 
13
- def initialize(path)
14
- @path = path
14
+ def initialize(uids, path)
15
+ @uids, @path = uids, path
15
16
  load_map
16
17
  end
17
18
 
@@ -20,11 +21,11 @@ module Spontaneous
20
21
  end
21
22
 
22
23
  def reference_to_id(reference)
23
- UID.get_id(reference)
24
+ uids.get_id(reference)
24
25
  end
25
26
 
26
27
  def [](id)
27
- if uid = UID[id]
28
+ if uid = uids[id]
28
29
  uid.target
29
30
  else
30
31
  nil
@@ -35,7 +36,7 @@ module Spontaneous
35
36
  if exists?
36
37
  map = YAML.load_file(@path)
37
38
  map.each do | uid, reference |
38
- UID.load(uid, reference)
39
+ uids.load(uid, reference)
39
40
  end
40
41
  end
41
42
  end
@@ -53,7 +54,7 @@ module Spontaneous
53
54
  # end
54
55
 
55
56
  def orphaned_ids
56
- UID.select { |uid| uid.orphaned? }
57
+ uids.select { |uid| uid.orphaned? }
57
58
  end
58
59
 
59
60
  def reload!
@@ -66,14 +67,15 @@ module Spontaneous
66
67
  # used for tests
67
68
  class TransientMap < PersistentMap
68
69
 
69
- def initialize(path)
70
+ def initialize(uids, path)
71
+ @uids = uids
70
72
  end
71
73
 
72
74
  def schema_id(obj)
73
75
  if id = super
74
76
  id
75
77
  else
76
- UID.create(obj.schema_name)
78
+ uids.create(obj.schema_name)
77
79
  end
78
80
  end
79
81
 
@@ -86,13 +88,17 @@ module Spontaneous
86
88
  end
87
89
  end
88
90
 
89
- class << self
90
- def schema_loader_class
91
- @schema_loader_class ||= PersistentMap
91
+ class Schema
92
+ attr_reader :schema_loader_class, :uids
93
+
94
+ def initialize(root, schema_loader_class = Spontaneous::Schema::PersistentMap)
95
+ @root = root
96
+ @schema_loader_class = schema_loader_class
97
+ initialize_uid_map
92
98
  end
93
99
 
94
100
  def schema_loader_class=(klass)
95
- UID.clear!
101
+ initialize_uid_map
96
102
  @map = nil
97
103
  @schema_loader_class = klass
98
104
  end
@@ -112,11 +118,13 @@ module Spontaneous
112
118
  else
113
119
  if changes.resolvable?
114
120
  logger.warn("Schema changed...")
121
+ attempts = 0
115
122
  while changes and changes.resolvable? do
116
123
  logger.warn("Fixing automatically")
117
124
  changes.resolve!
118
125
  map.reload!
119
126
  changes = perform_validation
127
+ raise "Infinite loop in schema resolution" if (attempts += 1) >= 5
120
128
  end
121
129
  write_schema
122
130
  reload!
@@ -133,16 +141,17 @@ module Spontaneous
133
141
  end
134
142
 
135
143
  def apply_fix(action, source, dest=nil)
136
- uid = S::Schema::UID[source]
144
+ uid = uids[source]
137
145
  case action
138
146
  when :delete
139
- uid.destroy
147
+ uids.destroy(uid)
140
148
  when :rename
141
149
  uid.rewrite!(dest)
142
150
  end
143
151
  write_schema
144
152
  reload!
145
153
  validate!
154
+ logger.info("✓ Schema updated successfully")
146
155
  end
147
156
 
148
157
  def generate_new_schema
@@ -157,12 +166,12 @@ module Spontaneous
157
166
 
158
167
  def write_schema
159
168
  File.atomic_write(schema_map_file) do |file|
160
- file.write(UID.export.to_yaml)
169
+ file.write(uids.export.to_yaml)
161
170
  end
162
171
  end
163
172
 
164
173
  def generate_schema_for(obj)
165
- UID.create_for(obj)
174
+ uids.create_for(obj)
166
175
  [:boxes, :fields, :styles, :layouts].each do |category|
167
176
  if obj.respond_to?(category)
168
177
  objects = obj.send(category)
@@ -220,12 +229,12 @@ module Spontaneous
220
229
 
221
230
  def export
222
231
  self.content_classes.inject({}) do |hash, klass|
223
- hash[klass.name] = klass.export
232
+ hash[klass.ui_class] = klass.export
224
233
  hash
225
234
  end
226
235
  end
227
236
 
228
- def serialise_http
237
+ def serialise_http(user = nil)
229
238
  Spontaneous.serialise_http(export)
230
239
  end
231
240
 
@@ -234,13 +243,31 @@ module Spontaneous
234
243
  @classes ||= []
235
244
  end
236
245
 
246
+ def add_class(supertype, type)
247
+ inheritance_map[supertype.to_s] << type
248
+ classes << type unless classes.include?(type)
249
+ end
250
+
251
+ def inheritance_map
252
+ @inheritance_map ||= Hash.new { |h, k| h[k] = [] }
253
+ end
254
+
255
+
256
+ def subclasses_of(type)
257
+ inheritance_map[type.to_s].map { |subclass| subclass }
258
+ end
259
+
260
+ def descendents_of(type)
261
+ subclasses_of(type).map{ |x| [x] + descendents_of(x) }.flatten
262
+ end
263
+
237
264
  # just subclasses of Content (excluding boxes)
238
265
  # only need this for the serialisation (which doesn't include boxes)
239
266
  def content_classes
240
267
  classes = []
241
- Content.subclasses.each do |klass|
268
+ self.classes.reject { |k| k.is_box? }.each do |klass|
242
269
  classes << klass unless [Spontaneous::Page, Spontaneous::Piece].include?(klass)
243
- recurse_classes(klass, classes)
270
+ # recurse_classes(klass, classes)
244
271
  end
245
272
  classes.uniq
246
273
  end
@@ -256,12 +283,17 @@ module Spontaneous
256
283
  def reset!
257
284
  Content.schema_reset!
258
285
  @classes = []
286
+ @inheritance_map = nil
259
287
  reload!
260
288
  end
261
289
 
262
290
  def reload!
263
291
  @map = nil
264
- UID.clear!
292
+ initialize_uid_map
293
+ end
294
+
295
+ def initialize_uid_map
296
+ @uids = Spontaneous::Schema::UIDMap.new
265
297
  end
266
298
 
267
299
  def delete(klass)
@@ -269,7 +301,7 @@ module Spontaneous
269
301
  end
270
302
 
271
303
  def schema_map_file
272
- @schema_map_file ||= Spontaneous.root / "config" / "schema.yml"
304
+ @schema_map_file ||= @root / "config" / "schema.yml"
273
305
  end
274
306
 
275
307
  def schema_map_file=(path)
@@ -279,7 +311,7 @@ module Spontaneous
279
311
  end
280
312
 
281
313
  def map
282
- @map ||= self.schema_loader_class.new(schema_map_file)
314
+ @map ||= self.schema_loader_class.new(@uids, schema_map_file)
283
315
  end
284
316
 
285
317
  def schema_id(obj)
@@ -140,7 +140,7 @@ module Spontaneous
140
140
  if only_added_items?
141
141
  added_items.each do |obj|
142
142
  logger.warn("Adding #{obj} to Schema")
143
- Spontaneous::Schema.generate_schema_for(obj)
143
+ Spontaneous.schema.generate_schema_for(obj)
144
144
  end
145
145
  end
146
146
 
@@ -252,7 +252,7 @@ module Spontaneous
252
252
  actions.map { |action| action.export }
253
253
  end
254
254
 
255
- def serialise_http
255
+ def serialise_http(user)
256
256
  Spontaneous.serialise_http(export)
257
257
  end
258
258
  end
@@ -6,109 +6,15 @@ require 'base58'
6
6
  module Spontaneous
7
7
  module Schema
8
8
  class UID
9
- @@instance_lock = Mutex.new
10
- @@uid_lock = Mutex.new
11
- @@uid_index = 0
12
- @@instances = {}
13
-
14
- extend Enumerable
15
- include Comparable
16
-
17
- def self.load(id, reference)
18
- @@instance_lock.synchronize do
19
- unless instance = @@instances[id]
20
- instance = self.new(id, reference)
21
- # check to make sure that the uid is valid first
22
- # this ensures that UIDs are not created before their owners
23
- # have uids
24
- if instance.valid?
25
- @@instances[id] = instance
26
- else
27
- instance = nil
28
- end
29
- end
30
- instance
31
- end
32
- end
33
-
34
- def self.create(reference)
35
- unless instance = @@instances.values.detect { |i| i.reference == reference }
36
- instance = self.load(generate(reference), reference)
37
- end
38
- instance
39
- end
40
-
41
- def existing_references
42
- @@instances.values.map { |i| i.reference }
43
- end
44
-
45
- def self.create_for(obj)
46
- create(obj.schema_name)
47
- end
48
-
49
- def self.destroy(uid)
50
- @@instance_lock.synchronize do
51
- @@instances.delete(uid.to_s)
52
- uid.after_destroy
53
- end
54
- end
55
-
56
- def self.clear!
57
- @@instances = {}
58
- end
59
-
60
- def self.[](id)
61
- return id if self === id
62
- return nil if id.blank?
63
- @@instances[id]
64
- end
65
-
66
- def self.get_id(reference)
67
- self.find { |uid| uid.reference == reference }
68
- end
69
-
70
- def self.each
71
- uids = @@instances.map { |id, instance| instance }
72
- if block_given?
73
- uids.each { |instance| yield(instance) }
74
- else
75
- uids.each
76
- end
77
- end
78
-
79
- def self.get_inc
80
- @@uid_lock.synchronize do
81
- @@uid_index = (@@uid_index + 1) % 0xFFFF
82
- end
83
- end
84
-
85
- def self.generate(ref = nil)
86
- generate58(ref)
87
- end
88
-
89
- def self.generate58(ref)
90
- # reverse the time so that sequential ids are more obviously different
91
- oid = Base58.encode((Time.now.to_f * 1000).to_i).reverse
92
- oid << Base58.encode(get_inc).rjust(3, '0')
93
- end
94
-
95
- def self.generate16(ref)
96
- oid = ''
97
- # 4 bytes current time
98
- oid = (Time.now.to_f * 1000).to_i.to_s(16)
99
- # 2 bytes inc
100
- oid << get_inc.to_s(16).rjust(4, '0')
101
- end
102
-
103
- def self.export
104
- Hash[ @@instances.map { |id, ref| [id, ref.reference] } ]
105
- end
106
9
 
107
10
  REFERENCE_SEP = "/".freeze
108
11
 
109
- attr_reader :reference, :name, :category
12
+ include Comparable
13
+
14
+ attr_reader :reference, :name, :category, :map
110
15
 
111
- def initialize(id, reference)
16
+ def initialize(map, id, reference)
17
+ @map = map
112
18
  @id = id.freeze
113
19
  read_reference(reference)
114
20
  end
@@ -119,12 +25,8 @@ module Spontaneous
119
25
  @category = @category.to_sym
120
26
  end
121
27
 
122
- class << self
123
- protected :new
124
- end
125
-
126
28
  def destroy
127
- self.class.destroy(self)
29
+ map.destroy(self)
128
30
  end
129
31
 
130
32
  def after_destroy
@@ -193,11 +95,25 @@ module Spontaneous
193
95
  alias_method :schema_owner, :owner
194
96
 
195
97
  def owner_sid
196
- self.class[@owner_sid]
98
+ map[@owner_sid]
99
+ end
100
+
101
+ def source_file
102
+ if owner
103
+ owner.__source_file
104
+ elsif target
105
+ target.__source_file
106
+ else
107
+ nil
108
+ end
197
109
  end
198
110
 
199
111
  def ==(obj)
200
- super or obj == @id
112
+ super or (obj == @id)
113
+ end
114
+
115
+ def eql?(obj)
116
+ super or (obj.is_a?(Spontaneous::Schema::UID) and obj.to_s == @id)
201
117
  end
202
118
 
203
119
  def hash