trellis 0.0.1 → 0.0.2
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.
- 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
|