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,417 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test_helper'
4
+
5
+
6
+ class StylesTest < MiniTest::Spec
7
+
8
+
9
+ # context "template root" do
10
+ # should "be settable" do
11
+ # File.exists?(template_root).should be_true
12
+ # Spontaneous.template_root = template_root
13
+ # Spontaneous.template_root.should == template_root
14
+ # end
15
+ # end
16
+
17
+ def setup
18
+ self.template_root = File.expand_path(File.join(File.dirname(__FILE__), "../fixtures/styles"))
19
+ Spontaneous::Render.use_development_renderer
20
+ end
21
+
22
+ context "styles for" do
23
+
24
+ setup do
25
+ Spot::Schema.reset!
26
+ class ::MissingClass < Piece; end
27
+ class ::TemplateClass < Piece; end
28
+ class ::TemplateSubClass1 < TemplateClass; end
29
+ class ::TemplateSubClass2 < TemplateClass; end
30
+ class ::InvisibleClass < Piece; end
31
+ end
32
+
33
+ teardown do
34
+ Object.send(:remove_const, :MissingClass)
35
+ Object.send(:remove_const, :TemplateClass)
36
+ Object.send(:remove_const, :TemplateSubClass1)
37
+ Object.send(:remove_const, :TemplateSubClass2)
38
+ end
39
+
40
+ context "pieces" do
41
+
42
+
43
+ context "default styles" do
44
+ setup do
45
+ @piece = TemplateClass.new
46
+ end
47
+
48
+ should "return anonymous style if no templates are found" do
49
+ piece = MissingClass.new
50
+ piece.style.class.should == Spontaneous::Style::Default
51
+ # piece.style.template.must_be_instance_of(Proc)
52
+ piece.style.template.call.should == ""
53
+ end
54
+
55
+ should "derive path from owning class and name" do
56
+ assert_correct_template(@piece, 'template_class')
57
+ end
58
+
59
+ should "render using correct template" do
60
+ @piece.render.should == "template_class.html.cut\n"
61
+ end
62
+
63
+ # should "be able to give a list of available formats" do
64
+ # skip("Need to re-implement the format functionality")
65
+ # @piece.style.formats.should == [:epub, :html, :pdf]
66
+ # end
67
+
68
+ should "simply render an empty string if no templates are available" do
69
+ piece = InvisibleClass.new
70
+ piece.render.should == ""
71
+ end
72
+ end
73
+
74
+
75
+ context "named styles" do
76
+ should "use template found in class directory if exists" do
77
+ TemplateClass.style :named1
78
+ piece = TemplateClass.new
79
+ assert_correct_template(piece, 'template_class/named1')
80
+ piece.render.should == "template_class/named1.html.cut\n"
81
+ end
82
+
83
+ should "use template in template root with correct name if it exists" do
84
+ TemplateClass.style :named2
85
+ piece = TemplateClass.new
86
+ assert_correct_template(piece, 'named2')
87
+ piece.render.should == "named2.html.cut\n"
88
+ end
89
+
90
+ should "allow passing of directory/stylename" do
91
+ TemplateClass.style :'orange/apple'
92
+ piece = TemplateClass.new
93
+ # piece.style.template.should == 'orange/apple'
94
+ assert_correct_template(piece, 'orange/apple')
95
+ piece.render.should == "orange/apple.html.cut\n"
96
+ end
97
+
98
+ should "default to styles marked as 'default'" do
99
+ TemplateClass.style :named1
100
+ TemplateClass.style :named2, :default => true
101
+ piece = TemplateClass.new
102
+ assert_correct_template(piece, 'named2')
103
+ # piece.style.template.should == 'named2'
104
+ piece.render.should == "named2.html.cut\n"
105
+ end
106
+ end
107
+
108
+ context "switching styles" do
109
+ setup do
110
+ TemplateClass.style :named1
111
+ TemplateClass.style :named2, :default => true
112
+ @piece = TemplateClass.new
113
+ assert_correct_template(@piece, 'named2')
114
+ # @piece.style.template.should == 'named2'
115
+ @piece.render.should == "named2.html.cut\n"
116
+ end
117
+
118
+ should "be possible" do
119
+ @piece.style = :named1
120
+ # @piece.style.template.should == 'template_class/named1'
121
+ assert_correct_template(@piece, 'template_class/named1')
122
+ @piece.render.should == "template_class/named1.html.cut\n"
123
+ end
124
+
125
+ should "persist" do
126
+ @piece.style = :named1
127
+ @piece.save
128
+ @piece = Content[@piece.id]
129
+ # @piece.style.template.should == 'template_class/named1'
130
+ assert_correct_template(@piece, 'template_class/named1')
131
+ end
132
+ end
133
+
134
+ context "inheriting styles" do
135
+ should "use default for sub class if it exists" do
136
+ piece = TemplateSubClass1.new
137
+ assert_correct_template(piece, 'template_sub_class1')
138
+ end
139
+
140
+ should "fall back to default style for superclass if default for class doesn't exist" do
141
+ piece = TemplateSubClass2.new
142
+ assert_correct_template(piece, 'template_class')
143
+ # piece.style.template.should == 'template_class'
144
+ end
145
+ should "fall back to defined default style for superclass if default for class doesn't exist" do
146
+ TemplateClass.style :named1
147
+ piece = TemplateSubClass2.new
148
+ # piece.style.template.should == 'template_class/named1'
149
+ assert_correct_template(piece, 'template_class/named1')
150
+ end
151
+ end
152
+
153
+
154
+
155
+
156
+ # context "inline templates" do
157
+ # setup do
158
+ # @class = Class.new(Content)
159
+ # end
160
+ # should "be definiable" do
161
+ # @class.style :simple
162
+ # @class.styles.length.should == 1
163
+ # t = @class.styles.first
164
+ # t.name.should == :simple
165
+ # end
166
+
167
+ # should "have configurable filenames" do
168
+ # @class.style :simple, :filename => "funky"
169
+ # t = @class.styles.first
170
+ # t.filename.should == "funky.html.cut"
171
+ # end
172
+
173
+ # should "have sane default titles" do
174
+ # @class.style :simple_style
175
+ # t = @class.styles.first
176
+ # t.title.should == "Simple Style"
177
+ # end
178
+
179
+ # should "have configurable titles" do
180
+ # @class.style :simple, :title => "A Simple Style"
181
+ # t = @class.styles.first
182
+ # t.title.should == "A Simple Style"
183
+ # end
184
+
185
+ # should "be accessable by name" do
186
+ # @class.style :simple
187
+ # @class.style :complex
188
+ # @class.styles[:simple].should == @class.styles.first
189
+ # end
190
+
191
+ # should "have #styles as a shortcut for #inliine_styles" do
192
+ # @class.style :simple
193
+ # @class.styles.should == @class.styles
194
+ # end
195
+
196
+ # should "take the first style as the default" do
197
+ # @class.style :simple
198
+ # @class.style :complex
199
+ # @class.styles.default.should == @class.styles[:simple]
200
+ # end
201
+
202
+ # should "honour the :default flag" do
203
+ # @class.style :simple
204
+ # @class.style :complex, :default => true
205
+ # @class.styles.default.should == @class.styles[:complex]
206
+ # end
207
+ # end
208
+
209
+ # context "assigned styles" do
210
+ # setup do
211
+ # class ::StyleTestClass < Content
212
+ # style :first_style
213
+ # style :default_style, :default => true
214
+ # end
215
+
216
+ # @a = StyleTestClass.new
217
+ # @b = StyleTestClass.new
218
+ # @a << @b
219
+ # end
220
+
221
+ # teardown do
222
+ # Object.send(:remove_const, :StyleTestClass)
223
+ # end
224
+
225
+ # should "assign the default style" do
226
+ # @a.pieces.first.style.should == ::StyleTestClass.styles.default
227
+ # end
228
+
229
+ # should "persist" do
230
+ # @a.save
231
+ # @b.save
232
+ # @a = StyleTestClass[@a.id]
233
+ # @a.pieces.first.style.should == ::StyleTestClass.styles.default
234
+ # end
235
+
236
+ # should "be settable" do
237
+ # @a.pieces.first.style = StyleTestClass.styles[:first_style]
238
+ # @a.save
239
+ # @a = StyleTestClass[@a.id]
240
+ # @a.pieces.first.style.should == ::StyleTestClass.styles[:first_style]
241
+ # end
242
+
243
+ # context "direct piece access" do
244
+ # setup do
245
+ # @a.pieces.first.style = StyleTestClass.styles[:first_style]
246
+ # @a.save
247
+ # piece_id = @a.pieces.first.target.id
248
+ # @piece = StyleTestClass[piece_id]
249
+ # end
250
+
251
+ # should "be accessible directly for pieces" do
252
+ # @piece.style.should == ::StyleTestClass.styles[:first_style]
253
+ # end
254
+
255
+ # should "not be settable directly on bare pieces" do
256
+ # lambda { @piece.style = ::StyleTestClass.styles.default }.must_raise(NoMethodError)
257
+ # end
258
+ # end
259
+ # end
260
+
261
+ context "inline templates" do
262
+ setup do
263
+ class ::InlineTemplateClass < Content
264
+ field :title
265
+
266
+ template 'html: {{title}}'
267
+ template :pdf, 'pdf: {{title}}'
268
+ end
269
+
270
+ @a = InlineTemplateClass.new
271
+ @a.title = "Total Title"
272
+ end
273
+
274
+ teardown do
275
+ Object.send(:remove_const, :InlineTemplateClass)
276
+ end
277
+
278
+ should "be used to render the content" do
279
+ @a.render.should == "html: Total Title"
280
+ end
281
+
282
+ should "be used to render the content with the right format" do
283
+ @a.render(:pdf).should == "pdf: Total Title"
284
+ end
285
+ end
286
+
287
+ # context "default styles" do
288
+ # class ::DefaultStyleClass < Spontaneous::Box
289
+ # field :title
290
+ # end
291
+
292
+ # class ::WithDefaultStyleClass < Content
293
+ # field :title
294
+ # end
295
+ # class ::WithoutDefaultStyleClass < Content
296
+ # field :title
297
+ # box :with_style, :type => :DefaultStyleClass
298
+ # end
299
+ # setup do
300
+ # Content.delete
301
+
302
+ # @with_default_style = WithDefaultStyleClass.new
303
+ # @with_default_style.title = "Total Title"
304
+ # @without_default_style = WithoutDefaultStyleClass.new
305
+ # @without_default_style.title = "No Title"
306
+ # @without_default_style.with_style.title = "Box Title"
307
+ # # @without_default_style.with_style.path = "Box Title"
308
+ # end
309
+
310
+ # teardown do
311
+ # Content.delete
312
+ # # Object.send(:remove_const, :DefaultStyleClass)
313
+ # # Object.send(:remove_const, :WithDefaultStyleClass)
314
+ # # Object.send(:remove_const, :WithoutDefaultStyleClass)
315
+ # end
316
+
317
+ # should "be used when available" do
318
+ # @with_default_style.render.should == "Title: Total Title\\n"
319
+ # end
320
+
321
+ # should "be used by boxes too" do
322
+ # @without_default_style.with_style.render.should == "Title: Box Title\\n"
323
+ # end
324
+
325
+ # should "fallback to anonymous style when default style template doesn't exist" do
326
+ # @without_default_style.render.should == "Title: Box Title\\n"
327
+ # end
328
+ # end
329
+ end
330
+
331
+ context "boxes" do
332
+ setup do
333
+ class ::BoxA < Spontaneous::Box; end
334
+ class ::BoxB < Spontaneous::Box; end
335
+ end
336
+
337
+ teardown do
338
+ Object.send(:remove_const, :BoxA)
339
+ Object.send(:remove_const, :BoxB)
340
+ end
341
+
342
+ context "anonymous boxes" do
343
+ setup do
344
+ TemplateClass.box :results
345
+ TemplateClass.box :entities
346
+ end
347
+
348
+ should "use template with their name inside container class template dir if it exists" do
349
+ piece = TemplateClass.new
350
+ piece.results << TemplateClass.new
351
+ assert_correct_template(piece.results, 'template_class/results')
352
+ piece.results.render.should == "template_class/results.html.cut\n"
353
+ end
354
+
355
+ should "render a simple list of content if named template doesn't exist" do
356
+ piece = TemplateClass.new
357
+ piece.entities << TemplateClass.new
358
+ piece.entities << TemplateClass.new
359
+ piece.entities.render.should == "template_class.html.cut\n\ntemplate_class.html.cut\n"
360
+ piece.entities.style.template.call.should == "{{ render_content }}"
361
+ end
362
+
363
+
364
+ should "use a named template if given" do
365
+ TemplateClass.box :things do
366
+ style :named1
367
+ end
368
+ piece = TemplateClass.new
369
+ assert_correct_template(piece.things, 'template_class/named1')
370
+ piece.things.render.should == "template_class/named1.html.cut\n"
371
+
372
+ TemplateClass.box :dongles do
373
+ style :named2
374
+ end
375
+ piece = TemplateClass.new
376
+ assert_correct_template(piece.dongles, 'named2')
377
+ piece.dongles.render.should == "named2.html.cut\n"
378
+ end
379
+ end
380
+
381
+ context "boxes with a specified class" do
382
+ setup do
383
+ TemplateClass.box :entities, :type => :BoxA
384
+ TemplateClass.box :results, :type => :BoxB
385
+ end
386
+
387
+ should "use the box name template if it exists" do
388
+ piece = TemplateClass.new
389
+ assert_correct_template(piece.results, 'template_class/results')
390
+ piece.results.render.should == "template_class/results.html.cut\n"
391
+ end
392
+
393
+ should "use the box classes default template if box name template is missing" do
394
+ piece = TemplateClass.new
395
+ assert_correct_template(piece.entities, 'box_a')
396
+ piece.entities.render.should == "box_a.html.cut\n"
397
+ end
398
+
399
+ context "with configured styles" do
400
+ setup do
401
+ BoxA.style :runny
402
+ BoxA.style :walky
403
+ end
404
+
405
+ should "be configurable to use a specific style" do
406
+ TemplateClass.box :sprinters, :type => :BoxA, :style => :runny
407
+ TemplateClass.box :strollers, :type => :BoxA, :style => :walky
408
+ piece = TemplateClass.new
409
+ assert_correct_template(piece.strollers, 'template_class/walky')
410
+ assert_correct_template(piece.sprinters, 'box_a/runny')
411
+ end
412
+ end
413
+ end
414
+ end
415
+ end
416
+ end
417
+
@@ -0,0 +1,224 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test_helper'
4
+
5
+
6
+ class TemplatesTest < MiniTest::Spec
7
+ def first_pass(base_dir, filename, context=nil)
8
+ render_with_renderer(Cutaneous::FirstPassRenderer, base_dir, filename, context)
9
+ end
10
+
11
+ def second_pass(base_dir, filename, context=nil)
12
+ render_with_renderer(Cutaneous::SecondPassRenderer, base_dir, filename, context)
13
+ end
14
+
15
+ def render_with_renderer(renderer_class, base_dir, filename, context = nil)
16
+ context ||= @context
17
+ renderer = renderer_class.new(make_template_root(base_dir))
18
+ path = template_root / filename
19
+ renderer.render(path, context)
20
+ end
21
+
22
+ def make_template_root(base_dir)
23
+ @template_root = File.expand_path(File.join(File.dirname(__FILE__), '../fixtures/templates', base_dir))
24
+ self.template_root = @template_root
25
+ @template_root
26
+ end
27
+
28
+ def setup
29
+ @klass = Class.new(Object) do
30
+ include Cutaneous::ContextHelper
31
+
32
+ def escape(val)
33
+ CGI.escapeHTML(val)
34
+ end
35
+ def title
36
+ "THE TITLE"
37
+ end
38
+
39
+ def unsafe
40
+ "<script>alert('bad')</script>"
41
+ end
42
+
43
+ def bell
44
+ 'ding'
45
+ end
46
+ end
47
+ @context = @klass.new(nil, :html)
48
+ end
49
+
50
+ context "First render" do
51
+ setup do
52
+ @template = Cutaneous::FirstPassParser.new
53
+ end
54
+
55
+ should "ignore second level statements" do
56
+ input = '<html><title>#{title}</title>#{unsafe}</html>'
57
+ @template.convert(input)
58
+ output = @template.render(@context)
59
+ output.should == '<html><title>#{title}</title>#{unsafe}</html>'
60
+ end
61
+
62
+ should "evaluate first level expressions" do
63
+ @template.convert('<html><title>{{title}}</title>#{unsafe}</html>')
64
+ output = @template.render(@context)
65
+ output.should == '<html><title>THE TITLE</title>#{unsafe}</html>'
66
+ end
67
+
68
+ should "evaluate first level statements" do
69
+ @template.convert("<html><title>{{title}}</title>{% 2.times do %}\#{unsafe}{% end %}</html>")
70
+ output = @template.render(@context)
71
+ output.should == '<html><title>THE TITLE</title>#{unsafe}#{unsafe}</html>'
72
+ end
73
+
74
+ should "generate 2nd render templates" do
75
+ @template.convert("<html><title>{{title}}</title>{% 2.times do %}\#{bell}\n{% end %}</html>")
76
+ output = @template.render(@context)
77
+ second = Cutaneous::SecondPassParser.new
78
+ second.convert(output)
79
+ output = second.render(@context)
80
+ output.should == "<html><title>THE TITLE</title>ding\nding\n</html>"
81
+ end
82
+ end
83
+
84
+ context "Second render" do
85
+ setup do
86
+ @template = Cutaneous::SecondPassParser.new
87
+ end
88
+
89
+ should "a render unescaped expressions" do
90
+ @template.convert('<html><title>#{title}</title>#{unsafe}</html>')
91
+ output = @template.render(@context)
92
+ output.should == "<html><title>THE TITLE</title><script>alert('bad')</script></html>"
93
+ end
94
+
95
+ should "render escaped expressions" do
96
+ @template.convert('<html><title>${unsafe}</title></html>')
97
+ output = @template.render(@context)
98
+ output.should == "<html><title>&lt;script&gt;alert('bad')&lt;/script&gt;</title></html>"
99
+ end
100
+
101
+ should "evaluate expressions" do
102
+ @template.convert('<html>%{ 2.times do }<title>#{title}</title>%{ end }</html>')
103
+ output = @template.render(@context)
104
+ output.should == "<html><title>THE TITLE</title><title>THE TITLE</title></html>"
105
+ end
106
+ end
107
+
108
+ context "Content rendering" do
109
+ # setup do
110
+ # @saved_template_root = Spontaneous.template_root
111
+ # Spontaneous.template_root = File.join(File.dirname(__FILE__), '../fixtures/templates/content')
112
+ # end
113
+
114
+ # teardown do
115
+ # Spontaneous.template_root = @saved_template_root
116
+ # end
117
+
118
+ should "render" do
119
+ output = first_pass('content', 'template')
120
+ output.should == "<html><title>THE TITLE</title></html>\n"
121
+ end
122
+
123
+ should "preprocess" do
124
+ output = first_pass('content', 'preprocess')
125
+ output.should == "<html><title>THE TITLE</title>\#{bell}</html>\n"
126
+ end
127
+
128
+ should "include imports" do
129
+ output = first_pass('content', 'include')
130
+ output.should == "<html>\#{bell}ding\n</html>\n"
131
+ end
132
+
133
+ should "include imports in sub-directories" do
134
+ output = first_pass('content', 'include_dir')
135
+ output.should == "<html>\#{bell}ding\n</html>\n"
136
+ end
137
+
138
+ should "preserve the format across includes" do
139
+ context = @klass.new(nil, :epub)
140
+ context.format.should == :epub
141
+ output = first_pass('content', 'template', context)
142
+ output.should == "<epub><epub>\#{bell}ding</epub>\n</epub>\n"
143
+ end
144
+
145
+ should "render a second pass" do
146
+ output = second_pass('content', 'second')
147
+ output.should == "<html><title>THE TITLE</title>ding</html>\n"
148
+ end
149
+
150
+ end
151
+
152
+ context "Template hierarchy" do
153
+
154
+ setup do
155
+ end
156
+
157
+ should "work" do
158
+ output = first_pass('extended', 'main')
159
+ output.should == "Main Title \#{page.title}\nGrandparent Nav\nMain Body\nParent Body\nGrandparent Body\nGrandparent Footer\nParent Footer\n"
160
+ end
161
+ end
162
+
163
+ context "Output conversion" do
164
+ setup do
165
+
166
+ @context_class = Class.new(Object) do
167
+ include Cutaneous::ContextHelper
168
+
169
+ def escape(val)
170
+ CGI.escapeHTML(val)
171
+ end
172
+
173
+ def monkey
174
+ "magic"
175
+ end
176
+
177
+ def field
178
+ @klass ||= Class.new(Object) do
179
+ attr_accessor :format
180
+ def to_html
181
+ "(#{format})"
182
+ end
183
+
184
+ def to_s
185
+ "'#{format}'"
186
+ end
187
+ end
188
+ @klass.new.tap { |i| i.format = format }
189
+ end
190
+
191
+ def slot
192
+ @klass ||= Class.new(Object) do
193
+ def render(format)
194
+ "(#{format})"
195
+ end
196
+ end
197
+ @klass.new
198
+ end
199
+ end
200
+ @template = Cutaneous::FirstPassParser.new
201
+ end
202
+
203
+ should "call #render(format) if context responds to it" do
204
+ context = @context_class.new(nil, :html)
205
+ @template.convert('{{slot}} {{ monkey }}')
206
+ output = @template.render(context)
207
+ output.should == "(html) magic"
208
+ end
209
+
210
+ should "call to_format on non-strings" do
211
+ context = @context_class.new(nil, :html)
212
+ @template.convert('{{field}} {{ monkey }}')
213
+ output = @template.render(context)
214
+ output.should == "(html) magic"
215
+ end
216
+
217
+ should "call to_s on non-strings that have no specific handler" do
218
+ context = @context_class.new(nil, :weird)
219
+ @template.convert('{{field}} {{ monkey }}')
220
+ output = @template.render(context)
221
+ output.should == "'weird' magic"
222
+ end
223
+ end
224
+ end
@@ -0,0 +1,28 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test_helper'
4
+
5
+
6
+ class TypeHierarchyTest < MiniTest::Spec
7
+
8
+
9
+ context "Content" do
10
+ should "have an empty supertype" do
11
+ S::Content.supertype.should be_nil
12
+ S::Content.supertype?.should be_false
13
+ end
14
+ end
15
+ context "Schema classes" do
16
+ setup do
17
+ class SchemaClass < Spontaneous::Piece
18
+ end
19
+ end
20
+ should "have a reference to their super type" do
21
+ SchemaClass.supertype.should == Spontaneous::Piece
22
+ end
23
+
24
+ should "know what file they were defined in" do
25
+ SchemaClass.__source_file.should == File.expand_path(__FILE__)
26
+ end
27
+ end
28
+ end