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
@@ -53,9 +53,8 @@ module Sequel
53
53
  # Setup the necessary STI variables, see the module RDoc for SingleTableInheritance
54
54
  def self.configure(model, key, opts={})
55
55
  model.instance_eval do
56
- # @sti_model_map = lambda{|v| v if v && v != ''}
57
- # @sti_key_map = lambda{|klass| klass.name.to_s}
58
- @sti_model_map = lambda { |id| Spontaneous::Schema[id] }
56
+ @sti_dataset_root = model
57
+ @sti_model_map = lambda { |id| Spontaneous.schema[id] }
59
58
  @sti_key_map = lambda { |klass| klass.schema_id.to_s }
60
59
  @sti_key_array = nil
61
60
  @sti_subclasses_array = [sti_key_map[model]]
@@ -68,6 +67,8 @@ module Sequel
68
67
  end
69
68
 
70
69
  module ClassMethods
70
+ attr_reader :sti_dataset_root
71
+
71
72
  # The base dataset for STI, to which filters are added to get
72
73
  # only the models for the specific STI subclass.
73
74
  attr_reader :sti_dataset
@@ -99,14 +100,11 @@ module Sequel
99
100
  super
100
101
  sk = sti_key
101
102
  sd = sti_dataset
103
+ sdr = sti_dataset_root
102
104
  skm = sti_key_map
103
105
  smm = sti_model_map
104
106
  key = skm[subclass]
105
- ska = [key]
106
- sti_subclass_added(key, subclass)
107
- unless subclass.is_site_inheritance_root
108
- subclass.set_dataset(sd.filter(SQL::QualifiedIdentifier.new(table_name, sk)=>ska), :inherited=>true)
109
- end
107
+ ska = [key].reject { |k| k.blank? }
110
108
  subclass.instance_eval do
111
109
  @sti_key = sk
112
110
  @sti_key_array = ska
@@ -115,7 +113,9 @@ module Sequel
115
113
  @sti_key_map = skm
116
114
  @sti_model_map = smm
117
115
  @simple_table = nil
116
+ @sti_dataset_root = sdr
118
117
  end
118
+ sti_subclass_added(key, subclass)
119
119
  end
120
120
 
121
121
  # used by Page and Piece classes to control the subclasses used in searches
@@ -155,14 +155,21 @@ module Sequel
155
155
  subclass.set_site_inheritance_root
156
156
  end
157
157
  end
158
- if @is_site_inheritance_root or @is_content_inheritance_root
159
- sti_key_array << key unless sti_key_array.include?(key)
158
+ unless key.blank?
159
+ if @is_site_inheritance_root or @is_content_inheritance_root
160
+ sti_key_array << key unless sti_key_array.include?(key)
161
+ end
162
+ sti_subclasses_array << key
160
163
  end
161
- sti_subclasses_array << key
162
164
  superclass.sti_subclass_added(key)
163
165
  end
164
166
  end
165
167
 
168
+ def dataset
169
+ return super if self == sti_dataset_root
170
+ sti_dataset_root.dataset.filter(SQL::QualifiedIdentifier.new(sti_dataset_root.table_name, sti_key)=>sti_key_array)
171
+ end
172
+
166
173
  private
167
174
 
168
175
  # Return a class object. If a class is given, return it directly.
@@ -181,6 +188,7 @@ module Sequel
181
188
  raise(Error, "Invalid class type used: #{v.inspect}")
182
189
  end
183
190
  end
191
+
184
192
  end
185
193
 
186
194
  module InstanceMethods
@@ -193,4 +201,3 @@ module Sequel
193
201
  end
194
202
  end
195
203
  end
196
-
@@ -0,0 +1,45 @@
1
+ # encoding: UTF-8
2
+
3
+ module Sequel::Plugins
4
+ # Provides models with a mechanism for changing the table name used by queries
5
+ # within a particular block
6
+ module ScopedTableName
7
+ def self.configure(model)
8
+ model.class_variable_set :"@@unscoped_table_name", model.dataset.opts[:from].first
9
+ end
10
+
11
+ module ClassMethods
12
+ def unscoped_table_name
13
+ class_variable_get :"@@unscoped_table_name"
14
+ end
15
+
16
+ def with_table(table_name, &block)
17
+ dataset.with_table(unscoped_table_name, table_name, &block)
18
+ end
19
+ end
20
+
21
+ module DatasetMethods
22
+ # set up a mapping from the datasets original name to the one that should be used
23
+ # in the current scope.
24
+ # called from the model class this
25
+ def with_table(original_table_name, current_table_name)
26
+ saved_table_name = table_mappings[original_table_name]
27
+ table_mappings[original_table_name] = current_table_name.to_s
28
+ yield if block_given?
29
+ ensure
30
+ table_mappings[original_table_name] = saved_table_name
31
+ end
32
+
33
+ # use the table_mappings to convert the original table name to the current version
34
+ def quote_identifier_append(sql, name)
35
+ name = (table_mappings[name.to_sym] || name) if name.respond_to?(:to_sym)
36
+ super(sql, name)
37
+ end
38
+
39
+ # the table name mappings are shared across all dataset instances
40
+ def table_mappings
41
+ Thread.current[:scoped_table_names] ||= {}
42
+ end
43
+ end
44
+ end
45
+ end
data/lib/spontaneous.rb CHANGED
@@ -8,172 +8,169 @@ else
8
8
  Encoding.default_internal = Encoding::UTF_8
9
9
  end
10
10
 
11
+ require "fileutils"
11
12
  require "home_run"
12
13
  require "stringex"
13
14
  require "sequel"
14
15
  require "yajl"
16
+ require "logger"
15
17
 
16
- require 'logger'
17
- require 'fileutils'
18
- require 'active_support/core_ext/date_time/conversions'
19
- require 'active_support/core_ext/file'
18
+ require "active_support/concern"
19
+ require "active_support/deprecation"
20
+ require 'active_support/core_ext/class/attribute'
21
+ require "active_support/core_ext/hash/keys"
22
+ require "active_support/core_ext/date_time/conversions"
23
+ require "active_support/core_ext/array/grouping"
24
+ require "active_support/core_ext/array/extract_options"
25
+ require "active_support/core_ext/file"
20
26
 
21
27
  Sequel.extension :inflector
22
28
 
23
- Dir[File.join(File.dirname(__FILE__), 'spontaneous/extensions/*.rb')].each { |file|
24
- require file
25
- }
29
+ require 'sequel/plugins/serialization'
26
30
 
27
- require 'spontaneous/logger'
28
- require 'spontaneous/plugins'
29
- require 'spontaneous/constants'
30
- require 'spontaneous/errors'
31
- require 'spontaneous/json'
31
+ Sequel::Plugins::Serialization.register_format(
32
+ :yajl,
33
+ lambda { |v| Yajl::Encoder.new.encode(v) },
34
+ lambda { |v| Yajl::Parser.new(:symbolize_keys => true).parse(v) }
35
+ )
32
36
 
33
- Dir[File.expand_path('../spontaneous/plugins/application/*.rb', __FILE__)].each do |file|
34
- require file
35
- end
37
+
38
+ spontaneous = File.join(File.dirname(__FILE__), "spontaneous")
39
+
40
+ Dir["#{spontaneous}/extensions/*.rb"].each { |file| require file }
41
+
42
+ require "spontaneous/logger"
43
+ require "spontaneous/constants"
44
+ require "spontaneous/errors"
45
+ require "spontaneous/json"
36
46
 
37
47
  module Spontaneous
38
- extend Plugins
39
48
  include Constants
40
49
 
41
50
  def self.gem_root
42
- @gem_root ||= File.expand_path(File.dirname(__FILE__) / '..')
51
+ @gem_root ||= File.expand_path(File.dirname(__FILE__) / "..")
43
52
  end
44
53
 
45
54
  def self.reload!
46
- Spontaneous::Schema.reload!
47
- Spontaneous::Loader.reload!
48
- Spontaneous::Schema.validate!
55
+ instance.reload!
49
56
  end
50
57
 
51
- plugin Plugins::Application::State
52
- plugin Plugins::Application::Paths
53
- plugin Plugins::Application::Render
54
- plugin Plugins::Application::Facets
55
- plugin Plugins::Application::Serialisation
56
-
57
- autoload :ProxyObject, "spontaneous/proxy_object"
58
-
59
- autoload :Config, "spontaneous/config"
60
- autoload :Paths, "spontaneous/paths"
61
- autoload :Facet, "spontaneous/facet"
62
-
63
- autoload :Content, "spontaneous/content"
64
- autoload :Page, "spontaneous/page"
65
- autoload :Piece, "spontaneous/piece"
66
- autoload :Box, "spontaneous/box"
67
-
68
- autoload :FieldTypes, "spontaneous/field_types"
69
-
70
- autoload :PagePiece, "spontaneous/page_piece"
71
-
72
-
73
- autoload :Style, "spontaneous/style"
74
- autoload :BoxStyle, "spontaneous/box_style"
75
- autoload :Layout, "spontaneous/layout"
76
-
77
- autoload :Site, "spontaneous/site"
78
- autoload :State, "spontaneous/state"
79
- autoload :Schema, "spontaneous/schema"
80
-
81
- autoload :ImageSize, "spontaneous/image_size"
82
-
83
- autoload :Rack, "spontaneous/rack"
84
-
85
- autoload :Render, "spontaneous/render"
86
- autoload :Media, "spontaneous/media"
87
-
88
- autoload :Change, "spontaneous/change"
89
- autoload :Revision, "spontaneous/revision"
90
- autoload :Publishing, "spontaneous/publishing"
91
-
92
- autoload :Generators, "spontaneous/generators"
93
-
94
- autoload :Server, "spontaneous/server"
95
-
96
- autoload :Permissions, "spontaneous/permissions"
97
- autoload :ContentQuery, "spontaneous/content_query"
98
-
99
- autoload :PageController, "spontaneous/page_controller"
100
-
101
- autoload :Application, "spontaneous/application"
58
+ autoload :Config, "spontaneous/config"
59
+ autoload :Paths, "spontaneous/paths"
60
+ autoload :Facet, "spontaneous/facet"
61
+ autoload :Content, "spontaneous/content"
62
+ autoload :Page, "spontaneous/page"
63
+ autoload :Piece, "spontaneous/piece"
64
+ autoload :Box, "spontaneous/box"
65
+ autoload :FieldTypes, "spontaneous/field_types"
66
+ autoload :PagePiece, "spontaneous/page_piece"
67
+ autoload :Style, "spontaneous/style"
68
+ autoload :BoxStyle, "spontaneous/box_style"
69
+ autoload :Layout, "spontaneous/layout"
70
+ autoload :Site, "spontaneous/site"
71
+ autoload :State, "spontaneous/state"
72
+ autoload :Schema, "spontaneous/schema"
73
+ autoload :ImageSize, "spontaneous/image_size"
74
+ autoload :Rack, "spontaneous/rack"
75
+ autoload :Render, "spontaneous/render"
76
+ autoload :Media, "spontaneous/media"
77
+ autoload :Change, "spontaneous/change"
78
+ autoload :Revision, "spontaneous/revision"
79
+ autoload :Publishing, "spontaneous/publishing"
80
+ autoload :Generators, "spontaneous/generators"
81
+ autoload :Server, "spontaneous/server"
82
+ autoload :Permissions, "spontaneous/permissions"
83
+ autoload :ContentQuery, "spontaneous/content_query"
84
+ autoload :PageController, "spontaneous/page_controller"
85
+ autoload :Application, "spontaneous/application"
86
+ autoload :Search, "spontaneous/search"
87
+ autoload :Storage, "spontaneous/storage"
102
88
 
103
89
  module Prototypes
104
- autoload :FieldPrototype, "spontaneous/prototypes/field_prototype"
105
- autoload :BoxPrototype, "spontaneous/prototypes/box_prototype"
106
- autoload :StylePrototype, "spontaneous/prototypes/style_prototype"
107
- autoload :LayoutPrototype, "spontaneous/prototypes/layout_prototype"
90
+ autoload :FieldPrototype, "spontaneous/prototypes/field_prototype"
91
+ autoload :BoxPrototype, "spontaneous/prototypes/box_prototype"
92
+ autoload :StylePrototype, "spontaneous/prototypes/style_prototype"
93
+ autoload :LayoutPrototype, "spontaneous/prototypes/layout_prototype"
108
94
  end
109
95
 
110
96
  module Collections
111
- autoload :PrototypeSet, "spontaneous/collections/prototype_set"
112
- autoload :ChangeSet, "spontaneous/collections/change_set"
113
- autoload :EntrySet, "spontaneous/collections/entry_set"
114
- autoload :FieldSet, "spontaneous/collections/field_set"
115
- autoload :BoxSet, "spontaneous/collections/box_set"
116
- autoload :StyleSet, "spontaneous/collections/style_set"
97
+ autoload :PrototypeSet, "spontaneous/collections/prototype_set"
98
+ autoload :ChangeSet, "spontaneous/collections/change_set"
99
+ autoload :EntrySet, "spontaneous/collections/entry_set"
100
+ autoload :FieldSet, "spontaneous/collections/field_set"
101
+ autoload :BoxSet, "spontaneous/collections/box_set"
102
+ autoload :StyleSet, "spontaneous/collections/style_set"
117
103
  end
118
104
 
119
105
  module Plugins
120
- autoload :Supertype, "spontaneous/plugins/supertype"
121
- autoload :Boxes, "spontaneous/plugins/boxes"
122
- autoload :Fields, "spontaneous/plugins/fields"
123
- autoload :Entries, "spontaneous/plugins/entries"
124
- autoload :Entry, "spontaneous/plugins/entry"
125
- autoload :Styles, "spontaneous/plugins/styles"
126
- autoload :Layouts, "spontaneous/plugins/layouts"
127
- autoload :SchemaTitle, "spontaneous/plugins/schema_title"
128
- autoload :SchemaId, "spontaneous/plugins/schema_id"
129
- autoload :Render, "spontaneous/plugins/render"
130
- autoload :SchemaHierarchy, "spontaneous/plugins/schema_hierarchy"
131
- autoload :InstanceCode, "spontaneous/plugins/instance_code"
132
- autoload :Paths, "spontaneous/plugins/paths"
133
- autoload :PageTree, "spontaneous/plugins/page_tree"
134
- autoload :AllowedTypes, "spontaneous/plugins/allowed_types"
135
- autoload :Serialisation, "spontaneous/plugins/serialisation"
136
- autoload :SiteMap, "spontaneous/plugins/site_map"
137
- autoload :PageSearch, "spontaneous/plugins/page_search"
138
- autoload :Media, "spontaneous/plugins/media"
139
- autoload :Publishing, "spontaneous/plugins/publishing"
140
- autoload :Aliases, "spontaneous/plugins/aliases"
141
- autoload :Visibility, "spontaneous/plugins/visibility"
142
- autoload :Prototypes, "spontaneous/plugins/prototypes"
143
- autoload :Permissions, "spontaneous/plugins/permissions"
144
- autoload :Controllers, "spontaneous/plugins/controllers"
145
-
106
+ autoload :Supertype, "spontaneous/plugins/supertype"
107
+ autoload :Boxes, "spontaneous/plugins/boxes"
108
+ autoload :Fields, "spontaneous/plugins/fields"
109
+ autoload :Entries, "spontaneous/plugins/entries"
110
+ autoload :Entry, "spontaneous/plugins/entry"
111
+ autoload :Styles, "spontaneous/plugins/styles"
112
+ autoload :Layouts, "spontaneous/plugins/layouts"
113
+ autoload :SchemaTitle, "spontaneous/plugins/schema_title"
114
+ autoload :SchemaId, "spontaneous/plugins/schema_id"
115
+ autoload :Render, "spontaneous/plugins/render"
116
+ autoload :SchemaHierarchy, "spontaneous/plugins/schema_hierarchy"
117
+ autoload :InstanceCode, "spontaneous/plugins/instance_code"
118
+ autoload :Paths, "spontaneous/plugins/paths"
119
+ autoload :PageTree, "spontaneous/plugins/page_tree"
120
+ autoload :AllowedTypes, "spontaneous/plugins/allowed_types"
121
+ autoload :Serialisation, "spontaneous/plugins/serialisation"
122
+ autoload :SiteMap, "spontaneous/plugins/site_map"
123
+ autoload :PageSearch, "spontaneous/plugins/page_search"
124
+ autoload :Media, "spontaneous/plugins/media"
125
+ autoload :Publishing, "spontaneous/plugins/publishing"
126
+ autoload :Aliases, "spontaneous/plugins/aliases"
127
+ autoload :Visibility, "spontaneous/plugins/visibility"
128
+ autoload :Prototypes, "spontaneous/plugins/prototypes"
129
+ autoload :Permissions, "spontaneous/plugins/permissions"
130
+ autoload :Controllers, "spontaneous/plugins/controllers"
131
+
132
+ module Field
133
+ autoload :EditorClass, "spontaneous/plugins/field/editor_class"
134
+ end
146
135
 
147
136
  module Page
148
- autoload :Formats, "spontaneous/plugins/page/formats"
149
- autoload :Request, "spontaneous/plugins/page/request"
137
+ autoload :Formats, "spontaneous/plugins/page/formats"
138
+ autoload :Request, "spontaneous/plugins/page/request"
150
139
  end
151
140
 
152
141
  module Site
153
- autoload :Publishing, "spontaneous/plugins/site/publishing"
154
- autoload :Revisions, "spontaneous/plugins/site/revisions"
155
- autoload :Selectors, "spontaneous/plugins/site/selectors"
156
- autoload :Map, "spontaneous/plugins/site/map"
157
- autoload :Instance, "spontaneous/plugins/site/instance"
142
+ autoload :Publishing, "spontaneous/plugins/site/publishing"
143
+ autoload :Revisions, "spontaneous/plugins/site/revisions"
144
+ autoload :Selectors, "spontaneous/plugins/site/selectors"
145
+ autoload :Map, "spontaneous/plugins/site/map"
146
+ autoload :Instance, "spontaneous/plugins/site/instance"
147
+ autoload :Search, "spontaneous/plugins/site/search"
148
+ autoload :Features, "spontaneous/plugins/site/features"
149
+ autoload :Schema, "spontaneous/plugins/site/schema"
150
+ autoload :Level, "spontaneous/plugins/site/level"
151
+ autoload :Storage, "spontaneous/plugins/site/storage"
158
152
  end
159
- end
160
153
 
161
-
162
- class UnknownTypeException < Exception
163
- def initialize(parent, type)
164
- super("Unknown content type '#{type}' requested in class #{parent}")
165
- end
166
- end
167
- class UnknownStyleException < Exception
168
- def initialize(style_name, klass)
169
- super("Unknown style '#{style_name}' for class #{klass}")
154
+ module Application
155
+ autoload :State, "spontaneous/plugins/application/state"
156
+ autoload :Paths, "spontaneous/plugins/application/paths"
157
+ autoload :Render, "spontaneous/plugins/application/render"
158
+ autoload :Facets, "spontaneous/plugins/application/facets"
159
+ autoload :Serialisation, "spontaneous/plugins/application/serialisation"
160
+ autoload :Features, "spontaneous/plugins/application/features"
170
161
  end
171
162
  end
172
163
 
164
+ include Plugins::Application::State
165
+ include Plugins::Application::Paths
166
+ include Plugins::Application::Render
167
+ include Plugins::Application::Facets
168
+ include Plugins::Application::Serialisation
169
+ include Plugins::Application::Features
173
170
  end
174
171
 
175
- require 'spontaneous/loader'
176
- require 'spontaneous/version'
172
+ require "spontaneous/loader"
173
+ require "spontaneous/version"
177
174
 
178
175
 
179
176
  Spot = S = Spontaneous unless defined?(Spot)
@@ -2,32 +2,50 @@
2
2
 
3
3
  module Spontaneous
4
4
  class Box
5
- extend Plugins
6
5
  include Enumerable
7
6
 
8
- plugin Plugins::SchemaHierarchy
9
- plugin Plugins::Fields
10
- plugin Plugins::Styles
11
- plugin Plugins::Serialisation
12
- plugin Plugins::Render
13
- plugin Plugins::AllowedTypes
14
- plugin Plugins::Permissions
15
- plugin Plugins::Media
7
+ include Plugins::SchemaHierarchy
8
+ include Plugins::Fields
9
+ include Plugins::Styles
10
+ include Plugins::Serialisation
11
+ include Plugins::Render
12
+ include Plugins::AllowedTypes
13
+ include Plugins::Permissions
14
+ include Plugins::Media
16
15
 
17
16
  # use underscores to protect against field name conflicts
18
- attr_reader :_name, :_prototype, :_owner
17
+ attr_reader :_name, :_prototype, :owner
18
+ attr_accessor :template_params
19
19
 
20
+ # Public: the parent of a Box is the same as its owner,
21
+ # i.e. the Content object that contains it.
22
+ #
23
+ # Returns: the owning Content object
24
+ alias_method :parent, :owner
20
25
 
21
- def initialize(name, prototype, owner)
22
- @_name, @_prototype, @_owner = name.to_sym, prototype, owner
23
- @field_initialization = false
26
+ def self.page?
27
+ false
28
+ end
29
+
30
+ def self.is_box?
31
+ true
24
32
  end
25
33
 
34
+ # Used in the instance that a subclass is re-opening a box definition
35
+ # In that case the box prototype is created by a BoxPrototype#merge
36
+ # call and at that point we force the box instance class to use the same
37
+ # schema id as its parent so that content is always connected to the originating
38
+ # definition in the supertype rather than the customised version in the subclass
39
+ def self.schema_id=(schema_id)
40
+ @schema_id = schema_id
41
+ end
26
42
 
27
43
  def self.schema_id
28
- Spontaneous::Schema.schema_id(self)
44
+ Spontaneous.schema.uids[@schema_id] || Spontaneous.schema.schema_id(self)
29
45
  end
30
46
 
47
+ # This is overridden by anonymous classes defined by box prototypes
48
+ # See BoxPrototype#create_instance_class
31
49
  def self.schema_name
32
50
  "type//#{self.name}"
33
51
  end
@@ -42,15 +60,37 @@ module Spontaneous
42
60
  end
43
61
 
44
62
  def self.supertype?
45
- !supertype.nil? #&& supertype.respond_to?(:field_prototypes)
63
+ !supertype.nil?
64
+ end
65
+
66
+ def self.owner_sid
67
+ nil
68
+ end
69
+
70
+ def initialize(name, prototype, owner)
71
+ @_name, @_prototype, @owner = name.to_sym, prototype, owner
72
+ @field_initialization = false
73
+ end
74
+
75
+
76
+ def page?
77
+ false
78
+ end
79
+
80
+ alias_method :is_page?, :page?
81
+
82
+ def is_box?
83
+ true
46
84
  end
47
85
 
48
86
  def schema_id
49
- # Spontaneous::Schema.schema_id(_owner.class, :box, _name.to_s)
50
- # _prototype.schema_id
51
87
  self.class.schema_id
52
88
  end
53
89
 
90
+ def id
91
+ schema_id.to_s
92
+ end
93
+
54
94
  def schema_name
55
95
  _name.to_s
56
96
  end
@@ -64,11 +104,15 @@ module Spontaneous
64
104
  end
65
105
 
66
106
  def formats
67
- _owner.formats
107
+ owner.formats
68
108
  end
69
109
 
70
110
  def media_id
71
- "#{_owner.padded_id}/#{schema_id}"
111
+ "#{owner.padded_id}/#{schema_id}"
112
+ end
113
+
114
+ def position
115
+ _prototype.position
72
116
  end
73
117
 
74
118
  def box_name
@@ -84,8 +128,9 @@ module Spontaneous
84
128
  false
85
129
  end
86
130
 
131
+
87
132
  def field_store
88
- _owner.box_field_store(self) || initialize_fields
133
+ owner.box_field_store(self) || initialize_fields
89
134
  end
90
135
 
91
136
  # don't like this
@@ -106,7 +151,7 @@ module Spontaneous
106
151
 
107
152
  def field_modified!(modified_field)
108
153
  @modified = true
109
- _owner.box_modified!(self)
154
+ owner.box_modified!(self)
110
155
  end
111
156
 
112
157
  def serialize_db
@@ -129,15 +174,26 @@ module Spontaneous
129
174
  end
130
175
 
131
176
  def container
132
- _owner
177
+ owner
133
178
  end
134
179
 
135
180
  def page
136
- container.page
181
+ owner.page
137
182
  end
138
183
 
139
184
  def depth
140
- container.content_depth
185
+ owner.content_depth
186
+ end
187
+
188
+ def adopt(content, index = -1)
189
+ content.parent.destroy_entry!(content)
190
+ insert(index, content)
191
+ self.save
192
+ content.save
193
+ # kinda feel like this should be dealt with internally by the page
194
+ # but don't care enough to start messing with the path propagation
195
+ # methods...
196
+ content.propagate_path_changes if content.is_page?
141
197
  end
142
198
 
143
199
  def push(content)
@@ -148,72 +204,92 @@ module Spontaneous
148
204
 
149
205
  def insert(index, content)
150
206
  @modified = true
151
- _owner.insert(index, content, self)
207
+ @contents = nil
208
+ owner.insert(index, content, self)
152
209
  end
153
210
 
154
211
  def set_position(entry, new_position)
155
212
  @modified = true
156
- piece = pieces[new_position]
157
- new_position = container.pieces.index(piece)
158
- container.pieces.set_position(entry, new_position)
213
+ # piece = contents[new_position]
214
+ # new_position = owner.pieces.index(piece)
215
+ owner.pieces.set_position(entry, new_position)
159
216
  end
160
217
 
161
218
  def modified?
162
219
  @modified
163
220
  end
164
221
 
165
- def pieces
166
- @pieces ||= _owner.pieces.for_box(self)
222
+ def contents
223
+ owner.pieces.for_box(self)
167
224
  end
168
225
 
226
+ alias_method :pieces, :contents
227
+
228
+ def [](index)
229
+ contents[index]
230
+ end
231
+
232
+ def index(entry)
233
+ contents.index(entry)
234
+ end
169
235
 
170
236
  def each
171
- pieces.each do |piece|
237
+ contents.each do |piece|
172
238
  yield piece if block_given?
173
239
  end
174
240
  end
175
241
 
242
+ def empty?
243
+ contents.count == 0
244
+ end
245
+
176
246
  def last
177
- pieces.last
247
+ contents.last
178
248
  end
179
249
 
250
+ def length
251
+ contents.length
252
+ end
253
+
254
+ alias_method :size, :length
255
+
180
256
  def iterable
181
- pieces
257
+ contents
182
258
  end
183
259
 
184
- def export
185
- shallow_export.merge({
186
- :entries => pieces.map { |p| p.export }
260
+ def export(user = nil)
261
+ shallow_export(user).merge({
262
+ :entries => contents.map { |p| p.export(user) }
187
263
  })
188
264
  end
189
265
 
190
- def shallow_export
266
+ def shallow_export(user)
191
267
  {
192
268
  :name => _prototype.name.to_s,
193
269
  :id => _prototype.schema_id.to_s,
194
- :fields => self.class.readable_fields.map { |name| fields[name].export }
270
+ :fields => self.class.readable_fields(user).map { |name| fields[name].export(user) }
195
271
  }
196
272
  end
197
273
 
198
274
  # only called directly after saving a boxes fields so
199
275
  # we don't need to return the entries
200
- def serialise_http
201
- Spontaneous.serialise_http(shallow_export)
276
+ def serialise_http(user)
277
+ Spontaneous.serialise_http(shallow_export(user))
202
278
  end
203
279
 
204
- def writable?(content_type = nil)
205
- return true if Spontaneous::Permissions.has_level?(Spontaneous::Permissions.root)
206
- box_writable = self._owner.box_writable?(_name)
280
+ def writable?(user, content_type = nil)
281
+ return true if Spontaneous::Permissions.has_level?(user, Spontaneous::Permissions.root)
282
+ box_writable = self.owner.box_writable?(user, _name)
207
283
  if content_type
208
284
  allowed = self.allowed_type(content_type)
209
- box_writable && allowed && allowed.addable?
285
+ box_writable && allowed && allowed.addable?(user)
210
286
  else
211
287
  box_writable
212
288
  end
213
289
  end
214
290
 
215
- def readable?
216
- self._owner.box_readable?(_name)
291
+ def readable?(user)
292
+ self.owner.box_readable?(user, _name)
217
293
  end
218
294
 
219
295
  def start_inline_edit_marker
@@ -225,7 +301,11 @@ module Spontaneous
225
301
  end
226
302
 
227
303
  def save
228
- _owner.save
304
+ owner.save
305
+ end
306
+
307
+ def ==(obj)
308
+ super or (obj.is_a?(Box) && (self._prototype == obj._prototype) && (self.owner == obj.owner))
229
309
  end
230
310
  end
231
311