spontaneous 0.2.0.alpha2 → 0.2.0.alpha3

Sign up to get free protection for your applications and to get access to all the features.
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