trellis 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- data/History.txt +7 -0
- data/Manifest.txt +6 -181
- data/examples/crud_components/source/crud_components.rb +0 -1
- data/examples/examples.txt +32 -30
- data/examples/flickr/source/flickr.rb +0 -4
- data/examples/hangman/source/hangman.rb +1 -2
- data/examples/hilo/html/guess.xhtml +2 -2
- data/examples/hilo/source/hilo.rb +6 -6
- data/examples/routing/source/routing.rb +50 -0
- data/examples/stateful_counters/source/stateful_counters.rb +9 -4
- data/lib/trellis/{core_components.rb → component_library/core_components.rb} +48 -398
- data/lib/trellis/component_library/grid.rb +311 -0
- data/lib/trellis/{jquery.rb → component_library/jquery.rb} +0 -0
- data/lib/trellis/component_library/object_editor.rb +110 -0
- data/lib/trellis/trellis.rb +162 -52
- data/lib/trellis/utils.rb +9 -3
- data/lib/trellis/version.rb +1 -1
- data/tasks/rspec.rake +2 -1
- data/test/application_spec.rb +55 -30
- data/test/component_spec.rb +95 -81
- data/test/core_extensions_spec.rb +34 -2
- data/test/default_router_spec.rb +91 -0
- data/test/fixtures/application_spec_applications.rb +91 -3
- data/test/page_spec.rb +18 -8
- data/test/router_spec.rb +49 -49
- metadata +8 -185
- data/.git/COMMIT_EDITMSG +0 -1
- data/.git/HEAD +0 -1
- data/.git/config +0 -9
- data/.git/description +0 -1
- data/.git/hooks/applypatch-msg.sample +0 -15
- data/.git/hooks/commit-msg.sample +0 -24
- data/.git/hooks/post-commit.sample +0 -8
- data/.git/hooks/post-receive.sample +0 -15
- data/.git/hooks/post-update.sample +0 -8
- data/.git/hooks/pre-applypatch.sample +0 -14
- data/.git/hooks/pre-commit.sample +0 -18
- data/.git/hooks/pre-rebase.sample +0 -169
- data/.git/hooks/prepare-commit-msg.sample +0 -36
- data/.git/hooks/update.sample +0 -107
- data/.git/index +0 -0
- data/.git/info/exclude +0 -6
- data/.git/logs/HEAD +0 -1
- data/.git/logs/refs/heads/master +0 -1
- data/.git/logs/refs/remotes/origin/master +0 -1
- data/.git/objects/01/2368d4dd3162ed570e6c1423ecb07a6a35f8c0 +0 -0
- data/.git/objects/02/238c88c522b88e71529495460cc5c2c8abe110 +0 -0
- data/.git/objects/07/03d3b123189f1da72d3889d9340e681841c96d +0 -0
- data/.git/objects/0b/3935fdbf3ce8d37e6cb2a6ec94edaccb1c58dc +0 -0
- data/.git/objects/0f/ecd1ad35f280c874ce070b7a97a4c1f86ace54 +0 -0
- data/.git/objects/12/61911b063b7e6883c5e9db7ab4396183f6f2b5 +0 -0
- data/.git/objects/13/0b7e2d214ec198d07aeed5b462597670ce85ad +0 -0
- data/.git/objects/13/214d40f02b63f1233fd7881b1df9bb75d9c0a7 +0 -0
- data/.git/objects/14/7522bdc96af0b578935d81c1a7347b40573940 +0 -0
- data/.git/objects/16/a7fde706fe92b3548254d29722f5ca311ce63b +0 -2
- data/.git/objects/16/fe580663cc29d141bf416dff5bf21bf4ea42a3 +0 -0
- data/.git/objects/17/2d55806918bafb4e701515edb27147a4ef6498 +0 -0
- data/.git/objects/17/686ef1882ed6c3c07b781fab18739b1c5e48bd +0 -0
- data/.git/objects/17/824053c41a2cb523303e20cac42f66f9ca2134 +0 -0
- data/.git/objects/18/68448c5f88bc73b2fef6b8f3aa75b663013a3a +0 -1
- data/.git/objects/1a/6d9051dc4c7db10bdcf5e17c5cb717b072d30a +0 -0
- data/.git/objects/1a/8bdb445fb5668dcd1309cb9de5dedf846c822f +0 -0
- data/.git/objects/1b/6fa67b70358fdb82eabcd7ef3bc46d518d0426 +0 -0
- data/.git/objects/1c/f6510ed08a274fb3292d40557cebb3e7090767 +0 -0
- data/.git/objects/1d/e661ce11d5335e5dd7968ef5698e2eb164eb52 +0 -0
- data/.git/objects/1e/301ee672d6040e734af6d0a5491185129d7b67 +0 -0
- data/.git/objects/21/2201d46200f13d23d8199bd4a7ecc9165205b3 +0 -0
- data/.git/objects/22/f687370babdf38d224d2a9ff039707e8d0aac1 +0 -0
- data/.git/objects/24/202d2de95dc31f5f1802e629a16ad45b723267 +0 -0
- data/.git/objects/25/4c5b6b8d211d8b9f07310fd342fd7b078a81af +0 -0
- data/.git/objects/25/5832653fde9e9748855347fe7bce013aa0a6c7 +0 -0
- data/.git/objects/25/806945c89b4b5adb8c8676c308e4653361109c +0 -5
- data/.git/objects/26/cb8deaca28bf275769cbb71b88e53a44adb9ca +0 -0
- data/.git/objects/2e/1c13fb5f154f89cccd4c645540a2ec8ee0f57a +0 -0
- data/.git/objects/2f/437425b2c085bb529379e409d6b4bc7f9f9fba +0 -0
- data/.git/objects/2f/7cf4a25937b71f3de52e70c7a47cb2f7da07ea +0 -0
- data/.git/objects/31/31bdbbac6e6e7e24fd6ea84332461f67e6e5b6 +0 -0
- data/.git/objects/32/02e02de478263912b729283eabc7cdab8a8037 +0 -0
- data/.git/objects/32/839ed9baa8c800d9033655d1ee995499825fb5 +0 -0
- data/.git/objects/34/2e479c61796125b0e025b483401ec12f3c5824 +0 -2
- data/.git/objects/36/7acb017aebab3f627a5208c25885c21fa7fdbb +0 -0
- data/.git/objects/38/12910d2e2a8e6eeb79a399d20751675d3fbe77 +0 -0
- data/.git/objects/38/3fe1e1a07537db6e0f39c6005b7b4e40fa5ccd +0 -0
- data/.git/objects/39/5ef328bc94df9191f4d80a77503a5be9f1f673 +0 -0
- data/.git/objects/39/dc76dc096fdf737e9f4f7062b78cbf4ab9628f +0 -0
- data/.git/objects/3b/09eb196140b471556ed4c3987c0bc739733617 +0 -0
- data/.git/objects/3b/9f97f1bf55834832a92bab1ab900918dc49570 +0 -0
- data/.git/objects/40/5ffd3925b39dd905638ec24640dd8efa27cc1b +0 -0
- data/.git/objects/42/4a5f37c6fe3a7cac54b0f85688c1cce7da9cdf +0 -0
- data/.git/objects/44/9e23363d4e20da6a67be7ab78fc610b4e9852a +0 -0
- data/.git/objects/48/90bb5d241cecaa30b28148c920b833056c7508 +0 -0
- data/.git/objects/4c/558c43676410a2c0a7d5c7b94fca18923a9af1 +0 -0
- data/.git/objects/4f/bf572175dd5245104679ff8f676f6a34466c29 +0 -0
- data/.git/objects/53/8583edf00c9f656b32149a0e69e030371737c5 +0 -0
- data/.git/objects/5b/8a2c4bf7bb56ae199414096dbda21fd4b8cd63 +0 -0
- data/.git/objects/5c/9fe8ff998d56dc076657ef88ee9f784ec160f9 +0 -0
- data/.git/objects/5f/8441f9d3507587940f31af04dd9fd5911d2812 +0 -0
- data/.git/objects/61/4f2752550e63b793e31dcf98b5ea26c32eb0be +0 -0
- data/.git/objects/65/801b0fabdfd673861dbb2ac134d438ab2cc5e4 +0 -3
- data/.git/objects/66/2746dffaddbcd311f4ac070b5b9bddcd8894a7 +0 -0
- data/.git/objects/69/1ed3b65603a0d0dabfb66720e7163664be78f5 +0 -0
- data/.git/objects/69/3dc3b6037df8c1c8dfda916d649e7975481124 +0 -0
- data/.git/objects/69/67538427b3a371b33c01c72726ac7e67a04c39 +0 -0
- data/.git/objects/69/6cd6c3508e2adcc68829497884ff3d4b774dc2 +0 -0
- data/.git/objects/69/6ee93917040308ccd0bfc245d63c1cbeb23dae +0 -0
- data/.git/objects/6a/3ac317746a8a2cfc88f3580bbd2b03dc0d50b5 +0 -0
- data/.git/objects/6d/6ba435839a65b96cb3f7584a40dd3767a0990f +0 -0
- data/.git/objects/6f/32c190a651a82caeefeb55eb797fc5daf05426 +0 -0
- data/.git/objects/71/fecbce1bec36eaf4de655763d4bb7ceffc991d +0 -0
- data/.git/objects/72/01d78a9e90347fd2f7790f9e8665587791d853 +0 -0
- data/.git/objects/73/6c97d6a551363ba4a4956408ba228fcab7f91f +0 -0
- data/.git/objects/75/3264271e935e18f4eada49aa1818c6fb9e6abb +0 -0
- data/.git/objects/75/cc7d390b4a565495cbdc5a08d4479e7e8dbfeb +0 -0
- data/.git/objects/76/7c0c96f68b9ccec34ae538045a63bbe4f97d3e +0 -0
- data/.git/objects/7b/47fe9b1ab9f2692b9706054de706430089ecd4 +0 -0
- data/.git/objects/7c/73144ef6847d1bc2315aee0925c0e5cf5c09d1 +0 -0
- data/.git/objects/7d/9c177c155386606aa1024d5cb020a097eea64a +0 -0
- data/.git/objects/7d/e9a3296007c09ba9b7bc1802e1c5d9ad1d5dbb +0 -0
- data/.git/objects/7e/b73d408147c8d84881109189a9724292abcb8d +0 -0
- data/.git/objects/82/0e3bf5449a8f6b8eb637a653dcb2dc387b393c +0 -0
- data/.git/objects/83/a10ce96763cb30d0b81425e9372f89c52f4c9f +0 -0
- data/.git/objects/83/bdb801e78444d59225f83cf2f336f114cd23cf +0 -0
- data/.git/objects/85/24e583e822abc18b1ffdd0aa356c9c079b5548 +0 -0
- data/.git/objects/88/b46cc8de5237897d4ba5023d3efdc83fec4f7c +0 -0
- data/.git/objects/89/5eea66474f48a2cbf643ad0ef266fd26f9d2a3 +0 -0
- data/.git/objects/8a/539c5fc35d5b770d67241d2ccb6c6855df6a43 +0 -0
- data/.git/objects/8a/82cdbfb20cc58fdffe4e13b70b55977deb92c6 +0 -0
- data/.git/objects/8b/2b537442e4ac8719ffa71b3ae0c707133df06f +0 -0
- data/.git/objects/8c/2a45f0c81284a081f8d7980e9a54210a9dd52c +0 -0
- data/.git/objects/8e/10355b4ab312450031966107ef6a65b13833ee +0 -0
- data/.git/objects/90/f6c76767ae725f15fa6790dcb6afd1719fa0e2 +0 -0
- data/.git/objects/92/92b696aba9840c089241c68d4c6ca14be38a64 +0 -2
- data/.git/objects/93/e03faa6906892434fa9f2ad230c4ececc64055 +0 -0
- data/.git/objects/93/eca2e28d80fda45d327fdfc6c39ae690af41cd +0 -0
- data/.git/objects/95/92fe63bd5403654730cdec76cbf116ef83bbff +0 -0
- data/.git/objects/96/bc6dd471c1c188a2eb4308bcc3ca4e6c8faac8 +0 -0
- data/.git/objects/96/d855221a9ff4fba57d2b70680b57bd5115cfde +0 -0
- data/.git/objects/97/4ec92b2b9eb01a73fb57dc78d463cafdda69a7 +0 -0
- data/.git/objects/97/b7ec01ebe089832a0972d20b0a40d54456985c +0 -2
- data/.git/objects/97/fa6aaae4cfc7654feb39971e7aee5c41ed1679 +0 -1
- data/.git/objects/98/18351c6685a1df5d23686e6346d11d261cc6f0 +0 -0
- data/.git/objects/98/3d3b7e55cbbce2f2a52c6e6d830a5dca7b4d42 +0 -0
- data/.git/objects/a2/e551049a5388112c21e7f3a4a720bf720601fa +0 -0
- data/.git/objects/a3/7066bea4fae90d34761a3ebb3f8a348d94eba1 +0 -0
- data/.git/objects/a6/c99619145d1b9b75aa15ca04fbe4db0b2ee79b +0 -0
- data/.git/objects/aa/e2234d0a8c1485096c7a7de039eceb4e019e13 +0 -0
- data/.git/objects/b0/3b52f4269c9719e02ecd6caabd8aff5adf3aac +0 -0
- data/.git/objects/b1/50dbbd89f825302a9e82d8fdd66f238b8e6fc4 +0 -0
- data/.git/objects/b4/545fbe393aaa18f1c48de4d9f68f64ebf09ddc +0 -0
- data/.git/objects/b6/8691404e088692929d40b988b993f815d76756 +0 -0
- data/.git/objects/b7/daa3d844ef5f5cd917084e48edd82e67f8f476 +0 -0
- data/.git/objects/bf/4232281dba5a0f17e8b5c16b9cbd0f52274fa8 +0 -0
- data/.git/objects/bf/9b84d10f19188beffe5ee99e6f5af035ba77d3 +0 -2
- data/.git/objects/c0/06e664b306145de804f74ab27550d62a92f58a +0 -1
- data/.git/objects/c2/2806b16775f66453012d085d21fb8698521ea9 +0 -0
- data/.git/objects/c2/7f6559350f7adb19d43742b55b2f91d07b6550 +0 -0
- data/.git/objects/c3/833df21ed674a77374fd40ed931f900134d38b +0 -0
- data/.git/objects/c3/b9da021eb76abad0b17ad6c4be75595e41a7e6 +0 -0
- data/.git/objects/c5/ca6b7e3561ea88aba1712aabb984d1167787f1 +0 -0
- data/.git/objects/c6/39f65e1f43c75b7f57c5ab28623d295dfb2afd +0 -0
- data/.git/objects/c8/6f05fa5539f8e69e94850d1cd917919ff581be +0 -0
- data/.git/objects/cb/5e499c8dcc6f2901014a08e74f04b7a4bd6596 +0 -0
- data/.git/objects/cc/1289d25eeee6ba31b4e406372cb9abf969fc6f +0 -0
- data/.git/objects/cc/784e1b49111c42fa7eae10ad0e788186e672d1 +0 -0
- data/.git/objects/cc/bcae254dad515d7ef01a461980544e4483c41e +0 -0
- data/.git/objects/ce/bfadad3a7c17148998e04275e6d0d1cf1b2e1e +0 -0
- data/.git/objects/ce/f3335522abdc47a2c94be70455dcfaa9a51a27 +0 -0
- data/.git/objects/cf/6add7ea568d3d90d6a1f8afb0898b0119b14ff +0 -0
- data/.git/objects/d0/719abd196033fec0e4cbe2af68a26ca435389c +0 -0
- data/.git/objects/d1/ce63ff0eaec4dba419e5547f99195dfb9b5b20 +0 -0
- data/.git/objects/d2/c3feb3c74b892cca0049c0aced6ce786a784c8 +0 -0
- data/.git/objects/d7/8a91da13413419da71b539a3c6c7df4d8a2458 +0 -0
- data/.git/objects/d8/c7bed2b1357d54b6935536a8a51a3c73d535b4 +0 -0
- data/.git/objects/da/c3a1277ccb4806011e33eb32c5609cc45c46f2 +0 -0
- data/.git/objects/dc/3f920f4b937d0e2ac512f0bb31d477624c46d5 +0 -0
- data/.git/objects/dc/6c389abf5bd0d7b9be2a6bb6af90738a410e59 +0 -0
- data/.git/objects/df/07c423309f39c4d5570b0fad65dff23af654ae +0 -0
- data/.git/objects/e2/93a5c9e2257b9f3fcb8fa5d5c8147a2f07ba1b +0 -0
- data/.git/objects/e4/8464df56bf487e96e21ea99487330266dae3c9 +0 -0
- data/.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391 +0 -0
- data/.git/objects/e8/0c13a1d1f62756fb9f1e4fb9f7512e5b8c5816 +0 -0
- data/.git/objects/e9/b8ade2125b2615ddc4c8043940c40ed36215c9 +0 -0
- data/.git/objects/ed/59a7599a81ef7ea7c230c3332345a3484febf8 +0 -0
- data/.git/objects/f0/d2a74226877e9a28af814d0d3727e4a3487439 +0 -0
- data/.git/objects/f0/f3ba7264f1d8e60eb93a907092af98fdc248e4 +0 -0
- data/.git/objects/f1/cdcc7ff2dc6298318523b2c4e425f515a58bf7 +0 -3
- data/.git/objects/f4/45c96f406f4d2f9839b3fe2fe8bc7f943ab469 +0 -0
- data/.git/objects/f7/eef7ce0a650d6f0c85dc4982f481da7bd44362 +0 -0
- data/.git/objects/f9/0abf96c5059ce1ba115f73bc9cf33e4663b3e1 +0 -0
- data/.git/objects/f9/cf7ae572eaebbd63f809f16a5ef14b9c679790 +0 -0
- data/.git/objects/fc/300df53fe2c9467210e2fd4c2f34e1c9c7c89a +0 -0
- data/.git/objects/fc/45546596ab8debc4c9f49a7abc7fc14a7bcc7f +0 -4
- data/.git/objects/fc/68d89167f69614eda17bd56dfccb4355d818e6 +0 -0
- data/.git/objects/fc/e4c02bb132e73b3cb957da182db7b75a47c242 +0 -0
- data/.git/objects/fe/be283da7f326344013f1fc847c12c8f29ab6ef +0 -0
- data/.git/refs/heads/master +0 -1
- data/.git/refs/remotes/origin/master +0 -1
- data/.gitignore +0 -5
- data/README.txt +0 -156
- data/examples/simplest/html/start.xhtml +0 -0
- data/website/index.html +0 -124
- data/website/index.txt +0 -119
- data/website/javascripts/rounded_corners_lite.inc.js +0 -285
- data/website/stylesheets/screen.css +0 -138
- data/website/template.html.erb +0 -48
data/test/component_spec.rb
CHANGED
@@ -1,88 +1,102 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
2
|
|
3
|
-
|
4
|
-
|
5
|
-
|
3
|
+
require "rack"
|
4
|
+
require 'rack/test'
|
5
|
+
require_fixtures 'component_spec_components'
|
6
|
+
|
7
|
+
describe Trellis::Component, " in an application" do
|
8
|
+
include Rack::Test::Methods
|
9
|
+
|
10
|
+
def app
|
11
|
+
TestComponents::ApplicationWithComponents.new
|
6
12
|
end
|
7
13
|
|
8
|
-
it "should
|
9
|
-
|
14
|
+
it "should return its intended content" do
|
15
|
+
get '/'
|
16
|
+
last_response.body.should eql('<html><body>hello from simple component</body></html>')
|
17
|
+
end
|
18
|
+
|
19
|
+
it "should render each instance of a component in the template" do
|
20
|
+
get '/counters'
|
21
|
+
counter_one_markup = %[<div id="one">0<a href="/page_with_stateful_component/events/add.counter_one">++</a><a href="/page_with_stateful_component/events/subtract.counter_one">--</a></div>]
|
22
|
+
counter_two_markup = %[<div id="two">0<a href="/page_with_stateful_component/events/add.counter_two">++</a><a href="/page_with_stateful_component/events/subtract.counter_two">--</a></div>]
|
23
|
+
counter_three_markup = %[<div id="three">0<a href="/page_with_stateful_component/events/add.counter_three">++</a><a href="/page_with_stateful_component/events/subtract.counter_three">--</a></div]
|
24
|
+
last_response.body.should include(counter_one_markup)
|
25
|
+
last_response.body.should include(counter_two_markup)
|
26
|
+
last_response.body.should include(counter_three_markup)
|
27
|
+
end
|
28
|
+
|
29
|
+
it "should provide an instance of each component in the template to the page" do
|
30
|
+
counters_page = TestComponents::PageWithStatefulComponent.new
|
31
|
+
counter_one = counters_page.instance_eval { @counter_one }
|
32
|
+
counter_two = counters_page.instance_eval { @counter_two }
|
33
|
+
counter_three = counters_page.instance_eval { @counter_three }
|
34
|
+
counter_one.should be_an_instance_of(TestComponents::Counter)
|
35
|
+
counter_two.should be_an_instance_of(TestComponents::Counter)
|
36
|
+
counter_three.should be_an_instance_of(TestComponents::Counter)
|
37
|
+
end
|
38
|
+
|
39
|
+
it "should provide a logger" do
|
40
|
+
counters_page = TestComponents::PageWithStatefulComponent.new
|
41
|
+
counter_one = counters_page.instance_eval { @counter_one }
|
42
|
+
counter_one.should respond_to(:logger)
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should respond to an event for which it provides an event handler" do
|
46
|
+
env = Hash.new
|
47
|
+
env["rack.session"] = Hash.new
|
48
|
+
|
49
|
+
get '/page_with_stateful_component/events/add.counter_one', {}, env
|
50
|
+
|
51
|
+
redirect = last_response.headers['Location']
|
52
|
+
|
53
|
+
redirect.should eql('/page_with_stateful_component')
|
54
|
+
|
55
|
+
get redirect, {}, env
|
56
|
+
|
57
|
+
counter_one_markup = %[<div id="one">1]
|
58
|
+
counter_two_markup = %[<div id="two">0]
|
59
|
+
counter_three_markup = %[<div id="three">0]
|
60
|
+
|
61
|
+
last_response.body.should include(counter_one_markup)
|
62
|
+
last_response.body.should include(counter_two_markup)
|
63
|
+
last_response.body.should include(counter_three_markup)
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should be able to provide a style link contribution to the page" do
|
67
|
+
get '/page_with_contributions'
|
68
|
+
last_response.body.should include('<link href="/someplace/my_styles.css" rel="stylesheet" type="text/css" />')
|
69
|
+
end
|
70
|
+
|
71
|
+
it "should be able to provide a script link contribution to the page" do
|
72
|
+
get '/page_with_contributions'
|
73
|
+
last_response.body.should include('<script src="/someplace/my_script.js" type="text/javascript"></script>')
|
74
|
+
end
|
75
|
+
|
76
|
+
it "should be able to provide a style contribution to the page" do
|
77
|
+
get '/page_with_contributions'
|
78
|
+
last_response.body.should include('<style type="text/css">html { color:#555555; background-color:#303030; }</style>')
|
10
79
|
end
|
11
|
-
end
|
12
80
|
|
81
|
+
it "should be able to provide a style contribution to the page per instance" do
|
82
|
+
get '/page_with_contributions'
|
83
|
+
last_response.body.scan(%[<style type=\"text/css\">/* just a comment */</style>]).should have_exactly(2).matches
|
84
|
+
end
|
13
85
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
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
|
86
|
+
it "should be able to provide a script contribution per instance and access instance information" do
|
87
|
+
get '/page_with_contributions'
|
88
|
+
last_response.body.should include(%[<script type="text/javascript">alert('hello from one');</script>])
|
89
|
+
last_response.body.should include(%[<script type="text/javascript">alert('hello from two');</script>])
|
90
|
+
end
|
91
|
+
|
92
|
+
it "should be able to provide a script contribution per class" do
|
93
|
+
get '/page_with_contributions'
|
94
|
+
last_response.body.should include(%[alert('hello just once');])
|
95
|
+
end
|
96
|
+
|
97
|
+
it "should be able to provide a dom modification block" do
|
98
|
+
get '/page_with_contributions'
|
99
|
+
last_response.body.scan(%[<body class=\"new_class\">]).should have_exactly(1).match
|
100
|
+
end
|
101
|
+
|
102
|
+
end
|
@@ -80,7 +80,7 @@ end
|
|
80
80
|
|
81
81
|
describe Class, " when calling attr_array with default options" do
|
82
82
|
|
83
|
-
before
|
83
|
+
before :each do
|
84
84
|
@target = Class.new
|
85
85
|
@target.attr_array(:elements)
|
86
86
|
end
|
@@ -95,7 +95,7 @@ end
|
|
95
95
|
|
96
96
|
describe Class, " when calling attr_array with options {:create_accessor => false}" do
|
97
97
|
|
98
|
-
before
|
98
|
+
before :each do
|
99
99
|
@target = Class.new
|
100
100
|
@target.attr_array(:elements, :create_accessor => false)
|
101
101
|
end
|
@@ -105,4 +105,36 @@ describe Class, " when calling attr_array with options {:create_accessor => fals
|
|
105
105
|
it "should not create an accessor method for the array" do
|
106
106
|
@target.should_not respond_to(:elements)
|
107
107
|
end
|
108
|
+
end
|
109
|
+
|
110
|
+
describe Class do
|
111
|
+
|
112
|
+
it "when calling class_attr_accessor should add class attribute accessors for each symbol passed" do
|
113
|
+
class Foo; end
|
114
|
+
Foo.class_attr_accessor(:bar)
|
115
|
+
Foo.should respond_to(:bar)
|
116
|
+
Foo.should respond_to(:bar=)
|
117
|
+
end
|
118
|
+
|
119
|
+
it "when calling class_attr_reader should add class attribute readers for each symbol passed" do
|
120
|
+
class Bar; end
|
121
|
+
Bar.class_attr_reader(:foo)
|
122
|
+
Bar.should respond_to(:foo)
|
123
|
+
Bar.should_not respond_to(:foo=)
|
124
|
+
end
|
125
|
+
|
126
|
+
it "when calling class_attr_writer should add class attribute readers for each symbol passed" do
|
127
|
+
class FooBar; end
|
128
|
+
FooBar.class_attr_writer(:bar)
|
129
|
+
FooBar.should_not respond_to(:bar)
|
130
|
+
FooBar.should respond_to(:bar=)
|
131
|
+
end
|
132
|
+
|
133
|
+
it "when calling instance_attr_accessor should add instance attribute accessors for each symbol passed" do
|
134
|
+
class Snafu; end
|
135
|
+
Snafu.instance_attr_accessor(:bar)
|
136
|
+
instance = Snafu.new
|
137
|
+
instance.should respond_to(:bar)
|
138
|
+
instance.should respond_to(:bar=)
|
139
|
+
end
|
108
140
|
end
|
@@ -0,0 +1,91 @@
|
|
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
|
+
@router = Trellis::DefaultRouter.new
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should extract the page" do
|
10
|
+
value, source, event, destination = "/some_page".match(@regexp).to_a.reverse
|
11
|
+
value.should be_nil
|
12
|
+
source.should be_nil
|
13
|
+
event.should be_nil
|
14
|
+
destination.should_not be_nil
|
15
|
+
destination.should == "some_page"
|
16
|
+
end
|
17
|
+
|
18
|
+
it "should extract the page and event" do
|
19
|
+
value, source, event, destination = "/some_page/events/event".match(@regexp).to_a.reverse
|
20
|
+
value.should be_nil
|
21
|
+
source.should be_nil
|
22
|
+
event.should == "event"
|
23
|
+
destination.should_not be_nil
|
24
|
+
destination.should == "some_page"
|
25
|
+
end
|
26
|
+
|
27
|
+
it "should extract the page, event and source" do
|
28
|
+
value, source, event, destination = "/some_page/events/event.source".match(@regexp).to_a.reverse
|
29
|
+
value.should be_nil
|
30
|
+
source.should == "source"
|
31
|
+
event.should == "event"
|
32
|
+
destination.should_not be_nil
|
33
|
+
destination.should == "some_page"
|
34
|
+
end
|
35
|
+
|
36
|
+
it "should extract the page, event and source and value" do
|
37
|
+
value, source, event, destination = "/some_page/events/event.source/123".match(@regexp).to_a.reverse
|
38
|
+
value.should == "123"
|
39
|
+
source.should == "source"
|
40
|
+
event.should == "event"
|
41
|
+
destination.should_not be_nil
|
42
|
+
destination.should == "some_page"
|
43
|
+
end
|
44
|
+
|
45
|
+
it "should extract the page, event and value" do
|
46
|
+
value, source, event, destination = "/some_page/events/event/123".match(@regexp).to_a.reverse
|
47
|
+
value.should == "123"
|
48
|
+
source.should be_nil
|
49
|
+
event.should == "event"
|
50
|
+
destination.should_not be_nil
|
51
|
+
destination.should == "some_page"
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should build a path given page" do
|
55
|
+
page = TestApp::Home.new
|
56
|
+
path = Trellis::DefaultRouter.to_uri(:page => page)
|
57
|
+
path.should == "/home"
|
58
|
+
end
|
59
|
+
|
60
|
+
it "should build a path given page and an event" do
|
61
|
+
page = TestApp::Home.new
|
62
|
+
path = Trellis::DefaultRouter.to_uri(:page => page, :event => 'event')
|
63
|
+
path.should == "/home/events/event"
|
64
|
+
end
|
65
|
+
|
66
|
+
it "should build a path given page, an event and a source" do
|
67
|
+
page = TestApp::Home.new
|
68
|
+
path = Trellis::DefaultRouter.to_uri(:page => page, :event => 'event', :source => 'source')
|
69
|
+
path.should == "/home/events/event.source"
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should build a path given page, an event, a source and a value" do
|
73
|
+
page = TestApp::Home.new
|
74
|
+
path = Trellis::DefaultRouter.to_uri(:page => page, :event => 'event', :source => 'source', :value => 'value')
|
75
|
+
path.should == "/home/events/event.source/value"
|
76
|
+
end
|
77
|
+
|
78
|
+
it "should match valid patterns" do
|
79
|
+
page_request = mock('request', :path_info => '/page')
|
80
|
+
page_event_request = mock('request', :path_info => '/page/events/event')
|
81
|
+
page_event_source_request = mock('request', :path_info => '/page/events/event.source')
|
82
|
+
page_event_value_request = mock('request', :path_info => '/page/events/event/value')
|
83
|
+
page_event_source_value_request = mock('request', :path_info => '/page/events/event.source/value')
|
84
|
+
|
85
|
+
@router.matches?(page_request).should be_true
|
86
|
+
@router.matches?(page_event_request).should be_true
|
87
|
+
@router.matches?(page_event_source_request).should be_true
|
88
|
+
@router.matches?(page_event_value_request).should be_true
|
89
|
+
@router.matches?(page_event_source_value_request).should be_true
|
90
|
+
end
|
91
|
+
end
|
@@ -1,10 +1,9 @@
|
|
1
1
|
module TestApp
|
2
2
|
class MyApp < Trellis::Application
|
3
3
|
home :home
|
4
|
-
pages :other
|
5
4
|
|
6
5
|
map_static ['/images', '/style', '/favicon.ico']
|
7
|
-
map_static ['/
|
6
|
+
map_static ['/jquery'], "./js"
|
8
7
|
end
|
9
8
|
|
10
9
|
class Home < Trellis::Page
|
@@ -47,5 +46,94 @@ module TestApp
|
|
47
46
|
end
|
48
47
|
|
49
48
|
template do html { body { text %[<trellis:value name="some_value"/>] }} end
|
50
|
-
end
|
49
|
+
end
|
50
|
+
|
51
|
+
class RoutedDifferently < Trellis::Page
|
52
|
+
route '/whoa'
|
53
|
+
|
54
|
+
template do html { body { text %[whoa!] }} end
|
55
|
+
end
|
56
|
+
|
57
|
+
class RoutedDifferentlyWithAParam < Trellis::Page
|
58
|
+
route '/hello/:name'
|
59
|
+
|
60
|
+
template do
|
61
|
+
html {
|
62
|
+
body {
|
63
|
+
h2 "Hello"
|
64
|
+
text %[<trellis:value name="name"/>]
|
65
|
+
}
|
66
|
+
}
|
67
|
+
end
|
68
|
+
end
|
69
|
+
|
70
|
+
class RoutedDifferentlyWithParams < Trellis::Page
|
71
|
+
route '/report/:year/:month/:day'
|
72
|
+
|
73
|
+
template do
|
74
|
+
html {
|
75
|
+
body {
|
76
|
+
h2 "Report for"
|
77
|
+
text %[<trellis:value name="month"/>]
|
78
|
+
text '/'
|
79
|
+
text %[<trellis:value name="day"/>]
|
80
|
+
text '/'
|
81
|
+
text %[<trellis:value name="year"/>]
|
82
|
+
}
|
83
|
+
}
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
class RoutedWithOptionalParams < Trellis::Page
|
88
|
+
route '/foobar/?:foo?/?:bar?'
|
89
|
+
|
90
|
+
template do
|
91
|
+
html {
|
92
|
+
body {
|
93
|
+
text %[<trellis:value name="foo"/>]
|
94
|
+
text '-'
|
95
|
+
text %[<trellis:value name="bar"/>]
|
96
|
+
}
|
97
|
+
}
|
98
|
+
end
|
99
|
+
end
|
100
|
+
|
101
|
+
class RoutedWithSingleWildcard < Trellis::Page
|
102
|
+
route '/splat/*'
|
103
|
+
|
104
|
+
template do
|
105
|
+
html {
|
106
|
+
body {
|
107
|
+
text %[<trellis:value name="splat"/>]
|
108
|
+
}
|
109
|
+
}
|
110
|
+
end
|
111
|
+
end
|
112
|
+
|
113
|
+
class RoutedWithMultipleWildcards < Trellis::Page
|
114
|
+
route '/splats/*/foo/*/*'
|
115
|
+
|
116
|
+
template do
|
117
|
+
html {
|
118
|
+
body {
|
119
|
+
text %[<trellis:value name="splat"/>]
|
120
|
+
}
|
121
|
+
}
|
122
|
+
end
|
123
|
+
end
|
124
|
+
|
125
|
+
class RoutedWithMixedParams < Trellis::Page
|
126
|
+
route '/mixed/:foo/*'
|
127
|
+
|
128
|
+
template do
|
129
|
+
html {
|
130
|
+
body {
|
131
|
+
text %[<trellis:value name="splat"/>]
|
132
|
+
text '-'
|
133
|
+
text %[<trellis:value name="foo"/>]
|
134
|
+
}
|
135
|
+
}
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
51
139
|
end
|
data/test/page_spec.rb
CHANGED
@@ -9,19 +9,21 @@ describe Trellis::Page, " when sending an event to a page" do
|
|
9
9
|
@request = Rack::MockRequest.new(@application)
|
10
10
|
end
|
11
11
|
|
12
|
-
it "if the event handler returns self
|
13
|
-
response = @request.get("/home
|
14
|
-
response.
|
12
|
+
it "should redirect to the receiving page if the event handler returns self" do
|
13
|
+
response = @request.get("/home/events/event1")
|
14
|
+
response.status.should be(302)
|
15
|
+
response.headers['Location'].should == '/home'
|
15
16
|
end
|
16
17
|
|
17
18
|
it "should return a response as a string if the event handler returns a String" do
|
18
|
-
response = @request.get("/home
|
19
|
+
response = @request.get("/home/events/event2")
|
19
20
|
response.body.should == "just some text"
|
20
21
|
end
|
21
22
|
|
22
|
-
it "should
|
23
|
-
response = @request.get("/home
|
24
|
-
response.
|
23
|
+
it "should redirect to the injected page as a response if the event handler returns an injected page " do
|
24
|
+
response = @request.get("/home/events/event3")
|
25
|
+
response.status.should be(302)
|
26
|
+
response.headers['Location'].should == '/other'
|
25
27
|
end
|
26
28
|
|
27
29
|
it "should invoke the before_load method if provided by the page" do
|
@@ -35,7 +37,7 @@ describe Trellis::Page, " when sending an event to a page" do
|
|
35
37
|
end
|
36
38
|
end
|
37
39
|
|
38
|
-
describe Trellis::Page, " when calling inject_dependent_pages on an instance of
|
40
|
+
describe Trellis::Page, " when calling inject_dependent_pages on an instance of Page" do
|
39
41
|
it "should contain instances of the injected pages" do
|
40
42
|
homepage = TestApp::Home.new
|
41
43
|
homepage.inject_dependent_pages
|
@@ -44,3 +46,11 @@ describe Trellis::Page, " when calling inject_dependent_pages on an instance of
|
|
44
46
|
end
|
45
47
|
end
|
46
48
|
|
49
|
+
describe Trellis::Page, " when created with a custom route" do
|
50
|
+
it "should contain an instance of Router" do
|
51
|
+
router = TestApp::RoutedDifferently.router
|
52
|
+
router.should_not be_nil
|
53
|
+
router.should be_an_instance_of(Trellis::Router)
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
data/test/router_spec.rb
CHANGED
@@ -1,52 +1,52 @@
|
|
1
1
|
require File.dirname(__FILE__) + '/spec_helper.rb'
|
2
2
|
|
3
|
-
describe Trellis::
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
3
|
+
describe Trellis::Router, " when constructed" do
|
4
|
+
|
5
|
+
it "with a page parameter should route to that page " do
|
6
|
+
@router = Trellis::Router.new(:page => TestApp::Home)
|
7
|
+
@router.route().destination.should == TestApp::Home
|
8
|
+
end
|
9
|
+
|
10
|
+
it "with a simple path it should match that path" do
|
11
|
+
request = mock('request', :path_info => '/hello')
|
12
|
+
@router = Trellis::Router.new(:path => '/hello')
|
13
|
+
@router.matches?(request).should be_true
|
14
|
+
end
|
15
|
+
|
16
|
+
it "with a path containing a single named parameter should match valid variations of that path" do
|
17
|
+
request_brian = mock('request', :path_info => '/hello/brian')
|
18
|
+
request_michael = mock('request', :path_info => '/hello/michael')
|
19
|
+
@router = Trellis::Router.new(:path => '/hello/:name')
|
20
|
+
@router.matches?(request_brian).should be_true
|
21
|
+
@router.matches?(request_michael).should be_true
|
22
|
+
end
|
23
|
+
|
24
|
+
it "with a path containing multiple named parameters should match valid variations of that path" do
|
25
|
+
request_xmas = mock('request', :path_info => '/hello/2009/12/25')
|
26
|
+
request_labor_day = mock('request', :path_info => '/hello/2009/09/07')
|
27
|
+
@router = Trellis::Router.new(:path => '/hello/:year/:month/:day')
|
28
|
+
@router.matches?(request_xmas).should be_true
|
29
|
+
@router.matches?(request_labor_day).should be_true
|
30
|
+
end
|
31
|
+
|
32
|
+
it "with a path containing a single named parameters should collect the parameter" do
|
33
|
+
@router = Trellis::Router.new(:path => '/hello/:name')
|
34
|
+
@router.keys.should include('name')
|
35
|
+
end
|
36
|
+
|
37
|
+
it "with a path containing multiple parameters should collect all parameters" do
|
38
|
+
@router = Trellis::Router.new(:path => '/hello/:year/:month/:day')
|
39
|
+
@router.keys.should include('year', 'month', 'day')
|
40
|
+
end
|
41
|
+
|
42
|
+
it "with a path containing multiple optional parameters should collect all parameters" do
|
43
|
+
@router = Trellis::Router.new(:path => '/?:foo?/?:bar?')
|
44
|
+
@router.keys.should include('foo', 'bar')
|
45
|
+
end
|
46
|
+
|
47
|
+
it "with a path containing a single wildcard param it should capture the values in splat" do
|
48
|
+
@router = Trellis::Router.new(:path => '/*')
|
49
|
+
@router.keys.should include('splat')
|
50
|
+
end
|
51
|
+
|
52
52
|
end
|