spontaneous 0.2.0.alpha2 → 0.2.0.alpha3

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 (404) hide show
  1. data/Gemfile +3 -40
  2. data/Rakefile +29 -41
  3. data/Readme.markdown +21 -8
  4. data/application/css/add_alias_dialogue.css.scss +79 -0
  5. data/application/css/{v2.scss → core.css.scss} +537 -550
  6. data/application/css/{definitions.scss → definitions.css.scss} +121 -33
  7. data/application/css/dialogue.css.scss +409 -0
  8. data/application/css/{editing.scss → editing.css.scss} +25 -262
  9. data/application/css/font.css.scss +8 -0
  10. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  11. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  12. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_flat_10_000000_40x100.png +0 -0
  13. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  14. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  15. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  16. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  17. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  18. data/application/css/jquery-ui-1.8.21.custom/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  19. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_222222_256x240.png +0 -0
  20. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_228ef1_256x240.png +0 -0
  21. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ef8c08_256x240.png +0 -0
  22. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ffd27a_256x240.png +0 -0
  23. data/application/css/jquery-ui-1.8.21.custom/images/ui-icons_ffffff_256x240.png +0 -0
  24. data/application/css/jquery-ui-1.8.21.custom/ui-lightness.css.scss +565 -0
  25. data/application/css/{login.scss → login.css.scss} +4 -4
  26. data/application/css/meta.css.scss +331 -0
  27. data/application/css/{popover.scss → popover.css.scss} +9 -8
  28. data/application/css/{schema_error.scss → schema_error.css.scss} +4 -4
  29. data/application/css/spontaneous.css +5 -0
  30. data/application/css/unsupported.css.scss +42 -0
  31. data/application/js/add_alias_dialogue.js +72 -10
  32. data/application/js/ajax.js +50 -16
  33. data/application/js/compatibility.js +19 -15
  34. data/application/js/content.js +39 -36
  35. data/application/js/content_area.js +53 -5
  36. data/application/js/dialogue.js +17 -0
  37. data/application/js/dom.js +1 -1
  38. data/application/js/edit_panel.js +23 -8
  39. data/application/js/extensions.js +7 -2
  40. data/application/js/field_preview.js +2 -1
  41. data/application/js/field_types/date_field.js +11 -8
  42. data/application/js/field_types/file_field.js +188 -9
  43. data/application/js/field_types/image_field.js +46 -29
  44. data/application/js/field_types/markdown_field.js +57 -14
  45. data/application/js/field_types/select_field.js +72 -0
  46. data/application/js/field_types/string_field.js +8 -0
  47. data/application/js/field_types/webvideo_field.js +8 -0
  48. data/application/js/init.js +1 -7
  49. data/application/js/location.js +41 -13
  50. data/application/js/login.js +3 -0
  51. data/application/js/meta_view/user_admin.js +543 -0
  52. data/application/js/meta_view.js +1 -0
  53. data/application/js/metadata.js +20 -0
  54. data/application/js/page.js +17 -3
  55. data/application/js/page_browser.js +40 -30
  56. data/application/js/page_entry.js +4 -0
  57. data/application/js/panel/root_menu.js +66 -0
  58. data/application/js/popover.js +2 -2
  59. data/application/js/preview.js +1 -1
  60. data/application/js/publish.js +138 -30
  61. data/application/js/services.js +43 -0
  62. data/application/js/sharded_upload.js +2 -2
  63. data/application/js/spontaneous.js +64 -5
  64. data/application/js/state.js +20 -9
  65. data/application/js/top_bar.js +273 -150
  66. data/application/js/types.js +20 -15
  67. data/application/js/upload.js +1 -2
  68. data/application/js/user.js +18 -4
  69. data/application/js/vendor/date.js +104 -0
  70. data/application/js/vendor/jquery-ui-1.8.18.custom.min.js +356 -0
  71. data/application/js/views/box_view.js +15 -8
  72. data/application/js/views/page_piece_view.js +11 -8
  73. data/application/js/views/page_view.js +21 -3
  74. data/application/js/views/piece_view.js +19 -10
  75. data/application/js/views.js +3 -0
  76. data/application/static/chromelogo-200x52-45c7cbc93be080bea342df5fcda2ef8b.png +0 -0
  77. data/application/static/dot-texture-9eea29e4ac7ad9a772285252078ec127.png +0 -0
  78. data/application/static/editing-textarea-resize-s-b5af62365eb7e19ea4beccf7242d508e.png +0 -0
  79. data/application/static/editing-texture-1-42b06a3439752490988f30f2a06d5e7c.png +0 -0
  80. data/application/static/font/fontawesome-webfont-5c5c21100a346972a82c34c5e96ffcfe.ttf +0 -0
  81. data/application/static/loop_alt1-white-7894b458528e92216196cae26b4c2c96.svg +12 -0
  82. data/application/static/spontaneous-states-e91ec89db525c62da0105b97cdd781ce.png +0 -0
  83. data/application/views/index.erb +2 -2
  84. data/application/views/login.erb +4 -8
  85. data/application/views/schema_modification_error.html.erb +1 -4
  86. data/application/views/unsupported.erb +9 -7
  87. data/bin/spot +1 -1
  88. data/db/migrations/20110209152710_users_and_groups.rb +10 -10
  89. data/db/migrations/20120305112647_site_modification_time.rb +11 -0
  90. data/db/migrations/20120418153903_add_ownership_of_content.rb +14 -0
  91. data/db/migrations/20120423175416_add_pending_modifications.rb +21 -0
  92. data/db/migrations/20120525164947_add_field_versions.rb +27 -0
  93. data/lib/sequel/plugins/scoped_table_name.rb +10 -1
  94. data/lib/spontaneous/asset/file.rb +25 -0
  95. data/lib/spontaneous/asset/source.rb +28 -0
  96. data/lib/spontaneous/asset.rb +75 -0
  97. data/lib/spontaneous/box.rb +6 -4
  98. data/lib/spontaneous/capistrano/deploy.rb +47 -0
  99. data/lib/spontaneous/capistrano/sync.rb +81 -0
  100. data/lib/spontaneous/capistrano.rb +13 -0
  101. data/lib/spontaneous/change.rb +60 -68
  102. data/lib/spontaneous/cli/assets.rb +29 -0
  103. data/lib/spontaneous/cli/base.rb +0 -48
  104. data/lib/spontaneous/cli/console.rb +1 -1
  105. data/lib/spontaneous/cli/server.rb +6 -4
  106. data/lib/spontaneous/cli/site.rb +28 -17
  107. data/lib/spontaneous/cli/user.rb +107 -0
  108. data/lib/spontaneous/cli.rb +100 -4
  109. data/lib/spontaneous/collections/entry_set.rb +2 -2
  110. data/lib/spontaneous/collections/field_set.rb +48 -22
  111. data/lib/spontaneous/collections/prototype_set.rb +20 -13
  112. data/lib/spontaneous/constants.rb +3 -0
  113. data/lib/spontaneous/content.rb +22 -5
  114. data/lib/spontaneous/errors.rb +3 -3
  115. data/lib/spontaneous/extensions/array.rb +12 -0
  116. data/lib/spontaneous/extensions/enumerable.rb +30 -0
  117. data/lib/spontaneous/extensions/nil.rb +3 -1
  118. data/lib/spontaneous/extensions/string.rb +16 -0
  119. data/lib/spontaneous/field_types/date_field.rb +45 -2
  120. data/lib/spontaneous/field_types/field.rb +42 -9
  121. data/lib/spontaneous/field_types/file_field.rb +68 -0
  122. data/lib/spontaneous/field_types/image_field.rb +63 -0
  123. data/lib/spontaneous/field_types/select_field.rb +109 -0
  124. data/lib/spontaneous/field_types/string_field.rb +6 -1
  125. data/lib/spontaneous/field_types/webvideo_field.rb +85 -27
  126. data/lib/spontaneous/field_types.rb +1 -1
  127. data/lib/spontaneous/field_version.rb +8 -0
  128. data/lib/spontaneous/generators/page.rb +1 -1
  129. data/lib/spontaneous/generators/site/Capfile.tt +1 -4
  130. data/lib/spontaneous/generators/site/Gemfile.tt +13 -6
  131. data/lib/spontaneous/generators/site/config/deploy.rb.tt +28 -0
  132. data/lib/spontaneous/generators/site/config/environments/production.rb.tt +7 -2
  133. data/lib/spontaneous/generators/site.rb +1 -0
  134. data/lib/spontaneous/json.rb +34 -11
  135. data/lib/spontaneous/layout.rb +22 -0
  136. data/lib/spontaneous/media/file.rb +4 -0
  137. data/lib/spontaneous/output/assets/compression.rb +58 -0
  138. data/lib/spontaneous/output/assets.rb +32 -0
  139. data/lib/spontaneous/output/context.rb +179 -0
  140. data/lib/spontaneous/output/format/html.rb +5 -0
  141. data/lib/spontaneous/output/format/plain.rb +5 -0
  142. data/lib/spontaneous/output/format.rb +180 -0
  143. data/lib/spontaneous/output/helpers/classes_helper.rb +18 -0
  144. data/lib/spontaneous/{render/helpers/html_helper.rb → output/helpers/conditional_comment_helper.rb} +3 -12
  145. data/lib/spontaneous/output/helpers/script_helper.rb +73 -0
  146. data/lib/spontaneous/output/helpers/stylesheet_helper.rb +61 -0
  147. data/lib/spontaneous/output/helpers.rb +28 -0
  148. data/lib/spontaneous/output/template/engine.rb +59 -0
  149. data/lib/spontaneous/output/template/renderer.rb +153 -0
  150. data/lib/spontaneous/output/template.rb +21 -0
  151. data/lib/spontaneous/output.rb +163 -0
  152. data/lib/spontaneous/page.rb +2 -1
  153. data/lib/spontaneous/paths.rb +6 -1
  154. data/lib/spontaneous/permissions/access_key.rb +5 -5
  155. data/lib/spontaneous/permissions/user.rb +81 -35
  156. data/lib/spontaneous/permissions/user_level.rb +26 -22
  157. data/lib/spontaneous/plugins/aliases.rb +76 -12
  158. data/lib/spontaneous/plugins/allowed_types.rb +60 -18
  159. data/lib/spontaneous/plugins/application/paths.rb +0 -28
  160. data/lib/spontaneous/plugins/application/system.rb +35 -0
  161. data/lib/spontaneous/plugins/boxes.rb +4 -0
  162. data/lib/spontaneous/plugins/content_groups.rb +16 -0
  163. data/lib/spontaneous/plugins/entries.rb +50 -30
  164. data/lib/spontaneous/plugins/fields.rb +15 -0
  165. data/lib/spontaneous/plugins/layouts.rb +8 -2
  166. data/lib/spontaneous/plugins/modifications.rb +228 -0
  167. data/lib/spontaneous/plugins/page/formats.rb +67 -42
  168. data/lib/spontaneous/plugins/page/request.rb +10 -0
  169. data/lib/spontaneous/plugins/page/site_timestamps.rb +28 -0
  170. data/lib/spontaneous/plugins/paths.rb +15 -3
  171. data/lib/spontaneous/plugins/publishing.rb +124 -45
  172. data/lib/spontaneous/plugins/render.rb +13 -8
  173. data/lib/spontaneous/plugins/schema_hierarchy.rb +18 -6
  174. data/lib/spontaneous/plugins/site/helpers.rb +53 -0
  175. data/lib/spontaneous/plugins/site/hooks.rb +50 -0
  176. data/lib/spontaneous/plugins/site/map.rb +1 -1
  177. data/lib/spontaneous/plugins/site/paths.rb +13 -0
  178. data/lib/spontaneous/plugins/site/publishing.rb +6 -2
  179. data/lib/spontaneous/plugins/site/{revisions.rb → state.rb} +5 -1
  180. data/lib/spontaneous/plugins/site/storage.rb +4 -0
  181. data/lib/spontaneous/plugins/site/url.rb +15 -0
  182. data/lib/spontaneous/plugins/site_map.rb +13 -3
  183. data/lib/spontaneous/plugins/styles.rb +5 -1
  184. data/lib/spontaneous/plugins/visibility.rb +39 -12
  185. data/lib/spontaneous/prototypes/box_prototype.rb +4 -0
  186. data/lib/spontaneous/prototypes/field_prototype.rb +15 -10
  187. data/lib/spontaneous/publishing/event_client.rb +46 -0
  188. data/lib/spontaneous/publishing/immediate.rb +81 -44
  189. data/lib/spontaneous/publishing/simultaneous.rb +23 -6
  190. data/lib/spontaneous/publishing.rb +4 -3
  191. data/lib/spontaneous/rack/around_back.rb +1 -5
  192. data/lib/spontaneous/rack/around_front.rb +4 -4
  193. data/lib/spontaneous/rack/around_preview.rb +4 -3
  194. data/lib/spontaneous/rack/assets.rb +81 -54
  195. data/lib/spontaneous/rack/authentication.rb +0 -1
  196. data/lib/spontaneous/rack/back.rb +160 -72
  197. data/lib/spontaneous/rack/cookie_authentication.rb +2 -2
  198. data/lib/spontaneous/rack/css.rb +18 -15
  199. data/lib/spontaneous/rack/event_source.rb +9 -21
  200. data/lib/spontaneous/rack/fiber_pool.rb +26 -0
  201. data/lib/spontaneous/rack/front.rb +12 -4
  202. data/lib/spontaneous/rack/helpers.rb +35 -13
  203. data/lib/spontaneous/rack/js.rb +41 -0
  204. data/lib/spontaneous/rack/public.rb +34 -44
  205. data/lib/spontaneous/rack/sse.rb +18 -0
  206. data/lib/spontaneous/rack/static.rb +3 -0
  207. data/lib/spontaneous/rack/user_admin.rb +100 -0
  208. data/lib/spontaneous/rack/user_helpers.rb +1 -1
  209. data/lib/spontaneous/rack.rb +6 -2
  210. data/lib/spontaneous/schema.rb +31 -4
  211. data/lib/spontaneous/search/index.rb +19 -3
  212. data/lib/spontaneous/search/results.rb +1 -1
  213. data/lib/spontaneous/sequel.rb +17 -0
  214. data/lib/spontaneous/site.rb +11 -4
  215. data/lib/spontaneous/state.rb +11 -0
  216. data/lib/spontaneous/storage/cloud.rb +4 -0
  217. data/lib/spontaneous/storage/local.rb +11 -0
  218. data/lib/spontaneous/style.rb +2 -2
  219. data/lib/spontaneous/tasks/database.rake +21 -22
  220. data/lib/spontaneous/utils/database/mysql_dumper.rb +4 -0
  221. data/lib/spontaneous/utils/database/postgres_dumper.rb +78 -0
  222. data/lib/spontaneous/utils/database.rb +6 -3
  223. data/lib/spontaneous/utils/smart_quotes.rb +499 -0
  224. data/lib/spontaneous/utils/smush_it.rb +66 -0
  225. data/lib/spontaneous/utils.rb +3 -1
  226. data/lib/spontaneous/version.rb +2 -2
  227. data/lib/spontaneous.rb +25 -29
  228. data/spontaneous.gemspec +186 -106
  229. data/test/experimental/test_features.rb +1 -1
  230. data/test/fixtures/asset_pipeline/application/css/basic.css.scss +4 -0
  231. data/test/fixtures/asset_pipeline/application/css/complex.css.scss.erb +6 -0
  232. data/test/fixtures/asset_pipeline/application/css/simple.css +3 -0
  233. data/test/fixtures/asset_pipeline/application/css/spontaneous.css +7 -0
  234. data/test/fixtures/asset_pipeline/application/css/subdir/complex.css.scss.erb +6 -0
  235. data/test/fixtures/asset_pipeline/application/css/subdir/library.css.scss +1 -0
  236. data/test/fixtures/asset_pipeline/application/css/subdir/simple.css +3 -0
  237. data/test/fixtures/asset_pipeline/application/js/basic.js.coffee +1 -0
  238. data/test/fixtures/asset_pipeline/application/js/complex.js.coffee.erb +1 -0
  239. data/test/fixtures/asset_pipeline/application/js/login.js +1 -0
  240. data/test/fixtures/asset_pipeline/application/js/require.js +1 -0
  241. data/test/fixtures/asset_pipeline/application/js/simple.js +1 -0
  242. data/test/fixtures/asset_pipeline/application/js/spontaneous.js +5 -0
  243. data/test/fixtures/asset_pipeline/application/js/subdir/complex.js.coffee.erb +1 -0
  244. data/test/fixtures/asset_pipeline/application/js/subdir/library.js.coffee +1 -0
  245. data/test/fixtures/asset_pipeline/application/js/subdir/simple.js +1 -0
  246. data/test/fixtures/asset_pipeline/application/js/vendor/jquery.js +1 -0
  247. data/test/fixtures/asset_pipeline/application/static/dot-texture.png +0 -0
  248. data/test/fixtures/asset_pipeline/application/static/subdir/px.gif +0 -0
  249. data/test/fixtures/assets/public1/css/a.scss +1 -0
  250. data/test/fixtures/assets/public1/js/a.js +1 -0
  251. data/test/fixtures/assets/public1/js/m.coffee +1 -0
  252. data/test/fixtures/assets/public2/css/b.scss +1 -0
  253. data/test/fixtures/assets/public2/css/c.css +1 -0
  254. data/test/fixtures/assets/public2/js/b.js +1 -0
  255. data/test/fixtures/assets/public2/js/c.js +1 -0
  256. data/test/fixtures/assets/public2/js/n.coffee +1 -0
  257. data/test/fixtures/back/config/user_levels.yml +3 -0
  258. data/test/fixtures/back/public/js/coffeescript.coffee +1 -0
  259. data/test/fixtures/back/templates/layouts/standard.css.cut +1 -0
  260. data/test/fixtures/back/templates/layouts/standard.js.cut +1 -0
  261. data/test/fixtures/example_application/config/database.yml +4 -4
  262. data/test/fixtures/helpers/templates/layouts/standard.html.cut +1 -0
  263. data/test/fixtures/helpers/templates/layouts/standard.mobile.cut +1 -0
  264. data/test/fixtures/images/vimlogo.pdf +0 -0
  265. data/test/fixtures/outputs/templates/layouts/standard.atom.cut +1 -0
  266. data/test/fixtures/permissions/config/user_levels.yml +6 -3
  267. data/test/fixtures/serialisation/class_hash.yaml.erb +1 -0
  268. data/test/fixtures/serialisation/root_hash.yaml.erb +2 -2
  269. data/test/fixtures/templates/extended/grandparent.html.cut +7 -7
  270. data/test/fixtures/templates/extended/main.html.cut +5 -5
  271. data/test/fixtures/templates/extended/parent.html.cut +8 -8
  272. data/test/fixtures/templates/extended/partial_with_locals.html.cut +1 -1
  273. data/test/fixtures/templates/extended/with_includes.html.cut +6 -6
  274. data/test/fixtures/templates/extended/with_includes_and_locals.html.cut +6 -7
  275. data/test/fixtures/templates/layouts/entries.html.cut +4 -4
  276. data/test/fixtures/templates/layouts/standard.html.cut +1 -0
  277. data/test/fixtures/templates/layouts/variables.html.cut +1 -1
  278. data/test/fixtures/templates/publishing/templates/layouts/static.html.cut +1 -1
  279. data/test/fixtures/templates/publishing/templates/layouts/static.rtf.cut +1 -0
  280. data/test/fixtures/templates/template_class/complex_template.html.cut +2 -2
  281. data/test/fixtures/templates/template_class/complex_template.pdf.cut +2 -2
  282. data/test/fixtures/templates/template_class/default_template_style.html.cut +1 -1
  283. data/test/fixtures/templates/template_class/images_with_template.html.cut +2 -2
  284. data/test/fixtures/templates/template_class/slots_template.html.cut +2 -2
  285. data/test/fixtures/templates/template_class/slots_template.pdf.cut +2 -2
  286. data/test/fixtures/user_manager/config/user_levels.yml +9 -0
  287. data/test/functional/test_application.rb +7 -7
  288. data/test/functional/test_back.rb +352 -97
  289. data/test/functional/test_front.rb +71 -20
  290. data/test/functional/test_user_manager.rb +284 -0
  291. data/test/javascript/env.js +13505 -0
  292. data/test/javascript/test_markdown.rb +43 -3
  293. data/test/support/custom_matchers.rb +3 -2
  294. data/test/test_helper.rb +50 -9
  295. data/test/test_javascript.rb +13 -13
  296. data/test/ui_helper.rb +1 -1
  297. data/test/unit/test_alias.rb +79 -8
  298. data/test/unit/test_asset_bundler.rb +220 -0
  299. data/test/unit/test_assets.rb +213 -0
  300. data/test/unit/test_async.rb +55 -0
  301. data/test/unit/test_authentication.rb +52 -39
  302. data/test/unit/test_boxes.rb +20 -15
  303. data/test/unit/test_changesets.rb +261 -0
  304. data/test/unit/test_content.rb +73 -33
  305. data/test/unit/test_content_inheritance.rb +18 -18
  306. data/test/unit/test_extensions.rb +26 -0
  307. data/test/unit/test_fields.rb +303 -16
  308. data/test/unit/test_formats.rb +267 -34
  309. data/test/unit/test_helpers.rb +79 -2
  310. data/test/unit/test_images.rb +10 -0
  311. data/test/unit/test_layouts.rb +21 -13
  312. data/test/unit/test_modifications.rb +648 -0
  313. data/test/unit/test_page.rb +6 -2
  314. data/test/unit/test_permissions.rb +101 -27
  315. data/test/unit/test_piece.rb +4 -4
  316. data/test/unit/test_plugins.rb +3 -2
  317. data/test/unit/test_publishing.rb +332 -0
  318. data/test/unit/test_render.rb +118 -67
  319. data/test/unit/test_revisions.rb +546 -0
  320. data/test/unit/test_schema.rb +83 -1
  321. data/test/unit/test_search.rb +59 -0
  322. data/test/unit/test_serialisation.rb +2 -47
  323. data/test/unit/test_site.rb +217 -108
  324. data/test/unit/test_storage.rb +26 -0
  325. data/test/unit/test_structure.rb +2 -2
  326. data/test/unit/test_styles.rb +90 -75
  327. data/test/unit/test_table_scoping.rb +21 -17
  328. data/test/unit/test_templates.rb +75 -69
  329. data/test/{slow → unit}/test_visibility.rb +78 -22
  330. metadata +528 -221
  331. data/application/css/add_alias_dialogue.scss +0 -27
  332. data/application/css/min/14c2a35812c443001b15d8b12a4780f88c678035.css +0 -1
  333. data/application/css/min/565d4c25e82148acb01c45c8d675b37a08676d77.css +0 -1
  334. data/application/css/min/84dbe894ea96eafd321c30823d630817bfc4b03b.css +0 -1
  335. data/application/css/spontaneous.scss +0 -111
  336. data/application/css/unsupported.scss +0 -16
  337. data/application/css/variables.scss +0 -80
  338. data/application/js/min/2a0c2962537a3181fedfff5c92596ba6d3122dc9.js +0 -3
  339. data/application/js/min/4cf1c493d3379ecba5287758c61238034c0893f9.js +0 -2
  340. data/application/js/min/78ac6b99d96750bb6b9f9aad4cb9cd91cd03f391.js +0 -3
  341. data/application/js/min/b8abf302a824c35385ff517b34111e1710ff3b37.js +0 -2
  342. data/application/js/min/c8efb9b9f7c3f6613fcebc6be60f605b6570a382.js +0 -90
  343. data/application/static/diagonal-texture.png +0 -0
  344. data/application/static/editing-0-noise.png +0 -0
  345. data/application/static/editing-1-noise.png +0 -0
  346. data/application/static/editing-texture-1.png +0 -0
  347. data/application/static/editing-texture.png +0 -0
  348. data/application/static/editing-toolbar-shadow-bottom.png +0 -0
  349. data/application/static/editing-toolbar-shadow-top.png +0 -0
  350. data/application/static/inner-glow.png +0 -0
  351. data/application/static/item-buttons-highlight.png +0 -0
  352. data/application/static/item-buttons.png +0 -0
  353. data/application/static/paper-texture-dark.png +0 -0
  354. data/application/static/plus_alt.svg +0 -8
  355. data/application/static/select-arrow-root.png +0 -0
  356. data/application/static/slot-up-arrow.png +0 -0
  357. data/application/static/spontaneous.png +0 -0
  358. data/lib/cutaneous/context_helper.rb +0 -187
  359. data/lib/cutaneous/preview_context.rb +0 -32
  360. data/lib/cutaneous/preview_renderer.rb +0 -10
  361. data/lib/cutaneous/publish_context.rb +0 -10
  362. data/lib/cutaneous/publish_renderer.rb +0 -14
  363. data/lib/cutaneous/publish_template.rb +0 -62
  364. data/lib/cutaneous/publish_token_parser.rb +0 -8
  365. data/lib/cutaneous/renderer.rb +0 -124
  366. data/lib/cutaneous/request_context.rb +0 -9
  367. data/lib/cutaneous/request_renderer.rb +0 -15
  368. data/lib/cutaneous/request_template.rb +0 -11
  369. data/lib/cutaneous/request_token_parser.rb +0 -9
  370. data/lib/cutaneous/token_parser.rb +0 -125
  371. data/lib/cutaneous.rb +0 -48
  372. data/lib/spontaneous/render/context_base.rb +0 -143
  373. data/lib/spontaneous/render/development_renderer.rb +0 -14
  374. data/lib/spontaneous/render/engine.rb +0 -19
  375. data/lib/spontaneous/render/format/html.rb +0 -5
  376. data/lib/spontaneous/render/format.rb +0 -75
  377. data/lib/spontaneous/render/helpers/script_helper.rb +0 -17
  378. data/lib/spontaneous/render/helpers/stylesheet_helper.rb +0 -16
  379. data/lib/spontaneous/render/helpers.rb +0 -14
  380. data/lib/spontaneous/render/preview_context.rb +0 -8
  381. data/lib/spontaneous/render/preview_renderer.rb +0 -24
  382. data/lib/spontaneous/render/publish_context.rb +0 -22
  383. data/lib/spontaneous/render/published_renderer.rb +0 -53
  384. data/lib/spontaneous/render/publishing_renderer.rb +0 -16
  385. data/lib/spontaneous/render/render_cache.rb +0 -26
  386. data/lib/spontaneous/render/renderer.rb +0 -50
  387. data/lib/spontaneous/render/request_context.rb +0 -8
  388. data/lib/spontaneous/render.rb +0 -214
  389. data/test/experimental/test_cutaneous.rb +0 -309
  390. data/test/fixtures/application/css/test.less +0 -5
  391. data/test/slow/test_publishing.rb +0 -1006
  392. /data/application/css/{developer.scss → developer.css.scss} +0 -0
  393. /data/application/js/vendor/{jquery-1.7.1.min.js → jquery.js} +0 -0
  394. /data/application/static/{location-arrow.png → location-arrow-c1c1d3ca472481c61a0a5f8cb289d743.png} +0 -0
  395. /data/application/static/{missing.png → missing-911ce6dbd9f4602e0f3fbcd7e78846a2.png} +0 -0
  396. /data/application/static/{orange-down-arrow.png → orange-down-arrow-395ae1929e8662b2ff0977daf12c35bb.png} +0 -0
  397. /data/application/static/{page-browser-next.png → page-browser-next-ce781a242c23b980b99b9db7abc20b05.png} +0 -0
  398. /data/application/static/{plus-box.png → plus-box-dcde74a1e496f68298c9b443caa1c5d5.png} +0 -0
  399. /data/application/static/{select-arrow.png → select-arrow-6e7dd3745b00e934b0d7a3250c46558b.png} +0 -0
  400. /data/application/static/{slot-down-arrow.png → slot-down-arrow-59ad5f5ee5b52a7ebd00bca4b3104194.png} +0 -0
  401. /data/application/static/{splash.png → splash-65b493a714df9b8b3ab170103401b53d.png} +0 -0
  402. /data/application/static/{spot.png → spot-71fab1d2f065034f5fc15e7bea2ad36c.png} +0 -0
  403. /data/application/static/{spot.svg → spot-8505041082d8d3bbe8d34c29dddb3b7d.svg} +0 -0
  404. /data/application/static/{texture.png → texture-03f7627e8264b1d607113ab32c593a58.png} +0 -0
@@ -107,7 +107,12 @@ class FieldsTest < MiniTest::Spec
107
107
  @content_class.field_prototypes[:minimal].name.should == :minimal
108
108
  @content_class.field_prototypes[:minimal].default.should == "Small"
109
109
  end
110
- should "map :string type to FieldTypes::Text" do
110
+
111
+ should "default to basic string class" do
112
+ assert @content_class.field_prototypes[:title].instance_class < Spontaneous::FieldTypes::StringField
113
+ end
114
+
115
+ should "map :string type to FieldTypes::StringField" do
111
116
  assert @content_class.field_prototypes[:synopsis].instance_class < Spontaneous::FieldTypes::StringField
112
117
  end
113
118
 
@@ -130,14 +135,26 @@ class FieldsTest < MiniTest::Spec
130
135
  @prototype = @content_class.field_prototypes[:title]
131
136
  end
132
137
 
133
- should "default to basic string class" do
134
- assert @prototype.field_class < Spontaneous::FieldTypes::StringField
135
- end
136
138
 
137
139
  should "default to a value of ''" do
138
140
  @prototype.default.should == ""
139
141
  end
140
142
 
143
+ should "get recieve calculated default values if default is a proc" do
144
+ n = 0
145
+ @content_class.field :dynamic, :default => proc { (n += 1) }
146
+ instance = @content_class.new
147
+ instance.dynamic.value.should == "1"
148
+ instance = @content_class.new
149
+ instance.dynamic.value.should == "2"
150
+ end
151
+
152
+ should "be able to calculate default values based on properties of owner" do
153
+ @content_class.field :dynamic, :default => proc { |owner| owner.title.value }
154
+ instance = @content_class.new(:title => "Frog")
155
+ instance.dynamic.value.should == "Frog"
156
+ end
157
+
141
158
  should "match name to type if sensible" do
142
159
  content_class = Class.new(Piece) do
143
160
  field :image
@@ -264,28 +281,31 @@ class FieldsTest < MiniTest::Spec
264
281
  field.value(:plain).should == "Hello & Welcome"
265
282
  end
266
283
 
267
- should "not process values coming from db" do
268
- ContentClass1 = Class.new(Piece)
284
+ should "educate quotes" do
285
+ field_class = Class.new(FieldTypes::StringField)
286
+ field = field_class.new
287
+ field.value = %("John's first... example")
288
+ field.value(:html).should == "“John’s first… example”"
289
+ field.value(:plain).should == "“John’s first… example”"
290
+ end
269
291
 
292
+ should "not process values coming from db" do
293
+ class ContentClass1 < Piece
294
+ end
295
+ $transform = lambda { |value| "<#{value}>" }
270
296
  ContentClass1.field :title do
271
297
  def generate_html(value)
272
- "<#{value}>"
298
+ $transform[value]
273
299
  end
274
300
  end
275
301
  instance = ContentClass1.new
276
302
  instance.fields.title = "Monkey"
277
303
  instance.save
278
304
 
279
- ContentClass2 = Class.new(Piece)
280
- ContentClass2.field :title do
281
- def generate_html(value)
282
- "*#{value}*"
283
- end
284
- end
285
- instance = ContentClass2[instance.id]
305
+ $transform = lambda { |value| "*#{value}*" }
306
+ instance = ContentClass1[instance.id]
286
307
  instance.fields.title.value.should == "<Monkey>"
287
308
  FieldsTest.send(:remove_const, :ContentClass1)
288
- FieldsTest.send(:remove_const, :ContentClass2)
289
309
  end
290
310
  end
291
311
 
@@ -309,6 +329,11 @@ class FieldsTest < MiniTest::Spec
309
329
  @instance.fields.title.owner.should == @instance
310
330
  end
311
331
 
332
+ should "be created with the right default value" do
333
+ f = @instance.fields.title
334
+ f.value.should == "*Magic*"
335
+ end
336
+
312
337
  should "eval blocks from prototype defn" do
313
338
  f = @instance.fields.title
314
339
  f.value = "Boo"
@@ -328,6 +353,7 @@ class FieldsTest < MiniTest::Spec
328
353
  a.title = "a"
329
354
  (a.title / b.title).should == a.title
330
355
  end
356
+
331
357
  should "return the item which isnt empty when using the | method" do
332
358
  a = CC.new(:title => "")
333
359
  b = CC.new(:title => "b")
@@ -335,6 +361,15 @@ class FieldsTest < MiniTest::Spec
335
361
  a.title = "a"
336
362
  (a.title | b.title).should == a.title
337
363
  end
364
+
365
+ should "return the item which isnt empty when using the or method" do
366
+ a = CC.new(:title => "")
367
+ b = CC.new(:title => "b")
368
+ (a.title.or(b.title)).should == b.title
369
+ a.title = "a"
370
+ (a.title.or(b.title)).should == a.title
371
+ end
372
+
338
373
  end
339
374
 
340
375
  context "Field value persistence" do
@@ -475,6 +510,115 @@ class FieldsTest < MiniTest::Spec
475
510
  end
476
511
  end
477
512
 
513
+ context "Field versions" do
514
+ setup do
515
+ @user = Spontaneous::Permissions::User.create(:email => "user@example.com", :login => "user", :name => "user", :password => "rootpass")
516
+ @user.reload
517
+
518
+ class ::Piece
519
+ field :title
520
+ end
521
+ # @content_class.stubs(:name).returns("ContentClass")
522
+ @instance = ::Piece.create
523
+ end
524
+
525
+ teardown do
526
+ # Object.send(:remove_const, :Piece) rescue nil
527
+ Spontaneous::Permissions::User.delete
528
+ S::Content.delete
529
+ S::FieldVersion.delete
530
+ end
531
+
532
+ should "start out as empty" do
533
+ assert @instance.title.versions.empty?, "Field version list should be empty"
534
+ end
535
+
536
+ should "be created every time a field is modified" do
537
+ @instance.title.value = "one"
538
+ @instance.save.reload
539
+ v = @instance.title.versions
540
+ v.count.should == 1
541
+ end
542
+
543
+ should "have a creation date" do
544
+ now = Time.now + 1000
545
+ stub_time(now)
546
+ @instance.title.value = "one"
547
+ @instance.save.reload
548
+ @instance.reload
549
+ vv = @instance.title.versions
550
+ v = vv.first
551
+ v.created_at.should == now
552
+ end
553
+
554
+ should "save the previous value" do
555
+ @instance.title.value = "one"
556
+ @instance.save.reload
557
+ vv = @instance.title.versions
558
+ v = vv.first
559
+ v.value.should == ""
560
+ @instance.title.value = "two"
561
+ @instance.save.reload
562
+ vv = @instance.title.versions
563
+ v = vv.first
564
+ v.value.should == "one"
565
+ @instance.title.value = "three"
566
+ @instance.save.reload
567
+ vv = @instance.title.versions
568
+ v = vv.first
569
+ v.value.should == "two"
570
+ end
571
+
572
+ should "keep a track of the version number" do
573
+ @instance.title.value = "one"
574
+ @instance.save.reload
575
+ vv = @instance.title.versions
576
+ v = vv.first
577
+ v.version.should == 1
578
+ @instance.title.value = "two"
579
+ @instance.save.reload
580
+ vv = @instance.title.versions
581
+ vv.count.should == 2
582
+ v = vv.first
583
+ v.version.should == 2
584
+ end
585
+
586
+ should "remember the responsible editor" do
587
+ @instance.current_editor = @user
588
+ @instance.title.value = "one"
589
+ @instance.save.reload
590
+ vv = @instance.title.versions
591
+ v = vv.first
592
+ v.user.should == @user
593
+ end
594
+
595
+ should "have quick access to the last version" do
596
+ @instance.title.value = "one"
597
+ @instance.save.reload
598
+ vv = @instance.title.versions
599
+ v = vv.first
600
+ v.value.should == ""
601
+ @instance.title.value = "two"
602
+ @instance.save.reload
603
+ vv = @instance.title.versions
604
+ v = vv.first
605
+ v.value.should == "one"
606
+ @instance.title.previous_version.value.should == "one"
607
+ end
608
+ end
609
+
610
+ context "String fields" do
611
+ should "be aliased to the :title type" do
612
+ @content_class = Class.new(::Piece) do
613
+ field :title, default: "Right"
614
+ field :something, :title
615
+ end
616
+ instance = @content_class.new
617
+ assert instance.fields.title.class.ancestors.include?(Spontaneous::FieldTypes::StringField), ":title type should inherit from StringField"
618
+ instance.title.value.should == "Right"
619
+ end
620
+ end
621
+
478
622
  context "WebVideo fields" do
479
623
  setup do
480
624
  @content_class = Class.new(::Piece) do
@@ -488,7 +632,7 @@ class FieldsTest < MiniTest::Spec
488
632
  @content_class.fields.video.export(nil)[:type].should == "Spontaneous.FieldTypes.WebVideoField"
489
633
  @instance.video = "http://www.youtube.com/watch?v=_0jroAM_pO4&feature=feedrec_grec_index"
490
634
  fields = @instance.export(nil)[:fields]
491
- fields[0][:processed_value].should == @instance.video.render(:html, :width => 480, :height => 270)
635
+ fields[0][:processed_value].should == @instance.video.src
492
636
  end
493
637
 
494
638
  should "recognise youtube URLs" do
@@ -656,5 +800,148 @@ class FieldsTest < MiniTest::Spec
656
800
  @field.formatted_address.should == "Cambridge, UK"
657
801
  end
658
802
  end
803
+
804
+ context "Option fields" do
805
+ setup do
806
+ @content_class = Class.new(::Piece) do
807
+ field :options, :select, :options => [
808
+ ["a", "Value A"],
809
+ ["b", "Value B"],
810
+ ["c", "Value C"]
811
+ ]
812
+ end
813
+ @content_class.stubs(:name).returns("ContentClass")
814
+ @instance = @content_class.new
815
+ @field = @instance.options
816
+ end
817
+
818
+ should "use a specific editor class" do
819
+ @content_class.fields.options.export(nil)[:type].should == "Spontaneous.FieldTypes.SelectField"
820
+ end
821
+
822
+ should "select the options class for fields named options" do
823
+ @content_class.field :type, :select, :options => [["a", "A"]]
824
+ assert @content_class.fields.options.instance_class.ancestors.include?(Spontaneous::FieldTypes::SelectField)
825
+ end
826
+
827
+ should "accept a list of strings as options" do
828
+ @content_class.field :type, :select, :options => ["a", "b"]
829
+ @instance = @content_class.new
830
+ @instance.type.option_list.should == [["a", "a"], ["b", "b"]]
831
+ end
832
+
833
+ should "accept a json string as a value and convert it properly" do
834
+ @field.value = %(["a", "Value A"])
835
+ @field.value.should == "a"
836
+ @field.value(:label).should == "Value A"
837
+ @field.label.should == "Value A"
838
+ @field.unprocessed_value.should == %(["a", "Value A"])
839
+ end
840
+ end
841
+
842
+ context "File fields" do
843
+ setup do
844
+ @content_class = Class.new(::Piece)
845
+ @prototype = @content_class.field :file
846
+ @content_class.stubs(:name).returns("ContentClass")
847
+ @instance = @content_class.create
848
+ @field = @instance.file
849
+ end
850
+
851
+ should "have a distinct editor class" do
852
+ @prototype.instance_class.editor_class.should == "Spontaneous.FieldTypes.FileField"
853
+ end
854
+
855
+ should "adopt any field called 'file'" do
856
+ assert @field.is_a?(Spontaneous::FieldTypes::FileField), "Field should be an instance of FileField but instead has the following ancestors #{ @prototype.instance_class.ancestors }"
857
+ end
858
+
859
+ should "copy files to the media folder" do
860
+ path = File.expand_path("../../fixtures/images/vimlogo.pdf", __FILE__)
861
+ assert File.exists?(path), "Test file #{path} does not exist"
862
+ File.open(path, 'rb') do |file|
863
+ @field.value = {
864
+ :tempfile => file,
865
+ :type => "application/pdf",
866
+ :filename => "vimlogo.pdf"
867
+ }
868
+ end
869
+ url = @field.value
870
+ path = File.join File.dirname(Spontaneous.media_dir), url
871
+ assert File.exist?(path), "Media file should have been copied into place"
872
+ end
873
+
874
+ should "generate the requisite file metadata" do
875
+ path = File.expand_path("../../fixtures/images/vimlogo.pdf", __FILE__)
876
+ assert File.exists?(path), "Test file #{path} does not exist"
877
+ File.open(path, 'rb') do |file|
878
+ @field.value = {
879
+ :tempfile => file,
880
+ :type => "application/pdf",
881
+ :filename => "vimlogo.pdf"
882
+ }
883
+ end
884
+ @field.value(:html).should =~ %r{/media/.+/vimlogo.pdf$}
885
+ @field.value.should =~ %r{/media/.+/vimlogo.pdf$}
886
+ @field.path.should == @field.value
887
+ @field.value(:filesize).should == 2254
888
+ @field.filesize.should == 2254
889
+ @field.value(:filename).should == "vimlogo.pdf"
890
+ @field.filename.should == "vimlogo.pdf"
891
+ end
892
+
893
+ should "just accept the given value if passed a path to a non-existant file" do
894
+ @field.value = "/images/nosuchfile.rtf"
895
+ @field.value.should == "/images/nosuchfile.rtf"
896
+ @field.filename.should == "nosuchfile.rtf"
897
+ @field.filesize.should == 0
898
+ end
899
+
900
+ should "copy the given file if passed a path to an existing file" do
901
+ path = File.expand_path("../../fixtures/images/vimlogo.pdf", __FILE__)
902
+ @field.value = path
903
+ @field.value.should =~ %r{/media/.+/vimlogo.pdf$}
904
+ @field.filename.should == "vimlogo.pdf"
905
+ @field.filesize.should == 2254
906
+ end
907
+ end
908
+ context "Date fields" do
909
+ setup do
910
+ @content_class = Class.new(::Piece)
911
+ @prototype = @content_class.field :date
912
+ @content_class.stubs(:name).returns("ContentClass")
913
+ @instance = @content_class.create
914
+ @field = @instance.date
915
+ end
916
+
917
+ should "have a distinct editor class" do
918
+ @prototype.instance_class.editor_class.should == "Spontaneous.FieldTypes.DateField"
919
+ end
920
+
921
+ should "adopt any field called 'date'" do
922
+ assert @field.is_a?(Spontaneous::FieldTypes::DateField), "Field should be an instance of DateField but instead has the following ancestors #{ @prototype.instance_class.ancestors }"
923
+ end
924
+
925
+ should "default to an empty string" do
926
+ @field.value(:html).should == ""
927
+ @field.value(:plain).should == ""
928
+ end
929
+
930
+ should "correctly parse strings" do
931
+ @field.value = "Friday, 8 June, 2012"
932
+ @field.value(:html).should == %(<time datetime="2012-06-08">Friday, 8 June, 2012</time>)
933
+ @field.value(:plain).should == %(Friday, 8 June, 2012)
934
+ @field.date.should == Date.parse("Friday, 8 June, 2012")
935
+ end
936
+
937
+ should "allow for setting a custom default format" do
938
+ prototype = @content_class.field :datef, :date, :format => "%d %b %Y, %a"
939
+ instance = @content_class.new
940
+ field = instance.datef
941
+ field.value = "Friday, 8 June, 2012"
942
+ field.value(:html).should == %(<time datetime="2012-06-08">08 Jun 2012, Fri</time>)
943
+ field.value(:plain).should == %(08 Jun 2012, Fri)
944
+ end
945
+ end
659
946
  end
660
947
  end