trellis 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (292) hide show
  1. data/.git/COMMIT_EDITMSG +1 -0
  2. data/.git/HEAD +1 -0
  3. data/.git/config +9 -0
  4. data/.git/description +1 -0
  5. data/.git/hooks/applypatch-msg.sample +15 -0
  6. data/.git/hooks/commit-msg.sample +24 -0
  7. data/.git/hooks/post-commit.sample +8 -0
  8. data/.git/hooks/post-receive.sample +15 -0
  9. data/.git/hooks/post-update.sample +8 -0
  10. data/.git/hooks/pre-applypatch.sample +14 -0
  11. data/.git/hooks/pre-commit.sample +18 -0
  12. data/.git/hooks/pre-rebase.sample +169 -0
  13. data/.git/hooks/prepare-commit-msg.sample +36 -0
  14. data/.git/hooks/update.sample +107 -0
  15. data/.git/index +0 -0
  16. data/.git/info/exclude +6 -0
  17. data/.git/logs/HEAD +1 -0
  18. data/.git/logs/refs/heads/master +1 -0
  19. data/.git/logs/refs/remotes/origin/master +1 -0
  20. data/.git/objects/01/2368d4dd3162ed570e6c1423ecb07a6a35f8c0 +0 -0
  21. data/.git/objects/02/238c88c522b88e71529495460cc5c2c8abe110 +0 -0
  22. data/.git/objects/07/03d3b123189f1da72d3889d9340e681841c96d +0 -0
  23. data/.git/objects/0b/3935fdbf3ce8d37e6cb2a6ec94edaccb1c58dc +0 -0
  24. data/.git/objects/0f/ecd1ad35f280c874ce070b7a97a4c1f86ace54 +0 -0
  25. data/.git/objects/12/61911b063b7e6883c5e9db7ab4396183f6f2b5 +0 -0
  26. data/.git/objects/13/0b7e2d214ec198d07aeed5b462597670ce85ad +0 -0
  27. data/.git/objects/13/214d40f02b63f1233fd7881b1df9bb75d9c0a7 +0 -0
  28. data/.git/objects/14/7522bdc96af0b578935d81c1a7347b40573940 +0 -0
  29. data/.git/objects/16/a7fde706fe92b3548254d29722f5ca311ce63b +2 -0
  30. data/.git/objects/16/fe580663cc29d141bf416dff5bf21bf4ea42a3 +0 -0
  31. data/.git/objects/17/2d55806918bafb4e701515edb27147a4ef6498 +0 -0
  32. data/.git/objects/17/686ef1882ed6c3c07b781fab18739b1c5e48bd +0 -0
  33. data/.git/objects/17/824053c41a2cb523303e20cac42f66f9ca2134 +0 -0
  34. data/.git/objects/18/68448c5f88bc73b2fef6b8f3aa75b663013a3a +1 -0
  35. data/.git/objects/1a/6d9051dc4c7db10bdcf5e17c5cb717b072d30a +0 -0
  36. data/.git/objects/1a/8bdb445fb5668dcd1309cb9de5dedf846c822f +0 -0
  37. data/.git/objects/1b/6fa67b70358fdb82eabcd7ef3bc46d518d0426 +0 -0
  38. data/.git/objects/1c/f6510ed08a274fb3292d40557cebb3e7090767 +0 -0
  39. data/.git/objects/1d/e661ce11d5335e5dd7968ef5698e2eb164eb52 +0 -0
  40. data/.git/objects/1e/301ee672d6040e734af6d0a5491185129d7b67 +0 -0
  41. data/.git/objects/21/2201d46200f13d23d8199bd4a7ecc9165205b3 +0 -0
  42. data/.git/objects/22/f687370babdf38d224d2a9ff039707e8d0aac1 +0 -0
  43. data/.git/objects/24/202d2de95dc31f5f1802e629a16ad45b723267 +0 -0
  44. data/.git/objects/25/4c5b6b8d211d8b9f07310fd342fd7b078a81af +0 -0
  45. data/.git/objects/25/5832653fde9e9748855347fe7bce013aa0a6c7 +0 -0
  46. data/.git/objects/25/806945c89b4b5adb8c8676c308e4653361109c +5 -0
  47. data/.git/objects/26/cb8deaca28bf275769cbb71b88e53a44adb9ca +0 -0
  48. data/.git/objects/2e/1c13fb5f154f89cccd4c645540a2ec8ee0f57a +0 -0
  49. data/.git/objects/2f/437425b2c085bb529379e409d6b4bc7f9f9fba +0 -0
  50. data/.git/objects/2f/7cf4a25937b71f3de52e70c7a47cb2f7da07ea +0 -0
  51. data/.git/objects/31/31bdbbac6e6e7e24fd6ea84332461f67e6e5b6 +0 -0
  52. data/.git/objects/32/02e02de478263912b729283eabc7cdab8a8037 +0 -0
  53. data/.git/objects/32/839ed9baa8c800d9033655d1ee995499825fb5 +0 -0
  54. data/.git/objects/34/2e479c61796125b0e025b483401ec12f3c5824 +2 -0
  55. data/.git/objects/36/7acb017aebab3f627a5208c25885c21fa7fdbb +0 -0
  56. data/.git/objects/38/12910d2e2a8e6eeb79a399d20751675d3fbe77 +0 -0
  57. data/.git/objects/38/3fe1e1a07537db6e0f39c6005b7b4e40fa5ccd +0 -0
  58. data/.git/objects/39/5ef328bc94df9191f4d80a77503a5be9f1f673 +0 -0
  59. data/.git/objects/39/dc76dc096fdf737e9f4f7062b78cbf4ab9628f +0 -0
  60. data/.git/objects/3b/09eb196140b471556ed4c3987c0bc739733617 +0 -0
  61. data/.git/objects/3b/9f97f1bf55834832a92bab1ab900918dc49570 +0 -0
  62. data/.git/objects/40/5ffd3925b39dd905638ec24640dd8efa27cc1b +0 -0
  63. data/.git/objects/42/4a5f37c6fe3a7cac54b0f85688c1cce7da9cdf +0 -0
  64. data/.git/objects/44/9e23363d4e20da6a67be7ab78fc610b4e9852a +0 -0
  65. data/.git/objects/48/90bb5d241cecaa30b28148c920b833056c7508 +0 -0
  66. data/.git/objects/4c/558c43676410a2c0a7d5c7b94fca18923a9af1 +0 -0
  67. data/.git/objects/4f/bf572175dd5245104679ff8f676f6a34466c29 +0 -0
  68. data/.git/objects/53/8583edf00c9f656b32149a0e69e030371737c5 +0 -0
  69. data/.git/objects/5b/8a2c4bf7bb56ae199414096dbda21fd4b8cd63 +0 -0
  70. data/.git/objects/5c/9fe8ff998d56dc076657ef88ee9f784ec160f9 +0 -0
  71. data/.git/objects/5f/8441f9d3507587940f31af04dd9fd5911d2812 +0 -0
  72. data/.git/objects/61/4f2752550e63b793e31dcf98b5ea26c32eb0be +0 -0
  73. data/.git/objects/65/801b0fabdfd673861dbb2ac134d438ab2cc5e4 +3 -0
  74. data/.git/objects/66/2746dffaddbcd311f4ac070b5b9bddcd8894a7 +0 -0
  75. data/.git/objects/69/1ed3b65603a0d0dabfb66720e7163664be78f5 +0 -0
  76. data/.git/objects/69/3dc3b6037df8c1c8dfda916d649e7975481124 +0 -0
  77. data/.git/objects/69/67538427b3a371b33c01c72726ac7e67a04c39 +0 -0
  78. data/.git/objects/69/6cd6c3508e2adcc68829497884ff3d4b774dc2 +0 -0
  79. data/.git/objects/69/6ee93917040308ccd0bfc245d63c1cbeb23dae +0 -0
  80. data/.git/objects/6a/3ac317746a8a2cfc88f3580bbd2b03dc0d50b5 +0 -0
  81. data/.git/objects/6d/6ba435839a65b96cb3f7584a40dd3767a0990f +0 -0
  82. data/.git/objects/6f/32c190a651a82caeefeb55eb797fc5daf05426 +0 -0
  83. data/.git/objects/71/fecbce1bec36eaf4de655763d4bb7ceffc991d +0 -0
  84. data/.git/objects/72/01d78a9e90347fd2f7790f9e8665587791d853 +0 -0
  85. data/.git/objects/73/6c97d6a551363ba4a4956408ba228fcab7f91f +0 -0
  86. data/.git/objects/75/3264271e935e18f4eada49aa1818c6fb9e6abb +0 -0
  87. data/.git/objects/75/cc7d390b4a565495cbdc5a08d4479e7e8dbfeb +0 -0
  88. data/.git/objects/76/7c0c96f68b9ccec34ae538045a63bbe4f97d3e +0 -0
  89. data/.git/objects/7b/47fe9b1ab9f2692b9706054de706430089ecd4 +0 -0
  90. data/.git/objects/7c/73144ef6847d1bc2315aee0925c0e5cf5c09d1 +0 -0
  91. data/.git/objects/7d/9c177c155386606aa1024d5cb020a097eea64a +0 -0
  92. data/.git/objects/7d/e9a3296007c09ba9b7bc1802e1c5d9ad1d5dbb +0 -0
  93. data/.git/objects/7e/b73d408147c8d84881109189a9724292abcb8d +0 -0
  94. data/.git/objects/82/0e3bf5449a8f6b8eb637a653dcb2dc387b393c +0 -0
  95. data/.git/objects/83/a10ce96763cb30d0b81425e9372f89c52f4c9f +0 -0
  96. data/.git/objects/83/bdb801e78444d59225f83cf2f336f114cd23cf +0 -0
  97. data/.git/objects/85/24e583e822abc18b1ffdd0aa356c9c079b5548 +0 -0
  98. data/.git/objects/88/b46cc8de5237897d4ba5023d3efdc83fec4f7c +0 -0
  99. data/.git/objects/89/5eea66474f48a2cbf643ad0ef266fd26f9d2a3 +0 -0
  100. data/.git/objects/8a/539c5fc35d5b770d67241d2ccb6c6855df6a43 +0 -0
  101. data/.git/objects/8a/82cdbfb20cc58fdffe4e13b70b55977deb92c6 +0 -0
  102. data/.git/objects/8b/2b537442e4ac8719ffa71b3ae0c707133df06f +0 -0
  103. data/.git/objects/8c/2a45f0c81284a081f8d7980e9a54210a9dd52c +0 -0
  104. data/.git/objects/8e/10355b4ab312450031966107ef6a65b13833ee +0 -0
  105. data/.git/objects/90/f6c76767ae725f15fa6790dcb6afd1719fa0e2 +0 -0
  106. data/.git/objects/92/92b696aba9840c089241c68d4c6ca14be38a64 +2 -0
  107. data/.git/objects/93/e03faa6906892434fa9f2ad230c4ececc64055 +0 -0
  108. data/.git/objects/93/eca2e28d80fda45d327fdfc6c39ae690af41cd +0 -0
  109. data/.git/objects/95/92fe63bd5403654730cdec76cbf116ef83bbff +0 -0
  110. data/.git/objects/96/bc6dd471c1c188a2eb4308bcc3ca4e6c8faac8 +0 -0
  111. data/.git/objects/96/d855221a9ff4fba57d2b70680b57bd5115cfde +0 -0
  112. data/.git/objects/97/4ec92b2b9eb01a73fb57dc78d463cafdda69a7 +0 -0
  113. data/.git/objects/97/b7ec01ebe089832a0972d20b0a40d54456985c +2 -0
  114. data/.git/objects/97/fa6aaae4cfc7654feb39971e7aee5c41ed1679 +1 -0
  115. data/.git/objects/98/18351c6685a1df5d23686e6346d11d261cc6f0 +0 -0
  116. data/.git/objects/98/3d3b7e55cbbce2f2a52c6e6d830a5dca7b4d42 +0 -0
  117. data/.git/objects/a2/e551049a5388112c21e7f3a4a720bf720601fa +0 -0
  118. data/.git/objects/a3/7066bea4fae90d34761a3ebb3f8a348d94eba1 +0 -0
  119. data/.git/objects/a6/c99619145d1b9b75aa15ca04fbe4db0b2ee79b +0 -0
  120. data/.git/objects/aa/e2234d0a8c1485096c7a7de039eceb4e019e13 +0 -0
  121. data/.git/objects/b0/3b52f4269c9719e02ecd6caabd8aff5adf3aac +0 -0
  122. data/.git/objects/b1/50dbbd89f825302a9e82d8fdd66f238b8e6fc4 +0 -0
  123. data/.git/objects/b4/545fbe393aaa18f1c48de4d9f68f64ebf09ddc +0 -0
  124. data/.git/objects/b6/8691404e088692929d40b988b993f815d76756 +0 -0
  125. data/.git/objects/b7/daa3d844ef5f5cd917084e48edd82e67f8f476 +0 -0
  126. data/.git/objects/bf/4232281dba5a0f17e8b5c16b9cbd0f52274fa8 +0 -0
  127. data/.git/objects/bf/9b84d10f19188beffe5ee99e6f5af035ba77d3 +2 -0
  128. data/.git/objects/c0/06e664b306145de804f74ab27550d62a92f58a +1 -0
  129. data/.git/objects/c2/2806b16775f66453012d085d21fb8698521ea9 +0 -0
  130. data/.git/objects/c2/7f6559350f7adb19d43742b55b2f91d07b6550 +0 -0
  131. data/.git/objects/c3/833df21ed674a77374fd40ed931f900134d38b +0 -0
  132. data/.git/objects/c3/b9da021eb76abad0b17ad6c4be75595e41a7e6 +0 -0
  133. data/.git/objects/c5/ca6b7e3561ea88aba1712aabb984d1167787f1 +0 -0
  134. data/.git/objects/c6/39f65e1f43c75b7f57c5ab28623d295dfb2afd +0 -0
  135. data/.git/objects/c8/6f05fa5539f8e69e94850d1cd917919ff581be +0 -0
  136. data/.git/objects/cb/5e499c8dcc6f2901014a08e74f04b7a4bd6596 +0 -0
  137. data/.git/objects/cc/1289d25eeee6ba31b4e406372cb9abf969fc6f +0 -0
  138. data/.git/objects/cc/784e1b49111c42fa7eae10ad0e788186e672d1 +0 -0
  139. data/.git/objects/cc/bcae254dad515d7ef01a461980544e4483c41e +0 -0
  140. data/.git/objects/ce/bfadad3a7c17148998e04275e6d0d1cf1b2e1e +0 -0
  141. data/.git/objects/ce/f3335522abdc47a2c94be70455dcfaa9a51a27 +0 -0
  142. data/.git/objects/cf/6add7ea568d3d90d6a1f8afb0898b0119b14ff +0 -0
  143. data/.git/objects/d0/719abd196033fec0e4cbe2af68a26ca435389c +0 -0
  144. data/.git/objects/d1/ce63ff0eaec4dba419e5547f99195dfb9b5b20 +0 -0
  145. data/.git/objects/d2/c3feb3c74b892cca0049c0aced6ce786a784c8 +0 -0
  146. data/.git/objects/d7/8a91da13413419da71b539a3c6c7df4d8a2458 +0 -0
  147. data/.git/objects/d8/c7bed2b1357d54b6935536a8a51a3c73d535b4 +0 -0
  148. data/.git/objects/da/c3a1277ccb4806011e33eb32c5609cc45c46f2 +0 -0
  149. data/.git/objects/dc/3f920f4b937d0e2ac512f0bb31d477624c46d5 +0 -0
  150. data/.git/objects/dc/6c389abf5bd0d7b9be2a6bb6af90738a410e59 +0 -0
  151. data/.git/objects/df/07c423309f39c4d5570b0fad65dff23af654ae +0 -0
  152. data/.git/objects/e2/93a5c9e2257b9f3fcb8fa5d5c8147a2f07ba1b +0 -0
  153. data/.git/objects/e4/8464df56bf487e96e21ea99487330266dae3c9 +0 -0
  154. data/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
  155. data/.git/objects/e8/0c13a1d1f62756fb9f1e4fb9f7512e5b8c5816 +0 -0
  156. data/.git/objects/e9/b8ade2125b2615ddc4c8043940c40ed36215c9 +0 -0
  157. data/.git/objects/ed/59a7599a81ef7ea7c230c3332345a3484febf8 +0 -0
  158. data/.git/objects/f0/d2a74226877e9a28af814d0d3727e4a3487439 +0 -0
  159. data/.git/objects/f0/f3ba7264f1d8e60eb93a907092af98fdc248e4 +0 -0
  160. data/.git/objects/f1/cdcc7ff2dc6298318523b2c4e425f515a58bf7 +3 -0
  161. data/.git/objects/f4/45c96f406f4d2f9839b3fe2fe8bc7f943ab469 +0 -0
  162. data/.git/objects/f7/eef7ce0a650d6f0c85dc4982f481da7bd44362 +0 -0
  163. data/.git/objects/f9/0abf96c5059ce1ba115f73bc9cf33e4663b3e1 +0 -0
  164. data/.git/objects/f9/cf7ae572eaebbd63f809f16a5ef14b9c679790 +0 -0
  165. data/.git/objects/fc/300df53fe2c9467210e2fd4c2f34e1c9c7c89a +0 -0
  166. data/.git/objects/fc/45546596ab8debc4c9f49a7abc7fc14a7bcc7f +4 -0
  167. data/.git/objects/fc/68d89167f69614eda17bd56dfccb4355d818e6 +0 -0
  168. data/.git/objects/fc/e4c02bb132e73b3cb957da182db7b75a47c242 +0 -0
  169. data/.git/objects/fe/be283da7f326344013f1fc847c12c8f29ab6ef +0 -0
  170. data/.git/refs/heads/master +1 -0
  171. data/.git/refs/remotes/origin/master +1 -0
  172. data/.gitignore +5 -0
  173. data/History.txt +4 -0
  174. data/License.txt +22 -0
  175. data/Manifest.txt +291 -0
  176. data/README +156 -0
  177. data/README.txt +156 -0
  178. data/Rakefile +4 -0
  179. data/config/hoe.rb +83 -0
  180. data/config/requirements.rb +15 -0
  181. data/examples/crud_components/html/address_view_edit.xhtml +19 -0
  182. data/examples/crud_components/html/addresses.xhtml +20 -0
  183. data/examples/crud_components/html/images/destroy.gif +0 -0
  184. data/examples/crud_components/html/images/edit.gif +0 -0
  185. data/examples/crud_components/html/images/field-error-marker.gif +0 -0
  186. data/examples/crud_components/html/images/sort-asc.png +0 -0
  187. data/examples/crud_components/html/images/sort-desc.png +0 -0
  188. data/examples/crud_components/html/images/sortable.png +0 -0
  189. data/examples/crud_components/html/style/trellis.css +416 -0
  190. data/examples/crud_components/source/crud_components.rb +77 -0
  191. data/examples/crud_components/source/domain.rb +6 -0
  192. data/examples/examples.txt +65 -0
  193. data/examples/flickr/source/flickr.rb +87 -0
  194. data/examples/guest_book/source/guest_book.rb +61 -0
  195. data/examples/hangman/html/game_over.xhtml +23 -0
  196. data/examples/hangman/html/guess.xhtml +47 -0
  197. data/examples/hangman/html/images/a_disabled.png +0 -0
  198. data/examples/hangman/html/images/a_enabled.png +0 -0
  199. data/examples/hangman/html/images/b_disabled.png +0 -0
  200. data/examples/hangman/html/images/b_enabled.png +0 -0
  201. data/examples/hangman/html/images/c_disabled.png +0 -0
  202. data/examples/hangman/html/images/c_enabled.png +0 -0
  203. data/examples/hangman/html/images/d_disabled.png +0 -0
  204. data/examples/hangman/html/images/d_enabled.png +0 -0
  205. data/examples/hangman/html/images/e_disabled.png +0 -0
  206. data/examples/hangman/html/images/e_enabled.png +0 -0
  207. data/examples/hangman/html/images/f_disabled.png +0 -0
  208. data/examples/hangman/html/images/f_enabled.png +0 -0
  209. data/examples/hangman/html/images/g_disabled.png +0 -0
  210. data/examples/hangman/html/images/g_enabled.png +0 -0
  211. data/examples/hangman/html/images/h_disabled.png +0 -0
  212. data/examples/hangman/html/images/h_enabled.png +0 -0
  213. data/examples/hangman/html/images/i_disabled.png +0 -0
  214. data/examples/hangman/html/images/i_enabled.png +0 -0
  215. data/examples/hangman/html/images/j_disabled.png +0 -0
  216. data/examples/hangman/html/images/j_enabled.png +0 -0
  217. data/examples/hangman/html/images/k_disabled.png +0 -0
  218. data/examples/hangman/html/images/k_enabled.png +0 -0
  219. data/examples/hangman/html/images/l_disabled.png +0 -0
  220. data/examples/hangman/html/images/l_enabled.png +0 -0
  221. data/examples/hangman/html/images/m_disabled.png +0 -0
  222. data/examples/hangman/html/images/m_enabled.png +0 -0
  223. data/examples/hangman/html/images/n_disabled.png +0 -0
  224. data/examples/hangman/html/images/n_enabled.png +0 -0
  225. data/examples/hangman/html/images/o_disabled.png +0 -0
  226. data/examples/hangman/html/images/o_enabled.png +0 -0
  227. data/examples/hangman/html/images/p_disabled.png +0 -0
  228. data/examples/hangman/html/images/p_enabled.png +0 -0
  229. data/examples/hangman/html/images/q_disabled.png +0 -0
  230. data/examples/hangman/html/images/q_enabled.png +0 -0
  231. data/examples/hangman/html/images/r_disabled.png +0 -0
  232. data/examples/hangman/html/images/r_enabled.png +0 -0
  233. data/examples/hangman/html/images/s_disabled.png +0 -0
  234. data/examples/hangman/html/images/s_enabled.png +0 -0
  235. data/examples/hangman/html/images/t_disabled.png +0 -0
  236. data/examples/hangman/html/images/t_enabled.png +0 -0
  237. data/examples/hangman/html/images/u_disabled.png +0 -0
  238. data/examples/hangman/html/images/u_enabled.png +0 -0
  239. data/examples/hangman/html/images/v_disabled.png +0 -0
  240. data/examples/hangman/html/images/v_enabled.png +0 -0
  241. data/examples/hangman/html/images/w_disabled.png +0 -0
  242. data/examples/hangman/html/images/w_enabled.png +0 -0
  243. data/examples/hangman/html/images/x_disabled.png +0 -0
  244. data/examples/hangman/html/images/x_enabled.png +0 -0
  245. data/examples/hangman/html/images/y_disabled.png +0 -0
  246. data/examples/hangman/html/images/y_enabled.png +0 -0
  247. data/examples/hangman/html/images/z_disabled.png +0 -0
  248. data/examples/hangman/html/images/z_enabled.png +0 -0
  249. data/examples/hangman/html/resources/word_list.txt +35 -0
  250. data/examples/hangman/html/start.xhtml +18 -0
  251. data/examples/hangman/html/style/hangman.css +27 -0
  252. data/examples/hangman/source/hangman.rb +71 -0
  253. data/examples/hilo/html/game_over.xhtml +15 -0
  254. data/examples/hilo/html/guess.xhtml +18 -0
  255. data/examples/hilo/html/start.xhtml +17 -0
  256. data/examples/hilo/source/hilo.rb +51 -0
  257. data/examples/simplest/html/start.xhtml +0 -0
  258. data/examples/simplest/source/simplest.rb +39 -0
  259. data/examples/stateful_counters/html/counters.xhtml +49 -0
  260. data/examples/stateful_counters/html/style/main.css +441 -0
  261. data/examples/stateful_counters/source/stateful_counters.rb +68 -0
  262. data/lib/trellis/core_components.rb +870 -0
  263. data/lib/trellis/jquery.rb +38 -0
  264. data/lib/trellis/logging.rb +60 -0
  265. data/lib/trellis/trellis.rb +701 -0
  266. data/lib/trellis/utils.rb +209 -0
  267. data/lib/trellis/version.rb +35 -0
  268. data/lib/trellis.rb +27 -0
  269. data/script/console +10 -0
  270. data/script/destroy +14 -0
  271. data/script/generate +14 -0
  272. data/script/txt2html +82 -0
  273. data/setup.rb +1585 -0
  274. data/tasks/deployment.rake +34 -0
  275. data/tasks/environment.rake +7 -0
  276. data/tasks/rspec.rake +21 -0
  277. data/tasks/website.rake +17 -0
  278. data/test/application_spec.rb +79 -0
  279. data/test/component_spec.rb +88 -0
  280. data/test/core_extensions_spec.rb +108 -0
  281. data/test/fixtures/application_spec_applications.rb +51 -0
  282. data/test/page_spec.rb +46 -0
  283. data/test/renderer_spec.rb +12 -0
  284. data/test/router_spec.rb +52 -0
  285. data/test/spec.opts +1 -0
  286. data/test/spec_helper.rb +16 -0
  287. data/website/index.html +124 -0
  288. data/website/index.txt +119 -0
  289. data/website/javascripts/rounded_corners_lite.inc.js +285 -0
  290. data/website/stylesheets/screen.css +138 -0
  291. data/website/template.html.erb +48 -0
  292. metadata +512 -0
@@ -0,0 +1,34 @@
1
+ desc 'Release the website and new gem version'
2
+ task :deploy => [:check_version, :website, :release] do
3
+ puts "Remember to create SVN tag:"
4
+ puts "svn copy svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/trunk " +
5
+ "svn+ssh://#{rubyforge_username}@rubyforge.org/var/svn/#{PATH}/tags/REL-#{VERS} "
6
+ puts "Suggested comment:"
7
+ puts "Tagging release #{CHANGES}"
8
+ end
9
+
10
+ desc 'Runs tasks website_generate and install_gem as a local deployment of the gem'
11
+ task :local_deploy => [:website_generate, :install_gem]
12
+
13
+ task :check_version do
14
+ unless ENV['VERSION']
15
+ puts 'Must pass a VERSION=x.y.z release version'
16
+ exit
17
+ end
18
+ unless ENV['VERSION'] == VERS
19
+ puts "Please update your version.rb to match the release version, currently #{VERS}"
20
+ exit
21
+ end
22
+ end
23
+
24
+ desc 'Install the package as a gem, without generating documentation(ri/rdoc)'
25
+ task :install_gem_no_doc => [:clean, :package] do
26
+ sh "#{'sudo ' unless Hoe::WINDOZE }gem install pkg/*.gem --no-rdoc --no-ri"
27
+ end
28
+
29
+ namespace :manifest do
30
+ desc 'Recreate Manifest.txt to include ALL files'
31
+ task :refresh do
32
+ `rake check_manifest | patch -p0 > Manifest.txt`
33
+ end
34
+ end
@@ -0,0 +1,7 @@
1
+ task :ruby_env do
2
+ RUBY_APP = if RUBY_PLATFORM =~ /java/
3
+ "jruby"
4
+ else
5
+ "ruby"
6
+ end unless defined? RUBY_APP
7
+ end
data/tasks/rspec.rake ADDED
@@ -0,0 +1,21 @@
1
+ begin
2
+ require 'spec'
3
+ rescue LoadError
4
+ require 'rubygems'
5
+ require 'spec'
6
+ end
7
+ begin
8
+ require 'spec/rake/spectask'
9
+ rescue LoadError
10
+ puts <<-EOS
11
+ To use rspec for testing you must install rspec gem:
12
+ gem install rspec
13
+ EOS
14
+ exit(0)
15
+ end
16
+
17
+ desc "Run the specs under spec"
18
+ Spec::Rake::SpecTask.new do |t|
19
+ t.spec_opts = ['--options', "test/spec.opts"]
20
+ t.spec_files = FileList['test/**/*_spec.rb']
21
+ end
@@ -0,0 +1,17 @@
1
+ desc 'Generate website files'
2
+ task :website_generate => :ruby_env do
3
+ (Dir['website/**/*.txt'] - Dir['website/version*.txt']).each do |txt|
4
+ sh %{ #{RUBY_APP} script/txt2html #{txt} > #{txt.gsub(/txt$/,'html')} }
5
+ end
6
+ end
7
+
8
+ desc 'Upload website files to rubyforge'
9
+ task :website_upload do
10
+ host = "#{rubyforge_username}@rubyforge.org"
11
+ remote_dir = "/var/www/gforge-projects/#{PATH}/"
12
+ local_dir = 'website'
13
+ sh %{rsync -aCv #{local_dir}/ #{host}:#{remote_dir}}
14
+ end
15
+
16
+ desc 'Generate and upload website files'
17
+ task :website => [:website_generate, :website_upload, :publish_docs]
@@ -0,0 +1,79 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ require "rack"
4
+ require_fixtures 'application_spec_applications'
5
+
6
+ describe Trellis::Application, " a Trellis application when declared" do
7
+ before do
8
+ @homepage = TestApp::MyApp.instance_eval { @homepage }
9
+ @pages = TestApp::MyApp.instance_eval { @pages }
10
+ @static_routes = TestApp::MyApp.instance_eval { @static_routes }
11
+ end
12
+
13
+ it "should contain a contain the symbol for its home page" do
14
+ @homepage.should == :home
15
+ end
16
+
17
+ it "should contain the home page in its collection of pages" do
18
+ @pages.include?(:home).should be(true)
19
+ end
20
+
21
+ it "should contain any declared static routes" do
22
+ images_route = @static_routes.select { |item| item[:urls].include?('/images') }
23
+ images_route.should_not be_empty
24
+ style_route = @static_routes.select { |item| item[:urls].include?('/style') }
25
+ style_route.should_not be_empty
26
+ favicon_route = @static_routes.select { |item| item[:urls].include?('/favicon.ico') }
27
+ favicon_route.should_not be_empty
28
+ yui_route = @static_routes.select { |item| item[:urls].include?('/yui') && item[:root].include?('./js') }
29
+ yui_route.should_not be_empty
30
+ end
31
+
32
+ end
33
+
34
+ describe Trellis::Application, " when requesting the root url with a GET" do
35
+ before(:each) do
36
+ application = TestApp::MyApp.new
37
+ request = Rack::MockRequest.new(application)
38
+ @response = request.get("/")
39
+ end
40
+
41
+ it "should return an OK HTTP status" do
42
+ @response.status.should be(200)
43
+ end
44
+
45
+ it "should reply with the home page" do
46
+ @response.body.should == "<html><body><h1>Hello World!</h1></body></html>"
47
+ end
48
+ end
49
+
50
+ describe Trellis::Application, " when sending an event to a page" do
51
+ before(:each) do
52
+ application = TestApp::MyApp.new
53
+ @request = Rack::MockRequest.new(application)
54
+ end
55
+
56
+ it "if the event handler returns self it should render the receiving page" do
57
+ response = @request.get("/home.event1")
58
+ response.body.should == "<html><body><h1>Hello World!</h1></body></html>"
59
+ end
60
+
61
+ it "should return a response as a string if the event handler returns a String" do
62
+ response = @request.get("/home.event2")
63
+ response.body.should == "just some text"
64
+ end
65
+
66
+ it "should render the injected page as a response if the event handler returns an injected page " do
67
+ response = @request.get("/home.event3")
68
+ response.body.should == "<html><body><p>Goodbye Cruel World </p></body></html>"
69
+ end
70
+ end
71
+
72
+ describe Trellis::Page, " when calling inject_dependent_pages on an instance of child class of Page" do
73
+ it "should contain instances of the injected pages" do
74
+ homepage = TestApp::Home.new
75
+ homepage.inject_dependent_pages
76
+ injected_page = homepage.instance_eval { @other }
77
+ injected_page.class.should == TestApp::Other
78
+ end
79
+ end
@@ -0,0 +1,88 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Trellis::Component do
4
+ before(:each) do
5
+ #@component = Component.new
6
+ end
7
+
8
+ it "should desc" do
9
+ # TODO
10
+ end
11
+ end
12
+
13
+
14
+ # module TestTrellis
15
+ # class TestComponent < Test::Unit::TestCase
16
+ # def test_class_body
17
+ # raise NotImplementedError, 'Need to write test_class_body'
18
+ # end
19
+ #
20
+ # def test_class_contained_in
21
+ # raise NotImplementedError, 'Need to write test_class_contained_in'
22
+ # end
23
+ #
24
+ # def test_class_depends_on
25
+ # raise NotImplementedError, 'Need to write test_class_depends_on'
26
+ # end
27
+ #
28
+ # def test_class_dom_contribution
29
+ # raise NotImplementedError, 'Need to write test_class_dom_contribution'
30
+ # end
31
+ #
32
+ # def test_class_enhance_page
33
+ # raise NotImplementedError, 'Need to write test_class_enhance_page'
34
+ # end
35
+ #
36
+ # def test_class_field
37
+ # raise NotImplementedError, 'Need to write test_class_field'
38
+ # end
39
+ #
40
+ # def test_class_get_component
41
+ # raise NotImplementedError, 'Need to write test_class_get_component'
42
+ # end
43
+ #
44
+ # def test_class_inherited
45
+ # raise NotImplementedError, 'Need to write test_class_inherited'
46
+ # end
47
+ #
48
+ # def test_class_is_stateful
49
+ # raise NotImplementedError, 'Need to write test_class_is_stateful'
50
+ # end
51
+ #
52
+ # def test_class_page_contribution
53
+ # raise NotImplementedError, 'Need to write test_class_page_contribution'
54
+ # end
55
+ #
56
+ # def test_class_register_with_tag_context
57
+ # raise NotImplementedError, 'Need to write test_class_register_with_tag_context'
58
+ # end
59
+ #
60
+ # def test_class_tag_name
61
+ # raise NotImplementedError, 'Need to write test_class_tag_name'
62
+ # end
63
+ #
64
+ # def test_load_component_session_information
65
+ # raise NotImplementedError, 'Need to write test_load_component_session_information'
66
+ # end
67
+ #
68
+ # def test_logger
69
+ # raise NotImplementedError, 'Need to write test_logger'
70
+ # end
71
+ #
72
+ # def test_logger_equals
73
+ # raise NotImplementedError, 'Need to write test_logger_equals'
74
+ # end
75
+ #
76
+ # def test_page
77
+ # raise NotImplementedError, 'Need to write test_page'
78
+ # end
79
+ #
80
+ # def test_page_equals
81
+ # raise NotImplementedError, 'Need to write test_page_equals'
82
+ # end
83
+ #
84
+ # def test_save_component_session_information
85
+ # raise NotImplementedError, 'Need to write test_save_component_session_information'
86
+ # end
87
+ # end
88
+ # end
@@ -0,0 +1,108 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ # replace_ant_style_property
4
+ describe String, " when calling replace_ant_style_property" do
5
+
6
+ it "should return a string with the property replaced" do
7
+ source = "Good ${greeting}"
8
+ result = source.replace_ant_style_property("greeting", "Morning!")
9
+ result.should eql("Good Morning!")
10
+ end
11
+
12
+ it "should return an unmodified string when the source doesn't contain the specified ant style property" do
13
+ source = "Good Morning!"
14
+ result = source.replace_ant_style_property("chunky", "bacon!")
15
+ result.should eql("Good Morning!")
16
+ end
17
+ end
18
+
19
+ # replace_ant_style_properties
20
+ describe String, " when calling replace_ant_style_properties" do
21
+
22
+ it "should return a string with any given properties replaced" do
23
+ source = "Good ${greeting}, ${state_of_world} World"
24
+ result = source.replace_ant_style_properties({"greeting" => "Bye!", "state_of_world" => "Cruel"})
25
+ result.should eql("Good Bye!, Cruel World")
26
+ end
27
+
28
+ it "should return an unmodified string when the source doesn't contain any of the specified ant style properties" do
29
+ source = "Good Morning!"
30
+ result = source.replace_ant_style_properties({"greeting" => "Bye!", "state_of_world" => "Cruel"})
31
+ result.should eql("Good Morning!")
32
+ end
33
+ end
34
+
35
+ # underscore_class_name
36
+ describe Class, " when calling underscore_class_name" do
37
+
38
+ it "should return a valid underscore ruby identifier string" do
39
+ class SomeClass; end
40
+ sym = SomeClass.underscore_class_name
41
+ sym.should eql("some_class")
42
+ end
43
+
44
+ it "should return a valid underscore ruby identifier string sans the module" do
45
+ module Boo
46
+ class SomeOtherClass; end;
47
+ end
48
+ sym = Boo::SomeOtherClass.underscore_class_name
49
+ sym.should eql("some_other_class")
50
+ end
51
+ end
52
+
53
+ # class_to_sym
54
+ describe Class, " when calling class_to_sym" do
55
+
56
+ it "should return a valid underscore ruby identifier as a symbol" do
57
+ class SomeClass; end
58
+ sym = SomeClass.class_to_sym
59
+ sym.should eql(:some_class)
60
+ end
61
+
62
+ it "should return a valid underscore ruby identifier as a symbol sans the module" do
63
+ module Boo
64
+ class SomeOtherClass; end;
65
+ end
66
+ sym = Boo::SomeOtherClass.class_to_sym
67
+ sym.should eql(:some_other_class)
68
+ end
69
+ end
70
+
71
+ # attr_array tests
72
+ describe "when calling attr_array", :shared => true do
73
+
74
+ it "should create an empty array" do
75
+ elements = @target.instance_eval { @elements }
76
+ elements.should_not be_nil
77
+ elements.should be_empty
78
+ end
79
+ end
80
+
81
+ describe Class, " when calling attr_array with default options" do
82
+
83
+ before(:each) do
84
+ @target = Class.new
85
+ @target.attr_array(:elements)
86
+ end
87
+
88
+ it_should_behave_like "when calling attr_array"
89
+
90
+ it "should create an accessor method for the array" do
91
+ @target.should respond_to(:elements)
92
+ end
93
+
94
+ end
95
+
96
+ describe Class, " when calling attr_array with options {:create_accessor => false}" do
97
+
98
+ before(:each) do
99
+ @target = Class.new
100
+ @target.attr_array(:elements, :create_accessor => false)
101
+ end
102
+
103
+ it_should_behave_like "when calling attr_array"
104
+
105
+ it "should not create an accessor method for the array" do
106
+ @target.should_not respond_to(:elements)
107
+ end
108
+ end
@@ -0,0 +1,51 @@
1
+ module TestApp
2
+ class MyApp < Trellis::Application
3
+ home :home
4
+ pages :other
5
+
6
+ map_static ['/images', '/style', '/favicon.ico']
7
+ map_static ['/yui'], "./js"
8
+ end
9
+
10
+ class Home < Trellis::Page
11
+ pages :other
12
+
13
+ template do html { body { h1 "Hello World!" }} end
14
+
15
+ def on_event1
16
+ self
17
+ end
18
+
19
+ def on_event2
20
+ "just some text"
21
+ end
22
+
23
+ def on_event3
24
+ @other
25
+ end
26
+ end
27
+
28
+ class Other < Trellis::Page
29
+ template do html { body { p "Goodbye Cruel World " }} end
30
+ end
31
+
32
+ class BeforeLoad < Trellis::Page
33
+ attr_reader :some_value
34
+
35
+ def before_load
36
+ @some_value = "8675309"
37
+ end
38
+
39
+ template do html { body { text %[<trellis:value name="some_value"/>] }} end
40
+ end
41
+
42
+ class AfterLoad < Trellis::Page
43
+ attr_reader :some_value
44
+
45
+ def after_load
46
+ @some_value = "chunky bacon!"
47
+ end
48
+
49
+ template do html { body { text %[<trellis:value name="some_value"/>] }} end
50
+ end
51
+ end
data/test/page_spec.rb ADDED
@@ -0,0 +1,46 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ require "rack"
4
+ require_fixtures 'application_spec_applications'
5
+
6
+ describe Trellis::Page, " when sending an event to a page" do
7
+ before(:each) do
8
+ @application = TestApp::MyApp.new
9
+ @request = Rack::MockRequest.new(@application)
10
+ end
11
+
12
+ it "if the event handler returns self it should render the receiving page" do
13
+ response = @request.get("/home.event1")
14
+ response.body.should == "<html><body><h1>Hello World!</h1></body></html>"
15
+ end
16
+
17
+ it "should return a response as a string if the event handler returns a String" do
18
+ response = @request.get("/home.event2")
19
+ response.body.should == "just some text"
20
+ end
21
+
22
+ it "should render the injected page as a response if the event handler returns an injected page " do
23
+ response = @request.get("/home.event3")
24
+ response.body.should == "<html><body><p>Goodbye Cruel World </p></body></html>"
25
+ end
26
+
27
+ it "should invoke the before_load method if provided by the page" do
28
+ response = @request.get("/before_load")
29
+ response.body.should == "<html><body>8675309</body></html>"
30
+ end
31
+
32
+ it "should invoke the after_load method if provided by the page" do
33
+ response = @request.get("/after_load")
34
+ response.body.should == "<html><body>chunky bacon!</body></html>"
35
+ end
36
+ end
37
+
38
+ describe Trellis::Page, " when calling inject_dependent_pages on an instance of child class of Page" do
39
+ it "should contain instances of the injected pages" do
40
+ homepage = TestApp::Home.new
41
+ homepage.inject_dependent_pages
42
+ injected_page = homepage.instance_eval { @other }
43
+ injected_page.should be_an_instance_of(TestApp::Other)
44
+ end
45
+ end
46
+
@@ -0,0 +1,12 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Trellis::Renderer do
4
+ before(:each) do
5
+ #@renderer = Renderer.new
6
+ end
7
+
8
+ it "should desc" do
9
+ # TODO
10
+ end
11
+ end
12
+
@@ -0,0 +1,52 @@
1
+ require File.dirname(__FILE__) + '/spec_helper.rb'
2
+
3
+ describe Trellis::DefaultRouter, " when processing a request" do
4
+ before do
5
+ @regexp = Trellis::DefaultRouter::ROUTE_REGEX
6
+ end
7
+
8
+ it "should extract the page " do
9
+ value, source, event, destination = "/some_page".match(@regexp).to_a.reverse
10
+ value.should be_nil
11
+ source.should be_nil
12
+ event.should be_nil
13
+ destination.should_not be_nil
14
+ destination.should == "some_page"
15
+ end
16
+
17
+ it "should extract the page and event " do
18
+ value, source, event, destination = "/some_page.event".match(@regexp).to_a.reverse
19
+ value.should be_nil
20
+ source.should be_nil
21
+ event.should == "event"
22
+ destination.should_not be_nil
23
+ destination.should == "some_page"
24
+ end
25
+
26
+ it "should extract the page, event and source " do
27
+ value, source, event, destination = "/some_page.event_source".match(@regexp).to_a.reverse
28
+ value.should be_nil
29
+ source.should == "source"
30
+ event.should == "event"
31
+ destination.should_not be_nil
32
+ destination.should == "some_page"
33
+ end
34
+
35
+ it "should extract the page, event and source and value" do
36
+ value, source, event, destination = "/some_page.event_source/123".match(@regexp).to_a.reverse
37
+ value.should == "123"
38
+ source.should == "source"
39
+ event.should == "event"
40
+ destination.should_not be_nil
41
+ destination.should == "some_page"
42
+ end
43
+
44
+ it "should extract the page, event and value" do
45
+ value, source, event, destination = "/some_page.event/123".match(@regexp).to_a.reverse
46
+ value.should == "123"
47
+ source.should be_nil
48
+ event.should == "event"
49
+ destination.should_not be_nil
50
+ destination.should == "some_page"
51
+ end
52
+ end
data/test/spec.opts ADDED
@@ -0,0 +1 @@
1
+ --colour
@@ -0,0 +1,16 @@
1
+ begin
2
+ require 'rubygems'
3
+ require 'spec'
4
+ rescue LoadError
5
+ require 'rubygems'
6
+ gem 'rspec'
7
+ require 'spec'
8
+ end
9
+
10
+ $:.unshift(File.dirname(__FILE__) + '/../lib')
11
+ require 'trellis'
12
+
13
+ FIXTURES = File.expand_path(File.join(File.dirname(__FILE__), 'fixtures')) unless defined?(FIXTURES)
14
+ def require_fixtures(path)
15
+ require File.expand_path(File.join(FIXTURES, path))
16
+ end
@@ -0,0 +1,124 @@
1
+ <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
2
+ "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
3
+ <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
4
+ <head>
5
+ <link rel="stylesheet" href="stylesheets/screen.css" type="text/css" media="screen" />
6
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7
+ <title>
8
+ Trellis
9
+ </title>
10
+ <script src="javascripts/rounded_corners_lite.inc.js" type="text/javascript"></script>
11
+ <style>
12
+
13
+ </style>
14
+ <script type="text/javascript">
15
+ window.onload = function() {
16
+ settings = {
17
+ tl: { radius: 10 },
18
+ tr: { radius: 10 },
19
+ bl: { radius: 10 },
20
+ br: { radius: 10 },
21
+ antiAlias: true,
22
+ autoPad: true,
23
+ validTags: ["div"]
24
+ }
25
+ var versionBox = new curvyCorners(settings, document.getElementById("version"));
26
+ versionBox.applyCornersToAll();
27
+ }
28
+ </script>
29
+ </head>
30
+ <body>
31
+ <div id="main">
32
+
33
+ <h1>Trellis</h1>
34
+ <div id="version" class="clickable" onclick='document.location = "http://rubyforge.org/projects/trellis"; return false'>
35
+ <p>Get Version</p>
36
+ <a href="http://rubyforge.org/projects/trellis" class="numbers">0.0.1</a>
37
+ </div>
38
+ <h2>What</h2>
39
+ <p>Trellis is an object-oriented, event-driven, page and component-based Web <br />
40
+ Application Framework written in Ruby. Its main goal is to bring <br />
41
+ component-driven development to the micro-framework world. <br />
42
+ The framework is a zero configuration framework.</p>
43
+ <p>It draws inspiration from:</p>
44
+ <p>Ruby Web Frameworks<br />
45
+ =======</p>
46
+ <ul>
47
+ <li>Rails</li>
48
+ <li>Camping</li>
49
+ <li>Merb</li>
50
+ <li>Iowa</li>
51
+ </ul>
52
+ <p>Java Web Frameworks<br />
53
+ =======</p>
54
+ <ul>
55
+ <li>Tapesty</li>
56
+ <li>Wicket</li>
57
+ <li>The good parts of <span class="caps">JSF</span> (components)</li>
58
+ <li>Seam (session per conversation)</li>
59
+ </ul>
60
+ <h2>Installing</h2>
61
+ <p><pre class='syntax'><span class="ident">sudo</span> <span class="ident">gem</span> <span class="ident">install</span> <span class="ident">trellis</span></pre></p>
62
+ <h2>The basics</h2>
63
+ <p>A Trellis application consists of the Application class; a descendant of <br />
64
+ Trellis::Application and one or more pages; descendants of Trellis::Page. The<br />
65
+ Application at a minimum needs to declare the starting or home page:</p>
66
+ <p><pre class='syntax'>
67
+ <span class="keyword">module </span><span class="module">Hello</span>
68
+ <span class="keyword">class </span><span class="class">HelloWorld</span> <span class="punct">&lt;</span> <span class="constant">Trellis</span><span class="punct">::</span><span class="constant">Application</span>
69
+ <span class="ident">home</span> <span class="symbol">:home</span>
70
+ <span class="keyword">end</span>
71
+
72
+ <span class="keyword">class </span><span class="class">Home</span> <span class="punct">&lt;</span> <span class="constant">Trellis</span><span class="punct">::</span><span class="constant">Page</span>
73
+ <span class="ident">template_as_markaby</span> <span class="keyword">do</span> <span class="ident">html</span> <span class="punct">{</span> <span class="ident">body</span> <span class="punct">{</span> <span class="ident">h1</span> <span class="punct">&quot;</span><span class="string">Hello World!</span><span class="punct">&quot;</span> <span class="punct">}}</span> <span class="keyword">end</span>
74
+ <span class="keyword">end</span>
75
+ <span class="keyword">end</span>
76
+ </pre></p>
77
+ <h2>Demonstration of usage</h2>
78
+ <p>To run the above application simply add the line:</p>
79
+ <pre class='syntax'><span class="constant">Hello</span><span class="punct">::</span><span class="constant">HelloWorld</span><span class="punct">.</span><span class="ident">new</span><span class="punct">.</span><span class="ident">start</span></pre>
80
+ <p>That will start the application on Mongrel running on port 3000 by default. To <br />
81
+ run on any other port pass the port number to the start method like:</p>
82
+ <pre class='syntax'><span class="constant">Hello</span><span class="punct">::</span><span class="constant">HelloWorld</span><span class="punct">.</span><span class="ident">new</span><span class="punct">.</span><span class="ident">start</span> <span class="number">8282</span></pre>
83
+ <h2>Forum</h2>
84
+ <p><a href="http://groups.google.com/group/trellis">http://groups.google.com/group/trellis</a></p>
85
+ <h2>How to submit patches</h2>
86
+ <p>Read the <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/">8 steps for fixing other people&#8217;s code</a> and for section <a href="http://drnicwilliams.com/2007/06/01/8-steps-for-fixing-other-peoples-code/#8b-google-groups">8b: Submit patch to Google Groups</a>, use the Google Group above.</p>
87
+ <p><span class="caps">TODO</span> &#8211; pick <span class="caps">SVN</span> or Git instructions</p>
88
+ <p>The trunk repository is <code>svn://rubyforge.org/var/svn/trellis/trunk</code> for anonymous access.</p>
89
+ <p><span class="caps">OOOORRRR</span></p>
90
+ <p>You can fetch the source from either:</p>
91
+ <ul>
92
+ <li>rubyforge: <span class="caps">MISSING</span> IN <span class="caps">ACTION</span></li>
93
+ </ul>
94
+ <p><span class="caps">TODO</span> &#8211; You can not created a RubyForge project, OR have not run <code>rubyforge config</code><br />
95
+ yet to refresh your local rubyforge data with this projects&#8217; id information.</p>
96
+ <p>When you do this, this message will magically disappear!</p>
97
+ <p>Or you can hack website/index.txt and make it all go away!!</p>
98
+ <ul>
99
+ <li>github: <a href="http://github.com/GITHUB_USERNAME/trellis/tree/master">http://github.com/GITHUB_USERNAME/trellis/tree/master</a></li>
100
+ </ul>
101
+ <pre>git clone git://github.com/GITHUB_USERNAME/trellis.git</pre>
102
+ <p><span class="caps">TODO</span> &#8211; add &#8220;github_username: username&#8221; to ~/.rubyforge/user-config.yml and newgem will reuse it for future projects.</p>
103
+ <ul>
104
+ <li>gitorious: <a href="git://gitorious.org/trellis/mainline.git">git://gitorious.org/trellis/mainline.git</a></li>
105
+ </ul>
106
+ <pre>git clone git://gitorious.org/trellis/mainline.git</pre>
107
+ <h3>Build and test instructions</h3>
108
+ <pre>cd trellis
109
+ rake spec
110
+ rake install_gem</pre>
111
+ <h2>License</h2>
112
+ <p>This code is free to use under the terms of the <span class="caps">MIT</span> license.</p>
113
+ <h2>Contact</h2>
114
+ <p>Comments are welcome. Send an email to <a href="mailto:bsbodden@integrallis.com">Brian Sam-Bodden</a> email via the <a href="http://groups.google.com/group/trellis">forum</a></p>
115
+ <p class="coda">
116
+ <a href="FIXME email">FIXME full name</a>, 25th August 2008<br>
117
+ Theme extended from <a href="http://rb2js.rubyforge.org/">Paul Battley</a>
118
+ </p>
119
+ </div>
120
+
121
+ <!-- insert site tracking codes here, like Google Urchin -->
122
+
123
+ </body>
124
+ </html>