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,369 @@
1
+ ## Adapted from Padrino::Logger
2
+ #
3
+ # Defines our SPOT_LOG_LEVEL
4
+ SPOT_LOG_LEVEL = ENV['SPOT_LOG_LEVEL'] unless defined?(SPOT_LOG_LEVEL)
5
+
6
+ module Spontaneous
7
+
8
+ ##
9
+ # Returns the spontaneous logger
10
+ #
11
+ # ==== Examples
12
+ #
13
+ # logger.debug "foo"
14
+ # logger.warn "bar"
15
+ #
16
+ def self.logger
17
+ Thread.current[:spontaneous_logger] ||= Spontaneous::Logger.setup!
18
+ end
19
+
20
+ def self.logger=(logger)
21
+ Thread.current[:spontaneous_logger] = logger
22
+ end
23
+
24
+ ##
25
+ # Extensions to the built in Ruby logger.
26
+ #
27
+ # ==== Examples
28
+ #
29
+ # logger.debug "foo"
30
+ # logger.warn "bar"
31
+ #
32
+ class Logger
33
+
34
+ attr_accessor :level
35
+ attr_accessor :auto_flush
36
+ attr_reader :buffer
37
+ attr_reader :log
38
+ attr_reader :init_args
39
+
40
+ ##
41
+ # Ruby (standard) logger levels:
42
+ #
43
+ # :fatal:: An unhandleable error that results in a program crash
44
+ # :error:: A handleable error condition
45
+ # :warn:: A warning
46
+ # :info:: generic (useful) information about system operation
47
+ # :debug:: low-level information for developers
48
+ #
49
+ Levels = {
50
+ :fatal => 7,
51
+ :error => 6,
52
+ :warn => 4,
53
+ :info => 3,
54
+ :debug => 1,
55
+ :trace => 0
56
+ } unless const_defined?(:Levels)
57
+
58
+ @@mutex = {}
59
+
60
+ ##
61
+ # Configuration for a given environment, possible options are:
62
+ #
63
+ # :log_level:: Once of [:fatal, :error, :warn, :info, :debug]
64
+ # :stream:: Once of [:to_file, :null, :stdout, :stderr] our your custom stream
65
+ # :log_level::
66
+ # The log level from, e.g. :fatal or :info. Defaults to :debug in the
67
+ # production environment and :debug otherwise.
68
+ # :auto_flush::
69
+ # Whether the log should automatically flush after new messages are
70
+ # added. Defaults to true.
71
+ # :format_datetime:: Format of datetime. Defaults to: "%d/%b/%Y %H:%M:%S"
72
+ # :format_message:: Format of message. Defaults to: ""%s - - [%s] \"%s\"""
73
+ #
74
+ # ==== Examples
75
+ #
76
+ # Spontaneous::Logger::Config[:development] = { :log_level => :debug, :to_file }
77
+ # # or you can edit our defaults
78
+ # Spontaneous::Logger::Config[:development][:log_level] = :error
79
+ # # or you can use your stream
80
+ # Spontaneous::Logger::Config[:development][:stream] = StringIO.new
81
+ #
82
+ # Defaults are:
83
+ #
84
+ # :production => { :log_level => :warn, :stream => :to_file }
85
+ # :development => { :log_level => :debug, :stream => :stdout }
86
+ # :test => { :log_level => :fatal, :stream => :null }
87
+ #
88
+ Config = {
89
+ :production => { :log_level => :warn, :stream => :to_file },
90
+ :development => { :log_level => :debug, :stream => :stdout },
91
+ :test => { :log_level => :debug, :stream => :null },
92
+ :gem => { :log_level => :trace, :stream => :stdout }
93
+ }
94
+
95
+ # Embed in a String to clear all previous ANSI sequences.
96
+ CLEAR = "\e[0m"
97
+ # The start of an ANSI bold sequence.
98
+ BOLD = "\e[1m"
99
+ # Set the terminal's foreground ANSI color to black.
100
+ BLACK = "\e[30m"
101
+ # Set the terminal's foreground ANSI color to red.
102
+ RED = "\e[31m"
103
+ # Set the terminal's foreground ANSI color to green.
104
+ GREEN = "\e[32m"
105
+ # Set the terminal's foreground ANSI color to yellow.
106
+ YELLOW = "\e[33m"
107
+ # Set the terminal's foreground ANSI color to blue.
108
+ BLUE = "\e[34m"
109
+ # Set the terminal's foreground ANSI color to magenta.
110
+ MAGENTA = "\e[35m"
111
+ # Set the terminal's foreground ANSI color to cyan.
112
+ CYAN = "\e[36m"
113
+ # Set the terminal's foreground ANSI color to white.
114
+ WHITE = "\e[37m"
115
+
116
+ # Colors for levels
117
+ ColoredLevels = {
118
+ :fatal => [BOLD, RED],
119
+ :error => [RED],
120
+ :warn => [YELLOW],
121
+ :info => [GREEN],
122
+ :debug => [CYAN],
123
+ :trace => []
124
+ } unless defined?(ColoredLevels)
125
+
126
+ ##
127
+ # Setup a new logger
128
+ #
129
+ def self.setup!
130
+ setup
131
+ end
132
+
133
+ ##
134
+ # Setup a new logger with options
135
+ #
136
+ def self.setup(options = {})
137
+ config_level = (SPOT_LOG_LEVEL || Spontaneous.env || :test).to_sym # need this for SPOT_LOG_LEVEL
138
+ config = Config[config_level]
139
+ stream = \
140
+ if logfile = options[:logfile]
141
+ FileUtils.mkdir_p(File.dirname(logfile)) unless File.directory?(File.dirname(logfile))
142
+ File.new(logfile, "a+")
143
+ else
144
+ case config[:stream]
145
+ when :to_file
146
+ FileUtils.mkdir_p(Spontaneous.root("log")) unless File.exists?(Spontaneous.root("log"))
147
+ File.new(Spontaneous.root("log", "#{Spontaneous.env}.log"), "a+")
148
+ when :null then StringIO.new
149
+ when :stdout then $stdout
150
+ when :stderr then $stderr
151
+ else config[:stream] # return itself, probabilly is a custom stream.
152
+ end
153
+ end
154
+ config[:log_level] = options[:log_level] if options[:log_level]
155
+ Spontaneous.logger = Spontaneous::Logger.new(config.merge(:stream => stream))
156
+ end
157
+
158
+ ##
159
+ # To initialize the logger you create a new object, proxies to set_log.
160
+ #
161
+ # ==== Options
162
+ #
163
+ # :stream:: Either an IO object or a name of a logfile. Defaults to $stdout
164
+ # :log_level::
165
+ # The log level from, e.g. :fatal or :info. Defaults to :debug in the
166
+ # production environment and :debug otherwise.
167
+ # :auto_flush::
168
+ # Whether the log should automatically flush after new messages are
169
+ # added. Defaults to true.
170
+ # :format_datetime:: Format of datetime. Defaults to: "%d/%b/%Y %H:%M:%S"
171
+ # :format_message:: Format of message. Defaults to: ""%s - - [%s] \"%s\"""
172
+ #
173
+ def initialize(options={})
174
+ @buffer = []
175
+ @auto_flush = options.has_key?(:auto_flush) ? options[:auto_flush] : true
176
+ @level = options[:log_level] ? Levels[options[:log_level]] : Levels[:debug]
177
+ @log = options[:stream] || $stdout
178
+ @log.sync = true
179
+ @mutex = @@mutex[@log] ||= Mutex.new
180
+ @format_datetime = options[:format_datetime] || "%d/%b/%Y %H:%M:%S"
181
+ @format_message = options[:format_message] || "%s - [%s] \"%s\""
182
+ end
183
+
184
+ ##
185
+ # Colorize our level
186
+ #
187
+ def colored_level(level)
188
+ style = ColoredLevels[level.to_s.downcase.to_sym].join("")
189
+ "#{style}#{level.to_s.upcase.rjust(7)}#{CLEAR}"
190
+ end
191
+
192
+ ##
193
+ # Set a color for our string. Color can be a symbol/string
194
+ #
195
+ def set_color(string, color, bold=false)
196
+ color = self.class.const_get(color.to_s.upcase) if color.is_a?(Symbol)
197
+ bold = bold ? BOLD : ""
198
+ "#{bold}#{color}#{string}#{CLEAR}"
199
+ end
200
+
201
+ ##
202
+ # Flush the entire buffer to the log object.
203
+ #
204
+ def flush
205
+ return unless @buffer.size > 0
206
+ @mutex.synchronize do
207
+ @log.write(@buffer.slice!(0..-1).join(''))
208
+ end
209
+ end
210
+
211
+ ##
212
+ # Close and remove the current log object.
213
+ #
214
+ def close
215
+ flush
216
+ @log.close if @log.respond_to?(:close) && !@log.tty?
217
+ @log = nil
218
+ end
219
+
220
+ ##
221
+ # Appends a message to the log. The methods yield to an optional block and
222
+ # the output of this block will be appended to the message.
223
+ #
224
+ def push(message = nil, level = nil)
225
+ unless @silent
226
+ self << @format_message % [colored_level(level), set_color(Time.now.strftime(@format_datetime), :yellow), message.to_s.strip]
227
+ end
228
+ end
229
+
230
+ ##
231
+ # Directly append message to the log.
232
+ #
233
+ def <<(message = nil)
234
+ message << "\n" unless message[-1] == ?\n
235
+ @buffer << message
236
+ flush if @auto_flush
237
+ message
238
+ end
239
+
240
+ ##
241
+ # Generate the logging methods for Spontaneous.logger for each log level.
242
+ #
243
+ Levels.each_pair do |name, number|
244
+ class_eval <<-LEVELMETHODS, __FILE__, __LINE__
245
+
246
+ # Appends a message to the log if the log level is at least as high as
247
+ # the log level of the logger.
248
+ #
249
+ # ==== Parameters
250
+ # message:: The message to be logged. Defaults to nil.
251
+ #
252
+ # ==== Returns
253
+ # self:: The logger object for chaining.
254
+ def #{name}(message = nil)
255
+ if #{number} >= level
256
+ message = block_given? ? yield : message
257
+ self.push(message, :#{name})
258
+ end
259
+ self
260
+ end
261
+
262
+ # Appends a message to the log if the log level is at least as high as
263
+ # the log level of the logger. The bang! version of the method also auto
264
+ # flushes the log buffer to disk.
265
+ #
266
+ # ==== Parameters
267
+ # message:: The message to be logged. Defaults to nil.
268
+ #
269
+ # ==== Returns
270
+ # self:: The logger object for chaining.
271
+ def #{name}!(message = nil)
272
+ if #{number} >= level
273
+ message = block_given? ? yield : message
274
+ self.push(message, :#{name})
275
+ flush
276
+ end
277
+ self
278
+ end
279
+
280
+ # ==== Returns
281
+ # Boolean:: True if this level will be logged by this logger.
282
+ def #{name}?
283
+ #{number} >= level
284
+ end
285
+ LEVELMETHODS
286
+ end
287
+
288
+ def silent!
289
+ @silent = true
290
+ if block_given?
291
+ begin
292
+ yield
293
+ ensure
294
+ @silent = false
295
+ end
296
+ end
297
+ end
298
+
299
+ alias_method :pause!, :silent!
300
+
301
+ def silent?
302
+ @silent
303
+ end
304
+
305
+ def resume!
306
+ @silent = false
307
+ end
308
+ ##
309
+ # Spontaneous::Loggger::Rack forwards every request to an +app+ given, and
310
+ # logs a line in the Apache common log format to the +logger+, or
311
+ # rack.errors by default.
312
+ #
313
+ class Rack
314
+ ##
315
+ # Common Log Format: http://httpd.apache.org/docs/1.3/logs.html#common
316
+ # "lilith.local - - GET / HTTP/1.1 500 -"
317
+ # %{%s - %s %s %s%s %s - %d %s %0.4f}
318
+ #
319
+ FORMAT = %{%s - %s %s %s%s %s - %d %s %0.4f}
320
+
321
+ def initialize(app)
322
+ @app = app
323
+ end
324
+
325
+ def call(env)
326
+ began_at = Time.now
327
+ status, header, body = @app.call(env)
328
+ log(env, status, header, began_at)
329
+ [status, header, body]
330
+ end
331
+
332
+ private
333
+ def log(env, status, header, began_at)
334
+ now = Time.now
335
+ length = extract_content_length(header)
336
+
337
+ logger.debug FORMAT % [
338
+ env['HTTP_X_FORWARDED_FOR'] || env["REMOTE_ADDR"] || "-",
339
+ env["REMOTE_USER"] || "-",
340
+ env["REQUEST_METHOD"],
341
+ env["PATH_INFO"],
342
+ env["QUERY_STRING"].empty? ? "" : "?" + env["QUERY_STRING"],
343
+ env["HTTP_VERSION"],
344
+ status.to_s[0..3],
345
+ length,
346
+ now - began_at ]
347
+ end
348
+
349
+ def extract_content_length(headers)
350
+ headers.each do |key, value|
351
+ if key.downcase == 'content-length'
352
+ return value.to_s == '0' ? '-' : value
353
+ end
354
+ end
355
+ '-'
356
+ end
357
+ end # Rack
358
+ end # Logger
359
+ end # Spontaneous
360
+
361
+ module Kernel #:nodoc:
362
+ ##
363
+ # Define a logger available every where in our app
364
+ #
365
+ def logger
366
+ Spontaneous.logger
367
+ end
368
+ end # Kernel
369
+
@@ -0,0 +1,84 @@
1
+ require 'digest/sha1'
2
+
3
+ module Spontaneous
4
+ class Media
5
+ class << self
6
+
7
+ include Spontaneous::Constants
8
+
9
+ def media_path(*args)
10
+ File.join(Spontaneous.media_dir, *args)
11
+ end
12
+
13
+ @@upload_uid_lock = Mutex.new
14
+ @@upload_uid_index = 0
15
+
16
+ def upload_index
17
+ @@upload_uid_lock.synchronize do
18
+ @@upload_uid_index = (@@upload_uid_index + 1) % 0xFFFFFF
19
+ end
20
+ end
21
+
22
+ def upload_path(filename)
23
+ time = Time.now.to_i
24
+ dir = "#{time}.#{upload_index}"
25
+ Spontaneous.media_path("tmp", dir, filename)
26
+ end
27
+
28
+ def to_urlpath(filepath)
29
+ filepath.gsub(%r{^#{Spontaneous.media_dir}}, "/media")
30
+ end
31
+
32
+ def to_filepath(urlpath)
33
+ parts = urlpath.split("/")
34
+ parts[1] = Spontaneous.media_dir
35
+ ::File.join(*parts)
36
+ end
37
+
38
+ def to_filename(input)
39
+ parts = input.strip.split(/\./)
40
+ ext = parts.last
41
+ name = parts[0..-2].join(DOT)
42
+ name.gsub!(RE_QUOTES, EMPTY)
43
+ name.gsub!(/[^\.A-Za-z0-9_-]+/, DASH)
44
+ name.gsub!(RE_FLATTEN_REPEAT, DASH)
45
+ name.gsub!(RE_FLATTEN_TRAILING, EMPTY)
46
+ [name, ext].join(DOT)
47
+ end
48
+
49
+
50
+ def sha1(filepath)
51
+ Digest::SHA1.file(filepath).hexdigest
52
+ end
53
+
54
+ alias_method :digest, :sha1
55
+
56
+ def combine_shards(hashes, &block)
57
+ hashes = hashes.split(',') unless hashes.is_a?(Array)
58
+ shards = hashes.map { |hash| Spontaneous.shard_path(hash) }
59
+ combined = Tempfile.new('shard')
60
+ combined.binmode
61
+
62
+ shards.each do |shard|
63
+ File.open(shard, 'rb') do |part|
64
+ while data = part.read(131072)
65
+ combined.write(data)
66
+ end
67
+ end
68
+ end
69
+ combined.close
70
+
71
+ if block_given?
72
+ begin
73
+ yield(combined)
74
+ ensure
75
+ combined.close!
76
+ end
77
+ else
78
+ # caller's responsibility to close & delete tempfile
79
+ combined
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end
@@ -0,0 +1,92 @@
1
+ # encoding: UTF-8
2
+
3
+
4
+ module Spontaneous
5
+ class Page < Content
6
+
7
+ plugin Plugins::Supertype
8
+ plugin Plugins::Page::Formats
9
+ plugin Plugins::Layouts
10
+ plugin Plugins::Paths
11
+ plugin Plugins::PageTree
12
+ plugin Plugins::SiteMap
13
+ plugin Plugins::PageSearch
14
+ plugin Plugins::Controllers
15
+ plugin Plugins::Page::Request
16
+
17
+ many_to_one :parent, :class => Content, :reciprocal => :children
18
+ one_to_many :children, :class => Content, :key => :parent_id, :reciprocal => :parent
19
+ one_to_many :content, :class => Content, :key => :page_id, :reciprocal => :page
20
+
21
+ # field :title, :string, :default => "New Page"
22
+
23
+ set_inheritance_root
24
+
25
+ def self.page?
26
+ true
27
+ end
28
+
29
+ def self.export
30
+ super.merge(:title_field => self.title_field.to_s)
31
+ end
32
+
33
+ def self.title_field
34
+ :title
35
+ end
36
+
37
+ def page?
38
+ true
39
+ end
40
+
41
+ alias_method :is_page?, :page?
42
+
43
+ def before_save
44
+ if parent
45
+ self.depth = parent.depth+1
46
+ end
47
+ super
48
+ end
49
+
50
+ def page
51
+ self
52
+ end
53
+
54
+ def entry
55
+ @entry ||= resolve_entry
56
+ end
57
+
58
+ def resolve_entry
59
+ container.all_pieces.find { |e| e.id == self.id }
60
+ end
61
+
62
+ def page=(page)
63
+ end
64
+
65
+ def content_depth
66
+ 0
67
+ end
68
+
69
+ def page_title
70
+ if field = self.fields[title_field]
71
+ field.value
72
+ end
73
+ end
74
+
75
+ def title_field
76
+ self.class.title_field
77
+ end
78
+
79
+ def shallow_export
80
+ hash = super.merge({
81
+ :path => path,
82
+ :title => page_title,
83
+ :slug => slug,
84
+ :uid => uid
85
+ })
86
+ hash.delete(:label)
87
+ hash.delete(:name)
88
+ hash
89
+ end
90
+
91
+ end
92
+ end
@@ -0,0 +1,18 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'sinatra/base'
4
+
5
+ module Spontaneous
6
+ class PageController < Sinatra::Base
7
+ attr_reader :content, :format
8
+
9
+ def initialize(content, format)
10
+ @content, @format = content, (format || :html).to_sym
11
+ super(nil)
12
+ end
13
+
14
+ def page
15
+ content.page
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,77 @@
1
+ # encoding: UTF-8
2
+
3
+
4
+ module Spontaneous
5
+ class PagePiece < ProxyObject
6
+ extend Plugins
7
+ plugin Plugins::Render
8
+
9
+ attr_accessor :container
10
+ attr_reader :target, :style_id
11
+
12
+ def initialize(container, target, style_id)
13
+ @container, @target, @style_id = container, target, style_id
14
+ end
15
+
16
+ def id
17
+ target.id
18
+ end
19
+
20
+ def depth
21
+ container.content_depth + 1
22
+ end
23
+
24
+ def style(format = :html)
25
+ target.class.resolve_style(style_name, format)
26
+ end
27
+
28
+ def entry
29
+ self
30
+ end
31
+
32
+ def export
33
+ target.shallow_export.merge(export_styles).merge({
34
+ :depth => self.depth
35
+ })
36
+ end
37
+
38
+ def export_styles
39
+ {
40
+ :style => style_id.to_s,
41
+ :styles => container.available_styles(target).map { |s| s.schema_id.to_s },
42
+ }
43
+ end
44
+
45
+ def serialize_db
46
+ [target.id, @style_id]
47
+ end
48
+
49
+ def style=(style)
50
+ @style_id = style_to_schema_id(style)
51
+ # because it's not obvious that a change to an entry
52
+ # will affect the fields of the container piece
53
+ # make sure that the container is saved using an instance hook
54
+ target.after_save_hook do
55
+ container.save
56
+ end
57
+ container.entry_modified!(self)
58
+ end
59
+
60
+ def style
61
+ target.resolve_style(style_id)
62
+ end
63
+
64
+ def template(format = :html)
65
+ style.template(format)
66
+ end
67
+
68
+ def method_missing(method, *args)
69
+ if block_given?
70
+ self.target.__send__(method, *args, &Proc.new)
71
+ else
72
+ self.target.__send__(method, *args)
73
+ end
74
+ end
75
+ end
76
+ end
77
+
@@ -0,0 +1,30 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'pathname'
4
+
5
+ module Spontaneous
6
+ class Paths < ::Hash
7
+ def initialize(root)
8
+ @root = File.expand_path(root)
9
+ super()
10
+ end
11
+
12
+ def add(category, *paths)
13
+ self[category] = paths
14
+ end
15
+
16
+ def expanded(category)
17
+ self[category].map do |path, glob|
18
+ path = Pathname.new(@root) + path
19
+ if path.exist?
20
+ path = path.cleanpath
21
+ path += glob if glob
22
+ path.to_s
23
+ else
24
+ nil
25
+ end
26
+ end.compact
27
+ end
28
+
29
+ end # Paths
30
+ end # Spontaneous