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
@@ -5,59 +5,76 @@ module Spontaneous
5
5
  class BoxStyle < Style
6
6
  attr_reader :box
7
7
 
8
+ def self.excluded_classes
9
+ [Spontaneous::Box].tap do |classes|
10
+ classes.push(::Box) if defined?(::Box)
11
+ end
12
+ end
13
+
8
14
  def self.to_directory_name(klass)
9
- return nil if klass == Spontaneous::Box
15
+ return nil if excluded_classes.include?(klass)
10
16
  super
11
17
  end
12
18
 
13
- def initialize(box)
19
+ def initialize(box, owner = nil)
14
20
  @box = box
15
- @owner = box._owner.class
21
+ @owner = box.owner.class
16
22
  end
17
23
 
18
24
  def inline_template(format)
19
25
  nil
20
26
  end
21
27
 
22
- def supertype_template(format)
23
- supertype = box.class.supertype
24
- if supertype && supertype != Spontaneous::Box
25
- self.class.new(supertype).template(format)
26
- else
27
- nil
28
- end
28
+ def try_supertype_styles
29
+ []
29
30
  end
30
31
 
32
+
33
+
34
+
31
35
  def name
32
36
  box._name.to_s
33
37
  end
34
38
 
35
39
  def try_paths
36
40
  prototype = box._prototype
37
- box_directory_name = self.class.to_directory_name(prototype.box_base_class)
38
- paths = [ [owner_directory_name, box._name.to_s] ]
41
+ box_name = box._name.to_s
42
+
43
+ paths = owner_directory_paths(box_name)
44
+
45
+ if style_name = prototype.default_style
46
+ name = style_name.to_s
47
+ paths.concat(owner_directory_paths(name))
48
+ paths.concat(box_directory_paths(name))
49
+ end
39
50
 
40
51
  if box.styles.empty?
41
- paths.push(box_directory_name)
52
+ paths.concat(box_directory_names)
42
53
  else
43
- if style_name = prototype.default_style
44
- name = style_name.to_s
45
- paths.push([owner_directory_name, name])
46
- paths.push([box_directory_name, name])
47
- else
54
+ unless style_name = prototype.default_style
48
55
  box.styles.each do |style|
49
56
  name = style.name.to_s
50
- paths.push([owner_directory_name, name])
51
- paths.push([box_directory_name, name])
57
+ paths.concat(owner_directory_paths(name))
58
+ paths.concat(box_directory_paths(name))
52
59
  end
53
60
  end
54
61
  end
55
-
56
62
  paths
57
63
  end
58
64
 
65
+ def box_directory_names
66
+ box_class = box._prototype.box_base_class
67
+ box_supertypes = [box_class].concat(class_ancestors(box_class)).reject { |type| self.class.excluded_classes.include?(type) }
68
+ return [nil] if box_supertypes.empty?
69
+ box_supertypes.map { |type| self.class.to_directory_name(type) }
70
+ end
71
+
72
+ def box_directory_paths(name)
73
+ box_directory_names.map { |d| [d, name] }
74
+ end
75
+
59
76
  def anonymous_template
60
- Proc.new { "{{ render_content }}" }
77
+ Proc.new { '#{ render_content }' }
61
78
  end
62
79
  end
63
80
  end
@@ -6,7 +6,7 @@ module Spontaneous
6
6
  alias_method :sequel_plugin, :plugin
7
7
  end
8
8
 
9
- sequel_plugin :yajl_serialization, :modified_list
9
+ sequel_plugin :serialization, :yajl, :modified_list
10
10
 
11
11
  @@instance = nil
12
12
 
@@ -67,7 +67,7 @@ module Spontaneous
67
67
  outstanding.map { |change_set| change_set.export }
68
68
  end
69
69
 
70
- def serialise_http
70
+ def serialise_http(user = nil)
71
71
  Spontaneous.serialise_http(export)
72
72
  end
73
73
  end
@@ -9,6 +9,7 @@ module Spontaneous
9
9
  class_option :environment, :type => :string, :aliases => "-e", :required => true, :default => :development, :desc => "Spontaneous Environment"
10
10
  class_option :mode, :type => :string, :aliases => "-m", :default => :back, :desc => "Spontaneous mode ('front' or 'back')"
11
11
  class_option :help, :type => :boolean, :desc => "Show help usage"
12
+
12
13
  protected
13
14
 
14
15
  def boot!
@@ -1,3 +1,5 @@
1
+ # encoding: UTF-8
2
+
1
3
  require 'thor'
2
4
 
3
5
  module Spontaneous
@@ -82,6 +84,7 @@ module Spontaneous
82
84
  desc :init, "Creates databases and initialises a new Spontaneous site"
83
85
  def init
84
86
  prepare :init
87
+ site = Spontaneous::Site.instantiate(Dir.pwd, options.environment, :back)
85
88
  require File.expand_path('../../../spontaneous', __FILE__)
86
89
  Sequel.extension :migration
87
90
  connection_params = Spontaneous.db_settings
@@ -98,13 +101,18 @@ module Spontaneous
98
101
  say " >>> Unable to create #{connection_params[:adapter]} database `#{db}`:\n > #{e}", :red
99
102
  # throw :error
100
103
  end
104
+ begin
105
+ connection.run("USE `#{db}`")
106
+ connection.logger = nil
107
+ say " >> Running migrations..."
108
+ Sequel::Migrator.apply(connection, Spontaneous.gem_dir('db/migrations'))
109
+ say " >> Done"
110
+ rescue => e
111
+ say " >>> Error running migrations on database `#{db}`:\n > #{e}", :red
112
+ end
101
113
  end
102
114
  end
103
115
  boot!
104
- Spontaneous.database.logger = nil
105
- say " >> Running migrations..."
106
- Sequel::Migrator.apply(Spontaneous.database, Spontaneous.gem_dir('db/migrations'))
107
- say " >> Done"
108
116
  end
109
117
  end
110
118
 
@@ -0,0 +1,72 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'watchr'
4
+
5
+ module Spontaneous::Cli
6
+ class Console < ::Spontaneous::Cli::Thor
7
+ Spontaneous = ::Spontaneous
8
+ include Thor::Actions
9
+ namespace :console
10
+
11
+ default_task :open
12
+
13
+ desc "#{namespace}:open", "Gives you console access to the current site"
14
+ def open
15
+ # script = Watchr::Script.new
16
+ # script.watch('(lib|schema)/.*\\.rb') { puts 'reload!' } # doesn't block
17
+ # Thread.new do
18
+ # Watchr::Controller.new(script, Watchr.handler.new).run
19
+ # end
20
+
21
+
22
+ ENV["SPOT_MODE"] = "console"
23
+ prepare :console
24
+ ARGV.clear
25
+ ARGV.concat [ "--readline", "--prompt-mode", "simple" ]
26
+ require 'irb'
27
+ boot!
28
+
29
+ require 'irb/completion'
30
+ require 'irb/ext/save-history'
31
+
32
+ history_file = Spontaneous.root / ".irb_history"
33
+
34
+ IRB.setup(nil)
35
+ IRB.conf[:SAVE_HISTORY] = 100
36
+ IRB.conf[:HISTORY_FILE] = history_file
37
+
38
+ irb = IRB::Irb.new
39
+ IRB.conf[:MAIN_CONTEXT] = irb.context
40
+
41
+ irb.context.evaluate((<<-INIT), __LINE__)
42
+
43
+ module Readline
44
+ module History
45
+ def self.write_log(line)
46
+ File.open('#{history_file}', 'ab') {|f| f << "\#{line}\n"}
47
+ end
48
+ end
49
+
50
+ alias :old_readline :readline
51
+ def readline(*args)
52
+ ln = old_readline(*args)
53
+ begin
54
+ History.write_log(ln) unless ln.strip.empty?
55
+ rescue
56
+ end
57
+ ln
58
+ end
59
+ end
60
+
61
+
62
+ INIT
63
+
64
+ trap("SIGINT") do
65
+ irb.signal_handle
66
+ end
67
+ catch(:IRB_EXIT) do
68
+ irb.eval_input
69
+ end
70
+ end
71
+ end # Console
72
+ end # Spontaneous::Cli
@@ -1,22 +1,29 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'spontaneous'
4
+ require 'simultaneous'
5
+ require 'foreman'
6
+ require 'foreman/engine'
1
7
 
2
8
  module Spontaneous
3
9
  module Cli
4
10
  class Server < ::Spontaneous::Cli::Thor
5
11
  namespace :server
12
+ default_task :start
6
13
 
7
- default_task :back
8
-
9
- # desc :start, "Starts Spontaneous"
10
-
11
- # def both
12
- # pids = []
13
- # trap(:INT) { }
14
- # pids << fork { front }
15
- # pids << fork { back }
16
- # Process.wait
17
- # pids.each { | pid | Process.kill(:TERM, pid) rescue nil }
18
- # end
14
+ class_option :no_browser, :type => :boolean, :default => false, :aliases => "-b", :desc => "Don't launch browser"
19
15
 
16
+ desc "#{namespace}:start", "Starts Spntaneous in development mode"
17
+ def start
18
+ File.open(".Procfile", 'wb') do |procfile|
19
+ procfile.write(%(back: #{binary} server:back\n))
20
+ procfile.write(%(front: #{binary} server:front\n))
21
+ procfile.write(%(simultaneous: #{binary} server:simultaneous\n))
22
+ procfile.flush
23
+ engine = ::Foreman::Engine.new(procfile.path)
24
+ engine.start
25
+ end
26
+ end
20
27
 
21
28
  desc "#{namespace}:front", "Starts Spontaneous in front/public mode"
22
29
  # method_option :adapter, :type => :string, :aliases => "-a", :desc => "Rack Handler (default: autodetect)"
@@ -34,8 +41,25 @@ module Spontaneous
34
41
  start_server(:back)
35
42
  end
36
43
 
44
+ desc "#{namespace}:simultaneous", "Launches the Simultaneous server"
45
+ method_option :connection, :type => :string, :aliases => "-c", :desc => "Use CONNECTION"
46
+ def simultaneous
47
+ prepare(:start)
48
+ boot!
49
+ connection = options[:connection] || ::Spontaneous.config.simultaneous_connection
50
+ fork {
51
+ puts("#{Simultaneous.server_binary} -c #{connection} --debug")
52
+ exec("#{Simultaneous.server_binary} -c #{connection} --debug")
53
+ }
54
+ Process.wait
55
+ end
56
+
37
57
  private
38
58
 
59
+ def binary
60
+ ::Spontaneous.gem_dir("bin/spot")
61
+ end
62
+
39
63
  def start_server(mode)
40
64
  prepare mode.to_sym
41
65
  ENV["SPOT_MODE"] = mode.to_s
@@ -7,10 +7,184 @@ module Spontaneous
7
7
 
8
8
  default_task :browse
9
9
 
10
+
11
+ class MySQL
12
+ def initialize(database)
13
+ @database = database
14
+ end
15
+
16
+ def load(path)
17
+ options = [
18
+ "mysql",
19
+ option(:password),
20
+ option(:user),
21
+ option(:default_character_set),
22
+ database_name
23
+ ]
24
+ if path =~ /\.gz$/
25
+ options = ["gunzip", "<", path, "|"].concat(options)
26
+ end
27
+
28
+ command = options.join(" ")
29
+ system(command)
30
+ end
31
+
32
+ def dump(path, tables = nil)
33
+ options = [
34
+ option(:password),
35
+ option(:user),
36
+ option(:default_character_set),
37
+ database_name
38
+ ]
39
+ unless tables.nil?
40
+ options.push(tables.join(" "))
41
+ end
42
+
43
+ options.push( "| gzip") if path =~ /\.gz$/
44
+
45
+ command = %(mysqldump #{options.join(" ")} > #{path} )
46
+ system(command)
47
+ end
48
+
49
+ def database_name
50
+ @database.opts[:database]
51
+ end
52
+
53
+ def user
54
+ @database.opts[:user]
55
+ end
56
+
57
+ def password
58
+ @database.opts[:password]
59
+ end
60
+
61
+ def default_character_set
62
+ "UTF8"
63
+ end
64
+
65
+ def option(option, add_if_nil=false)
66
+ value = self.send(option)
67
+ if !value.nil? or add_if_nil
68
+ "--#{option.to_s.gsub(/_/, '-')}=#{value}"
69
+ else
70
+ ""
71
+ end
72
+ end
73
+ end
74
+
75
+ class DumpTask < ::Thor::Group
76
+ protected
77
+
78
+ def db_adapter
79
+ dumper_class = \
80
+ case database
81
+ when ::Sequel::Mysql2::Database
82
+ MySQL
83
+ else
84
+ raise "Unsupported adapter #{database.class}"
85
+ end
86
+
87
+ unless dumper_class.nil?
88
+ dumper = dumper_class.new(database)
89
+ end
90
+ end
91
+
92
+ def sqldump(path)
93
+ db_adapter.dump(path)
94
+ end
95
+
96
+ def sqlload(path)
97
+ db_adapter.load(path)
98
+ end
99
+
100
+ def id
101
+ @id ||= Time.now.strftime("%Y%m%d%H%M%S")
102
+ end
103
+
104
+ def media_archive
105
+ dump_path / "media.tgz"
106
+ end
107
+
108
+ def database_dumpfile
109
+ dump_path / "database.mysql.gz"
110
+ end
111
+
112
+ def database
113
+ Spontaneous.database
114
+ end
115
+
116
+ def dump_path
117
+ dump_root / id
118
+ end
119
+
120
+ def dump_root
121
+ Spontaneous.cache_dir('dump')
122
+ end
123
+
124
+ def relative_dir(path)
125
+ path = Pathname.new(path)
126
+ path.relative_path_from(Pathname.new(Spontaneous.root)).to_s
127
+ end
128
+ end
129
+
130
+ class Dump < DumpTask
131
+ def create_dump_dir
132
+ ::FileUtils.mkdir_p(dump_path)
133
+ end
134
+
135
+ def dump_database
136
+ say "Creating media archive at '#{relative_dir(database_dumpfile)}'", :green
137
+ sqldump(database_dumpfile)
138
+ end
139
+
140
+ def archive_media
141
+ tmp = relative_dir(Spontaneous.media_dir('tmp'))
142
+ src = relative_dir(Spontaneous.media_dir)
143
+ say "Creating media archive at '#{relative_dir(media_archive)}'", :green
144
+ cmd = %(tar czf #{media_archive} --exclude #{tmp} #{src})
145
+ system(cmd)
146
+ end
147
+ end
148
+
149
+ class Load < DumpTask
150
+ def find_latest_dump
151
+ root = Pathname.new(dump_root)
152
+ @id = root.entries.
153
+ reject { |dir| dir.file? or dir.basename.to_s =~ /^\./ }.
154
+ map { |p| p.to_s }.
155
+ sort.
156
+ last
157
+ end
158
+
159
+ def import_db_data
160
+ say "Importing database from '#{relative_dir(database_dumpfile)}'", :green
161
+ sqlload(database_dumpfile)
162
+ end
163
+
164
+ def extract_media
165
+ say "Extracting media from '#{relative_dir(media_archive)}'", :green
166
+ cmd = %(tar xzf #{media_archive})
167
+ system(cmd)
168
+ end
169
+ end
170
+
171
+ desc "#{namespace}:dump", "Dumps the current site to an archive on the local machine"
172
+ def dump
173
+ prepare :dump
174
+ boot!
175
+ Dump.start
176
+ end
177
+
178
+ desc "#{namespace}:load", "Uploads a dump of the current site to a remote server"
179
+ def load
180
+ prepare :load
181
+ boot!
182
+ Load.start
183
+ end
184
+
10
185
  desc "#{namespace}:publish", "Publishes the site"
11
186
  method_option :changes, :type => :array, :desc => "List of changesets to include"
12
187
  method_option :logfile, :type => :string, :desc => "Location of logfile"
13
-
14
188
  def publish
15
189
  prepare :publish
16
190
  # TODO: set up logging