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,497 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test_helper'
4
+
5
+
6
+ class BoxesTest < MiniTest::Spec
7
+
8
+ context "Box definitions" do
9
+ setup do
10
+ S::Schema.reset!
11
+ class ::Piece < Spontaneous::Piece; end
12
+ class ::MyBoxClass < Box; end
13
+ class ::MyContentClass < Piece; end
14
+ class ::MyContentClass2 < MyContentClass; end
15
+ MyContentClass.field :description
16
+ end
17
+
18
+ teardown do
19
+ Object.send(:remove_const, :Piece)
20
+ Object.send(:remove_const, :MyContentClass2)
21
+ Object.send(:remove_const, :MyContentClass)
22
+ Object.send(:remove_const, :MyBoxClass)
23
+ end
24
+
25
+ should "start empty" do
26
+ MyContentClass.boxes.length.should == 0
27
+ end
28
+
29
+ should "have a flag showing there are no defined boxes" do
30
+ MyContentClass.has_boxes?.should be_false
31
+ end
32
+
33
+ should "be definable with a name" do
34
+ MyContentClass.box :images0
35
+ MyContentClass.boxes.length.should == 1
36
+ MyContentClass.boxes.first.name.should == :images0
37
+ MyContentClass.has_boxes?.should be_true
38
+ end
39
+
40
+ should "always return a symbol for the name" do
41
+ MyContentClass.box 'images0'
42
+ MyContentClass.boxes.first.name.should == :images0
43
+ end
44
+
45
+ should "create a method of the same name" do
46
+ MyContentClass.box :images1
47
+ MyContentClass.box :images2, :type => :MyBoxClass
48
+ instance = MyContentClass.new
49
+ instance.images1.class.superclass.should == Box
50
+ instance.images2.class.superclass.should == MyBoxClass
51
+ end
52
+
53
+ should "be available by name" do
54
+ MyContentClass.box :images1
55
+ MyContentClass.box :images2, :type => :MyBoxClass
56
+ MyContentClass.boxes[:images1].should == MyContentClass.boxes.first
57
+ MyContentClass.boxes[:images2].should == MyContentClass.boxes.last
58
+ instance = MyContentClass.new
59
+ instance.boxes[:images1].class.superclass.should == Box
60
+ instance.boxes[:images2].class.superclass.should == MyBoxClass
61
+ end
62
+
63
+ should "accept a custom instance class" do
64
+ MyContentClass.box :images1, :type => MyBoxClass
65
+ MyContentClass.boxes.first.instance_class.superclass.should == MyBoxClass
66
+ end
67
+
68
+ should "accept a custom instance class as a string" do
69
+ MyContentClass.box :images1, :type => 'MyBoxClass'
70
+ MyContentClass.boxes.first.instance_class.superclass.should == MyBoxClass
71
+ end
72
+
73
+ should "accept a custom instance class as a symbol" do
74
+ MyContentClass.box :images1, :type => :MyBoxClass
75
+ MyContentClass.boxes.first.instance_class.superclass.should == MyBoxClass
76
+ end
77
+
78
+ should "Instantiate a box of the correct class" do
79
+ MyContentClass.box :images1
80
+ MyContentClass.box :images2, :type => :MyBoxClass
81
+ instance = MyContentClass.new
82
+ instance.boxes.first.class.superclass.should == Box
83
+ instance.boxes.last.class.superclass.should == MyBoxClass
84
+ end
85
+
86
+ should "give access to the prototype within the instance" do
87
+ MyContentClass.box :images1
88
+ instance = MyContentClass.new
89
+ instance.boxes[:images1]._prototype.should == MyContentClass.boxes[:images1]
90
+ end
91
+
92
+ should "Use the name as the title by default" do
93
+ MyContentClass.box :band_and_band
94
+ MyContentClass.box :related_items
95
+ MyContentClass.boxes.first.title.should == "Band & Band"
96
+ MyContentClass.boxes.last.title.should == "Related Items"
97
+ end
98
+
99
+ should "have 'title' option" do
100
+ MyContentClass.box :images4, :title => "Custom Title"
101
+ MyContentClass.boxes.first.title.should == "Custom Title"
102
+ end
103
+
104
+ should "inherit boxes from superclass" do
105
+ MyContentClass.box :images1, :type => :MyBoxClass
106
+ MyContentClass2.box :images2
107
+ MyContentClass2.boxes.length.should == 2
108
+ instance = MyContentClass2.new
109
+ instance.images1.class.superclass.should == MyBoxClass
110
+ instance.images2.class.superclass.should == Box
111
+ instance.boxes.length.should == 2
112
+ end
113
+
114
+ context "ranges" do
115
+ setup do
116
+ MyContentClass.box :images1
117
+ MyContentClass.box :images2
118
+ MyContentClass.box :images3
119
+ MyContentClass.box :images4
120
+ MyContentClass.box :images5
121
+ MyContentClass2.box :images6
122
+ @instance = MyContentClass.new
123
+ @instance2 = MyContentClass2.new
124
+ end
125
+ should "allow access to groups of boxes through ranges" do
126
+ @instance.boxes[1..-2].map { |b| b.box_name }.should == [:images2, :images3, :images4]
127
+ @instance2.boxes[1..-2].map { |b| b.box_name }.should == [:images2, :images3, :images4, :images5]
128
+ end
129
+
130
+ should "allow you to pass a list of names" do
131
+ @instance.boxes[:images1, :images4].map { |b| b.box_name }.should == [:images1, :images4]
132
+ @instance2.boxes[:images1, :images6].map { |b| b.box_name }.should == [:images1, :images6]
133
+ end
134
+
135
+ should "allow a mix of names and indexes" do
136
+ @instance.boxes[0..2, :images5].map { |b| b.box_name }.should == [:images1, :images2, :images3, :images5]
137
+ end
138
+ should "allow access to groups of boxes through tags"
139
+ # MyContentClass.box :images5, :tag => :main
140
+ # MyContentClass.box :posts, :tag => :main
141
+ # MyContentClass.box :comments
142
+ # MyContentClass.box :last, :tag => :main
143
+ # @instance = MyBoxClass.new
144
+ # @instance.boxes.tagged(:main).length.should == 3
145
+ # @instance.boxes.tagged('main').map {|e| e.name }.should == [:images5, :posts, :last]
146
+ # end
147
+ end
148
+ context "with superclasses" do
149
+ setup do
150
+ MyContentClass.box :images6, :tag => :main
151
+
152
+ @subclass1 = Class.new(MyContentClass) do
153
+ box :monkeys, :tag => :main
154
+ box :apes
155
+ end
156
+ @subclass2 = Class.new(@subclass1) do
157
+ box :peanuts
158
+ end
159
+ end
160
+ should "inherit boxes from its superclass" do
161
+ @subclass2.boxes.length.should == 4
162
+ @subclass2.boxes.map { |s| s.name }.should == [:images6, :monkeys, :apes, :peanuts]
163
+ # @subclass2.boxes.tagged(:main).length.should == 2
164
+ instance = @subclass2.new
165
+ instance.boxes.length.should == 4
166
+ end
167
+
168
+ should "allow customisation of the box order" do
169
+ new_order = [:peanuts, :apes, :images6, :monkeys]
170
+ @subclass2.box_order *new_order
171
+ @subclass2.boxes.map { |s| s.name }.should == new_order
172
+ end
173
+
174
+ should "take order of instance boxes from class defn" do
175
+ new_order = [:peanuts, :apes, :images6, :monkeys]
176
+ @subclass2.box_order *new_order
177
+ instance = @subclass2.new
178
+ instance.boxes.map { |e| e.box_name.to_sym }.should == new_order
179
+ end
180
+ end
181
+
182
+
183
+
184
+ should "accept values for the box's fields"
185
+ should "allow overwriting of class definitions using a block"
186
+ end
187
+
188
+ context "Box classes" do
189
+ setup do
190
+ Schema.reset!
191
+ Spontaneous.template_root = File.expand_path('../../fixtures/templates/boxes', __FILE__)
192
+ class ::Piece < Spontaneous::Piece; end
193
+ class ::MyContentClass < ::Piece; end
194
+ class ::MyBoxClass < Box; end
195
+ MyBoxClass.field :title, :string
196
+ MyBoxClass.field :description, :string
197
+ MyContentClass.box :images, :class => :MyBoxClass, :fields => {
198
+ :title => "Default Title",
199
+ :description => "Default Description"
200
+ }
201
+ @content = MyContentClass.new
202
+ end
203
+
204
+ teardown do
205
+ Object.send(:remove_const, :Piece)
206
+ Object.send(:remove_const, :MyContentClass)
207
+ Object.send(:remove_const, :MyBoxClass)
208
+ end
209
+
210
+ should "have fields" do
211
+ MyBoxClass.fields.length.should == 2
212
+ MyBoxClass.field :another, :string
213
+ MyBoxClass.fields.length.should == 3
214
+ end
215
+
216
+ context "with fields" do
217
+
218
+ should "save their field values" do
219
+ @content.images.title = "something"
220
+ @content.images.description = "description here"
221
+ @content.save
222
+ @content.reload
223
+ @content.images.title.value.should == "something"
224
+ @content.images.description.value.should == "description here"
225
+ end
226
+
227
+ should "take initial values from box definition" do
228
+ @content.images.title.value.should == "Default Title"
229
+ @content.images.description.value.should == "Default Description"
230
+ end
231
+ end
232
+
233
+ should "allow inline definition of fields" do
234
+ MyContentClass.box :partners do
235
+ field :name, :string
236
+ field :logo, :image
237
+ field :description, :string
238
+ end
239
+ instance = MyContentClass.new
240
+ instance.partners.name.must_be_instance_of(Spontaneous::FieldTypes::StringField)
241
+ instance.partners.name = "Howard"
242
+ instance.partners.description = "Here is Howard"
243
+ instance.save
244
+ instance = Content[instance.id]
245
+ instance.partners.name.value.should == "Howard"
246
+ instance.partners.description.value.should == "Here is Howard"
247
+ end
248
+
249
+ should "default to template in root with the same name" do
250
+ end
251
+
252
+ # context "with styles" do
253
+ # setup do
254
+ # MyBoxClass.field :title, :string
255
+ # MyBoxClass.style :christy
256
+ # class ::InheritedStyleBox < MyBoxClass; end
257
+ # class ::WithTemplateBox < Box; end
258
+ # class ::WithoutTemplateBox < Box; end
259
+ # class ::BlankContent < Content; end
260
+ # @content = MyContentClass.new
261
+ # @content.images.title = "whisty"
262
+ # end
263
+
264
+ # teardown do
265
+ # Object.send(:remove_const, :InheritedStyleBox)
266
+ # Object.send(:remove_const, :WithTemplateBox)
267
+ # Object.send(:remove_const, :WithoutTemplateBox)
268
+ # Object.send(:remove_const, :BlankContent)
269
+ # end
270
+
271
+ # should "render using explicit styles" do
272
+ # @content.images.render.should == "christy: whisty\\n"
273
+ # end
274
+
275
+ # should_eventually "allow defining style in definition" do
276
+ # BlankContent.box :images do
277
+ # style :inline_style
278
+ # end
279
+ # instance = BlankContent.new
280
+ # instance.images.style.filename.should == "inline_style.html.cut"
281
+ # end
282
+
283
+ # should "render using default template style" do
284
+ # BlankContent.box :images, :class => :WithTemplateBox
285
+ # instance = BlankContent.new
286
+ # instance.images.render.should == "with_template_box.html.cut\\n"
287
+ # end
288
+
289
+ # should "render using global default box styles" do
290
+ # entry = Object.new
291
+ # entry.stubs(:render).returns("<entry>")
292
+ # BlankContent.box :images, :class => :WithoutTemplateBox
293
+ # instance = BlankContent.new
294
+ # instance.images.stubs(:pieces).returns([entry])
295
+ # instance.images.render.should == "<entry>"
296
+ # end
297
+
298
+ # should "find templates named after box in owning classes template dir" do
299
+ # BlankContent.box :things
300
+ # instance = BlankContent.new
301
+ # instance.things.render.should == "blank_content/things.html.cut\\n"
302
+ # end
303
+
304
+ # should "not use templates with box name found in root template dir" do
305
+ # BlankContent.box :thangs
306
+ # instance = BlankContent.new
307
+ # instance.thangs.render.should == ""
308
+ # end
309
+
310
+ # should "inherit styles from their superclass" do
311
+ # BlankContent.box :images, :class => :InheritedStyleBox
312
+ # instance = BlankContent.new
313
+ # instance.images.title = "ytsirhc"
314
+ # instance.images.render.should == "christy: ytsirhc\\n"
315
+ # end
316
+ # end
317
+
318
+ end
319
+
320
+ context "Box content" do
321
+ setup do
322
+ class ::Piece < Spontaneous::Piece; end
323
+ class ::BlankContent < ::Piece; end
324
+ class ::StyledContent < ::Piece; end
325
+
326
+ BlankContent.style :blank1
327
+ BlankContent.style :blank2
328
+ BlankContent.style :blank3
329
+ BlankContent.box :images
330
+ BlankContent.box :words
331
+
332
+ StyledContent.box :one do
333
+ allow :BlankContent, :style => :blank2
334
+ end
335
+
336
+ StyledContent.box :two do
337
+ allow :BlankContent, :styles => [:blank3, :blank2]
338
+ end
339
+
340
+ @parent = BlankContent.new
341
+ end
342
+
343
+ teardown do
344
+ Object.send(:remove_const, :Piece)
345
+ Object.send(:remove_const, :BlankContent)
346
+ Object.send(:remove_const, :StyledContent)
347
+ end
348
+
349
+ should "be addable" do
350
+ child1 = BlankContent.new
351
+ child2 = BlankContent.new
352
+ child3 = BlankContent.new
353
+ @parent.images << child1
354
+ @parent.words << child2
355
+ child1.box.schema_id.should == @parent.images.schema_id
356
+ child2.box.schema_id.should == @parent.words.schema_id
357
+ @parent.save
358
+ child1.images << child3
359
+ child1.save
360
+ @parent = Content[@parent.id]
361
+ child1.reload; child2.reload; child3.reload
362
+ @parent.images.pieces.should == [child1]
363
+ @parent.words.pieces.should == [child2]
364
+ @parent.pieces.should == [child1, child2]
365
+ child1.images.pieces.should == [child3]
366
+ child1.pieces.should == [child3]
367
+
368
+ @parent.images.pieces.first.box.should == @parent.images
369
+ @parent.words.pieces.first.box.should == @parent.words
370
+ @parent.pieces.first.box.should == @parent.images
371
+ end
372
+
373
+ should "choose correct style" do
374
+ styled = StyledContent.new
375
+ child1 = BlankContent.new
376
+ child2 = BlankContent.new
377
+ child3 = BlankContent.new
378
+ styled.one << child1
379
+ styled.two << child2
380
+ styled.save
381
+ styled = Content[styled.id]
382
+ styled.one.pieces.first.style.name.should == :blank2
383
+ styled.two.pieces.first.style.name.should == :blank3
384
+ end
385
+
386
+ should "allow selection of subclasses" do
387
+ end
388
+ end
389
+ context "Allowed types" do
390
+ setup do
391
+ class ::Allowed1 < Content
392
+ style :frank
393
+ style :freddy
394
+ end
395
+ class ::Allowed2 < Content
396
+ style :john
397
+ style :paul
398
+ style :ringo
399
+ style :george
400
+ end
401
+ class ::Allowed3 < Content
402
+ style :arthur
403
+ style :lancelot
404
+ end
405
+ class ::Allowed4 < Content; end
406
+
407
+ class ::Allowed11 < ::Allowed1; end
408
+ class ::Allowed111 < ::Allowed1; end
409
+
410
+ class ::Parent < Box
411
+ allow :Allowed1
412
+ allow Allowed2, :styles => [:ringo, :george]
413
+ allow 'Allowed3'
414
+ end
415
+
416
+ class ::ChildClass < ::Parent
417
+ end
418
+
419
+ class ::Allowable < Content
420
+ box :parents, :type => :Parent
421
+ end
422
+
423
+ class ::Mixed < Box
424
+ allow_subclasses :Allowed1
425
+ end
426
+ end
427
+
428
+ teardown do
429
+ [:Parent, :Allowed1, :Allowed11, :Allowed111, :Allowed2, :Allowed3, :Allowed4, :ChildClass, :Allowable, :Mixed].each { |k| Object.send(:remove_const, k) } rescue nil
430
+ end
431
+
432
+ should "have a list of allowed types" do
433
+ Parent.allowed.length.should == 3
434
+ end
435
+
436
+ should "have understood the type parameter" do
437
+ Parent.allowed[0].instance_class.should == Allowed1
438
+ Parent.allowed[1].instance_class.should == Allowed2
439
+ Parent.allowed[2].instance_class.should == Allowed3
440
+ end
441
+
442
+ # TODO: decide on whether testing class definitions is a good idea
443
+ # should "raise an error when given an invalid type name" do
444
+ # lambda { Parent.allow :WhatTheHellIsThis }.must_raise(NameError)
445
+ # end
446
+
447
+ should "allow all styles by default" do
448
+ Parent.allowed[2].styles.should == Allowed3.styles
449
+ end
450
+
451
+ should "have a list of allowable styles" do
452
+ Parent.allowed[1].styles.length.should == 2
453
+ Parent.allowed[1].styles.map { |s| s.name }.should == [:ringo, :george]
454
+ end
455
+
456
+ # TODO: decide on whether verifying style names is a good idea
457
+ # should "raise an error if we try to use an unknown style" do
458
+ # lambda { Parent.allow :Allowed3, :styles => [:merlin, :arthur] }.must_raise(Spontaneous::UnknownStyleException)
459
+ # end
460
+
461
+ should "use a configured style when adding a defined allowed type" do
462
+ a = Allowable.new
463
+ b = Allowed2.new
464
+ a.parents << b
465
+ a.parents.pieces.first.style.prototype.should == Allowed2.styles[:ringo]
466
+ end
467
+
468
+ should "know what the available styles are for an entry" do
469
+ a = Allowable.new
470
+ b = Allowed2.new
471
+ c = Allowed3.new
472
+ a.parents << b
473
+ a.parents << c
474
+ a.parents.available_styles(b).map { |s| s.name }.should == [:ringo, :george]
475
+ a.parents.available_styles(c).map { |s| s.name }.should == [:arthur, :lancelot]
476
+ end
477
+
478
+ should "inherit allowed types from superclass" do
479
+ ChildClass.allowed.should == Parent.allowed
480
+ end
481
+
482
+ should "include a subtype's allowed list as well as the supertype's" do
483
+ ChildClass.allow :Allowed4
484
+ ChildClass.allowed.map {|a| a.instance_class }.should == (Parent.allowed.map {|a| a.instance_class } + [Allowed4])
485
+ end
486
+
487
+ should "propagate allowed types to slots" do
488
+ instance = Allowable.new
489
+ instance.parents.allowed_types.should == Parent.allowed_types
490
+ end
491
+
492
+ should "correctly allow addition of subclasses" do
493
+ Mixed.allowed_types.should == [Allowed11, Allowed111]
494
+ end
495
+ end
496
+ end
497
+
@@ -0,0 +1,156 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test_helper'
4
+
5
+ class ConfigTest < MiniTest::Spec
6
+ include CustomMatchers
7
+ def setup
8
+ end
9
+
10
+ context "Config" do
11
+ setup do
12
+ # Spontaneous.send(:remove_const, :Config) rescue nil
13
+ # @lib_dir = File.expand_path(File.join(File.dirname(__FILE__), '../../lib'))
14
+ # load @lib_dir + '/spontaneous/config.rb'
15
+ Config ||= ::Spontaneous::Config
16
+ @pwd = Dir.pwd
17
+ Dir.chdir(File.expand_path("../../fixtures/config", __FILE__))
18
+ Spontaneous.root = Dir.pwd
19
+ class ::TopLevel
20
+ def self.parameter=(something)
21
+ @parameter = something
22
+ end
23
+
24
+ def self.parameter
25
+ @parameter
26
+ end
27
+ end
28
+ end
29
+ teardown do
30
+ Object.send(:remove_const, :TopLevel)
31
+ Dir.chdir(@pwd)
32
+ # self.class.send(:remove_const, :Config) rescue nil
33
+ end
34
+
35
+ context "Config" do
36
+ setup do
37
+ @config = Config.new(:development)
38
+ @config.load(Spontaneous.root / 'config')
39
+ end
40
+ should "load the first time its accessed" do
41
+ @config.over_ridden.should == :development_value
42
+ end
43
+ end
44
+
45
+ context "Independent configuration loading" do
46
+ setup do
47
+ # defined?(Spontaneous).should be_nil
48
+ # Object.send(:remove_const, :Spontaneous) rescue nil
49
+ # defined?(Spontaneous).should be_nil
50
+ # require @lib_dir + '/spontaneous/config.rb'
51
+ # Config.environment = :development
52
+ @config = Config.new(:development)
53
+ @config.load(Spontaneous.root / 'config')
54
+ end
55
+
56
+ teardown do
57
+ end
58
+
59
+ should "be run from application dir" do
60
+ File.exist?('config').should be_true
61
+ end
62
+
63
+ should "read from the global environment file" do
64
+ @config.some_configuration.should == [:some, :values]
65
+ end
66
+
67
+ should "initialise in development mode" do
68
+ @config.environment.should == :development
69
+ end
70
+
71
+ # should "allow setting of environment" do
72
+ # Config.environment.should == :development
73
+ # Config.environment = :production
74
+ # Config.environment.should == :production
75
+ # end
76
+
77
+ should "overwrite values depending on environment" do
78
+ @config.over_ridden.should == :development_value
79
+ config = Config.new(:production)
80
+ config.load(Spontaneous.root / 'config')
81
+ config.over_ridden.should == :production_value
82
+ config = Config.new(:staging)
83
+ config.load(Spontaneous.root / 'config')
84
+ config.over_ridden.should == :environment_value
85
+ end
86
+
87
+ should "allow setting of env values" do
88
+ @config.something_else.should be_nil
89
+ @config[:something_else] = "loud"
90
+ @config.something_else.should == "loud"
91
+ end
92
+
93
+ should "allow setting of env values through method calls" do
94
+ @config.something_else2.should be_nil
95
+ @config.something_else2 = "loud"
96
+ @config.something_else2.should == "loud"
97
+ end
98
+
99
+ should "dynamically switch values according to the configured env" do
100
+ @config.over_ridden.should == :development_value
101
+ config = Config.new(:production)
102
+ config.load(Spontaneous.root / 'config')
103
+ config.over_ridden.should == :production_value
104
+ config = Config.new(:staging)
105
+ config.load(Spontaneous.root / 'config')
106
+ config.over_ridden.should == :environment_value
107
+ end
108
+
109
+ should "allow local over-riding of settings" do
110
+ @config.wobbling.should be_nil
111
+ @config.wobbling = "badly"
112
+ @config.wobbling.should == "badly"
113
+ end
114
+
115
+ should "fallback to defaults" do
116
+ @config.new_setting.should be_nil
117
+ @config.defaults[:new_setting] = "new setting"
118
+ @config.new_setting.should == "new setting"
119
+ end
120
+
121
+ should "accept blocks/procs/lambdas as values" do
122
+ fish = "flying"
123
+ @config.useful_feature = Proc.new { fish }
124
+ @config.useful_feature.should == "flying"
125
+ @config.defaults[:new_dynamic_setting] = Proc.new { fish }
126
+ @config.new_dynamic_setting.should == "flying"
127
+ end
128
+
129
+ should "allow calling of global methods" do
130
+ TopLevel.parameter.should == :dev
131
+ end
132
+
133
+ teardown do
134
+ Dir.chdir(@pwd)
135
+ end
136
+ context "Spontaneous :back" do
137
+ setup do
138
+ @config = Config.new(:development, :back)
139
+ @config.load(Spontaneous.root / 'config')
140
+ end
141
+ should "read the correct configuration values" do
142
+ @config.port.should == 9001
143
+ end
144
+ end
145
+ context "Spontaneous :front" do
146
+ setup do
147
+ @config = Config.new(:development, :front)
148
+ @config.load(Spontaneous.root / 'config')
149
+ end
150
+ should "read the correct configuration values" do
151
+ @config.port.should == 9002
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end