spontaneous 0.1.0.alpha1 → 0.2.0.alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (413) hide show
  1. data/Gemfile +40 -35
  2. data/LICENSE +20 -0
  3. data/Rakefile +39 -42
  4. data/Readme.markdown +155 -0
  5. data/application/css/definitions.scss +3 -0
  6. data/application/css/editing.scss +9 -4
  7. data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +1 -0
  8. data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +1 -0
  9. data/application/css/min/d1b54ff4847c613618267ca1c15658e2aee0a4e5.css +1 -0
  10. data/application/css/v2.scss +144 -50
  11. data/application/js/add_alias_dialogue.js +18 -8
  12. data/application/js/ajax.js +1 -1
  13. data/application/js/authentication.js +8 -1
  14. data/application/js/box.js +37 -7
  15. data/application/js/box_container.js +1 -1
  16. data/application/js/compatibility.js +7 -0
  17. data/application/js/content.js +7 -0
  18. data/application/js/content_area.js +4 -0
  19. data/application/js/edit_panel.js +44 -18
  20. data/application/js/editing.js +12 -0
  21. data/application/js/event_source.js +17 -0
  22. data/application/js/extensions.js +2 -0
  23. data/application/js/field_types/file_field.js +2 -1
  24. data/application/js/field_types/image_field.js +35 -48
  25. data/application/js/field_types/long_string_field.js +12 -0
  26. data/application/js/field_types/markdown_field.js +2 -5
  27. data/application/js/field_types/string_field.js +5 -1
  28. data/application/js/field_types/webvideo_field.js +15 -0
  29. data/application/js/init.js +1 -0
  30. data/application/js/location.js +30 -19
  31. data/application/js/login.js +1 -2
  32. data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +3 -0
  33. data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +2 -0
  34. data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +3 -0
  35. data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +90 -0
  36. data/application/js/page.js +1 -0
  37. data/application/js/page_entry.js +6 -40
  38. data/application/js/preview.js +2 -3
  39. data/application/js/top_bar.js +76 -31
  40. data/application/js/upload.js +5 -2
  41. data/application/js/upload_manager.js +2 -81
  42. data/application/js/vendor/jquery-1.7.1.min.js +4 -0
  43. data/application/js/vendor/jquery-ui-1.8.16.custom.min.js +791 -0
  44. data/application/js/views.js +3 -3
  45. data/application/js/views/box_view.js +164 -83
  46. data/application/js/views/page_piece_view.js +2 -2
  47. data/application/js/views/page_view.js +46 -15
  48. data/application/js/views/piece_view.js +29 -8
  49. data/application/static/diagonal-texture.png +0 -0
  50. data/application/static/item-buttons-highlight.png +0 -0
  51. data/application/static/plus-box.png +0 -0
  52. data/application/static/plus_alt.svg +8 -0
  53. data/application/static/slot-up-arrow.png +0 -0
  54. data/application/views/{index.erubis → index.erb} +9 -5
  55. data/application/views/{login.erubis → login.erb} +14 -10
  56. data/application/views/schema_modification_error.html.erb +18 -6
  57. data/application/views/{unsupported.erubis → unsupported.erb} +0 -0
  58. data/bin/spot +15 -2
  59. data/db/migrations/20100610142136_init.rb +2 -2
  60. data/db/migrations/20101130104334_timestamps.rb +2 -2
  61. data/db/migrations/20110209152710_users_and_groups.rb +11 -11
  62. data/db/migrations/20120106171423_visibility_path.rb +19 -0
  63. data/db/migrations/20120107124541_owner_id.rb +19 -0
  64. data/docs/recipe-interface-screenshot.png +0 -0
  65. data/lib/cutaneous.rb +11 -10
  66. data/lib/cutaneous/context_helper.rb +119 -14
  67. data/lib/cutaneous/preview_context.rb +4 -3
  68. data/lib/cutaneous/preview_renderer.rb +1 -6
  69. data/lib/cutaneous/publish_context.rb +1 -0
  70. data/lib/cutaneous/{first_pass_renderer.rb → publish_renderer.rb} +2 -6
  71. data/lib/cutaneous/publish_template.rb +62 -0
  72. data/lib/cutaneous/publish_token_parser.rb +8 -0
  73. data/lib/cutaneous/renderer.rb +4 -2
  74. data/lib/cutaneous/request_context.rb +1 -0
  75. data/lib/cutaneous/{second_pass_renderer.rb → request_renderer.rb} +2 -5
  76. data/lib/cutaneous/request_template.rb +11 -0
  77. data/lib/cutaneous/request_token_parser.rb +9 -0
  78. data/lib/cutaneous/token_parser.rb +125 -0
  79. data/lib/sequel/plugins/content_table_inheritance.rb +19 -12
  80. data/lib/sequel/plugins/scoped_table_name.rb +45 -0
  81. data/lib/spontaneous.rb +123 -126
  82. data/lib/spontaneous/box.rb +127 -47
  83. data/lib/spontaneous/box_style.rb +39 -22
  84. data/lib/spontaneous/change.rb +2 -2
  85. data/lib/spontaneous/cli.rb +1 -0
  86. data/lib/spontaneous/cli/base.rb +12 -4
  87. data/lib/spontaneous/cli/console.rb +72 -0
  88. data/lib/spontaneous/cli/server.rb +36 -12
  89. data/lib/spontaneous/cli/site.rb +175 -1
  90. data/lib/spontaneous/collections/box_set.rb +19 -1
  91. data/lib/spontaneous/collections/entry_set.rb +70 -22
  92. data/lib/spontaneous/collections/field_set.rb +3 -3
  93. data/lib/spontaneous/collections/prototype_set.rb +28 -0
  94. data/lib/spontaneous/config.rb +14 -5
  95. data/lib/spontaneous/content.rb +23 -24
  96. data/lib/spontaneous/errors.rb +20 -4
  97. data/lib/spontaneous/extensions/array.rb +2 -2
  98. data/lib/spontaneous/extensions/json.rb +1 -1
  99. data/lib/spontaneous/extensions/nil.rb +13 -0
  100. data/lib/spontaneous/facet.rb +61 -7
  101. data/lib/spontaneous/field_types.rb +1 -3
  102. data/lib/spontaneous/field_types/date_field.rb +1 -0
  103. data/lib/spontaneous/field_types/field.rb +32 -15
  104. data/lib/spontaneous/field_types/image_field.rb +138 -69
  105. data/lib/spontaneous/field_types/location_field.rb +59 -0
  106. data/lib/spontaneous/field_types/long_string_field.rb +13 -0
  107. data/lib/spontaneous/field_types/markdown_field.rb +2 -1
  108. data/lib/spontaneous/field_types/string_field.rb +2 -2
  109. data/lib/spontaneous/field_types/webvideo_field.rb +255 -0
  110. data/lib/spontaneous/generators/page/inline.html.cut +1 -1
  111. data/lib/spontaneous/generators/page/page.html.cut.tt +5 -4
  112. data/lib/spontaneous/generators/page/page.rb.tt +1 -5
  113. data/lib/spontaneous/generators/site.rb +1 -0
  114. data/lib/spontaneous/generators/site/.gitignore +2 -0
  115. data/lib/spontaneous/generators/site/Gemfile.tt +3 -5
  116. data/lib/spontaneous/generators/site/config/environment.rb.tt +1 -0
  117. data/lib/spontaneous/generators/site/config/environments/development.rb.tt +3 -1
  118. data/lib/spontaneous/generators/site/config/environments/production.rb.tt +3 -1
  119. data/lib/spontaneous/generators/site/config/indexes.rb.tt +23 -0
  120. data/lib/spontaneous/generators/site/public/css/{site.css → site.scss} +0 -0
  121. data/lib/spontaneous/generators/site/schema/box.rb.tt +5 -0
  122. data/lib/spontaneous/generators/site/templates/layouts/standard.html.cut.tt +11 -5
  123. data/lib/spontaneous/image_size.rb +0 -1
  124. data/lib/spontaneous/loader.rb +335 -218
  125. data/lib/spontaneous/logger.rb +7 -2
  126. data/lib/spontaneous/media.rb +64 -59
  127. data/lib/spontaneous/media/file.rb +74 -0
  128. data/lib/spontaneous/page.rb +47 -18
  129. data/lib/spontaneous/page_piece.rb +29 -27
  130. data/lib/spontaneous/paths.rb +0 -1
  131. data/lib/spontaneous/permissions.rb +3 -21
  132. data/lib/spontaneous/permissions/user.rb +5 -1
  133. data/lib/spontaneous/permissions/user_level.rb +6 -7
  134. data/lib/spontaneous/piece.rb +12 -7
  135. data/lib/spontaneous/plugins/aliases.rb +76 -31
  136. data/lib/spontaneous/plugins/allowed_types.rb +36 -37
  137. data/lib/spontaneous/plugins/application/facets.rb +7 -10
  138. data/lib/spontaneous/plugins/application/features.rb +17 -0
  139. data/lib/spontaneous/plugins/application/paths.rb +25 -31
  140. data/lib/spontaneous/plugins/application/render.rb +1 -5
  141. data/lib/spontaneous/plugins/application/serialisation.rb +2 -0
  142. data/lib/spontaneous/plugins/application/state.rb +6 -9
  143. data/lib/spontaneous/plugins/boxes.rb +65 -40
  144. data/lib/spontaneous/plugins/controllers.rb +22 -22
  145. data/lib/spontaneous/plugins/entries.rb +149 -150
  146. data/lib/spontaneous/plugins/entry.rb +50 -35
  147. data/lib/spontaneous/plugins/field/editor_class.rb +13 -0
  148. data/lib/spontaneous/plugins/fields.rb +41 -33
  149. data/lib/spontaneous/plugins/instance_code.rb +9 -9
  150. data/lib/spontaneous/plugins/layouts.rb +31 -35
  151. data/lib/spontaneous/plugins/media.rb +31 -32
  152. data/lib/spontaneous/plugins/page/formats.rb +56 -31
  153. data/lib/spontaneous/plugins/page/request.rb +15 -9
  154. data/lib/spontaneous/plugins/page_search.rb +30 -31
  155. data/lib/spontaneous/plugins/page_tree.rb +59 -12
  156. data/lib/spontaneous/plugins/paths.rb +84 -79
  157. data/lib/spontaneous/plugins/permissions.rb +26 -28
  158. data/lib/spontaneous/plugins/prototypes.rb +42 -37
  159. data/lib/spontaneous/plugins/publishing.rb +50 -94
  160. data/lib/spontaneous/plugins/render.rb +8 -16
  161. data/lib/spontaneous/plugins/schema_hierarchy.rb +20 -21
  162. data/lib/spontaneous/plugins/schema_id.rb +33 -25
  163. data/lib/spontaneous/plugins/schema_title.rb +3 -4
  164. data/lib/spontaneous/plugins/serialisation.rb +32 -35
  165. data/lib/spontaneous/plugins/site/features.rb +32 -0
  166. data/lib/spontaneous/plugins/site/instance.rb +3 -2
  167. data/lib/spontaneous/plugins/site/level.rb +18 -0
  168. data/lib/spontaneous/plugins/site/map.rb +2 -1
  169. data/lib/spontaneous/plugins/site/publishing.rb +56 -59
  170. data/lib/spontaneous/plugins/site/revisions.rb +24 -19
  171. data/lib/spontaneous/plugins/site/schema.rb +33 -0
  172. data/lib/spontaneous/plugins/site/search.rb +43 -0
  173. data/lib/spontaneous/plugins/site/selectors.rb +35 -30
  174. data/lib/spontaneous/plugins/site/storage.rb +63 -0
  175. data/lib/spontaneous/plugins/site_map.rb +23 -25
  176. data/lib/spontaneous/plugins/styles.rb +35 -43
  177. data/lib/spontaneous/plugins/supertype.rb +3 -1
  178. data/lib/spontaneous/plugins/visibility.rb +90 -83
  179. data/lib/spontaneous/prototypes/box_prototype.rb +55 -25
  180. data/lib/spontaneous/prototypes/field_prototype.rb +66 -19
  181. data/lib/spontaneous/prototypes/style_prototype.rb +2 -2
  182. data/lib/spontaneous/publishing.rb +1 -1
  183. data/lib/spontaneous/publishing/immediate.rb +128 -49
  184. data/lib/spontaneous/publishing/simultaneous.rb +70 -0
  185. data/lib/spontaneous/rack.rb +38 -26
  186. data/lib/spontaneous/rack/around_back.rb +3 -23
  187. data/lib/spontaneous/rack/around_preview.rb +3 -8
  188. data/lib/spontaneous/rack/assets.rb +7 -6
  189. data/lib/spontaneous/rack/authentication.rb +21 -0
  190. data/lib/spontaneous/rack/back.rb +310 -331
  191. data/lib/spontaneous/rack/cacheable_file.rb +27 -0
  192. data/lib/spontaneous/rack/cookie_authentication.rb +38 -0
  193. data/lib/spontaneous/rack/css.rb +43 -0
  194. data/lib/spontaneous/rack/event_source.rb +31 -0
  195. data/lib/spontaneous/rack/front.rb +30 -8
  196. data/lib/spontaneous/rack/helpers.rb +31 -0
  197. data/lib/spontaneous/rack/media.rb +22 -21
  198. data/lib/spontaneous/rack/public.rb +2 -1
  199. data/lib/spontaneous/rack/query_authentication.rb +35 -0
  200. data/lib/spontaneous/rack/reloader.rb +6 -3
  201. data/lib/spontaneous/rack/user_helpers.rb +28 -0
  202. data/lib/spontaneous/render.rb +64 -23
  203. data/lib/spontaneous/render/context_base.rb +143 -0
  204. data/lib/spontaneous/render/format.rb +24 -19
  205. data/lib/spontaneous/render/helpers.rb +14 -0
  206. data/lib/spontaneous/render/helpers/html_helper.rb +69 -0
  207. data/lib/spontaneous/render/helpers/script_helper.rb +17 -0
  208. data/lib/spontaneous/render/helpers/stylesheet_helper.rb +16 -0
  209. data/lib/spontaneous/render/preview_context.rb +8 -0
  210. data/lib/spontaneous/render/preview_renderer.rb +6 -0
  211. data/lib/spontaneous/render/publish_context.rb +22 -0
  212. data/lib/spontaneous/render/published_renderer.rb +12 -13
  213. data/lib/spontaneous/render/publishing_renderer.rb +3 -0
  214. data/lib/spontaneous/render/render_cache.rb +26 -0
  215. data/lib/spontaneous/render/renderer.rb +5 -1
  216. data/lib/spontaneous/render/request_context.rb +8 -0
  217. data/lib/spontaneous/schema.rb +56 -24
  218. data/lib/spontaneous/schema/schema_modification.rb +2 -2
  219. data/lib/spontaneous/schema/uid.rb +22 -106
  220. data/lib/spontaneous/schema/uid_map.rb +120 -0
  221. data/lib/spontaneous/search.rb +11 -0
  222. data/lib/spontaneous/search/compound_indexer.rb +26 -0
  223. data/lib/spontaneous/search/database.rb +72 -0
  224. data/lib/spontaneous/search/field.rb +95 -0
  225. data/lib/spontaneous/search/index.rb +184 -0
  226. data/lib/spontaneous/search/results.rb +34 -0
  227. data/lib/spontaneous/server.rb +5 -1
  228. data/lib/spontaneous/site.rb +56 -16
  229. data/lib/spontaneous/storage.rb +22 -0
  230. data/lib/spontaneous/storage/backend.rb +10 -0
  231. data/lib/spontaneous/storage/cloud.rb +104 -0
  232. data/lib/spontaneous/storage/local.rb +52 -0
  233. data/lib/spontaneous/style.rb +27 -9
  234. data/lib/spontaneous/version.rb +1 -1
  235. data/spontaneous.gemspec +719 -0
  236. data/test/disabled/test_slots.rb +1 -1
  237. data/test/experimental/test_cutaneous.rb +309 -0
  238. data/test/experimental/test_features.rb +129 -0
  239. data/test/fixtures/application/views/{index.erubis → index.erb} +0 -0
  240. data/test/fixtures/back/public/css/sass_include.scss +5 -0
  241. data/test/fixtures/back/public/css/sass_template.scss +4 -0
  242. data/test/fixtures/example_application/templates/client_project.html.cut +4 -4
  243. data/test/fixtures/example_application/templates/client_project/images.html.cut +1 -1
  244. data/test/fixtures/example_application/templates/client_projects.html.cut +2 -2
  245. data/test/fixtures/example_application/templates/inline_image.html.cut +1 -1
  246. data/test/fixtures/example_application/templates/layouts/home.html.cut +7 -7
  247. data/test/fixtures/example_application/templates/layouts/info.html.cut +1 -1
  248. data/test/fixtures/example_application/templates/layouts/project.html.cut +4 -4
  249. data/test/fixtures/example_application/templates/layouts/projects.html.cut +2 -2
  250. data/test/fixtures/example_application/templates/project.html.cut +2 -2
  251. data/test/fixtures/example_application/templates/project/inline.html.cut +3 -3
  252. data/test/fixtures/example_application/templates/project_image.html.cut +1 -1
  253. data/test/fixtures/example_application/templates/text.html.cut +1 -1
  254. data/test/fixtures/fields/youtube_api_response.xml +102 -0
  255. data/test/fixtures/layouts/layouts/custom4.html.cut +0 -0
  256. data/test/fixtures/plugins/schema_plugin/public/css/plugin.css +1 -0
  257. data/test/fixtures/plugins/schema_plugin/public/js/plugin.js +1 -0
  258. data/test/fixtures/plugins/schema_plugin/public/static.html +1 -0
  259. data/test/fixtures/plugins/schema_plugin/public/subdir/image.gif +1 -0
  260. data/test/fixtures/plugins/schema_plugin/public/subdir/include1.scss +3 -0
  261. data/test/fixtures/plugins/schema_plugin/public/subdir/sass.scss +4 -0
  262. data/test/fixtures/plugins/schema_plugin/public/subdir/sass/include2.scss +4 -0
  263. data/test/fixtures/public/templates/layouts/default.html.cut +1 -1
  264. data/test/fixtures/public/templates/layouts/default.pdf.cut +1 -1
  265. data/test/fixtures/public/templates/layouts/default.rss.cut +1 -1
  266. data/test/fixtures/public/templates/layouts/dynamic.html.cut +1 -1
  267. data/test/fixtures/schema_modification/config/database.yml +0 -0
  268. data/test/fixtures/schema_modification/config/environment.rb +2 -0
  269. data/test/fixtures/schema_modification/schema/box.rb +1 -0
  270. data/test/fixtures/schema_modification/schema/custom_box.rb +1 -0
  271. data/test/fixtures/schema_modification/schema/page.rb +6 -0
  272. data/test/fixtures/schema_modification/schema/piece.rb +1 -0
  273. data/test/fixtures/search/config/database.yml +1 -0
  274. data/test/fixtures/search/config/indexes.rb +4 -0
  275. data/test/fixtures/serialisation/root_hash.yaml.erb +16 -20
  276. data/test/fixtures/storage/cloud/environment.rb +12 -0
  277. data/test/fixtures/storage/default/environment.rb +1 -0
  278. data/test/fixtures/templates/aliases/layouts/c_alias.html.cut +1 -1
  279. data/test/fixtures/templates/content/include.html.cut +1 -1
  280. data/test/fixtures/templates/content/include_dir.html.cut +1 -1
  281. data/test/fixtures/templates/content/included.epub.cut +1 -1
  282. data/test/fixtures/templates/content/included.html.cut +1 -1
  283. data/test/fixtures/templates/content/partial/included.html.cut +1 -1
  284. data/test/fixtures/templates/content/preprocess.html.cut +1 -1
  285. data/test/fixtures/templates/content/second.html.cut +1 -1
  286. data/test/fixtures/templates/content/template.epub.cut +1 -1
  287. data/test/fixtures/templates/content/template.html.cut +1 -1
  288. data/test/fixtures/templates/default_style_class.html.cut +1 -1
  289. data/test/fixtures/templates/engine/braces.html.cut +6 -0
  290. data/test/fixtures/templates/engine/multiline.html.cut +5 -0
  291. data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
  292. data/test/fixtures/templates/extended/main.html.cut +5 -5
  293. data/test/fixtures/templates/extended/parent.html.cut +10 -8
  294. data/test/fixtures/templates/extended/partial.html.cut +1 -0
  295. data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -0
  296. data/test/fixtures/templates/extended/with_includes.html.cut +9 -0
  297. data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +9 -0
  298. data/test/fixtures/templates/layouts/entries.html.cut +7 -7
  299. data/test/fixtures/templates/layouts/page_style.html.cut +1 -1
  300. data/test/fixtures/templates/layouts/params.html.cut +1 -1
  301. data/test/fixtures/templates/layouts/preview_render.html.cut +2 -2
  302. data/test/fixtures/templates/layouts/standard_page.html.cut +1 -1
  303. data/test/fixtures/templates/layouts/subdir_style.html.cut +1 -1
  304. data/test/fixtures/templates/layouts/template_params.html.cut +1 -1
  305. data/test/fixtures/templates/layouts/variables.html.cut +7 -0
  306. data/test/fixtures/templates/page_class/inline_style.html.cut +1 -1
  307. data/test/fixtures/templates/preview_render/variables.html.cut +1 -0
  308. data/test/fixtures/templates/publishing/templates/layouts/dynamic.html.cut +1 -0
  309. data/test/fixtures/templates/publishing/templates/layouts/dynamic.rtf.cut +1 -0
  310. data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -0
  311. data/test/fixtures/templates/template_class/anonymous_style.html.cut +2 -2
  312. data/test/fixtures/templates/template_class/complex_template.html.cut +4 -4
  313. data/test/fixtures/templates/template_class/complex_template.pdf.cut +4 -4
  314. data/test/fixtures/templates/template_class/default_template_style.html.cut +2 -2
  315. data/test/fixtures/templates/template_class/images_with_template.html.cut +3 -3
  316. data/test/fixtures/templates/template_class/slots_template.html.cut +3 -3
  317. data/test/fixtures/templates/template_class/slots_template.pdf.cut +3 -3
  318. data/test/fixtures/templates/template_class/this_template.epub.cut +1 -1
  319. data/test/fixtures/templates/template_class/this_template.html.cut +1 -1
  320. data/test/fixtures/templates/template_class/this_template.pdf.cut +1 -1
  321. data/test/fixtures/templates/with_default_style_class.html.cut +1 -1
  322. data/test/functional/test_application.rb +19 -15
  323. data/test/functional/test_back.rb +130 -98
  324. data/test/functional/test_front.rb +72 -28
  325. data/test/javascript/test_dom.rb +1 -1
  326. data/test/javascript/test_markdown.rb +1 -1
  327. data/test/slow/test_publishing.rb +94 -75
  328. data/test/slow/test_visibility.rb +47 -14
  329. data/test/test_helper.rb +30 -3
  330. data/test/ui/test_page_editing.rb +1 -1
  331. data/test/unit/test_alias.rb +200 -16
  332. data/test/unit/test_authentication.rb +26 -28
  333. data/test/unit/test_boxes.rb +146 -75
  334. data/test/unit/test_config.rb +42 -20
  335. data/test/unit/test_content.rb +156 -37
  336. data/test/unit/test_content_inheritance.rb +4 -2
  337. data/test/unit/test_extensions.rb +7 -1
  338. data/test/unit/test_fields.rb +558 -290
  339. data/test/{experimental → unit}/test_formats.rb +42 -3
  340. data/test/unit/test_generators.rb +3 -2
  341. data/test/unit/test_helpers.rb +54 -0
  342. data/test/unit/test_image_size.rb +1 -1
  343. data/test/unit/test_images.rb +51 -40
  344. data/test/unit/test_layouts.rb +21 -4
  345. data/test/unit/test_logger.rb +1 -1
  346. data/test/unit/test_media.rb +165 -7
  347. data/test/unit/test_page.rb +158 -27
  348. data/test/unit/test_permissions.rb +170 -187
  349. data/test/unit/test_piece.rb +27 -9
  350. data/test/unit/test_plugins.rb +153 -0
  351. data/test/unit/test_prototype_set.rb +60 -2
  352. data/test/unit/test_prototypes.rb +81 -20
  353. data/test/unit/test_render.rb +97 -9
  354. data/test/unit/test_schema.rb +167 -120
  355. data/test/unit/test_search.rb +588 -0
  356. data/test/unit/test_serialisation.rb +26 -10
  357. data/test/unit/test_site.rb +42 -25
  358. data/test/unit/test_storage.rb +88 -0
  359. data/test/unit/test_structure.rb +11 -5
  360. data/test/unit/test_styles.rb +64 -3
  361. data/test/unit/test_table_scoping.rb +76 -0
  362. data/test/unit/test_templates.rb +69 -31
  363. data/test/unit/test_type_hierarchy.rb +9 -1
  364. metadata +274 -208
  365. data/Gemfile.lock +0 -146
  366. data/application/css/min/54ee0ed3c7fac7632bd5c020d69e9a2503e0c88c.css +0 -1
  367. data/application/css/min/c256adc144e2bdd0b0539356b04eb62db01e1dc3.css +0 -1
  368. data/application/js/edit_dialogue.js +0 -137
  369. data/application/js/min/492a209de8ee955fa9c729a765377495001e11b1.js +0 -17
  370. data/application/js/min/80f684d77c940887a1d4a63e3a96102e993baa98.js +0 -88
  371. data/application/js/min/c7140ec9475e5bf868b901e0621338d7d162358b.js +0 -3
  372. data/application/js/min/f07f2bd6630ee31e1c2288ec223383d8f0658ba6.js +0 -2
  373. data/application/js/vendor/.DS_Store +0 -0
  374. data/application/js/vendor/JS.Class-2.1.5/src/command.js +0 -93
  375. data/application/js/vendor/JS.Class-2.1.5/src/comparable.js +0 -37
  376. data/application/js/vendor/JS.Class-2.1.5/src/constant_scope.js +0 -48
  377. data/application/js/vendor/JS.Class-2.1.5/src/core.js +0 -1060
  378. data/application/js/vendor/JS.Class-2.1.5/src/decorator.js +0 -50
  379. data/application/js/vendor/JS.Class-2.1.5/src/enumerable.js +0 -505
  380. data/application/js/vendor/JS.Class-2.1.5/src/forwardable.js +0 -22
  381. data/application/js/vendor/JS.Class-2.1.5/src/hash.js +0 -334
  382. data/application/js/vendor/JS.Class-2.1.5/src/linked_list.js +0 -114
  383. data/application/js/vendor/JS.Class-2.1.5/src/loader.js +0 -553
  384. data/application/js/vendor/JS.Class-2.1.5/src/method_chain.js +0 -172
  385. data/application/js/vendor/JS.Class-2.1.5/src/observable.js +0 -55
  386. data/application/js/vendor/JS.Class-2.1.5/src/package.js +0 -472
  387. data/application/js/vendor/JS.Class-2.1.5/src/proxy.js +0 -58
  388. data/application/js/vendor/JS.Class-2.1.5/src/ruby.js +0 -44
  389. data/application/js/vendor/JS.Class-2.1.5/src/set.js +0 -332
  390. data/application/js/vendor/JS.Class-2.1.5/src/stack_trace.js +0 -151
  391. data/application/js/vendor/JS.Class-2.1.5/src/state.js +0 -95
  392. data/application/js/vendor/JS.Class-2.1.5/src/stdlib.js +0 -2612
  393. data/application/js/vendor/jquery-1.4.2.min.js +0 -154
  394. data/application/js/vendor/jquery-1.4.3.min.js +0 -166
  395. data/application/js/vendor/jquery-1.5.1.min.js +0 -16
  396. data/application/js/vendor/jquery-1.5.1rc1.min.js +0 -24
  397. data/application/js/vendor/jquery-ui-1.8.6.custom.min.js +0 -265
  398. data/application/js/vendor/jquery-ui-1.8.custom.min.js +0 -106
  399. data/application/js/vendor/jquery.hotkeys-0.7.9.js +0 -248
  400. data/application/js/vendor/jquery.hotkeys-0.7.9.min.js +0 -19
  401. data/application/js/vendor/jsdiff.js +0 -169
  402. data/lib/cutaneous/first_pass_parser.rb +0 -23
  403. data/lib/cutaneous/parser_core.rb +0 -18
  404. data/lib/cutaneous/second_pass_parser.rb +0 -23
  405. data/lib/sequel/plugins/yajl_serialization.rb +0 -154
  406. data/lib/spontaneous/plugins.rb +0 -20
  407. data/lib/spontaneous/proxy_object.rb +0 -12
  408. data/lib/spontaneous/publishing/fire_and_forget.rb +0 -57
  409. data/lib/spontaneous/render/context.rb +0 -100
  410. data/spontaneous.gemspec.tmpl +0 -66
  411. data/test/experimental/test_plugins.rb +0 -64
  412. data/test/fixtures/templates/publishing/layouts/dynamic.html.cut +0 -1
  413. data/test/fixtures/templates/publishing/layouts/static.html.cut +0 -1
@@ -1,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