spontaneous 0.1.0.alpha1 → 0.2.0.alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. data/Gemfile +40 -35
  2. data/LICENSE +20 -0
  3. data/Rakefile +39 -42
  4. data/Readme.markdown +155 -0
  5. data/application/css/definitions.scss +3 -0
  6. data/application/css/editing.scss +9 -4
  7. data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +1 -0
  8. data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +1 -0
  9. data/application/css/min/d1b54ff4847c613618267ca1c15658e2aee0a4e5.css +1 -0
  10. data/application/css/v2.scss +144 -50
  11. data/application/js/add_alias_dialogue.js +18 -8
  12. data/application/js/ajax.js +1 -1
  13. data/application/js/authentication.js +8 -1
  14. data/application/js/box.js +37 -7
  15. data/application/js/box_container.js +1 -1
  16. data/application/js/compatibility.js +7 -0
  17. data/application/js/content.js +7 -0
  18. data/application/js/content_area.js +4 -0
  19. data/application/js/edit_panel.js +44 -18
  20. data/application/js/editing.js +12 -0
  21. data/application/js/event_source.js +17 -0
  22. data/application/js/extensions.js +2 -0
  23. data/application/js/field_types/file_field.js +2 -1
  24. data/application/js/field_types/image_field.js +35 -48
  25. data/application/js/field_types/long_string_field.js +12 -0
  26. data/application/js/field_types/markdown_field.js +2 -5
  27. data/application/js/field_types/string_field.js +5 -1
  28. data/application/js/field_types/webvideo_field.js +15 -0
  29. data/application/js/init.js +1 -0
  30. data/application/js/location.js +30 -19
  31. data/application/js/login.js +1 -2
  32. data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +3 -0
  33. data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +2 -0
  34. data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +3 -0
  35. data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +90 -0
  36. data/application/js/page.js +1 -0
  37. data/application/js/page_entry.js +6 -40
  38. data/application/js/preview.js +2 -3
  39. data/application/js/top_bar.js +76 -31
  40. data/application/js/upload.js +5 -2
  41. data/application/js/upload_manager.js +2 -81
  42. data/application/js/vendor/jquery-1.7.1.min.js +4 -0
  43. data/application/js/vendor/jquery-ui-1.8.16.custom.min.js +791 -0
  44. data/application/js/views.js +3 -3
  45. data/application/js/views/box_view.js +164 -83
  46. data/application/js/views/page_piece_view.js +2 -2
  47. data/application/js/views/page_view.js +46 -15
  48. data/application/js/views/piece_view.js +29 -8
  49. data/application/static/diagonal-texture.png +0 -0
  50. data/application/static/item-buttons-highlight.png +0 -0
  51. data/application/static/plus-box.png +0 -0
  52. data/application/static/plus_alt.svg +8 -0
  53. data/application/static/slot-up-arrow.png +0 -0
  54. data/application/views/{index.erubis → index.erb} +9 -5
  55. data/application/views/{login.erubis → login.erb} +14 -10
  56. data/application/views/schema_modification_error.html.erb +18 -6
  57. data/application/views/{unsupported.erubis → unsupported.erb} +0 -0
  58. data/bin/spot +15 -2
  59. data/db/migrations/20100610142136_init.rb +2 -2
  60. data/db/migrations/20101130104334_timestamps.rb +2 -2
  61. data/db/migrations/20110209152710_users_and_groups.rb +11 -11
  62. data/db/migrations/20120106171423_visibility_path.rb +19 -0
  63. data/db/migrations/20120107124541_owner_id.rb +19 -0
  64. data/docs/recipe-interface-screenshot.png +0 -0
  65. data/lib/cutaneous.rb +11 -10
  66. data/lib/cutaneous/context_helper.rb +119 -14
  67. data/lib/cutaneous/preview_context.rb +4 -3
  68. data/lib/cutaneous/preview_renderer.rb +1 -6
  69. data/lib/cutaneous/publish_context.rb +1 -0
  70. data/lib/cutaneous/{first_pass_renderer.rb → publish_renderer.rb} +2 -6
  71. data/lib/cutaneous/publish_template.rb +62 -0
  72. data/lib/cutaneous/publish_token_parser.rb +8 -0
  73. data/lib/cutaneous/renderer.rb +4 -2
  74. data/lib/cutaneous/request_context.rb +1 -0
  75. data/lib/cutaneous/{second_pass_renderer.rb → request_renderer.rb} +2 -5
  76. data/lib/cutaneous/request_template.rb +11 -0
  77. data/lib/cutaneous/request_token_parser.rb +9 -0
  78. data/lib/cutaneous/token_parser.rb +125 -0
  79. data/lib/sequel/plugins/content_table_inheritance.rb +19 -12
  80. data/lib/sequel/plugins/scoped_table_name.rb +45 -0
  81. data/lib/spontaneous.rb +123 -126
  82. data/lib/spontaneous/box.rb +127 -47
  83. data/lib/spontaneous/box_style.rb +39 -22
  84. data/lib/spontaneous/change.rb +2 -2
  85. data/lib/spontaneous/cli.rb +1 -0
  86. data/lib/spontaneous/cli/base.rb +12 -4
  87. data/lib/spontaneous/cli/console.rb +72 -0
  88. data/lib/spontaneous/cli/server.rb +36 -12
  89. data/lib/spontaneous/cli/site.rb +175 -1
  90. data/lib/spontaneous/collections/box_set.rb +19 -1
  91. data/lib/spontaneous/collections/entry_set.rb +70 -22
  92. data/lib/spontaneous/collections/field_set.rb +3 -3
  93. data/lib/spontaneous/collections/prototype_set.rb +28 -0
  94. data/lib/spontaneous/config.rb +14 -5
  95. data/lib/spontaneous/content.rb +23 -24
  96. data/lib/spontaneous/errors.rb +20 -4
  97. data/lib/spontaneous/extensions/array.rb +2 -2
  98. data/lib/spontaneous/extensions/json.rb +1 -1
  99. data/lib/spontaneous/extensions/nil.rb +13 -0
  100. data/lib/spontaneous/facet.rb +61 -7
  101. data/lib/spontaneous/field_types.rb +1 -3
  102. data/lib/spontaneous/field_types/date_field.rb +1 -0
  103. data/lib/spontaneous/field_types/field.rb +32 -15
  104. data/lib/spontaneous/field_types/image_field.rb +138 -69
  105. data/lib/spontaneous/field_types/location_field.rb +59 -0
  106. data/lib/spontaneous/field_types/long_string_field.rb +13 -0
  107. data/lib/spontaneous/field_types/markdown_field.rb +2 -1
  108. data/lib/spontaneous/field_types/string_field.rb +2 -2
  109. data/lib/spontaneous/field_types/webvideo_field.rb +255 -0
  110. data/lib/spontaneous/generators/page/inline.html.cut +1 -1
  111. data/lib/spontaneous/generators/page/page.html.cut.tt +5 -4
  112. data/lib/spontaneous/generators/page/page.rb.tt +1 -5
  113. data/lib/spontaneous/generators/site.rb +1 -0
  114. data/lib/spontaneous/generators/site/.gitignore +2 -0
  115. data/lib/spontaneous/generators/site/Gemfile.tt +3 -5
  116. data/lib/spontaneous/generators/site/config/environment.rb.tt +1 -0
  117. data/lib/spontaneous/generators/site/config/environments/development.rb.tt +3 -1
  118. data/lib/spontaneous/generators/site/config/environments/production.rb.tt +3 -1
  119. data/lib/spontaneous/generators/site/config/indexes.rb.tt +23 -0
  120. data/lib/spontaneous/generators/site/public/css/{site.css → site.scss} +0 -0
  121. data/lib/spontaneous/generators/site/schema/box.rb.tt +5 -0
  122. data/lib/spontaneous/generators/site/templates/layouts/standard.html.cut.tt +11 -5
  123. data/lib/spontaneous/image_size.rb +0 -1
  124. data/lib/spontaneous/loader.rb +335 -218
  125. data/lib/spontaneous/logger.rb +7 -2
  126. data/lib/spontaneous/media.rb +64 -59
  127. data/lib/spontaneous/media/file.rb +74 -0
  128. data/lib/spontaneous/page.rb +47 -18
  129. data/lib/spontaneous/page_piece.rb +29 -27
  130. data/lib/spontaneous/paths.rb +0 -1
  131. data/lib/spontaneous/permissions.rb +3 -21
  132. data/lib/spontaneous/permissions/user.rb +5 -1
  133. data/lib/spontaneous/permissions/user_level.rb +6 -7
  134. data/lib/spontaneous/piece.rb +12 -7
  135. data/lib/spontaneous/plugins/aliases.rb +76 -31
  136. data/lib/spontaneous/plugins/allowed_types.rb +36 -37
  137. data/lib/spontaneous/plugins/application/facets.rb +7 -10
  138. data/lib/spontaneous/plugins/application/features.rb +17 -0
  139. data/lib/spontaneous/plugins/application/paths.rb +25 -31
  140. data/lib/spontaneous/plugins/application/render.rb +1 -5
  141. data/lib/spontaneous/plugins/application/serialisation.rb +2 -0
  142. data/lib/spontaneous/plugins/application/state.rb +6 -9
  143. data/lib/spontaneous/plugins/boxes.rb +65 -40
  144. data/lib/spontaneous/plugins/controllers.rb +22 -22
  145. data/lib/spontaneous/plugins/entries.rb +149 -150
  146. data/lib/spontaneous/plugins/entry.rb +50 -35
  147. data/lib/spontaneous/plugins/field/editor_class.rb +13 -0
  148. data/lib/spontaneous/plugins/fields.rb +41 -33
  149. data/lib/spontaneous/plugins/instance_code.rb +9 -9
  150. data/lib/spontaneous/plugins/layouts.rb +31 -35
  151. data/lib/spontaneous/plugins/media.rb +31 -32
  152. data/lib/spontaneous/plugins/page/formats.rb +56 -31
  153. data/lib/spontaneous/plugins/page/request.rb +15 -9
  154. data/lib/spontaneous/plugins/page_search.rb +30 -31
  155. data/lib/spontaneous/plugins/page_tree.rb +59 -12
  156. data/lib/spontaneous/plugins/paths.rb +84 -79
  157. data/lib/spontaneous/plugins/permissions.rb +26 -28
  158. data/lib/spontaneous/plugins/prototypes.rb +42 -37
  159. data/lib/spontaneous/plugins/publishing.rb +50 -94
  160. data/lib/spontaneous/plugins/render.rb +8 -16
  161. data/lib/spontaneous/plugins/schema_hierarchy.rb +20 -21
  162. data/lib/spontaneous/plugins/schema_id.rb +33 -25
  163. data/lib/spontaneous/plugins/schema_title.rb +3 -4
  164. data/lib/spontaneous/plugins/serialisation.rb +32 -35
  165. data/lib/spontaneous/plugins/site/features.rb +32 -0
  166. data/lib/spontaneous/plugins/site/instance.rb +3 -2
  167. data/lib/spontaneous/plugins/site/level.rb +18 -0
  168. data/lib/spontaneous/plugins/site/map.rb +2 -1
  169. data/lib/spontaneous/plugins/site/publishing.rb +56 -59
  170. data/lib/spontaneous/plugins/site/revisions.rb +24 -19
  171. data/lib/spontaneous/plugins/site/schema.rb +33 -0
  172. data/lib/spontaneous/plugins/site/search.rb +43 -0
  173. data/lib/spontaneous/plugins/site/selectors.rb +35 -30
  174. data/lib/spontaneous/plugins/site/storage.rb +63 -0
  175. data/lib/spontaneous/plugins/site_map.rb +23 -25
  176. data/lib/spontaneous/plugins/styles.rb +35 -43
  177. data/lib/spontaneous/plugins/supertype.rb +3 -1
  178. data/lib/spontaneous/plugins/visibility.rb +90 -83
  179. data/lib/spontaneous/prototypes/box_prototype.rb +55 -25
  180. data/lib/spontaneous/prototypes/field_prototype.rb +66 -19
  181. data/lib/spontaneous/prototypes/style_prototype.rb +2 -2
  182. data/lib/spontaneous/publishing.rb +1 -1
  183. data/lib/spontaneous/publishing/immediate.rb +128 -49
  184. data/lib/spontaneous/publishing/simultaneous.rb +70 -0
  185. data/lib/spontaneous/rack.rb +38 -26
  186. data/lib/spontaneous/rack/around_back.rb +3 -23
  187. data/lib/spontaneous/rack/around_preview.rb +3 -8
  188. data/lib/spontaneous/rack/assets.rb +7 -6
  189. data/lib/spontaneous/rack/authentication.rb +21 -0
  190. data/lib/spontaneous/rack/back.rb +310 -331
  191. data/lib/spontaneous/rack/cacheable_file.rb +27 -0
  192. data/lib/spontaneous/rack/cookie_authentication.rb +38 -0
  193. data/lib/spontaneous/rack/css.rb +43 -0
  194. data/lib/spontaneous/rack/event_source.rb +31 -0
  195. data/lib/spontaneous/rack/front.rb +30 -8
  196. data/lib/spontaneous/rack/helpers.rb +31 -0
  197. data/lib/spontaneous/rack/media.rb +22 -21
  198. data/lib/spontaneous/rack/public.rb +2 -1
  199. data/lib/spontaneous/rack/query_authentication.rb +35 -0
  200. data/lib/spontaneous/rack/reloader.rb +6 -3
  201. data/lib/spontaneous/rack/user_helpers.rb +28 -0
  202. data/lib/spontaneous/render.rb +64 -23
  203. data/lib/spontaneous/render/context_base.rb +143 -0
  204. data/lib/spontaneous/render/format.rb +24 -19
  205. data/lib/spontaneous/render/helpers.rb +14 -0
  206. data/lib/spontaneous/render/helpers/html_helper.rb +69 -0
  207. data/lib/spontaneous/render/helpers/script_helper.rb +17 -0
  208. data/lib/spontaneous/render/helpers/stylesheet_helper.rb +16 -0
  209. data/lib/spontaneous/render/preview_context.rb +8 -0
  210. data/lib/spontaneous/render/preview_renderer.rb +6 -0
  211. data/lib/spontaneous/render/publish_context.rb +22 -0
  212. data/lib/spontaneous/render/published_renderer.rb +12 -13
  213. data/lib/spontaneous/render/publishing_renderer.rb +3 -0
  214. data/lib/spontaneous/render/render_cache.rb +26 -0
  215. data/lib/spontaneous/render/renderer.rb +5 -1
  216. data/lib/spontaneous/render/request_context.rb +8 -0
  217. data/lib/spontaneous/schema.rb +56 -24
  218. data/lib/spontaneous/schema/schema_modification.rb +2 -2
  219. data/lib/spontaneous/schema/uid.rb +22 -106
  220. data/lib/spontaneous/schema/uid_map.rb +120 -0
  221. data/lib/spontaneous/search.rb +11 -0
  222. data/lib/spontaneous/search/compound_indexer.rb +26 -0
  223. data/lib/spontaneous/search/database.rb +72 -0
  224. data/lib/spontaneous/search/field.rb +95 -0
  225. data/lib/spontaneous/search/index.rb +184 -0
  226. data/lib/spontaneous/search/results.rb +34 -0
  227. data/lib/spontaneous/server.rb +5 -1
  228. data/lib/spontaneous/site.rb +56 -16
  229. data/lib/spontaneous/storage.rb +22 -0
  230. data/lib/spontaneous/storage/backend.rb +10 -0
  231. data/lib/spontaneous/storage/cloud.rb +104 -0
  232. data/lib/spontaneous/storage/local.rb +52 -0
  233. data/lib/spontaneous/style.rb +27 -9
  234. data/lib/spontaneous/version.rb +1 -1
  235. data/spontaneous.gemspec +719 -0
  236. data/test/disabled/test_slots.rb +1 -1
  237. data/test/experimental/test_cutaneous.rb +309 -0
  238. data/test/experimental/test_features.rb +129 -0
  239. data/test/fixtures/application/views/{index.erubis → index.erb} +0 -0
  240. data/test/fixtures/back/public/css/sass_include.scss +5 -0
  241. data/test/fixtures/back/public/css/sass_template.scss +4 -0
  242. data/test/fixtures/example_application/templates/client_project.html.cut +4 -4
  243. data/test/fixtures/example_application/templates/client_project/images.html.cut +1 -1
  244. data/test/fixtures/example_application/templates/client_projects.html.cut +2 -2
  245. data/test/fixtures/example_application/templates/inline_image.html.cut +1 -1
  246. data/test/fixtures/example_application/templates/layouts/home.html.cut +7 -7
  247. data/test/fixtures/example_application/templates/layouts/info.html.cut +1 -1
  248. data/test/fixtures/example_application/templates/layouts/project.html.cut +4 -4
  249. data/test/fixtures/example_application/templates/layouts/projects.html.cut +2 -2
  250. data/test/fixtures/example_application/templates/project.html.cut +2 -2
  251. data/test/fixtures/example_application/templates/project/inline.html.cut +3 -3
  252. data/test/fixtures/example_application/templates/project_image.html.cut +1 -1
  253. data/test/fixtures/example_application/templates/text.html.cut +1 -1
  254. data/test/fixtures/fields/youtube_api_response.xml +102 -0
  255. data/test/fixtures/layouts/layouts/custom4.html.cut +0 -0
  256. data/test/fixtures/plugins/schema_plugin/public/css/plugin.css +1 -0
  257. data/test/fixtures/plugins/schema_plugin/public/js/plugin.js +1 -0
  258. data/test/fixtures/plugins/schema_plugin/public/static.html +1 -0
  259. data/test/fixtures/plugins/schema_plugin/public/subdir/image.gif +1 -0
  260. data/test/fixtures/plugins/schema_plugin/public/subdir/include1.scss +3 -0
  261. data/test/fixtures/plugins/schema_plugin/public/subdir/sass.scss +4 -0
  262. data/test/fixtures/plugins/schema_plugin/public/subdir/sass/include2.scss +4 -0
  263. data/test/fixtures/public/templates/layouts/default.html.cut +1 -1
  264. data/test/fixtures/public/templates/layouts/default.pdf.cut +1 -1
  265. data/test/fixtures/public/templates/layouts/default.rss.cut +1 -1
  266. data/test/fixtures/public/templates/layouts/dynamic.html.cut +1 -1
  267. data/test/fixtures/schema_modification/config/database.yml +0 -0
  268. data/test/fixtures/schema_modification/config/environment.rb +2 -0
  269. data/test/fixtures/schema_modification/schema/box.rb +1 -0
  270. data/test/fixtures/schema_modification/schema/custom_box.rb +1 -0
  271. data/test/fixtures/schema_modification/schema/page.rb +6 -0
  272. data/test/fixtures/schema_modification/schema/piece.rb +1 -0
  273. data/test/fixtures/search/config/database.yml +1 -0
  274. data/test/fixtures/search/config/indexes.rb +4 -0
  275. data/test/fixtures/serialisation/root_hash.yaml.erb +16 -20
  276. data/test/fixtures/storage/cloud/environment.rb +12 -0
  277. data/test/fixtures/storage/default/environment.rb +1 -0
  278. data/test/fixtures/templates/aliases/layouts/c_alias.html.cut +1 -1
  279. data/test/fixtures/templates/content/include.html.cut +1 -1
  280. data/test/fixtures/templates/content/include_dir.html.cut +1 -1
  281. data/test/fixtures/templates/content/included.epub.cut +1 -1
  282. data/test/fixtures/templates/content/included.html.cut +1 -1
  283. data/test/fixtures/templates/content/partial/included.html.cut +1 -1
  284. data/test/fixtures/templates/content/preprocess.html.cut +1 -1
  285. data/test/fixtures/templates/content/second.html.cut +1 -1
  286. data/test/fixtures/templates/content/template.epub.cut +1 -1
  287. data/test/fixtures/templates/content/template.html.cut +1 -1
  288. data/test/fixtures/templates/default_style_class.html.cut +1 -1
  289. data/test/fixtures/templates/engine/braces.html.cut +6 -0
  290. data/test/fixtures/templates/engine/multiline.html.cut +5 -0
  291. data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
  292. data/test/fixtures/templates/extended/main.html.cut +5 -5
  293. data/test/fixtures/templates/extended/parent.html.cut +10 -8
  294. data/test/fixtures/templates/extended/partial.html.cut +1 -0
  295. data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -0
  296. data/test/fixtures/templates/extended/with_includes.html.cut +9 -0
  297. data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +9 -0
  298. data/test/fixtures/templates/layouts/entries.html.cut +7 -7
  299. data/test/fixtures/templates/layouts/page_style.html.cut +1 -1
  300. data/test/fixtures/templates/layouts/params.html.cut +1 -1
  301. data/test/fixtures/templates/layouts/preview_render.html.cut +2 -2
  302. data/test/fixtures/templates/layouts/standard_page.html.cut +1 -1
  303. data/test/fixtures/templates/layouts/subdir_style.html.cut +1 -1
  304. data/test/fixtures/templates/layouts/template_params.html.cut +1 -1
  305. data/test/fixtures/templates/layouts/variables.html.cut +7 -0
  306. data/test/fixtures/templates/page_class/inline_style.html.cut +1 -1
  307. data/test/fixtures/templates/preview_render/variables.html.cut +1 -0
  308. data/test/fixtures/templates/publishing/templates/layouts/dynamic.html.cut +1 -0
  309. data/test/fixtures/templates/publishing/templates/layouts/dynamic.rtf.cut +1 -0
  310. data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -0
  311. data/test/fixtures/templates/template_class/anonymous_style.html.cut +2 -2
  312. data/test/fixtures/templates/template_class/complex_template.html.cut +4 -4
  313. data/test/fixtures/templates/template_class/complex_template.pdf.cut +4 -4
  314. data/test/fixtures/templates/template_class/default_template_style.html.cut +2 -2
  315. data/test/fixtures/templates/template_class/images_with_template.html.cut +3 -3
  316. data/test/fixtures/templates/template_class/slots_template.html.cut +3 -3
  317. data/test/fixtures/templates/template_class/slots_template.pdf.cut +3 -3
  318. data/test/fixtures/templates/template_class/this_template.epub.cut +1 -1
  319. data/test/fixtures/templates/template_class/this_template.html.cut +1 -1
  320. data/test/fixtures/templates/template_class/this_template.pdf.cut +1 -1
  321. data/test/fixtures/templates/with_default_style_class.html.cut +1 -1
  322. data/test/functional/test_application.rb +19 -15
  323. data/test/functional/test_back.rb +130 -98
  324. data/test/functional/test_front.rb +72 -28
  325. data/test/javascript/test_dom.rb +1 -1
  326. data/test/javascript/test_markdown.rb +1 -1
  327. data/test/slow/test_publishing.rb +94 -75
  328. data/test/slow/test_visibility.rb +47 -14
  329. data/test/test_helper.rb +30 -3
  330. data/test/ui/test_page_editing.rb +1 -1
  331. data/test/unit/test_alias.rb +200 -16
  332. data/test/unit/test_authentication.rb +26 -28
  333. data/test/unit/test_boxes.rb +146 -75
  334. data/test/unit/test_config.rb +42 -20
  335. data/test/unit/test_content.rb +156 -37
  336. data/test/unit/test_content_inheritance.rb +4 -2
  337. data/test/unit/test_extensions.rb +7 -1
  338. data/test/unit/test_fields.rb +558 -290
  339. data/test/{experimental → unit}/test_formats.rb +42 -3
  340. data/test/unit/test_generators.rb +3 -2
  341. data/test/unit/test_helpers.rb +54 -0
  342. data/test/unit/test_image_size.rb +1 -1
  343. data/test/unit/test_images.rb +51 -40
  344. data/test/unit/test_layouts.rb +21 -4
  345. data/test/unit/test_logger.rb +1 -1
  346. data/test/unit/test_media.rb +165 -7
  347. data/test/unit/test_page.rb +158 -27
  348. data/test/unit/test_permissions.rb +170 -187
  349. data/test/unit/test_piece.rb +27 -9
  350. data/test/unit/test_plugins.rb +153 -0
  351. data/test/unit/test_prototype_set.rb +60 -2
  352. data/test/unit/test_prototypes.rb +81 -20
  353. data/test/unit/test_render.rb +97 -9
  354. data/test/unit/test_schema.rb +167 -120
  355. data/test/unit/test_search.rb +588 -0
  356. data/test/unit/test_serialisation.rb +26 -10
  357. data/test/unit/test_site.rb +42 -25
  358. data/test/unit/test_storage.rb +88 -0
  359. data/test/unit/test_structure.rb +11 -5
  360. data/test/unit/test_styles.rb +64 -3
  361. data/test/unit/test_table_scoping.rb +76 -0
  362. data/test/unit/test_templates.rb +69 -31
  363. data/test/unit/test_type_hierarchy.rb +9 -1
  364. metadata +274 -208
  365. data/Gemfile.lock +0 -146
  366. data/application/css/min/54ee0ed3c7fac7632bd5c020d69e9a2503e0c88c.css +0 -1
  367. data/application/css/min/c256adc144e2bdd0b0539356b04eb62db01e1dc3.css +0 -1
  368. data/application/js/edit_dialogue.js +0 -137
  369. data/application/js/min/492a209de8ee955fa9c729a765377495001e11b1.js +0 -17
  370. data/application/js/min/80f684d77c940887a1d4a63e3a96102e993baa98.js +0 -88
  371. data/application/js/min/c7140ec9475e5bf868b901e0621338d7d162358b.js +0 -3
  372. data/application/js/min/f07f2bd6630ee31e1c2288ec223383d8f0658ba6.js +0 -2
  373. data/application/js/vendor/.DS_Store +0 -0
  374. data/application/js/vendor/JS.Class-2.1.5/src/command.js +0 -93
  375. data/application/js/vendor/JS.Class-2.1.5/src/comparable.js +0 -37
  376. data/application/js/vendor/JS.Class-2.1.5/src/constant_scope.js +0 -48
  377. data/application/js/vendor/JS.Class-2.1.5/src/core.js +0 -1060
  378. data/application/js/vendor/JS.Class-2.1.5/src/decorator.js +0 -50
  379. data/application/js/vendor/JS.Class-2.1.5/src/enumerable.js +0 -505
  380. data/application/js/vendor/JS.Class-2.1.5/src/forwardable.js +0 -22
  381. data/application/js/vendor/JS.Class-2.1.5/src/hash.js +0 -334
  382. data/application/js/vendor/JS.Class-2.1.5/src/linked_list.js +0 -114
  383. data/application/js/vendor/JS.Class-2.1.5/src/loader.js +0 -553
  384. data/application/js/vendor/JS.Class-2.1.5/src/method_chain.js +0 -172
  385. data/application/js/vendor/JS.Class-2.1.5/src/observable.js +0 -55
  386. data/application/js/vendor/JS.Class-2.1.5/src/package.js +0 -472
  387. data/application/js/vendor/JS.Class-2.1.5/src/proxy.js +0 -58
  388. data/application/js/vendor/JS.Class-2.1.5/src/ruby.js +0 -44
  389. data/application/js/vendor/JS.Class-2.1.5/src/set.js +0 -332
  390. data/application/js/vendor/JS.Class-2.1.5/src/stack_trace.js +0 -151
  391. data/application/js/vendor/JS.Class-2.1.5/src/state.js +0 -95
  392. data/application/js/vendor/JS.Class-2.1.5/src/stdlib.js +0 -2612
  393. data/application/js/vendor/jquery-1.4.2.min.js +0 -154
  394. data/application/js/vendor/jquery-1.4.3.min.js +0 -166
  395. data/application/js/vendor/jquery-1.5.1.min.js +0 -16
  396. data/application/js/vendor/jquery-1.5.1rc1.min.js +0 -24
  397. data/application/js/vendor/jquery-ui-1.8.6.custom.min.js +0 -265
  398. data/application/js/vendor/jquery-ui-1.8.custom.min.js +0 -106
  399. data/application/js/vendor/jquery.hotkeys-0.7.9.js +0 -248
  400. data/application/js/vendor/jquery.hotkeys-0.7.9.min.js +0 -19
  401. data/application/js/vendor/jsdiff.js +0 -169
  402. data/lib/cutaneous/first_pass_parser.rb +0 -23
  403. data/lib/cutaneous/parser_core.rb +0 -18
  404. data/lib/cutaneous/second_pass_parser.rb +0 -23
  405. data/lib/sequel/plugins/yajl_serialization.rb +0 -154
  406. data/lib/spontaneous/plugins.rb +0 -20
  407. data/lib/spontaneous/proxy_object.rb +0 -12
  408. data/lib/spontaneous/publishing/fire_and_forget.rb +0 -57
  409. data/lib/spontaneous/render/context.rb +0 -100
  410. data/spontaneous.gemspec.tmpl +0 -66
  411. data/test/experimental/test_plugins.rb +0 -64
  412. data/test/fixtures/templates/publishing/layouts/dynamic.html.cut +0 -1
  413. data/test/fixtures/templates/publishing/layouts/static.html.cut +0 -1
@@ -0,0 +1,17 @@
1
+ # encoding: UTF-8
2
+
3
+ module Spontaneous::Plugins::Application
4
+ module Features
5
+ extend ActiveSupport::Concern
6
+
7
+ module ClassMethods
8
+ def register_back_controller(namespace, controller_class)
9
+ instance.register_back_controller(namespace, controller_class)
10
+ end
11
+
12
+ def register_front_controller(namespace, controller_class)
13
+ instance.register_front_controller(namespace, controller_class)
14
+ end
15
+ end # ClassMethods
16
+ end # Features
17
+ end
@@ -1,11 +1,8 @@
1
1
  # encoding: UTF-8
2
2
 
3
-
4
3
  module Spontaneous::Plugins::Application
5
4
  module Paths
6
-
7
- def self.configure(base)
8
- end
5
+ extend ActiveSupport::Concern
9
6
 
10
7
  module ClassMethods
11
8
  def load_paths
@@ -28,9 +25,9 @@ module Spontaneous::Plugins::Application
28
25
  relative_dir(root / "config", *path)
29
26
  end
30
27
 
31
- def template_root=(template_root)
32
- Spot::Render.template_root = template_root.nil? ? nil : File.expand_path(template_root)
33
- end
28
+ # def template_root=(template_root)
29
+ # Spot::Render.template_root = template_root.nil? ? nil : File.expand_path(template_root)
30
+ # end
34
31
 
35
32
  def template_root(*path)
36
33
  relative_dir(Spot::Render.template_root, *path)
@@ -50,26 +47,29 @@ module Spontaneous::Plugins::Application
50
47
  end
51
48
 
52
49
  def schema_map
53
- Spontaneous::Schema.schema_map_file
50
+ Spontaneous.schema.schema_map_file
54
51
  end
55
52
 
56
53
  def schema_map=(path)
57
- Spontaneous::Schema.schema_map_file = path
54
+ Spontaneous.schema.schema_map_file = path
58
55
  end
59
56
 
60
- def media_dir=(dir)
61
- @media_dir = File.expand_path(dir)
62
- end
57
+ # def media_dir=(dir)
58
+ # @media_dir = File.expand_path(dir)
59
+ # end
63
60
 
64
61
  def media_dir(*path)
65
- @media_dir ||= File.expand_path(root / "cache/media")
66
- relative_dir(@media_dir, *path)
62
+ Spontaneous.instance.media_dir(*path)
67
63
  end
68
64
 
69
65
  def media_path(*args)
70
66
  Spontaneous::Media.media_path(*args)
71
67
  end
72
68
 
69
+ def cache_dir(*path)
70
+ Spontaneous.instance.cache_dir(*path)
71
+ end
72
+
73
73
  def shard_path(hash=nil)
74
74
  if hash
75
75
  path = ['tmp', hash[0..1], hash[2..3], hash]
@@ -82,26 +82,23 @@ module Spontaneous::Plugins::Application
82
82
  end
83
83
 
84
84
  def root(*path)
85
- @root ||= File.expand_path(ENV[Spontaneous::SPOT_ROOT] || Dir.pwd)
86
- relative_dir(@root, *path)
85
+ Spontaneous.instance.root(*path)
87
86
  end
88
87
 
89
- def root=(root)
90
- @root = File.expand_path(root)
91
- end
88
+ # def root=(root)
89
+ # @root = File.expand_path(root)
90
+ # end
92
91
 
93
92
  def revision_root(*path)
94
- @revision_dir ||= File.expand_path(root / 'cache/revisions')
95
- relative_dir(@revision_dir, *path)
93
+ Spontaneous.instance.revision_root(*path)
96
94
  end
97
95
 
98
- def revision_root=(revision_dir)
99
- @revision_dir = File.expand_path(revision_dir)
100
- end
96
+ # def revision_root=(revision_dir)
97
+ # @revision_dir = File.expand_path(revision_dir)
98
+ # end
101
99
 
102
- def revision_dir(revision=nil, root = revision_root)
103
- return root / 'current' if revision.nil?
104
- root / revision.to_s.rjust(5, "0")
100
+ def revision_dir(revision=nil, root = nil)
101
+ Spontaneous.instance.revision_dir(revision, root)
105
102
  end
106
103
 
107
104
  def gem_dir(*path)
@@ -126,12 +123,9 @@ module Spontaneous::Plugins::Application
126
123
  relative_dir(application_dir / "css", *path)
127
124
  end
128
125
 
129
- private
130
-
131
126
  def relative_dir(root, *path)
132
- File.join(root, *path)
127
+ File.join(root, *path.map { |p| p.to_s })
133
128
  end
134
129
  end # ClassMethods
135
130
  end # Paths
136
131
  end
137
-
@@ -1,13 +1,10 @@
1
1
  # encoding: UTF-8
2
2
 
3
-
4
3
  require 'cutaneous'
5
4
 
6
5
  module Spontaneous::Plugins::Application
7
6
  module Render
8
-
9
- def self.configure(base)
10
- end
7
+ extend ActiveSupport::Concern
11
8
 
12
9
  module ClassMethods
13
10
  attr_accessor :render_engine
@@ -26,4 +23,3 @@ module Spontaneous::Plugins::Application
26
23
  end # ClassMethods
27
24
  end # Render
28
25
  end # Spontaneous::Plugins::Application
29
-
@@ -2,6 +2,8 @@
2
2
 
3
3
  module Spontaneous::Plugins::Application
4
4
  module Serialisation
5
+ extend ActiveSupport::Concern
6
+
5
7
  module ClassMethods
6
8
  include Spontaneous::JSON
7
9
  def serialise_http(object)
@@ -1,22 +1,20 @@
1
1
  # encoding: UTF-8
2
2
 
3
-
4
3
  module Spontaneous::Plugins::Application
5
4
  module State
6
-
7
- def self.configure(base)
8
- end
5
+ extend ActiveSupport::Concern
9
6
 
10
7
  module ClassMethods
11
-
12
8
  def init(options={})
13
9
  # return false if loaded?
14
10
  self.environment = (options.delete(:environment) || ENV["SPOT_ENV"] || :development)
15
11
  self.mode = options.delete(:mode) || ENV["SPOT_MODE"] || :back
12
+ root = options.delete(:root) || ENV["SPOT_ROOT"] || Dir.pwd
13
+ site = Spontaneous::Site.instantiate(root, environment, mode)
16
14
  Spontaneous::Logger.setup(:log_level => options[:log_level], :logfile => options[:logfile], :cli => options[:cli])
17
- Spontaneous.instance = Spontaneous::Site.instantiate(root, environment, mode)
18
- Spontaneous.instance.initialize!
19
- Spontaneous::Schema.validate! if self.mode == :console
15
+ site.initialize!
16
+ site.schema.validate! if self.mode == :console
17
+ logger.warn "Auto login is enabled and set to '#{site.config.auto_login}'. Please ensure this is disabled in production mode by removing the 'auto_login' setting from your environment file." if site.config.auto_login and mode == :back
20
18
  Thread.current[:spontaneous_loaded] = true
21
19
  end
22
20
 
@@ -83,4 +81,3 @@ module Spontaneous::Plugins::Application
83
81
  end # ClassMethods
84
82
  end # State
85
83
  end
86
-
@@ -2,19 +2,30 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module Boxes
5
+ extend ActiveSupport::Concern
6
+
5
7
  module ClassMethods
6
8
  def box(name, options = {}, &block)
7
9
  name = name.to_sym
8
- unless boxes.key?(name)
9
- box_prototypes[name] = Spontaneous::Prototypes::BoxPrototype.new(self, name, options, &block)
10
- unless method_defined?(name)
11
- class_eval <<-BOX
12
- def #{name}
13
- boxes[:#{name}]
14
- end
15
- BOX
16
- end
10
+ prototype = nil
11
+ options[:group] = @box_group if @box_group
12
+
13
+ if existing_prototype = boxes[name]
14
+ prototype = existing_prototype.merge(self, options, &block)
15
+ else
16
+ prototype = Spontaneous::Prototypes::BoxPrototype.new(self, name, options, &block)
17
17
  end
18
+
19
+ box_prototypes[name] = prototype
20
+
21
+ unless method_defined?(name)
22
+ class_eval <<-BOX
23
+ def #{name}
24
+ boxes[:#{name}]
25
+ end
26
+ BOX
27
+ end
28
+ prototype
18
29
  end
19
30
 
20
31
  def boxes
@@ -36,49 +47,63 @@ module Spontaneous::Plugins
36
47
  def box?(box_name)
37
48
  box_prototypes.key?(box_name.to_sym)
38
49
  end
39
- end
40
-
41
- module InstanceMethods
42
50
 
43
- def reload
44
- @boxes = nil
45
- super
51
+ def is_box?
52
+ false
46
53
  end
47
54
 
48
- def boxes(*args)
49
- @boxes ||= Spontaneous::Collections::BoxSet.new(self)
55
+ def box_group(name, &block)
56
+ @box_group = name #box_groups[name.to_sym]
57
+ yield if block_given?
58
+ ensure
59
+ @box_group = nil
50
60
  end
51
61
 
52
- def iterable
53
- boxes
62
+ def box_position(box_prototype)
63
+ box_prototypes.index(box_prototype)
54
64
  end
65
+ end # ClassMethods
55
66
 
56
- def box?(box_name)
57
- self.class.box?(box_name.to_sym)
58
- end
67
+ # InstanceMethods
59
68
 
60
- def box_data(box)
61
- # TODO: use schema id to retrieve box data
62
- box_id = box.schema_id.to_s
63
- (self.box_store || []).detect { |data| data[:box_id] == box_id } || {}
64
- end
69
+ def reload
70
+ @boxes = nil
71
+ super
72
+ end
65
73
 
66
- def box_field_store(box)
67
- box_data(box)[:fields]
68
- end
74
+ def boxes(*args)
75
+ @boxes ||= Spontaneous::Collections::BoxSet.new(self)
76
+ end
69
77
 
70
- def box_modified!(modified_box)
71
- self.box_store = serialize_boxes
72
- end
78
+ def iterable
79
+ boxes
80
+ end
73
81
 
74
- def serialize_boxes
75
- boxes.map { |box| box.serialize_db }
76
- end
77
82
 
78
- def box_style_id(box_name)
79
- nil
80
- end
83
+ def box?(box_name)
84
+ self.class.box?(box_name.to_sym)
85
+ end
86
+
87
+ def box_data(box)
88
+ # TODO: use schema id to retrieve box data
89
+ box_id = box.schema_id.to_s
90
+ (self.box_store || []).detect { |data| data[:box_id] == box_id } || {}
91
+ end
92
+
93
+ def box_field_store(box)
94
+ box_data(box)[:fields]
95
+ end
96
+
97
+ def box_modified!(modified_box)
98
+ self.box_store = serialize_boxes
99
+ end
100
+
101
+ def serialize_boxes
102
+ boxes.map { |box| box.serialize_db }
103
+ end
104
+
105
+ def box_style_id(box_name)
106
+ nil
81
107
  end
82
108
  end
83
109
  end
84
-
@@ -1,10 +1,10 @@
1
1
  # encoding: UTF-8
2
2
 
3
-
4
3
  module Spontaneous::Plugins
5
4
  module Controllers
6
- ACTION_SEPARATOR = "@".freeze
5
+ extend ActiveSupport::Concern
7
6
 
7
+ ACTION_SEPARATOR = "@".freeze
8
8
 
9
9
  module ClassMethods
10
10
  def controllers
@@ -29,24 +29,24 @@ module Spontaneous::Plugins
29
29
  end
30
30
  end # ClassMethods
31
31
 
32
- module InstanceMethods
33
- # resolve and call the relevant action handler and return the results to the controller
34
- def process_action(action_path, env, format)
35
- env = env.dup
36
- namespace, *p = action_path.split(S::Constants::SLASH)
37
- path = [S::Constants::EMPTY].concat(p).join(S::Constants::SLASH)
38
- env[S::Constants::PATH_INFO] = path
39
- controller_class = self.class.controllers[namespace.to_sym]
40
- return 404 unless controller_class
41
- app = controller_class.new(self, format)
42
- app.call(env)
43
- end
44
-
45
- # generate an action URL of the form
46
- # <path to page>/@<action namespace>/<action path>
47
- def action_url(namespace, path)
48
- [self.path, "#{ACTION_SEPARATOR}#{namespace}", path].join(S::Constants::SLASH).gsub(%r{//}, '/')
49
- end
50
- end # InstanceMethods
51
- end # Actions
32
+ # InstanceMethods
33
+
34
+ # resolve and call the relevant action handler and return the results to the controller
35
+ def process_action(action_path, env, format)
36
+ env = env.dup
37
+ namespace, *p = action_path.split(S::Constants::SLASH)
38
+ path = [S::Constants::EMPTY].concat(p).join(S::Constants::SLASH)
39
+ env[S::Constants::PATH_INFO] = path
40
+ controller_class = self.class.controllers[namespace.to_sym]
41
+ return 404 unless controller_class
42
+ app = controller_class.new(self, format)
43
+ app.call(env)
44
+ end
45
+
46
+ # generate an action URL of the form
47
+ # <path to page>/@<action namespace>/<action path>
48
+ def action_url(namespace, path)
49
+ [self.path, "#{ACTION_SEPARATOR}#{namespace}", path].join(S::Constants::SLASH).gsub(%r{//}, '/')
50
+ end
51
+ end # Controllers
52
52
  end
@@ -2,192 +2,191 @@
2
2
 
3
3
  module Spontaneous::Plugins
4
4
  module Entries
5
+ extend ActiveSupport::Concern
5
6
 
6
- def self.configure(base)
7
- base.__send__(:alias_method, :<<, :push)
7
+ included do
8
+ alias_method :<<, :push
8
9
  end
9
-
10
- module InstanceMethods
11
- CONTENT_PATH_SEP = ".".freeze
12
-
13
- # because it's possible to build content out of order
14
- # some relations don't necessarily get created straight away
15
- def before_save
16
- if container
17
- self.page = container.page if page.nil?
18
- if page?
19
- self.depth = parent ? ((parent.depth || 0) + 1) : 0
20
- else
21
- self.depth = (container.content_depth || 0) + 1
22
- end
23
- end
24
- super
25
- end
26
-
27
- def after_save
28
- pieces.each do |entry|
29
- entry.save if entry.modified?
30
- end
31
- super
32
- end
33
-
34
- def destroy(remove_container_entry=true, container=nil)
35
- container ||= self.container
36
- if container && remove_container_entry
37
- container.destroy_entry!(self)
10
+ #
11
+ # def self.configure(base)
12
+ # base.__send__(:alias_method, :<<, :push)
13
+ # end
14
+
15
+ # InstanceMethods
16
+
17
+ VISIBILITY_PATH_SEP = ".".freeze
18
+
19
+ # because it's possible to build content out of order
20
+ # some relations don't necessarily get created straight away
21
+ def before_save
22
+ if owner
23
+ self.page = owner.page if page.nil?
24
+ if page?
25
+ self.depth = parent ? ((parent.depth || 0) + 1) : 0
26
+ else
27
+ self.depth = (owner.content_depth || 0) + 1
38
28
  end
39
- super()
40
- end
41
-
42
- def before_destroy
43
- recursive_destroy
44
- super
45
29
  end
30
+ super
31
+ end
46
32
 
47
- def recursive_destroy
48
- all_pieces.destroy
33
+ def after_save
34
+ pieces.each do |entry|
35
+ entry.save if entry.modified?
49
36
  end
37
+ super
38
+ end
50
39
 
51
- def destroy_entry!(entry)
52
- pieces.remove(entry)
53
- # save the container because it won't be obvious to the caller
54
- # that content other than the destroyed object will have been
55
- # modified
56
- self.save
40
+ def destroy(remove_owner_entry=true, owner=nil)
41
+ owner ||= self.owner
42
+ if owner && remove_owner_entry
43
+ owner.destroy_entry!(self)
57
44
  end
45
+ super()
46
+ end
58
47
 
59
- def content_depth
60
- depth
61
- end
48
+ def before_destroy
49
+ recursive_destroy
50
+ super
51
+ end
62
52
 
63
- def entry_modified!(modified_entry)
64
- self.entry_store = all_pieces.serialize_db
65
- end
53
+ def recursive_destroy
54
+ all_pieces.destroy
55
+ end
66
56
 
67
- def pieces
68
- if Spontaneous::Content.visible_only?
69
- visible_pieces
70
- else
71
- all_pieces
72
- end
73
- end
57
+ def destroy_entry!(entry)
58
+ pieces.remove(entry)
59
+ # save the owner because it won't be obvious to the caller
60
+ # that content other than the destroyed object will have been
61
+ # modified
62
+ self.save
63
+ end
74
64
 
75
- # ensure that all access to pieces is through their corresponding entry
76
- # alias_method :pieces, :entries
65
+ def content_depth
66
+ depth
67
+ end
77
68
 
78
- def all_pieces
79
- @all_pieces ||= Spontaneous::Collections::EntrySet.new(self, entry_store)
80
- end
69
+ def entry_modified!(modified_entry)
70
+ self.entry_store = all_pieces.serialize_db
71
+ end
81
72
 
82
- def visible_pieces
83
- @visible_pieces ||= all_pieces.visible!
84
- end
73
+ def pieces
74
+ return visible_pieces if Spontaneous::Content.visible_only?
75
+ all_pieces
76
+ end
85
77
 
86
- protected(:all_pieces, :visible_pieces)
78
+ # ensure that all access to pieces is through their corresponding entry
79
+ # alias_method :pieces, :entries
87
80
 
88
- def reload
89
- @all_pieces = @visible_pieces = nil
90
- super
91
- end
81
+ def all_pieces
82
+ @all_pieces ||= Spontaneous::Collections::EntrySet.new(self, entry_store)
83
+ end
92
84
 
85
+ def visible_pieces
86
+ @visible_pieces ||= all_pieces.visible!
87
+ end
93
88
 
94
- def first
95
- pieces.first
96
- end
89
+ protected(:all_pieces, :visible_pieces)
97
90
 
98
- def last
99
- pieces.last
100
- end
91
+ def reload
92
+ @all_pieces = @visible_pieces = nil
93
+ super
94
+ end
101
95
 
102
- def push(page_or_piece)
103
- insert(-1, page_or_piece)
104
- end
105
96
 
106
- def insert(index, page_or_piece, box = nil)
107
- save if new?
108
- if page_or_piece.page?
109
- insert_page(index, page_or_piece, box)
110
- else
111
- insert_piece(index, page_or_piece, box)
112
- end
113
- end
97
+ def first
98
+ pieces.first
99
+ end
114
100
 
101
+ def last
102
+ pieces.last
103
+ end
115
104
 
116
- def insert_page(index, child_page, box = nil)
117
- child_page.container = self
118
- if page
119
- child_page.depth = page.depth + 1
120
- page.children << child_page
121
- child_page.parent = page
122
- child_page.update_path
123
- end
124
- insert_with_style(:page, index, child_page, box)
125
- end
105
+ def push(page_or_piece)
106
+ insert(-1, page_or_piece)
107
+ end
126
108
 
127
- def insert_piece(index, piece, box = nil)
128
- piece.container = self
129
- piece.page = page if page
130
- piece.depth = (content_depth || 0) + 1
131
- insert_with_style(:piece, index, piece, box)
109
+ def insert(index, page_or_piece, box)
110
+ save if new?
111
+ if page_or_piece.page?
112
+ insert_page(index, page_or_piece, box)
113
+ else
114
+ insert_piece(index, page_or_piece, box)
132
115
  end
116
+ end
133
117
 
134
- def insert_with_style(type, index, content, box = nil)
135
- self._pieces << content
136
- entry_style = style_for_content(content, box)
137
- content.box_sid = box.schema_id if box
138
- content._prototype = box.prototype_for_content(content) if box
139
- content.save if content.new?
140
- entry = \
141
- case type
142
- when :page
143
- Spontaneous::PagePiece.new(self, content, entry_style ? entry_style.schema_id : nil)
144
- when :piece
145
- content.style = entry_style
146
- content
147
- end
148
- begin
149
- pieces.insert(index, entry)
150
- rescue TypeError, RuntimeError => e
151
- # TODO: raise a custom more helpful error here
152
- logger.error { "Attempting to modify visible only pieces" }
153
- raise e
154
- end
155
118
 
156
- entry
119
+ def insert_page(index, child_page, box)
120
+ child_page.owner = self
121
+ if page
122
+ child_page.depth = page.depth + 1
123
+ page.unordered_children << child_page
124
+ child_page.parent = page
125
+ child_page.update_path
157
126
  end
127
+ insert_with_style(:page, index, child_page, box)
128
+ end
158
129
 
159
- def update_position(position)
160
- entry.set_position(position)
161
- container.save
162
- end
130
+ def insert_piece(index, piece, box)
131
+ piece.owner = self
132
+ piece.page = page if page
133
+ piece.depth = (content_depth || 0) + 1
134
+ insert_with_style(:piece, index, piece, box)
135
+ end
163
136
 
164
- def set_position(new_position)
165
- if box
166
- box.set_position(self, new_position)
167
- else
168
- container.pieces.set_position(self, new_position)
169
- end
170
- end
137
+ def insert_with_style(type, index, content, box)
138
+ self._pieces << content
139
+ entry_style = style_for_content(content, box)
140
+ content.box_sid = box.schema_id if box
141
+ content._prototype = box.prototype_for_content(content) if box
142
+ content.save if content.new?
143
+ entry = \
144
+ case type
145
+ when :page
146
+ Spontaneous::PagePiece.new(self, content, entry_style ? entry_style.schema_id : nil)
147
+ when :piece
148
+ content.style = entry_style
149
+ content
150
+ end
151
+ begin
152
+ pieces.insert(index, box, entry)
153
+ rescue TypeError, RuntimeError => e
154
+ # TODO: raise a custom more helpful error here
155
+ logger.error { "Attempting to modify visible only pieces" }
156
+ raise e
157
+ end
158
+
159
+ entry
160
+ end
171
161
 
172
- def style_for_content(content, box = nil)
173
- if box
174
- box.style_for_content(content)
162
+ def update_position(position)
163
+ entry.set_position(position)
164
+ owner.save
165
+ end
175
166
 
176
- else
177
- content.default_style
178
- end
167
+ def set_position(new_position)
168
+ if box
169
+ box.set_position(self, new_position)
170
+ else
171
+ owner.pieces.set_position(self, new_position)
179
172
  end
173
+ end
180
174
 
181
- def available_styles(content)
182
- content.class.styles
175
+ def style_for_content(content, box = nil)
176
+ if box
177
+ box.style_for_content(content)
178
+ else
179
+ content.default_style
183
180
  end
181
+ end
184
182
 
185
- def container=(container)
186
- super
187
- self[:content_path] = [container.content_path, container.id].compact.join(CONTENT_PATH_SEP)
188
- end
183
+ def available_styles(content)
184
+ content.class.styles
185
+ end
189
186
 
190
- end # InstanceMethods
187
+ def owner=(owner)
188
+ super
189
+ self[:visibility_path] = [owner.visibility_path, owner.id].compact.join(VISIBILITY_PATH_SEP)
190
+ end
191
191
  end # Entries
192
192
  end # Spontaneous::Plugins
193
-