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,50 +2,65 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module Entry
5
- module InstanceMethods
5
+ extend ActiveSupport::Concern
6
6
 
7
- # kept to allow access to pages & pieces as they would be seen when
8
- # accessed as an entry in a box
9
- def entry
10
- self
11
- end
7
+ # InstanceMethods
12
8
 
13
- def box_sid
14
- @box_sid ||= Spot::Schema::UID[self[:box_sid]]
15
- end
9
+ # kept to allow access to pages & pieces as they would be seen when
10
+ # accessed as an entry in a box
11
+ def entry
12
+ self
13
+ end
16
14
 
17
- def box_sid=(sid)
18
- self[:box_sid] = sid.to_s
19
- end
15
+ def box_sid
16
+ @box_sid ||= Spontaneous.schema.uids[self[:box_sid]]
17
+ end
20
18
 
21
- def box
22
- container.boxes.sid(box_sid) if container
23
- end
19
+ def box_sid=(sid)
20
+ self[:box_sid] = sid.to_s
21
+ end
24
22
 
25
- def first?
26
- container.pieces.first == self
27
- end
23
+ def box
24
+ owner.boxes.sid(box_sid) if owner
25
+ end
28
26
 
29
- def last?
30
- container.pieces.last == self
31
- end
27
+ alias_method :container, :box
32
28
 
33
- def set_position(new_position)
34
- if box
35
- box.set_position(self, new_position)
36
- else
37
- container.pieces.set_position(self, new_position)
38
- end
39
- end
29
+ def first?
30
+ container.contents.first == self
31
+ end
40
32
 
41
- def position
42
- container.pieces.index(self)
43
- end
33
+ def last?
34
+ container.contents.last == self
35
+ end
36
+
37
+ def next
38
+ return nil if last?
39
+ container.contents[position + 1]
40
+ end
41
+
42
+ def previous
43
+ return nil if first?
44
+ container.contents[position - 1]
45
+ end
46
+
47
+ alias_method :prev, :previous
44
48
 
45
- def serialize_db
46
- [self.id]
49
+ def set_position(new_position)
50
+ if box
51
+ box.set_position(self, new_position)
52
+ else
53
+ owner.pieces.set_position(self, new_position)
47
54
  end
48
- end # InstanceMethods
55
+ end
56
+
57
+ def position
58
+ return box.index(self) if box
59
+ owner.pieces.index(self)
60
+ end
61
+
62
+ def serialize_db
63
+ [self.id]
64
+ end
49
65
  end # Entry
50
66
  end # Spontaneous::Plugins
51
-
@@ -0,0 +1,13 @@
1
+ # encoding: UTF-8
2
+
3
+ module Spontaneous::Plugins::Field
4
+ module EditorClass
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def editor_class
9
+ ui_class
10
+ end
11
+ end
12
+ end
13
+ end
@@ -2,14 +2,23 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module Fields
5
+ extend ActiveSupport::Concern
6
+
5
7
  module ClassMethods
6
8
  def field(name, type=nil, options={}, &block)
7
9
  if type.is_a?(Hash)
8
10
  options = type
9
11
  type = nil
10
12
  end
13
+ prototype = nil
14
+ name = name.to_sym
15
+
16
+ if (existing_prototype = field_prototypes[name])
17
+ prototype = existing_prototype.merge(self, type, options, &block)
18
+ else
19
+ prototype = Spontaneous::Prototypes::FieldPrototype.new(self, name, type, options, &block)
20
+ end
11
21
 
12
- prototype = Spontaneous::Prototypes::FieldPrototype.new(self, name, type, options, &block)
13
22
  field_prototypes[name] = prototype
14
23
  unless method_defined?(name)
15
24
  define_method(name) do |*args|
@@ -57,47 +66,46 @@ module Spontaneous::Plugins
57
66
  def readable_fields
58
67
  field_prototypes.keys.select { |name| field_readable?(name) }
59
68
  end
60
- end
69
+ end # ClassMethods
61
70
 
62
- module InstanceMethods
63
- def after_save
64
- super
65
- fields.saved
66
- end
71
+ # InstanceMethods
67
72
 
68
- def reload
69
- @field_set = nil
70
- super
71
- end
73
+ def after_save
74
+ super
75
+ fields.saved
76
+ end
72
77
 
73
- def field_prototypes
74
- self.class.field_prototypes
75
- end
78
+ def reload
79
+ @field_set = nil
80
+ super
81
+ end
76
82
 
77
- def fields
78
- @field_set ||= Spontaneous::Collections::FieldSet.new(self, field_store)
79
- end
83
+ def field_prototypes
84
+ self.class.field_prototypes
85
+ end
80
86
 
81
- def field?(field_name)
82
- self.class.field?(field_name)
83
- end
87
+ def fields
88
+ @field_set ||= Spontaneous::Collections::FieldSet.new(self, field_store)
89
+ end
84
90
 
85
- # TODO: unify the update mechanism for these two stores
86
- def field_modified!(modified_field)
87
- self.field_store = @field_set.serialize_db
88
- end
91
+ def field?(field_name)
92
+ self.class.field?(field_name)
93
+ end
89
94
 
90
- def type_for_mime_type(mime_type)
91
- self.class.allowed_types.find do |t|
92
- t.field_for_mime_type(mime_type)
93
- end
94
- end
95
+ # TODO: unify the update mechanism for these two stores
96
+ def field_modified!(modified_field)
97
+ self.field_store = @field_set.serialize_db
98
+ end
95
99
 
96
- def field_for_mime_type(mime_type)
97
- prototype = self.class.field_for_mime_type(mime_type)
98
- self.fields[prototype.name]
100
+ def type_for_mime_type(mime_type)
101
+ self.class.allowed_types.find do |t|
102
+ t.field_for_mime_type(mime_type)
99
103
  end
100
104
  end
105
+
106
+ def field_for_mime_type(mime_type)
107
+ prototype = self.class.field_for_mime_type(mime_type)
108
+ self.fields[prototype.name]
109
+ end
101
110
  end
102
111
  end
103
-
@@ -2,17 +2,17 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module InstanceCode
5
+ extend ActiveSupport::Concern
5
6
 
6
- module InstanceMethods
7
- def after_initialize
8
- super
9
- mixin_instance_code
10
- end
7
+ # InstanceMethods
11
8
 
12
- def mixin_instance_code
13
- self.instance_eval(self.instance_code) unless self.instance_code.nil?
14
- end
9
+ def after_initialize
10
+ super
11
+ mixin_instance_code
12
+ end
13
+
14
+ def mixin_instance_code
15
+ self.instance_eval(self.instance_code) unless self.instance_code.nil?
15
16
  end
16
17
  end
17
18
  end
18
-
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module Layouts
5
+ extend ActiveSupport::Concern
6
+
5
7
  module ClassMethods
6
8
  def layout(name, options={})
7
9
  layout_prototypes[name] = Spontaneous::Prototypes::LayoutPrototype.new(self, name, options)
@@ -22,7 +24,7 @@ module Spontaneous::Plugins
22
24
  end
23
25
 
24
26
  def default_layout
25
- if prototype = (layouts.detect { |prototype| prototype.default? } || layouts.first)
27
+ if prototype = (layouts.hierarchy_detect { |prototype| prototype.default? } || layouts.local_first)
26
28
  prototype.layout(self)
27
29
  else
28
30
  Spontaneous::Layout::Default.new(self)
@@ -40,48 +42,42 @@ module Spontaneous::Plugins
40
42
  end
41
43
  end # ClassMethods
42
44
 
43
- module InstanceMethods
44
- def layout
45
- resolve_layout(self.style_sid)
46
- end
45
+ # InstanceMethods
47
46
 
48
- def resolve_layout(style_sid)
49
- self.class.resolve_layout(style_sid)
50
- end
47
+ def layout
48
+ resolve_layout(self.style_sid)
49
+ end
51
50
 
52
- def layout=(layout)
53
- self.style_sid = layout_to_schema_id(layout)
54
- end
51
+ def resolve_layout(style_sid)
52
+ self.class.resolve_layout(style_sid)
53
+ end
54
+
55
+ def layout=(layout)
56
+ self.style_sid = layout_to_schema_id(layout)
57
+ end
55
58
 
56
- def layout_to_schema_id(layout)
57
- sid = nil
58
- if layout.respond_to?(:schema_id)
59
- sid = layout.schema_id
59
+ def layout_to_schema_id(layout)
60
+ sid = nil
61
+ if layout.respond_to?(:schema_id)
62
+ sid = layout.schema_id
63
+ else
64
+ if Spontaneous::Schema::UID === layout
65
+ sid = layout
60
66
  else
61
- if Spontaneous::Schema::UID === layout
62
- sid = layout
63
- else
64
- if s = self.find_named_layout(layout)
65
- sid = s.schema_id
66
- end
67
+ if s = self.find_named_layout(layout)
68
+ sid = s.schema_id
67
69
  end
68
70
  end
69
- sid
70
71
  end
72
+ sid
73
+ end
71
74
 
72
- def find_named_layout(layout_name)
73
- self.class.find_named_layout(layout_name)
74
- end
75
+ def find_named_layout(layout_name)
76
+ self.class.find_named_layout(layout_name)
77
+ end
75
78
 
76
- def template(format = :html)
77
- layout.template(format)
78
- end
79
-
80
- # def provides_format?(format)
81
- # format = (format || :html).to_sym
82
- # self.formats.include?(format)
83
- # end
84
- end # InstanceMethods
79
+ def template(format = :html)
80
+ layout.template(format)
81
+ end
85
82
  end # Layouts
86
83
  end # Spontaneous::Plugins
87
-
@@ -2,40 +2,39 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module Media
5
- module ClassMethods
5
+ extend ActiveSupport::Concern
6
+
7
+ # InstanceMethods
8
+
9
+ def media_filepath(*args)
10
+ File.join(Spontaneous.media_dir, padded_id, padded_revision, *args)
11
+ end
12
+
13
+ def media_urlpath(*args)
14
+ File.join("/media", padded_id, padded_revision, *args)
15
+ end
16
+
17
+ def padded_id
18
+ save if media_id.nil?
19
+ media_id.to_s.rjust(5, "0")
6
20
  end
7
21
 
8
- module InstanceMethods
9
- def media_filepath(*args)
10
- File.join(Spontaneous.media_dir, padded_id, padded_revision, *args)
11
- end
12
-
13
- def media_urlpath(*args)
14
- File.join("/media", padded_id, padded_revision, *args)
15
- end
16
-
17
- def padded_id
18
- save if media_id.nil?
19
- media_id.to_s.rjust(5, "0")
20
- end
21
-
22
- def media_id
23
- id
24
- end
25
-
26
- def padded_revision
27
- Spontaneous::Site.working_revision.to_s.rjust(4, "0")
28
- end
29
-
30
- def make_media_file(src_file, filename = nil)
31
- filename ||= File.basename(src_file)
32
- filename = Spontaneous::Media.to_filename(filename)
33
- media_filepath = media_filepath(filename)
34
- FileUtils.mkdir_p(File.dirname(media_filepath))
35
- FileUtils.cp(src_file, media_filepath)
36
- media_filepath
37
- end
22
+ def media_id
23
+ id
24
+ end
25
+
26
+ def padded_revision
27
+ Spontaneous::Site.working_revision.to_s.rjust(4, "0")
28
+ end
29
+
30
+ # TODO: Is this still used? It shouldn't be
31
+ def make_media_file(src_file, filename = nil)
32
+ filename ||= File.basename(src_file)
33
+ filename = Spontaneous::Media.to_filename(filename)
34
+ media_filepath = media_filepath(filename)
35
+ FileUtils.mkdir_p(File.dirname(media_filepath))
36
+ FileUtils.cp(src_file, media_filepath)
37
+ media_filepath
38
38
  end
39
39
  end
40
40
  end
41
-
@@ -1,30 +1,58 @@
1
1
  # encoding: UTF-8
2
2
 
3
+ require 'rack'
3
4
 
4
5
  module Spontaneous::Plugins::Page
5
6
  module Formats
7
+ extend ActiveSupport::Concern
8
+
6
9
  module ClassMethods
7
10
  def formats(*formats)
8
- @formats ||= [:html]
9
- return @formats if formats.nil? or formats.empty?
11
+ return format_list if formats.nil? or formats.empty?
10
12
  set_formats(formats)
11
13
  end
12
14
 
15
+ def format_list
16
+ @formats ||= supertype_formats
17
+ end
18
+
19
+ def mime_types
20
+ @mime_types ||= supertype_mimetypes
21
+ end
22
+
23
+ def add_format(new_format)
24
+ format = define_format(new_format)
25
+ format_list.push(format)
26
+ end
27
+
13
28
  def set_formats(formats)
14
- @mime_types = {}
15
29
  formats = formats.flatten
30
+ mime_types.clear
31
+ format_list.clear
32
+ formats.map do |format|
33
+ format_list.push define_format(format)
34
+ end
35
+ end
36
+
37
+ def define_format(format)
16
38
  mime_type = nil
17
- @formats = formats.map do |format|
18
- if format.is_a?(Hash)
19
- mime_type = format.values.first
20
- format = format.keys.first
21
- @mime_types[format.to_sym] = mime_type
22
- else
23
- mime_type = ::Rack::Mime.mime_type("#{Spontaneous::DOT}#{format}", nil)
24
- end
25
- raise Spontaneous::UnknownFormatException.new(format) unless mime_type
26
- format.to_sym
39
+ if format.is_a?(Hash)
40
+ mime_type = format.values.first
41
+ format = format.keys.first
42
+ mime_types[format.to_sym] = mime_type
43
+ else
44
+ mime_type = ::Rack::Mime.mime_type(".#{format}", nil)
27
45
  end
46
+ raise Spontaneous::UnknownFormatException.new(format) unless mime_type
47
+ format.to_sym
48
+ end
49
+
50
+ def supertype_formats
51
+ supertype? && supertype.respond_to?(:formats) ? supertype.formats.dup : [:html]
52
+ end
53
+
54
+ def supertype_mimetypes
55
+ supertype? && supertype.respond_to?(:mime_types) ? supertype.mime_types.dup : {}
28
56
  end
29
57
 
30
58
  def default_format
@@ -37,31 +65,28 @@ module Spontaneous::Plugins::Page
37
65
  end
38
66
 
39
67
  def mime_type(format)
40
- if @mime_types && @mime_types.key?(format)
41
- @mime_types[format]
68
+ if mime_types && mime_types.key?(format)
69
+ mime_types[format]
42
70
  else
43
- ::Rack::Mime.mime_type("#{Spontaneous::DOT}#{format}")
71
+ ::Rack::Mime.mime_type(".#{format}")
44
72
  end
45
73
  end
46
- end
74
+ end # ClassMethods
47
75
 
48
- module InstanceMethods
49
- def formats
50
- self.class.formats
51
- end
76
+ def formats
77
+ self.class.formats
78
+ end
52
79
 
53
- def default_format
54
- self.class.default_format
55
- end
80
+ def default_format
81
+ self.class.default_format
82
+ end
56
83
 
57
- def provides_format?(format)
58
- self.class.provides_format?(format)
59
- end
84
+ def provides_format?(format)
85
+ self.class.provides_format?(format)
86
+ end
60
87
 
61
- def mime_type(format)
62
- self.class.mime_type(format)
63
- end
88
+ def mime_type(format)
89
+ self.class.mime_type(format)
64
90
  end
65
91
  end # Formats
66
92
  end # Spontaneous::Plugins::Page
67
-