spontaneous 0.2.0.beta1 → 0.2.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (335) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +24 -0
  3. data/.locat +42 -0
  4. data/.travis/gemfiles/Gemfile.empty +7 -0
  5. data/.travis.yml +18 -0
  6. data/Gemfile +12 -8
  7. data/LICENSE +1 -1
  8. data/Rakefile +15 -157
  9. data/Readme.markdown +1 -1
  10. data/application/css/core.css.scss +22 -146
  11. data/application/css/definitions.css.scss +7 -3
  12. data/application/css/dialogue.css.scss +26 -1
  13. data/application/css/editing.css.scss +70 -28
  14. data/application/css/font.css.scss +1 -1
  15. data/application/css/popover.css.scss +2 -0
  16. data/application/css/top.css.scss +231 -0
  17. data/application/js/add_alias_dialogue.js +1 -1
  18. data/application/js/add_home_dialogue.js +1 -1
  19. data/application/js/ajax.js +61 -31
  20. data/application/js/box.js +4 -4
  21. data/application/js/conflicted_field_dialogue.js +1 -1
  22. data/application/js/content.js +5 -5
  23. data/application/js/dom.js +5 -0
  24. data/application/js/edit_panel.js +1 -0
  25. data/application/js/editing.js +1 -1
  26. data/application/js/extensions.js +8 -0
  27. data/application/js/field/boolean.js +31 -0
  28. data/application/js/field/file.js +32 -4
  29. data/application/js/field/image.js +24 -9
  30. data/application/js/field/markdown.js +87 -59
  31. data/application/js/field/select.js +1 -1
  32. data/application/js/field/webvideo.js +6 -1
  33. data/application/js/init.js +2 -2
  34. data/application/js/jquery-selection-position.js +130 -0
  35. data/application/js/location.js +4 -25
  36. data/application/js/meta_view/user_admin.js +2 -2
  37. data/application/js/metadata.js +2 -2
  38. data/application/js/page_browser.js +1 -1
  39. data/application/js/panel/root_menu.js +0 -1
  40. data/application/js/popover.js +27 -12
  41. data/application/js/popover_view.js +20 -4
  42. data/application/js/preview.js +31 -16
  43. data/application/js/progress.js +22 -21
  44. data/application/js/publish.js +18 -7
  45. data/application/js/sharded_upload.js +9 -6
  46. data/application/js/spontaneous.js +3 -1
  47. data/application/js/top_bar.js +264 -173
  48. data/application/js/upload.js +12 -5
  49. data/application/js/upload_manager.js +4 -3
  50. data/application/js/user.js +1 -2
  51. data/application/js/views/box_view.js +1 -1
  52. data/application/js/views/page_view.js +16 -5
  53. data/application/js/views/piece_view.js +5 -4
  54. data/application/static/font/fontawesome-webfont-1c66a4738b40ef0f6b1abca0ba9a796d.ttf +0 -0
  55. data/application/views/index.erb +6 -14
  56. data/application/views/login.erb +6 -25
  57. data/application/views/schema_modification_error.html.erb +3 -7
  58. data/db/migrations/20130114120000_create_revision_tables.rb +2 -2
  59. data/db/migrations/20130813111009_increase_path_length.rb +14 -0
  60. data/gem-public_cert.pem +20 -0
  61. data/lib/spontaneous/asset/app_compiler.rb +44 -0
  62. data/lib/spontaneous/asset/environment.rb +225 -0
  63. data/lib/spontaneous/asset.rb +2 -67
  64. data/lib/spontaneous/box.rb +0 -1
  65. data/lib/spontaneous/capistrano/deploy.rb +2 -2
  66. data/lib/spontaneous/capistrano/sync.rb +1 -1
  67. data/lib/spontaneous/cli/init.rb +36 -13
  68. data/lib/spontaneous/cli/server.rb +0 -1
  69. data/lib/spontaneous/cli/site.rb +2 -1
  70. data/lib/spontaneous/cli.rb +3 -1
  71. data/lib/spontaneous/collections/entry_set.rb +4 -12
  72. data/lib/spontaneous/collections/hash_with_fallback.rb +20 -0
  73. data/lib/spontaneous/collections/prototype_set.rb +6 -5
  74. data/lib/spontaneous/crypt.rb +2 -2
  75. data/lib/spontaneous/data_mapper/content_model/associations.rb +115 -63
  76. data/lib/spontaneous/data_mapper.rb +1 -1
  77. data/lib/spontaneous/errors.rb +6 -0
  78. data/lib/spontaneous/extensions/object_space.rb +6 -0
  79. data/lib/spontaneous/facet.rb +1 -0
  80. data/lib/spontaneous/field/base.rb +86 -13
  81. data/lib/spontaneous/field/boolean.rb +65 -0
  82. data/lib/spontaneous/field/file.rb +17 -6
  83. data/lib/spontaneous/field/html.rb +13 -0
  84. data/lib/spontaneous/field/image/size.rb +76 -0
  85. data/lib/spontaneous/field/image.rb +99 -414
  86. data/lib/spontaneous/field/tags.rb +36 -0
  87. data/lib/spontaneous/field/update.rb +1 -1
  88. data/lib/spontaneous/field/webvideo/fallback.rb +41 -0
  89. data/lib/spontaneous/field/webvideo/vimeo.rb +113 -0
  90. data/lib/spontaneous/field/webvideo/vine.rb +94 -0
  91. data/lib/spontaneous/field/webvideo/youtube.rb +133 -0
  92. data/lib/spontaneous/field/webvideo.rb +100 -250
  93. data/lib/spontaneous/field.rb +1 -1
  94. data/lib/spontaneous/generators/site/Gemfile.tt +5 -14
  95. data/lib/spontaneous/generators/site/assets/README.md +20 -0
  96. data/lib/spontaneous/generators/site/assets/css/site.scss +8 -0
  97. data/lib/spontaneous/generators/site/assets/js/site.js +6 -0
  98. data/lib/spontaneous/generators/site/config/deploy.rb.tt +9 -0
  99. data/lib/spontaneous/generators/site/config/user_levels.yml +14 -3
  100. data/lib/spontaneous/generators/site/public/README.md +12 -0
  101. data/lib/spontaneous/generators/site/templates/layouts/standard.html.cut.tt +2 -2
  102. data/lib/spontaneous/generators/site.rb +77 -35
  103. data/lib/spontaneous/layout.rb +6 -7
  104. data/lib/spontaneous/loader.rb +21 -13
  105. data/lib/spontaneous/media/file.rb +22 -9
  106. data/lib/spontaneous/media/image/attributes.rb +33 -0
  107. data/lib/spontaneous/media/image/format/gif.rb +4 -0
  108. data/lib/spontaneous/media/image/format/jpg.rb +17 -0
  109. data/lib/spontaneous/media/image/format/png.rb +4 -0
  110. data/lib/spontaneous/media/image/format/webp.rb +26 -0
  111. data/lib/spontaneous/media/image/format.rb +79 -0
  112. data/lib/spontaneous/media/image/optimizer.rb +69 -0
  113. data/lib/spontaneous/media/image/processor.rb +17 -0
  114. data/lib/spontaneous/media/image/renderable.rb +52 -0
  115. data/lib/spontaneous/media/image/skeptick.rb +70 -0
  116. data/lib/spontaneous/media/image.rb +50 -0
  117. data/lib/spontaneous/media/temp_file.rb +4 -0
  118. data/lib/spontaneous/media.rb +1 -0
  119. data/lib/spontaneous/model/core/aliases.rb +14 -8
  120. data/lib/spontaneous/model/core/boxes.rb +5 -2
  121. data/lib/spontaneous/model/core/entries.rb +4 -0
  122. data/lib/spontaneous/model/core/entry.rb +1 -0
  123. data/lib/spontaneous/model/core/fields.rb +5 -2
  124. data/lib/spontaneous/model/core/locks.rb +16 -0
  125. data/lib/spontaneous/model/core/media.rb +1 -15
  126. data/lib/spontaneous/model/core.rb +31 -1
  127. data/lib/spontaneous/model/page/controllers.rb +2 -2
  128. data/lib/spontaneous/model/page/formats.rb +1 -4
  129. data/lib/spontaneous/model/page/layouts.rb +6 -2
  130. data/lib/spontaneous/model/page/locks.rb +8 -2
  131. data/lib/spontaneous/model/page/page_tree.rb +2 -2
  132. data/lib/spontaneous/model/page/paths.rb +74 -9
  133. data/lib/spontaneous/model/page.rb +11 -3
  134. data/lib/spontaneous/model.rb +6 -6
  135. data/lib/spontaneous/output/context/render_cache.rb +23 -0
  136. data/lib/spontaneous/output/context.rb +56 -30
  137. data/lib/spontaneous/output/helpers/script_helper.rb +9 -53
  138. data/lib/spontaneous/output/helpers/stylesheet_helper.rb +8 -40
  139. data/lib/spontaneous/output/template/renderer.rb +17 -5
  140. data/lib/spontaneous/output.rb +0 -1
  141. data/lib/spontaneous/paths.rb +6 -2
  142. data/lib/spontaneous/permissions/access_key.rb +18 -0
  143. data/lib/spontaneous/permissions/user.rb +1 -1
  144. data/lib/spontaneous/permissions.rb +4 -1
  145. data/lib/spontaneous/plugins/application/state.rb +19 -12
  146. data/lib/spontaneous/prototypes/field_prototype.rb +14 -8
  147. data/lib/spontaneous/published_revision.rb +7 -0
  148. data/lib/spontaneous/publishing/immediate.rb +43 -34
  149. data/lib/spontaneous/publishing/revision.rb +9 -6
  150. data/lib/spontaneous/rack/asset_server.rb +20 -0
  151. data/lib/spontaneous/rack/back/alias.rb +46 -0
  152. data/lib/spontaneous/rack/back/application_assets.rb +28 -0
  153. data/lib/spontaneous/rack/back/base.rb +34 -0
  154. data/lib/spontaneous/rack/back/changes.rb +19 -0
  155. data/lib/spontaneous/rack/back/content.rb +54 -0
  156. data/lib/spontaneous/rack/back/events.rb +38 -0
  157. data/lib/spontaneous/rack/back/field.rb +37 -0
  158. data/lib/spontaneous/rack/back/file.rb +118 -0
  159. data/lib/spontaneous/rack/back/helpers.rb +71 -0
  160. data/lib/spontaneous/rack/back/index.rb +16 -0
  161. data/lib/spontaneous/rack/back/login.rb +47 -0
  162. data/lib/spontaneous/rack/back/map.rb +24 -0
  163. data/lib/spontaneous/rack/back/page.rb +46 -0
  164. data/lib/spontaneous/rack/back/preview.rb +43 -0
  165. data/lib/spontaneous/rack/back/schema.rb +30 -0
  166. data/lib/spontaneous/rack/back/site.rb +25 -0
  167. data/lib/spontaneous/rack/back/site_assets.rb +13 -0
  168. data/lib/spontaneous/rack/back/unsupported_browser.rb +7 -0
  169. data/lib/spontaneous/rack/{user_admin.rb → back/user_admin.rb} +2 -5
  170. data/lib/spontaneous/rack/back.rb +85 -764
  171. data/lib/spontaneous/rack/cacheable_file.rb +3 -3
  172. data/lib/spontaneous/rack/front.rb +16 -9
  173. data/lib/spontaneous/rack/middleware/authenticate.rb +65 -0
  174. data/lib/spontaneous/rack/middleware/csrf.rb +66 -0
  175. data/lib/spontaneous/rack/middleware/reloader.rb +52 -0
  176. data/lib/spontaneous/rack/middleware/scope.rb +60 -0
  177. data/lib/spontaneous/rack/middleware.rb +6 -0
  178. data/lib/spontaneous/rack/page_controller.rb +18 -5
  179. data/lib/spontaneous/rack/public.rb +17 -11
  180. data/lib/spontaneous/rack.rb +34 -24
  181. data/lib/spontaneous/revision.rb +29 -2
  182. data/lib/spontaneous/schema/uid.rb +4 -3
  183. data/lib/spontaneous/schema/uid_map.rb +5 -24
  184. data/lib/spontaneous/schema.rb +1 -0
  185. data/lib/spontaneous/search/database.rb +8 -0
  186. data/lib/spontaneous/search/field.rb +1 -1
  187. data/lib/spontaneous/search/index.rb +3 -5
  188. data/lib/spontaneous/server.rb +1 -1
  189. data/lib/spontaneous/simultaneous.rb +1 -1
  190. data/lib/spontaneous/site/features.rb +4 -5
  191. data/lib/spontaneous/site/helpers.rb +22 -5
  192. data/lib/spontaneous/site/instance.rb +2 -2
  193. data/lib/spontaneous/site/selectors.rb +22 -3
  194. data/lib/spontaneous/storage/cloud.rb +13 -9
  195. data/lib/spontaneous/storage/local.rb +11 -6
  196. data/lib/spontaneous/style.rb +40 -23
  197. data/lib/spontaneous/utils/database/mysql_dumper.rb +1 -1
  198. data/lib/spontaneous/utils/smush_it.rb +1 -1
  199. data/lib/spontaneous/version.rb +1 -1
  200. data/lib/spontaneous.rb +35 -33
  201. data/spontaneous.gemspec +53 -787
  202. data/test/experimental/test_crypt.rb +56 -56
  203. data/test/experimental/test_features.rb +16 -27
  204. data/test/fixtures/assets/public1/css/data.css.scss +3 -0
  205. data/test/fixtures/assets/public1/css/image1.css.scss +4 -0
  206. data/test/fixtures/assets/public1/css/import.css.scss +1 -0
  207. data/test/fixtures/assets/public1/css/urlhash.css.scss +3 -0
  208. data/test/fixtures/assets/public1/js/a.js +1 -1
  209. data/test/fixtures/assets/public1/js/all.js +4 -0
  210. data/test/fixtures/assets/public1/js/{m.coffee → m.js.coffee} +1 -0
  211. data/test/fixtures/assets/public1/x.js +1 -0
  212. data/test/fixtures/assets/public2/css/all.css +4 -0
  213. data/test/fixtures/assets/public2/css/missing.css.scss +3 -0
  214. data/test/fixtures/assets/public2/i/y.png +0 -0
  215. data/test/fixtures/assets/public2/js/b.js +1 -1
  216. data/test/fixtures/assets/public2/js/c.js +1 -1
  217. data/test/fixtures/images/size.extended.webp +0 -0
  218. data/test/fixtures/images/size.lossless.webp +0 -0
  219. data/test/fixtures/images/size.lossy.webp +0 -0
  220. data/test/fixtures/schema/before.yml +4 -4
  221. data/test/fixtures/schema/schema.yml +1 -1
  222. data/test/fixtures/templates/aliases/aaa.html.cut +0 -0
  223. data/test/fixtures/templates/extended/partial_with_renderer.html.cut +1 -0
  224. data/test/fixtures/templates/extended/with_includes_and_renderer.html.cut +2 -0
  225. data/test/functional/test_application.rb +108 -106
  226. data/test/functional/test_back.rb +924 -930
  227. data/test/functional/test_front.rb +285 -238
  228. data/test/functional/test_user_manager.rb +75 -100
  229. data/test/integration/test_installation.rb +1 -1
  230. data/test/support/matchers.rb +12 -0
  231. data/test/support/minitest.rb +121 -0
  232. data/test/support/rack.rb +45 -0
  233. data/test/support/test_start_finish.rb +103 -0
  234. data/test/test_helper.rb +21 -68
  235. data/test/test_integration_helper.rb +1 -3
  236. data/test/unit/test_alias.rb +432 -408
  237. data/test/unit/test_asset_bundler.rb +58 -58
  238. data/test/unit/test_assets.rb +485 -155
  239. data/test/unit/test_async.rb +16 -37
  240. data/test/unit/test_authentication.rb +425 -457
  241. data/test/unit/test_boxes.rb +191 -191
  242. data/test/unit/test_changesets.rb +244 -254
  243. data/test/unit/test_config.rb +128 -142
  244. data/test/unit/test_content.rb +313 -359
  245. data/test/unit/test_content_inheritance.rb +29 -30
  246. data/test/unit/test_datamapper.rb +1205 -1080
  247. data/test/unit/test_datamapper_content.rb +49 -51
  248. data/test/unit/test_extensions.rb +23 -23
  249. data/test/unit/test_fields.rb +1488 -1180
  250. data/test/unit/test_formats.rb +158 -158
  251. data/test/unit/test_generators.rb +98 -40
  252. data/test/unit/test_helpers.rb +73 -76
  253. data/test/unit/test_image_size.rb +53 -22
  254. data/test/unit/test_images.rb +164 -165
  255. data/test/unit/test_layouts.rb +133 -122
  256. data/test/unit/test_logger.rb +14 -17
  257. data/test/unit/test_media.rb +69 -84
  258. data/test/unit/test_modifications.rb +513 -525
  259. data/test/unit/test_page.rb +462 -361
  260. data/test/unit/test_permissions.rb +379 -364
  261. data/test/unit/test_piece.rb +67 -75
  262. data/test/unit/test_plugins.rb +82 -89
  263. data/test/unit/test_prototype_set.rb +215 -216
  264. data/test/unit/test_prototypes.rb +114 -124
  265. data/test/unit/test_publishing.rb +252 -289
  266. data/test/unit/test_render.rb +167 -115
  267. data/test/unit/test_revisions.rb +436 -444
  268. data/test/unit/test_schema.rb +339 -309
  269. data/test/unit/test_search.rb +577 -574
  270. data/test/unit/test_serialisation.rb +136 -147
  271. data/test/unit/test_site.rb +252 -227
  272. data/test/unit/test_skeptick.rb +130 -0
  273. data/test/unit/test_storage.rb +46 -40
  274. data/test/unit/test_structure.rb +57 -66
  275. data/test/unit/test_styles.rb +104 -104
  276. data/test/unit/test_templates.rb +72 -57
  277. data/test/unit/test_type_hierarchy.rb +15 -16
  278. data/test/unit/test_visibility.rb +239 -257
  279. metadata +455 -326
  280. data/application/js/vendor/JS.Class-2.1.5/CHANGELOG +0 -283
  281. data/application/js/vendor/JS.Class-2.1.5/MIT-LICENSE +0 -30
  282. data/application/js/vendor/JS.Class-2.1.5/README +0 -30
  283. data/application/js/vendor/JS.Class-2.1.5/min/command.js +0 -1
  284. data/application/js/vendor/JS.Class-2.1.5/min/comparable.js +0 -1
  285. data/application/js/vendor/JS.Class-2.1.5/min/constant_scope.js +0 -1
  286. data/application/js/vendor/JS.Class-2.1.5/min/decorator.js +0 -1
  287. data/application/js/vendor/JS.Class-2.1.5/min/enumerable.js +0 -1
  288. data/application/js/vendor/JS.Class-2.1.5/min/forwardable.js +0 -1
  289. data/application/js/vendor/JS.Class-2.1.5/min/hash.js +0 -1
  290. data/application/js/vendor/JS.Class-2.1.5/min/linked_list.js +0 -1
  291. data/application/js/vendor/JS.Class-2.1.5/min/loader.js +0 -1
  292. data/application/js/vendor/JS.Class-2.1.5/min/method_chain.js +0 -1
  293. data/application/js/vendor/JS.Class-2.1.5/min/observable.js +0 -1
  294. data/application/js/vendor/JS.Class-2.1.5/min/package.js +0 -1
  295. data/application/js/vendor/JS.Class-2.1.5/min/proxy.js +0 -1
  296. data/application/js/vendor/JS.Class-2.1.5/min/ruby.js +0 -1
  297. data/application/js/vendor/JS.Class-2.1.5/min/set.js +0 -1
  298. data/application/js/vendor/JS.Class-2.1.5/min/stack_trace.js +0 -1
  299. data/application/js/vendor/JS.Class-2.1.5/min/state.js +0 -1
  300. data/application/js/vendor/JS.Class-2.1.5/min/stdlib.js +0 -16
  301. data/application/js/vendor/jquery-1.6.2.min.js +0 -18
  302. data/application/js/vendor/jquery-ui-1.8.16.custom.min.js +0 -791
  303. data/application/js/vendor/jquery-ui-1.8.9.custom.min.js +0 -415
  304. data/application/static/font/fontawesome-webfont-5c5c21100a346972a82c34c5e96ffcfe.ttf +0 -0
  305. data/application/static/select-arrow-6e7dd3745b00e934b0d7a3250c46558b.png +0 -0
  306. data/bin/limit-upload +0 -5
  307. data/bin/unlimit-upload +0 -3
  308. data/lib/spontaneous/asset/file.rb +0 -25
  309. data/lib/spontaneous/asset/source.rb +0 -28
  310. data/lib/spontaneous/image_size.rb +0 -123
  311. data/lib/spontaneous/output/assets/compression.rb +0 -58
  312. data/lib/spontaneous/output/assets.rb +0 -32
  313. data/lib/spontaneous/rack/around_back.rb +0 -20
  314. data/lib/spontaneous/rack/around_front.rb +0 -27
  315. data/lib/spontaneous/rack/around_preview.rb +0 -22
  316. data/lib/spontaneous/rack/assets.rb +0 -126
  317. data/lib/spontaneous/rack/authentication.rb +0 -20
  318. data/lib/spontaneous/rack/cookie_authentication.rb +0 -38
  319. data/lib/spontaneous/rack/helpers.rb +0 -52
  320. data/lib/spontaneous/rack/http.rb +0 -18
  321. data/lib/spontaneous/rack/media.rb +0 -30
  322. data/lib/spontaneous/rack/query_authentication.rb +0 -35
  323. data/lib/spontaneous/rack/reloader.rb +0 -45
  324. data/lib/spontaneous/rack/user_helpers.rb +0 -28
  325. /data/{README → application/js/field/markdown/text_command.js} +0 -0
  326. /data/application/js/vendor/{JS.Class-2.1.5/min/core.js → js.class-2.1.5.min.js} +0 -0
  327. /data/test/fixtures/assets/public1/css/{a.scss → a.css.scss} +0 -0
  328. /data/{lib/spontaneous/generators/site/public/css/site.scss → test/fixtures/assets/public1/x.css} +0 -0
  329. /data/{lib/spontaneous/generators/site/public/js/.empty_directory → test/fixtures/assets/public1/x.png} +0 -0
  330. /data/test/fixtures/assets/public2/css/{b.scss → b.css.scss} +0 -0
  331. /data/test/fixtures/assets/public2/js/{n.coffee → n.js.coffee} +0 -0
  332. /data/test/fixtures/back/{public → assets}/css/sass_include.scss +0 -0
  333. /data/test/fixtures/back/{public → assets}/css/sass_template.scss +0 -0
  334. /data/test/fixtures/back/{public → assets}/js/coffeescript.coffee +0 -0
  335. /data/{lib/spontaneous/generators/site/public/js/site.js → test/fixtures/templates/aliases/aa_alias.html.cut} +0 -0
@@ -2,514 +2,538 @@
2
2
 
3
3
  require File.expand_path('../../test_helper', __FILE__)
4
4
 
5
- class AliasTest < MiniTest::Spec
5
+ describe "Alias" do
6
6
 
7
- def assert_same_content(c1, c2)
8
- assert_equal c2.length, c1.length
9
- c1 = c1.dup.sort { |a, b| a.id <=> b.id }
10
- c2 = c2.dup.sort { |a, b| a.id <=> b.id }
11
- c1.each_with_index do |a, i|
12
- b = c2[i]
13
- assert_equal b.id, a.id
14
- assert_equal b.class, a.class
7
+ start do
8
+ site = setup_site
9
+ template_root = File.expand_path(File.join(File.dirname(__FILE__), "../fixtures/templates/aliases"))
10
+ let(:template_root) { template_root }
11
+ site.paths.add(:templates, template_root)
12
+ renderer = S::Output::Template::Renderer.new(false)
13
+ S::Output.renderer = renderer
14
+
15
+ Content.delete
16
+
17
+ Page.field :title
18
+ Page.box :box1
19
+ Page.box :box2
20
+
21
+ class ::A < ::Piece
22
+ field :a_field1
23
+ field :a_field2
24
+ field :image, :image
25
+
26
+ style :a_style
27
+ def alias_title
28
+ a_field1.value
29
+ end
15
30
  end
16
- end
17
31
 
18
- context "Aliases:" do
19
- setup do
20
- @site = setup_site
21
- @template_root = File.expand_path(File.join(File.dirname(__FILE__), "../fixtures/templates/aliases"))
22
- @site.paths.add(:templates, @template_root)
23
- @renderer = S::Output::Template::Renderer.new(false)
24
- S::Output.renderer = @renderer
32
+ class ::AA < ::A
33
+ field :aa_field1
34
+ style :aa_style
35
+ end
25
36
 
26
- Content.delete
37
+ class ::AAA < ::AA
38
+ field :aaa_field1
39
+ end
27
40
 
28
- Page.field :title
29
- Page.box :box1
30
- Page.box :box2
31
- # class ::Page < Spontaneous::Page
32
- # end
41
+ class ::B < ::Page
42
+ field :b_field1
43
+ layout :b
44
+ end
33
45
 
34
- # class ::Piece < Spontaneous::Piece; end
46
+ class ::BB < ::B
47
+ field :bb_field1
35
48
 
36
- class ::A < ::Piece
37
- field :a_field1
38
- field :a_field2
39
- field :image, :image
49
+ box :box1
50
+ end
40
51
 
41
- style :a_style
42
- def alias_title
43
- a_field1.value
44
- end
52
+ class ::AAlias < ::Piece
53
+ alias_of :A
45
54
 
46
- # def alias_icon_field
47
- # "/aliasicon.png"
48
- # end
49
- end
55
+ field :a_alias_field1
56
+ style :a_alias_style
57
+ end
50
58
 
51
- class ::AA < ::A
52
- field :aa_field1
53
- style :aa_style
54
- end
59
+ class ::AAAlias < ::Piece
60
+ alias_of :AA
61
+ end
55
62
 
56
- class ::AAA < ::AA
57
- field :aaa_field1
58
- end
63
+ class ::AAAAlias < ::Piece
64
+ alias_of :AAA
65
+ end
59
66
 
60
- class ::B < ::Page
61
- field :b_field1
62
- layout :b
63
- end
64
67
 
65
- class ::BB < ::B
66
- field :bb_field1
68
+ class ::BAlias < ::Page
69
+ alias_of :B
70
+ box :box1
71
+ end
67
72
 
68
- box :box1
69
- end
73
+ class ::BBAlias < ::Piece
74
+ alias_of :BB
75
+ end
70
76
 
71
- class ::AAlias < ::Piece
72
- alias_of :A
77
+ class ::MultipleAlias < ::Piece
78
+ alias_of :AA, :B
79
+ end
73
80
 
74
- field :a_alias_field1
75
- style :a_alias_style
76
- end
81
+ class ::ProcAlias < ::Piece
82
+ alias_of proc { Content.root.children }
83
+ end
77
84
 
78
- class ::AAAlias < ::Piece
79
- alias_of :AA
80
- end
85
+ root = ::Page.create
86
+ aliases = ::Page.create(:slug => "aliases").reload
87
+ root.box1 << aliases
88
+ a = A.create(:a_field1 => "@a.a_field1").reload
89
+ aa = AA.create.reload
90
+ aaa1 = AAA.create(:aaa_field1 => "aaa1").reload
91
+ aaa2 = AAA.create.reload
92
+ b = B.new(:slug => "b")
93
+ root.box1 << b
94
+ bb = BB.new(:slug => "bb", :bb_field1 => "BB")
95
+ root.box1 << bb
96
+ root.save.reload
97
+
98
+ let(:root) { root }
99
+ let(:aliases) { aliases }
100
+ let(:a) { a }
101
+ let(:aa) { aa }
102
+ let(:aaa1) { aaa1 }
103
+ let(:aaa2) { aaa2 }
104
+ let(:b) { b }
105
+ let(:bb) { bb }
106
+ end
81
107
 
82
- class ::AAAAlias < ::Piece
83
- alias_of :AAA
84
- end
108
+ finish do
109
+ [:A, :AA, :AAA, :B, :BB, :AAlias, :AAAlias, :AAAAlias, :BBAlias, :BAlias, :MultipleAlias, :ProcAlias].each do |c|
110
+ Object.send(:remove_const, c) rescue nil
111
+ end
112
+ Content.delete
113
+ teardown_site
114
+ end
85
115
 
116
+ def assert_same_content(c1, c2)
117
+ assert_equal c2.length, c1.length
118
+ c1 = c1.dup.sort { |a, b| a.id <=> b.id }
119
+ c2 = c2.dup.sort { |a, b| a.id <=> b.id }
120
+ c1.each_with_index do |a, i|
121
+ b = c2[i]
122
+ assert_equal b.id, a.id
123
+ assert_equal b.class, a.class
124
+ end
125
+ end
86
126
 
87
- class ::BAlias < ::Page
88
- alias_of :B
89
- box :box1
90
- end
127
+ before do
128
+ end
91
129
 
92
- class ::BBAlias < ::Piece
93
- alias_of :BB
130
+ after do
131
+ end
132
+
133
+ describe "All alias" do
134
+ describe "class methods" do
135
+ it "provide a list of available instances that includes all subclasses" do
136
+ assert_same_content AAlias.targets, [a, aa, aaa1, aaa2]
137
+ assert_same_content AAAlias.targets, [aa, aaa1, aaa2]
138
+ assert_same_content AAAAlias.targets, [aaa1, aaa2]
94
139
  end
95
140
 
96
- class ::MultipleAlias < ::Piece
97
- alias_of :AA, :B
141
+ it "use the first available string field as the alias title" do
142
+ Piece.field :something
143
+ target = Piece.new(:something => "something")
144
+ target.alias_title.must_equal "something"
98
145
  end
99
146
 
100
- class ::ProcAlias < ::Piece
101
- alias_of proc { Content.root.children }
147
+ it "allow aliasing multiple classes" do
148
+ assert_same_content MultipleAlias.targets, [aa, aaa1, aaa2, b, bb]
102
149
  end
103
150
 
104
- @root = ::Page.create
105
- @aliases = ::Page.create(:slug => "aliases").reload
106
- @root.box1 << @aliases
107
- @a = A.create(:a_field1 => "@a.a_field1").reload
108
- @aa = AA.create.reload
109
- @aaa1 = AAA.create(:aaa_field1 => "aaa1").reload
110
- @aaa2 = AAA.create.reload
111
- @b = B.new(:slug => "b")
112
- @root.box1 << @b
113
- @bb = BB.new(:slug => "bb", :bb_field1 => "BB")
114
- @root.box1 << @bb
115
- @root.save.reload
116
- end
117
-
118
- teardown do
119
- [:A, :AA, :AAA, :B, :BB, :AAlias, :AAAlias, :AAAAlias, :BBAlias, :BAlias, :MultipleAlias, :ProcAlias].each do |c|
120
- Object.send(:remove_const, c) rescue nil
151
+ it "be creatable with a target" do
152
+ instance = AAlias.create(:target => a).reload
153
+ instance.target.must_equal a
154
+ a.reload.aliases.must_equal [instance]
121
155
  end
122
- Content.delete
123
- teardown_site
124
- end
125
156
 
126
- context "All alias" do
127
- context "class methods" do
128
- should "provide a list of available instances that includes all subclasses" do
129
- assert_same_content AAlias.targets, [@a, @aa, @aaa1, @aaa2]
130
- assert_same_content AAAlias.targets, [@aa, @aaa1, @aaa2]
131
- assert_same_content AAAAlias.targets, [@aaa1, @aaa2]
132
- end
157
+ it "have a back link in the target" do
158
+ instance1 = AAlias.create(:target => a).reload
159
+ instance2 = AAlias.create(:target => a).reload
160
+ assert_same_content a.reload.aliases, [instance1, instance2]
161
+ end
133
162
 
134
- should "allow aliasing multiple classes" do
135
- assert_same_content MultipleAlias.targets, [@aa, @aaa1, @aaa2, @b, @bb]
136
- end
163
+ it "accept a proc that returns an array as a target list generator" do
164
+ assert_same_content ProcAlias.targets, root.children
165
+ end
137
166
 
138
- should "be creatable with a target" do
139
- instance = AAlias.create(:target => @a).reload
140
- instance.target.should == @a
141
- @a.aliases.should == [instance]
142
- end
143
- should "have a back link in the target" do
144
- instance1 = AAlias.create(:target => @a).reload
145
- instance2 = AAlias.create(:target => @a).reload
146
- assert_same_content @a.aliases, [instance1, instance2]
167
+ describe "with container options" do
168
+ before do
169
+ @page = ::Page.new(:uid => "thepage")
170
+ 4.times { |n|
171
+ @page.box1 << A.new
172
+ @page.box1 << AA.new
173
+ @page.box2 << A.new
174
+ @page.box2 << AA.new
175
+ }
176
+ @page = @page.save.reload
147
177
  end
148
178
 
149
- should "accept a proc that returns an array as a target list generator" do
150
- assert_same_content ProcAlias.targets, @root.children
179
+ after do
180
+ Object.send(:remove_const, 'X') rescue nil
181
+ Object.send(:remove_const, 'XX') rescue nil
182
+ Object.send(:remove_const, 'XXX') rescue nil
151
183
  end
152
184
 
153
- context "with container options" do
154
- setup do
155
- @page = ::Page.new(:uid => "thepage")
156
- 4.times { |n|
157
- @page.box1 << A.new
158
- @page.box1 << AA.new
159
- @page.box2 << A.new
160
- @page.box2 << AA.new
161
- }
162
- @page = @page.save.reload
185
+ it "allow for selecting only content from within one box" do
186
+ class ::X < ::Piece
187
+ alias_of :A, :container => Proc.new { S::Site['$thepage'].box1 }
163
188
  end
164
-
165
- teardown do
166
- Object.send(:remove_const, 'X') rescue nil
167
- Object.send(:remove_const, 'XX') rescue nil
168
- Object.send(:remove_const, 'XXX') rescue nil
189
+ class ::XX < ::Piece
190
+ alias_of :AA, :container => Proc.new { S::Site['$thepage'].box1 }
169
191
  end
192
+ targets = lambda { |a, target|
193
+ [(a.targets), @page.box1.select { |p| target === p }].map { |a| Set.new(a) }
194
+ }
195
+ expected, actual = targets.call(X, A)
196
+ actual.must_equal expected
197
+ expected, actual = targets.call(XX, AA)
198
+ actual.must_equal expected
199
+ end
170
200
 
171
- should "allow for selecting only content from within one box" do
172
- class ::X < ::Piece
173
- alias_of :A, :container => Proc.new { S::Site['#thepage'].box1 }
174
- end
175
- class ::XX < ::Piece
176
- alias_of :AA, :container => Proc.new { S::Site['#thepage'].box1 }
177
- end
178
- targets = lambda { |a, target|
179
- [(a.targets), @page.box1.select { |p| target === p }].map { |a| Set.new(a) }
180
- }
181
- expected, actual = targets.call(X, A)
182
- actual.should == expected
183
- expected, actual = targets.call(XX, AA)
184
- actual.should == expected
201
+ it "allow for selecting only content from a range of boxes" do
202
+ class ::X < ::Piece
203
+ alias_of :A, :container => Proc.new { [S::Site['$thepage'].box1, S::Site['$thepage'].box2] }
185
204
  end
186
-
187
- should "allow for selecting only content from a range of boxes" do
188
- class ::X < ::Piece
189
- alias_of :A, :container => Proc.new { [S::Site['#thepage'].box1, S::Site['#thepage'].box2] }
190
- end
191
- class ::XX < ::Piece
192
- alias_of :AA, :container => Proc.new { [S::Site['#thepage'].box1, S::Site['#thepage'].box2] }
193
- end
194
- assert_same_content X.targets, @page.box1.select { |p| A === p } + @page.box2.select { |p| A === p }
195
- assert_same_content XX.targets, @page.box1.select { |p| AA === p } + @page.box2.select { |p| AA === p }
205
+ class ::XX < ::Piece
206
+ alias_of :AA, :container => Proc.new { [S::Site['$thepage'].box1, S::Site['$thepage'].box2] }
196
207
  end
208
+ assert_same_content X.targets, @page.box1.select { |p| A === p } + @page.box2.select { |p| A === p }
209
+ assert_same_content XX.targets, @page.box1.select { |p| AA === p } + @page.box2.select { |p| AA === p }
210
+ end
197
211
 
198
- should "allow for selecting only content from within one page" do
199
- class ::X < ::Piece
200
- alias_of :A, :container => Proc.new { S::Site['#thepage'] }
201
- end
202
- class ::XX < ::Piece
203
- alias_of :AA, :container => Proc.new { S::Site['#thepage'] }
204
- end
205
- assert_same_content X.targets, @page.content.select { |p| A === p }
206
- assert_same_content XX.targets, @page.content.select { |p| AA === p }
212
+ it "allow for selecting only content from within one page" do
213
+ class ::X < ::Piece
214
+ alias_of :A, :container => Proc.new { S::Site['$thepage'] }
207
215
  end
208
-
209
- should "allow for selecting only content from a range of pages & boxes" do
210
- page2 = ::Page.new(:uid => "thepage2")
211
- 4.times { |n|
212
- page2.box1 << A.new
213
- page2.box1 << AA.new
214
- page2.box2 << A.new
215
- page2.box2 << AA.new
216
- }
217
- page2.save.reload
218
- class ::X < ::Piece
219
- alias_of :A, :AA, :container => Proc.new { [S::Site['#thepage'].box1, S::Site['#thepage2']] }
220
- end
221
- class ::XX < ::Piece
222
- alias_of :AA, :container => Proc.new { [S::Site['#thepage'], S::Site['#thepage2'].box2] }
223
- end
224
- assert_same_content X.targets(@page, @page.box1), @page.box1.contents + page2.content
225
- assert_same_content XX.targets, @page.content.select { |p| AA === p } + page2.box2.select { |p| AA === p }
216
+ class ::XX < ::Piece
217
+ alias_of :AA, :container => Proc.new { S::Site['$thepage'] }
226
218
  end
219
+ assert_same_content X.targets, @page.content.select { |p| A === p }
220
+ assert_same_content XX.targets, @page.content.select { |p| AA === p }
221
+ end
227
222
 
228
- should "allow for selecting content only from the content of the owner of the box" do
229
- class ::X < ::Piece
230
- alias_of proc { |owner| owner.box1.contents }
231
- end
232
- class ::XX < ::Piece
233
- alias_of proc { |owner, box| box.contents }
234
- end
235
- class ::XXX < ::Piece
236
- alias_of :A, :container => proc { |owner, box| box }
237
- end
238
- assert_same_content X.targets(@page), @page.box1.contents
239
- assert_same_content XX.targets(@page, @page.box1), @page.box1.contents
240
- assert_same_content XX.targets(@page, @page.box2), @page.box2.contents
241
- assert_same_content XXX.targets(@page, @page.box1), @page.box1.contents.select { |p| A === p }
223
+ it "allow for selecting only content from a range of pages & boxes" do
224
+ page2 = ::Page.new(:uid => "thepage2")
225
+ 4.times { |n|
226
+ page2.box1 << A.new
227
+ page2.box1 << AA.new
228
+ page2.box2 << A.new
229
+ page2.box2 << AA.new
230
+ }
231
+ page2.save.reload
232
+ class ::X < ::Piece
233
+ alias_of :A, :AA, :container => Proc.new { [S::Site['$thepage'].box1, S::Site['$thepage2']] }
242
234
  end
243
-
244
- should "allow for filtering instances according to some arbitrary proc" do
245
- pieces = [@page.box1.entries.first, @page.box2.entries.first]
246
- _filter = lambda { |c|
247
- pieces.map(&:id).include?(c.id)
248
- }
249
- ::X = Class.new(::Piece) do
250
- alias_of :A, :filter => _filter
251
- end
252
- assert_same_content pieces, X.targets
235
+ class ::XX < ::Piece
236
+ alias_of :AA, :container => Proc.new { [S::Site['$thepage'], S::Site['$thepage2'].box2] }
253
237
  end
238
+ assert_same_content X.targets(@page, @page.box1), @page.box1.contents + page2.content
239
+ assert_same_content XX.targets, @page.content.select { |p| AA === p } + page2.box2.select { |p| AA === p }
240
+ end
254
241
 
255
- should "allow for filtering instances according to current page content" do
256
- @page.box1 << AAA.create
257
- @page.box2 << AAA.create
258
- @page.save.reload
259
- allowable = AAA.all - @page.box1.contents
260
- ::X = Class.new(::Piece) do
261
- alias_of :AAA, :filter => proc { |choice, page, box| !box.include?(choice) }
262
- end
263
- assert_same_content allowable, X.targets(@page, @page.box1)
242
+ it "allow for selecting content only from the content of the owner of the box" do
243
+ class ::X < ::Piece
244
+ alias_of proc { |owner| owner.box1.contents }
264
245
  end
265
-
266
- should "allow for ensuring the uniqueness of the entries" do
267
- aaa = AAA.all
268
- ::X = Class.new(::Piece) do
269
- alias_of :AAA, :unique => true
270
- end
271
- @page.box1 << aaa.first
272
- @page.save.reload
273
- assert_same_content [aaa.last], X.targets(@page, @page.box1)
246
+ class ::XX < ::Piece
247
+ alias_of proc { |owner, box| box.contents }
274
248
  end
275
-
276
- should "allow for returning an arbitrary list of results generated by a proc" do
277
- results = [mock, mock, mock]
278
- ::X = Class.new(::Piece) do
279
- alias_of proc { results }
280
- end
281
- ::X.targets.should == results
249
+ class ::XXX < ::Piece
250
+ alias_of :A, :container => proc { |owner, box| box }
282
251
  end
252
+ assert_same_content X.targets(@page), @page.box1.contents
253
+ assert_same_content XX.targets(@page, @page.box1), @page.box1.contents
254
+ assert_same_content XX.targets(@page, @page.box2), @page.box2.contents
255
+ assert_same_content XXX.targets(@page, @page.box1), @page.box1.contents.select { |p| A === p }
256
+ end
283
257
 
258
+ it "allow for filtering instances according to some arbitrary proc" do
259
+ pieces = [@page.box1.entries.first, @page.box2.entries.first]
260
+ _filter = lambda { |c|
261
+ pieces.map(&:id).include?(c.id)
262
+ }
263
+ ::X = Class.new(::Piece) do
264
+ alias_of :A, :filter => _filter
265
+ end
266
+ assert_same_content pieces, X.targets
284
267
  end
285
- end
286
268
 
287
- context "instances" do
288
- setup do
289
- @a_alias = AAlias.create(:target => @a).reload
290
- @aa_alias = AAAlias.create(:target => @aa).reload
291
- @aaa_alias = AAAAlias.create(:target => @aaa1).reload
269
+ it "allow for filtering instances according to current page content" do
270
+ @page.box1 << AAA.create
271
+ @page.box2 << AAA.create
272
+ @page.save.reload
273
+ allowable = AAA.all - @page.box1.contents
274
+ ::X = Class.new(::Piece) do
275
+ alias_of :AAA, :filter => proc { |choice, page, box| !box.include?(choice) }
276
+ end
277
+ assert_same_content allowable, X.targets(@page, @page.box1)
292
278
  end
293
279
 
294
- should "have their own fields" do
295
- @a_alias.field?(:a_alias_field1).should be_true
280
+ it "allow for ensuring the uniqueness of the entries" do
281
+ aaa = AAA.all
282
+ ::X = Class.new(::Piece) do
283
+ alias_of :AAA, :unique => true
284
+ end
285
+ @page.box1 << aaa.first
286
+ @page.save.reload
287
+ assert_same_content [aaa.last], X.targets(@page, @page.box1)
296
288
  end
297
289
 
298
- should "provide access to their target" do
299
- @a_alias.target.should == @a
290
+ it "allow for returning an arbitrary list of results generated by a proc" do
291
+ results = [mock, mock, mock]
292
+ ::X = Class.new(::Piece) do
293
+ alias_of proc { results }
294
+ end
295
+ ::X.targets.must_equal results
300
296
  end
301
297
 
298
+ end
299
+ end
302
300
 
303
- # TODO
304
- should "reference the aliases fields before the targets"
301
+ describe "instances" do
302
+ before do
303
+ @a_alias = AAlias.create(:target => a).reload
304
+ @aa_alias = AAAlias.create(:target => aa).reload
305
+ @aaa_alias = AAAAlias.create(:target => aaa1).reload
306
+ end
305
307
 
306
- should "present their target's fields as their own" do
307
- @a_alias.field?(:a_field1).should be_true
308
- @a_alias.a_field1.value.should == @a.a_field1.value
309
- end
308
+ it "have their own fields" do
309
+ assert @a_alias.field?(:a_alias_field1)
310
+ end
310
311
 
311
- should "have access to their target's fields" do
312
- @a_alias.target.a_field1.value.should == @a.a_field1.value
313
- end
312
+ it "provide access to their target" do
313
+ @a_alias.target.must_equal a
314
+ end
314
315
 
315
- should "have their own styles" do
316
- assert_correct_template(@a_alias, @template_root / 'a_alias/a_alias_style')
317
- end
318
316
 
319
- should "present their target's styles as their own" do
320
- @a_alias.style = :a_style
317
+ # TODO
318
+ it "reference the aliases fields before the targets"
321
319
 
322
- assert_correct_template(@a_alias, @template_root / 'a/a_style')
323
- end
320
+ it "present their target's fields as their own" do
321
+ assert @a_alias.field?(:a_field1)
322
+ @a_alias.a_field1.value.must_equal a.a_field1.value
323
+ end
324
324
 
325
- # should "have an independent style setting"
326
- should "not delete their target when deleted" do
327
- @a_alias.destroy
328
- Content[@a.id].should == @a
329
- end
325
+ it "have access to their target's fields" do
326
+ @a_alias.target.a_field1.value.must_equal a.a_field1.value
327
+ end
330
328
 
331
- should "be deleted when target deleted" do
332
- @a.destroy
333
- Content[@a_alias.id].should be_nil
334
- end
329
+ it "have their own styles" do
330
+ assert_correct_template(@a_alias, template_root / 'a_alias/a_alias_style')
331
+ end
335
332
 
336
- should "include target values in serialisation" do
337
- @a_alias.export[:target].should == @a.shallow_export(nil)
338
- end
333
+ it "present their target's styles as their own" do
334
+ @a_alias.style = :a_style
339
335
 
340
- should "include alias title & icon in serialisation" do
341
- @a_alias.export[:alias_title].should == @a.alias_title
342
- @a_alias.export[:alias_icon].should == @a.alias_icon_field.export
343
- end
336
+ assert_correct_template(@a_alias, template_root / 'a/a_style')
337
+ end
344
338
 
339
+ it "should use templates belonging to the alias class if they exist" do
340
+ assert_correct_template(@aa_alias, template_root / 'aa_alias')
345
341
  end
346
- end
347
342
 
348
- context "Aliases to custom models" do
349
- setup do
350
- @target_id = target_id = 9999
351
- @target = target = mock()
352
- @target.stubs(:id).returns(@target_id)
353
- @target.stubs(:title).returns("custom object")
343
+ it "should fallback to the targets default style if no alias template is present" do
344
+ assert_correct_template(@aaa_alias, aaa1.template)
345
+ end
354
346
 
355
- @custom_alias_class = Class.new(::Page) do
356
- alias_of proc { [target] }, :lookup => lambda { |id|
357
- return target if id == target_id
358
- nil
359
- }, :slug => lambda { |target| target.title.to_url }
360
- end
347
+ # should "have an independent style setting"
348
+ it "not delete their target when deleted" do
349
+ @a_alias.destroy
350
+ Content[a.id].must_equal a
361
351
  end
362
- should "be creatable using a custom initializer" do
363
- a = @custom_alias_class.for_target(@target_id)
364
352
 
365
- a.target_id.should == @target_id
366
- a.target.should == @target
353
+ it "be deleted when target deleted" do
354
+ a.destroy
355
+ Content[@a_alias.id].must_be_nil
367
356
  end
368
357
 
369
- should "be able to provide a slug for pages" do
370
- a = @custom_alias_class.for_target(@target_id)
371
- a.target.should == @target
372
- a.slug.should == "custom-object"
358
+ it "include target values in serialisation" do
359
+ @a_alias.export[:target].must_equal a.shallow_export(nil)
373
360
  end
374
361
 
375
- should "ignore styles if object doesn't provide them" do
376
- a = @custom_alias_class.for_target(@target_id)
377
- a.style.template.call.should == Page.new.style.template.call
362
+ it "include alias title & icon in serialisation" do
363
+ @a_alias.export[:alias_title].must_equal a.alias_title
364
+ @a_alias.export[:alias_icon].must_equal a.alias_icon_field.export
378
365
  end
379
366
  end
367
+ end
380
368
 
369
+ describe "Aliases to custom models" do
370
+ before do
371
+ @target_id = target_id = 9999
372
+ @target = target = mock()
373
+ @target.stubs(:id).returns(@target_id)
374
+ @target.stubs(:title).returns("custom object")
381
375
 
382
- context "Piece aliases" do
383
- should "be allowed to target pages" do
384
- a = BBAlias.create(:target => @bb)
385
- a.bb_field1.value.should == "BB"
376
+ @custom_alias_class = Class.new(::Page) do
377
+ alias_of proc { [target] }, :lookup => lambda { |id|
378
+ return target if id == target_id
379
+ nil
380
+ }, :slug => lambda { |target| target.title.to_url }
386
381
  end
382
+ end
383
+ it "be creatable using a custom initializer" do
384
+ a = @custom_alias_class.for_target(@target_id)
387
385
 
388
- should "not be loadable via their compound path when linked to a page" do
389
- a = BBAlias.create(:target => @bb)
390
- @aliases.box1 << a
391
- @aliases.save
392
- Site["/aliases/bb"].should be_nil
393
- end
386
+ a.target_id.must_equal @target_id
387
+ a.target.must_equal @target
388
+ end
394
389
 
395
- should "have their target's path attribute if they alias to a page type" do
396
- a = BBAlias.create(:target => @bb)
397
- a.path.should == @bb.path
398
- end
390
+ it "be able to provide a slug for pages" do
391
+ a = @custom_alias_class.for_target(@target_id)
392
+ a.target.must_equal @target
393
+ a.slug.must_equal "custom-object"
399
394
  end
400
395
 
401
- context "Page aliases" do
402
- should "be allowed to have piece classes as targets" do
403
- class ::CAlias < Page
404
- alias_of :AAA
405
- layout :c_alias
406
- end
396
+ it "ignore styles if object doesn't provide them" do
397
+ a = @custom_alias_class.for_target(@target_id)
398
+ a.style.template.call.must_equal Page.new.style.template.call
399
+ end
400
+ end
407
401
 
408
- c = CAlias.new(:target => @aaa1)
409
- c.render.should == "aaa1\n"
410
- end
411
402
 
412
- should "respond as a page" do
413
- a = BAlias.create(:target => @b, :slug => "balias")
414
- a.page?.should be_true
415
- end
403
+ describe "Piece aliases" do
404
+ it "be allowed to target pages" do
405
+ a = BBAlias.create(:target => bb)
406
+ a.bb_field1.value.must_equal "BB"
407
+ end
416
408
 
417
- should "be discoverable via their compound path" do
418
- a = BAlias.create(:target => @b, :slug => "balias")
419
- @aliases.box1 << a
420
- @aliases.save
421
- a.save
422
- a.reload
423
- a.path.should == "/aliases/b"
424
- Site["/aliases/balias"].should be_nil
425
- Site["/aliases/b"].should == a
426
- end
409
+ it "not be loadable via their compound path when linked to a page" do
410
+ a = BBAlias.create(:target => bb)
411
+ aliases.box1 << a
412
+ aliases.save
413
+ Site["/aliases/bb"].must_be_nil
414
+ end
427
415
 
428
- should "update their path if their target's slug changes" do
429
- a = BAlias.create(:target => @b, :slug => "balias")
430
- b = BAlias.create(:target => @b, :slug => "balias")
431
- @aliases.box1 << a
432
- a.box1 << b
433
- @aliases.save
434
-
435
- a.save
436
- a.reload
437
- a.path.should == "/aliases/b"
438
- b.path.should == "/aliases/b/b"
439
- @b.slug = "newb"
440
- @b.save
441
- a.reload
442
- b.reload
443
- a.path.should == "/aliases/newb"
444
- b.path.should == "/aliases/newb/newb"
445
- end
416
+ it "have their target's path attribute if they alias to a page type" do
417
+ a = BBAlias.create(:target => bb)
418
+ a.path.must_equal bb.path
419
+ end
420
+ end
446
421
 
447
- should "update their path if their parent's path changes" do
448
- a = BAlias.create(:target => @b, :slug => "balias")
449
- b = BAlias.create(:target => @b, :slug => "balias")
450
- @aliases.box1 << a
451
- a.box1 << b
452
- @aliases.save
453
- a.save
454
- a.reload
455
- a.path.should == "/aliases/b"
456
- b.path.should == "/aliases/b/b"
457
- @aliases.slug = "newaliases"
458
- @aliases.save
459
- a.reload
460
- b.reload
461
- a.path.should == "/newaliases/b"
462
- b.path.should == "/newaliases/b/b"
422
+ describe "Page aliases" do
423
+ before do
424
+ BAlias.instance_variable_set(:@layout_prototypes, nil)
425
+ aliases.reload
426
+ b.reload
427
+ end
428
+ it "be allowed to have piece classes as targets" do
429
+ class ::CAlias < Page
430
+ alias_of :AAA
431
+ layout :c_alias
463
432
  end
464
433
 
465
- should "show in the parent's list of children" do
466
- a = BAlias.create(:target => @b, :slug => "balias")
467
- @aliases.box1 << a
468
- @aliases.save
469
- a.save
470
- a.reload
471
- @aliases.reload
472
- @aliases.children.should == [a]
473
- a.parent.should == @aliases
474
- end
434
+ c = CAlias.new(:target => aaa1)
435
+ c.render.must_equal "aaa1\n"
436
+ end
475
437
 
476
- should "render the using target's layout when accessed via the path and no local layouts defined" do
477
- a = BAlias.create(:target => @b, :slug => "balias")
478
- @aliases.box1 << a
479
- @aliases.save
480
- a.reload
481
- a.render.should == @b.render
482
- end
438
+ it "respond as a page" do
439
+ a = BAlias.create(:target => b, :slug => "balias")
440
+ assert a.page?
441
+ end
483
442
 
484
- should "render with locally defined style when available" do
485
- BAlias.layout :b_alias
486
- a = BAlias.create(:target => @b, :slug => "balias")
487
- @aliases.box1 << a
488
- @aliases.save
489
- a.reload
490
- a.render.should == "alternate\n"
491
- end
443
+ it "be discoverable via their compound path" do
444
+ a = BAlias.create(:target => b, :slug => "balias")
445
+ aliases.box1 << a
446
+ aliases.save
447
+ a.save
448
+ a.reload
449
+ a.path.must_equal "/aliases/b"
450
+ Site["/aliases/balias"].must_be_nil
451
+ Site["/aliases/b"].must_equal a
452
+ end
492
453
 
493
- should "have access to their target's page styles" do
494
- BAlias.layout :b_alias
495
- a = BAlias.create(:target => @b, :slug => "balias")
496
- @aliases.box1 << a
497
- @aliases.save
498
- a.reload
499
- a.layout = :b
500
- a.render.should == @b.render
501
- end
454
+ it "update their path if their target's slug changes" do
455
+ al = BAlias.create(:target => b, :slug => "balias")
456
+ bl = BAlias.create(:target => b, :slug => "balias")
457
+ aliases.box1 << al
458
+ al.box1 << bl
459
+ aliases.save
460
+
461
+ al.save
462
+ al.reload
463
+ al.path.must_equal "/aliases/b"
464
+ bl.path.must_equal "/aliases/b/b"
465
+ b.slug = "newb"
466
+ b.save
467
+ al.reload
468
+ bl.reload
469
+ al.path.must_equal "/aliases/newb"
470
+ bl.path.must_equal "/aliases/newb/newb"
502
471
  end
503
472
 
504
- context "visibility" do
505
- should "be linked to the target's visibility" do
506
- a = BAlias.create(:target => @b, :slug => "balias")
507
- @b.hide!
508
- @b.reload
509
- a.reload
510
- a.visible?.should be_false
511
- end
473
+ it "update their path if their parent's path changes" do
474
+ al = BAlias.create(:target => b, :slug => "balias")
475
+ bl = BAlias.create(:target => b, :slug => "balias")
476
+ aliases.box1 << al
477
+ al.box1 << bl
478
+ aliases.save
479
+ al.save
480
+ al.reload
481
+ al.path.must_equal "/aliases/b"
482
+ bl.path.must_equal "/aliases/b/b"
483
+ aliases.slug = "newaliases"
484
+ aliases.save
485
+ al.reload
486
+ bl.reload
487
+ al.path.must_equal "/newaliases/b"
488
+ bl.path.must_equal "/newaliases/b/b"
489
+ end
490
+
491
+ it "show in the parent's list of children" do
492
+ al = BAlias.create(:target => b, :slug => "balias")
493
+ aliases.box1 << al
494
+ aliases.save
495
+ al.save
496
+ al.reload
497
+ aliases.reload
498
+ aliases.children.must_equal [al]
499
+ al.parent.must_equal aliases
500
+ end
501
+
502
+ it "render the using target's layout when accessed via the path and no local layouts defined" do
503
+ al = BAlias.create(:target => b, :slug => "balias")
504
+ aliases.box1 << al
505
+ aliases.save
506
+ al.reload
507
+ al.render.must_equal b.render
508
+ end
509
+
510
+ it "render with locally defined style when available" do
511
+ BAlias.layout :b_alias
512
+ al = BAlias.create(:target => b, :slug => "balias")
513
+ aliases.box1 << al
514
+ aliases.save
515
+ al.reload
516
+ al.render.must_equal "alternate\n"
517
+ end
518
+
519
+ it "have access to their target's page styles" do
520
+ BAlias.layout :b_alias
521
+ a = BAlias.create(:target => b, :slug => "balias")
522
+ aliases.box1 << a
523
+ aliases.save
524
+ a.reload
525
+ a.layout = :b
526
+ a.render.must_equal b.render
512
527
  end
513
528
  end
514
- end
515
529
 
530
+ describe "visibility" do
531
+ it "be linked to the target's visibility" do
532
+ a = BAlias.create(:target => b, :slug => "balias")
533
+ b.hide!
534
+ b.reload
535
+ a.reload
536
+ refute a.visible?
537
+ end
538
+ end
539
+ end