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,167 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test_helper'
4
+ require 'ui_helper'
5
+
6
+
7
+
8
+
9
+
10
+ class PageEditingTest < MiniTest::Spec
11
+ include SeleniumTest
12
+
13
+ context "Page attributes" do
14
+ should "set the editor title when page title changed" do
15
+ new_title = "Updated #{Time.now.to_i}"
16
+ @browser.open("/@spontaneous#/1@edit")
17
+ @browser.wait_for_element("css=#page-fields")
18
+ @browser.click("css=#page-fields")
19
+ @browser.wait_for_element('css=#editing')
20
+ @browser.type('name=field[title][unprocessed_value]', new_title)
21
+ @browser.click("css=#dialogue-controls .button.save")
22
+ @browser.wait_for_not_visible('dialogue-body')
23
+ @browser.text('css=#page-info h1').should == new_title
24
+ end
25
+ end
26
+
27
+ def select_text(_start, _end, _selector='field-description-1')
28
+ @browser.get_eval(<<-JS)
29
+ var el = window.document.getElementById('#{_selector}');
30
+ el.selectionStart = #{_start};
31
+ el.selectionEnd = #{_end};
32
+ JS
33
+ end
34
+
35
+ context "Markdown text editor" do
36
+ setup do
37
+ @original_text = <<-ORIGINAL
38
+ This is line 1.
39
+
40
+ This is line 2. And this is line 2 too.
41
+
42
+ But this is line 3.
43
+ And this is line 4.
44
+ ORIGINAL
45
+ @browser.open("/@spontaneous#/1@edit")
46
+ @browser.wait_for_element("css=#page-fields")
47
+ @browser.click("css=#page-fields")
48
+ @browser.wait_for_element('css=#field-description-1')
49
+ @browser.type('name=field[description][unprocessed_value]', @original_text)
50
+ end
51
+
52
+ should "embolden text" do
53
+ _start = @original_text.index('line 1')
54
+ _end = _start + 6
55
+ select_text(_start, _end)
56
+ # @browser.element?("css=#editor-field-description-1 .md-toolbar a.bold.active").should be_false
57
+ @browser.click("css=#editor-field-description-1 .md-toolbar a.bold")
58
+ # @browser.wait_for_element("css=#nontingnhgd")
59
+ @browser.value("css=#field-description-1").should == (<<-TXT).strip
60
+ This is **line 1**.
61
+
62
+ This is line 2. And this is line 2 too.
63
+
64
+ But this is line 3.
65
+ And this is line 4.
66
+ TXT
67
+ @browser.get_eval('window.document.getElementById("field-description-1").selectionStart').to_i.should == _start
68
+ @browser.get_eval('window.document.getElementById("field-description-1").selectionEnd').to_i.should == _start + 10
69
+ # @browser.element?("css=#editor-field-description-1 .md-toolbar a.bold.active").should be_true
70
+
71
+ @browser.click("css=#editor-field-description-1 .md-toolbar a.bold")
72
+ @browser.value("css=#field-description-1").should == @original_text.strip
73
+ @browser.get_eval('window.document.getElementById("field-description-1").selectionStart').to_i.should == _start
74
+ @browser.get_eval('window.document.getElementById("field-description-1").selectionEnd').to_i.should == _end
75
+ # @browser.element?("css=#editor-field-description-1 .md-toolbar a.bold.active").should be_false
76
+ end
77
+
78
+ should "italicise text" do
79
+ _start = @original_text.index('this is line 2')
80
+ _end = _start + 14
81
+ select_text(_start, _end)
82
+ # @browser.element?("css=#editor-field-description-1 .md-toolbar a.italic.active").should be_false
83
+ @browser.click("css=#editor-field-description-1 .md-toolbar a.italic")
84
+ # @browser.wait_for_element("css=#nontingnhgd")
85
+ @browser.value("css=#field-description-1").should == (<<-TXT).strip
86
+ This is line 1.
87
+
88
+ This is line 2. And _this is line 2_ too.
89
+
90
+ But this is line 3.
91
+ And this is line 4.
92
+ TXT
93
+ @browser.get_eval('window.document.getElementById("field-description-1").selectionStart').to_i.should == _start
94
+ @browser.get_eval('window.document.getElementById("field-description-1").selectionEnd').to_i.should == _start + 16
95
+ # @browser.element?("css=#editor-field-description-1 .md-toolbar a.italic.active").should be_true
96
+
97
+ @browser.click("css=#editor-field-description-1 .md-toolbar a.italic")
98
+ @browser.value("css=#field-description-1").should == @original_text.strip
99
+ @browser.get_eval('window.document.getElementById("field-description-1").selectionStart').to_i.should == _start
100
+ @browser.get_eval('window.document.getElementById("field-description-1").selectionEnd').to_i.should == _end
101
+ # @browser.element?("css=#editor-field-description-1 .md-toolbar a.italic.active").should be_false
102
+ end
103
+
104
+ should "add headers" do
105
+ _select = 'But this is line 3.'
106
+ _start = @original_text.index(_select)
107
+ _end = _start + _select.length
108
+ select_text(_start, _end)
109
+ @browser.click("css=#editor-field-description-1 .md-toolbar a.h1")
110
+ # @browser.element?("css=#editor-field-description-1 .md-toolbar a.h1.active").should be_false
111
+ # @browser.wait_for_element("css=#nontingnhgd")
112
+ @browser.value("css=#field-description-1").should == (<<-TXT).strip
113
+ This is line 1.
114
+
115
+ This is line 2. And this is line 2 too.
116
+
117
+ But this is line 3.
118
+ ==============================
119
+ And this is line 4.
120
+ TXT
121
+ @browser.get_eval('window.document.getElementById("field-description-1").selectionStart').to_i.should == _start
122
+ @browser.get_eval('window.document.getElementById("field-description-1").selectionEnd').to_i.should == _end + 31
123
+ # @browser.element?("css=#editor-field-description-1 .md-toolbar a.h1.active").should be_true
124
+
125
+ @browser.click("css=#editor-field-description-1 .md-toolbar a.h2")
126
+ @browser.value("css=#field-description-1").should == (<<-TXT).strip
127
+ This is line 1.
128
+
129
+ This is line 2. And this is line 2 too.
130
+
131
+ But this is line 3.
132
+ ------------------------------
133
+ And this is line 4.
134
+ TXT
135
+ @browser.get_eval('window.document.getElementById("field-description-1").selectionStart').to_i.should == _start
136
+ @browser.get_eval('window.document.getElementById("field-description-1").selectionEnd').to_i.should == _end + 31
137
+ # @browser.element?("css=#editor-field-description-1 .md-toolbar a.h1.active").should be_false
138
+ # @browser.element?("css=#editor-field-description-1 .md-toolbar a.h2.active").should be_true
139
+
140
+ @browser.click("css=#editor-field-description-1 .md-toolbar a.h2")
141
+ @browser.value("css=#field-description-1").should == @original_text.strip
142
+ # @browser.element?("css=#editor-field-description-1 .md-toolbar a.h1.active").should be_false
143
+ # @browser.element?("css=#editor-field-description-1 .md-toolbar a.h2.active").should be_false
144
+
145
+ @browser.get_eval('window.document.getElementById("field-description-1").selectionStart').to_i.should == _start
146
+ @browser.get_eval('window.document.getElementById("field-description-1").selectionEnd').to_i.should == _end
147
+ @browser.click("css=#editor-field-description-1 .md-toolbar a.h1")
148
+ @browser.click("css=#editor-field-description-1 .md-toolbar a.h1")
149
+ @browser.value("css=#field-description-1").should == @original_text.strip
150
+ # @browser.element?("css=#editor-field-description-1 .md-toolbar a.h1.active").should be_false
151
+ # @browser.element?("css=#editor-field-description-1 .md-toolbar a.h2.active").should be_false
152
+ end
153
+
154
+
155
+ should "not alter empty selection" do
156
+ select_text(0, 0)
157
+ @browser.click("css=#editor-field-description-1 .md-toolbar a.bold")
158
+ @browser.value("css=#field-description-1").should == @original_text.strip
159
+ @browser.click("css=#editor-field-description-1 .md-toolbar a.italic")
160
+ @browser.value("css=#field-description-1").should == @original_text.strip
161
+ @browser.click("css=#editor-field-description-1 .md-toolbar a.h1")
162
+ @browser.value("css=#field-description-1").should == @original_text.strip
163
+ @browser.click("css=#editor-field-description-1 .md-toolbar a.h2")
164
+ @browser.value("css=#field-description-1").should == @original_text.strip
165
+ end
166
+ end
167
+ end
data/test/ui_helper.rb ADDED
@@ -0,0 +1,114 @@
1
+ require "selenium/client"
2
+
3
+ # should now set up a site and launch the back server
4
+
5
+ # in order for this to work (at least on my machine/setup - os x 10.6) you need to
6
+ # put the version of Firefox that you want to use into /Applications/Firefox.app
7
+ # anywhere else or any other name and it won't work
8
+ SELENIUM_BIN = ENV['SELENIUM_BIN'] || '../selenium-server-standalone-2.0b1.jar'
9
+ SELENIUM_PORT = ENV['SELENIUM_PORT'] || 4444
10
+
11
+ module SeleniumTest
12
+ def self.included(base)
13
+ base.extend(ClassMethods)
14
+ end
15
+ @@browser = nil
16
+
17
+ def browser
18
+ @@browser
19
+ end
20
+
21
+ module ClassMethods
22
+ def browser
23
+ @@browser
24
+ end
25
+
26
+ def startup
27
+ Spontaneous::Permissions::User.delete
28
+ @user = Spontaneous::Permissions::User.create(:email => "root@example.com", :login => "root", :name => "root", :password => "rootpass", :password_confirmation => "rootpass")
29
+ @user.update(:level => Spontaneous::Permissions.root)
30
+ @user.save
31
+ launch_selenium
32
+ launch_site
33
+ @@browser = Selenium::Client::Driver.new(
34
+ :host => "localhost",
35
+ :port => SELENIUM_PORT,
36
+ :browser => "*firefox",
37
+ # :browser => "*firefox3/Applications/Firefox/Firefox3_5.app/Contents/MacOS/firefox-bin",
38
+ # :browser => "*chrome/Applications/Google\\ Chrome.app/Contents/MacOS/Google\\ Chrome",
39
+ :url => "http://localhost:2011/",
40
+ :timeout_in_second => 60
41
+ )
42
+ # @@browser.start_new_browser_session
43
+ end
44
+
45
+ def shutdown
46
+ # @@browser.close_current_browser_session
47
+ kill_selenium
48
+ kill_site
49
+ end
50
+
51
+ def launch_site
52
+ puts "TODO: Launch & initialise site"
53
+ end
54
+
55
+ def kill_site
56
+ puts "TODO: kill site"
57
+ end
58
+
59
+ def launch_selenium
60
+ if !@_selenium_pid
61
+ puts "\n>>> Launching selenium #{SELENIUM_BIN}"
62
+ @_selenium_pid = fork do
63
+ STDOUT.reopen("/dev/null")
64
+ STDERR.reopen("/dev/null")
65
+ exec("java -jar #{SELENIUM_BIN} -port #{SELENIUM_PORT}")
66
+ end
67
+ running, sock = false, nil
68
+ waiting, max_wait = 0, 8
69
+
70
+ print " > Waiting for Selenium server."
71
+ catch :giveup do
72
+ begin
73
+ begin
74
+ sock = TCPSocket.open('127.0.0.1', SELENIUM_PORT)
75
+ running = true
76
+ rescue Errno::ECONNREFUSED
77
+ print "."
78
+ $stdout.flush
79
+ running = false
80
+ waiting += 1
81
+ throw :giveup if waiting >= max_wait
82
+ sleep(2)
83
+ ensure
84
+ sock.close if sock
85
+ end
86
+ end while !running
87
+ puts "\n>>> Selenium running on port #{SELENIUM_PORT} PID #{@_selenium_pid}"
88
+ end
89
+ unless running
90
+ puts ">>> Failed to start Selenium server\n>>> Does #{SELENIUM_BIN} exist?"
91
+ exit(1)
92
+ end
93
+ end
94
+ end
95
+
96
+ def kill_selenium
97
+ if @_selenium_pid
98
+ puts "\n>>> Killing selenium PID #{@_selenium_pid}"
99
+ Process.kill("TERM", @_selenium_pid)
100
+ end
101
+ end
102
+ end # ClassMethods
103
+
104
+ def setup
105
+ @browser = self.class.browser
106
+ self.class.browser.start_new_browser_session
107
+ end
108
+
109
+ def teardown
110
+ self.class.browser.close_current_browser_session
111
+ end
112
+
113
+ end
114
+
@@ -0,0 +1,254 @@
1
+ # encoding: UTF-8
2
+
3
+ require 'test_helper'
4
+
5
+ class AliasTest < MiniTest::Spec
6
+
7
+ def assert_same_content(c1, c2)
8
+ assert_equal c1.length, c2.length
9
+ c1.sort! { |a, b| a.id <=> b.id }
10
+ c2.sort! { |a, b| a.id <=> b.id }
11
+ c1.each_with_index do |a, i|
12
+ b = c2[i]
13
+ assert_equal a.id, b.id
14
+ assert_equal a.class, b.class
15
+ end
16
+ end
17
+
18
+ context "Aliases:" do
19
+ setup do
20
+ Spot::Schema.reset!
21
+ Content.delete
22
+
23
+ self.template_root = File.expand_path(File.join(File.dirname(__FILE__), "../fixtures/templates/aliases"))
24
+
25
+ class ::Page < Spontaneous::Page
26
+ field :title
27
+ end
28
+
29
+ class ::Piece < Spontaneous::Piece; end
30
+
31
+ class ::A < ::Piece
32
+ field :a_field1
33
+ field :a_field2
34
+ field :image, :image
35
+
36
+ style :a_style
37
+ def alias_title
38
+ a_field1.value
39
+ end
40
+
41
+ # def alias_icon_field
42
+ # "/aliasicon.png"
43
+ # end
44
+ end
45
+
46
+ class ::AA < ::A
47
+ field :aa_field1
48
+ style :aa_style
49
+ end
50
+
51
+ class ::AAA < ::AA
52
+ field :aaa_field1
53
+ end
54
+
55
+ class ::B < ::Page
56
+ field :b_field1
57
+ layout :b
58
+ end
59
+
60
+ class ::BB < ::B
61
+ field :bb_field1
62
+ end
63
+
64
+ class ::AAlias < ::Piece
65
+ alias_of :A
66
+
67
+ field :a_alias_field1
68
+ style :a_alias_style
69
+ end
70
+
71
+ class ::AAAlias < ::Piece
72
+ alias_of :AA
73
+ end
74
+
75
+ class ::AAAAlias < ::Piece
76
+ alias_of :AAA
77
+ end
78
+
79
+
80
+ class ::BAlias < ::Page
81
+ alias_of :B
82
+ end
83
+
84
+ class ::BBAlias < ::Piece
85
+ alias_of :BB
86
+ end
87
+
88
+ class ::MultipleAlias < ::Piece
89
+ alias_of :AA, :B
90
+ end
91
+ @root = ::Page.create
92
+ @aliases = ::Page.create(:slug => "aliases").reload
93
+ @root << @aliases
94
+ @a = A.create(:a_field1 => "@a.a_field1").reload
95
+ @aa = AA.create.reload
96
+ @aaa1 = AAA.create(:aaa_field1 => "aaa1").reload
97
+ @aaa2 = AAA.create.reload
98
+ @b = B.new(:slug => "b")
99
+ @root << @b
100
+ @bb = BB.new(:slug => "bb", :bb_field1 => "BB")
101
+ @root << @bb
102
+ @root.save
103
+ end
104
+
105
+ teardown do
106
+ [:Page, :Piece, :A, :AA, :AAA, :B, :BB, :AAlias, :AAAlias, :AAAAlias, :BBAlias, :BAlias, :MultipleAlias].each do |c|
107
+ Object.send(:remove_const, c) rescue nil
108
+ end
109
+ # Content.delete
110
+ end
111
+
112
+ context "All alias" do
113
+ context "class methods" do
114
+ should "provide a list of available instances that includes all subclasses" do
115
+ assert_same_content AAlias.targets, [@a, @aa, @aaa1, @aaa2]
116
+ assert_same_content AAAlias.targets, [@aa, @aaa1, @aaa2]
117
+ assert_same_content AAAAlias.targets, [@aaa1, @aaa2]
118
+ end
119
+
120
+ should "allow aliasing multiple classes" do
121
+ assert_same_content MultipleAlias.targets, [@aa, @aaa1, @aaa2, @b, @bb]
122
+ end
123
+
124
+ should "be creatable with a target" do
125
+ instance = AAlias.create(:target => @a).reload
126
+ instance.target.should == @a
127
+ @a.aliases.should == [instance]
128
+ end
129
+ should "have a back link in the target" do
130
+ instance1 = AAlias.create(:target => @a).reload
131
+ instance2 = AAlias.create(:target => @a).reload
132
+ assert_same_content @a.aliases, [instance1, instance2]
133
+ end
134
+ end
135
+
136
+ context "instances" do
137
+ setup do
138
+ @a_alias = AAlias.create(:target => @a).reload
139
+ @aa_alias = AAAlias.create(:target => @aa).reload
140
+ @aaa_alias = AAAAlias.create(:target => @aaa1).reload
141
+ end
142
+
143
+ should "have their own fields" do
144
+ @a_alias.field?(:a_alias_field1).should be_true
145
+ end
146
+
147
+ # TODO
148
+ should "reference the aliases fields before the targets"
149
+
150
+ should "present their target's fields as their own" do
151
+ @a_alias.field?(:a_field1).should be_true
152
+ @a_alias.a_field1.value.should == @a.a_field1.value
153
+ end
154
+
155
+ should "have access to their target's fields" do
156
+ @a_alias.target.a_field1.value.should == @a.a_field1.value
157
+ end
158
+
159
+ should "have their own styles" do
160
+ assert_correct_template(@a_alias, 'a_alias/a_alias_style')
161
+ end
162
+
163
+ should "present their target's styles as their own" do
164
+ @a_alias.style = :a_style
165
+
166
+ assert_correct_template(@a_alias, 'a/a_style')
167
+ end
168
+
169
+ # should "have an independent style setting"
170
+ should "not delete their target when deleted" do
171
+ @a_alias.destroy
172
+ Content[@a.id].should == @a
173
+ end
174
+ should "be deleted when target deleted" do
175
+ @a.destroy
176
+ Content[@a_alias.id].should be_nil
177
+ end
178
+
179
+ should "include target values in serialisation" do
180
+ @a_alias.export[:target].should == @a.shallow_export
181
+ end
182
+
183
+ should "include alias title & icon in serialisation" do
184
+ @a_alias.export[:alias_title].should == @a.alias_title
185
+ @a_alias.export[:alias_icon].should == @a.alias_icon_field.export
186
+ end
187
+ end
188
+ end
189
+
190
+ context "Piece aliases" do
191
+ should "be allowed to target pages" do
192
+ a = BBAlias.create(:target => @bb)
193
+ a.bb_field1.value.should == "BB"
194
+ end
195
+
196
+ should "not be loadable via their compound path when linked to a page" do
197
+ a = BBAlias.create(:target => @bb)
198
+ @aliases << a
199
+ @aliases.save
200
+ Site["/aliases/bb"].should be_nil
201
+ end
202
+ end
203
+
204
+ context "Page aliases" do
205
+ should "be allowed to have piece classes as targets" do
206
+ class ::CAlias < Page
207
+ alias_of :AAA
208
+ layout :c_alias
209
+ end
210
+
211
+ c = CAlias.new(:target => @aaa1)
212
+ c.render.should == "aaa1\n"
213
+ end
214
+ should "be discoverable via their compound path" do
215
+ a = BAlias.create(:target => @b, :slug => "balias")
216
+ @aliases << a
217
+ @aliases.save
218
+ a.save
219
+ a.reload
220
+ a.path.should == "/aliases/b"
221
+ Site["/aliases/balias"].should be_nil
222
+ Site["/aliases/b"].should == a
223
+ end
224
+
225
+ should "render the using target's layout when accessed via the path and no local layouts defined" do
226
+ a = BAlias.create(:target => @b, :slug => "balias")
227
+ @aliases << a
228
+ @aliases.save
229
+ a.reload
230
+ a.render.should == @b.render
231
+ end
232
+
233
+ should "render with locally defined style when available" do
234
+ BAlias.layout :b_alias
235
+ a = BAlias.create(:target => @b, :slug => "balias")
236
+ @aliases << a
237
+ @aliases.save
238
+ a.reload
239
+ a.render.should == "alternate\n"
240
+ end
241
+
242
+ should "have access to their target's page styles" do
243
+ BAlias.layout :b_alias
244
+ a = BAlias.create(:target => @b, :slug => "balias")
245
+ @aliases << a
246
+ @aliases.save
247
+ a.reload
248
+ a.layout = :b
249
+ a.render.should == @b.render
250
+ end
251
+ end
252
+ end
253
+ end
254
+