spontaneous 0.1.0.alpha1 → 0.2.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (413) hide show
  1. data/Gemfile +40 -35
  2. data/LICENSE +20 -0
  3. data/Rakefile +39 -42
  4. data/Readme.markdown +155 -0
  5. data/application/css/definitions.scss +3 -0
  6. data/application/css/editing.scss +9 -4
  7. data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +1 -0
  8. data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +1 -0
  9. data/application/css/min/d1b54ff4847c613618267ca1c15658e2aee0a4e5.css +1 -0
  10. data/application/css/v2.scss +144 -50
  11. data/application/js/add_alias_dialogue.js +18 -8
  12. data/application/js/ajax.js +1 -1
  13. data/application/js/authentication.js +8 -1
  14. data/application/js/box.js +37 -7
  15. data/application/js/box_container.js +1 -1
  16. data/application/js/compatibility.js +7 -0
  17. data/application/js/content.js +7 -0
  18. data/application/js/content_area.js +4 -0
  19. data/application/js/edit_panel.js +44 -18
  20. data/application/js/editing.js +12 -0
  21. data/application/js/event_source.js +17 -0
  22. data/application/js/extensions.js +2 -0
  23. data/application/js/field_types/file_field.js +2 -1
  24. data/application/js/field_types/image_field.js +35 -48
  25. data/application/js/field_types/long_string_field.js +12 -0
  26. data/application/js/field_types/markdown_field.js +2 -5
  27. data/application/js/field_types/string_field.js +5 -1
  28. data/application/js/field_types/webvideo_field.js +15 -0
  29. data/application/js/init.js +1 -0
  30. data/application/js/location.js +30 -19
  31. data/application/js/login.js +1 -2
  32. data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +3 -0
  33. data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +2 -0
  34. data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +3 -0
  35. data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +90 -0
  36. data/application/js/page.js +1 -0
  37. data/application/js/page_entry.js +6 -40
  38. data/application/js/preview.js +2 -3
  39. data/application/js/top_bar.js +76 -31
  40. data/application/js/upload.js +5 -2
  41. data/application/js/upload_manager.js +2 -81
  42. data/application/js/vendor/jquery-1.7.1.min.js +4 -0
  43. data/application/js/vendor/jquery-ui-1.8.16.custom.min.js +791 -0
  44. data/application/js/views.js +3 -3
  45. data/application/js/views/box_view.js +164 -83
  46. data/application/js/views/page_piece_view.js +2 -2
  47. data/application/js/views/page_view.js +46 -15
  48. data/application/js/views/piece_view.js +29 -8
  49. data/application/static/diagonal-texture.png +0 -0
  50. data/application/static/item-buttons-highlight.png +0 -0
  51. data/application/static/plus-box.png +0 -0
  52. data/application/static/plus_alt.svg +8 -0
  53. data/application/static/slot-up-arrow.png +0 -0
  54. data/application/views/{index.erubis → index.erb} +9 -5
  55. data/application/views/{login.erubis → login.erb} +14 -10
  56. data/application/views/schema_modification_error.html.erb +18 -6
  57. data/application/views/{unsupported.erubis → unsupported.erb} +0 -0
  58. data/bin/spot +15 -2
  59. data/db/migrations/20100610142136_init.rb +2 -2
  60. data/db/migrations/20101130104334_timestamps.rb +2 -2
  61. data/db/migrations/20110209152710_users_and_groups.rb +11 -11
  62. data/db/migrations/20120106171423_visibility_path.rb +19 -0
  63. data/db/migrations/20120107124541_owner_id.rb +19 -0
  64. data/docs/recipe-interface-screenshot.png +0 -0
  65. data/lib/cutaneous.rb +11 -10
  66. data/lib/cutaneous/context_helper.rb +119 -14
  67. data/lib/cutaneous/preview_context.rb +4 -3
  68. data/lib/cutaneous/preview_renderer.rb +1 -6
  69. data/lib/cutaneous/publish_context.rb +1 -0
  70. data/lib/cutaneous/{first_pass_renderer.rb → publish_renderer.rb} +2 -6
  71. data/lib/cutaneous/publish_template.rb +62 -0
  72. data/lib/cutaneous/publish_token_parser.rb +8 -0
  73. data/lib/cutaneous/renderer.rb +4 -2
  74. data/lib/cutaneous/request_context.rb +1 -0
  75. data/lib/cutaneous/{second_pass_renderer.rb → request_renderer.rb} +2 -5
  76. data/lib/cutaneous/request_template.rb +11 -0
  77. data/lib/cutaneous/request_token_parser.rb +9 -0
  78. data/lib/cutaneous/token_parser.rb +125 -0
  79. data/lib/sequel/plugins/content_table_inheritance.rb +19 -12
  80. data/lib/sequel/plugins/scoped_table_name.rb +45 -0
  81. data/lib/spontaneous.rb +123 -126
  82. data/lib/spontaneous/box.rb +127 -47
  83. data/lib/spontaneous/box_style.rb +39 -22
  84. data/lib/spontaneous/change.rb +2 -2
  85. data/lib/spontaneous/cli.rb +1 -0
  86. data/lib/spontaneous/cli/base.rb +12 -4
  87. data/lib/spontaneous/cli/console.rb +72 -0
  88. data/lib/spontaneous/cli/server.rb +36 -12
  89. data/lib/spontaneous/cli/site.rb +175 -1
  90. data/lib/spontaneous/collections/box_set.rb +19 -1
  91. data/lib/spontaneous/collections/entry_set.rb +70 -22
  92. data/lib/spontaneous/collections/field_set.rb +3 -3
  93. data/lib/spontaneous/collections/prototype_set.rb +28 -0
  94. data/lib/spontaneous/config.rb +14 -5
  95. data/lib/spontaneous/content.rb +23 -24
  96. data/lib/spontaneous/errors.rb +20 -4
  97. data/lib/spontaneous/extensions/array.rb +2 -2
  98. data/lib/spontaneous/extensions/json.rb +1 -1
  99. data/lib/spontaneous/extensions/nil.rb +13 -0
  100. data/lib/spontaneous/facet.rb +61 -7
  101. data/lib/spontaneous/field_types.rb +1 -3
  102. data/lib/spontaneous/field_types/date_field.rb +1 -0
  103. data/lib/spontaneous/field_types/field.rb +32 -15
  104. data/lib/spontaneous/field_types/image_field.rb +138 -69
  105. data/lib/spontaneous/field_types/location_field.rb +59 -0
  106. data/lib/spontaneous/field_types/long_string_field.rb +13 -0
  107. data/lib/spontaneous/field_types/markdown_field.rb +2 -1
  108. data/lib/spontaneous/field_types/string_field.rb +2 -2
  109. data/lib/spontaneous/field_types/webvideo_field.rb +255 -0
  110. data/lib/spontaneous/generators/page/inline.html.cut +1 -1
  111. data/lib/spontaneous/generators/page/page.html.cut.tt +5 -4
  112. data/lib/spontaneous/generators/page/page.rb.tt +1 -5
  113. data/lib/spontaneous/generators/site.rb +1 -0
  114. data/lib/spontaneous/generators/site/.gitignore +2 -0
  115. data/lib/spontaneous/generators/site/Gemfile.tt +3 -5
  116. data/lib/spontaneous/generators/site/config/environment.rb.tt +1 -0
  117. data/lib/spontaneous/generators/site/config/environments/development.rb.tt +3 -1
  118. data/lib/spontaneous/generators/site/config/environments/production.rb.tt +3 -1
  119. data/lib/spontaneous/generators/site/config/indexes.rb.tt +23 -0
  120. data/lib/spontaneous/generators/site/public/css/{site.css → site.scss} +0 -0
  121. data/lib/spontaneous/generators/site/schema/box.rb.tt +5 -0
  122. data/lib/spontaneous/generators/site/templates/layouts/standard.html.cut.tt +11 -5
  123. data/lib/spontaneous/image_size.rb +0 -1
  124. data/lib/spontaneous/loader.rb +335 -218
  125. data/lib/spontaneous/logger.rb +7 -2
  126. data/lib/spontaneous/media.rb +64 -59
  127. data/lib/spontaneous/media/file.rb +74 -0
  128. data/lib/spontaneous/page.rb +47 -18
  129. data/lib/spontaneous/page_piece.rb +29 -27
  130. data/lib/spontaneous/paths.rb +0 -1
  131. data/lib/spontaneous/permissions.rb +3 -21
  132. data/lib/spontaneous/permissions/user.rb +5 -1
  133. data/lib/spontaneous/permissions/user_level.rb +6 -7
  134. data/lib/spontaneous/piece.rb +12 -7
  135. data/lib/spontaneous/plugins/aliases.rb +76 -31
  136. data/lib/spontaneous/plugins/allowed_types.rb +36 -37
  137. data/lib/spontaneous/plugins/application/facets.rb +7 -10
  138. data/lib/spontaneous/plugins/application/features.rb +17 -0
  139. data/lib/spontaneous/plugins/application/paths.rb +25 -31
  140. data/lib/spontaneous/plugins/application/render.rb +1 -5
  141. data/lib/spontaneous/plugins/application/serialisation.rb +2 -0
  142. data/lib/spontaneous/plugins/application/state.rb +6 -9
  143. data/lib/spontaneous/plugins/boxes.rb +65 -40
  144. data/lib/spontaneous/plugins/controllers.rb +22 -22
  145. data/lib/spontaneous/plugins/entries.rb +149 -150
  146. data/lib/spontaneous/plugins/entry.rb +50 -35
  147. data/lib/spontaneous/plugins/field/editor_class.rb +13 -0
  148. data/lib/spontaneous/plugins/fields.rb +41 -33
  149. data/lib/spontaneous/plugins/instance_code.rb +9 -9
  150. data/lib/spontaneous/plugins/layouts.rb +31 -35
  151. data/lib/spontaneous/plugins/media.rb +31 -32
  152. data/lib/spontaneous/plugins/page/formats.rb +56 -31
  153. data/lib/spontaneous/plugins/page/request.rb +15 -9
  154. data/lib/spontaneous/plugins/page_search.rb +30 -31
  155. data/lib/spontaneous/plugins/page_tree.rb +59 -12
  156. data/lib/spontaneous/plugins/paths.rb +84 -79
  157. data/lib/spontaneous/plugins/permissions.rb +26 -28
  158. data/lib/spontaneous/plugins/prototypes.rb +42 -37
  159. data/lib/spontaneous/plugins/publishing.rb +50 -94
  160. data/lib/spontaneous/plugins/render.rb +8 -16
  161. data/lib/spontaneous/plugins/schema_hierarchy.rb +20 -21
  162. data/lib/spontaneous/plugins/schema_id.rb +33 -25
  163. data/lib/spontaneous/plugins/schema_title.rb +3 -4
  164. data/lib/spontaneous/plugins/serialisation.rb +32 -35
  165. data/lib/spontaneous/plugins/site/features.rb +32 -0
  166. data/lib/spontaneous/plugins/site/instance.rb +3 -2
  167. data/lib/spontaneous/plugins/site/level.rb +18 -0
  168. data/lib/spontaneous/plugins/site/map.rb +2 -1
  169. data/lib/spontaneous/plugins/site/publishing.rb +56 -59
  170. data/lib/spontaneous/plugins/site/revisions.rb +24 -19
  171. data/lib/spontaneous/plugins/site/schema.rb +33 -0
  172. data/lib/spontaneous/plugins/site/search.rb +43 -0
  173. data/lib/spontaneous/plugins/site/selectors.rb +35 -30
  174. data/lib/spontaneous/plugins/site/storage.rb +63 -0
  175. data/lib/spontaneous/plugins/site_map.rb +23 -25
  176. data/lib/spontaneous/plugins/styles.rb +35 -43
  177. data/lib/spontaneous/plugins/supertype.rb +3 -1
  178. data/lib/spontaneous/plugins/visibility.rb +90 -83
  179. data/lib/spontaneous/prototypes/box_prototype.rb +55 -25
  180. data/lib/spontaneous/prototypes/field_prototype.rb +66 -19
  181. data/lib/spontaneous/prototypes/style_prototype.rb +2 -2
  182. data/lib/spontaneous/publishing.rb +1 -1
  183. data/lib/spontaneous/publishing/immediate.rb +128 -49
  184. data/lib/spontaneous/publishing/simultaneous.rb +70 -0
  185. data/lib/spontaneous/rack.rb +38 -26
  186. data/lib/spontaneous/rack/around_back.rb +3 -23
  187. data/lib/spontaneous/rack/around_preview.rb +3 -8
  188. data/lib/spontaneous/rack/assets.rb +7 -6
  189. data/lib/spontaneous/rack/authentication.rb +21 -0
  190. data/lib/spontaneous/rack/back.rb +310 -331
  191. data/lib/spontaneous/rack/cacheable_file.rb +27 -0
  192. data/lib/spontaneous/rack/cookie_authentication.rb +38 -0
  193. data/lib/spontaneous/rack/css.rb +43 -0
  194. data/lib/spontaneous/rack/event_source.rb +31 -0
  195. data/lib/spontaneous/rack/front.rb +30 -8
  196. data/lib/spontaneous/rack/helpers.rb +31 -0
  197. data/lib/spontaneous/rack/media.rb +22 -21
  198. data/lib/spontaneous/rack/public.rb +2 -1
  199. data/lib/spontaneous/rack/query_authentication.rb +35 -0
  200. data/lib/spontaneous/rack/reloader.rb +6 -3
  201. data/lib/spontaneous/rack/user_helpers.rb +28 -0
  202. data/lib/spontaneous/render.rb +64 -23
  203. data/lib/spontaneous/render/context_base.rb +143 -0
  204. data/lib/spontaneous/render/format.rb +24 -19
  205. data/lib/spontaneous/render/helpers.rb +14 -0
  206. data/lib/spontaneous/render/helpers/html_helper.rb +69 -0
  207. data/lib/spontaneous/render/helpers/script_helper.rb +17 -0
  208. data/lib/spontaneous/render/helpers/stylesheet_helper.rb +16 -0
  209. data/lib/spontaneous/render/preview_context.rb +8 -0
  210. data/lib/spontaneous/render/preview_renderer.rb +6 -0
  211. data/lib/spontaneous/render/publish_context.rb +22 -0
  212. data/lib/spontaneous/render/published_renderer.rb +12 -13
  213. data/lib/spontaneous/render/publishing_renderer.rb +3 -0
  214. data/lib/spontaneous/render/render_cache.rb +26 -0
  215. data/lib/spontaneous/render/renderer.rb +5 -1
  216. data/lib/spontaneous/render/request_context.rb +8 -0
  217. data/lib/spontaneous/schema.rb +56 -24
  218. data/lib/spontaneous/schema/schema_modification.rb +2 -2
  219. data/lib/spontaneous/schema/uid.rb +22 -106
  220. data/lib/spontaneous/schema/uid_map.rb +120 -0
  221. data/lib/spontaneous/search.rb +11 -0
  222. data/lib/spontaneous/search/compound_indexer.rb +26 -0
  223. data/lib/spontaneous/search/database.rb +72 -0
  224. data/lib/spontaneous/search/field.rb +95 -0
  225. data/lib/spontaneous/search/index.rb +184 -0
  226. data/lib/spontaneous/search/results.rb +34 -0
  227. data/lib/spontaneous/server.rb +5 -1
  228. data/lib/spontaneous/site.rb +56 -16
  229. data/lib/spontaneous/storage.rb +22 -0
  230. data/lib/spontaneous/storage/backend.rb +10 -0
  231. data/lib/spontaneous/storage/cloud.rb +104 -0
  232. data/lib/spontaneous/storage/local.rb +52 -0
  233. data/lib/spontaneous/style.rb +27 -9
  234. data/lib/spontaneous/version.rb +1 -1
  235. data/spontaneous.gemspec +719 -0
  236. data/test/disabled/test_slots.rb +1 -1
  237. data/test/experimental/test_cutaneous.rb +309 -0
  238. data/test/experimental/test_features.rb +129 -0
  239. data/test/fixtures/application/views/{index.erubis → index.erb} +0 -0
  240. data/test/fixtures/back/public/css/sass_include.scss +5 -0
  241. data/test/fixtures/back/public/css/sass_template.scss +4 -0
  242. data/test/fixtures/example_application/templates/client_project.html.cut +4 -4
  243. data/test/fixtures/example_application/templates/client_project/images.html.cut +1 -1
  244. data/test/fixtures/example_application/templates/client_projects.html.cut +2 -2
  245. data/test/fixtures/example_application/templates/inline_image.html.cut +1 -1
  246. data/test/fixtures/example_application/templates/layouts/home.html.cut +7 -7
  247. data/test/fixtures/example_application/templates/layouts/info.html.cut +1 -1
  248. data/test/fixtures/example_application/templates/layouts/project.html.cut +4 -4
  249. data/test/fixtures/example_application/templates/layouts/projects.html.cut +2 -2
  250. data/test/fixtures/example_application/templates/project.html.cut +2 -2
  251. data/test/fixtures/example_application/templates/project/inline.html.cut +3 -3
  252. data/test/fixtures/example_application/templates/project_image.html.cut +1 -1
  253. data/test/fixtures/example_application/templates/text.html.cut +1 -1
  254. data/test/fixtures/fields/youtube_api_response.xml +102 -0
  255. data/test/fixtures/layouts/layouts/custom4.html.cut +0 -0
  256. data/test/fixtures/plugins/schema_plugin/public/css/plugin.css +1 -0
  257. data/test/fixtures/plugins/schema_plugin/public/js/plugin.js +1 -0
  258. data/test/fixtures/plugins/schema_plugin/public/static.html +1 -0
  259. data/test/fixtures/plugins/schema_plugin/public/subdir/image.gif +1 -0
  260. data/test/fixtures/plugins/schema_plugin/public/subdir/include1.scss +3 -0
  261. data/test/fixtures/plugins/schema_plugin/public/subdir/sass.scss +4 -0
  262. data/test/fixtures/plugins/schema_plugin/public/subdir/sass/include2.scss +4 -0
  263. data/test/fixtures/public/templates/layouts/default.html.cut +1 -1
  264. data/test/fixtures/public/templates/layouts/default.pdf.cut +1 -1
  265. data/test/fixtures/public/templates/layouts/default.rss.cut +1 -1
  266. data/test/fixtures/public/templates/layouts/dynamic.html.cut +1 -1
  267. data/test/fixtures/schema_modification/config/database.yml +0 -0
  268. data/test/fixtures/schema_modification/config/environment.rb +2 -0
  269. data/test/fixtures/schema_modification/schema/box.rb +1 -0
  270. data/test/fixtures/schema_modification/schema/custom_box.rb +1 -0
  271. data/test/fixtures/schema_modification/schema/page.rb +6 -0
  272. data/test/fixtures/schema_modification/schema/piece.rb +1 -0
  273. data/test/fixtures/search/config/database.yml +1 -0
  274. data/test/fixtures/search/config/indexes.rb +4 -0
  275. data/test/fixtures/serialisation/root_hash.yaml.erb +16 -20
  276. data/test/fixtures/storage/cloud/environment.rb +12 -0
  277. data/test/fixtures/storage/default/environment.rb +1 -0
  278. data/test/fixtures/templates/aliases/layouts/c_alias.html.cut +1 -1
  279. data/test/fixtures/templates/content/include.html.cut +1 -1
  280. data/test/fixtures/templates/content/include_dir.html.cut +1 -1
  281. data/test/fixtures/templates/content/included.epub.cut +1 -1
  282. data/test/fixtures/templates/content/included.html.cut +1 -1
  283. data/test/fixtures/templates/content/partial/included.html.cut +1 -1
  284. data/test/fixtures/templates/content/preprocess.html.cut +1 -1
  285. data/test/fixtures/templates/content/second.html.cut +1 -1
  286. data/test/fixtures/templates/content/template.epub.cut +1 -1
  287. data/test/fixtures/templates/content/template.html.cut +1 -1
  288. data/test/fixtures/templates/default_style_class.html.cut +1 -1
  289. data/test/fixtures/templates/engine/braces.html.cut +6 -0
  290. data/test/fixtures/templates/engine/multiline.html.cut +5 -0
  291. data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
  292. data/test/fixtures/templates/extended/main.html.cut +5 -5
  293. data/test/fixtures/templates/extended/parent.html.cut +10 -8
  294. data/test/fixtures/templates/extended/partial.html.cut +1 -0
  295. data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -0
  296. data/test/fixtures/templates/extended/with_includes.html.cut +9 -0
  297. data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +9 -0
  298. data/test/fixtures/templates/layouts/entries.html.cut +7 -7
  299. data/test/fixtures/templates/layouts/page_style.html.cut +1 -1
  300. data/test/fixtures/templates/layouts/params.html.cut +1 -1
  301. data/test/fixtures/templates/layouts/preview_render.html.cut +2 -2
  302. data/test/fixtures/templates/layouts/standard_page.html.cut +1 -1
  303. data/test/fixtures/templates/layouts/subdir_style.html.cut +1 -1
  304. data/test/fixtures/templates/layouts/template_params.html.cut +1 -1
  305. data/test/fixtures/templates/layouts/variables.html.cut +7 -0
  306. data/test/fixtures/templates/page_class/inline_style.html.cut +1 -1
  307. data/test/fixtures/templates/preview_render/variables.html.cut +1 -0
  308. data/test/fixtures/templates/publishing/templates/layouts/dynamic.html.cut +1 -0
  309. data/test/fixtures/templates/publishing/templates/layouts/dynamic.rtf.cut +1 -0
  310. data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -0
  311. data/test/fixtures/templates/template_class/anonymous_style.html.cut +2 -2
  312. data/test/fixtures/templates/template_class/complex_template.html.cut +4 -4
  313. data/test/fixtures/templates/template_class/complex_template.pdf.cut +4 -4
  314. data/test/fixtures/templates/template_class/default_template_style.html.cut +2 -2
  315. data/test/fixtures/templates/template_class/images_with_template.html.cut +3 -3
  316. data/test/fixtures/templates/template_class/slots_template.html.cut +3 -3
  317. data/test/fixtures/templates/template_class/slots_template.pdf.cut +3 -3
  318. data/test/fixtures/templates/template_class/this_template.epub.cut +1 -1
  319. data/test/fixtures/templates/template_class/this_template.html.cut +1 -1
  320. data/test/fixtures/templates/template_class/this_template.pdf.cut +1 -1
  321. data/test/fixtures/templates/with_default_style_class.html.cut +1 -1
  322. data/test/functional/test_application.rb +19 -15
  323. data/test/functional/test_back.rb +130 -98
  324. data/test/functional/test_front.rb +72 -28
  325. data/test/javascript/test_dom.rb +1 -1
  326. data/test/javascript/test_markdown.rb +1 -1
  327. data/test/slow/test_publishing.rb +94 -75
  328. data/test/slow/test_visibility.rb +47 -14
  329. data/test/test_helper.rb +30 -3
  330. data/test/ui/test_page_editing.rb +1 -1
  331. data/test/unit/test_alias.rb +200 -16
  332. data/test/unit/test_authentication.rb +26 -28
  333. data/test/unit/test_boxes.rb +146 -75
  334. data/test/unit/test_config.rb +42 -20
  335. data/test/unit/test_content.rb +156 -37
  336. data/test/unit/test_content_inheritance.rb +4 -2
  337. data/test/unit/test_extensions.rb +7 -1
  338. data/test/unit/test_fields.rb +558 -290
  339. data/test/{experimental → unit}/test_formats.rb +42 -3
  340. data/test/unit/test_generators.rb +3 -2
  341. data/test/unit/test_helpers.rb +54 -0
  342. data/test/unit/test_image_size.rb +1 -1
  343. data/test/unit/test_images.rb +51 -40
  344. data/test/unit/test_layouts.rb +21 -4
  345. data/test/unit/test_logger.rb +1 -1
  346. data/test/unit/test_media.rb +165 -7
  347. data/test/unit/test_page.rb +158 -27
  348. data/test/unit/test_permissions.rb +170 -187
  349. data/test/unit/test_piece.rb +27 -9
  350. data/test/unit/test_plugins.rb +153 -0
  351. data/test/unit/test_prototype_set.rb +60 -2
  352. data/test/unit/test_prototypes.rb +81 -20
  353. data/test/unit/test_render.rb +97 -9
  354. data/test/unit/test_schema.rb +167 -120
  355. data/test/unit/test_search.rb +588 -0
  356. data/test/unit/test_serialisation.rb +26 -10
  357. data/test/unit/test_site.rb +42 -25
  358. data/test/unit/test_storage.rb +88 -0
  359. data/test/unit/test_structure.rb +11 -5
  360. data/test/unit/test_styles.rb +64 -3
  361. data/test/unit/test_table_scoping.rb +76 -0
  362. data/test/unit/test_templates.rb +69 -31
  363. data/test/unit/test_type_hierarchy.rb +9 -1
  364. metadata +274 -208
  365. data/Gemfile.lock +0 -146
  366. data/application/css/min/54ee0ed3c7fac7632bd5c020d69e9a2503e0c88c.css +0 -1
  367. data/application/css/min/c256adc144e2bdd0b0539356b04eb62db01e1dc3.css +0 -1
  368. data/application/js/edit_dialogue.js +0 -137
  369. data/application/js/min/492a209de8ee955fa9c729a765377495001e11b1.js +0 -17
  370. data/application/js/min/80f684d77c940887a1d4a63e3a96102e993baa98.js +0 -88
  371. data/application/js/min/c7140ec9475e5bf868b901e0621338d7d162358b.js +0 -3
  372. data/application/js/min/f07f2bd6630ee31e1c2288ec223383d8f0658ba6.js +0 -2
  373. data/application/js/vendor/.DS_Store +0 -0
  374. data/application/js/vendor/JS.Class-2.1.5/src/command.js +0 -93
  375. data/application/js/vendor/JS.Class-2.1.5/src/comparable.js +0 -37
  376. data/application/js/vendor/JS.Class-2.1.5/src/constant_scope.js +0 -48
  377. data/application/js/vendor/JS.Class-2.1.5/src/core.js +0 -1060
  378. data/application/js/vendor/JS.Class-2.1.5/src/decorator.js +0 -50
  379. data/application/js/vendor/JS.Class-2.1.5/src/enumerable.js +0 -505
  380. data/application/js/vendor/JS.Class-2.1.5/src/forwardable.js +0 -22
  381. data/application/js/vendor/JS.Class-2.1.5/src/hash.js +0 -334
  382. data/application/js/vendor/JS.Class-2.1.5/src/linked_list.js +0 -114
  383. data/application/js/vendor/JS.Class-2.1.5/src/loader.js +0 -553
  384. data/application/js/vendor/JS.Class-2.1.5/src/method_chain.js +0 -172
  385. data/application/js/vendor/JS.Class-2.1.5/src/observable.js +0 -55
  386. data/application/js/vendor/JS.Class-2.1.5/src/package.js +0 -472
  387. data/application/js/vendor/JS.Class-2.1.5/src/proxy.js +0 -58
  388. data/application/js/vendor/JS.Class-2.1.5/src/ruby.js +0 -44
  389. data/application/js/vendor/JS.Class-2.1.5/src/set.js +0 -332
  390. data/application/js/vendor/JS.Class-2.1.5/src/stack_trace.js +0 -151
  391. data/application/js/vendor/JS.Class-2.1.5/src/state.js +0 -95
  392. data/application/js/vendor/JS.Class-2.1.5/src/stdlib.js +0 -2612
  393. data/application/js/vendor/jquery-1.4.2.min.js +0 -154
  394. data/application/js/vendor/jquery-1.4.3.min.js +0 -166
  395. data/application/js/vendor/jquery-1.5.1.min.js +0 -16
  396. data/application/js/vendor/jquery-1.5.1rc1.min.js +0 -24
  397. data/application/js/vendor/jquery-ui-1.8.6.custom.min.js +0 -265
  398. data/application/js/vendor/jquery-ui-1.8.custom.min.js +0 -106
  399. data/application/js/vendor/jquery.hotkeys-0.7.9.js +0 -248
  400. data/application/js/vendor/jquery.hotkeys-0.7.9.min.js +0 -19
  401. data/application/js/vendor/jsdiff.js +0 -169
  402. data/lib/cutaneous/first_pass_parser.rb +0 -23
  403. data/lib/cutaneous/parser_core.rb +0 -18
  404. data/lib/cutaneous/second_pass_parser.rb +0 -23
  405. data/lib/sequel/plugins/yajl_serialization.rb +0 -154
  406. data/lib/spontaneous/plugins.rb +0 -20
  407. data/lib/spontaneous/proxy_object.rb +0 -12
  408. data/lib/spontaneous/publishing/fire_and_forget.rb +0 -57
  409. data/lib/spontaneous/render/context.rb +0 -100
  410. data/spontaneous.gemspec.tmpl +0 -66
  411. data/test/experimental/test_plugins.rb +0 -64
  412. data/test/fixtures/templates/publishing/layouts/dynamic.html.cut +0 -1
  413. data/test/fixtures/templates/publishing/layouts/static.html.cut +0 -1
@@ -1,6 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'test_helper'
3
+ require File.expand_path('../../test_helper', __FILE__)
4
4
 
5
5
  # set :environment, :test
6
6
 
@@ -9,9 +9,6 @@ class AuthenticationTest < MiniTest::Spec
9
9
  include ::Rack::Test::Methods
10
10
 
11
11
 
12
- def self.startup
13
- end
14
-
15
12
  def create_user(name, level)
16
13
  user = Permissions::User.create({
17
14
  :name => "#{name.capitalize}",
@@ -24,9 +21,6 @@ class AuthenticationTest < MiniTest::Spec
24
21
  user
25
22
  end
26
23
 
27
- def self.shutdown
28
- end
29
-
30
24
  @@version = 0
31
25
 
32
26
  def version
@@ -65,8 +59,8 @@ class AuthenticationTest < MiniTest::Spec
65
59
  @disabled_user
66
60
  end
67
61
 
68
- def login_user(user)
69
- post "/@spontaneous/login", "user[login]" => user.login, "user[password]" => user.password
62
+ def login_user(user, params={})
63
+ post "/@spontaneous/login", {"user[login]" => user.login, "user[password]" => user.password}.merge(params)
70
64
  @user = user
71
65
  end
72
66
 
@@ -74,21 +68,30 @@ class AuthenticationTest < MiniTest::Spec
74
68
  key = @user.access_keys.first
75
69
  post(path, params.merge("__key" => key.key_id))
76
70
  end
71
+
77
72
  def auth_get(path, params={})
78
73
  key = @user.access_keys.first
79
74
  get(path, params.merge("__key" => key.key_id))
80
75
  end
81
76
 
82
77
  def setup
83
- instance = Spontaneous::Site.instantiate(Spontaneous.root, :test, :back)
84
- Site.config.publishing_delay nil
85
- Site.database = DB
86
- Site.instance.paths.add :templates, File.expand_path("../../fixtures/public/templates", __FILE__)
78
+ @site = setup_site
79
+
80
+ @site.config.publishing_delay nil
81
+ @site.config.site_domain "example.com"
82
+ @site.config.site_id "example_com"
83
+
84
+ # Site.database = DB
85
+ @site.paths.add :templates, File.expand_path("../../fixtures/public/templates", __FILE__)
87
86
  # see http://benprew.posterous.com/testing-sessions-with-sinatra
88
- app.send(:set, :sessions, false)
89
- Spontaneous.media_dir = File.expand_path('../../fixtures/permissions/media', __FILE__)
87
+ # app.send(:set, :sessions, false)
88
+ S::Rack::Back::EditingInterface.set :sessions, false
89
+ Spontaneous.stubs(:media_dir).returns(File.expand_path('../../fixtures/permissions/media', __FILE__))
90
90
  end
91
91
 
92
+ def teardown
93
+ teardown_site
94
+ end
92
95
  def assert_login_page(path = nil, method = "GET")
93
96
  assert last_response.status == 401, "#{method} #{path} should have status 401 but has #{last_response.status}"
94
97
  last_response.body.should =~ %r{<form.+action="/@spontaneous/login"}
@@ -107,7 +110,7 @@ class AuthenticationTest < MiniTest::Spec
107
110
 
108
111
  context "Authentication:" do
109
112
  setup do
110
- Spontaneous::Schema.reset!
113
+ # Spontaneous::Schema.reset!
111
114
 
112
115
  class C < Spontaneous::Piece
113
116
  field :photo, :image, :write_level => :root
@@ -180,12 +183,7 @@ class AuthenticationTest < MiniTest::Spec
180
183
  Permissions::User.delete
181
184
  Permissions::AccessKey.delete
182
185
  Spontaneous.environment = :test
183
- Permissions::UserLevel.level_file = File.expand_path('../../fixtures/permissions', __FILE__) / 'config/user_levels.yml'
184
-
185
- @saved_root = Spontaneous.root
186
- Spontaneous.root = File.expand_path('../../fixtures/example_application', __FILE__)
187
-
188
- # Spontaneous.template_root = File.expand_path("../../fixtures/public/templates", __FILE__)
186
+ Permissions::UserLevel.stubs(:level_file).returns(File.expand_path('../../fixtures/permissions', __FILE__) / 'config/user_levels.yml')
189
187
 
190
188
  @root = SitePage.create
191
189
  @root.save
@@ -207,11 +205,10 @@ class AuthenticationTest < MiniTest::Spec
207
205
  end
208
206
 
209
207
  teardown do
210
- [:C, :D, :SitePage].each { |k| AuthenticationTest.send(:remove_const, k)}
208
+ [:C, :D, :SitePage].each { |k| AuthenticationTest.send(:remove_const, k) rescue nil }
211
209
  Content.delete
212
210
  Permissions::User.delete
213
211
  Permissions::AccessKey.delete
214
- Spontaneous.root = @saved_root
215
212
  end
216
213
 
217
214
  context "Unauthorised sessions" do
@@ -289,9 +286,9 @@ class AuthenticationTest < MiniTest::Spec
289
286
 
290
287
  should "succeed and redirect to /@spontaneous for correct login & password" do
291
288
  # post "/@spontaneous/login", "user[login]" => "admin", "user[password]" => "admin_password"
292
- login_user(@admin_user)
289
+ login_user(@admin_user, "origin" => "/103/preview")
293
290
  assert last_response.status == 302, "Status was #{last_response.status} not 302"
294
- last_response.headers["Location"].should =~ %r{/@spontaneous$}
291
+ last_response.headers["Location"].should =~ %r{/@spontaneous/103/preview$}
295
292
  end
296
293
 
297
294
  should "succeed and return an api key value for correct login over XHR" do
@@ -306,9 +303,9 @@ class AuthenticationTest < MiniTest::Spec
306
303
 
307
304
  should "accept a valid API key for re-authentication" do
308
305
  key = @admin_user.logged_in!
309
- post "/@spontaneous/reauthenticate", "api_key" => key.key_id
306
+ post "/@spontaneous/reauthenticate", "api_key" => key.key_id, "origin" => "/99/edit"
310
307
  assert last_response.status == 302, "Status was #{last_response.status} not 302"
311
- last_response.headers["Location"].should =~ %r{/@spontaneous$}
308
+ last_response.headers["Location"].should =~ %r{/@spontaneous/99/edit$}
312
309
  end
313
310
 
314
311
  should "reject invalid API key" do
@@ -430,6 +427,7 @@ class AuthenticationTest < MiniTest::Spec
430
427
  # post "/@spontaneous/add/#{root.id}/admin_level/AuthenticationTest::C"
431
428
  assert last_response.ok?
432
429
  end
430
+
433
431
  should "not be able to update fields from root level box" do
434
432
  value = "Updated #{version}"
435
433
  field = root.fields[:editor_level]
@@ -1,13 +1,21 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'test_helper'
3
+ require File.expand_path('../../test_helper', __FILE__)
4
4
 
5
5
 
6
6
  class BoxesTest < MiniTest::Spec
7
7
 
8
+ def setup
9
+ @site = setup_site
10
+ end
11
+
12
+ def teardown
13
+ teardown_site
14
+ end
15
+
8
16
  context "Box definitions" do
9
17
  setup do
10
- S::Schema.reset!
18
+
11
19
  class ::Piece < Spontaneous::Piece; end
12
20
  class ::MyBoxClass < Box; end
13
21
  class ::MyContentClass < Piece; end
@@ -37,6 +45,14 @@ class BoxesTest < MiniTest::Spec
37
45
  MyContentClass.has_boxes?.should be_true
38
46
  end
39
47
 
48
+ should "have a boolean test for emptiness" do
49
+ MyContentClass.box :images0
50
+ instance = MyContentClass.new
51
+ instance.images0.empty?.should be_true
52
+ instance.images0 << MyContentClass.new
53
+ instance.images0.empty?.should be_false
54
+ end
55
+
40
56
  should "always return a symbol for the name" do
41
57
  MyContentClass.box 'images0'
42
58
  MyContentClass.boxes.first.name.should == :images0
@@ -111,6 +127,36 @@ class BoxesTest < MiniTest::Spec
111
127
  instance.boxes.length.should == 2
112
128
  end
113
129
 
130
+ should "know their ordering in the container" do
131
+ MyContentClass.box :box1
132
+ MyContentClass.box :box2
133
+ MyContentClass.box :box3
134
+ MyContentClass.box_order :box3, :box2, :box1
135
+ MyContentClass.boxes.box3.position.should == 0
136
+ MyContentClass.boxes.box2.position.should == 1
137
+ MyContentClass.boxes.box1.position.should == 2
138
+ instance = MyContentClass.new
139
+ instance.box3.position.should == 0
140
+ instance.box2.position.should == 1
141
+ instance.box1.position.should == 2
142
+ end
143
+
144
+ context "instances" do
145
+ should "have a connection to their owner" do
146
+ MyContentClass.box :box1
147
+ instance = MyContentClass.new
148
+ instance.box1.owner.should == instance
149
+ instance.box1.parent.should == instance
150
+ end
151
+
152
+ should "have a link to their container (which is their owner)" do
153
+ MyContentClass.box :box1
154
+ instance = MyContentClass.new
155
+ instance.box1.container.should == instance
156
+ instance.box1.container.should == instance
157
+ end
158
+ end
159
+
114
160
  context "ranges" do
115
161
  setup do
116
162
  MyContentClass.box :images1
@@ -187,8 +233,7 @@ class BoxesTest < MiniTest::Spec
187
233
 
188
234
  context "Box classes" do
189
235
  setup do
190
- Schema.reset!
191
- Spontaneous.template_root = File.expand_path('../../fixtures/templates/boxes', __FILE__)
236
+ @site.stubs(:template_root).returns(File.expand_path('../../fixtures/templates/boxes', __FILE__))
192
237
  class ::Piece < Spontaneous::Piece; end
193
238
  class ::MyContentClass < ::Piece; end
194
239
  class ::MyBoxClass < Box; end
@@ -237,7 +282,7 @@ class BoxesTest < MiniTest::Spec
237
282
  field :description, :string
238
283
  end
239
284
  instance = MyContentClass.new
240
- instance.partners.name.must_be_instance_of(Spontaneous::FieldTypes::StringField)
285
+ assert instance.partners.name.class < Spontaneous::FieldTypes::StringField
241
286
  instance.partners.name = "Howard"
242
287
  instance.partners.description = "Here is Howard"
243
288
  instance.save
@@ -246,75 +291,8 @@ class BoxesTest < MiniTest::Spec
246
291
  instance.partners.description.value.should == "Here is Howard"
247
292
  end
248
293
 
249
- should "default to template in root with the same name" do
250
- end
251
-
252
- # context "with styles" do
253
- # setup do
254
- # MyBoxClass.field :title, :string
255
- # MyBoxClass.style :christy
256
- # class ::InheritedStyleBox < MyBoxClass; end
257
- # class ::WithTemplateBox < Box; end
258
- # class ::WithoutTemplateBox < Box; end
259
- # class ::BlankContent < Content; end
260
- # @content = MyContentClass.new
261
- # @content.images.title = "whisty"
262
- # end
263
-
264
- # teardown do
265
- # Object.send(:remove_const, :InheritedStyleBox)
266
- # Object.send(:remove_const, :WithTemplateBox)
267
- # Object.send(:remove_const, :WithoutTemplateBox)
268
- # Object.send(:remove_const, :BlankContent)
269
- # end
270
-
271
- # should "render using explicit styles" do
272
- # @content.images.render.should == "christy: whisty\\n"
273
- # end
274
-
275
- # should_eventually "allow defining style in definition" do
276
- # BlankContent.box :images do
277
- # style :inline_style
278
- # end
279
- # instance = BlankContent.new
280
- # instance.images.style.filename.should == "inline_style.html.cut"
281
- # end
282
-
283
- # should "render using default template style" do
284
- # BlankContent.box :images, :class => :WithTemplateBox
285
- # instance = BlankContent.new
286
- # instance.images.render.should == "with_template_box.html.cut\\n"
287
- # end
288
-
289
- # should "render using global default box styles" do
290
- # entry = Object.new
291
- # entry.stubs(:render).returns("<entry>")
292
- # BlankContent.box :images, :class => :WithoutTemplateBox
293
- # instance = BlankContent.new
294
- # instance.images.stubs(:pieces).returns([entry])
295
- # instance.images.render.should == "<entry>"
296
- # end
297
-
298
- # should "find templates named after box in owning classes template dir" do
299
- # BlankContent.box :things
300
- # instance = BlankContent.new
301
- # instance.things.render.should == "blank_content/things.html.cut\\n"
302
- # end
303
-
304
- # should "not use templates with box name found in root template dir" do
305
- # BlankContent.box :thangs
306
- # instance = BlankContent.new
307
- # instance.thangs.render.should == ""
308
- # end
309
-
310
- # should "inherit styles from their superclass" do
311
- # BlankContent.box :images, :class => :InheritedStyleBox
312
- # instance = BlankContent.new
313
- # instance.images.title = "ytsirhc"
314
- # instance.images.render.should == "christy: ytsirhc\\n"
315
- # end
316
- # end
317
-
294
+ # true?
295
+ should "default to template in root with the same name"
318
296
  end
319
297
 
320
298
  context "Box content" do
@@ -359,7 +337,9 @@ class BoxesTest < MiniTest::Spec
359
337
  child1.save
360
338
  @parent = Content[@parent.id]
361
339
  child1.reload; child2.reload; child3.reload
340
+ @parent.images.contents.should == [child1]
362
341
  @parent.images.pieces.should == [child1]
342
+ @parent.words.contents.should == [child2]
363
343
  @parent.words.pieces.should == [child2]
364
344
  @parent.pieces.should == [child1, child2]
365
345
  child1.images.pieces.should == [child3]
@@ -383,9 +363,25 @@ class BoxesTest < MiniTest::Spec
383
363
  styled.two.pieces.first.style.name.should == :blank3
384
364
  end
385
365
 
386
- should "allow selection of subclasses" do
366
+ should "be insertable at any position" do
367
+ BlankContent.box :box3
368
+ BlankContent.box :box4
369
+ instance = BlankContent.new
370
+ count = 4
371
+ [:images, :words, :box3, :box4].map { |name| instance.boxes[name] }.each do |box|
372
+ count.times { |n| box << StyledContent.new(:label => n)}
373
+ end
374
+ instance.box4.insert(1, StyledContent.new(:label => "a"))
375
+ instance.box4.contents.map { |e| e.label }.should == ["0", "a", "1", "2", "3"]
376
+ instance.box4.insert(5, StyledContent.new(:label => "b"))
377
+ instance.box4.contents.map { |e| e.label }.should == ["0", "a", "1", "2", "3", "b"]
378
+ instance.box3.insert(2, StyledContent.new(:label => "c"))
379
+ instance.box3.contents.map { |e| e.label }.should == ["0", "1", "c", "2", "3"]
387
380
  end
381
+
382
+ should "allow selection of subclasses"
388
383
  end
384
+
389
385
  context "Allowed types" do
390
386
  setup do
391
387
  class ::Allowed1 < Content
@@ -423,6 +419,8 @@ class BoxesTest < MiniTest::Spec
423
419
  class ::Mixed < Box
424
420
  allow_subclasses :Allowed1
425
421
  end
422
+
423
+
426
424
  end
427
425
 
428
426
  teardown do
@@ -477,6 +475,24 @@ class BoxesTest < MiniTest::Spec
477
475
 
478
476
  should "inherit allowed types from superclass" do
479
477
  ChildClass.allowed.should == Parent.allowed
478
+ Allowable.boxes.parents.allowed_types(nil).should == [Allowed1, Allowed2, Allowed3]
479
+ class ::AChild < Allowable
480
+ box :parents do
481
+ allow :Allowed11
482
+ end
483
+ end
484
+ class ::AChild2 < AChild
485
+ box :parents, :title => "Things" do
486
+ allow :Allowed111
487
+ end
488
+ end
489
+ box = AChild.boxes.parents
490
+ box.allowed_types(nil).should == [Allowed1, Allowed2, Allowed3, Allowed11]
491
+ box = AChild2.boxes.parents
492
+ box.title.should == "Things"
493
+ box.allowed_types(nil).should == [Allowed1, Allowed2, Allowed3, Allowed11, Allowed111]
494
+ Object.send(:remove_const, :AChild)
495
+ Object.send(:remove_const, :AChild2)
480
496
  end
481
497
 
482
498
  should "include a subtype's allowed list as well as the supertype's" do
@@ -493,5 +509,60 @@ class BoxesTest < MiniTest::Spec
493
509
  Mixed.allowed_types.should == [Allowed11, Allowed111]
494
510
  end
495
511
  end
512
+
513
+ context "Box groups" do
514
+ setup do
515
+ class ::A < S::Piece
516
+ box_group :inner do
517
+ box :a
518
+ box :b
519
+ end
520
+ box_group :outer do
521
+ box :c
522
+ box :d
523
+ end
524
+ end
525
+
526
+ class ::B < ::A
527
+ box_group :outer do
528
+ box :e
529
+ end
530
+ end
531
+
532
+ class ::C < ::B
533
+ box :f, :group => :inner
534
+ end
535
+
536
+ @a = ::A.new
537
+ @b = ::B.new
538
+ @c = ::C.new
539
+ [@a, @b, @c].each do |instance|
540
+ instance.boxes[:a].stubs(:render).with(anything).returns("[a]")
541
+ instance.boxes[:b].stubs(:render).with(anything).returns("[b]")
542
+ instance.boxes[:c].stubs(:render).with(anything).returns("[c]")
543
+ instance.boxes[:d].stubs(:render).with(anything).returns("[d]")
544
+ end
545
+ @b.boxes[:e].stubs(:render).with(anything).returns("[e]")
546
+ @c.boxes[:e].stubs(:render).with(anything).returns("[e]")
547
+ @c.boxes[:f].stubs(:render).with(anything).returns("[f]")
548
+ end
549
+
550
+ teardown do
551
+ Object.send(:remove_const, :A)
552
+ Object.send(:remove_const, :B)
553
+ Object.send(:remove_const, :C)
554
+ end
555
+
556
+ should "successfully allocate boxes" do
557
+ @a.boxes.inner.render.should == "[a][b]"
558
+ @a.boxes.outer.render.should == "[c][d]"
559
+
560
+ @b.boxes.inner.render.should == "[a][b]"
561
+ @b.boxes.outer.render.should == "[c][d][e]"
562
+
563
+ @c.boxes.inner.render.should == "[a][b][f]"
564
+ @c.boxes.outer.render.should == "[c][d][e]"
565
+ end
566
+ end
496
567
  end
497
568
 
@@ -1,21 +1,21 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'test_helper'
3
+ require File.expand_path('../../test_helper', __FILE__)
4
4
 
5
5
  class ConfigTest < MiniTest::Spec
6
6
  include CustomMatchers
7
7
  def setup
8
+ @site = setup_site
9
+ end
10
+
11
+ def teardown
12
+ teardown_site
8
13
  end
9
14
 
10
15
  context "Config" do
11
16
  setup do
12
- # Spontaneous.send(:remove_const, :Config) rescue nil
13
- # @lib_dir = File.expand_path(File.join(File.dirname(__FILE__), '../../lib'))
14
- # load @lib_dir + '/spontaneous/config.rb'
15
- Config ||= ::Spontaneous::Config
16
- @pwd = Dir.pwd
17
- Dir.chdir(File.expand_path("../../fixtures/config", __FILE__))
18
- Spontaneous.root = Dir.pwd
17
+ @config_dir = File.expand_path("../../fixtures/config/config", __FILE__)
18
+
19
19
  class ::TopLevel
20
20
  def self.parameter=(something)
21
21
  @parameter = something
@@ -26,22 +26,44 @@ class ConfigTest < MiniTest::Spec
26
26
  end
27
27
  end
28
28
  end
29
+
29
30
  teardown do
30
- Object.send(:remove_const, :TopLevel)
31
- Dir.chdir(@pwd)
32
- # self.class.send(:remove_const, :Config) rescue nil
31
+ Object.send(:remove_const, :TopLevel) rescue nil
33
32
  end
34
33
 
35
34
  context "Config" do
36
35
  setup do
37
36
  @config = Config.new(:development)
38
- @config.load(Spontaneous.root / 'config')
37
+ @config.load(@config_dir)
39
38
  end
40
39
  should "load the first time its accessed" do
41
40
  @config.over_ridden.should == :development_value
42
41
  end
43
42
  end
44
43
 
44
+ context "containing blocks" do
45
+ setup do
46
+ @settings = {}
47
+ @config = Config::Loader.new(@settings)
48
+ end
49
+ should "add a hash to the settings under the defined key" do
50
+ @config.storage :key1 do |config|
51
+ config[:a] = "a"
52
+ config[:b] = "b"
53
+ end
54
+ @config.storage :key2 do |config|
55
+ config[:c] = "c"
56
+ config[:d] = "d"
57
+ end
58
+ @config.storage :key1 do |config|
59
+ config[:e] = "e"
60
+ end
61
+ @config.settings[:storage].should == {
62
+ :key1 => { :a => "a", :b => "b", :e => "e" },
63
+ :key2 => { :c => "c", :d => "d" }
64
+ }
65
+ end
66
+ end
45
67
  context "Independent configuration loading" do
46
68
  setup do
47
69
  # defined?(Spontaneous).should be_nil
@@ -50,7 +72,7 @@ class ConfigTest < MiniTest::Spec
50
72
  # require @lib_dir + '/spontaneous/config.rb'
51
73
  # Config.environment = :development
52
74
  @config = Config.new(:development)
53
- @config.load(Spontaneous.root / 'config')
75
+ @config.load(@config_dir)
54
76
  end
55
77
 
56
78
  teardown do
@@ -77,10 +99,10 @@ class ConfigTest < MiniTest::Spec
77
99
  should "overwrite values depending on environment" do
78
100
  @config.over_ridden.should == :development_value
79
101
  config = Config.new(:production)
80
- config.load(Spontaneous.root / 'config')
102
+ config.load(@config_dir)
81
103
  config.over_ridden.should == :production_value
82
104
  config = Config.new(:staging)
83
- config.load(Spontaneous.root / 'config')
105
+ config.load(@config_dir)
84
106
  config.over_ridden.should == :environment_value
85
107
  end
86
108
 
@@ -99,10 +121,10 @@ class ConfigTest < MiniTest::Spec
99
121
  should "dynamically switch values according to the configured env" do
100
122
  @config.over_ridden.should == :development_value
101
123
  config = Config.new(:production)
102
- config.load(Spontaneous.root / 'config')
124
+ config.load(@config_dir)
103
125
  config.over_ridden.should == :production_value
104
126
  config = Config.new(:staging)
105
- config.load(Spontaneous.root / 'config')
127
+ config.load(@config_dir)
106
128
  config.over_ridden.should == :environment_value
107
129
  end
108
130
 
@@ -131,12 +153,12 @@ class ConfigTest < MiniTest::Spec
131
153
  end
132
154
 
133
155
  teardown do
134
- Dir.chdir(@pwd)
135
156
  end
157
+
136
158
  context "Spontaneous :back" do
137
159
  setup do
138
160
  @config = Config.new(:development, :back)
139
- @config.load(Spontaneous.root / 'config')
161
+ @config.load(@config_dir)
140
162
  end
141
163
  should "read the correct configuration values" do
142
164
  @config.port.should == 9001
@@ -145,7 +167,7 @@ class ConfigTest < MiniTest::Spec
145
167
  context "Spontaneous :front" do
146
168
  setup do
147
169
  @config = Config.new(:development, :front)
148
- @config.load(Spontaneous.root / 'config')
170
+ @config.load(@config_dir)
149
171
  end
150
172
  should "read the correct configuration values" do
151
173
  @config.port.should == 9002