spontaneous 0.2.0.alpha2 → 0.2.0.alpha3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (404) hide show
  1. data/Gemfile +3 -40
  2. data/Rakefile +29 -41
  3. data/Readme.markdown +21 -8
  4. data/application/css/add_alias_dialogue.css.scss +79 -0
  5. data/application/css/{v2.scss → core.css.scss} +537 -550
  6. data/application/css/{definitions.scss → definitions.css.scss} +121 -33
  7. data/application/css/dialogue.css.scss +409 -0
  8. data/application/css/{editing.scss → editing.css.scss} +25 -262
  9. data/application/css/font.css.scss +8 -0
  10. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  11. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  12. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_flat_10_000000_40x100.png +0 -0
  13. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  14. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  15. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  16. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  17. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  18. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  19. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_222222_256x240.png +0 -0
  20. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_228ef1_256x240.png +0 -0
  21. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ef8c08_256x240.png +0 -0
  22. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ffd27a_256x240.png +0 -0
  23. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ffffff_256x240.png +0 -0
  24. data/application/css/jquery-ui-1.8.21.custom/ui-lightness.css.scss +565 -0
  25. data/application/css/{login.scss → login.css.scss} +4 -4
  26. data/application/css/meta.css.scss +331 -0
  27. data/application/css/{popover.scss → popover.css.scss} +9 -8
  28. data/application/css/{schema_error.scss → schema_error.css.scss} +4 -4
  29. data/application/css/spontaneous.css +5 -0
  30. data/application/css/unsupported.css.scss +42 -0
  31. data/application/js/add_alias_dialogue.js +72 -10
  32. data/application/js/ajax.js +50 -16
  33. data/application/js/compatibility.js +19 -15
  34. data/application/js/content.js +39 -36
  35. data/application/js/content_area.js +53 -5
  36. data/application/js/dialogue.js +17 -0
  37. data/application/js/dom.js +1 -1
  38. data/application/js/edit_panel.js +23 -8
  39. data/application/js/extensions.js +7 -2
  40. data/application/js/field_preview.js +2 -1
  41. data/application/js/field_types/date_field.js +11 -8
  42. data/application/js/field_types/file_field.js +188 -9
  43. data/application/js/field_types/image_field.js +46 -29
  44. data/application/js/field_types/markdown_field.js +57 -14
  45. data/application/js/field_types/select_field.js +72 -0
  46. data/application/js/field_types/string_field.js +8 -0
  47. data/application/js/field_types/webvideo_field.js +8 -0
  48. data/application/js/init.js +1 -7
  49. data/application/js/location.js +41 -13
  50. data/application/js/login.js +3 -0
  51. data/application/js/meta_view/user_admin.js +543 -0
  52. data/application/js/meta_view.js +1 -0
  53. data/application/js/metadata.js +20 -0
  54. data/application/js/page.js +17 -3
  55. data/application/js/page_browser.js +40 -30
  56. data/application/js/page_entry.js +4 -0
  57. data/application/js/panel/root_menu.js +66 -0
  58. data/application/js/popover.js +2 -2
  59. data/application/js/preview.js +1 -1
  60. data/application/js/publish.js +138 -30
  61. data/application/js/services.js +43 -0
  62. data/application/js/sharded_upload.js +2 -2
  63. data/application/js/spontaneous.js +64 -5
  64. data/application/js/state.js +20 -9
  65. data/application/js/top_bar.js +273 -150
  66. data/application/js/types.js +20 -15
  67. data/application/js/upload.js +1 -2
  68. data/application/js/user.js +18 -4
  69. data/application/js/vendor/date.js +104 -0
  70. data/application/js/vendor/jquery-ui-1.8.18.custom.min.js +356 -0
  71. data/application/js/views/box_view.js +15 -8
  72. data/application/js/views/page_piece_view.js +11 -8
  73. data/application/js/views/page_view.js +21 -3
  74. data/application/js/views/piece_view.js +19 -10
  75. data/application/js/views.js +3 -0
  76. data/application/static/chromelogo-200x52-45c7cbc93be080bea342df5fcda2ef8b.png +0 -0
  77. data/application/static/dot-texture-9eea29e4ac7ad9a772285252078ec127.png +0 -0
  78. data/application/static/editing-textarea-resize-s-b5af62365eb7e19ea4beccf7242d508e.png +0 -0
  79. data/application/static/editing-texture-1-42b06a3439752490988f30f2a06d5e7c.png +0 -0
  80. data/application/static/font/fontawesome-webfont-5c5c21100a346972a82c34c5e96ffcfe.ttf +0 -0
  81. data/application/static/loop_alt1-white-7894b458528e92216196cae26b4c2c96.svg +12 -0
  82. data/application/static/spontaneous-states-e91ec89db525c62da0105b97cdd781ce.png +0 -0
  83. data/application/views/index.erb +2 -2
  84. data/application/views/login.erb +4 -8
  85. data/application/views/schema_modification_error.html.erb +1 -4
  86. data/application/views/unsupported.erb +9 -7
  87. data/bin/spot +1 -1
  88. data/db/migrations/20110209152710_users_and_groups.rb +10 -10
  89. data/db/migrations/20120305112647_site_modification_time.rb +11 -0
  90. data/db/migrations/20120418153903_add_ownership_of_content.rb +14 -0
  91. data/db/migrations/20120423175416_add_pending_modifications.rb +21 -0
  92. data/db/migrations/20120525164947_add_field_versions.rb +27 -0
  93. data/lib/sequel/plugins/scoped_table_name.rb +10 -1
  94. data/lib/spontaneous/asset/file.rb +25 -0
  95. data/lib/spontaneous/asset/source.rb +28 -0
  96. data/lib/spontaneous/asset.rb +75 -0
  97. data/lib/spontaneous/box.rb +6 -4
  98. data/lib/spontaneous/capistrano/deploy.rb +47 -0
  99. data/lib/spontaneous/capistrano/sync.rb +81 -0
  100. data/lib/spontaneous/capistrano.rb +13 -0
  101. data/lib/spontaneous/change.rb +60 -68
  102. data/lib/spontaneous/cli/assets.rb +29 -0
  103. data/lib/spontaneous/cli/base.rb +0 -48
  104. data/lib/spontaneous/cli/console.rb +1 -1
  105. data/lib/spontaneous/cli/server.rb +6 -4
  106. data/lib/spontaneous/cli/site.rb +28 -17
  107. data/lib/spontaneous/cli/user.rb +107 -0
  108. data/lib/spontaneous/cli.rb +100 -4
  109. data/lib/spontaneous/collections/entry_set.rb +2 -2
  110. data/lib/spontaneous/collections/field_set.rb +48 -22
  111. data/lib/spontaneous/collections/prototype_set.rb +20 -13
  112. data/lib/spontaneous/constants.rb +3 -0
  113. data/lib/spontaneous/content.rb +22 -5
  114. data/lib/spontaneous/errors.rb +3 -3
  115. data/lib/spontaneous/extensions/array.rb +12 -0
  116. data/lib/spontaneous/extensions/enumerable.rb +30 -0
  117. data/lib/spontaneous/extensions/nil.rb +3 -1
  118. data/lib/spontaneous/extensions/string.rb +16 -0
  119. data/lib/spontaneous/field_types/date_field.rb +45 -2
  120. data/lib/spontaneous/field_types/field.rb +42 -9
  121. data/lib/spontaneous/field_types/file_field.rb +68 -0
  122. data/lib/spontaneous/field_types/image_field.rb +63 -0
  123. data/lib/spontaneous/field_types/select_field.rb +109 -0
  124. data/lib/spontaneous/field_types/string_field.rb +6 -1
  125. data/lib/spontaneous/field_types/webvideo_field.rb +85 -27
  126. data/lib/spontaneous/field_types.rb +1 -1
  127. data/lib/spontaneous/field_version.rb +8 -0
  128. data/lib/spontaneous/generators/page.rb +1 -1
  129. data/lib/spontaneous/generators/site/Capfile.tt +1 -4
  130. data/lib/spontaneous/generators/site/Gemfile.tt +13 -6
  131. data/lib/spontaneous/generators/site/config/deploy.rb.tt +28 -0
  132. data/lib/spontaneous/generators/site/config/environments/production.rb.tt +7 -2
  133. data/lib/spontaneous/generators/site.rb +1 -0
  134. data/lib/spontaneous/json.rb +34 -11
  135. data/lib/spontaneous/layout.rb +22 -0
  136. data/lib/spontaneous/media/file.rb +4 -0
  137. data/lib/spontaneous/output/assets/compression.rb +58 -0
  138. data/lib/spontaneous/output/assets.rb +32 -0
  139. data/lib/spontaneous/output/context.rb +179 -0
  140. data/lib/spontaneous/output/format/html.rb +5 -0
  141. data/lib/spontaneous/output/format/plain.rb +5 -0
  142. data/lib/spontaneous/output/format.rb +180 -0
  143. data/lib/spontaneous/output/helpers/classes_helper.rb +18 -0
  144. data/lib/spontaneous/{render/helpers/html_helper.rb → output/helpers/conditional_comment_helper.rb} +3 -12
  145. data/lib/spontaneous/output/helpers/script_helper.rb +73 -0
  146. data/lib/spontaneous/output/helpers/stylesheet_helper.rb +61 -0
  147. data/lib/spontaneous/output/helpers.rb +28 -0
  148. data/lib/spontaneous/output/template/engine.rb +59 -0
  149. data/lib/spontaneous/output/template/renderer.rb +153 -0
  150. data/lib/spontaneous/output/template.rb +21 -0
  151. data/lib/spontaneous/output.rb +163 -0
  152. data/lib/spontaneous/page.rb +2 -1
  153. data/lib/spontaneous/paths.rb +6 -1
  154. data/lib/spontaneous/permissions/access_key.rb +5 -5
  155. data/lib/spontaneous/permissions/user.rb +81 -35
  156. data/lib/spontaneous/permissions/user_level.rb +26 -22
  157. data/lib/spontaneous/plugins/aliases.rb +76 -12
  158. data/lib/spontaneous/plugins/allowed_types.rb +60 -18
  159. data/lib/spontaneous/plugins/application/paths.rb +0 -28
  160. data/lib/spontaneous/plugins/application/system.rb +35 -0
  161. data/lib/spontaneous/plugins/boxes.rb +4 -0
  162. data/lib/spontaneous/plugins/content_groups.rb +16 -0
  163. data/lib/spontaneous/plugins/entries.rb +50 -30
  164. data/lib/spontaneous/plugins/fields.rb +15 -0
  165. data/lib/spontaneous/plugins/layouts.rb +8 -2
  166. data/lib/spontaneous/plugins/modifications.rb +228 -0
  167. data/lib/spontaneous/plugins/page/formats.rb +67 -42
  168. data/lib/spontaneous/plugins/page/request.rb +10 -0
  169. data/lib/spontaneous/plugins/page/site_timestamps.rb +28 -0
  170. data/lib/spontaneous/plugins/paths.rb +15 -3
  171. data/lib/spontaneous/plugins/publishing.rb +124 -45
  172. data/lib/spontaneous/plugins/render.rb +13 -8
  173. data/lib/spontaneous/plugins/schema_hierarchy.rb +18 -6
  174. data/lib/spontaneous/plugins/site/helpers.rb +53 -0
  175. data/lib/spontaneous/plugins/site/hooks.rb +50 -0
  176. data/lib/spontaneous/plugins/site/map.rb +1 -1
  177. data/lib/spontaneous/plugins/site/paths.rb +13 -0
  178. data/lib/spontaneous/plugins/site/publishing.rb +6 -2
  179. data/lib/spontaneous/plugins/site/{revisions.rb → state.rb} +5 -1
  180. data/lib/spontaneous/plugins/site/storage.rb +4 -0
  181. data/lib/spontaneous/plugins/site/url.rb +15 -0
  182. data/lib/spontaneous/plugins/site_map.rb +13 -3
  183. data/lib/spontaneous/plugins/styles.rb +5 -1
  184. data/lib/spontaneous/plugins/visibility.rb +39 -12
  185. data/lib/spontaneous/prototypes/box_prototype.rb +4 -0
  186. data/lib/spontaneous/prototypes/field_prototype.rb +15 -10
  187. data/lib/spontaneous/publishing/event_client.rb +46 -0
  188. data/lib/spontaneous/publishing/immediate.rb +81 -44
  189. data/lib/spontaneous/publishing/simultaneous.rb +23 -6
  190. data/lib/spontaneous/publishing.rb +4 -3
  191. data/lib/spontaneous/rack/around_back.rb +1 -5
  192. data/lib/spontaneous/rack/around_front.rb +4 -4
  193. data/lib/spontaneous/rack/around_preview.rb +4 -3
  194. data/lib/spontaneous/rack/assets.rb +81 -54
  195. data/lib/spontaneous/rack/authentication.rb +0 -1
  196. data/lib/spontaneous/rack/back.rb +160 -72
  197. data/lib/spontaneous/rack/cookie_authentication.rb +2 -2
  198. data/lib/spontaneous/rack/css.rb +18 -15
  199. data/lib/spontaneous/rack/event_source.rb +9 -21
  200. data/lib/spontaneous/rack/fiber_pool.rb +26 -0
  201. data/lib/spontaneous/rack/front.rb +12 -4
  202. data/lib/spontaneous/rack/helpers.rb +35 -13
  203. data/lib/spontaneous/rack/js.rb +41 -0
  204. data/lib/spontaneous/rack/public.rb +34 -44
  205. data/lib/spontaneous/rack/sse.rb +18 -0
  206. data/lib/spontaneous/rack/static.rb +3 -0
  207. data/lib/spontaneous/rack/user_admin.rb +100 -0
  208. data/lib/spontaneous/rack/user_helpers.rb +1 -1
  209. data/lib/spontaneous/rack.rb +6 -2
  210. data/lib/spontaneous/schema.rb +31 -4
  211. data/lib/spontaneous/search/index.rb +19 -3
  212. data/lib/spontaneous/search/results.rb +1 -1
  213. data/lib/spontaneous/sequel.rb +17 -0
  214. data/lib/spontaneous/site.rb +11 -4
  215. data/lib/spontaneous/state.rb +11 -0
  216. data/lib/spontaneous/storage/cloud.rb +4 -0
  217. data/lib/spontaneous/storage/local.rb +11 -0
  218. data/lib/spontaneous/style.rb +2 -2
  219. data/lib/spontaneous/tasks/database.rake +21 -22
  220. data/lib/spontaneous/utils/database/mysql_dumper.rb +4 -0
  221. data/lib/spontaneous/utils/database/postgres_dumper.rb +78 -0
  222. data/lib/spontaneous/utils/database.rb +6 -3
  223. data/lib/spontaneous/utils/smart_quotes.rb +499 -0
  224. data/lib/spontaneous/utils/smush_it.rb +66 -0
  225. data/lib/spontaneous/utils.rb +3 -1
  226. data/lib/spontaneous/version.rb +2 -2
  227. data/lib/spontaneous.rb +25 -29
  228. data/spontaneous.gemspec +186 -106
  229. data/test/experimental/test_features.rb +1 -1
  230. data/test/fixtures/asset_pipeline/application/css/basic.css.scss +4 -0
  231. data/test/fixtures/asset_pipeline/application/css/complex.css.scss.erb +6 -0
  232. data/test/fixtures/asset_pipeline/application/css/simple.css +3 -0
  233. data/test/fixtures/asset_pipeline/application/css/spontaneous.css +7 -0
  234. data/test/fixtures/asset_pipeline/application/css/subdir/complex.css.scss.erb +6 -0
  235. data/test/fixtures/asset_pipeline/application/css/subdir/library.css.scss +1 -0
  236. data/test/fixtures/asset_pipeline/application/css/subdir/simple.css +3 -0
  237. data/test/fixtures/asset_pipeline/application/js/basic.js.coffee +1 -0
  238. data/test/fixtures/asset_pipeline/application/js/complex.js.coffee.erb +1 -0
  239. data/test/fixtures/asset_pipeline/application/js/login.js +1 -0
  240. data/test/fixtures/asset_pipeline/application/js/require.js +1 -0
  241. data/test/fixtures/asset_pipeline/application/js/simple.js +1 -0
  242. data/test/fixtures/asset_pipeline/application/js/spontaneous.js +5 -0
  243. data/test/fixtures/asset_pipeline/application/js/subdir/complex.js.coffee.erb +1 -0
  244. data/test/fixtures/asset_pipeline/application/js/subdir/library.js.coffee +1 -0
  245. data/test/fixtures/asset_pipeline/application/js/subdir/simple.js +1 -0
  246. data/test/fixtures/asset_pipeline/application/js/vendor/jquery.js +1 -0
  247. data/test/fixtures/asset_pipeline/application/static/dot-texture.png +0 -0
  248. data/test/fixtures/asset_pipeline/application/static/subdir/px.gif +0 -0
  249. data/test/fixtures/assets/public1/css/a.scss +1 -0
  250. data/test/fixtures/assets/public1/js/a.js +1 -0
  251. data/test/fixtures/assets/public1/js/m.coffee +1 -0
  252. data/test/fixtures/assets/public2/css/b.scss +1 -0
  253. data/test/fixtures/assets/public2/css/c.css +1 -0
  254. data/test/fixtures/assets/public2/js/b.js +1 -0
  255. data/test/fixtures/assets/public2/js/c.js +1 -0
  256. data/test/fixtures/assets/public2/js/n.coffee +1 -0
  257. data/test/fixtures/back/config/user_levels.yml +3 -0
  258. data/test/fixtures/back/public/js/coffeescript.coffee +1 -0
  259. data/test/fixtures/back/templates/layouts/standard.css.cut +1 -0
  260. data/test/fixtures/back/templates/layouts/standard.js.cut +1 -0
  261. data/test/fixtures/example_application/config/database.yml +4 -4
  262. data/test/fixtures/helpers/templates/layouts/standard.html.cut +1 -0
  263. data/test/fixtures/helpers/templates/layouts/standard.mobile.cut +1 -0
  264. data/test/fixtures/images/vimlogo.pdf +0 -0
  265. data/test/fixtures/outputs/templates/layouts/standard.atom.cut +1 -0
  266. data/test/fixtures/permissions/config/user_levels.yml +6 -3
  267. data/test/fixtures/serialisation/class_hash.yaml.erb +1 -0
  268. data/test/fixtures/serialisation/root_hash.yaml.erb +2 -2
  269. data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
  270. data/test/fixtures/templates/extended/main.html.cut +5 -5
  271. data/test/fixtures/templates/extended/parent.html.cut +8 -8
  272. data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -1
  273. data/test/fixtures/templates/extended/with_includes.html.cut +6 -6
  274. data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +6 -7
  275. data/test/fixtures/templates/layouts/entries.html.cut +4 -4
  276. data/test/fixtures/templates/layouts/standard.html.cut +1 -0
  277. data/test/fixtures/templates/layouts/variables.html.cut +1 -1
  278. data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -1
  279. data/test/fixtures/templates/publishing/templates/layouts/static.rtf.cut +1 -0
  280. data/test/fixtures/templates/template_class/complex_template.html.cut +2 -2
  281. data/test/fixtures/templates/template_class/complex_template.pdf.cut +2 -2
  282. data/test/fixtures/templates/template_class/default_template_style.html.cut +1 -1
  283. data/test/fixtures/templates/template_class/images_with_template.html.cut +2 -2
  284. data/test/fixtures/templates/template_class/slots_template.html.cut +2 -2
  285. data/test/fixtures/templates/template_class/slots_template.pdf.cut +2 -2
  286. data/test/fixtures/user_manager/config/user_levels.yml +9 -0
  287. data/test/functional/test_application.rb +7 -7
  288. data/test/functional/test_back.rb +352 -97
  289. data/test/functional/test_front.rb +71 -20
  290. data/test/functional/test_user_manager.rb +284 -0
  291. data/test/javascript/env.js +13505 -0
  292. data/test/javascript/test_markdown.rb +43 -3
  293. data/test/support/custom_matchers.rb +3 -2
  294. data/test/test_helper.rb +50 -9
  295. data/test/test_javascript.rb +13 -13
  296. data/test/ui_helper.rb +1 -1
  297. data/test/unit/test_alias.rb +79 -8
  298. data/test/unit/test_asset_bundler.rb +220 -0
  299. data/test/unit/test_assets.rb +213 -0
  300. data/test/unit/test_async.rb +55 -0
  301. data/test/unit/test_authentication.rb +52 -39
  302. data/test/unit/test_boxes.rb +20 -15
  303. data/test/unit/test_changesets.rb +261 -0
  304. data/test/unit/test_content.rb +73 -33
  305. data/test/unit/test_content_inheritance.rb +18 -18
  306. data/test/unit/test_extensions.rb +26 -0
  307. data/test/unit/test_fields.rb +303 -16
  308. data/test/unit/test_formats.rb +267 -34
  309. data/test/unit/test_helpers.rb +79 -2
  310. data/test/unit/test_images.rb +10 -0
  311. data/test/unit/test_layouts.rb +21 -13
  312. data/test/unit/test_modifications.rb +648 -0
  313. data/test/unit/test_page.rb +6 -2
  314. data/test/unit/test_permissions.rb +101 -27
  315. data/test/unit/test_piece.rb +4 -4
  316. data/test/unit/test_plugins.rb +3 -2
  317. data/test/unit/test_publishing.rb +332 -0
  318. data/test/unit/test_render.rb +118 -67
  319. data/test/unit/test_revisions.rb +546 -0
  320. data/test/unit/test_schema.rb +83 -1
  321. data/test/unit/test_search.rb +59 -0
  322. data/test/unit/test_serialisation.rb +2 -47
  323. data/test/unit/test_site.rb +217 -108
  324. data/test/unit/test_storage.rb +26 -0
  325. data/test/unit/test_structure.rb +2 -2
  326. data/test/unit/test_styles.rb +90 -75
  327. data/test/unit/test_table_scoping.rb +21 -17
  328. data/test/unit/test_templates.rb +75 -69
  329. data/test/{slow → unit}/test_visibility.rb +78 -22
  330. metadata +528 -221
  331. data/application/css/add_alias_dialogue.scss +0 -27
  332. data/application/css/min/14c2a35812c443001b15d8b12a4780f88c678035.css +0 -1
  333. data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +0 -1
  334. data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +0 -1
  335. data/application/css/spontaneous.scss +0 -111
  336. data/application/css/unsupported.scss +0 -16
  337. data/application/css/variables.scss +0 -80
  338. data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +0 -3
  339. data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +0 -2
  340. data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +0 -3
  341. data/application/js/min/b8abf302a824c35385ff517b34111e1710ff3b37.js +0 -2
  342. data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +0 -90
  343. data/application/static/diagonal-texture.png +0 -0
  344. data/application/static/editing-0-noise.png +0 -0
  345. data/application/static/editing-1-noise.png +0 -0
  346. data/application/static/editing-texture-1.png +0 -0
  347. data/application/static/editing-texture.png +0 -0
  348. data/application/static/editing-toolbar-shadow-bottom.png +0 -0
  349. data/application/static/editing-toolbar-shadow-top.png +0 -0
  350. data/application/static/inner-glow.png +0 -0
  351. data/application/static/item-buttons-highlight.png +0 -0
  352. data/application/static/item-buttons.png +0 -0
  353. data/application/static/paper-texture-dark.png +0 -0
  354. data/application/static/plus_alt.svg +0 -8
  355. data/application/static/select-arrow-root.png +0 -0
  356. data/application/static/slot-up-arrow.png +0 -0
  357. data/application/static/spontaneous.png +0 -0
  358. data/lib/cutaneous/context_helper.rb +0 -187
  359. data/lib/cutaneous/preview_context.rb +0 -32
  360. data/lib/cutaneous/preview_renderer.rb +0 -10
  361. data/lib/cutaneous/publish_context.rb +0 -10
  362. data/lib/cutaneous/publish_renderer.rb +0 -14
  363. data/lib/cutaneous/publish_template.rb +0 -62
  364. data/lib/cutaneous/publish_token_parser.rb +0 -8
  365. data/lib/cutaneous/renderer.rb +0 -124
  366. data/lib/cutaneous/request_context.rb +0 -9
  367. data/lib/cutaneous/request_renderer.rb +0 -15
  368. data/lib/cutaneous/request_template.rb +0 -11
  369. data/lib/cutaneous/request_token_parser.rb +0 -9
  370. data/lib/cutaneous/token_parser.rb +0 -125
  371. data/lib/cutaneous.rb +0 -48
  372. data/lib/spontaneous/render/context_base.rb +0 -143
  373. data/lib/spontaneous/render/development_renderer.rb +0 -14
  374. data/lib/spontaneous/render/engine.rb +0 -19
  375. data/lib/spontaneous/render/format/html.rb +0 -5
  376. data/lib/spontaneous/render/format.rb +0 -75
  377. data/lib/spontaneous/render/helpers/script_helper.rb +0 -17
  378. data/lib/spontaneous/render/helpers/stylesheet_helper.rb +0 -16
  379. data/lib/spontaneous/render/helpers.rb +0 -14
  380. data/lib/spontaneous/render/preview_context.rb +0 -8
  381. data/lib/spontaneous/render/preview_renderer.rb +0 -24
  382. data/lib/spontaneous/render/publish_context.rb +0 -22
  383. data/lib/spontaneous/render/published_renderer.rb +0 -53
  384. data/lib/spontaneous/render/publishing_renderer.rb +0 -16
  385. data/lib/spontaneous/render/render_cache.rb +0 -26
  386. data/lib/spontaneous/render/renderer.rb +0 -50
  387. data/lib/spontaneous/render/request_context.rb +0 -8
  388. data/lib/spontaneous/render.rb +0 -214
  389. data/test/experimental/test_cutaneous.rb +0 -309
  390. data/test/fixtures/application/css/test.less +0 -5
  391. data/test/slow/test_publishing.rb +0 -1006
  392. /data/application/css/{developer.scss → developer.css.scss} +0 -0
  393. /data/application/js/vendor/{jquery-1.7.1.min.js → jquery.js} +0 -0
  394. /data/application/static/{location-arrow.png → location-arrow-c1c1d3ca472481c61a0a5f8cb289d743.png} +0 -0
  395. /data/application/static/{missing.png → missing-911ce6dbd9f4602e0f3fbcd7e78846a2.png} +0 -0
  396. /data/application/static/{orange-down-arrow.png → orange-down-arrow-395ae1929e8662b2ff0977daf12c35bb.png} +0 -0
  397. /data/application/static/{page-browser-next.png → page-browser-next-ce781a242c23b980b99b9db7abc20b05.png} +0 -0
  398. /data/application/static/{plus-box.png → plus-box-dcde74a1e496f68298c9b443caa1c5d5.png} +0 -0
  399. /data/application/static/{select-arrow.png → select-arrow-6e7dd3745b00e934b0d7a3250c46558b.png} +0 -0
  400. /data/application/static/{slot-down-arrow.png → slot-down-arrow-59ad5f5ee5b52a7ebd00bca4b3104194.png} +0 -0
  401. /data/application/static/{splash.png → splash-65b493a714df9b8b3ab170103401b53d.png} +0 -0
  402. /data/application/static/{spot.png → spot-71fab1d2f065034f5fc15e7bea2ad36c.png} +0 -0
  403. /data/application/static/{spot.svg → spot-8505041082d8d3bbe8d34c29dddb3b7d.svg} +0 -0
  404. /data/application/static/{texture.png → texture-03f7627e8264b1d607113ab32c593a58.png} +0 -0
@@ -0,0 +1,261 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path('../../test_helper', __FILE__)
4
+
5
+
6
+ class ChangeTest < MiniTest::Spec
7
+
8
+ def setup
9
+ @now = Time.now
10
+ @site = setup_site
11
+ end
12
+
13
+ def teardown
14
+ teardown_site
15
+ end
16
+
17
+ context "Changes" do
18
+ setup do
19
+ @revision = 1
20
+ stub_time(@now)
21
+
22
+ # DB.logger = Logger.new($stdout)
23
+ Content.delete
24
+
25
+ class Page < Spontaneous::Page
26
+ field :title, :string, :default => "New Page"
27
+ box :things
28
+ end
29
+ class Piece < Spontaneous::Piece
30
+ box :things
31
+ end
32
+ end
33
+
34
+ teardown do
35
+ ChangeTest.send(:remove_const, :Page) rescue nil
36
+ ChangeTest.send(:remove_const, :Piece) rescue nil
37
+ Content.delete_revision(@revision) rescue nil
38
+ Content.delete_revision(@revision+1) rescue nil
39
+ Content.delete
40
+ DB.logger = nil
41
+ end
42
+
43
+
44
+
45
+ should "list all newly created pages" do
46
+ root = Page.create(:title => "root")
47
+ root[:first_published_at] = root[:last_published_at] = root.modified_at + 1000
48
+ root.save
49
+
50
+ 5.times { |i| root.things << Page.create(:title => "Page #{i+1}") }
51
+
52
+ result = Change.outstanding
53
+ result.must_be_instance_of(Array)
54
+ result.length.should == 5
55
+
56
+ result.map(&:class).should == [Change]*5
57
+
58
+ Set.new(result.map(&:page_id)).should == Set.new(root.things.map { |p| p.id })
59
+ end
60
+
61
+ should "not list new pieces as available for publish" do
62
+ root = Page.create(:title => "root")
63
+ Content.publish(@revision)
64
+ # force root to appear in the modified lists -- need this because otherwise the changes happen
65
+ # more quickly than the resolution of the timestamps can register
66
+ root[:first_published_at] = root[:last_published_at] = root.modified_at - 1000
67
+ root.things << Piece.new
68
+ root.save.reload
69
+ result = Change.outstanding
70
+ result.length.should == 1
71
+ result.first.page.should == root
72
+ end
73
+
74
+ should "not list pages that have been published" do
75
+ root = Page.create(:title => "root")
76
+
77
+ Content.publish(@revision)
78
+
79
+ 5.times { |i| root.things << Page.create(:title => "Page #{i+1}") }
80
+ root.save
81
+
82
+ Content.publish(@revision+1, [root.id, root.things.first.id])
83
+
84
+ result = Change.outstanding
85
+ result.length.should == 4
86
+ Set.new(result.map(&:page_id).flatten).should == Set.new(root.things[1..-1].map(&:id))
87
+ end
88
+
89
+ should "group unpublished parents with their children" do
90
+ root = Page.create(:title => "root")
91
+
92
+ Content.publish(@revision)
93
+
94
+ root.reload
95
+ page1 = Page.new(:title => "Page 1")
96
+ root.things << page1
97
+ new_child1 = Page.new(:title => "New Child 1")
98
+ page1.things << new_child1
99
+ new_parent = Page.new(:title => "New Parent")
100
+ new_child2 = Page.new(:title => "New Child 2")
101
+ new_child3 = Page.new(:title => "New Child 3")
102
+ root.things << new_parent
103
+ new_parent.things << new_child2
104
+ new_child2.things << new_child3
105
+
106
+ pages = [root, page1, new_child1, new_parent, new_child2, new_child3]
107
+ pages.each(&:save)
108
+
109
+
110
+ Content.publish(@revision+1, [root.id])
111
+ result = Change.outstanding
112
+
113
+ result.length.should == 5
114
+
115
+ id_groups = result.map { |change|
116
+ [change.page.id, change.dependent.map(&:id)]
117
+ }
118
+ Set.new(id_groups).should == Set.new([
119
+ [page1.id, []],
120
+ [new_child1.id, [page1.id]],
121
+ [new_parent.id, []],
122
+ [new_child2.id, [new_parent.id ]],
123
+ [new_child3.id, [new_parent.id, new_child2.id]]
124
+ ])
125
+ end
126
+
127
+ should "successfully publish list of dependent pages" do
128
+ root = Page.create(:title => "root")
129
+
130
+ Content.publish(@revision)
131
+
132
+ root.reload
133
+ page1 = Page.new(:title => "Page 1")
134
+ root.things << page1
135
+ new_child1 = Page.new(:title => "New Child 1")
136
+ page1.things << new_child1
137
+ new_parent = Page.new(:title => "New Parent")
138
+ new_child2 = Page.new(:title => "New Child 2")
139
+ new_child3 = Page.new(:title => "New Child 3")
140
+ root.things << new_parent
141
+ new_parent.things << new_child2
142
+ new_child2.things << new_child3
143
+
144
+ pages = [root, page1, new_child1, new_parent, new_child2, new_child3]
145
+ pages.each(&:save)
146
+
147
+
148
+ Content.publish(@revision+1, [root.id])
149
+ result = Change.outstanding
150
+
151
+ e = nil
152
+ begin
153
+ pages = Spontaneous::Change.include_dependencies([new_child3])
154
+ Content.publish(@revision+2, pages)
155
+ Content.delete_revision(@revision + 2) rescue nil
156
+ rescue => e
157
+ Content.delete_revision(@revision + 2) rescue nil
158
+ raise
159
+ end
160
+ end
161
+
162
+ should "provide page & dependency information in serializable format" do
163
+ root = Page.create(:title => "root")
164
+
165
+ Content.publish(@revision)
166
+
167
+ root.reload
168
+ page1 = Page.new(:title => "Page 1")
169
+ root.things << page1
170
+ new_child1 = Page.new(:title => "New Child 1")
171
+ page1.things << new_child1
172
+ root.save
173
+
174
+ Content.publish(@revision+1, [root.id])
175
+ result = Change.outstanding
176
+ change = result.detect { |change| change.page.id == new_child1.id }
177
+ change.export.should == {
178
+ :id => new_child1.id,
179
+ :title => new_child1.title.value,
180
+ :url => new_child1.path,
181
+ :published_at => nil,
182
+ :modified_at => new_child1.modified_at.httpdate,
183
+ # :editor_login => "someone",
184
+ :depth => new_child1.depth,
185
+ :side_effects => {},
186
+ :dependent => [{
187
+ :id => page1.id,
188
+ :depth => page1.depth,
189
+ :title => page1.title.value,
190
+ :url => page1.path,
191
+ :side_effects => {},
192
+ :published_at => nil,
193
+ :modified_at => page1.modified_at.httpdate,
194
+ }]
195
+ }
196
+ end
197
+
198
+ should "order modified changes in reverse modification date order" do
199
+ root = Page.create(:title => "root")
200
+
201
+ Content.publish(@revision)
202
+
203
+ root.reload
204
+ page1 = Page.new(:title => "Page 1")
205
+ root.things << page1
206
+ new_child1 = Page.new(:title => "New Child 1")
207
+ page1.things << new_child1
208
+ root.save
209
+ last = Time.now + 100
210
+ S::Content.filter(:id => new_child1.id).update(:modified_at => last)
211
+ result = Change.outstanding
212
+ assert result.first.modified_at > result.last.modified_at, "Change list in incorrect order"
213
+ end
214
+
215
+ should "provide information on side effects of publishing page with path changes" do
216
+ root = Page.create(:title => "root")
217
+
218
+
219
+ root.reload
220
+ page1 = Page.new(:title => "Page 1")
221
+ root.things << page1
222
+ new_child1 = Page.new(:title => "New Child 1")
223
+ page1.things << new_child1
224
+ root.save
225
+
226
+ Content.publish(@revision)
227
+
228
+ old_slug = page1.slug
229
+ page1.slug = "changed"
230
+ page1.save
231
+
232
+ result = Change.outstanding
233
+ change = result.detect { |change| change.page.id == page1.id }
234
+ change.export[:side_effects].should == {
235
+ :slug => [{ :count => 1, :created_at => @now.httpdate, :old_value => old_slug, :new_value => "changed"}]
236
+ }
237
+ end
238
+
239
+ should "provide information on side effects of publishing page with visibility changes" do
240
+ root = Page.create(:title => "root")
241
+
242
+
243
+ root.reload
244
+ page1 = Page.new(:title => "Page 1")
245
+ root.things << page1
246
+ new_child1 = Page.new(:title => "New Child 1")
247
+ page1.things << new_child1
248
+ root.save
249
+
250
+ Content.publish(@revision)
251
+
252
+ page1.hide!
253
+
254
+ result = Change.outstanding
255
+ change = result.detect { |change| change.page.id == page1.id }
256
+ change.export[:side_effects].should == {
257
+ :visibility => [{ :count => 1, :created_at => @now.httpdate, :old_value => false, :new_value => true}]
258
+ }
259
+ end
260
+ end
261
+ end
@@ -8,15 +8,22 @@ class ContentTest < MiniTest::Spec
8
8
  setup do
9
9
  @site = setup_site
10
10
  class Piece < Spontaneous::Piece; end
11
+ class Page < Spontaneous::Page; end
11
12
  class C < Piece; end
13
+ class P < Page; end
12
14
  C.box :things
15
+ P.box :box1
16
+ P.box :box2
13
17
  end
14
18
 
15
19
  teardown do
16
20
  teardown_site
17
21
  ContentTest.send(:remove_const, :Piece) rescue nil
22
+ ContentTest.send(:remove_const, :Page) rescue nil
18
23
  ContentTest.send(:remove_const, :C) rescue nil
24
+ ContentTest.send(:remove_const, :P) rescue nil
19
25
  end
26
+
20
27
  context "Content instances" do
21
28
  should "evaluate instance code" do
22
29
  @instance = C.create({
@@ -37,20 +44,24 @@ class ContentTest < MiniTest::Spec
37
44
  Content.delete
38
45
  end
39
46
  should "be initialised empty" do
40
- @instance.pieces.should == []
47
+ @instance.contents.should == []
48
+ end
49
+
50
+ should "provide a #target method poiting to itself" do
51
+ @instance.target.should == @instance
41
52
  end
42
53
 
43
54
  should "accept addition of child content" do
44
55
  e = C.new
45
56
  @instance.things << e
46
- @instance.pieces.length.should == 1
47
- @instance.things.pieces.length.should == 1
48
- @instance.pieces.first.should == e
49
- @instance.pieces.first.container.should == @instance.things
50
- @instance.pieces.first.owner.should == @instance
51
- @instance.pieces.first.parent.should == @instance
57
+ @instance.contents.length.should == 1
58
+ @instance.things.contents.length.should == 1
59
+ @instance.contents.first.should == e
60
+ @instance.contents.first.container.should == @instance.things
61
+ @instance.contents.first.owner.should == @instance
62
+ @instance.contents.first.parent.should == @instance
52
63
  e.visibility_path.should == "#{@instance.id}"
53
- @instance.pieces.first.visibility_path.should == "#{@instance.id}"
64
+ @instance.contents.first.visibility_path.should == "#{@instance.id}"
54
65
  end
55
66
 
56
67
  should "accept addition of multiple children" do
@@ -58,20 +69,20 @@ class ContentTest < MiniTest::Spec
58
69
  f = C.new
59
70
  @instance.things << e
60
71
  @instance.things << f
61
- @instance.pieces.length.should == 2
62
- @instance.things.pieces.length.should == 2
63
- @instance.pieces.first.should == e
64
- @instance.things.pieces.first.should == e
65
- @instance.pieces.last.should == f
66
- @instance.things.pieces.last.should == f
67
- @instance.pieces.first.container.should == @instance.things
68
- @instance.pieces.last.container.should == @instance.things
69
- @instance.pieces.first.parent.should == @instance
70
- @instance.pieces.last.parent.should == @instance
71
- @instance.pieces.first.owner.should == @instance
72
- @instance.pieces.last.owner.should == @instance
73
- @instance.pieces.first.visibility_path.should == "#{@instance.id}"
74
- @instance.pieces.last.visibility_path.should == "#{@instance.id}"
72
+ @instance.contents.length.should == 2
73
+ @instance.things.contents.length.should == 2
74
+ @instance.contents.first.should == e
75
+ @instance.things.contents.first.should == e
76
+ @instance.contents.last.should == f
77
+ @instance.things.contents.last.should == f
78
+ @instance.contents.first.container.should == @instance.things
79
+ @instance.contents.last.container.should == @instance.things
80
+ @instance.contents.first.parent.should == @instance
81
+ @instance.contents.last.parent.should == @instance
82
+ @instance.contents.first.owner.should == @instance
83
+ @instance.contents.last.owner.should == @instance
84
+ @instance.contents.first.visibility_path.should == "#{@instance.id}"
85
+ @instance.contents.last.visibility_path.should == "#{@instance.id}"
75
86
  end
76
87
 
77
88
  should "allow for a deep hierarchy" do
@@ -79,8 +90,8 @@ class ContentTest < MiniTest::Spec
79
90
  f = C.new
80
91
  @instance.things << e
81
92
  e.things << f
82
- @instance.pieces.length.should == 1
83
- @instance.pieces.first.should == e
93
+ @instance.contents.length.should == 1
94
+ @instance.contents.first.should == e
84
95
  e.owner.id.should == @instance.id
85
96
  e.parent.id.should == @instance.id
86
97
  e.container.should == @instance.things
@@ -105,8 +116,8 @@ class ContentTest < MiniTest::Spec
105
116
  e = C[e.id]
106
117
  f = C[f.id]
107
118
 
108
- i.pieces.length.should == 1
109
- i.pieces.first.should == e
119
+ i.contents.length.should == 1
120
+ i.contents.first.should == e
110
121
 
111
122
  e.container.should == i.things
112
123
  e.owner.should == i
@@ -114,9 +125,9 @@ class ContentTest < MiniTest::Spec
114
125
  f.container.should == e.things
115
126
  f.parent.should == e
116
127
  f.owner.should == e
117
- e.entry.should == i.pieces.first
118
- f.entry.should == e.pieces.first
119
- e.pieces.first.should == f
128
+ e.entry.should == i.contents.first
129
+ f.entry.should == e.contents.first
130
+ e.contents.first.should == f
120
131
  end
121
132
 
122
133
  should "have a list of child nodes" do
@@ -131,10 +142,35 @@ class ContentTest < MiniTest::Spec
131
142
  i = C[@instance.id]
132
143
  e = C[e.id]
133
144
  f = C[f.id]
134
- i.pieces.should == [e]
135
- e.pieces.should == [f]
145
+ i.contents.should == [e]
146
+ e.contents.should == [f]
147
+ end
148
+
149
+ should "provide a list of non-page contents" do
150
+ p = P.new
151
+
152
+ c1 = C.new
153
+ c2 = C.new
154
+ c3 = C.new
155
+ p1 = P.new
156
+ p2 = P.new
157
+ p3 = P.new
158
+
159
+ p.box1 << c1
160
+ p.box1 << c2
161
+ p.box1 << p1
162
+
163
+ p.box2 << p3
164
+ p.box2 << c3
165
+
166
+ [p, c1, c2, c3, p1, p2, p3].each { |c| c.save; c.reload }
167
+
168
+ p = P[p.id]
169
+
170
+ p.pieces.should == [c1, c2, c3]
136
171
  end
137
172
 
173
+
138
174
  should "allow for testing of position" do
139
175
  e = C.new
140
176
  f = C.new
@@ -223,8 +259,8 @@ class ContentTest < MiniTest::Spec
223
259
  @b.destroy
224
260
  C.count.should == 2
225
261
  @a.reload
226
- @a.pieces.length.should == 1
227
- @a.pieces.first.should == @d.reload
262
+ @a.contents.length.should == 1
263
+ @a.contents.first.should == @d.reload
228
264
  C.all.map { |c| c.id }.sort.should == [@a, @d].map { |c| c.id }.sort
229
265
  end
230
266
 
@@ -292,6 +328,10 @@ class ContentTest < MiniTest::Spec
292
328
  @b.reload
293
329
  @b.visibility_path.should == @r.id.to_s
294
330
  end
331
+
332
+ should "ensure that child pages have their visibility paths updated" do
333
+ flunk "Implement this"
334
+ end
295
335
  end
296
336
 
297
337
 
@@ -49,26 +49,26 @@ class ContentInheritanceTest < MiniTest::Spec
49
49
  end
50
50
 
51
51
  should "aaa correctly type subclasses found via Content" do
52
- Content.all.map { |c| c.class }.should == \
53
- [PageClass1, PageClass11, PageClass111, PageClass2, PageClass22,
54
- PieceClass1, PieceClass11, PieceClass111, PieceClass2, PieceClass22]
55
- Content.all.should == \
56
- [@page1, @page11, @page111, @page2, @page22,
57
- @piece1, @piece11, @piece111, @piece2, @piece22]
52
+ Set.new(Content.all.map { |c| c.class }).should == \
53
+ Set.new([PageClass1, PageClass11, PageClass111, PageClass2, PageClass22,
54
+ PieceClass1, PieceClass11, PieceClass111, PieceClass2, PieceClass22])
55
+ Set.new(Content.all).should == \
56
+ Set.new([@page1, @page11, @page111, @page2, @page22,
57
+ @piece1, @piece11, @piece111, @piece2, @piece22])
58
58
  end
59
59
 
60
60
  context "Pages" do
61
61
 
62
62
  should "type subclasses found via Page" do
63
- ::Page.all.map { |c| c.class }.should == \
64
- [PageClass1, PageClass11, PageClass111, PageClass2, PageClass22]
65
- ::Page.all.should == [@page1, @page11, @page111, @page2, @page22]
63
+ Set.new(::Page.all.map { |c| c.class }).should == \
64
+ Set.new([PageClass1, PageClass11, PageClass111, PageClass2, PageClass22])
65
+ Set.new(::Page.all).should == Set.new([@page1, @page11, @page111, @page2, @page22])
66
66
  end
67
67
 
68
68
  should "type subclasses found via Spontaneous::Page" do
69
- Spontaneous::Page.all.map { |c| c.class }.should == \
70
- [PageClass1, PageClass11, PageClass111, PageClass2, PageClass22]
71
- Spontaneous::Page.all.should == [@page1, @page11, @page111, @page2, @page22]
69
+ Set.new(Spontaneous::Page.all.map { |c| c.class }).should == \
70
+ Set.new([PageClass1, PageClass11, PageClass111, PageClass2, PageClass22])
71
+ Set.new(Spontaneous::Page.all).should == Set.new([@page1, @page11, @page111, @page2, @page22])
72
72
  end
73
73
 
74
74
  should "only find instances of a single class when searching via that subclass" do
@@ -82,14 +82,14 @@ class ContentInheritanceTest < MiniTest::Spec
82
82
 
83
83
  context "Pieces" do
84
84
  should "type subclasses found via Spontaneous::Piece" do
85
- Spontaneous::Piece.all.map { |c| c.class }.should == \
86
- [PieceClass1, PieceClass11, PieceClass111, PieceClass2, PieceClass22]
87
- Spontaneous::Piece.all.should == [@piece1, @piece11, @piece111, @piece2, @piece22]
85
+ Set.new(Spontaneous::Piece.all.map { |c| c.class }).should == \
86
+ Set.new([PieceClass1, PieceClass11, PieceClass111, PieceClass2, PieceClass22])
87
+ Set.new(Spontaneous::Piece.all).should == Set.new([@piece1, @piece11, @piece111, @piece2, @piece22])
88
88
  end
89
89
  should "type subclasses found via Piece" do
90
- ::Piece.all.map { |c| c.class }.should == \
91
- [PieceClass1, PieceClass11, PieceClass111, PieceClass2, PieceClass22]
92
- ::Piece.all.should == [@piece1, @piece11, @piece111, @piece2, @piece22]
90
+ Set.new(::Piece.all.map { |c| c.class }).should == \
91
+ Set.new([PieceClass1, PieceClass11, PieceClass111, PieceClass2, PieceClass22])
92
+ Set.new(::Piece.all).should == Set.new([@piece1, @piece11, @piece111, @piece2, @piece22])
93
93
  end
94
94
 
95
95
  should "only find instances of a single class when searching via that subclass" do
@@ -9,12 +9,38 @@ class ExtensionsTest < MiniTest::Spec
9
9
  ("this" / "that").should == "this/that"
10
10
  ("/this" / "/that").should == "/this/that"
11
11
  end
12
+
13
+ should "override the | method to return the argument if empty" do
14
+ ("" | "that").should == "that"
15
+ ("this" | "that").should == "this"
16
+ end
17
+
18
+ should "override the or method to return the argument if empty" do
19
+ ("".or("that")).should == "that"
20
+ ("this".or("that")).should == "this"
21
+ end
22
+
23
+ should "return self for #value" do
24
+ "this".value.should == "this"
25
+ "this".value(:html).should == "this"
26
+ "this".value(:smsx).should == "this"
27
+ end
12
28
  end
13
29
 
14
30
  context "Nil" do
15
31
  should "always return the argument for the slash switch" do
16
32
  (nil / "something").should == "something"
17
33
  end
34
+ should "always return the argument for the #or switch" do
35
+ (nil.or("something")).should == "something"
36
+ end
37
+ end
38
+
39
+ context "Enumerable" do
40
+ should "correctly slice_between elements" do
41
+ result = ["js", "coffee", "coffee", "js", "coffee"].slice_between { |prev, current| prev != current }.to_a
42
+ result.should == [["js"], ["coffee", "coffee"], ["js"], ["coffee"]]
43
+ end
18
44
  end
19
45
  end
20
46