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,23 @@
1
1
  # encoding: UTF-8
2
2
 
3
- require 'test_helper'
3
+ require File.expand_path('../../test_helper', __FILE__)
4
4
  require 'erb'
5
5
 
6
6
 
7
7
  class SerialisationTest < MiniTest::Spec
8
8
  include Spontaneous
9
+
10
+ def setup
11
+ @site = setup_site
12
+ end
13
+
14
+ def teardown
15
+ teardown_site
16
+ end
17
+
9
18
  context "Content" do
10
19
  setup do
11
20
  Content.delete
12
- Spot::Schema.reset!
13
21
  class ::Page < Spontaneous::Page
14
22
  field :title, :string, :default => "New Page"
15
23
  end
@@ -93,7 +101,14 @@ class SerialisationTest < MiniTest::Spec
93
101
  Spot::deserialise_http(SerialisedPiece.serialise_http).should == @class_hash
94
102
  end
95
103
  should "include the title field name in the serialisation of page types" do
96
- SerialisedPage.export[:title_field].should == 'title'
104
+ SerialisedPage.export(nil)[:title_field].should == 'title'
105
+ end
106
+ should "use JS friendly names for type keys" do
107
+ class ::SerialisedPage
108
+ class InnerClass < Piece
109
+ end
110
+ end
111
+ Site.schema.export['SerialisedPage.InnerClass'].should == ::SerialisedPage::InnerClass.export
97
112
  end
98
113
  end
99
114
 
@@ -138,10 +153,10 @@ class SerialisationTest < MiniTest::Spec
138
153
  @child.direction = "N"
139
154
  @child.uid = "about"
140
155
 
141
- @root.pieces[0].style = :freezing
142
- @root.insides.pieces[0].visible = false
143
- @root.pieces[1].style = :boiling
144
- @root.pieces[0].pieces[0].style = :sitting
156
+ @root.insides[0].style = :freezing
157
+ @root.insides[0].visible = false
158
+ @root.insides[1].style = :boiling
159
+ @root.insides.first.first.style = :sitting
145
160
 
146
161
  @child.path.should == "/about"
147
162
 
@@ -166,14 +181,15 @@ class SerialisationTest < MiniTest::Spec
166
181
  # hard to test this as the serialisation order appears to change
167
182
  Spot.deserialise_http(@root.serialise_http).should == @root.export
168
183
  end
184
+
169
185
  end
170
186
  end
171
187
 
172
188
  context "Publishing" do
173
189
  setup do
174
- Spot::Schema.reset!
175
190
  class ::Page < Spontaneous::Page
176
191
  field :title, :string, :default => "New Page"
192
+ box :box1
177
193
  end
178
194
  @now = Time.now
179
195
  Time.stubs(:now).returns(@now)
@@ -181,7 +197,7 @@ class SerialisationTest < MiniTest::Spec
181
197
  Change.delete
182
198
  @page1 = ::Page.create
183
199
  @page2 = ::Page.create(:slug => "page2")
184
- @page1 << @page2
200
+ @page1.box1 << @page2
185
201
  @page2.save
186
202
  @c1 = Change.new
187
203
  @c1.push(@page1)
@@ -194,7 +210,7 @@ class SerialisationTest < MiniTest::Spec
194
210
  end
195
211
 
196
212
  teardown do
197
- Object.send(:remove_const, :Page)
213
+ Object.send(:remove_const, :Page) rescue nil
198
214
  Content.delete
199
215
  Change.delete
200
216
  end
@@ -1,18 +1,25 @@
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 SiteTest < MiniTest::Spec
7
7
  include Spontaneous
8
+
8
9
  def setup
10
+ @site = setup_site
11
+ end
12
+
13
+ def teardown
14
+ teardown_site
9
15
  end
16
+
10
17
  context "Site:" do
11
18
  setup do
12
19
  Content.delete
13
- Spot::Schema.reset!
14
20
  class ::Page < Spontaneous::Page
15
21
  field :title
22
+ box :subpages
16
23
  end
17
24
  Content.delete
18
25
  @root = ::Page.new
@@ -29,17 +36,17 @@ class SiteTest < MiniTest::Spec
29
36
  @page3_2.title = "Page 3 2"
30
37
  @page3_2.uid = "page3_2"
31
38
 
32
- @root << @page1_1
33
- @root << @page1_2
34
- @page1_1 << @page2_1
35
- @page2_1 << @page3_1
36
- @page2_1 << @page3_2
37
- @root.save
38
- @page1_1.save
39
- @page1_2.save
40
- @page2_1.save
41
- @page3_1.save
42
- @page3_2.save
39
+ @root.subpages << @page1_1
40
+ @root.subpages << @page1_2
41
+ @page1_1.subpages << @page2_1
42
+ @page2_1.subpages << @page3_1
43
+ @page2_1.subpages << @page3_2
44
+ @root.save.reload
45
+ @page1_1.save.reload
46
+ @page1_2.save.reload
47
+ @page2_1.save.reload
48
+ @page3_1.save.reload
49
+ @page3_2.save.reload
43
50
  end
44
51
  teardown do
45
52
  Object.send(:remove_const, :Page)
@@ -70,18 +77,19 @@ class SiteTest < MiniTest::Spec
70
77
  :id => @page3_2.id,
71
78
  :title => "Page 3 2",
72
79
  :path => '/page1-1/page2-1/page3-2',
80
+ :slug => 'page3-2',
73
81
  :type => 'Page',
74
82
  :type_id => ::Page.schema_id,
75
83
  :depth => 3,
76
84
  :children => [],
77
85
  :ancestors => [
78
- { :id => @root.id, :title => "Homepage", :path => '/', :type => 'Page', :type_id => ::Page.schema_id, :depth => 0, :children => 2 },
79
- { :id => @page1_1.id, :title => "Page 1 1", :path => '/page1-1', :type => 'Page', :type_id => ::Page.schema_id, :depth => 1, :children => 1 },
80
- { :id => @page2_1.id, :title => "Page 2 1", :path => '/page1-1/page2-1', :type => 'Page', :type_id => ::Page.schema_id, :depth => 2, :children => 2 }
86
+ { :id => @root.id, :title => "Homepage", :path => '/', :slug => '', :type => 'Page', :type_id => ::Page.schema_id, :depth => 0, :children => 2 },
87
+ { :id => @page1_1.id, :title => "Page 1 1", :path => '/page1-1', :slug => 'page1-1', :type => 'Page', :type_id => ::Page.schema_id, :depth => 1, :children => 1 },
88
+ { :id => @page2_1.id, :title => "Page 2 1", :path => '/page1-1/page2-1', :slug => 'page2-1', :type => 'Page', :type_id => ::Page.schema_id, :depth => 2, :children => 2 }
81
89
  ],
82
90
  :generation => [
83
- { :id => @page3_1.id, :title => "Page 3 1", :path => '/page1-1/page2-1/page3-1', :type => 'Page', :type_id => ::Page.schema_id, :depth => 3, :children => 0 },
84
- { :id => @page3_2.id, :title => "Page 3 2", :path => '/page1-1/page2-1/page3-2', :type => 'Page', :type_id => ::Page.schema_id, :depth => 3, :children => 0 }
91
+ { :id => @page3_1.id, :title => "Page 3 1", :path => '/page1-1/page2-1/page3-1', :slug => 'page3-1', :type => 'Page', :type_id => ::Page.schema_id, :depth => 3, :children => 0 },
92
+ { :id => @page3_2.id, :title => "Page 3 2", :path => '/page1-1/page2-1/page3-2', :slug => 'page3-2', :type => 'Page', :type_id => ::Page.schema_id, :depth => 3, :children => 0 }
85
93
  ],
86
94
  :children => []
87
95
  }
@@ -90,34 +98,36 @@ class SiteTest < MiniTest::Spec
90
98
  :id => @page2_1.id,
91
99
  :title => "Page 2 1",
92
100
  :path => '/page1-1/page2-1',
101
+ :slug => 'page2-1',
93
102
  :type => 'Page',
94
- :type_id => ::Page.schema_id,
103
+ :type_id => ::Page.schema_id.to_s,
95
104
  :depth => 2,
96
105
  :children => [{:depth=>3,
97
106
  :type=>"Page",
98
- :type_id => ::Page.schema_id,
107
+ :type_id => ::Page.schema_id.to_s,
99
108
  :children=>0,
100
109
  :path=>"/page1-1/page2-1/page3-1",
110
+ :slug => 'page3-1',
101
111
  :title=>"Page 3 1",
102
112
  :id=>@page3_1.id},
103
113
  {:depth=>3,
104
114
  :type=>"Page",
105
- :type_id => ::Page.schema_id,
115
+ :type_id => ::Page.schema_id.to_s,
106
116
  :children=>0,
107
117
  :path=>"/page1-1/page2-1/page3-2",
118
+ :slug => 'page3-2',
108
119
  :title=>"Page 3 2",
109
120
  :id=>@page3_2.id}],
110
121
  :ancestors => [
111
- { :id => @root.id, :title => "Homepage", :path => '/', :type => 'Page', :type_id => ::Page.schema_id, :depth => 0, :children => 2 },
112
- { :id => @page1_1.id, :title => "Page 1 1", :path => '/page1-1', :type => 'Page', :type_id => ::Page.schema_id, :depth => 1, :children => 1 }
122
+ { :id => @root.id, :title => "Homepage", :path => '/', :slug => '',:type => 'Page', :type_id => ::Page.schema_id, :depth => 0, :children => 2 },
123
+ { :id => @page1_1.id, :title => "Page 1 1", :path => '/page1-1', :slug => 'page1-1',:type => 'Page', :type_id => ::Page.schema_id, :depth => 1, :children => 1 }
113
124
  ],
114
125
  :generation => [
115
- { :id => @page2_1.id, :title => "Page 2 1", :path => '/page1-1/page2-1', :type => 'Page', :type_id => ::Page.schema_id, :depth => 2, :children => 2 }
126
+ { :id => @page2_1.id, :title => "Page 2 1", :path => '/page1-1/page2-1', :slug => 'page2-1',:type => 'Page', :type_id => ::Page.schema_id, :depth => 2, :children => 2 }
116
127
  ]
117
128
  }
118
129
  end
119
130
 
120
- should ""
121
131
 
122
132
  should "retrieve details of the root by default" do
123
133
  Site.map.should == Page.root.map_entry
@@ -140,6 +150,13 @@ class SiteTest < MiniTest::Spec
140
150
  should "have a shortcut direct method on Site" do
141
151
  Site.page3_2.should == @page3_2.reload
142
152
  end
153
+
154
+ should "return section pages in the right order" do
155
+ Site.at_depth(0).should == @root
156
+ Site.at_depth(:root).should == @root
157
+ Site.at_depth(1).should == [@page1_1, @page1_2]
158
+ Site.at_depth(:section).should == [@page1_1, @page1_2]
159
+ end
143
160
  end
144
161
  end
145
162
  end
@@ -0,0 +1,88 @@
1
+ # encoding: UTF-8
2
+
3
+ require File.expand_path('../../test_helper', __FILE__)
4
+ require 'fog'
5
+
6
+ class StorageTest < MiniTest::Spec
7
+ def setup
8
+ @site = setup_site
9
+ @config_dir = File.expand_path("../../fixtures/storage", __FILE__)
10
+ end
11
+
12
+ def teardown
13
+ teardown_site
14
+ end
15
+
16
+ context "local storage" do
17
+ setup do
18
+ @site.paths.add :config, File.expand_path(@config_dir / "default", __FILE__)
19
+ @site.load_config!
20
+ # sanity check
21
+ @site.config.test_setting.should be_true
22
+ @storage = @site.storage
23
+ end
24
+ should "be the default" do
25
+ @storage.must_be_instance_of Spontaneous::Storage::Local
26
+ end
27
+ should "have the right base url" do
28
+ @storage.public_url("test.jpg").should == "/media/test.jpg"
29
+ end
30
+ should "test for locality" do
31
+ @storage.local?.should be_true
32
+ end
33
+
34
+ should "provide a list of local storage backends" do
35
+ @site.local_storage.should == [@storage]
36
+ end
37
+ end
38
+ context "cloud storage" do
39
+ setup do
40
+ @bucket_name = "media.example.com"
41
+ @aws_credentials = {
42
+ :provider=>"AWS",
43
+ :aws_secret_access_key=>"SECRET_ACCESS_KEY",
44
+ :aws_access_key_id=>"ACCESS_KEY_ID"
45
+ }
46
+ ::Fog.mock!
47
+ @connection = Fog::Storage.new(@aws_credentials)
48
+ @connection.directories.create(:key => @bucket_name)
49
+ @site.paths.add :config, File.expand_path(@config_dir / "cloud", __FILE__)
50
+ @site.load_config!
51
+ # sanity check
52
+ @site.config.test_setting.should be_true
53
+ @storage = @site.storage
54
+ end
55
+
56
+ should "be detected by configuration" do
57
+ @storage.must_be_instance_of Spontaneous::Storage::Cloud
58
+ end
59
+
60
+ should "have the correct bucket name" do
61
+ @storage.bucket_name.should == "media.example.com"
62
+ end
63
+
64
+ should "not test as local" do
65
+ @storage.local?.should be_false
66
+ end
67
+
68
+ context "public urls" do
69
+ setup do
70
+ existing_file = File.expand_path("../../fixtures/images/rose.jpg", __FILE__)
71
+ @media_path = %w(0003 0567 rose.jpg)
72
+ @storage.copy(existing_file, @media_path, "image/jpeg")
73
+ end
74
+
75
+ should "have the correct base url" do
76
+ @storage.public_url(@media_path).should == "https://media.example.com.s3.amazonaws.com/0003-0567-rose.jpg"
77
+ end
78
+
79
+
80
+ should "use custom urls if configured" do
81
+ storage = Spontaneous::Storage::Cloud.new(@aws_credentials.merge({
82
+ :public_host => "http://media.example.com",
83
+ }), @bucket_name)
84
+ storage.public_url(@media_path).should == "http://media.example.com/0003-0567-rose.jpg"
85
+ end
86
+ end
87
+ end
88
+ end
@@ -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 StructureTest < MiniTest::Spec
7
+
8
+ def setup
9
+ @site = setup_site
10
+ end
11
+
12
+ def teardown
13
+ teardown_site
14
+ end
15
+
7
16
  context "content building" do
8
17
  setup do
9
18
  Content.delete
10
- Spot::Schema.reset!
11
19
  class Page < Spot::Page
12
20
  field :title
13
21
  end
@@ -78,8 +86,6 @@ class StructureTest < MiniTest::Spec
78
86
  @project1.ancestors.should == [@home]
79
87
  end
80
88
  end
89
+
81
90
  end
82
91
  end
83
-
84
-
85
-
@@ -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
 
6
6
  class StylesTest < MiniTest::Spec
@@ -14,7 +14,13 @@ class StylesTest < MiniTest::Spec
14
14
  # end
15
15
  # end
16
16
 
17
+
18
+ def teardown
19
+ teardown_site
20
+ end
21
+
17
22
  def setup
23
+ @site = setup_site
18
24
  self.template_root = File.expand_path(File.join(File.dirname(__FILE__), "../fixtures/styles"))
19
25
  Spontaneous::Render.use_development_renderer
20
26
  end
@@ -22,7 +28,11 @@ class StylesTest < MiniTest::Spec
22
28
  context "styles for" do
23
29
 
24
30
  setup do
25
- Spot::Schema.reset!
31
+
32
+ class ::Page < Spontaneous::Page; end
33
+ class ::Piece < Spontaneous::Piece; end
34
+ class ::Box < Spontaneous::Box; end
35
+
26
36
  class ::MissingClass < Piece; end
27
37
  class ::TemplateClass < Piece; end
28
38
  class ::TemplateSubClass1 < TemplateClass; end
@@ -357,7 +367,7 @@ class StylesTest < MiniTest::Spec
357
367
  piece.entities << TemplateClass.new
358
368
  piece.entities << TemplateClass.new
359
369
  piece.entities.render.should == "template_class.html.cut\n\ntemplate_class.html.cut\n"
360
- piece.entities.style.template.call.should == "{{ render_content }}"
370
+ piece.entities.style.template.call.should == '#{ render_content }'
361
371
  end
362
372
 
363
373
 
@@ -376,6 +386,44 @@ class StylesTest < MiniTest::Spec
376
386
  assert_correct_template(piece.dongles, 'named2')
377
387
  piece.dongles.render.should == "named2.html.cut\n"
378
388
  end
389
+
390
+ should "use styles assigned in a subclass" do
391
+ saved_template_root = self.template_root
392
+ self.template_root = Spontaneous.template_root
393
+ ::TemplateSubClass = Class.new(TemplateClass)
394
+ ::TemplateSubSubClass = Class.new(TemplateSubClass)
395
+
396
+ TemplateSubClass.box :bananas
397
+ TemplateSubClass.box :apples, :style => :apples
398
+ TemplateSubClass.box :oranges do
399
+ style :oranges
400
+ end
401
+
402
+ # FileUtils.mkdir_p(Spontaneous.template_root)
403
+
404
+ piece = TemplateSubSubClass.new
405
+ assert Proc === piece.bananas.template
406
+
407
+ [[piece.bananas, %w(template_sub_sub_class/bananas template_sub_class/bananas)],
408
+ [piece.apples, %w(template_sub_sub_class/apples template_sub_class/apples apples)],
409
+ [piece.oranges, %w(template_sub_sub_class/oranges template_sub_class/oranges oranges)]
410
+ ].each do |box, test_templates|
411
+ test_templates.each do |test_template|
412
+ FileUtils.mkdir_p(File.dirname(Spontaneous.template_root(test_template)))
413
+ FileUtils.touch(Spontaneous.template_root(test_template) + '.html.cut')
414
+
415
+ assert_correct_template(box, test_template)
416
+
417
+ FileUtils.rm_r(::File.dirname(Spontaneous.template_root(test_template)))
418
+ end
419
+ end
420
+
421
+
422
+ Object.send(:remove_const, :TemplateSubClass)
423
+ Object.send(:remove_const, :TemplateSubSubClass)
424
+ FileUtils.rm_r(Spontaneous.template_root) rescue nil
425
+ self.template_root = saved_template_root
426
+ end
379
427
  end
380
428
 
381
429
  context "boxes with a specified class" do
@@ -396,6 +444,19 @@ class StylesTest < MiniTest::Spec
396
444
  piece.entities.render.should == "box_a.html.cut\n"
397
445
  end
398
446
 
447
+ should "find templates for box subclasses with specified types defined in a supertype" do
448
+ Object.send(:remove_const, :TemplateSubClass) rescue nil
449
+ Object.send(:remove_const, :BoxASubclass) rescue nil
450
+ class ::BoxASubclass < BoxA; end
451
+ TemplateClass.box :lastly, :type => :BoxASubclass
452
+ class ::TemplateSubClass < TemplateClass
453
+ end
454
+ piece = TemplateSubClass.new
455
+ assert_correct_template(piece.lastly, 'box_a')
456
+ Object.send(:remove_const, :BoxASubclass)
457
+ Object.send(:remove_const, :TemplateSubClass)
458
+ end
459
+
399
460
  context "with configured styles" do
400
461
  setup do
401
462
  BoxA.style :runny