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
@@ -1,14 +1,21 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'test_helper'
3
+ require File.expand_path('../../test_helper', __FILE__)
4
4
 
5
5
 
6
6
  class VisibilityTest < MiniTest::Spec
7
7
 
8
+
9
+ def setup
10
+ @site = setup_site
11
+ end
12
+
13
+ def teardown
14
+ teardown_site
15
+ end
16
+
8
17
  context "Content" do
9
18
  setup do
10
- Spontaneous.database = DB
11
- Spontaneous::Schema.reset!
12
19
  Content.delete
13
20
  class ::R < Page; end
14
21
  R.box :pages
@@ -30,13 +37,25 @@ class VisibilityTest < MiniTest::Spec
30
37
  2.times do |l|
31
38
  e.things << E.new(:uid => "#{i}.#{j}.#{k}.#{l}")
32
39
  end
33
- d.save
40
+ e.save
34
41
  end
42
+ # puts "-->"
43
+ # puts d.id
44
+ # p [:things, d.class, d.pages.schema_id.to_s, P.boxes.things.schema_id.to_s]
45
+ # p c.unordered_children.map { |p| [p.parent_id, p.box_sid.to_s, p.uid] }
46
+ # p c.children.map { |p| p.box_sid.to_s }
47
+ # puts "--<"
48
+ # c.save
49
+ # d.save
35
50
  end
36
- c.save
37
51
  end
38
52
  @root.save
39
53
  @root.reload
54
+ # puts "-->"
55
+ # p [:things, @root.pages.first.class, @root.pages.first.things.schema_id.to_s, P.boxes.things.schema_id.to_s]
56
+ # p @root.pages.first.unordered_children.map { |p| [p.box_sid.to_s, p.uid] }
57
+ # p @root.pages.first.children.map { |p| p.box_sid.to_s }
58
+ # puts "--<"
40
59
  @child = Page.uid("0")
41
60
  end
42
61
 
@@ -107,8 +126,8 @@ class VisibilityTest < MiniTest::Spec
107
126
 
108
127
  should "hide all descendents of page content" do
109
128
  piece = Content.first(:uid => "0.0")
110
- f = Piece.new(:uid => "0.0.X")
111
- piece << f
129
+ f = E.new(:uid => "0.0.X")
130
+ piece.pages << f
112
131
  piece.save
113
132
  piece.reload
114
133
  piece.hide!
@@ -163,8 +182,10 @@ class VisibilityTest < MiniTest::Spec
163
182
  piece1 = Content.first(:uid => "0.0.0.0")
164
183
  piece2 = Content.first(:uid => "0.0.0.1")
165
184
  parent = Content.first(:uid => "0.0.0")
166
- piece1.container.should == parent
167
- piece2.container.should == parent
185
+ piece1.owner.should == parent
186
+ piece2.owner.should == parent
187
+ piece1.container.should == parent.things
188
+ piece2.container.should == parent.things
168
189
  piece1.hide!
169
190
  parent.hide!
170
191
  parent.reload.visible?.should be_false
@@ -187,6 +208,12 @@ class VisibilityTest < MiniTest::Spec
187
208
  end
188
209
  end
189
210
 
211
+ context "top-level searches" do
212
+ should "return a list of visible pages" do
213
+ @root.pages.first.hide!
214
+ P.visible.count.should == 9
215
+ end
216
+ end
190
217
  context "visibility scoping" do
191
218
  setup do
192
219
  # S.database.logger = ::Logger.new($stdout)
@@ -214,6 +241,8 @@ class VisibilityTest < MiniTest::Spec
214
241
  should "only show visibile pieces" do
215
242
  page = Content.first(:uid => "1")
216
243
  page.pieces.length.should == 4
244
+ page.things.pieces.length.should == 4
245
+ page.things.count.should == 4
217
246
  page.pieces.first.hide!
218
247
  page.reload
219
248
  Content.with_visible do
@@ -228,8 +257,7 @@ class VisibilityTest < MiniTest::Spec
228
257
  Content.with_visible do
229
258
  # would like to make sure we're raising a predictable error
230
259
  # but 1.9 changes the typeerror to a runtime error
231
- lambda { page.pieces << Piece.new }.must_raise(TypeError, RuntimeError)
232
- lambda { page << Piece.new }.must_raise(TypeError, RuntimeError)
260
+ lambda { page.things << Piece.new }.must_raise(TypeError, RuntimeError)
233
261
  end
234
262
  end
235
263
 
@@ -237,13 +265,18 @@ class VisibilityTest < MiniTest::Spec
237
265
  @root.reload
238
266
  @root.children.first.children.length.should == 8
239
267
  @root.children.first.pieces.first.hide!
240
- # p @root.children.first.children.map { |c| c.visible? }
241
268
  @root.reload
242
269
  Content.with_visible do
243
270
  @root.children.first.children.length.should == 6
244
271
  end
245
- # p @root.children.map { |c| c.uid }
246
- # p @root.children.first.children.length
272
+ end
273
+
274
+ should "hide pages without error" do
275
+ @root.pages.first.hide!
276
+ @root.reload
277
+ Content.with_visible do
278
+ pieces = @root.pages.pieces.map { |p| p }
279
+ end
247
280
  end
248
281
  end
249
282
  end
data/test/test_helper.rb CHANGED
@@ -10,6 +10,12 @@ Bundler.setup(:default, :development)
10
10
 
11
11
  Bundler.require
12
12
 
13
+ # include these paths to enable the direct running of a test file
14
+ test_path = File.expand_path('..', __FILE__)
15
+ spot_path = File.expand_path('../../lib', __FILE__)
16
+ $:.unshift(test_path) if File.directory?(test_path) && !$:.include?(test_path)
17
+ $:.unshift(spot_path) if File.directory?(spot_path) && !$:.include?(spot_path)
18
+
13
19
  require 'rack'
14
20
  require 'logger'
15
21
 
@@ -32,6 +38,9 @@ require 'shoulda'
32
38
  require 'timecop'
33
39
  require 'mocha'
34
40
  require 'pp'
41
+ require 'tmpdir'
42
+ require 'json'
43
+
35
44
  begin
36
45
  require 'leftright'
37
46
  rescue LoadError
@@ -69,9 +78,6 @@ class MiniTestWithHooks < MiniTest::Unit
69
78
 
70
79
  def _run_suite(suite, type)
71
80
  begin
72
- Spontaneous::Schema.schema_loader_class = Spontaneous::Schema::TransientMap
73
- Spontaneous::Schema.reset!
74
- Spontaneous.logger.silent!
75
81
  unless exclude?(suite)
76
82
  print "\n#{suite.to_s.gsub(/Test$/, '').ljust(@max_name_length, " ")} "
77
83
  end
@@ -106,6 +112,27 @@ class MiniTest::Spec
106
112
  attr_accessor :template_root
107
113
  alias :silence_stdout :silence_logger
108
114
 
115
+ def self.setup_site(root = nil)
116
+ root ||= Dir.mktmpdir
117
+ instance = Spontaneous::Site.instantiate(root, :test, :back)
118
+ instance.schema_loader_class = Spontaneous::Schema::TransientMap
119
+ instance.logger.silent!
120
+ instance.database = DB
121
+ instance
122
+ end
123
+
124
+ def self.teardown_site
125
+ FileUtils.rm_r(Spontaneous.instance.root) rescue nil
126
+ end
127
+
128
+ def setup_site(root = nil)
129
+ self.class.setup_site(root)
130
+ end
131
+
132
+ def teardown_site
133
+ self.class.teardown_site
134
+ end
135
+
109
136
  def template_root=(template_root)
110
137
  @template_root = template_root
111
138
  Spontaneous.stubs(:template_paths).returns([@template_root])
@@ -1,6 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'test_helper'
3
+ require File.expand_path('../../test_helper', __FILE__)
4
4
  require 'ui_helper'
5
5
 
6
6
 
@@ -1,13 +1,13 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'test_helper'
3
+ require File.expand_path('../../test_helper', __FILE__)
4
4
 
5
5
  class AliasTest < MiniTest::Spec
6
6
 
7
7
  def assert_same_content(c1, c2)
8
8
  assert_equal c1.length, c2.length
9
- c1.sort! { |a, b| a.id <=> b.id }
10
- c2.sort! { |a, b| a.id <=> b.id }
9
+ c1 = c1.dup.sort { |a, b| a.id <=> b.id }
10
+ c2 = c2.dup.sort { |a, b| a.id <=> b.id }
11
11
  c1.each_with_index do |a, i|
12
12
  b = c2[i]
13
13
  assert_equal a.id, b.id
@@ -17,13 +17,15 @@ class AliasTest < MiniTest::Spec
17
17
 
18
18
  context "Aliases:" do
19
19
  setup do
20
- Spot::Schema.reset!
20
+ @site = setup_site
21
21
  Content.delete
22
22
 
23
23
  self.template_root = File.expand_path(File.join(File.dirname(__FILE__), "../fixtures/templates/aliases"))
24
24
 
25
25
  class ::Page < Spontaneous::Page
26
26
  field :title
27
+ box :box1
28
+ box :box2
27
29
  end
28
30
 
29
31
  class ::Piece < Spontaneous::Piece; end
@@ -59,6 +61,8 @@ class AliasTest < MiniTest::Spec
59
61
 
60
62
  class ::BB < ::B
61
63
  field :bb_field1
64
+
65
+ box :box1
62
66
  end
63
67
 
64
68
  class ::AAlias < ::Piece
@@ -79,6 +83,7 @@ class AliasTest < MiniTest::Spec
79
83
 
80
84
  class ::BAlias < ::Page
81
85
  alias_of :B
86
+ box :box1
82
87
  end
83
88
 
84
89
  class ::BBAlias < ::Piece
@@ -88,25 +93,31 @@ class AliasTest < MiniTest::Spec
88
93
  class ::MultipleAlias < ::Piece
89
94
  alias_of :AA, :B
90
95
  end
96
+
97
+ class ::ProcAlias < ::Piece
98
+ alias_of proc { Spontaneous::Site.root.children }
99
+ end
100
+
91
101
  @root = ::Page.create
92
102
  @aliases = ::Page.create(:slug => "aliases").reload
93
- @root << @aliases
103
+ @root.box1 << @aliases
94
104
  @a = A.create(:a_field1 => "@a.a_field1").reload
95
105
  @aa = AA.create.reload
96
106
  @aaa1 = AAA.create(:aaa_field1 => "aaa1").reload
97
107
  @aaa2 = AAA.create.reload
98
108
  @b = B.new(:slug => "b")
99
- @root << @b
109
+ @root.box1 << @b
100
110
  @bb = BB.new(:slug => "bb", :bb_field1 => "BB")
101
- @root << @bb
102
- @root.save
111
+ @root.box1 << @bb
112
+ @root.save.reload
103
113
  end
104
114
 
105
115
  teardown do
106
- [:Page, :Piece, :A, :AA, :AAA, :B, :BB, :AAlias, :AAAlias, :AAAAlias, :BBAlias, :BAlias, :MultipleAlias].each do |c|
116
+ [:Page, :Piece, :A, :AA, :AAA, :B, :BB, :AAlias, :AAAlias, :AAAAlias, :BBAlias, :BAlias, :MultipleAlias, :ProcAlias].each do |c|
107
117
  Object.send(:remove_const, c) rescue nil
108
118
  end
109
- # Content.delete
119
+ Content.delete
120
+ FileUtils.rm_r(@site.root)
110
121
  end
111
122
 
112
123
  context "All alias" do
@@ -131,6 +142,108 @@ class AliasTest < MiniTest::Spec
131
142
  instance2 = AAlias.create(:target => @a).reload
132
143
  assert_same_content @a.aliases, [instance1, instance2]
133
144
  end
145
+
146
+ should "accept a proc that returns an array as a target list generator" do
147
+ assert_same_content ProcAlias.targets, @root.children
148
+ end
149
+
150
+ context "with container options" do
151
+ setup do
152
+ @page = ::Page.new(:uid => "thepage")
153
+ 4.times { |n|
154
+ @page.box1 << A.new
155
+ @page.box1 << AA.new
156
+ @page.box2 << A.new
157
+ @page.box2 << AA.new
158
+ }
159
+ @page.save.reload
160
+ end
161
+
162
+ teardown do
163
+ Object.send(:remove_const, 'X') rescue nil
164
+ Object.send(:remove_const, 'XX') rescue nil
165
+ Object.send(:remove_const, 'XXX') rescue nil
166
+ end
167
+
168
+ should "allow for selecting only content from within one box" do
169
+ class ::X < ::Piece
170
+ alias_of :A, :container => Proc.new { S::Site['#thepage'].box1 }
171
+ end
172
+ class ::XX < ::Piece
173
+ alias_of :AA, :container => Proc.new { S::Site['#thepage'].box1 }
174
+ end
175
+ X.targets.should == @page.box1.select { |p| A === p }
176
+ XX.targets.should == @page.box1.select { |p| AA === p }
177
+ end
178
+
179
+ should "allow for selecting only content from a range of boxes" do
180
+ class ::X < ::Piece
181
+ alias_of :A, :container => Proc.new { [S::Site['#thepage'].box1, S::Site['#thepage'].box2] }
182
+ end
183
+ class ::XX < ::Piece
184
+ alias_of :AA, :container => Proc.new { [S::Site['#thepage'].box1, S::Site['#thepage'].box2] }
185
+ end
186
+ assert_same_content X.targets, @page.box1.select { |p| A === p } + @page.box2.select { |p| A === p }
187
+ assert_same_content XX.targets, @page.box1.select { |p| AA === p } + @page.box2.select { |p| AA === p }
188
+ end
189
+
190
+ should "allow for selecting only content from within one page" do
191
+ class ::X < ::Piece
192
+ alias_of :A, :container => Proc.new { S::Site['#thepage'] }
193
+ end
194
+ class ::XX < ::Piece
195
+ alias_of :AA, :container => Proc.new { S::Site['#thepage'] }
196
+ end
197
+ assert_same_content X.targets, @page.content.select { |p| A === p }
198
+ assert_same_content XX.targets, @page.content.select { |p| AA === p }
199
+ end
200
+
201
+ should "allow for selecting only content from a range of pages & boxes" do
202
+ page2 = ::Page.new(:uid => "thepage2")
203
+ 4.times { |n|
204
+ page2.box1 << A.new
205
+ page2.box1 << AA.new
206
+ page2.box2 << A.new
207
+ page2.box2 << AA.new
208
+ }
209
+ page2.save.reload
210
+ class ::X < ::Piece
211
+ alias_of :A, :AA, :container => Proc.new { [S::Site['#thepage'].box1, S::Site['#thepage2']] }
212
+ end
213
+ class ::XX < ::Piece
214
+ alias_of :AA, :container => Proc.new { [S::Site['#thepage'], S::Site['#thepage2'].box2] }
215
+ end
216
+ assert_same_content X.targets(@page, @page.box1), @page.box1.contents + page2.content
217
+ assert_same_content XX.targets, @page.content.select { |p| AA === p } + page2.box2.select { |p| AA === p }
218
+ end
219
+
220
+ should "allow for selecting content only from the content of the owner of the box" do
221
+ class ::X < ::Piece
222
+ alias_of proc { |owner| owner.box1.pieces }
223
+ end
224
+ class ::XX < ::Piece
225
+ alias_of proc { |owner, box| box.pieces }
226
+ end
227
+ class ::XXX < ::Piece
228
+ alias_of :A, :container => proc { |owner, box| box }
229
+ end
230
+ assert_same_content X.targets(@page), @page.box1.contents
231
+ assert_same_content XX.targets(@page, @page.box1), @page.box1.contents
232
+ assert_same_content XX.targets(@page, @page.box2), @page.box2.contents
233
+ assert_same_content XXX.targets(@page, @page.box1), @page.box1.contents.select { |p| A === p }
234
+ end
235
+
236
+ should "allow for filtering instances according to some arbitrary proc" do
237
+ pieces = [@page.box1.entries.first, @page.box2.entries.first]
238
+ _filter = lambda { |c|
239
+ pieces.map(&:id).include?(c.id)
240
+ }
241
+ ::X = Class.new(::Piece) do
242
+ alias_of :A, :filter => _filter
243
+ end
244
+ assert_same_content pieces, X.targets
245
+ end
246
+ end
134
247
  end
135
248
 
136
249
  context "instances" do
@@ -177,7 +290,7 @@ class AliasTest < MiniTest::Spec
177
290
  end
178
291
 
179
292
  should "include target values in serialisation" do
180
- @a_alias.export[:target].should == @a.shallow_export
293
+ @a_alias.export[:target].should == @a.shallow_export(nil)
181
294
  end
182
295
 
183
296
  should "include alias title & icon in serialisation" do
@@ -185,6 +298,8 @@ class AliasTest < MiniTest::Spec
185
298
  @a_alias.export[:alias_icon].should == @a.alias_icon_field.export
186
299
  end
187
300
  end
301
+
302
+
188
303
  end
189
304
 
190
305
  context "Piece aliases" do
@@ -195,10 +310,15 @@ class AliasTest < MiniTest::Spec
195
310
 
196
311
  should "not be loadable via their compound path when linked to a page" do
197
312
  a = BBAlias.create(:target => @bb)
198
- @aliases << a
313
+ @aliases.box1 << a
199
314
  @aliases.save
200
315
  Site["/aliases/bb"].should be_nil
201
316
  end
317
+
318
+ should "have their target's path attribute if they alias to a page type" do
319
+ a = BBAlias.create(:target => @bb)
320
+ a.path.should == @bb.path
321
+ end
202
322
  end
203
323
 
204
324
  context "Page aliases" do
@@ -211,9 +331,15 @@ class AliasTest < MiniTest::Spec
211
331
  c = CAlias.new(:target => @aaa1)
212
332
  c.render.should == "aaa1\n"
213
333
  end
334
+
335
+ should "respond as a page" do
336
+ a = BAlias.create(:target => @b, :slug => "balias")
337
+ a.page?.should be_true
338
+ end
339
+
214
340
  should "be discoverable via their compound path" do
215
341
  a = BAlias.create(:target => @b, :slug => "balias")
216
- @aliases << a
342
+ @aliases.box1 << a
217
343
  @aliases.save
218
344
  a.save
219
345
  a.reload
@@ -222,9 +348,57 @@ class AliasTest < MiniTest::Spec
222
348
  Site["/aliases/b"].should == a
223
349
  end
224
350
 
351
+ should "update their path if their target's slug changes" do
352
+ a = BAlias.create(:target => @b, :slug => "balias")
353
+ b = BAlias.create(:target => @b, :slug => "balias")
354
+ @aliases.box1 << a
355
+ a.box1 << b
356
+ @aliases.save
357
+
358
+ a.save
359
+ a.reload
360
+ a.path.should == "/aliases/b"
361
+ b.path.should == "/aliases/b/b"
362
+ @b.slug = "newb"
363
+ @b.save
364
+ a.reload
365
+ b.reload
366
+ a.path.should == "/aliases/newb"
367
+ b.path.should == "/aliases/newb/newb"
368
+ end
369
+
370
+ should "update their path if their parent's path changes" do
371
+ a = BAlias.create(:target => @b, :slug => "balias")
372
+ b = BAlias.create(:target => @b, :slug => "balias")
373
+ @aliases.box1 << a
374
+ a.box1 << b
375
+ @aliases.save
376
+ a.save
377
+ a.reload
378
+ a.path.should == "/aliases/b"
379
+ b.path.should == "/aliases/b/b"
380
+ @aliases.slug = "newaliases"
381
+ @aliases.save
382
+ a.reload
383
+ b.reload
384
+ a.path.should == "/newaliases/b"
385
+ b.path.should == "/newaliases/b/b"
386
+ end
387
+
388
+ should "show in the parent's list of children" do
389
+ a = BAlias.create(:target => @b, :slug => "balias")
390
+ @aliases.box1 << a
391
+ @aliases.save
392
+ a.save
393
+ a.reload
394
+ @aliases.reload
395
+ @aliases.children.should == [a]
396
+ a.parent.should == @aliases
397
+ end
398
+
225
399
  should "render the using target's layout when accessed via the path and no local layouts defined" do
226
400
  a = BAlias.create(:target => @b, :slug => "balias")
227
- @aliases << a
401
+ @aliases.box1 << a
228
402
  @aliases.save
229
403
  a.reload
230
404
  a.render.should == @b.render
@@ -233,7 +407,7 @@ class AliasTest < MiniTest::Spec
233
407
  should "render with locally defined style when available" do
234
408
  BAlias.layout :b_alias
235
409
  a = BAlias.create(:target => @b, :slug => "balias")
236
- @aliases << a
410
+ @aliases.box1 << a
237
411
  @aliases.save
238
412
  a.reload
239
413
  a.render.should == "alternate\n"
@@ -242,13 +416,23 @@ class AliasTest < MiniTest::Spec
242
416
  should "have access to their target's page styles" do
243
417
  BAlias.layout :b_alias
244
418
  a = BAlias.create(:target => @b, :slug => "balias")
245
- @aliases << a
419
+ @aliases.box1 << a
246
420
  @aliases.save
247
421
  a.reload
248
422
  a.layout = :b
249
423
  a.render.should == @b.render
250
424
  end
251
425
  end
426
+
427
+ context "visibility" do
428
+ should "be linked to the target's visibility" do
429
+ a = BAlias.create(:target => @b, :slug => "balias")
430
+ @b.hide!
431
+ @b.reload
432
+ a.reload
433
+ a.visible?.should be_false
434
+ end
435
+ end
252
436
  end
253
437
  end
254
438