spontaneous 0.1.0.alpha1 → 0.2.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (413) hide show
  1. data/Gemfile +40 -35
  2. data/LICENSE +20 -0
  3. data/Rakefile +39 -42
  4. data/Readme.markdown +155 -0
  5. data/application/css/definitions.scss +3 -0
  6. data/application/css/editing.scss +9 -4
  7. data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +1 -0
  8. data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +1 -0
  9. data/application/css/min/d1b54ff4847c613618267ca1c15658e2aee0a4e5.css +1 -0
  10. data/application/css/v2.scss +144 -50
  11. data/application/js/add_alias_dialogue.js +18 -8
  12. data/application/js/ajax.js +1 -1
  13. data/application/js/authentication.js +8 -1
  14. data/application/js/box.js +37 -7
  15. data/application/js/box_container.js +1 -1
  16. data/application/js/compatibility.js +7 -0
  17. data/application/js/content.js +7 -0
  18. data/application/js/content_area.js +4 -0
  19. data/application/js/edit_panel.js +44 -18
  20. data/application/js/editing.js +12 -0
  21. data/application/js/event_source.js +17 -0
  22. data/application/js/extensions.js +2 -0
  23. data/application/js/field_types/file_field.js +2 -1
  24. data/application/js/field_types/image_field.js +35 -48
  25. data/application/js/field_types/long_string_field.js +12 -0
  26. data/application/js/field_types/markdown_field.js +2 -5
  27. data/application/js/field_types/string_field.js +5 -1
  28. data/application/js/field_types/webvideo_field.js +15 -0
  29. data/application/js/init.js +1 -0
  30. data/application/js/location.js +30 -19
  31. data/application/js/login.js +1 -2
  32. data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +3 -0
  33. data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +2 -0
  34. data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +3 -0
  35. data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +90 -0
  36. data/application/js/page.js +1 -0
  37. data/application/js/page_entry.js +6 -40
  38. data/application/js/preview.js +2 -3
  39. data/application/js/top_bar.js +76 -31
  40. data/application/js/upload.js +5 -2
  41. data/application/js/upload_manager.js +2 -81
  42. data/application/js/vendor/jquery-1.7.1.min.js +4 -0
  43. data/application/js/vendor/jquery-ui-1.8.16.custom.min.js +791 -0
  44. data/application/js/views.js +3 -3
  45. data/application/js/views/box_view.js +164 -83
  46. data/application/js/views/page_piece_view.js +2 -2
  47. data/application/js/views/page_view.js +46 -15
  48. data/application/js/views/piece_view.js +29 -8
  49. data/application/static/diagonal-texture.png +0 -0
  50. data/application/static/item-buttons-highlight.png +0 -0
  51. data/application/static/plus-box.png +0 -0
  52. data/application/static/plus_alt.svg +8 -0
  53. data/application/static/slot-up-arrow.png +0 -0
  54. data/application/views/{index.erubis → index.erb} +9 -5
  55. data/application/views/{login.erubis → login.erb} +14 -10
  56. data/application/views/schema_modification_error.html.erb +18 -6
  57. data/application/views/{unsupported.erubis → unsupported.erb} +0 -0
  58. data/bin/spot +15 -2
  59. data/db/migrations/20100610142136_init.rb +2 -2
  60. data/db/migrations/20101130104334_timestamps.rb +2 -2
  61. data/db/migrations/20110209152710_users_and_groups.rb +11 -11
  62. data/db/migrations/20120106171423_visibility_path.rb +19 -0
  63. data/db/migrations/20120107124541_owner_id.rb +19 -0
  64. data/docs/recipe-interface-screenshot.png +0 -0
  65. data/lib/cutaneous.rb +11 -10
  66. data/lib/cutaneous/context_helper.rb +119 -14
  67. data/lib/cutaneous/preview_context.rb +4 -3
  68. data/lib/cutaneous/preview_renderer.rb +1 -6
  69. data/lib/cutaneous/publish_context.rb +1 -0
  70. data/lib/cutaneous/{first_pass_renderer.rb → publish_renderer.rb} +2 -6
  71. data/lib/cutaneous/publish_template.rb +62 -0
  72. data/lib/cutaneous/publish_token_parser.rb +8 -0
  73. data/lib/cutaneous/renderer.rb +4 -2
  74. data/lib/cutaneous/request_context.rb +1 -0
  75. data/lib/cutaneous/{second_pass_renderer.rb → request_renderer.rb} +2 -5
  76. data/lib/cutaneous/request_template.rb +11 -0
  77. data/lib/cutaneous/request_token_parser.rb +9 -0
  78. data/lib/cutaneous/token_parser.rb +125 -0
  79. data/lib/sequel/plugins/content_table_inheritance.rb +19 -12
  80. data/lib/sequel/plugins/scoped_table_name.rb +45 -0
  81. data/lib/spontaneous.rb +123 -126
  82. data/lib/spontaneous/box.rb +127 -47
  83. data/lib/spontaneous/box_style.rb +39 -22
  84. data/lib/spontaneous/change.rb +2 -2
  85. data/lib/spontaneous/cli.rb +1 -0
  86. data/lib/spontaneous/cli/base.rb +12 -4
  87. data/lib/spontaneous/cli/console.rb +72 -0
  88. data/lib/spontaneous/cli/server.rb +36 -12
  89. data/lib/spontaneous/cli/site.rb +175 -1
  90. data/lib/spontaneous/collections/box_set.rb +19 -1
  91. data/lib/spontaneous/collections/entry_set.rb +70 -22
  92. data/lib/spontaneous/collections/field_set.rb +3 -3
  93. data/lib/spontaneous/collections/prototype_set.rb +28 -0
  94. data/lib/spontaneous/config.rb +14 -5
  95. data/lib/spontaneous/content.rb +23 -24
  96. data/lib/spontaneous/errors.rb +20 -4
  97. data/lib/spontaneous/extensions/array.rb +2 -2
  98. data/lib/spontaneous/extensions/json.rb +1 -1
  99. data/lib/spontaneous/extensions/nil.rb +13 -0
  100. data/lib/spontaneous/facet.rb +61 -7
  101. data/lib/spontaneous/field_types.rb +1 -3
  102. data/lib/spontaneous/field_types/date_field.rb +1 -0
  103. data/lib/spontaneous/field_types/field.rb +32 -15
  104. data/lib/spontaneous/field_types/image_field.rb +138 -69
  105. data/lib/spontaneous/field_types/location_field.rb +59 -0
  106. data/lib/spontaneous/field_types/long_string_field.rb +13 -0
  107. data/lib/spontaneous/field_types/markdown_field.rb +2 -1
  108. data/lib/spontaneous/field_types/string_field.rb +2 -2
  109. data/lib/spontaneous/field_types/webvideo_field.rb +255 -0
  110. data/lib/spontaneous/generators/page/inline.html.cut +1 -1
  111. data/lib/spontaneous/generators/page/page.html.cut.tt +5 -4
  112. data/lib/spontaneous/generators/page/page.rb.tt +1 -5
  113. data/lib/spontaneous/generators/site.rb +1 -0
  114. data/lib/spontaneous/generators/site/.gitignore +2 -0
  115. data/lib/spontaneous/generators/site/Gemfile.tt +3 -5
  116. data/lib/spontaneous/generators/site/config/environment.rb.tt +1 -0
  117. data/lib/spontaneous/generators/site/config/environments/development.rb.tt +3 -1
  118. data/lib/spontaneous/generators/site/config/environments/production.rb.tt +3 -1
  119. data/lib/spontaneous/generators/site/config/indexes.rb.tt +23 -0
  120. data/lib/spontaneous/generators/site/public/css/{site.css → site.scss} +0 -0
  121. data/lib/spontaneous/generators/site/schema/box.rb.tt +5 -0
  122. data/lib/spontaneous/generators/site/templates/layouts/standard.html.cut.tt +11 -5
  123. data/lib/spontaneous/image_size.rb +0 -1
  124. data/lib/spontaneous/loader.rb +335 -218
  125. data/lib/spontaneous/logger.rb +7 -2
  126. data/lib/spontaneous/media.rb +64 -59
  127. data/lib/spontaneous/media/file.rb +74 -0
  128. data/lib/spontaneous/page.rb +47 -18
  129. data/lib/spontaneous/page_piece.rb +29 -27
  130. data/lib/spontaneous/paths.rb +0 -1
  131. data/lib/spontaneous/permissions.rb +3 -21
  132. data/lib/spontaneous/permissions/user.rb +5 -1
  133. data/lib/spontaneous/permissions/user_level.rb +6 -7
  134. data/lib/spontaneous/piece.rb +12 -7
  135. data/lib/spontaneous/plugins/aliases.rb +76 -31
  136. data/lib/spontaneous/plugins/allowed_types.rb +36 -37
  137. data/lib/spontaneous/plugins/application/facets.rb +7 -10
  138. data/lib/spontaneous/plugins/application/features.rb +17 -0
  139. data/lib/spontaneous/plugins/application/paths.rb +25 -31
  140. data/lib/spontaneous/plugins/application/render.rb +1 -5
  141. data/lib/spontaneous/plugins/application/serialisation.rb +2 -0
  142. data/lib/spontaneous/plugins/application/state.rb +6 -9
  143. data/lib/spontaneous/plugins/boxes.rb +65 -40
  144. data/lib/spontaneous/plugins/controllers.rb +22 -22
  145. data/lib/spontaneous/plugins/entries.rb +149 -150
  146. data/lib/spontaneous/plugins/entry.rb +50 -35
  147. data/lib/spontaneous/plugins/field/editor_class.rb +13 -0
  148. data/lib/spontaneous/plugins/fields.rb +41 -33
  149. data/lib/spontaneous/plugins/instance_code.rb +9 -9
  150. data/lib/spontaneous/plugins/layouts.rb +31 -35
  151. data/lib/spontaneous/plugins/media.rb +31 -32
  152. data/lib/spontaneous/plugins/page/formats.rb +56 -31
  153. data/lib/spontaneous/plugins/page/request.rb +15 -9
  154. data/lib/spontaneous/plugins/page_search.rb +30 -31
  155. data/lib/spontaneous/plugins/page_tree.rb +59 -12
  156. data/lib/spontaneous/plugins/paths.rb +84 -79
  157. data/lib/spontaneous/plugins/permissions.rb +26 -28
  158. data/lib/spontaneous/plugins/prototypes.rb +42 -37
  159. data/lib/spontaneous/plugins/publishing.rb +50 -94
  160. data/lib/spontaneous/plugins/render.rb +8 -16
  161. data/lib/spontaneous/plugins/schema_hierarchy.rb +20 -21
  162. data/lib/spontaneous/plugins/schema_id.rb +33 -25
  163. data/lib/spontaneous/plugins/schema_title.rb +3 -4
  164. data/lib/spontaneous/plugins/serialisation.rb +32 -35
  165. data/lib/spontaneous/plugins/site/features.rb +32 -0
  166. data/lib/spontaneous/plugins/site/instance.rb +3 -2
  167. data/lib/spontaneous/plugins/site/level.rb +18 -0
  168. data/lib/spontaneous/plugins/site/map.rb +2 -1
  169. data/lib/spontaneous/plugins/site/publishing.rb +56 -59
  170. data/lib/spontaneous/plugins/site/revisions.rb +24 -19
  171. data/lib/spontaneous/plugins/site/schema.rb +33 -0
  172. data/lib/spontaneous/plugins/site/search.rb +43 -0
  173. data/lib/spontaneous/plugins/site/selectors.rb +35 -30
  174. data/lib/spontaneous/plugins/site/storage.rb +63 -0
  175. data/lib/spontaneous/plugins/site_map.rb +23 -25
  176. data/lib/spontaneous/plugins/styles.rb +35 -43
  177. data/lib/spontaneous/plugins/supertype.rb +3 -1
  178. data/lib/spontaneous/plugins/visibility.rb +90 -83
  179. data/lib/spontaneous/prototypes/box_prototype.rb +55 -25
  180. data/lib/spontaneous/prototypes/field_prototype.rb +66 -19
  181. data/lib/spontaneous/prototypes/style_prototype.rb +2 -2
  182. data/lib/spontaneous/publishing.rb +1 -1
  183. data/lib/spontaneous/publishing/immediate.rb +128 -49
  184. data/lib/spontaneous/publishing/simultaneous.rb +70 -0
  185. data/lib/spontaneous/rack.rb +38 -26
  186. data/lib/spontaneous/rack/around_back.rb +3 -23
  187. data/lib/spontaneous/rack/around_preview.rb +3 -8
  188. data/lib/spontaneous/rack/assets.rb +7 -6
  189. data/lib/spontaneous/rack/authentication.rb +21 -0
  190. data/lib/spontaneous/rack/back.rb +310 -331
  191. data/lib/spontaneous/rack/cacheable_file.rb +27 -0
  192. data/lib/spontaneous/rack/cookie_authentication.rb +38 -0
  193. data/lib/spontaneous/rack/css.rb +43 -0
  194. data/lib/spontaneous/rack/event_source.rb +31 -0
  195. data/lib/spontaneous/rack/front.rb +30 -8
  196. data/lib/spontaneous/rack/helpers.rb +31 -0
  197. data/lib/spontaneous/rack/media.rb +22 -21
  198. data/lib/spontaneous/rack/public.rb +2 -1
  199. data/lib/spontaneous/rack/query_authentication.rb +35 -0
  200. data/lib/spontaneous/rack/reloader.rb +6 -3
  201. data/lib/spontaneous/rack/user_helpers.rb +28 -0
  202. data/lib/spontaneous/render.rb +64 -23
  203. data/lib/spontaneous/render/context_base.rb +143 -0
  204. data/lib/spontaneous/render/format.rb +24 -19
  205. data/lib/spontaneous/render/helpers.rb +14 -0
  206. data/lib/spontaneous/render/helpers/html_helper.rb +69 -0
  207. data/lib/spontaneous/render/helpers/script_helper.rb +17 -0
  208. data/lib/spontaneous/render/helpers/stylesheet_helper.rb +16 -0
  209. data/lib/spontaneous/render/preview_context.rb +8 -0
  210. data/lib/spontaneous/render/preview_renderer.rb +6 -0
  211. data/lib/spontaneous/render/publish_context.rb +22 -0
  212. data/lib/spontaneous/render/published_renderer.rb +12 -13
  213. data/lib/spontaneous/render/publishing_renderer.rb +3 -0
  214. data/lib/spontaneous/render/render_cache.rb +26 -0
  215. data/lib/spontaneous/render/renderer.rb +5 -1
  216. data/lib/spontaneous/render/request_context.rb +8 -0
  217. data/lib/spontaneous/schema.rb +56 -24
  218. data/lib/spontaneous/schema/schema_modification.rb +2 -2
  219. data/lib/spontaneous/schema/uid.rb +22 -106
  220. data/lib/spontaneous/schema/uid_map.rb +120 -0
  221. data/lib/spontaneous/search.rb +11 -0
  222. data/lib/spontaneous/search/compound_indexer.rb +26 -0
  223. data/lib/spontaneous/search/database.rb +72 -0
  224. data/lib/spontaneous/search/field.rb +95 -0
  225. data/lib/spontaneous/search/index.rb +184 -0
  226. data/lib/spontaneous/search/results.rb +34 -0
  227. data/lib/spontaneous/server.rb +5 -1
  228. data/lib/spontaneous/site.rb +56 -16
  229. data/lib/spontaneous/storage.rb +22 -0
  230. data/lib/spontaneous/storage/backend.rb +10 -0
  231. data/lib/spontaneous/storage/cloud.rb +104 -0
  232. data/lib/spontaneous/storage/local.rb +52 -0
  233. data/lib/spontaneous/style.rb +27 -9
  234. data/lib/spontaneous/version.rb +1 -1
  235. data/spontaneous.gemspec +719 -0
  236. data/test/disabled/test_slots.rb +1 -1
  237. data/test/experimental/test_cutaneous.rb +309 -0
  238. data/test/experimental/test_features.rb +129 -0
  239. data/test/fixtures/application/views/{index.erubis → index.erb} +0 -0
  240. data/test/fixtures/back/public/css/sass_include.scss +5 -0
  241. data/test/fixtures/back/public/css/sass_template.scss +4 -0
  242. data/test/fixtures/example_application/templates/client_project.html.cut +4 -4
  243. data/test/fixtures/example_application/templates/client_project/images.html.cut +1 -1
  244. data/test/fixtures/example_application/templates/client_projects.html.cut +2 -2
  245. data/test/fixtures/example_application/templates/inline_image.html.cut +1 -1
  246. data/test/fixtures/example_application/templates/layouts/home.html.cut +7 -7
  247. data/test/fixtures/example_application/templates/layouts/info.html.cut +1 -1
  248. data/test/fixtures/example_application/templates/layouts/project.html.cut +4 -4
  249. data/test/fixtures/example_application/templates/layouts/projects.html.cut +2 -2
  250. data/test/fixtures/example_application/templates/project.html.cut +2 -2
  251. data/test/fixtures/example_application/templates/project/inline.html.cut +3 -3
  252. data/test/fixtures/example_application/templates/project_image.html.cut +1 -1
  253. data/test/fixtures/example_application/templates/text.html.cut +1 -1
  254. data/test/fixtures/fields/youtube_api_response.xml +102 -0
  255. data/test/fixtures/layouts/layouts/custom4.html.cut +0 -0
  256. data/test/fixtures/plugins/schema_plugin/public/css/plugin.css +1 -0
  257. data/test/fixtures/plugins/schema_plugin/public/js/plugin.js +1 -0
  258. data/test/fixtures/plugins/schema_plugin/public/static.html +1 -0
  259. data/test/fixtures/plugins/schema_plugin/public/subdir/image.gif +1 -0
  260. data/test/fixtures/plugins/schema_plugin/public/subdir/include1.scss +3 -0
  261. data/test/fixtures/plugins/schema_plugin/public/subdir/sass.scss +4 -0
  262. data/test/fixtures/plugins/schema_plugin/public/subdir/sass/include2.scss +4 -0
  263. data/test/fixtures/public/templates/layouts/default.html.cut +1 -1
  264. data/test/fixtures/public/templates/layouts/default.pdf.cut +1 -1
  265. data/test/fixtures/public/templates/layouts/default.rss.cut +1 -1
  266. data/test/fixtures/public/templates/layouts/dynamic.html.cut +1 -1
  267. data/test/fixtures/schema_modification/config/database.yml +0 -0
  268. data/test/fixtures/schema_modification/config/environment.rb +2 -0
  269. data/test/fixtures/schema_modification/schema/box.rb +1 -0
  270. data/test/fixtures/schema_modification/schema/custom_box.rb +1 -0
  271. data/test/fixtures/schema_modification/schema/page.rb +6 -0
  272. data/test/fixtures/schema_modification/schema/piece.rb +1 -0
  273. data/test/fixtures/search/config/database.yml +1 -0
  274. data/test/fixtures/search/config/indexes.rb +4 -0
  275. data/test/fixtures/serialisation/root_hash.yaml.erb +16 -20
  276. data/test/fixtures/storage/cloud/environment.rb +12 -0
  277. data/test/fixtures/storage/default/environment.rb +1 -0
  278. data/test/fixtures/templates/aliases/layouts/c_alias.html.cut +1 -1
  279. data/test/fixtures/templates/content/include.html.cut +1 -1
  280. data/test/fixtures/templates/content/include_dir.html.cut +1 -1
  281. data/test/fixtures/templates/content/included.epub.cut +1 -1
  282. data/test/fixtures/templates/content/included.html.cut +1 -1
  283. data/test/fixtures/templates/content/partial/included.html.cut +1 -1
  284. data/test/fixtures/templates/content/preprocess.html.cut +1 -1
  285. data/test/fixtures/templates/content/second.html.cut +1 -1
  286. data/test/fixtures/templates/content/template.epub.cut +1 -1
  287. data/test/fixtures/templates/content/template.html.cut +1 -1
  288. data/test/fixtures/templates/default_style_class.html.cut +1 -1
  289. data/test/fixtures/templates/engine/braces.html.cut +6 -0
  290. data/test/fixtures/templates/engine/multiline.html.cut +5 -0
  291. data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
  292. data/test/fixtures/templates/extended/main.html.cut +5 -5
  293. data/test/fixtures/templates/extended/parent.html.cut +10 -8
  294. data/test/fixtures/templates/extended/partial.html.cut +1 -0
  295. data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -0
  296. data/test/fixtures/templates/extended/with_includes.html.cut +9 -0
  297. data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +9 -0
  298. data/test/fixtures/templates/layouts/entries.html.cut +7 -7
  299. data/test/fixtures/templates/layouts/page_style.html.cut +1 -1
  300. data/test/fixtures/templates/layouts/params.html.cut +1 -1
  301. data/test/fixtures/templates/layouts/preview_render.html.cut +2 -2
  302. data/test/fixtures/templates/layouts/standard_page.html.cut +1 -1
  303. data/test/fixtures/templates/layouts/subdir_style.html.cut +1 -1
  304. data/test/fixtures/templates/layouts/template_params.html.cut +1 -1
  305. data/test/fixtures/templates/layouts/variables.html.cut +7 -0
  306. data/test/fixtures/templates/page_class/inline_style.html.cut +1 -1
  307. data/test/fixtures/templates/preview_render/variables.html.cut +1 -0
  308. data/test/fixtures/templates/publishing/templates/layouts/dynamic.html.cut +1 -0
  309. data/test/fixtures/templates/publishing/templates/layouts/dynamic.rtf.cut +1 -0
  310. data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -0
  311. data/test/fixtures/templates/template_class/anonymous_style.html.cut +2 -2
  312. data/test/fixtures/templates/template_class/complex_template.html.cut +4 -4
  313. data/test/fixtures/templates/template_class/complex_template.pdf.cut +4 -4
  314. data/test/fixtures/templates/template_class/default_template_style.html.cut +2 -2
  315. data/test/fixtures/templates/template_class/images_with_template.html.cut +3 -3
  316. data/test/fixtures/templates/template_class/slots_template.html.cut +3 -3
  317. data/test/fixtures/templates/template_class/slots_template.pdf.cut +3 -3
  318. data/test/fixtures/templates/template_class/this_template.epub.cut +1 -1
  319. data/test/fixtures/templates/template_class/this_template.html.cut +1 -1
  320. data/test/fixtures/templates/template_class/this_template.pdf.cut +1 -1
  321. data/test/fixtures/templates/with_default_style_class.html.cut +1 -1
  322. data/test/functional/test_application.rb +19 -15
  323. data/test/functional/test_back.rb +130 -98
  324. data/test/functional/test_front.rb +72 -28
  325. data/test/javascript/test_dom.rb +1 -1
  326. data/test/javascript/test_markdown.rb +1 -1
  327. data/test/slow/test_publishing.rb +94 -75
  328. data/test/slow/test_visibility.rb +47 -14
  329. data/test/test_helper.rb +30 -3
  330. data/test/ui/test_page_editing.rb +1 -1
  331. data/test/unit/test_alias.rb +200 -16
  332. data/test/unit/test_authentication.rb +26 -28
  333. data/test/unit/test_boxes.rb +146 -75
  334. data/test/unit/test_config.rb +42 -20
  335. data/test/unit/test_content.rb +156 -37
  336. data/test/unit/test_content_inheritance.rb +4 -2
  337. data/test/unit/test_extensions.rb +7 -1
  338. data/test/unit/test_fields.rb +558 -290
  339. data/test/{experimental → unit}/test_formats.rb +42 -3
  340. data/test/unit/test_generators.rb +3 -2
  341. data/test/unit/test_helpers.rb +54 -0
  342. data/test/unit/test_image_size.rb +1 -1
  343. data/test/unit/test_images.rb +51 -40
  344. data/test/unit/test_layouts.rb +21 -4
  345. data/test/unit/test_logger.rb +1 -1
  346. data/test/unit/test_media.rb +165 -7
  347. data/test/unit/test_page.rb +158 -27
  348. data/test/unit/test_permissions.rb +170 -187
  349. data/test/unit/test_piece.rb +27 -9
  350. data/test/unit/test_plugins.rb +153 -0
  351. data/test/unit/test_prototype_set.rb +60 -2
  352. data/test/unit/test_prototypes.rb +81 -20
  353. data/test/unit/test_render.rb +97 -9
  354. data/test/unit/test_schema.rb +167 -120
  355. data/test/unit/test_search.rb +588 -0
  356. data/test/unit/test_serialisation.rb +26 -10
  357. data/test/unit/test_site.rb +42 -25
  358. data/test/unit/test_storage.rb +88 -0
  359. data/test/unit/test_structure.rb +11 -5
  360. data/test/unit/test_styles.rb +64 -3
  361. data/test/unit/test_table_scoping.rb +76 -0
  362. data/test/unit/test_templates.rb +69 -31
  363. data/test/unit/test_type_hierarchy.rb +9 -1
  364. metadata +274 -208
  365. data/Gemfile.lock +0 -146
  366. data/application/css/min/54ee0ed3c7fac7632bd5c020d69e9a2503e0c88c.css +0 -1
  367. data/application/css/min/c256adc144e2bdd0b0539356b04eb62db01e1dc3.css +0 -1
  368. data/application/js/edit_dialogue.js +0 -137
  369. data/application/js/min/492a209de8ee955fa9c729a765377495001e11b1.js +0 -17
  370. data/application/js/min/80f684d77c940887a1d4a63e3a96102e993baa98.js +0 -88
  371. data/application/js/min/c7140ec9475e5bf868b901e0621338d7d162358b.js +0 -3
  372. data/application/js/min/f07f2bd6630ee31e1c2288ec223383d8f0658ba6.js +0 -2
  373. data/application/js/vendor/.DS_Store +0 -0
  374. data/application/js/vendor/JS.Class-2.1.5/src/command.js +0 -93
  375. data/application/js/vendor/JS.Class-2.1.5/src/comparable.js +0 -37
  376. data/application/js/vendor/JS.Class-2.1.5/src/constant_scope.js +0 -48
  377. data/application/js/vendor/JS.Class-2.1.5/src/core.js +0 -1060
  378. data/application/js/vendor/JS.Class-2.1.5/src/decorator.js +0 -50
  379. data/application/js/vendor/JS.Class-2.1.5/src/enumerable.js +0 -505
  380. data/application/js/vendor/JS.Class-2.1.5/src/forwardable.js +0 -22
  381. data/application/js/vendor/JS.Class-2.1.5/src/hash.js +0 -334
  382. data/application/js/vendor/JS.Class-2.1.5/src/linked_list.js +0 -114
  383. data/application/js/vendor/JS.Class-2.1.5/src/loader.js +0 -553
  384. data/application/js/vendor/JS.Class-2.1.5/src/method_chain.js +0 -172
  385. data/application/js/vendor/JS.Class-2.1.5/src/observable.js +0 -55
  386. data/application/js/vendor/JS.Class-2.1.5/src/package.js +0 -472
  387. data/application/js/vendor/JS.Class-2.1.5/src/proxy.js +0 -58
  388. data/application/js/vendor/JS.Class-2.1.5/src/ruby.js +0 -44
  389. data/application/js/vendor/JS.Class-2.1.5/src/set.js +0 -332
  390. data/application/js/vendor/JS.Class-2.1.5/src/stack_trace.js +0 -151
  391. data/application/js/vendor/JS.Class-2.1.5/src/state.js +0 -95
  392. data/application/js/vendor/JS.Class-2.1.5/src/stdlib.js +0 -2612
  393. data/application/js/vendor/jquery-1.4.2.min.js +0 -154
  394. data/application/js/vendor/jquery-1.4.3.min.js +0 -166
  395. data/application/js/vendor/jquery-1.5.1.min.js +0 -16
  396. data/application/js/vendor/jquery-1.5.1rc1.min.js +0 -24
  397. data/application/js/vendor/jquery-ui-1.8.6.custom.min.js +0 -265
  398. data/application/js/vendor/jquery-ui-1.8.custom.min.js +0 -106
  399. data/application/js/vendor/jquery.hotkeys-0.7.9.js +0 -248
  400. data/application/js/vendor/jquery.hotkeys-0.7.9.min.js +0 -19
  401. data/application/js/vendor/jsdiff.js +0 -169
  402. data/lib/cutaneous/first_pass_parser.rb +0 -23
  403. data/lib/cutaneous/parser_core.rb +0 -18
  404. data/lib/cutaneous/second_pass_parser.rb +0 -23
  405. data/lib/sequel/plugins/yajl_serialization.rb +0 -154
  406. data/lib/spontaneous/plugins.rb +0 -20
  407. data/lib/spontaneous/proxy_object.rb +0 -12
  408. data/lib/spontaneous/publishing/fire_and_forget.rb +0 -57
  409. data/lib/spontaneous/render/context.rb +0 -100
  410. data/spontaneous.gemspec.tmpl +0 -66
  411. data/test/experimental/test_plugins.rb +0 -64
  412. data/test/fixtures/templates/publishing/layouts/dynamic.html.cut +0 -1
  413. data/test/fixtures/templates/publishing/layouts/static.html.cut +0 -1
@@ -1,58 +0,0 @@
1
- if (JS.Proxy === undefined) JS.Proxy = {};
2
-
3
- JS.Proxy.Virtual = new JS.Class('Proxy.Virtual', {
4
- initialize: function(klass) {
5
- var bridge = function() {},
6
- proxy = new JS.Class(),
7
- delegators = {},
8
- method, func;
9
-
10
- bridge.prototype = klass.prototype;
11
-
12
- for (method in klass.prototype) {
13
- func = klass.prototype[method];
14
- if (JS.isFn(func) && func !== klass) func = this.klass.forward(method);
15
- delegators[method] = func;
16
- }
17
-
18
- proxy.include({
19
- initialize: function() {
20
- var args = arguments,
21
- subject = null;
22
-
23
- this.__getSubject__ = function() {
24
- subject = new bridge;
25
- klass.apply(subject, args);
26
- return (this.__getSubject__ = function() { return subject; })();
27
- };
28
- },
29
- klass: klass,
30
- constructor: klass
31
- }, false);
32
-
33
- proxy.include(new JS.Module(delegators), false);
34
- proxy.include(this.klass.InstanceMethods, true);
35
- return proxy;
36
- },
37
-
38
- extend: {
39
- forward: function(name) {
40
- return function() {
41
- var subject = this.__getSubject__();
42
- return subject[name].apply(subject, arguments);
43
- };
44
- },
45
-
46
- InstanceMethods: new JS.Module({
47
- extend: function(source) {
48
- this.__getSubject__().extend(source);
49
- var method, func;
50
- for (method in source) {
51
- func = source[method];
52
- if (JS.isFn(func)) func = JS.Proxy.Virtual.forward(method);
53
- this[method] = func;
54
- }
55
- }
56
- })
57
- }
58
- });
@@ -1,44 +0,0 @@
1
- JS.Ruby = function(klass, define) {
2
- define.call(new JS.Ruby.ClassBuilder(klass));
3
- };
4
-
5
- JS.extend(JS.Ruby, {
6
- extendDSL: function(builder, source) {
7
- for (var method in source) {
8
- if (builder[method] || !JS.isFn(source[method])) continue;
9
- this.addMethod(builder, source, method);
10
- }
11
- },
12
-
13
- addMethod: function(builder, source, method) {
14
- builder[method] = function() {
15
- var result = source[method].apply(source, arguments);
16
- JS.Ruby.extendDSL(builder, source);
17
- return result;
18
- };
19
- },
20
-
21
- alias: function(object, builder) {
22
- return function(newName, oldName) {
23
- var old = object[oldName];
24
- if (old !== undefined) this.def(newName, old);
25
- if (builder) JS.Ruby.extendDSL(builder, object);
26
- };
27
- },
28
-
29
- ClassBuilder: function(klass) {
30
- this.def = klass.method('define');
31
- this.alias = JS.Ruby.alias(klass.prototype);
32
-
33
- this.self = {
34
- def: JS.bind(function(name, method) {
35
- var def = {}; def[name] = method;
36
- klass.extend(def);
37
- JS.Ruby.extendDSL(this, klass);
38
- }, this),
39
- alias: JS.Ruby.alias(klass, this)
40
- };
41
-
42
- JS.Ruby.extendDSL(this, klass);
43
- }
44
- });
@@ -1,332 +0,0 @@
1
- JS.Set = new JS.Class('Set', {
2
- extend: {
3
- forEach: function(list, block, context) {
4
- if (!list || !block) return;
5
- if (list.forEach) return list.forEach(block, context);
6
- for (var i = 0, n = list.length; i < n; i++) {
7
- if (list[i] !== undefined)
8
- block.call(context || null, list[i], i);
9
- }
10
- }
11
- },
12
-
13
- include: JS.Enumerable || {},
14
-
15
- initialize: function(list, block, context) {
16
- this.clear();
17
- if (block) this.klass.forEach(list, function(item) {
18
- this.add(block.call(context || null, item));
19
- }, this);
20
- else this.merge(list);
21
- },
22
-
23
- forEach: function(block, context) {
24
- if (!block) return this.enumFor('forEach');
25
- block = JS.Enumerable.toFn(block);
26
-
27
- this.klass.forEach(this._members, block, context);
28
- return this;
29
- },
30
-
31
- add: function(item) {
32
- if (this.contains(item)) return false;
33
- this._members.push(item);
34
- this.length = this.size = this._members.length;
35
- return true;
36
- },
37
-
38
- classify: function(block, context) {
39
- if (!block) return this.enumFor('classify');
40
- block = JS.Enumerable.toFn(block);
41
-
42
- var classes = new JS.Hash();
43
- this.forEach(function(item) {
44
- var value = block.call(context || null, item);
45
- if (!classes.hasKey(value)) classes.store(value, new this.klass);
46
- classes.get(value).add(item);
47
- }, this);
48
- return classes;
49
- },
50
-
51
- clear: function() {
52
- this._members = [];
53
- this.length = this.size = 0;
54
- },
55
-
56
- complement: function(other) {
57
- var set = new this.klass;
58
- this.klass.forEach(other, function(item) {
59
- if (!this.contains(item)) set.add(item);
60
- }, this);
61
- return set;
62
- },
63
-
64
- contains: function(item) {
65
- return this._indexOf(item) !== -1;
66
- },
67
-
68
- difference: function(other) {
69
- other = JS.isType(other, JS.Set) ? other : new JS.Set(other);
70
- var set = new this.klass;
71
- this.forEach(function(item) {
72
- if (!other.contains(item)) set.add(item);
73
- });
74
- return set;
75
- },
76
-
77
- divide: function(block, context) {
78
- if (!block) return this.enumFor('divide');
79
- block = JS.Enumerable.toFn(block);
80
-
81
- var classes = this.classify(block, context),
82
- sets = new this.klass;
83
-
84
- classes.forEachValue(sets.method('add'));
85
- return sets;
86
- },
87
-
88
- equals: function(other) {
89
- if (this.length !== other.length || !JS.isType(other, JS.Set)) return false;
90
- var result = true;
91
- this.forEach(function(item) {
92
- if (!result) return;
93
- if (!other.contains(item)) result = false;
94
- });
95
- return result;
96
- },
97
-
98
- hash: function() {
99
- var hashes = [];
100
- this.forEach(function(object) { hashes.push(JS.Hash.codeFor(object)) });
101
- return hashes.sort().join('');
102
- },
103
-
104
- flatten: function(set) {
105
- var copy = new this.klass;
106
- copy._members = this._members;
107
- if (!set) { set = this; set.clear(); }
108
- copy.forEach(function(item) {
109
- if (JS.isType(item, JS.Set)) item.flatten(set);
110
- else set.add(item);
111
- });
112
- return set;
113
- },
114
-
115
- intersection: function(other) {
116
- var set = new this.klass;
117
- this.klass.forEach(other, function(item) {
118
- if (this.contains(item)) set.add(item);
119
- }, this);
120
- return set;
121
- },
122
-
123
- isEmpty: function() {
124
- return this._members.length === 0;
125
- },
126
-
127
- isProperSubset: function(other) {
128
- return this._members.length < other._members.length && this.isSubset(other);
129
- },
130
-
131
- isProperSuperset: function(other) {
132
- return this._members.length > other._members.length && this.isSuperset(other);
133
- },
134
-
135
- isSubset: function(other) {
136
- var result = true;
137
- this.forEach(function(item) {
138
- if (!result) return;
139
- if (!other.contains(item)) result = false;
140
- });
141
- return result;
142
- },
143
-
144
- isSuperset: function(other) {
145
- return other.isSubset(this);
146
- },
147
-
148
- merge: function(list) {
149
- this.klass.forEach(list, function(item) { this.add(item) }, this);
150
- },
151
-
152
- product: function(other) {
153
- var pairs = new JS.Set;
154
- this.forEach(function(item) {
155
- this.klass.forEach(other, function(partner) {
156
- pairs.add([item, partner]);
157
- });
158
- }, this);
159
- return pairs;
160
- },
161
-
162
- rebuild: function() {
163
- var members = this._members;
164
- this.clear();
165
- this.merge(members);
166
- },
167
-
168
- remove: function(item) {
169
- var index = this._indexOf(item);
170
- if (index === -1) return;
171
- this._members.splice(index, 1);
172
- this.length = this.size = this._members.length;
173
- },
174
-
175
- removeIf: function(block, context) {
176
- if (!block) return this.enumFor('removeIf');
177
- block = JS.Enumerable.toFn(block);
178
-
179
- var members = this._members,
180
- i = members.length;
181
-
182
- while (i--) {
183
- if (block.call(context || null, members[i]))
184
- this.remove(members[i]);
185
- }
186
- return this;
187
- },
188
-
189
- replace: function(other) {
190
- this.clear();
191
- this.merge(other);
192
- },
193
-
194
- subtract: function(list) {
195
- this.klass.forEach(list, function(item) {
196
- this.remove(item);
197
- }, this);
198
- },
199
-
200
- union: function(other) {
201
- var set = new this.klass;
202
- set.merge(this);
203
- set.merge(other);
204
- return set;
205
- },
206
-
207
- xor: function(other) {
208
- var set = new JS.Set(other);
209
- this.forEach(function(item) {
210
- set[set.contains(item) ? 'remove' : 'add'](item);
211
- });
212
- return set;
213
- },
214
-
215
- _indexOf: function(item) {
216
- var i = this._members.length,
217
- equal = JS.Enumerable.areEqual;
218
-
219
- while (i--) {
220
- if (equal(item, this._members[i])) return i;
221
- }
222
- return -1;
223
- }
224
- });
225
-
226
- JS.Set.include({
227
- n: JS.Set.instanceMethod('intersection'),
228
- u: JS.Set.instanceMethod('union'),
229
- x: JS.Set.instanceMethod('product')
230
- }, false);
231
-
232
- JS.SortedSet = new JS.Class('SortedSet', JS.Set, {
233
- extend: {
234
- compare: function(one, another) {
235
- return JS.isType(one, Object)
236
- ? one.compareTo(another)
237
- : (one < another ? -1 : (one > another ? 1 : 0));
238
- }
239
- },
240
-
241
- add: function(item) {
242
- var point = this._indexOf(item, true);
243
- if (point === null) return;
244
- this._members.splice(point, 0, item);
245
- this.length = this.size = this._members.length;
246
- },
247
-
248
- _indexOf: function(item, insertionPoint) {
249
- var items = this._members,
250
- n = items.length,
251
- i = 0,
252
- d = n,
253
- compare = this.klass.compare,
254
- equal = JS.Enumerable.areEqual,
255
- found;
256
-
257
- if (n === 0) return insertionPoint ? 0 : -1;
258
-
259
- if (compare(item, items[0]) < 1) { d = 0; i = 0; }
260
- if (compare(item, items[n-1]) > 0) { d = 0; i = n; }
261
-
262
- while (!equal(item, items[i]) && d > 0.5) {
263
- d = d / 2;
264
- i += (compare(item, items[i]) > 0 ? 1 : -1) * Math.round(d);
265
- if (i > 0 && compare(item, items[i-1]) > 0 && compare(item, items[i]) < 1) d = 0;
266
- }
267
-
268
- // The pointer will end up at the start of any homogenous section. Step
269
- // through the section until we find the needle or until the section ends.
270
- while (items[i] && !equal(item, items[i]) &&
271
- compare(item, items[i]) === 0) i += 1;
272
-
273
- found = equal(item, items[i]);
274
- return insertionPoint
275
- ? (found ? null : i)
276
- : (found ? i : -1);
277
- }
278
- });
279
-
280
- JS.HashSet = new JS.Class('HashSet', JS.Set, {
281
- forEach: function(block, context) {
282
- if (!block) return this.enumFor('forEach');
283
- block = JS.Enumerable.toFn(block);
284
-
285
- this._members.forEachKey(block, context);
286
- return this;
287
- },
288
-
289
- add: function(item) {
290
- if (this.contains(item)) return false;
291
- this._members.store(item, true);
292
- this.length = this.size = this._members.length;
293
- return true;
294
- },
295
-
296
- clear: function() {
297
- this._members = new JS.Hash();
298
- this.size = this.length = 0;
299
- },
300
-
301
- contains: function(item) {
302
- return this._members.hasKey(item);
303
- },
304
-
305
- rebuild: function() {
306
- this._members.rehash();
307
- this.length = this.size = this._members.length;
308
- },
309
-
310
- remove: function(item) {
311
- this._members.remove(item);
312
- this.length = this.size = this._members.length;
313
- },
314
-
315
- removeIf: function(block, context) {
316
- if (!block) return this.enumFor('removeIf');
317
- block = JS.Enumerable.toFn(block);
318
-
319
- this._members.removeIf(function(pair) {
320
- return block.call(context || null, pair.key);
321
- });
322
- this.length = this.size = this._members.length;
323
- return this;
324
- }
325
- });
326
-
327
- JS.Enumerable.include({
328
- toSet: function(klass, block, context) {
329
- klass = klass || JS.Set;
330
- return new klass(this, block, context);
331
- }
332
- }, true);
@@ -1,151 +0,0 @@
1
- JS.StackTrace = new JS.Module('StackTrace', {
2
- extend: {
3
- included: function(base) {
4
- var module = base.__mod__ || base,
5
- self = this,
6
- method;
7
-
8
- module.extend({define: function(name, func) {
9
- if (!JS.isFn(func)) return this.callSuper();
10
- var wrapper = self.wrap(func, module, name);
11
- return this.callSuper(name, wrapper);
12
- } });
13
-
14
- for (method in module.__fns__)
15
- module.define(method, module.__fns__[method], false);
16
- module.resolve();
17
-
18
- if (!module.__nom__) setTimeout(function() {
19
- module.__nom__ = self.nameOf(base);
20
- }, 1);
21
- },
22
-
23
- nameOf: function(object, root) {
24
- var results = [], i, n, field, l;
25
-
26
- if (JS.isType(object, Array)) {
27
- for (i = 0, n = object.length; i < n; i++)
28
- results.push(this.nameOf(object[i]));
29
- return results;
30
- }
31
-
32
- if (object.__nom__) return object.__nom__;
33
-
34
- field = [{name: null, o: root || this.root}];
35
- l = 0;
36
- while (typeof field === 'object' && l < this.maxDepth) {
37
- l += 1;
38
- field = this.descend(field, object);
39
- }
40
- if (typeof field == 'string') {
41
- field = field.replace(/\.prototype\./g, '#');
42
- object.__nom__ = field;
43
- if (object.__meta__) object.__meta__.__nom__ = field + '.__meta__';
44
- }
45
- return object.__nom__;
46
- },
47
-
48
- descend: function(list, needle) {
49
- var results = [],
50
- n = list.length,
51
- i = n,
52
- key, item, name;
53
-
54
- while (i--) {
55
- item = list[i];
56
- if (n > 1 && JS.indexOf(this.excluded, item.o) !== -1) continue;
57
- if (JS.isType(item.o, Array)) continue;
58
- name = item.name ? item.name + '.' : '';
59
- for (key in item.o) {
60
- if (needle && item.o[key] === needle) return name + key;
61
- results.push({name: name + key, o: item.o[key]});
62
- }
63
- }
64
- return results;
65
- },
66
-
67
- root: this,
68
- excluded: [],
69
- maxDepth: 8,
70
- logLevel: 'full',
71
-
72
- stack: new JS.Singleton({
73
- _list: [],
74
-
75
- indent: function() {
76
- var indent = '',
77
- n = this._list.length;
78
-
79
- while (n--) indent += '| ';
80
- return indent;
81
- },
82
-
83
- push: function(name, object, args) {
84
- if (JS.StackTrace.logLevel === 'full') window.console &&
85
- console.log(this.indent() + name + '(', args, ')');
86
- this._list.push({name: name, object: object, args: args});
87
- },
88
-
89
- pop: function(result) {
90
- var name = this._list.pop().name;
91
- if (JS.StackTrace.logLevel === 'full') window.console &&
92
- console.log(this.indent() + name + '() --> ', result);
93
- return name;
94
- },
95
-
96
- top: function() {
97
- return this._list[this._list.length - 1] || {};
98
- },
99
-
100
- backtrace: function() {
101
- var i = this._list.length, item;
102
- while (i--) {
103
- item = this._list[i];
104
- window.console && console.log(item.name, 'in', item.object, '(', item.args, ')');
105
- }
106
- }
107
- }),
108
-
109
- flush: function() {
110
- this.stack._list = [];
111
- },
112
-
113
- print: function() {
114
- this.stack.backtrace();
115
- },
116
-
117
- wrap: function(func, module, name) {
118
- var self = JS.StackTrace;
119
- var wrapper = function() {
120
- var result, fullName = self.nameOf(module) + '#' + name;
121
- self.stack.push(fullName, this, arguments);
122
-
123
- if (self.logLevel === 'errors') {
124
- try { result = func.apply(this, arguments); }
125
- catch (e) {
126
- if (e.logged) throw e;
127
- e.logged = true;
128
- window.console && console.error(e, 'thrown by', self.stack.top().name + '. Backtrace:');
129
- self.print();
130
- self.flush();
131
- throw e;
132
- }
133
- } else {
134
- result = func.apply(this, arguments);
135
- }
136
-
137
- self.stack.pop(result);
138
- return result;
139
- };
140
- wrapper.toString = function() { return func.toString() };
141
- return wrapper;
142
- }
143
- }
144
- });
145
-
146
- (function() {
147
- var module = JS.StackTrace, key;
148
- for (key in module.root) {
149
- if (key !== 'JS') module.excluded.push(module.root[key]);
150
- }
151
- })();