spontaneous 0.1.0.alpha1 → 0.2.0.alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. data/Gemfile +40 -35
  2. data/LICENSE +20 -0
  3. data/Rakefile +39 -42
  4. data/Readme.markdown +155 -0
  5. data/application/css/definitions.scss +3 -0
  6. data/application/css/editing.scss +9 -4
  7. data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +1 -0
  8. data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +1 -0
  9. data/application/css/min/d1b54ff4847c613618267ca1c15658e2aee0a4e5.css +1 -0
  10. data/application/css/v2.scss +144 -50
  11. data/application/js/add_alias_dialogue.js +18 -8
  12. data/application/js/ajax.js +1 -1
  13. data/application/js/authentication.js +8 -1
  14. data/application/js/box.js +37 -7
  15. data/application/js/box_container.js +1 -1
  16. data/application/js/compatibility.js +7 -0
  17. data/application/js/content.js +7 -0
  18. data/application/js/content_area.js +4 -0
  19. data/application/js/edit_panel.js +44 -18
  20. data/application/js/editing.js +12 -0
  21. data/application/js/event_source.js +17 -0
  22. data/application/js/extensions.js +2 -0
  23. data/application/js/field_types/file_field.js +2 -1
  24. data/application/js/field_types/image_field.js +35 -48
  25. data/application/js/field_types/long_string_field.js +12 -0
  26. data/application/js/field_types/markdown_field.js +2 -5
  27. data/application/js/field_types/string_field.js +5 -1
  28. data/application/js/field_types/webvideo_field.js +15 -0
  29. data/application/js/init.js +1 -0
  30. data/application/js/location.js +30 -19
  31. data/application/js/login.js +1 -2
  32. data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +3 -0
  33. data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +2 -0
  34. data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +3 -0
  35. data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +90 -0
  36. data/application/js/page.js +1 -0
  37. data/application/js/page_entry.js +6 -40
  38. data/application/js/preview.js +2 -3
  39. data/application/js/top_bar.js +76 -31
  40. data/application/js/upload.js +5 -2
  41. data/application/js/upload_manager.js +2 -81
  42. data/application/js/vendor/jquery-1.7.1.min.js +4 -0
  43. data/application/js/vendor/jquery-ui-1.8.16.custom.min.js +791 -0
  44. data/application/js/views.js +3 -3
  45. data/application/js/views/box_view.js +164 -83
  46. data/application/js/views/page_piece_view.js +2 -2
  47. data/application/js/views/page_view.js +46 -15
  48. data/application/js/views/piece_view.js +29 -8
  49. data/application/static/diagonal-texture.png +0 -0
  50. data/application/static/item-buttons-highlight.png +0 -0
  51. data/application/static/plus-box.png +0 -0
  52. data/application/static/plus_alt.svg +8 -0
  53. data/application/static/slot-up-arrow.png +0 -0
  54. data/application/views/{index.erubis → index.erb} +9 -5
  55. data/application/views/{login.erubis → login.erb} +14 -10
  56. data/application/views/schema_modification_error.html.erb +18 -6
  57. data/application/views/{unsupported.erubis → unsupported.erb} +0 -0
  58. data/bin/spot +15 -2
  59. data/db/migrations/20100610142136_init.rb +2 -2
  60. data/db/migrations/20101130104334_timestamps.rb +2 -2
  61. data/db/migrations/20110209152710_users_and_groups.rb +11 -11
  62. data/db/migrations/20120106171423_visibility_path.rb +19 -0
  63. data/db/migrations/20120107124541_owner_id.rb +19 -0
  64. data/docs/recipe-interface-screenshot.png +0 -0
  65. data/lib/cutaneous.rb +11 -10
  66. data/lib/cutaneous/context_helper.rb +119 -14
  67. data/lib/cutaneous/preview_context.rb +4 -3
  68. data/lib/cutaneous/preview_renderer.rb +1 -6
  69. data/lib/cutaneous/publish_context.rb +1 -0
  70. data/lib/cutaneous/{first_pass_renderer.rb → publish_renderer.rb} +2 -6
  71. data/lib/cutaneous/publish_template.rb +62 -0
  72. data/lib/cutaneous/publish_token_parser.rb +8 -0
  73. data/lib/cutaneous/renderer.rb +4 -2
  74. data/lib/cutaneous/request_context.rb +1 -0
  75. data/lib/cutaneous/{second_pass_renderer.rb → request_renderer.rb} +2 -5
  76. data/lib/cutaneous/request_template.rb +11 -0
  77. data/lib/cutaneous/request_token_parser.rb +9 -0
  78. data/lib/cutaneous/token_parser.rb +125 -0
  79. data/lib/sequel/plugins/content_table_inheritance.rb +19 -12
  80. data/lib/sequel/plugins/scoped_table_name.rb +45 -0
  81. data/lib/spontaneous.rb +123 -126
  82. data/lib/spontaneous/box.rb +127 -47
  83. data/lib/spontaneous/box_style.rb +39 -22
  84. data/lib/spontaneous/change.rb +2 -2
  85. data/lib/spontaneous/cli.rb +1 -0
  86. data/lib/spontaneous/cli/base.rb +12 -4
  87. data/lib/spontaneous/cli/console.rb +72 -0
  88. data/lib/spontaneous/cli/server.rb +36 -12
  89. data/lib/spontaneous/cli/site.rb +175 -1
  90. data/lib/spontaneous/collections/box_set.rb +19 -1
  91. data/lib/spontaneous/collections/entry_set.rb +70 -22
  92. data/lib/spontaneous/collections/field_set.rb +3 -3
  93. data/lib/spontaneous/collections/prototype_set.rb +28 -0
  94. data/lib/spontaneous/config.rb +14 -5
  95. data/lib/spontaneous/content.rb +23 -24
  96. data/lib/spontaneous/errors.rb +20 -4
  97. data/lib/spontaneous/extensions/array.rb +2 -2
  98. data/lib/spontaneous/extensions/json.rb +1 -1
  99. data/lib/spontaneous/extensions/nil.rb +13 -0
  100. data/lib/spontaneous/facet.rb +61 -7
  101. data/lib/spontaneous/field_types.rb +1 -3
  102. data/lib/spontaneous/field_types/date_field.rb +1 -0
  103. data/lib/spontaneous/field_types/field.rb +32 -15
  104. data/lib/spontaneous/field_types/image_field.rb +138 -69
  105. data/lib/spontaneous/field_types/location_field.rb +59 -0
  106. data/lib/spontaneous/field_types/long_string_field.rb +13 -0
  107. data/lib/spontaneous/field_types/markdown_field.rb +2 -1
  108. data/lib/spontaneous/field_types/string_field.rb +2 -2
  109. data/lib/spontaneous/field_types/webvideo_field.rb +255 -0
  110. data/lib/spontaneous/generators/page/inline.html.cut +1 -1
  111. data/lib/spontaneous/generators/page/page.html.cut.tt +5 -4
  112. data/lib/spontaneous/generators/page/page.rb.tt +1 -5
  113. data/lib/spontaneous/generators/site.rb +1 -0
  114. data/lib/spontaneous/generators/site/.gitignore +2 -0
  115. data/lib/spontaneous/generators/site/Gemfile.tt +3 -5
  116. data/lib/spontaneous/generators/site/config/environment.rb.tt +1 -0
  117. data/lib/spontaneous/generators/site/config/environments/development.rb.tt +3 -1
  118. data/lib/spontaneous/generators/site/config/environments/production.rb.tt +3 -1
  119. data/lib/spontaneous/generators/site/config/indexes.rb.tt +23 -0
  120. data/lib/spontaneous/generators/site/public/css/{site.css → site.scss} +0 -0
  121. data/lib/spontaneous/generators/site/schema/box.rb.tt +5 -0
  122. data/lib/spontaneous/generators/site/templates/layouts/standard.html.cut.tt +11 -5
  123. data/lib/spontaneous/image_size.rb +0 -1
  124. data/lib/spontaneous/loader.rb +335 -218
  125. data/lib/spontaneous/logger.rb +7 -2
  126. data/lib/spontaneous/media.rb +64 -59
  127. data/lib/spontaneous/media/file.rb +74 -0
  128. data/lib/spontaneous/page.rb +47 -18
  129. data/lib/spontaneous/page_piece.rb +29 -27
  130. data/lib/spontaneous/paths.rb +0 -1
  131. data/lib/spontaneous/permissions.rb +3 -21
  132. data/lib/spontaneous/permissions/user.rb +5 -1
  133. data/lib/spontaneous/permissions/user_level.rb +6 -7
  134. data/lib/spontaneous/piece.rb +12 -7
  135. data/lib/spontaneous/plugins/aliases.rb +76 -31
  136. data/lib/spontaneous/plugins/allowed_types.rb +36 -37
  137. data/lib/spontaneous/plugins/application/facets.rb +7 -10
  138. data/lib/spontaneous/plugins/application/features.rb +17 -0
  139. data/lib/spontaneous/plugins/application/paths.rb +25 -31
  140. data/lib/spontaneous/plugins/application/render.rb +1 -5
  141. data/lib/spontaneous/plugins/application/serialisation.rb +2 -0
  142. data/lib/spontaneous/plugins/application/state.rb +6 -9
  143. data/lib/spontaneous/plugins/boxes.rb +65 -40
  144. data/lib/spontaneous/plugins/controllers.rb +22 -22
  145. data/lib/spontaneous/plugins/entries.rb +149 -150
  146. data/lib/spontaneous/plugins/entry.rb +50 -35
  147. data/lib/spontaneous/plugins/field/editor_class.rb +13 -0
  148. data/lib/spontaneous/plugins/fields.rb +41 -33
  149. data/lib/spontaneous/plugins/instance_code.rb +9 -9
  150. data/lib/spontaneous/plugins/layouts.rb +31 -35
  151. data/lib/spontaneous/plugins/media.rb +31 -32
  152. data/lib/spontaneous/plugins/page/formats.rb +56 -31
  153. data/lib/spontaneous/plugins/page/request.rb +15 -9
  154. data/lib/spontaneous/plugins/page_search.rb +30 -31
  155. data/lib/spontaneous/plugins/page_tree.rb +59 -12
  156. data/lib/spontaneous/plugins/paths.rb +84 -79
  157. data/lib/spontaneous/plugins/permissions.rb +26 -28
  158. data/lib/spontaneous/plugins/prototypes.rb +42 -37
  159. data/lib/spontaneous/plugins/publishing.rb +50 -94
  160. data/lib/spontaneous/plugins/render.rb +8 -16
  161. data/lib/spontaneous/plugins/schema_hierarchy.rb +20 -21
  162. data/lib/spontaneous/plugins/schema_id.rb +33 -25
  163. data/lib/spontaneous/plugins/schema_title.rb +3 -4
  164. data/lib/spontaneous/plugins/serialisation.rb +32 -35
  165. data/lib/spontaneous/plugins/site/features.rb +32 -0
  166. data/lib/spontaneous/plugins/site/instance.rb +3 -2
  167. data/lib/spontaneous/plugins/site/level.rb +18 -0
  168. data/lib/spontaneous/plugins/site/map.rb +2 -1
  169. data/lib/spontaneous/plugins/site/publishing.rb +56 -59
  170. data/lib/spontaneous/plugins/site/revisions.rb +24 -19
  171. data/lib/spontaneous/plugins/site/schema.rb +33 -0
  172. data/lib/spontaneous/plugins/site/search.rb +43 -0
  173. data/lib/spontaneous/plugins/site/selectors.rb +35 -30
  174. data/lib/spontaneous/plugins/site/storage.rb +63 -0
  175. data/lib/spontaneous/plugins/site_map.rb +23 -25
  176. data/lib/spontaneous/plugins/styles.rb +35 -43
  177. data/lib/spontaneous/plugins/supertype.rb +3 -1
  178. data/lib/spontaneous/plugins/visibility.rb +90 -83
  179. data/lib/spontaneous/prototypes/box_prototype.rb +55 -25
  180. data/lib/spontaneous/prototypes/field_prototype.rb +66 -19
  181. data/lib/spontaneous/prototypes/style_prototype.rb +2 -2
  182. data/lib/spontaneous/publishing.rb +1 -1
  183. data/lib/spontaneous/publishing/immediate.rb +128 -49
  184. data/lib/spontaneous/publishing/simultaneous.rb +70 -0
  185. data/lib/spontaneous/rack.rb +38 -26
  186. data/lib/spontaneous/rack/around_back.rb +3 -23
  187. data/lib/spontaneous/rack/around_preview.rb +3 -8
  188. data/lib/spontaneous/rack/assets.rb +7 -6
  189. data/lib/spontaneous/rack/authentication.rb +21 -0
  190. data/lib/spontaneous/rack/back.rb +310 -331
  191. data/lib/spontaneous/rack/cacheable_file.rb +27 -0
  192. data/lib/spontaneous/rack/cookie_authentication.rb +38 -0
  193. data/lib/spontaneous/rack/css.rb +43 -0
  194. data/lib/spontaneous/rack/event_source.rb +31 -0
  195. data/lib/spontaneous/rack/front.rb +30 -8
  196. data/lib/spontaneous/rack/helpers.rb +31 -0
  197. data/lib/spontaneous/rack/media.rb +22 -21
  198. data/lib/spontaneous/rack/public.rb +2 -1
  199. data/lib/spontaneous/rack/query_authentication.rb +35 -0
  200. data/lib/spontaneous/rack/reloader.rb +6 -3
  201. data/lib/spontaneous/rack/user_helpers.rb +28 -0
  202. data/lib/spontaneous/render.rb +64 -23
  203. data/lib/spontaneous/render/context_base.rb +143 -0
  204. data/lib/spontaneous/render/format.rb +24 -19
  205. data/lib/spontaneous/render/helpers.rb +14 -0
  206. data/lib/spontaneous/render/helpers/html_helper.rb +69 -0
  207. data/lib/spontaneous/render/helpers/script_helper.rb +17 -0
  208. data/lib/spontaneous/render/helpers/stylesheet_helper.rb +16 -0
  209. data/lib/spontaneous/render/preview_context.rb +8 -0
  210. data/lib/spontaneous/render/preview_renderer.rb +6 -0
  211. data/lib/spontaneous/render/publish_context.rb +22 -0
  212. data/lib/spontaneous/render/published_renderer.rb +12 -13
  213. data/lib/spontaneous/render/publishing_renderer.rb +3 -0
  214. data/lib/spontaneous/render/render_cache.rb +26 -0
  215. data/lib/spontaneous/render/renderer.rb +5 -1
  216. data/lib/spontaneous/render/request_context.rb +8 -0
  217. data/lib/spontaneous/schema.rb +56 -24
  218. data/lib/spontaneous/schema/schema_modification.rb +2 -2
  219. data/lib/spontaneous/schema/uid.rb +22 -106
  220. data/lib/spontaneous/schema/uid_map.rb +120 -0
  221. data/lib/spontaneous/search.rb +11 -0
  222. data/lib/spontaneous/search/compound_indexer.rb +26 -0
  223. data/lib/spontaneous/search/database.rb +72 -0
  224. data/lib/spontaneous/search/field.rb +95 -0
  225. data/lib/spontaneous/search/index.rb +184 -0
  226. data/lib/spontaneous/search/results.rb +34 -0
  227. data/lib/spontaneous/server.rb +5 -1
  228. data/lib/spontaneous/site.rb +56 -16
  229. data/lib/spontaneous/storage.rb +22 -0
  230. data/lib/spontaneous/storage/backend.rb +10 -0
  231. data/lib/spontaneous/storage/cloud.rb +104 -0
  232. data/lib/spontaneous/storage/local.rb +52 -0
  233. data/lib/spontaneous/style.rb +27 -9
  234. data/lib/spontaneous/version.rb +1 -1
  235. data/spontaneous.gemspec +719 -0
  236. data/test/disabled/test_slots.rb +1 -1
  237. data/test/experimental/test_cutaneous.rb +309 -0
  238. data/test/experimental/test_features.rb +129 -0
  239. data/test/fixtures/application/views/{index.erubis → index.erb} +0 -0
  240. data/test/fixtures/back/public/css/sass_include.scss +5 -0
  241. data/test/fixtures/back/public/css/sass_template.scss +4 -0
  242. data/test/fixtures/example_application/templates/client_project.html.cut +4 -4
  243. data/test/fixtures/example_application/templates/client_project/images.html.cut +1 -1
  244. data/test/fixtures/example_application/templates/client_projects.html.cut +2 -2
  245. data/test/fixtures/example_application/templates/inline_image.html.cut +1 -1
  246. data/test/fixtures/example_application/templates/layouts/home.html.cut +7 -7
  247. data/test/fixtures/example_application/templates/layouts/info.html.cut +1 -1
  248. data/test/fixtures/example_application/templates/layouts/project.html.cut +4 -4
  249. data/test/fixtures/example_application/templates/layouts/projects.html.cut +2 -2
  250. data/test/fixtures/example_application/templates/project.html.cut +2 -2
  251. data/test/fixtures/example_application/templates/project/inline.html.cut +3 -3
  252. data/test/fixtures/example_application/templates/project_image.html.cut +1 -1
  253. data/test/fixtures/example_application/templates/text.html.cut +1 -1
  254. data/test/fixtures/fields/youtube_api_response.xml +102 -0
  255. data/test/fixtures/layouts/layouts/custom4.html.cut +0 -0
  256. data/test/fixtures/plugins/schema_plugin/public/css/plugin.css +1 -0
  257. data/test/fixtures/plugins/schema_plugin/public/js/plugin.js +1 -0
  258. data/test/fixtures/plugins/schema_plugin/public/static.html +1 -0
  259. data/test/fixtures/plugins/schema_plugin/public/subdir/image.gif +1 -0
  260. data/test/fixtures/plugins/schema_plugin/public/subdir/include1.scss +3 -0
  261. data/test/fixtures/plugins/schema_plugin/public/subdir/sass.scss +4 -0
  262. data/test/fixtures/plugins/schema_plugin/public/subdir/sass/include2.scss +4 -0
  263. data/test/fixtures/public/templates/layouts/default.html.cut +1 -1
  264. data/test/fixtures/public/templates/layouts/default.pdf.cut +1 -1
  265. data/test/fixtures/public/templates/layouts/default.rss.cut +1 -1
  266. data/test/fixtures/public/templates/layouts/dynamic.html.cut +1 -1
  267. data/test/fixtures/schema_modification/config/database.yml +0 -0
  268. data/test/fixtures/schema_modification/config/environment.rb +2 -0
  269. data/test/fixtures/schema_modification/schema/box.rb +1 -0
  270. data/test/fixtures/schema_modification/schema/custom_box.rb +1 -0
  271. data/test/fixtures/schema_modification/schema/page.rb +6 -0
  272. data/test/fixtures/schema_modification/schema/piece.rb +1 -0
  273. data/test/fixtures/search/config/database.yml +1 -0
  274. data/test/fixtures/search/config/indexes.rb +4 -0
  275. data/test/fixtures/serialisation/root_hash.yaml.erb +16 -20
  276. data/test/fixtures/storage/cloud/environment.rb +12 -0
  277. data/test/fixtures/storage/default/environment.rb +1 -0
  278. data/test/fixtures/templates/aliases/layouts/c_alias.html.cut +1 -1
  279. data/test/fixtures/templates/content/include.html.cut +1 -1
  280. data/test/fixtures/templates/content/include_dir.html.cut +1 -1
  281. data/test/fixtures/templates/content/included.epub.cut +1 -1
  282. data/test/fixtures/templates/content/included.html.cut +1 -1
  283. data/test/fixtures/templates/content/partial/included.html.cut +1 -1
  284. data/test/fixtures/templates/content/preprocess.html.cut +1 -1
  285. data/test/fixtures/templates/content/second.html.cut +1 -1
  286. data/test/fixtures/templates/content/template.epub.cut +1 -1
  287. data/test/fixtures/templates/content/template.html.cut +1 -1
  288. data/test/fixtures/templates/default_style_class.html.cut +1 -1
  289. data/test/fixtures/templates/engine/braces.html.cut +6 -0
  290. data/test/fixtures/templates/engine/multiline.html.cut +5 -0
  291. data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
  292. data/test/fixtures/templates/extended/main.html.cut +5 -5
  293. data/test/fixtures/templates/extended/parent.html.cut +10 -8
  294. data/test/fixtures/templates/extended/partial.html.cut +1 -0
  295. data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -0
  296. data/test/fixtures/templates/extended/with_includes.html.cut +9 -0
  297. data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +9 -0
  298. data/test/fixtures/templates/layouts/entries.html.cut +7 -7
  299. data/test/fixtures/templates/layouts/page_style.html.cut +1 -1
  300. data/test/fixtures/templates/layouts/params.html.cut +1 -1
  301. data/test/fixtures/templates/layouts/preview_render.html.cut +2 -2
  302. data/test/fixtures/templates/layouts/standard_page.html.cut +1 -1
  303. data/test/fixtures/templates/layouts/subdir_style.html.cut +1 -1
  304. data/test/fixtures/templates/layouts/template_params.html.cut +1 -1
  305. data/test/fixtures/templates/layouts/variables.html.cut +7 -0
  306. data/test/fixtures/templates/page_class/inline_style.html.cut +1 -1
  307. data/test/fixtures/templates/preview_render/variables.html.cut +1 -0
  308. data/test/fixtures/templates/publishing/templates/layouts/dynamic.html.cut +1 -0
  309. data/test/fixtures/templates/publishing/templates/layouts/dynamic.rtf.cut +1 -0
  310. data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -0
  311. data/test/fixtures/templates/template_class/anonymous_style.html.cut +2 -2
  312. data/test/fixtures/templates/template_class/complex_template.html.cut +4 -4
  313. data/test/fixtures/templates/template_class/complex_template.pdf.cut +4 -4
  314. data/test/fixtures/templates/template_class/default_template_style.html.cut +2 -2
  315. data/test/fixtures/templates/template_class/images_with_template.html.cut +3 -3
  316. data/test/fixtures/templates/template_class/slots_template.html.cut +3 -3
  317. data/test/fixtures/templates/template_class/slots_template.pdf.cut +3 -3
  318. data/test/fixtures/templates/template_class/this_template.epub.cut +1 -1
  319. data/test/fixtures/templates/template_class/this_template.html.cut +1 -1
  320. data/test/fixtures/templates/template_class/this_template.pdf.cut +1 -1
  321. data/test/fixtures/templates/with_default_style_class.html.cut +1 -1
  322. data/test/functional/test_application.rb +19 -15
  323. data/test/functional/test_back.rb +130 -98
  324. data/test/functional/test_front.rb +72 -28
  325. data/test/javascript/test_dom.rb +1 -1
  326. data/test/javascript/test_markdown.rb +1 -1
  327. data/test/slow/test_publishing.rb +94 -75
  328. data/test/slow/test_visibility.rb +47 -14
  329. data/test/test_helper.rb +30 -3
  330. data/test/ui/test_page_editing.rb +1 -1
  331. data/test/unit/test_alias.rb +200 -16
  332. data/test/unit/test_authentication.rb +26 -28
  333. data/test/unit/test_boxes.rb +146 -75
  334. data/test/unit/test_config.rb +42 -20
  335. data/test/unit/test_content.rb +156 -37
  336. data/test/unit/test_content_inheritance.rb +4 -2
  337. data/test/unit/test_extensions.rb +7 -1
  338. data/test/unit/test_fields.rb +558 -290
  339. data/test/{experimental → unit}/test_formats.rb +42 -3
  340. data/test/unit/test_generators.rb +3 -2
  341. data/test/unit/test_helpers.rb +54 -0
  342. data/test/unit/test_image_size.rb +1 -1
  343. data/test/unit/test_images.rb +51 -40
  344. data/test/unit/test_layouts.rb +21 -4
  345. data/test/unit/test_logger.rb +1 -1
  346. data/test/unit/test_media.rb +165 -7
  347. data/test/unit/test_page.rb +158 -27
  348. data/test/unit/test_permissions.rb +170 -187
  349. data/test/unit/test_piece.rb +27 -9
  350. data/test/unit/test_plugins.rb +153 -0
  351. data/test/unit/test_prototype_set.rb +60 -2
  352. data/test/unit/test_prototypes.rb +81 -20
  353. data/test/unit/test_render.rb +97 -9
  354. data/test/unit/test_schema.rb +167 -120
  355. data/test/unit/test_search.rb +588 -0
  356. data/test/unit/test_serialisation.rb +26 -10
  357. data/test/unit/test_site.rb +42 -25
  358. data/test/unit/test_storage.rb +88 -0
  359. data/test/unit/test_structure.rb +11 -5
  360. data/test/unit/test_styles.rb +64 -3
  361. data/test/unit/test_table_scoping.rb +76 -0
  362. data/test/unit/test_templates.rb +69 -31
  363. data/test/unit/test_type_hierarchy.rb +9 -1
  364. metadata +274 -208
  365. data/Gemfile.lock +0 -146
  366. data/application/css/min/54ee0ed3c7fac7632bd5c020d69e9a2503e0c88c.css +0 -1
  367. data/application/css/min/c256adc144e2bdd0b0539356b04eb62db01e1dc3.css +0 -1
  368. data/application/js/edit_dialogue.js +0 -137
  369. data/application/js/min/492a209de8ee955fa9c729a765377495001e11b1.js +0 -17
  370. data/application/js/min/80f684d77c940887a1d4a63e3a96102e993baa98.js +0 -88
  371. data/application/js/min/c7140ec9475e5bf868b901e0621338d7d162358b.js +0 -3
  372. data/application/js/min/f07f2bd6630ee31e1c2288ec223383d8f0658ba6.js +0 -2
  373. data/application/js/vendor/.DS_Store +0 -0
  374. data/application/js/vendor/JS.Class-2.1.5/src/command.js +0 -93
  375. data/application/js/vendor/JS.Class-2.1.5/src/comparable.js +0 -37
  376. data/application/js/vendor/JS.Class-2.1.5/src/constant_scope.js +0 -48
  377. data/application/js/vendor/JS.Class-2.1.5/src/core.js +0 -1060
  378. data/application/js/vendor/JS.Class-2.1.5/src/decorator.js +0 -50
  379. data/application/js/vendor/JS.Class-2.1.5/src/enumerable.js +0 -505
  380. data/application/js/vendor/JS.Class-2.1.5/src/forwardable.js +0 -22
  381. data/application/js/vendor/JS.Class-2.1.5/src/hash.js +0 -334
  382. data/application/js/vendor/JS.Class-2.1.5/src/linked_list.js +0 -114
  383. data/application/js/vendor/JS.Class-2.1.5/src/loader.js +0 -553
  384. data/application/js/vendor/JS.Class-2.1.5/src/method_chain.js +0 -172
  385. data/application/js/vendor/JS.Class-2.1.5/src/observable.js +0 -55
  386. data/application/js/vendor/JS.Class-2.1.5/src/package.js +0 -472
  387. data/application/js/vendor/JS.Class-2.1.5/src/proxy.js +0 -58
  388. data/application/js/vendor/JS.Class-2.1.5/src/ruby.js +0 -44
  389. data/application/js/vendor/JS.Class-2.1.5/src/set.js +0 -332
  390. data/application/js/vendor/JS.Class-2.1.5/src/stack_trace.js +0 -151
  391. data/application/js/vendor/JS.Class-2.1.5/src/state.js +0 -95
  392. data/application/js/vendor/JS.Class-2.1.5/src/stdlib.js +0 -2612
  393. data/application/js/vendor/jquery-1.4.2.min.js +0 -154
  394. data/application/js/vendor/jquery-1.4.3.min.js +0 -166
  395. data/application/js/vendor/jquery-1.5.1.min.js +0 -16
  396. data/application/js/vendor/jquery-1.5.1rc1.min.js +0 -24
  397. data/application/js/vendor/jquery-ui-1.8.6.custom.min.js +0 -265
  398. data/application/js/vendor/jquery-ui-1.8.custom.min.js +0 -106
  399. data/application/js/vendor/jquery.hotkeys-0.7.9.js +0 -248
  400. data/application/js/vendor/jquery.hotkeys-0.7.9.min.js +0 -19
  401. data/application/js/vendor/jsdiff.js +0 -169
  402. data/lib/cutaneous/first_pass_parser.rb +0 -23
  403. data/lib/cutaneous/parser_core.rb +0 -18
  404. data/lib/cutaneous/second_pass_parser.rb +0 -23
  405. data/lib/sequel/plugins/yajl_serialization.rb +0 -154
  406. data/lib/spontaneous/plugins.rb +0 -20
  407. data/lib/spontaneous/proxy_object.rb +0 -12
  408. data/lib/spontaneous/publishing/fire_and_forget.rb +0 -57
  409. data/lib/spontaneous/render/context.rb +0 -100
  410. data/spontaneous.gemspec.tmpl +0 -66
  411. data/test/experimental/test_plugins.rb +0 -64
  412. data/test/fixtures/templates/publishing/layouts/dynamic.html.cut +0 -1
  413. data/test/fixtures/templates/publishing/layouts/static.html.cut +0 -1
@@ -2,6 +2,7 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module SchemaTitle
5
+ extend ActiveSupport::Concern
5
6
 
6
7
  module ClassMethods
7
8
  def class_name_with_fallback
@@ -26,8 +27,6 @@ module Spontaneous::Plugins
26
27
  def title=(title)
27
28
  @title = title
28
29
  end
29
- end
30
-
31
- end
30
+ end # ClassMethods
31
+ end # SchemaTitle
32
32
  end
33
-
@@ -1,67 +1,64 @@
1
1
  # encoding: UTF-8
2
2
 
3
-
4
3
  module Spontaneous::Plugins
5
4
  module Serialisation
5
+ extend ActiveSupport::Concern
6
6
 
7
7
  module ClassMethods
8
- def export
8
+ def export(user = nil)
9
9
  {
10
10
  :type=> self.ui_class,
11
11
  :id => self.schema_id.to_s,
12
12
  :is_page => self.page?,
13
13
  :is_alias => self.alias?,
14
14
  :title=> self.title,
15
- :fields => readable_fields.map { |name| field_prototypes[name].export },
16
- :styles => readable_styles.map { |style| style.export },
17
- :boxes => readable_boxes.map { |box| box.export },
15
+ :fields => readable_fields(user).map { |name| field_prototypes[name].export(user) },
16
+ :styles => readable_styles(user).map { |style| style.export(user) },
17
+ :boxes => readable_boxes(user).map { |box| box.export(user) },
18
18
  :source => self.__source_file
19
19
  }
20
20
  end
21
21
 
22
- def readable_styles
22
+ def readable_styles(user)
23
23
  styles
24
24
  end
25
25
 
26
- def readable_boxes
27
- boxes.select { |box| box.readable? }
26
+ def readable_boxes(user)
27
+ boxes.select { |box| box.readable?(user) }
28
28
  end
29
29
 
30
- def readable_fields
31
- field_names.select { |name| field_readable?(name) }
30
+ def readable_fields(user)
31
+ field_names.select { |name| field_readable?(user, name) }
32
32
  end
33
33
 
34
- def serialise_http
35
- Spontaneous.serialise_http(export)
34
+ def serialise_http(user = nil)
35
+ Spontaneous.serialise_http(export(user))
36
36
  end
37
37
 
38
38
  end # ClassMethods
39
39
 
40
- module InstanceMethods
41
- def shallow_export
42
- {
43
- :id => id,
44
- :type => self.class.ui_class,
45
- :type_id => self.class.schema_id.to_s,
46
- :is_page => page?,
47
- :hidden => (hidden? ? true : false),
48
- :depth => content_depth,
49
- :fields => fields.export,
50
- :label => label
51
- }
52
- end
40
+ # InstanceMethods
53
41
 
54
- def export
55
- shallow_export.merge({
56
- :boxes => self.class.readable_boxes.map { |box| boxes[box.name].export }
57
- })
58
- end
42
+ def shallow_export(user)
43
+ { :id => id,
44
+ :type => self.class.ui_class,
45
+ :type_id => self.class.schema_id.to_s,
46
+ :is_page => page?,
47
+ :hidden => (hidden? ? true : false),
48
+ :depth => content_depth,
49
+ :fields => fields.export(user),
50
+ :label => label }
51
+ end
59
52
 
53
+ def export(user = nil)
54
+ shallow_export(user).merge({
55
+ :boxes => self.class.readable_boxes(user).map { |box| boxes[box.name].export(user) }
56
+ })
57
+ end
60
58
 
61
- def serialise_http
62
- Spontaneous.serialise_http(export)
63
- end
64
- end # InstanceMethods
59
+
60
+ def serialise_http(user = nil)
61
+ Spontaneous.serialise_http(export(user))
62
+ end
65
63
  end # Serialisation
66
64
  end # Spontaneous::Plugins
67
-
@@ -0,0 +1,32 @@
1
+ # encoding: UTF-8
2
+
3
+
4
+ module Spontaneous::Plugins::Site
5
+ module Features
6
+ extend ActiveSupport::Concern
7
+
8
+ # InstanceMethods
9
+ def back_controllers
10
+ @back_controllers ||= []
11
+ end
12
+
13
+ def front_controllers
14
+ @front_controllers ||= []
15
+ end
16
+
17
+ def register_back_controller(namespace, controller_class)
18
+ Spontaneous::Rack.make_back_controller(controller_class)
19
+ controller_class.requires_authentication!
20
+ back_controllers << [namespace_url(namespace), controller_class]
21
+ end
22
+
23
+ def register_front_controller(namespace, controller_class)
24
+ Spontaneous::Rack.make_front_controller(controller_class)
25
+ front_controllers << [namespace_url(namespace), controller_class]
26
+ end
27
+
28
+ def namespace_url(namespace)
29
+ "/@#{namespace}"
30
+ end
31
+ end # Features
32
+ end
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Spontaneous::Plugins::Site
4
4
  module Instance
5
+ extend ActiveSupport::Concern
6
+
5
7
  module ClassMethods
6
8
  extend Forwardable
7
9
 
@@ -17,6 +19,5 @@ module Spontaneous::Plugins::Site
17
19
 
18
20
  def_delegators :instance, :config, :database, :database=
19
21
  end # ClassMethods
20
- end # Map
22
+ end # Instance
21
23
  end
22
-
@@ -0,0 +1,18 @@
1
+ # encoding: UTF-8
2
+
3
+ module Spontaneous::Plugins::Site
4
+ module Level
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def at_depth(level)
9
+ case level
10
+ when 0, :root
11
+ Spontaneous::Site.root
12
+ when 1, :section
13
+ Spontaneous::Site.root.at_depth(1)
14
+ end
15
+ end
16
+ end # ClassMethods
17
+ end # Level
18
+ end
@@ -2,8 +2,9 @@
2
2
 
3
3
  module Spontaneous::Plugins::Site
4
4
  module Map
5
- module ClassMethods
5
+ extend ActiveSupport::Concern
6
6
 
7
+ module ClassMethods
7
8
  def map(root_id=nil)
8
9
  page = \
9
10
  if root_id.nil?
@@ -1,74 +1,71 @@
1
1
  # encoding: UTF-8
2
2
 
3
+ module Spontaneous::Plugins::Site
4
+ module Publishing
5
+ extend ActiveSupport::Concern
3
6
 
4
- module Spontaneous::Plugins
5
- module Site
6
- module Publishing
7
- module ClassMethods
7
+ module ClassMethods
8
+ def default_publishing_method
9
+ resolve_publishing_method(Spontaneous::Site.config.publishing_method || :immediate)
10
+ end
8
11
 
9
- def default_publishing_method
10
- resolve_publishing_method(Spontaneous::Site.config.publishing_method || :immediate)
11
- end
12
-
13
- def publishing_method
14
- @publishing_method ||= default_publishing_method
15
- end
12
+ def publishing_method
13
+ @publishing_method ||= default_publishing_method
14
+ end
16
15
 
17
- def publishing_method=(method)
18
- @publishing_method = resolve_publishing_method(method)
19
- end
20
-
21
- def resolve_publishing_method(method)
22
- klass_name = method.to_s.camelize
23
- begin
24
- S::Publishing.const_get(klass_name)
25
- rescue NameError => e
26
- puts "Unknown method #{method} (#{klass_name})"
27
- S::Publishing::Immediate
28
- end
29
- end
16
+ def publishing_method=(method)
17
+ @publishing_method = resolve_publishing_method(method)
18
+ end
30
19
 
31
- def publish_changes(change_list=nil)
32
- publishing_method.new(self.revision).publish_changes(change_list)
20
+ def resolve_publishing_method(method)
21
+ klass_name = method.to_s.camelize
22
+ begin
23
+ S::Publishing.const_get(klass_name)
24
+ rescue NameError => e
25
+ puts "Unknown method #{method} (#{klass_name})"
26
+ S::Publishing::Immediate
33
27
  end
28
+ end
34
29
 
35
- def publish_all
36
- publishing_method.new(self.revision).publish_all
37
- end
30
+ def publish_changes(change_list=nil)
31
+ publishing_method.new(self.revision).publish_changes(change_list)
32
+ end
38
33
 
39
- def publishing_status
40
- status = rest = nil
41
- # if r = S::Site.pending_revision
42
- status, *rest = publishing_method.status.split(':')
43
- rest = rest.join(':')
44
- # end
45
- Hash[[:status, :progress].zip([status, rest])] rescue ""
46
- end
34
+ def publish_all
35
+ publishing_method.new(self.revision).publish_all
36
+ end
47
37
 
48
- def publishing_status=(status)
49
- publishing_method.status = status
50
- end
38
+ def publishing_status
39
+ status = rest = nil
40
+ # if r = S::Site.pending_revision
41
+ status, *rest = publishing_method.status.split(':')
42
+ rest = rest.join(':')
43
+ # end
44
+ Hash[[:status, :progress].zip([status, rest])] rescue ""
45
+ end
51
46
 
52
- def with_published(&block)
53
- S::Content.with_published(&block)
54
- end
47
+ def publishing_status=(status)
48
+ publishing_method.status = status
49
+ end
55
50
 
56
- protected
51
+ def with_published(&block)
52
+ S::Content.with_published(&block)
53
+ end
57
54
 
58
- def set_published_revision(revision)
59
- instance = S::State.instance
60
- instance.published_revision = revision
61
- instance.revision = revision + 1
62
- instance.save
63
- end
55
+ protected
64
56
 
65
- def pending_revision=(revision)
66
- instance = S::State.instance
67
- instance.pending_revision = revision
68
- instance.save
69
- end
70
- end # ClassMethods
71
- end # Publishing
72
- end # Site
73
- end # Spontaneous::Plugins
57
+ def set_published_revision(revision)
58
+ instance = S::State.instance
59
+ instance.published_revision = revision
60
+ instance.revision = revision + 1
61
+ instance.save
62
+ end
74
63
 
64
+ def pending_revision=(revision)
65
+ instance = S::State.instance
66
+ instance.pending_revision = revision
67
+ instance.save
68
+ end
69
+ end # ClassMethods
70
+ end # Publishing
71
+ end # Spontaneous::Plugins::Site
@@ -1,28 +1,33 @@
1
1
  # encoding: UTF-8
2
2
 
3
+ module Spontaneous::Plugins::Site
4
+ module Revisions
5
+ extend ActiveSupport::Concern
3
6
 
4
- module Spontaneous::Plugins
5
- module Site
6
- module Revisions
7
- module ClassMethods
8
- def working_revision
9
- Spontaneous::State.revision
10
- end
7
+ module ClassMethods
8
+ def working_revision
9
+ Spontaneous::State.revision
10
+ end
11
11
 
12
- def revision
13
- Spontaneous::State.revision
14
- end
12
+ def revision
13
+ Spontaneous::State.revision
14
+ end
15
15
 
16
- def published_revision
17
- Spontaneous::State.published_revision
18
- end
16
+ def published_revision
17
+ Spontaneous::State.published_revision
18
+ end
19
19
 
20
- def pending_revision
21
- Spontaneous::State.pending_revision
22
- end
20
+ def pending_revision
21
+ Spontaneous::State.pending_revision
22
+ end
23
23
 
24
+ def revision_root(*path)
25
+ instance.revision_root(*path)
24
26
  end
25
- end
26
- end
27
- end
28
27
 
28
+ def revision_dir(revision=nil, root = nil)
29
+ instance.revision_dir(revision, root)
30
+ end
31
+ end # ClassMethods
32
+ end # Revisions
33
+ end
@@ -0,0 +1,33 @@
1
+ # encoding: UTF-8
2
+
3
+ module Spontaneous::Plugins::Site
4
+ module Schema
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def schema
9
+ instance.schema
10
+ end
11
+ end # ClassMethods
12
+
13
+ def uid
14
+ schema.uids
15
+ end
16
+
17
+ def schema_id(obj)
18
+ schema.schema_id(obj)
19
+ end
20
+
21
+ def schema
22
+ @schema ||= Spontaneous::Schema::Schema.new(root, schema_loader_class)
23
+ end
24
+
25
+ def schema_loader_class
26
+ @schema_loader_class ||= Spontaneous::Schema::PersistentMap
27
+ end
28
+
29
+ def schema_loader_class=(loader_class)
30
+ @schema_loader_class = loader_class
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,43 @@
1
+ # encoding: UTF-8
2
+
3
+ module Spontaneous::Plugins::Site
4
+ module Search
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def index(name, &definition)
9
+ instance.index(name, &definition)
10
+ end
11
+
12
+ def indexes
13
+ instance.indexes
14
+ end
15
+
16
+ def indexer(revision)
17
+ indexer = S::Search::CompoundIndexer.new(revision, indexes.values)
18
+ begin
19
+ yield(indexer)
20
+ ensure
21
+ indexer.close
22
+ end
23
+ end
24
+ end # ClassMethods
25
+
26
+ def indexes
27
+ @indexes ||= {}
28
+ end
29
+
30
+ def [](name)
31
+ indexes[name.to_sym]
32
+ end
33
+
34
+ def []=(name, index)
35
+ indexes[name.to_sym] = index
36
+ end
37
+
38
+ def index(name, &definition)
39
+ index = S::Search::Index.new(name, &definition)
40
+ self[name] = index
41
+ end
42
+ end
43
+ end