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,15 +1,22 @@
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 PieceTest < MiniTest::Spec
7
7
  include Spontaneous
8
8
 
9
+ def setup
10
+ @site = setup_site
11
+ end
12
+
13
+ def teardown
14
+ teardown_site
15
+ end
16
+
9
17
  context "Pieces" do
10
18
  setup do
11
19
  Content.delete
12
- Spot::Schema.reset!
13
20
  class ::Piece < Spot::Piece; end
14
21
  class ::Page < Spot::Page; end
15
22
  class ::Fridge < ::Piece; end
@@ -27,13 +34,15 @@ class PieceTest < MiniTest::Spec
27
34
 
28
35
  context "as page content" do
29
36
  setup do
37
+ ::Page.box :things
38
+ ::Piece.box :things
30
39
  @page = ::Page.create
31
40
  @f1 = ::Piece.new
32
- @page << @f1
41
+ @page.things << @f1
33
42
  @f2 = ::Piece.new
34
- @f1 << @f2
43
+ @f1.things << @f2
35
44
  @f3 = ::Fridge.new
36
- @f2 << @f3
45
+ @f2.things << @f3
37
46
 
38
47
  @page.save
39
48
  @f1.save
@@ -52,10 +61,19 @@ class PieceTest < MiniTest::Spec
52
61
  @f3.page.should == @page
53
62
  end
54
63
 
55
- should "have a link to their container" do
56
- @f1.container.should == @page
57
- @f2.container.should == @f1
58
- @f3.container.should == @f2
64
+ should "have a link to their box" do
65
+ @f1.container.should == @page.things
66
+ @f2.container.should == @f1.things
67
+ @f3.container.should == @f2.things
68
+ end
69
+
70
+ should "have a link to their owner" do
71
+ @f1.owner.should == @page
72
+ @f2.owner.should == @f1
73
+ @f3.owner.should == @f2
74
+ @f1.parent.should == @page
75
+ @f2.parent.should == @f1
76
+ @f3.parent.should == @f2
59
77
  end
60
78
 
61
79
  should "know their depth in the piece tree" do
@@ -0,0 +1,153 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path('../../test_helper', __FILE__)
4
+
5
+ class PluginsTest < MiniTest::Spec
6
+ include ::Rack::Test::Methods
7
+
8
+
9
+ def self.startup
10
+ # @revision_root = "#{Dir.mktmpdir}/spontaneous-tests/#{Time.now.to_i}"
11
+ # `mkdir -p #{@revision_root}/public`
12
+
13
+ @site = setup_site
14
+
15
+
16
+ klass = Class.new(Spontaneous::Page)
17
+ Object.send(:const_set, :Page, klass)
18
+ klass = Class.new(Spontaneous::Piece)
19
+ Object.send(:const_set, :Piece, klass)
20
+ klass = Class.new(::Page) do
21
+ layout :from_plugin
22
+ end
23
+ Object.send(:const_set, :LocalPage, klass)
24
+ klass = Class.new(::Piece) do
25
+ style :from_plugin
26
+ end
27
+ Object.send(:const_set, :LocalPiece, klass)
28
+
29
+ plugin_dir = File.expand_path("../../fixtures/plugins/schema_plugin", __FILE__)
30
+ plugin = Spontaneous.instance.load_plugin plugin_dir
31
+ plugin.init!
32
+ plugin.load!
33
+
34
+ end
35
+
36
+ def self.shutdown
37
+ teardown_site
38
+ Object.send(:remove_const, :Page) rescue nil
39
+ Object.send(:remove_const, :Piece) rescue nil
40
+ Object.send(:remove_const, :LocalPage) rescue nil
41
+ Object.send(:remove_const, :LocalPiece) rescue nil
42
+ end
43
+
44
+ def app
45
+ Spontaneous::Rack.application
46
+ end
47
+
48
+ context "Plugins:" do
49
+
50
+ setup do
51
+ Site.publishing_method = :immediate
52
+ State.delete
53
+ Content.delete
54
+ Change.delete
55
+ @site = Spontaneous.instance
56
+ page = ::Page.new
57
+ page.save
58
+
59
+ end
60
+
61
+ teardown do
62
+ State.delete
63
+ Content.delete
64
+ Change.delete
65
+ end
66
+
67
+ should "load their init.rb file" do
68
+ $set_in_init.should be_true
69
+ end
70
+
71
+ context "with static files" do
72
+ setup do
73
+ @static = %w(css/plugin.css js/plugin.js subdir/image.gif static.html)
74
+ end
75
+
76
+ should "be able to provide them under their namespace in editing mode" do
77
+ Spontaneous.mode = :back
78
+ @static.each do |file|
79
+ get "/schema_plugin/#{file}"
80
+ assert last_response.ok?, "Static file /schema_plugin/#{file} returned error code #{last_response.status}"
81
+ last_response.body.should == File.basename(file) + "\n"
82
+ end
83
+ end
84
+
85
+ should "be able to provide them under their namespace in public mode" do
86
+ Spontaneous.mode = :front
87
+ @static.each do |file|
88
+ get "/schema_plugin/#{file}"
89
+ assert last_response.ok?, "Static file /schema_plugin/#{file} returned error code #{last_response.status}"
90
+ last_response.body.should == File.basename(file) + "\n"
91
+ end
92
+ end
93
+
94
+ should "look for and parse sass templates" do
95
+ Spontaneous.mode = :back
96
+ get "/schema_plugin/subdir/sass.css"
97
+ assert last_response.ok?, "Static file /schema_plugin/subdir/sass.css returned error code #{last_response.status}"
98
+ last_response.body.should =~ /^\s+color: #005a55;/
99
+ last_response.body.should =~ /^\s+padding: 42px;/
100
+ end
101
+
102
+ context "during publishing" do
103
+ setup do
104
+
105
+ Content.delete_revision(1) rescue nil
106
+
107
+ Spontaneous.logger.silent! {
108
+ Site.publish_all
109
+ }
110
+ end
111
+
112
+ teardown do
113
+ FileUtils.rm_rf(@revision_root) rescue nil
114
+ Content.delete
115
+ State.delete
116
+ Content.delete_revision(1)
117
+ end
118
+
119
+ should "have their public files copied into the revision sandbox" do
120
+ @static.each do |file|
121
+ path = File.join(@site.revision_root, '00001', 'public', 'schema_plugin', file)
122
+ assert File.exists?(path), "File '#{path}' should exist"
123
+ end
124
+ end
125
+
126
+ should "have their SASS & Less templates rendered to static css" do
127
+ sass_files =['subdir/sass.css']
128
+ sass_files.each do |file|
129
+ path = File.join(@site.revision_root, '00001', 'public', 'schema_plugin', file)
130
+ assert File.exists?(path), "File '#{path}' should exist"
131
+ css = File.read(path)
132
+ css.should =~ /color:#005a55;?/
133
+ css.should =~ /padding:42px;?/
134
+ end
135
+ end
136
+ end
137
+ end
138
+
139
+
140
+ # context "Functional plugins" do
141
+ # # do I need anything here?
142
+ # end
143
+
144
+ context "with schemas" do
145
+ should "make content classes available to rest of app" do
146
+ defined?(::SchemaPlugin).should == "constant"
147
+ ::SchemaPlugin::External.fields.length.should == 1
148
+ piece = ::SchemaPlugin::External.new(:a => "A Field")
149
+ piece.render.should == "plugins/templates/external.html.cut\n"
150
+ end
151
+ end
152
+ end
153
+ end
@@ -1,7 +1,6 @@
1
-
2
1
  # encoding: UTF-8
3
2
 
4
- require 'test_helper'
3
+ require File.expand_path('../../test_helper', __FILE__)
5
4
 
6
5
 
7
6
  class PrototypeSetTest < MiniTest::Spec
@@ -182,10 +181,69 @@ class PrototypeSetTest < MiniTest::Spec
182
181
  should "return the last value" do
183
182
  @set.last.should == "Five"
184
183
  end
184
+
185
185
  should "know the number of entries" do
186
186
  @set.length.should == 5
187
187
  @set.count.should == 5
188
188
  end
189
+
190
+ should "return the first item in the local set" do
191
+ @set.local_first.should == "Four"
192
+ end
193
+
194
+ should "traverse the object list until it finds a local_first" do
195
+ a = Super.new
196
+ a.prototypes = @set
197
+ set1 = Spontaneous::Collections::PrototypeSet.new(a, :prototypes)
198
+ b = Super.new
199
+ b.prototypes = set1
200
+ set2 = Spontaneous::Collections::PrototypeSet.new(b, :prototypes)
201
+ set1.local_first.should == "Four"
202
+ set2.local_first.should == "Four"
203
+ end
204
+
205
+ should "return nil for local first if empty" do
206
+ a = Super.new
207
+ a.prototypes = Spontaneous::Collections::PrototypeSet.new(nil, :prototypes)
208
+ set1 = Spontaneous::Collections::PrototypeSet.new(a, :prototypes)
209
+ set1.local_first.should be_nil
210
+ end
211
+
212
+ should "correctly search the hierarchy" do
213
+ one = "One"
214
+ one.stubs(:default?).returns(false)
215
+ two = "Two"
216
+ two.stubs(:default?).returns(true)
217
+ three = "Three"
218
+ three.stubs(:default?).returns(false)
219
+ four = "Four"
220
+ four.stubs(:default?).returns(false)
221
+ five = "Five"
222
+ five.stubs(:default?).returns(false)
223
+ six = "Six"
224
+ six.stubs(:default?).returns(true)
225
+ a = Super.new
226
+ a.prototypes = Spontaneous::Collections::PrototypeSet.new(nil, :prototypes)
227
+ a.prototypes[:one] = one
228
+ a.prototypes[:two] = two
229
+ b = Super.new
230
+ b.prototypes = Spontaneous::Collections::PrototypeSet.new(a, :prototypes)
231
+ a.prototypes[:three] = three
232
+ a.prototypes[:four] = four
233
+ c = Super.new
234
+ c.prototypes = Spontaneous::Collections::PrototypeSet.new(b, :prototypes)
235
+
236
+ test = proc { |value|
237
+ value.default?
238
+ }
239
+
240
+ c.prototypes.hierarchy_detect(&test).should == "Two"
241
+
242
+ c.prototypes[:five] = five
243
+ c.prototypes[:six] = six
244
+
245
+ c.prototypes.hierarchy_detect(&test).should == "Six"
246
+ end
189
247
  end
190
248
  end
191
249
  end
@@ -1,53 +1,62 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'test_helper'
3
+ require File.expand_path('../../test_helper', __FILE__)
4
4
 
5
5
  class PrototypesTest < MiniTest::Spec
6
+ def setup
7
+ @site = setup_site
8
+ end
9
+
10
+ def teardown
11
+ teardown_site
12
+ end
13
+
6
14
  context "Prototypes" do
7
15
  setup do
8
- class ::ImageClass < Spontaneous::Content
16
+ class ::ImageClass < Spontaneous::Piece
9
17
  field :image
10
18
  field :description
11
19
 
12
- def prototype
13
- self.description = "An Image"
20
+ prototype do |piece|
21
+ piece.description = "An Image"
14
22
  end
15
23
 
16
- def complex_prototype
17
- self.description = "Complex"
24
+ prototype :complex do |piece|
25
+ piece.description = "Complex"
18
26
  end
19
27
  end
20
28
 
21
- class ::PrototypeClass < Spontaneous::Content
29
+ class ::PrototypeClass < Spontaneous::Piece
22
30
  field :title, :string
23
31
  field :date, :string
24
32
  field :something, :string, :default => "Here"
25
33
 
26
34
  box :images
27
35
 
28
- def prototype
29
- self.title = "Naughty"
30
- self.date = "Yesterday"
31
- self.something = self.something.value * 2
32
- self.images << ImageClass.new
36
+ prototype do |piece|
37
+ piece.title = "Naughty"
38
+ piece.date = "Yesterday"
39
+ piece.something = piece.something.value * 2
40
+ piece.images << ImageClass.new
33
41
  end
34
42
 
35
- def careless_prototype
36
- self.title = "Careless"
37
- self.date = "Whisper"
43
+ prototype :careless do |piece|
44
+ piece.title = "Careless"
45
+ piece.date = "Whisper"
38
46
  end
39
47
 
40
- def witless_prototype
41
- self.title = "Witless"
42
- self.date = "Witness"
48
+ prototype :witless do |piece|
49
+ piece.title = "Witless"
50
+ piece.date = "Witness"
43
51
  end
44
52
  end
45
53
 
54
+
46
55
  end
47
56
  teardown do
48
57
  Content.delete
49
- Object.send(:remove_const, :ImageClass)
50
- Object.send(:remove_const, :PrototypeClass)
58
+ Object.send(:remove_const, :ImageClass) rescue nil
59
+ Object.send(:remove_const, :PrototypeClass) rescue nil
51
60
  end
52
61
 
53
62
  should "call #prototype after creation of an object" do
@@ -97,6 +106,58 @@ class PrototypesTest < MiniTest::Spec
97
106
  content.title.value.should == ""
98
107
  content.date.value.should == ""
99
108
  end
109
+
110
+ should "inherit prototypes from supertype" do
111
+ class ::Prototype2Class < ::PrototypeClass; end
112
+
113
+ content = Prototype2Class.create(:witless)
114
+ content.title.value.should == "Witless"
115
+ content.date.value.should == "Witness"
116
+
117
+ Object.send(:remove_const, :Prototype2Class) rescue nil
118
+ end
119
+
120
+ should "allow overwriting of prototypes in subclasses" do
121
+ class ::Prototype2Class < ::PrototypeClass
122
+ prototype :witless do |piece|
123
+ piece.title = "Witless2"
124
+ piece.date = "Witness2"
125
+ end
126
+ end
127
+
128
+ content = Prototype2Class.create(:witless)
129
+ content.title.value.should == "Witless2"
130
+ content.date.value.should == "Witness2"
131
+
132
+ Object.send(:remove_const, :Prototype2Class) rescue nil
133
+ end
134
+
135
+ should "allow calling of supertype prototype from within overridden prototype" do
136
+ class ::Prototype2Class < ::PrototypeClass
137
+ prototype :witless do |piece|
138
+ super(piece)
139
+ piece.date = "Witness2"
140
+ end
141
+ end
142
+
143
+ content = Prototype2Class.create(:witless)
144
+ content.title.value.should == "Witless"
145
+ content.date.value.should == "Witness2"
146
+
147
+ Object.send(:remove_const, :Prototype2Class) rescue nil
148
+ end
149
+
150
+ should "raise error if definition does not accept exactly 1 argument" do
151
+ begin
152
+ class ::Prototype3Class < ::S::Piece
153
+ prototype {}
154
+ end
155
+ flunk("Defining prototypes with no arguments should raise error")
156
+ rescue => e
157
+ e.must_be_instance_of(Spontaneous::InvalidPrototypeDefinitionError)
158
+ end
159
+ Object.send(:remove_const, :Prototype3Class) rescue nil
160
+ end
100
161
  end
101
162
  end
102
163
 
@@ -1,16 +1,19 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'test_helper'
3
+ require File.expand_path('../../test_helper', __FILE__)
4
4
 
5
+ require 'sinatra/base'
5
6
 
6
7
  class RenderTest < MiniTest::Spec
7
8
  include Spontaneous
8
9
 
9
10
  def setup
11
+ @site = setup_site
10
12
  @saved_engine_class = Spontaneous::Render.renderer_class
11
- Schema.reset!
12
13
  end
14
+
13
15
  def teardown
16
+ teardown_site
14
17
  Spontaneous::Render.renderer_class = @saved_engine_class
15
18
  end
16
19
 
@@ -18,11 +21,17 @@ class RenderTest < MiniTest::Spec
18
21
  @template_root ||= File.expand_path(File.join(File.dirname(__FILE__), "../fixtures/templates"))
19
22
  end
20
23
 
21
- context "First render step" do
24
+ context "Publish rendering step" do
22
25
  setup do
26
+ Content.delete
23
27
  self.template_root = template_root
24
28
  Spontaneous::Render.renderer_class = Spontaneous::Render::PublishingRenderer
25
29
 
30
+ class ::Page < Spontaneous::Page
31
+ field :title
32
+ box :sections1
33
+ box :sections2
34
+ end
26
35
  class ::TemplateClass < Content
27
36
  field :title do
28
37
  def to_epub
@@ -45,10 +54,65 @@ class RenderTest < MiniTest::Spec
45
54
  @content.style.should == TemplateClass.default_style
46
55
  @content.title = "The Title"
47
56
  @content.description = "The Description"
57
+ @root = ::Page.create(:title => "Home")
58
+ @section1 = ::Page.new(:title => "Section 1")
59
+ @section2 = ::Page.new(:title => "Section 2")
60
+ @section3 = ::Page.new(:title => "Section 3")
61
+ @section4 = ::Page.new(:title => "Section 4")
62
+ @root.sections1 << @section1
63
+ @root.sections1 << @section2
64
+ @root.sections2 << @section3
65
+ @root.sections2 << @section4
66
+
67
+ @root.sections2.entries.last.set_position(0)
68
+ @root.save.reload
48
69
  end
49
70
 
50
71
  teardown do
51
72
  Object.send(:remove_const, :TemplateClass) rescue nil
73
+ Object.send(:remove_const, :Page) rescue nil
74
+ end
75
+
76
+ should "render strings correctly" do
77
+ S::Render.render_string('#{title} {{ Time.now }}', @content, :html, {}).should == "The Title {{ Time.now }}"
78
+ end
79
+
80
+ should "use a cache for the site root" do
81
+ S::Render.with_publishing_renderer do
82
+ a = S::Render.render_string('#{root.object_id} #{root.object_id}', @content, :html, {})
83
+ a.should_not == "#{nil.object_id} #{nil.object_id}"
84
+ a.split.uniq.length.should == 1
85
+ end
86
+ end
87
+
88
+ should "iterate through the sections" do
89
+ template = '%%{ navigation(%s) do |section, active| }#{section.title}/#{active} %%{ end }'
90
+ a = S::Render.render_string(template % "", @section1, :html, {})
91
+ a.should == "Section 1/true Section 2/false Section 4/false Section 3/false "
92
+ a = S::Render.render_string(template % "1", @section2, :html, {})
93
+ a.should == "Section 1/false Section 2/true Section 4/false Section 3/false "
94
+ a = S::Render.render_string(template % ":section", @section1, :html, {})
95
+ a.should == "Section 1/true Section 2/false Section 4/false Section 3/false "
96
+ end
97
+
98
+ should "use a cache for navigation pages" do
99
+ a = b = c = nil
100
+ template = '%{ navigation do |section, active| }#{section.object_id} %{ end }'
101
+ a = S::Render.render_string(template, S::Content[@section1.id], :html, {}).strip
102
+ b = S::Render.render_string(template, S::Content[@section1.id], :html, {}).strip
103
+ a.should_not == b
104
+
105
+ S::Render.with_publishing_renderer do
106
+ template = '%{ navigation do |section, active| }#{section.object_id} %{ end }'
107
+ a = S::Render.render_string(template, S::Content[@section1.id], :html, {}).strip
108
+ b = S::Render.render_string(template, S::Content[@section1.id], :html, {}).strip
109
+ a.should == b
110
+ end
111
+ S::Render.with_publishing_renderer do
112
+ template = '%{ navigation do |section, active| }#{section.object_id} %{ end }'
113
+ c = S::Render.render_string(template, S::Content[@section1.id], :html, {}).strip
114
+ end
115
+ a.should_not == c
52
116
  end
53
117
 
54
118
  should "be able to render themselves to HTML" do
@@ -92,9 +156,9 @@ class RenderTest < MiniTest::Spec
92
156
  child = TemplateClass.new
93
157
  child.title = "Child2 Title"
94
158
  child.description = "Child2 Description"
95
- @content << child
96
- @content.pieces.last.style = TemplateClass.get_style(:this_template)
97
- @content.pieces.last.hide!
159
+ @content.bits << child
160
+ @content.bits.last.style = TemplateClass.get_style(:this_template)
161
+ @content.bits.last.hide!
98
162
  @content.render.should == "<complex>\nThe Title\n<piece><html><title>Child Title</title><body>Child Description</body></html>\n</piece>\n</complex>\n"
99
163
  end
100
164
  end
@@ -130,7 +194,7 @@ class RenderTest < MiniTest::Spec
130
194
 
131
195
  class ::AnImage < Content; end
132
196
  AnImage.field :title
133
- AnImage.template '<img>{{title}}</img>'
197
+ AnImage.template '<img>#{title}</img>'
134
198
 
135
199
  @root = TemplateClass.new
136
200
  @root.images.introduction = "Images below:"
@@ -160,7 +224,7 @@ class RenderTest < MiniTest::Spec
160
224
 
161
225
  class ::AnImage < Content; end
162
226
  AnImage.field :title
163
- AnImage.template '<img>{{title}}</img>'
227
+ AnImage.template '<img>#{title}</img>'
164
228
 
165
229
  @root = TemplateClass.new
166
230
  @root.images_with_template.introduction = "Images below:"
@@ -274,6 +338,7 @@ class RenderTest < MiniTest::Spec
274
338
  end
275
339
  end
276
340
  end
341
+
277
342
  context "Request rendering" do
278
343
  setup do
279
344
  self.template_root = template_root
@@ -287,7 +352,7 @@ class RenderTest < MiniTest::Spec
287
352
  @page = PreviewRender.new(:title => "PAGE", :description => "DESCRIPTION")
288
353
  # @page.stubs(:id).returns(24)
289
354
  @page.save
290
- @session = ::Rack::MockSession.new(Sinatra::Application)
355
+ @session = ::Rack::MockSession.new(::Sinatra::Application)
291
356
  end
292
357
 
293
358
  teardown do
@@ -300,6 +365,12 @@ class RenderTest < MiniTest::Spec
300
365
  PreviewRender.layout :preview_render
301
366
  end
302
367
 
368
+ should "something" do
369
+ @now = Time.now
370
+ ::Time.stubs(:now).returns(@now)
371
+ S::Render.render_string('#{title} {{ Time.now }}', @page, :html, {}).should == "PAGE #{@now.to_s}"
372
+ end
373
+
303
374
  should "render all tags & include preview edit markers" do
304
375
  @page.render.should == <<-HTML
305
376
  PAGE <p>DESCRIPTION</p>
@@ -354,6 +425,23 @@ PAGE <p>DESCRIPTION</p>
354
425
  end
355
426
  end
356
427
 
428
+ context "variables in templates" do
429
+ setup do
430
+ Spontaneous::Render.renderer_class = Spontaneous::Render::PublishingRenderer
431
+ PreviewRender.layout :variables
432
+ PreviewRender.style :variables
433
+
434
+ @page.layout = :variables
435
+ @first = PreviewRender.new(:title => "first")
436
+ @page.images << @first
437
+ @page.images.first.style = :variables
438
+ end
439
+
440
+ should "be passed to page content" do
441
+ @page.render(:html, :param => "param").should == "param\n<variable/param/>\n\nlocal\n"
442
+ end
443
+ end
357
444
  end
445
+
358
446
  end
359
447