spontaneous 0.1.0.alpha1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (556) hide show
  1. data/Gemfile +49 -0
  2. data/Gemfile.lock +146 -0
  3. data/LICENSE +0 -0
  4. data/README +0 -0
  5. data/Rakefile +284 -0
  6. data/Readme.markdown +7 -0
  7. data/application/css/add_alias_dialogue.scss +27 -0
  8. data/application/css/definitions.scss +249 -0
  9. data/application/css/developer.scss +9 -0
  10. data/application/css/editing.scss +649 -0
  11. data/application/css/login.scss +91 -0
  12. data/application/css/min/54ee0ed3c7fac7632bd5c020d69e9a2503e0c88c.css +1 -0
  13. data/application/css/min/c256adc144e2bdd0b0539356b04eb62db01e1dc3.css +1 -0
  14. data/application/css/popover.scss +335 -0
  15. data/application/css/schema_error.scss +90 -0
  16. data/application/css/spontaneous.scss +111 -0
  17. data/application/css/unsupported.scss +16 -0
  18. data/application/css/v2.scss +1606 -0
  19. data/application/css/variables.scss +80 -0
  20. data/application/js/add_alias_dialogue.js +59 -0
  21. data/application/js/add_home_dialogue.js +59 -0
  22. data/application/js/ajax.js +99 -0
  23. data/application/js/authentication.js +22 -0
  24. data/application/js/box.js +104 -0
  25. data/application/js/box_container.js +82 -0
  26. data/application/js/compatibility.js +132 -0
  27. data/application/js/conflicted_field_dialogue.js +92 -0
  28. data/application/js/content.js +224 -0
  29. data/application/js/content_area.js +44 -0
  30. data/application/js/dialogue.js +196 -0
  31. data/application/js/dom.js +71 -0
  32. data/application/js/edit_dialogue.js +137 -0
  33. data/application/js/edit_panel.js +232 -0
  34. data/application/js/editing.js +42 -0
  35. data/application/js/entry.js +13 -0
  36. data/application/js/extensions.js +104 -0
  37. data/application/js/field.js +4 -0
  38. data/application/js/field_preview.js +55 -0
  39. data/application/js/field_types/date_field.js +16 -0
  40. data/application/js/field_types/file_field.js +71 -0
  41. data/application/js/field_types/image_field.js +358 -0
  42. data/application/js/field_types/markdown_field.js +656 -0
  43. data/application/js/field_types/string_field.js +185 -0
  44. data/application/js/image.js +72 -0
  45. data/application/js/init.js +34 -0
  46. data/application/js/load.js +4 -0
  47. data/application/js/location.js +157 -0
  48. data/application/js/login.js +53 -0
  49. data/application/js/min/492a209de8ee955fa9c729a765377495001e11b1.js +17 -0
  50. data/application/js/min/80f684d77c940887a1d4a63e3a96102e993baa98.js +88 -0
  51. data/application/js/min/b8abf302a824c35385ff517b34111e1710ff3b37.js +2 -0
  52. data/application/js/min/c7140ec9475e5bf868b901e0621338d7d162358b.js +3 -0
  53. data/application/js/min/f07f2bd6630ee31e1c2288ec223383d8f0658ba6.js +2 -0
  54. data/application/js/page.js +43 -0
  55. data/application/js/page_browser.js +147 -0
  56. data/application/js/page_entry.js +47 -0
  57. data/application/js/popover.js +99 -0
  58. data/application/js/popover_view.js +56 -0
  59. data/application/js/preview.js +64 -0
  60. data/application/js/progress.js +358 -0
  61. data/application/js/properties.js +90 -0
  62. data/application/js/publish.js +187 -0
  63. data/application/js/require.js +129 -0
  64. data/application/js/sharded_upload.js +206 -0
  65. data/application/js/side_bar.js +30 -0
  66. data/application/js/spontaneous.js +6 -0
  67. data/application/js/state.js +64 -0
  68. data/application/js/status_bar.js +47 -0
  69. data/application/js/top_bar.js +368 -0
  70. data/application/js/types.js +98 -0
  71. data/application/js/upload.js +88 -0
  72. data/application/js/upload_manager.js +319 -0
  73. data/application/js/user.js +37 -0
  74. data/application/js/vendor/.DS_Store +0 -0
  75. data/application/js/vendor/JS.Class-2.1.5/CHANGELOG +283 -0
  76. data/application/js/vendor/JS.Class-2.1.5/MIT-LICENSE +30 -0
  77. data/application/js/vendor/JS.Class-2.1.5/README +30 -0
  78. data/application/js/vendor/JS.Class-2.1.5/min/command.js +1 -0
  79. data/application/js/vendor/JS.Class-2.1.5/min/comparable.js +1 -0
  80. data/application/js/vendor/JS.Class-2.1.5/min/constant_scope.js +1 -0
  81. data/application/js/vendor/JS.Class-2.1.5/min/core.js +1 -0
  82. data/application/js/vendor/JS.Class-2.1.5/min/decorator.js +1 -0
  83. data/application/js/vendor/JS.Class-2.1.5/min/enumerable.js +1 -0
  84. data/application/js/vendor/JS.Class-2.1.5/min/forwardable.js +1 -0
  85. data/application/js/vendor/JS.Class-2.1.5/min/hash.js +1 -0
  86. data/application/js/vendor/JS.Class-2.1.5/min/linked_list.js +1 -0
  87. data/application/js/vendor/JS.Class-2.1.5/min/loader.js +1 -0
  88. data/application/js/vendor/JS.Class-2.1.5/min/method_chain.js +1 -0
  89. data/application/js/vendor/JS.Class-2.1.5/min/observable.js +1 -0
  90. data/application/js/vendor/JS.Class-2.1.5/min/package.js +1 -0
  91. data/application/js/vendor/JS.Class-2.1.5/min/proxy.js +1 -0
  92. data/application/js/vendor/JS.Class-2.1.5/min/ruby.js +1 -0
  93. data/application/js/vendor/JS.Class-2.1.5/min/set.js +1 -0
  94. data/application/js/vendor/JS.Class-2.1.5/min/stack_trace.js +1 -0
  95. data/application/js/vendor/JS.Class-2.1.5/min/state.js +1 -0
  96. data/application/js/vendor/JS.Class-2.1.5/min/stdlib.js +16 -0
  97. data/application/js/vendor/JS.Class-2.1.5/src/command.js +93 -0
  98. data/application/js/vendor/JS.Class-2.1.5/src/comparable.js +37 -0
  99. data/application/js/vendor/JS.Class-2.1.5/src/constant_scope.js +48 -0
  100. data/application/js/vendor/JS.Class-2.1.5/src/core.js +1060 -0
  101. data/application/js/vendor/JS.Class-2.1.5/src/decorator.js +50 -0
  102. data/application/js/vendor/JS.Class-2.1.5/src/enumerable.js +505 -0
  103. data/application/js/vendor/JS.Class-2.1.5/src/forwardable.js +22 -0
  104. data/application/js/vendor/JS.Class-2.1.5/src/hash.js +334 -0
  105. data/application/js/vendor/JS.Class-2.1.5/src/linked_list.js +114 -0
  106. data/application/js/vendor/JS.Class-2.1.5/src/loader.js +553 -0
  107. data/application/js/vendor/JS.Class-2.1.5/src/method_chain.js +172 -0
  108. data/application/js/vendor/JS.Class-2.1.5/src/observable.js +55 -0
  109. data/application/js/vendor/JS.Class-2.1.5/src/package.js +472 -0
  110. data/application/js/vendor/JS.Class-2.1.5/src/proxy.js +58 -0
  111. data/application/js/vendor/JS.Class-2.1.5/src/ruby.js +44 -0
  112. data/application/js/vendor/JS.Class-2.1.5/src/set.js +332 -0
  113. data/application/js/vendor/JS.Class-2.1.5/src/stack_trace.js +151 -0
  114. data/application/js/vendor/JS.Class-2.1.5/src/state.js +95 -0
  115. data/application/js/vendor/JS.Class-2.1.5/src/stdlib.js +2612 -0
  116. data/application/js/vendor/crypto-2.3.0-crypto.js +160 -0
  117. data/application/js/vendor/crypto-2.3.0-sha1.js +91 -0
  118. data/application/js/vendor/diff_match_patch.js +2153 -0
  119. data/application/js/vendor/jquery-1.4.2.min.js +154 -0
  120. data/application/js/vendor/jquery-1.4.3.min.js +166 -0
  121. data/application/js/vendor/jquery-1.5.1.min.js +16 -0
  122. data/application/js/vendor/jquery-1.5.1rc1.min.js +24 -0
  123. data/application/js/vendor/jquery-1.6.2.min.js +18 -0
  124. data/application/js/vendor/jquery-ui-1.8.6.custom.min.js +265 -0
  125. data/application/js/vendor/jquery-ui-1.8.9.custom.min.js +415 -0
  126. data/application/js/vendor/jquery-ui-1.8.custom.min.js +106 -0
  127. data/application/js/vendor/jquery.hotkeys-0.7.9.js +248 -0
  128. data/application/js/vendor/jquery.hotkeys-0.7.9.min.js +19 -0
  129. data/application/js/vendor/jsdiff.js +169 -0
  130. data/application/js/views/box_view.js +229 -0
  131. data/application/js/views/page_piece_view.js +45 -0
  132. data/application/js/views/page_view.js +238 -0
  133. data/application/js/views/piece_view.js +178 -0
  134. data/application/js/views.js +110 -0
  135. data/application/static/editing-0-noise.png +0 -0
  136. data/application/static/editing-1-noise.png +0 -0
  137. data/application/static/editing-texture-1.png +0 -0
  138. data/application/static/editing-texture.png +0 -0
  139. data/application/static/editing-toolbar-shadow-bottom.png +0 -0
  140. data/application/static/editing-toolbar-shadow-top.png +0 -0
  141. data/application/static/favicon.ico +0 -0
  142. data/application/static/inner-glow.png +0 -0
  143. data/application/static/item-buttons.png +0 -0
  144. data/application/static/location-arrow.png +0 -0
  145. data/application/static/logo-400px-transparent.png +0 -0
  146. data/application/static/missing.png +0 -0
  147. data/application/static/orange-down-arrow.png +0 -0
  148. data/application/static/page-browser-next.png +0 -0
  149. data/application/static/paper-texture-dark.png +0 -0
  150. data/application/static/px.gif +0 -0
  151. data/application/static/select-arrow-root.png +0 -0
  152. data/application/static/select-arrow.png +0 -0
  153. data/application/static/slot-down-arrow.png +0 -0
  154. data/application/static/splash.png +0 -0
  155. data/application/static/spontaneous.png +0 -0
  156. data/application/static/spot.png +0 -0
  157. data/application/static/spot.svg +40 -0
  158. data/application/static/texture.png +0 -0
  159. data/application/views/index.erubis +46 -0
  160. data/application/views/login.erubis +69 -0
  161. data/application/views/schema_modification_error.html.erb +61 -0
  162. data/application/views/unsupported.erubis +23 -0
  163. data/bin/limit-upload +5 -0
  164. data/bin/spot +10 -0
  165. data/bin/unlimit-upload +3 -0
  166. data/config/nginx.conf +60 -0
  167. data/db/migrations/20100610142136_init.rb +66 -0
  168. data/db/migrations/20101130104334_timestamps.rb +44 -0
  169. data/db/migrations/20101202113205_site_publishing_flags.rb +12 -0
  170. data/db/migrations/20101206124543_aliases.rb +16 -0
  171. data/db/migrations/20110201133550_visibility.rb +27 -0
  172. data/db/migrations/20110209152710_users_and_groups.rb +58 -0
  173. data/db/migrations/20110215133910_boxes.rb +25 -0
  174. data/db/migrations/20110521114145_remove_slots_and_entries.rb +21 -0
  175. data/db/migrations/20110604192145_rename_schema_id_columns.rb +22 -0
  176. data/db/migrations/20110805141925_rename_site_to_state.rb +11 -0
  177. data/lib/cutaneous/context_helper.rb +82 -0
  178. data/lib/cutaneous/first_pass_parser.rb +23 -0
  179. data/lib/cutaneous/first_pass_renderer.rb +18 -0
  180. data/lib/cutaneous/parser_core.rb +18 -0
  181. data/lib/cutaneous/preview_context.rb +31 -0
  182. data/lib/cutaneous/preview_renderer.rb +15 -0
  183. data/lib/cutaneous/publish_context.rb +9 -0
  184. data/lib/cutaneous/renderer.rb +122 -0
  185. data/lib/cutaneous/request_context.rb +8 -0
  186. data/lib/cutaneous/second_pass_parser.rb +23 -0
  187. data/lib/cutaneous/second_pass_renderer.rb +18 -0
  188. data/lib/cutaneous.rb +47 -0
  189. data/lib/sequel/plugins/content_table_inheritance.rb +196 -0
  190. data/lib/sequel/plugins/yajl_serialization.rb +154 -0
  191. data/lib/spontaneous/application/feature.rb +9 -0
  192. data/lib/spontaneous/application/plugin.rb +13 -0
  193. data/lib/spontaneous/application.rb +8 -0
  194. data/lib/spontaneous/box.rb +232 -0
  195. data/lib/spontaneous/box_style.rb +64 -0
  196. data/lib/spontaneous/change.rb +107 -0
  197. data/lib/spontaneous/cli/adapter.rb +13 -0
  198. data/lib/spontaneous/cli/base.rb +184 -0
  199. data/lib/spontaneous/cli/console.rb +0 -0
  200. data/lib/spontaneous/cli/media.rb +13 -0
  201. data/lib/spontaneous/cli/server.rb +50 -0
  202. data/lib/spontaneous/cli/site.rb +46 -0
  203. data/lib/spontaneous/cli/sync.rb +42 -0
  204. data/lib/spontaneous/cli/tasks.rb +9 -0
  205. data/lib/spontaneous/cli.rb +83 -0
  206. data/lib/spontaneous/collections/box_set.rb +56 -0
  207. data/lib/spontaneous/collections/change_set.rb +43 -0
  208. data/lib/spontaneous/collections/entry_set.rb +83 -0
  209. data/lib/spontaneous/collections/field_set.rb +53 -0
  210. data/lib/spontaneous/collections/prototype_set.rb +131 -0
  211. data/lib/spontaneous/collections/style_set.rb +13 -0
  212. data/lib/spontaneous/config.rb +156 -0
  213. data/lib/spontaneous/constants.rb +24 -0
  214. data/lib/spontaneous/content.rb +113 -0
  215. data/lib/spontaneous/content_query.rb +17 -0
  216. data/lib/spontaneous/errors.rb +48 -0
  217. data/lib/spontaneous/extensions/array.rb +18 -0
  218. data/lib/spontaneous/extensions/class.rb +17 -0
  219. data/lib/spontaneous/extensions/hash.rb +18 -0
  220. data/lib/spontaneous/extensions/json.rb +26 -0
  221. data/lib/spontaneous/extensions/kernel.rb +7 -0
  222. data/lib/spontaneous/extensions/object.rb +30 -0
  223. data/lib/spontaneous/extensions/object_space.rb +12 -0
  224. data/lib/spontaneous/extensions/string.rb +44 -0
  225. data/lib/spontaneous/facet.rb +47 -0
  226. data/lib/spontaneous/field_types/date_field.rb +12 -0
  227. data/lib/spontaneous/field_types/field.rb +252 -0
  228. data/lib/spontaneous/field_types/image_field.rb +329 -0
  229. data/lib/spontaneous/field_types/markdown_field.rb +37 -0
  230. data/lib/spontaneous/field_types/string_field.rb +14 -0
  231. data/lib/spontaneous/field_types.rb +40 -0
  232. data/lib/spontaneous/generators/page/inline.html.cut +1 -0
  233. data/lib/spontaneous/generators/page/page.html.cut.tt +4 -0
  234. data/lib/spontaneous/generators/page/page.rb.tt +9 -0
  235. data/lib/spontaneous/generators/page.rb +38 -0
  236. data/lib/spontaneous/generators/site/.gitignore +4 -0
  237. data/lib/spontaneous/generators/site/Gemfile.tt +31 -0
  238. data/lib/spontaneous/generators/site/Rakefile.tt +6 -0
  239. data/lib/spontaneous/generators/site/config/back.ru +7 -0
  240. data/lib/spontaneous/generators/site/config/boot.rb +19 -0
  241. data/lib/spontaneous/generators/site/config/database.yml.tt +21 -0
  242. data/lib/spontaneous/generators/site/config/deploy.rb.tt +0 -0
  243. data/lib/spontaneous/generators/site/config/environment.rb.tt +8 -0
  244. data/lib/spontaneous/generators/site/config/environments/development.rb.tt +15 -0
  245. data/lib/spontaneous/generators/site/config/environments/production.rb.tt +5 -0
  246. data/lib/spontaneous/generators/site/config/front.ru +8 -0
  247. data/lib/spontaneous/generators/site/config/user_levels.yml +22 -0
  248. data/lib/spontaneous/generators/site/lib/site.rb.tt +4 -0
  249. data/lib/spontaneous/generators/site/lib/tasks/site.rake.tt +8 -0
  250. data/lib/spontaneous/generators/site/public/css/site.css +0 -0
  251. data/lib/spontaneous/generators/site/public/favicon.ico +0 -0
  252. data/lib/spontaneous/generators/site/public/js/.empty_directory +0 -0
  253. data/lib/spontaneous/generators/site/public/js/site.js +0 -0
  254. data/lib/spontaneous/generators/site/public/robots.txt +0 -0
  255. data/lib/spontaneous/generators/site/schema/.map +1 -0
  256. data/lib/spontaneous/generators/site/schema/page.rb.tt +8 -0
  257. data/lib/spontaneous/generators/site/schema/piece.rb.tt +4 -0
  258. data/lib/spontaneous/generators/site/templates/layouts/standard.html.cut.tt +13 -0
  259. data/lib/spontaneous/generators/site.rb +77 -0
  260. data/lib/spontaneous/generators.rb +23 -0
  261. data/lib/spontaneous/image_size.rb +117 -0
  262. data/lib/spontaneous/json.rb +33 -0
  263. data/lib/spontaneous/layout.rb +15 -0
  264. data/lib/spontaneous/loader.rb +280 -0
  265. data/lib/spontaneous/logger.rb +369 -0
  266. data/lib/spontaneous/media.rb +84 -0
  267. data/lib/spontaneous/page.rb +92 -0
  268. data/lib/spontaneous/page_controller.rb +18 -0
  269. data/lib/spontaneous/page_piece.rb +77 -0
  270. data/lib/spontaneous/paths.rb +30 -0
  271. data/lib/spontaneous/permissions/access_group.rb +50 -0
  272. data/lib/spontaneous/permissions/access_key.rb +35 -0
  273. data/lib/spontaneous/permissions/user.rb +167 -0
  274. data/lib/spontaneous/permissions/user_level.rb +177 -0
  275. data/lib/spontaneous/permissions.rb +55 -0
  276. data/lib/spontaneous/piece.rb +30 -0
  277. data/lib/spontaneous/plugins/aliases.rb +128 -0
  278. data/lib/spontaneous/plugins/allowed_types.rb +173 -0
  279. data/lib/spontaneous/plugins/application/facets.rb +25 -0
  280. data/lib/spontaneous/plugins/application/paths.rb +137 -0
  281. data/lib/spontaneous/plugins/application/render.rb +29 -0
  282. data/lib/spontaneous/plugins/application/serialisation.rb +16 -0
  283. data/lib/spontaneous/plugins/application/state.rb +86 -0
  284. data/lib/spontaneous/plugins/boxes.rb +84 -0
  285. data/lib/spontaneous/plugins/controllers.rb +52 -0
  286. data/lib/spontaneous/plugins/entries.rb +193 -0
  287. data/lib/spontaneous/plugins/entry.rb +51 -0
  288. data/lib/spontaneous/plugins/fields.rb +103 -0
  289. data/lib/spontaneous/plugins/instance_code.rb +18 -0
  290. data/lib/spontaneous/plugins/layouts.rb +87 -0
  291. data/lib/spontaneous/plugins/media.rb +41 -0
  292. data/lib/spontaneous/plugins/page/formats.rb +67 -0
  293. data/lib/spontaneous/plugins/page/request.rb +89 -0
  294. data/lib/spontaneous/plugins/page_search.rb +64 -0
  295. data/lib/spontaneous/plugins/page_tree.rb +25 -0
  296. data/lib/spontaneous/plugins/paths.rb +125 -0
  297. data/lib/spontaneous/plugins/permissions.rb +63 -0
  298. data/lib/spontaneous/plugins/prototypes.rb +84 -0
  299. data/lib/spontaneous/plugins/publishing.rb +255 -0
  300. data/lib/spontaneous/plugins/render.rb +24 -0
  301. data/lib/spontaneous/plugins/schema_hierarchy.rb +76 -0
  302. data/lib/spontaneous/plugins/schema_id.rb +60 -0
  303. data/lib/spontaneous/plugins/schema_title.rb +33 -0
  304. data/lib/spontaneous/plugins/serialisation.rb +67 -0
  305. data/lib/spontaneous/plugins/site/instance.rb +22 -0
  306. data/lib/spontaneous/plugins/site/map.rb +19 -0
  307. data/lib/spontaneous/plugins/site/publishing.rb +74 -0
  308. data/lib/spontaneous/plugins/site/revisions.rb +28 -0
  309. data/lib/spontaneous/plugins/site/selectors.rb +41 -0
  310. data/lib/spontaneous/plugins/site_map.rb +34 -0
  311. data/lib/spontaneous/plugins/styles.rb +119 -0
  312. data/lib/spontaneous/plugins/supertype.rb +11 -0
  313. data/lib/spontaneous/plugins/visibility.rb +151 -0
  314. data/lib/spontaneous/plugins.rb +20 -0
  315. data/lib/spontaneous/prototypes/box_prototype.rb +168 -0
  316. data/lib/spontaneous/prototypes/field_prototype.rb +112 -0
  317. data/lib/spontaneous/prototypes/layout_prototype.rb +17 -0
  318. data/lib/spontaneous/prototypes/style_prototype.rb +42 -0
  319. data/lib/spontaneous/proxy_object.rb +12 -0
  320. data/lib/spontaneous/publishing/fire_and_forget.rb +57 -0
  321. data/lib/spontaneous/publishing/immediate.rb +197 -0
  322. data/lib/spontaneous/publishing/threaded.rb +25 -0
  323. data/lib/spontaneous/publishing.rb +10 -0
  324. data/lib/spontaneous/rack/around_back.rb +44 -0
  325. data/lib/spontaneous/rack/around_front.rb +29 -0
  326. data/lib/spontaneous/rack/around_preview.rb +26 -0
  327. data/lib/spontaneous/rack/assets.rb +98 -0
  328. data/lib/spontaneous/rack/back.rb +729 -0
  329. data/lib/spontaneous/rack/front.rb +41 -0
  330. data/lib/spontaneous/rack/http.rb +18 -0
  331. data/lib/spontaneous/rack/media.rb +29 -0
  332. data/lib/spontaneous/rack/public.rb +232 -0
  333. data/lib/spontaneous/rack/reloader.rb +42 -0
  334. data/lib/spontaneous/rack/static.rb +25 -0
  335. data/lib/spontaneous/rack.rb +55 -0
  336. data/lib/spontaneous/render/context.rb +100 -0
  337. data/lib/spontaneous/render/development_renderer.rb +14 -0
  338. data/lib/spontaneous/render/engine.rb +19 -0
  339. data/lib/spontaneous/render/format/html.rb +5 -0
  340. data/lib/spontaneous/render/format.rb +70 -0
  341. data/lib/spontaneous/render/preview_renderer.rb +18 -0
  342. data/lib/spontaneous/render/published_renderer.rb +54 -0
  343. data/lib/spontaneous/render/publishing_renderer.rb +13 -0
  344. data/lib/spontaneous/render/renderer.rb +46 -0
  345. data/lib/spontaneous/render.rb +173 -0
  346. data/lib/spontaneous/revision.rb +7 -0
  347. data/lib/spontaneous/schema/schema_modification.rb +260 -0
  348. data/lib/spontaneous/schema/uid.rb +221 -0
  349. data/lib/spontaneous/schema.rb +295 -0
  350. data/lib/spontaneous/server.rb +65 -0
  351. data/lib/spontaneous/site.rb +87 -0
  352. data/lib/spontaneous/state.rb +53 -0
  353. data/lib/spontaneous/style.rb +144 -0
  354. data/lib/spontaneous/tasks/database.rake +9 -0
  355. data/lib/spontaneous/tasks.rb +5 -0
  356. data/lib/spontaneous/version.rb +6 -0
  357. data/lib/spontaneous.rb +179 -0
  358. data/spontaneous.gemspec.tmpl +66 -0
  359. data/test/disabled/test_slots.rb +287 -0
  360. data/test/experimental/test_formats.rb +92 -0
  361. data/test/experimental/test_plugins.rb +64 -0
  362. data/test/fixtures/application/css/test.less +5 -0
  363. data/test/fixtures/application/js/test.js +1 -0
  364. data/test/fixtures/application/static/favicon.ico +1 -0
  365. data/test/fixtures/application/static/test.html +1 -0
  366. data/test/fixtures/application/views/index.erubis +1 -0
  367. data/test/fixtures/back/public/test.html +1 -0
  368. data/test/fixtures/back/templates/layouts/standard.html.cut +1 -0
  369. data/test/fixtures/config/config/environment.rb +4 -0
  370. data/test/fixtures/config/config/environments/development.rb +13 -0
  371. data/test/fixtures/config/config/environments/production.rb +22 -0
  372. data/test/fixtures/config/config/environments/staging.rb +2 -0
  373. data/test/fixtures/example_application/Gemfile +6 -0
  374. data/test/fixtures/example_application/Gemfile.lock +76 -0
  375. data/test/fixtures/example_application/Rakefile +6 -0
  376. data/test/fixtures/example_application/config/back.rb +15 -0
  377. data/test/fixtures/example_application/config/back.ru +8 -0
  378. data/test/fixtures/example_application/config/back.yml +8 -0
  379. data/test/fixtures/example_application/config/boot.rb +16 -0
  380. data/test/fixtures/example_application/config/database.yml +24 -0
  381. data/test/fixtures/example_application/config/environment.rb +4 -0
  382. data/test/fixtures/example_application/config/environments/development.rb +16 -0
  383. data/test/fixtures/example_application/config/environments/production.rb +21 -0
  384. data/test/fixtures/example_application/config/environments/staging.rb +1 -0
  385. data/test/fixtures/example_application/config/front.rb +8 -0
  386. data/test/fixtures/example_application/config/front.ru +8 -0
  387. data/test/fixtures/example_application/config/front.yml +8 -0
  388. data/test/fixtures/example_application/config/schema.yml +48 -0
  389. data/test/fixtures/example_application/config/unicorn.rb +1 -0
  390. data/test/fixtures/example_application/config/user_levels.yml +19 -0
  391. data/test/fixtures/example_application/public/css/test.css +0 -0
  392. data/test/fixtures/example_application/public/favicon.ico +1 -0
  393. data/test/fixtures/example_application/public/js/test.js +0 -0
  394. data/test/fixtures/example_application/public/test.html +1 -0
  395. data/test/fixtures/example_application/schema/client_project.rb +18 -0
  396. data/test/fixtures/example_application/schema/client_projects.rb +8 -0
  397. data/test/fixtures/example_application/schema/home_page.rb +22 -0
  398. data/test/fixtures/example_application/schema/info_page.rb +13 -0
  399. data/test/fixtures/example_application/schema/inline_image.rb +11 -0
  400. data/test/fixtures/example_application/schema/page.rb +4 -0
  401. data/test/fixtures/example_application/schema/piece.rb +3 -0
  402. data/test/fixtures/example_application/schema/project.rb +21 -0
  403. data/test/fixtures/example_application/schema/project_image.rb +18 -0
  404. data/test/fixtures/example_application/schema/projects_page.rb +12 -0
  405. data/test/fixtures/example_application/schema/text.rb +8 -0
  406. data/test/fixtures/example_application/templates/client_project/images.html.cut +1 -0
  407. data/test/fixtures/example_application/templates/client_project.html.cut +4 -0
  408. data/test/fixtures/example_application/templates/client_projects.html.cut +6 -0
  409. data/test/fixtures/example_application/templates/info_page/inline.html.cut +0 -0
  410. data/test/fixtures/example_application/templates/inline_image.html.cut +1 -0
  411. data/test/fixtures/example_application/templates/layouts/home.html.cut +15 -0
  412. data/test/fixtures/example_application/templates/layouts/info.html.cut +3 -0
  413. data/test/fixtures/example_application/templates/layouts/project.html.cut +13 -0
  414. data/test/fixtures/example_application/templates/layouts/projects.html.cut +11 -0
  415. data/test/fixtures/example_application/templates/layouts/standard.html.cut +0 -0
  416. data/test/fixtures/example_application/templates/project/inline.html.cut +5 -0
  417. data/test/fixtures/example_application/templates/project.html.cut +5 -0
  418. data/test/fixtures/example_application/templates/project_image.html.cut +1 -0
  419. data/test/fixtures/example_application/templates/text.html.cut +1 -0
  420. data/test/fixtures/images/rose.greyscale.jpg +0 -0
  421. data/test/fixtures/images/rose.jpg +0 -0
  422. data/test/fixtures/images/size.gif +0 -0
  423. data/test/fixtures/images/size.jpg +0 -0
  424. data/test/fixtures/images/size.png24 +0 -0
  425. data/test/fixtures/images/size.png8 +0 -0
  426. data/test/fixtures/layouts/layouts/custom1.html.cut +1 -0
  427. data/test/fixtures/layouts/layouts/custom1.pdf.cut +0 -0
  428. data/test/fixtures/layouts/layouts/custom1.xml.cut +0 -0
  429. data/test/fixtures/layouts/layouts/custom2.html.cut +1 -0
  430. data/test/fixtures/layouts/layouts/custom3.html.cut +0 -0
  431. data/test/fixtures/layouts/layouts/standard.html.cut +1 -0
  432. data/test/fixtures/media/101/003/rose.jpg +0 -0
  433. data/test/fixtures/permissions/config/user_levels.yml +9 -0
  434. data/test/fixtures/permissions/media/image.jpg +0 -0
  435. data/test/fixtures/plugins/schema_plugin/init.rb +1 -0
  436. data/test/fixtures/plugins/schema_plugin/schema/external.rb +5 -0
  437. data/test/fixtures/plugins/schema_plugin/templates/external.html.cut +1 -0
  438. data/test/fixtures/plugins/schema_plugin/templates/from_plugin.html.cut +0 -0
  439. data/test/fixtures/plugins/schema_plugin/templates/layouts/from_plugin.html.cut +0 -0
  440. data/test/fixtures/public/templates/layouts/default.html.cut +1 -0
  441. data/test/fixtures/public/templates/layouts/default.pdf.cut +1 -0
  442. data/test/fixtures/public/templates/layouts/default.rss.cut +1 -0
  443. data/test/fixtures/public/templates/layouts/dynamic.html.cut +1 -0
  444. data/test/fixtures/public/templates/layouts/standard.html.cut +0 -0
  445. data/test/fixtures/schema/before.yml +24 -0
  446. data/test/fixtures/schema/resolvable.yml +12 -0
  447. data/test/fixtures/schema/schema.yml +7 -0
  448. data/test/fixtures/serialisation/class_hash.yaml.erb +53 -0
  449. data/test/fixtures/serialisation/root_hash.yaml.erb +184 -0
  450. data/test/fixtures/sharding/rose.jpg +0 -0
  451. data/test/fixtures/sharding/xaa +0 -0
  452. data/test/fixtures/sharding/xab +0 -0
  453. data/test/fixtures/sharding/xac +0 -0
  454. data/test/fixtures/sharding/xad +0 -0
  455. data/test/fixtures/sharding/xae +0 -0
  456. data/test/fixtures/sharding/xaf +0 -0
  457. data/test/fixtures/sharding/xag +0 -0
  458. data/test/fixtures/styles/box_a/runny.html.cut +0 -0
  459. data/test/fixtures/styles/box_a.html.cut +1 -0
  460. data/test/fixtures/styles/named2.html.cut +1 -0
  461. data/test/fixtures/styles/orange/apple.html.cut +1 -0
  462. data/test/fixtures/styles/template_class/named1.html.cut +1 -0
  463. data/test/fixtures/styles/template_class/results.html.cut +1 -0
  464. data/test/fixtures/styles/template_class/walky.html.cut +0 -0
  465. data/test/fixtures/styles/template_class.epub.cut +0 -0
  466. data/test/fixtures/styles/template_class.html.cut +1 -0
  467. data/test/fixtures/styles/template_class.pdf.cut +0 -0
  468. data/test/fixtures/styles/template_sub_class1.html.cut +1 -0
  469. data/test/fixtures/templates/aliases/a/a_style.html.cut +0 -0
  470. data/test/fixtures/templates/aliases/a/page.html.cut +0 -0
  471. data/test/fixtures/templates/aliases/a_alias/a_alias_style.html.cut +0 -0
  472. data/test/fixtures/templates/aliases/layouts/b.html.cut +1 -0
  473. data/test/fixtures/templates/aliases/layouts/b_alias.html.cut +1 -0
  474. data/test/fixtures/templates/aliases/layouts/c_alias.html.cut +1 -0
  475. data/test/fixtures/templates/boxes/blank_content/things.html.cut +1 -0
  476. data/test/fixtures/templates/boxes/my_box_class/christy.html.cut +1 -0
  477. data/test/fixtures/templates/boxes/thangs.html.cut +1 -0
  478. data/test/fixtures/templates/boxes/with_template_box.html.cut +1 -0
  479. data/test/fixtures/templates/content/include.html.cut +1 -0
  480. data/test/fixtures/templates/content/include_dir.html.cut +1 -0
  481. data/test/fixtures/templates/content/included.epub.cut +1 -0
  482. data/test/fixtures/templates/content/included.html.cut +1 -0
  483. data/test/fixtures/templates/content/partial/included.html.cut +1 -0
  484. data/test/fixtures/templates/content/preprocess.html.cut +1 -0
  485. data/test/fixtures/templates/content/second.html.cut +1 -0
  486. data/test/fixtures/templates/content/template.epub.cut +1 -0
  487. data/test/fixtures/templates/content/template.html.cut +1 -0
  488. data/test/fixtures/templates/default_style_class.html.cut +1 -0
  489. data/test/fixtures/templates/direct.html.cut +1 -0
  490. data/test/fixtures/templates/extended/grandparent.html.cut +10 -0
  491. data/test/fixtures/templates/extended/main.html.cut +6 -0
  492. data/test/fixtures/templates/extended/parent.html.cut +10 -0
  493. data/test/fixtures/templates/layouts/entries.html.cut +7 -0
  494. data/test/fixtures/templates/layouts/page_style.html.cut +1 -0
  495. data/test/fixtures/templates/layouts/params.html.cut +1 -0
  496. data/test/fixtures/templates/layouts/preview_render.html.cut +2 -0
  497. data/test/fixtures/templates/layouts/standard_page.html.cut +1 -0
  498. data/test/fixtures/templates/layouts/subdir_style.html.cut +1 -0
  499. data/test/fixtures/templates/layouts/template_params.html.cut +1 -0
  500. data/test/fixtures/templates/page_class/inline_style.html.cut +1 -0
  501. data/test/fixtures/templates/preview_render/inline.html.cut +0 -0
  502. data/test/fixtures/templates/publishing/layouts/dynamic.html.cut +1 -0
  503. data/test/fixtures/templates/publishing/layouts/static.html.cut +1 -0
  504. data/test/fixtures/templates/template_class/anonymous_style.html.cut +4 -0
  505. data/test/fixtures/templates/template_class/another_template.html.cut +0 -0
  506. data/test/fixtures/templates/template_class/complex_template.html.cut +6 -0
  507. data/test/fixtures/templates/template_class/complex_template.pdf.cut +6 -0
  508. data/test/fixtures/templates/template_class/default_template_style.html.cut +4 -0
  509. data/test/fixtures/templates/template_class/images_with_template.html.cut +5 -0
  510. data/test/fixtures/templates/template_class/slots_template.html.cut +5 -0
  511. data/test/fixtures/templates/template_class/slots_template.pdf.cut +5 -0
  512. data/test/fixtures/templates/template_class/this_template.epub.cut +1 -0
  513. data/test/fixtures/templates/template_class/this_template.html.cut +1 -0
  514. data/test/fixtures/templates/template_class/this_template.pdf.cut +1 -0
  515. data/test/fixtures/templates/with_default_style_class.html.cut +1 -0
  516. data/test/functional/test_application.rb +176 -0
  517. data/test/functional/test_back.rb +902 -0
  518. data/test/functional/test_front.rb +571 -0
  519. data/test/javascript/test_dom.rb +94 -0
  520. data/test/javascript/test_markdown.rb +97 -0
  521. data/test/slow/test_publishing.rb +987 -0
  522. data/test/slow/test_visibility.rb +250 -0
  523. data/test/support/custom_matchers.rb +77 -0
  524. data/test/support/timing.rb +23 -0
  525. data/test/test_helper.rb +164 -0
  526. data/test/test_javascript.rb +34 -0
  527. data/test/ui/test_page_editing.rb +167 -0
  528. data/test/ui_helper.rb +114 -0
  529. data/test/unit/test_alias.rb +254 -0
  530. data/test/unit/test_authentication.rb +510 -0
  531. data/test/unit/test_boxes.rb +497 -0
  532. data/test/unit/test_config.rb +156 -0
  533. data/test/unit/test_content.rb +221 -0
  534. data/test/unit/test_content_inheritance.rb +103 -0
  535. data/test/unit/test_extensions.rb +14 -0
  536. data/test/unit/test_fields.rb +392 -0
  537. data/test/unit/test_generators.rb +97 -0
  538. data/test/unit/test_image_size.rb +25 -0
  539. data/test/unit/test_images.rb +265 -0
  540. data/test/unit/test_layouts.rb +111 -0
  541. data/test/unit/test_logger.rb +80 -0
  542. data/test/unit/test_media.rb +70 -0
  543. data/test/unit/test_page.rb +244 -0
  544. data/test/unit/test_permissions.rb +834 -0
  545. data/test/unit/test_piece.rb +80 -0
  546. data/test/unit/test_prototype_set.rb +192 -0
  547. data/test/unit/test_prototypes.rb +102 -0
  548. data/test/unit/test_render.rb +359 -0
  549. data/test/unit/test_schema.rb +1009 -0
  550. data/test/unit/test_serialisation.rb +215 -0
  551. data/test/unit/test_site.rb +145 -0
  552. data/test/unit/test_structure.rb +85 -0
  553. data/test/unit/test_styles.rb +417 -0
  554. data/test/unit/test_templates.rb +224 -0
  555. data/test/unit/test_type_hierarchy.rb +28 -0
  556. metadata +1017 -0
@@ -0,0 +1,329 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'mini_magick'
4
+ require 'delegate'
5
+
6
+ module Spontaneous
7
+ module FieldTypes
8
+
9
+ module ImageFieldUtilities
10
+ attr_accessor :template_params
11
+
12
+ def render(format=:html, *args)
13
+ case format
14
+ when :html
15
+ to_html(*args)
16
+ else
17
+ value
18
+ end
19
+ end
20
+
21
+ def to_html(attr={})
22
+ default_attr = {
23
+ :src => src,
24
+ :width => width,
25
+ :height => height,
26
+ :alt => ""
27
+ }
28
+ default_attr.delete(:width) if width.nil?
29
+ default_attr.delete(:height) if height.nil?
30
+ if template_params && template_params.length > 0 && template_params[0].is_a?(Hash)
31
+ attr = template_params[0].merge(attr)
32
+ end
33
+ if attr.key?(:width) || attr.key?(:height)
34
+ default_attr.delete(:width)
35
+ default_attr.delete(:height)
36
+ if (attr.key?(:width) && !attr[:width]) || (attr.key?(:height) && !attr[:height])
37
+ attr.delete(:width)
38
+ attr.delete(:height)
39
+ end
40
+ end
41
+ attr = default_attr.merge(attr)
42
+ params = []
43
+ attr.each do |name, value|
44
+ params << %(#{name}="#{value.to_s.escape_html}")
45
+ end
46
+ %(<img #{params.join(' ')} />)
47
+ end
48
+
49
+ def to_s
50
+ src
51
+ end
52
+ end
53
+
54
+ class ImageField < Field
55
+ include ImageFieldUtilities
56
+
57
+ def self.accepts
58
+ %w{image/(png|jpeg|gif)}
59
+ end
60
+
61
+ def self.size(name, &process)
62
+ self.sizes[name.to_sym] = process
63
+
64
+ unless method_defined?(name)
65
+ class_eval <<-IMAGE
66
+ def #{name}
67
+ sizes[:#{name}]
68
+ end
69
+ IMAGE
70
+ end
71
+ end
72
+
73
+ def self.sizes
74
+ size_definitions
75
+ end
76
+
77
+ def self.validate_sizes(sizes)
78
+ sizes
79
+ end
80
+
81
+ def self.size_definitions
82
+ @size_definitions ||= {}
83
+ end
84
+
85
+ def image?
86
+ true
87
+ end
88
+
89
+ def sizes
90
+ @sizes ||= Hash.new { |hash, key| hash[key] = ImageAttributes.new(processed_values[key]) }
91
+ end
92
+
93
+ # value used to show conflicts between the current value and the value they're attempting to enter
94
+ def conflicted_value
95
+ value
96
+ end
97
+
98
+ # original is special and should always be defined
99
+ def original
100
+ @original ||= sizes[:original]
101
+ end
102
+
103
+ def width
104
+ original.width
105
+ end
106
+
107
+ def height
108
+ original.height
109
+ end
110
+
111
+ def filesize
112
+ original.filesize
113
+ end
114
+
115
+ def src
116
+ original.src
117
+ end
118
+
119
+ def filepath
120
+ unprocessed_value
121
+ end
122
+
123
+ # formats are irrelevant to image/file fields
124
+ def outputs
125
+ [:original].concat(self.class.size_definitions.map { |name, process| name })
126
+ end
127
+
128
+ def value(format=:html, *args)
129
+ sizes[:original].src
130
+ end
131
+
132
+ def generate(output, image_path)
133
+ return { :src => image_path } unless File.exist?(image_path)
134
+ image = ImageProcessor.new(image_path)
135
+ result = \
136
+ case output
137
+ when :original
138
+ image
139
+ else
140
+ process = self.class.size_definitions[output]
141
+ image.apply(process, output)
142
+ end
143
+ result.serialize
144
+ end
145
+
146
+ def preprocess(image_path)
147
+ filename = nil
148
+ case image_path
149
+ when Hash
150
+ filename = image_path[:filename]
151
+ image_path = image_path[:tempfile].path
152
+ when String
153
+ # return image_path unless File.exist?(image_path)
154
+ end
155
+ return image_path unless File.exist?(image_path)
156
+ media_path = owner.make_media_file(image_path, filename)
157
+ set_unprocessed_value(File.expand_path(media_path))
158
+ media_path
159
+ end
160
+ end
161
+
162
+
163
+ class ImageAttributes
164
+ include ImageFieldUtilities
165
+
166
+ attr_reader :src, :width, :height, :filesize, :filepath
167
+
168
+ def initialize(params={})
169
+ params ||= {}
170
+ @src, @width, @height, @filesize, @filepath = params[:src], params[:width], params[:height], params[:filesize], params[:path]
171
+ end
172
+
173
+ def serialize
174
+ {
175
+ :src => src,
176
+ :width => width,
177
+ :height => height,
178
+ :filesize => filesize,
179
+ :path => filepath
180
+ }
181
+ end
182
+
183
+ def inspect
184
+ %(<#{self.class.name}: src=#{src.inspect} width="#{width}" height="#{height}">)
185
+ end
186
+ end
187
+
188
+ class ImageProcessor
189
+ include ImageFieldUtilities
190
+
191
+ class ImageDelegator < Delegator
192
+ attr_reader :image
193
+
194
+ def initialize(image)
195
+ super
196
+ @image = image
197
+ end
198
+
199
+ def __getobj__
200
+ @image
201
+ end
202
+
203
+ def __setobj__(obj)
204
+ @image = obj
205
+ end
206
+
207
+ def __run__(process)
208
+ combine_options do |c|
209
+ cb = CommandDelegator.new(c)
210
+ cb.__run__(process)
211
+ end
212
+ end
213
+ end
214
+
215
+ class CommandDelegator < Delegator
216
+ def initialize(command_builder)
217
+ super
218
+ @command_builder = command_builder
219
+ end
220
+
221
+ def __getobj__
222
+ @command_builder
223
+ end
224
+
225
+ def __setobj__(obj)
226
+ @command_builder = obj
227
+ end
228
+
229
+ def __run__(process)
230
+ instance_eval(&process)
231
+ end
232
+
233
+ def fit(width, height)
234
+ add(:geometry, "#{width}x#{height}>")
235
+ end
236
+
237
+ def crop(width, height)
238
+ dimensions = "#{width}x#{height}"
239
+ add(:geometry, "#{dimensions}^")
240
+ add(:gravity, "center")
241
+ add(:crop, "#{dimensions}+0+0!")
242
+ end
243
+
244
+ def width(width)
245
+ add(:geometry, "#{width}x>")
246
+ end
247
+
248
+ def height(height)
249
+ add(:geometry, "x#{height}>")
250
+ end
251
+
252
+ def greyscale
253
+ add(:type, "Grayscale")
254
+ end
255
+
256
+ def method_missing(method, *args, &block)
257
+ __getobj__.send(method, *args, &block)
258
+ end
259
+ end
260
+
261
+ MAX_DIM = 2 ** ([42].pack('i').size * 8) - 1 unless defined?(MAX_DIM)
262
+
263
+ attr_reader :path
264
+
265
+ def initialize(path)
266
+ @path = File.expand_path(path)
267
+ end
268
+
269
+ def src
270
+ @src ||= \
271
+ begin
272
+ media_dir = Spontaneous.media_dir
273
+ src = path.sub(%r{^#{media_dir}}, '')
274
+ File.join("/#{File.basename(media_dir)}", src)
275
+ end
276
+ end
277
+
278
+ def filesize
279
+ File.size(path)
280
+ end
281
+
282
+ def width
283
+ dimensions[0]
284
+ end
285
+
286
+ def height
287
+ dimensions[1]
288
+ end
289
+
290
+ def dimensions
291
+ @dimensions ||= Spontaneous::ImageSize.read(path)
292
+ end
293
+
294
+ def apply(process, name)
295
+ image = ::MiniMagick::Image.open(path)
296
+ processor = ImageProcessor::ImageDelegator.new(image)
297
+ processor.__run__(process)
298
+ file_path = filename_for_size(name)
299
+ image.write(file_path)
300
+
301
+ ImageProcessor.new(file_path)
302
+ end
303
+
304
+ def filename_for_size(name)
305
+ directory = File.dirname(path)
306
+ original_filename = File.basename(path)
307
+ parts = original_filename.split('.')
308
+ ext = parts[-1]
309
+ base = parts[0..-2].join('.')
310
+ filename = [base, name, ext].join('.')
311
+ File.join(directory, filename)
312
+ end
313
+
314
+ def serialize
315
+ {
316
+ :src => src,
317
+ :width => width,
318
+ :height => height,
319
+ :filesize => filesize,
320
+ :path => path
321
+ }
322
+ end
323
+ end
324
+
325
+ ImageField.register(:image, :photo)
326
+
327
+ end
328
+ end
329
+
@@ -0,0 +1,37 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'kramdown'
4
+
5
+ module Spontaneous
6
+ module FieldTypes
7
+ class MarkdownField < Field
8
+ def outputs
9
+ [:html]
10
+ end
11
+
12
+ def generate_html(input)
13
+ input.to_html
14
+ end
15
+
16
+ def preprocess(input)
17
+ # convert lines ending with newlines into a <br/>
18
+ # as official Markdown syntax isn't suitable for
19
+ # casual users
20
+ # code taken from:
21
+ # http://github.github.com/github-flavored-markdown/
22
+ output = input.gsub(/^[\w\<][^\n]*\n+/) do |x|
23
+ x =~ /\n{2}/ ? x : (x.strip!; x << " \n")
24
+ end
25
+
26
+ # prevent foo_bar_baz from ending up with an italic word in the middle
27
+ output.gsub!(/(^(?! {4}|\t)\w+_\w+_\w[\w_]*)/) do |x|
28
+ x.gsub('_', '\_') if x.split('').sort.to_s[0..1] == '__'
29
+ end
30
+ Kramdown::Document.new(output)
31
+ end
32
+ end
33
+
34
+ MarkdownField.register(:markdown, :text, :richtext)
35
+ end
36
+ end
37
+
@@ -0,0 +1,14 @@
1
+ # encoding: UTF-8
2
+
3
+
4
+ module Spontaneous
5
+ module FieldTypes
6
+ class StringField < Field
7
+ def generate_html(value)
8
+ escape_html(value)
9
+ end
10
+ end
11
+ StringField.register
12
+ end
13
+ end
14
+
@@ -0,0 +1,40 @@
1
+ # encoding: UTF-8
2
+
3
+
4
+
5
+ module Spontaneous
6
+ module FieldTypes
7
+
8
+ autoload :Field, "spontaneous/field_types/field"
9
+
10
+ @@type_map = {}
11
+
12
+ def self.register(klass, *labels)
13
+ labels.each do |label|
14
+ @@type_map[label.to_sym] = klass
15
+ end
16
+ end
17
+
18
+ def self.[](label)
19
+ @@type_map[label.to_sym] || StringField
20
+ end
21
+
22
+ def self.serialize_field(field)
23
+ [field.schema_id.to_s, field.version, field.unprocessed_value, field.processed_values]
24
+ end
25
+
26
+ def self.deserialize_field(serialized_field)
27
+ {
28
+ :id => serialized_field[0],
29
+ :version => serialized_field[1],
30
+ :unprocessed_value => serialized_field[2],
31
+ :processed_values => serialized_field[3]
32
+ }
33
+ end
34
+
35
+ end
36
+ end
37
+
38
+ [:string, :image, :date, :markdown].each do |type|
39
+ require "spontaneous/field_types/#{type}_field"
40
+ end
@@ -0,0 +1 @@
1
+ <li><a href="{{ page.path }}">{{ page.title }}</a></li>
@@ -0,0 +1,4 @@
1
+ {% extends 'page' %}
2
+ {% block :content %}
3
+ <h2>{{ title }}</h2>
4
+ {% endblock :content %}
@@ -0,0 +1,9 @@
1
+
2
+ class <%= class_name %> < Page
3
+ # see 'templates/<%= disk_name.underscore %>/page.html.cut'
4
+ page_style :page
5
+
6
+ # see 'templates/<%= disk_name.underscore %>/inline.html.cut'
7
+ inline_style :inline
8
+ end
9
+
@@ -0,0 +1,38 @@
1
+ # encoding: UTF-8
2
+
3
+
4
+ module Spontaneous
5
+ module Generators
6
+ class Page < Generator
7
+ def self.banner; "spot generate page [page_type | PageType]"; end
8
+
9
+
10
+ def class_name
11
+ case type_name
12
+ when /^[A-Z]/
13
+ type_name
14
+ else
15
+ type_name.camelize
16
+ end
17
+ end
18
+
19
+ def disk_name
20
+ case type_name
21
+ when /^[A-Z]/
22
+ type_name.underscore
23
+ else
24
+ type_name
25
+ end
26
+ end
27
+
28
+ argument :type_name, :type => :string, :desc => "The name for this page type (page_type_name OR PageTypeName)"
29
+ desc "Generates a new page type"
30
+ def generate_page
31
+ self.destination_root = options[:root]
32
+ empty_directory "schema"
33
+ template 'page.rb.tt', "schema/#{disk_name}.rb"
34
+ copy_file 'inline.html.cut', "templates/#{disk_name}.html.#{Spontaneous::Render.extension}"
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,4 @@
1
+ log/*
2
+ tmp/*
3
+ cache/*
4
+
@@ -0,0 +1,31 @@
1
+ source :rubygems
2
+
3
+ ## choose your poison:
4
+ # gem 'pg', '~> 0.9.0'
5
+ gem 'mysql2', '~> 0.2'
6
+
7
+ # Deploy with Capistrano
8
+ # gem 'capistrano'
9
+
10
+
11
+ ## TODO: replace this path based gem with a version once the gem is live
12
+ #gem 'spontaneous', '<%= Spontaneous::VERSION %>'
13
+ gem 'spontaneous', :path => "/Users/garry/Dropbox/Development/spontaneous3/working"
14
+
15
+ # Choose a Rack handler
16
+ gem 'thin'
17
+ # gem 'mongrel'
18
+
19
+ # group :development, :test do
20
+ # gem 'webrat'
21
+ # end
22
+
23
+ # source gemfiles from Plugins & Features
24
+ Dir['*/**/Gemfile'].each do |path|
25
+ gemfile = File.expand_path(path)
26
+ unless gemfile == File.expand_path(__FILE__)
27
+ dependencies = File.read(gemfile).gsub(/^\s*source.+$/, '')
28
+ eval(dependencies)
29
+ end
30
+ end
31
+
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env rake
2
+
3
+ require File.expand_path('../config/boot.rb', __FILE__)
4
+
5
+ require 'spontaneous/tasks'
6
+
@@ -0,0 +1,7 @@
1
+ ENV["SPOT_MODE"] = "back"
2
+
3
+ require File.expand_path("../boot.rb", __FILE__)
4
+
5
+ logger.info { "Spontaneous::Back running on port #{Spontaneous::Rack.port}" }
6
+
7
+ run Spontaneous::Rack::Back.application.to_app
@@ -0,0 +1,19 @@
1
+ SPOT_ENV = (ENV["SPOT_ENV"] ||= ENV["RACK_ENV"] ||= "development").to_sym unless defined?(SPOT_ENV)
2
+ SPOT_MODE = (ENV["SPOT_MODE"] ||= "back").to_sym unless defined?(SPOT_MODE)
3
+
4
+ Encoding.default_external = Encoding::UTF_8 if defined?(Encoding)
5
+
6
+ # Set up gems listed in the Gemfile.
7
+ ENV['BUNDLE_GEMFILE'] ||= File.expand_path('../../Gemfile', __FILE__)
8
+
9
+ require 'bundler/setup' if File.exists?(ENV['BUNDLE_GEMFILE'])
10
+
11
+ Bundler.require(:default, SPOT_ENV, SPOT_MODE)
12
+
13
+ # TODO: configuration of template engine
14
+ # so, remove this require and move the template init into part of the ::load! method
15
+ # using config settings to determine engine
16
+ require 'cutaneous'
17
+
18
+ Spontaneous.init(:environment => SPOT_ENV, :mode => SPOT_MODE)
19
+
@@ -0,0 +1,21 @@
1
+ ---
2
+ :development: &defaults
3
+ :adapter: mysql2
4
+ :database: <%= @site_name %>
5
+ :user: root
6
+ :host: localhost
7
+
8
+ :test:
9
+ <<: *defaults
10
+ :database: <%= @site_name %>_test
11
+
12
+ :production:
13
+ <<: *defaults
14
+ :database: <%= @site_name %>
15
+ :user: <%= @site_name %>
16
+ :password: passw0rd
17
+
18
+ :rake:
19
+ <<: *defaults
20
+
21
+
@@ -0,0 +1,8 @@
1
+
2
+ site_domain '<%= @domain %>'
3
+ site_id '<%= @site_name %>'
4
+
5
+
6
+ # change this to alter the content-type encoding sent in public HTTP headers
7
+ # TODO: enable this setting on a per-page, per-format basis
8
+ default_charset "utf-8"
@@ -0,0 +1,15 @@
1
+
2
+ publishing_method :threaded
3
+
4
+ # ensures that schema classes are reloaded with every request
5
+ reload_classes true
6
+
7
+ host 'localhost'
8
+
9
+ back do
10
+ port 2011
11
+ end
12
+
13
+ front do
14
+ port 2012
15
+ end
@@ -0,0 +1,5 @@
1
+
2
+ publishing_method :fire_and_forget
3
+
4
+ # used by publishing mech to determine a restart strategy
5
+ handler :unicorn
@@ -0,0 +1,8 @@
1
+ ENV["SPOT_MODE"] = "front"
2
+
3
+ require File.expand_path("../boot.rb", __FILE__)
4
+
5
+ logger.info { "Spontaneous::Front running on port #{Spontaneous::Rack.port}" }
6
+
7
+ run Spontaneous::Rack::Front.application.to_app
8
+
@@ -0,0 +1,22 @@
1
+ # User levels
2
+
3
+ # Feel free to add your own
4
+ # the 'root' user level is added automatically and
5
+ # will always be higher than any you add here
6
+ # Similary the 'none' level will always be lower
7
+ # The order is important -- later leves are higher levels
8
+ # higher levels will always be able to do everything that a lower level can do
9
+ # 'publish' defines the particular level's access to the publishing process
10
+ # This is set per-level -- higher levels don't inherit the value from lower levels
11
+
12
+ - :name: editor
13
+ :publish: false
14
+
15
+ - :name: admin
16
+ :publish: true
17
+
18
+ - :name: designer
19
+ :publish: true
20
+
21
+ # - :name: my_level
22
+ # :publish: true
@@ -0,0 +1,4 @@
1
+ # encoding: UTF-8
2
+
3
+ class Site < Spontaneous::Site
4
+ end
@@ -0,0 +1,8 @@
1
+
2
+ namespace :<%= @site_name %> do
3
+ desc "Example task"
4
+ task :example => [ :environment ] do
5
+ puts "An example task"
6
+ end
7
+ end
8
+
File without changes
File without changes
@@ -0,0 +1 @@
1
+ # TODO: create template for schema map
@@ -0,0 +1,8 @@
1
+ # encoding: UTF-8
2
+
3
+ class Page < Spontaneous::Page
4
+ # pages must respond to the title method
5
+ # so if you remove this 'title' field, then you must replace it with
6
+ # a #title method
7
+ field :title, :string, :default => "New Page"
8
+ end
@@ -0,0 +1,4 @@
1
+ # encoding: UTF-8
2
+
3
+ class Piece < Spontaneous::Piece
4
+ end