vanilla 1.0.2 → 1.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/Rakefile +112 -109
- data/bin/vanilla +35 -6
- data/lib/vanilla.rb +10 -14
- data/lib/vanilla/app.rb +109 -41
- data/lib/vanilla/console.rb +22 -2
- data/lib/vanilla/dynasnip.rb +4 -36
- data/lib/vanilla/renderers.rb +12 -0
- data/lib/vanilla/renderers/base.rb +58 -34
- data/lib/vanilla/renderers/bold.rb +0 -2
- data/lib/vanilla/renderers/erb.rb +1 -3
- data/lib/vanilla/renderers/haml.rb +13 -0
- data/lib/vanilla/renderers/markdown.rb +0 -2
- data/lib/vanilla/renderers/raw.rb +0 -2
- data/lib/vanilla/renderers/ruby.rb +12 -6
- data/lib/vanilla/renderers/textile.rb +0 -2
- data/lib/vanilla/request.rb +19 -17
- data/lib/vanilla/routes.rb +9 -20
- data/lib/vanilla/snip_reference_parser.rb +94 -0
- data/lib/vanilla/static.rb +28 -0
- data/pristine_app/Gemfile +3 -0
- data/pristine_app/Gemfile.lock +32 -0
- data/pristine_app/README +47 -0
- data/pristine_app/config.ru +26 -0
- data/pristine_app/public/vanilla.css +15 -0
- data/pristine_app/soups/base/layout.snip +18 -0
- data/pristine_app/soups/base/start.snip +19 -0
- data/pristine_app/soups/dynasnips/current_snip.rb +29 -0
- data/{lib/vanilla → pristine_app/soups}/dynasnips/debug.rb +5 -3
- data/pristine_app/soups/dynasnips/index.rb +12 -0
- data/{lib/vanilla → pristine_app/soups}/dynasnips/link_to.rb +4 -2
- data/pristine_app/soups/dynasnips/link_to_current_snip.rb +14 -0
- data/pristine_app/soups/dynasnips/page_title.rb +9 -0
- data/{lib/vanilla → pristine_app/soups}/dynasnips/pre.rb +7 -5
- data/{lib/vanilla → pristine_app/soups}/dynasnips/raw.rb +8 -5
- data/pristine_app/soups/extras/comments.rb +78 -0
- data/{lib/vanilla/dynasnips → pristine_app/soups/extras}/kind.rb +19 -17
- data/{lib/vanilla/dynasnips → pristine_app/soups/extras}/rand.rb +2 -0
- data/pristine_app/soups/extras/url_to.rb +7 -0
- data/pristine_app/soups/tutorial/bad_dynasnip.snip +8 -0
- data/pristine_app/soups/tutorial/hello_world.snip +20 -0
- data/pristine_app/soups/tutorial/markdown_example.snip +13 -0
- data/pristine_app/soups/tutorial/snip.snip +9 -0
- data/pristine_app/soups/tutorial/soup.snip +3 -0
- data/pristine_app/soups/tutorial/test.snip +30 -0
- data/pristine_app/soups/tutorial/textile_example.snip +11 -0
- data/pristine_app/soups/tutorial/tutorial-another-snip.snip +1 -0
- data/pristine_app/soups/tutorial/tutorial-basic-snip-inclusion.snip +1 -0
- data/pristine_app/soups/tutorial/tutorial-dynasnips.snip.markdown +56 -0
- data/pristine_app/soups/tutorial/tutorial-layout.snip +56 -0
- data/pristine_app/soups/tutorial/tutorial-links.snip +4 -0
- data/pristine_app/soups/tutorial/tutorial-renderers.snip.markdown +77 -0
- data/pristine_app/soups/tutorial/tutorial.snip.markdown +69 -0
- data/pristine_app/soups/tutorial/vanilla-rb.snip +16 -0
- data/pristine_app/soups/tutorial/vanilla.snip +8 -0
- data/test/dynasnip_test.rb +42 -0
- data/test/dynasnips/link_to_current_snip_test.rb +19 -0
- data/test/dynasnips/link_to_test.rb +27 -0
- data/test/dynasnips/page_title_test.rb +19 -0
- data/test/renderers/base_renderer_test.rb +43 -0
- data/test/renderers/erb_renderer_test.rb +29 -0
- data/test/renderers/haml_renderer_test.rb +35 -0
- data/test/renderers/markdown_renderer_test.rb +31 -0
- data/test/renderers/raw_renderer_test.rb +23 -0
- data/test/renderers/ruby_renderer_test.rb +59 -0
- data/test/snip_inclusion_test.rb +56 -0
- data/test/snip_reference_parser_test.rb +123 -0
- data/test/test_helper.rb +75 -0
- data/test/vanilla_app_test.rb +83 -0
- data/test/vanilla_presenting_test.rb +125 -0
- data/test/vanilla_request_test.rb +87 -0
- metadata +179 -78
- data/config.example.yml +0 -5
- data/config.ru +0 -9
- data/lib/defensio.rb +0 -59
- data/lib/tasks/vanilla.rake +0 -177
- data/lib/vanilla/dynasnips/comments.rb +0 -108
- data/lib/vanilla/dynasnips/current_snip.rb +0 -32
- data/lib/vanilla/dynasnips/edit.rb +0 -63
- data/lib/vanilla/dynasnips/edit_link.rb +0 -24
- data/lib/vanilla/dynasnips/index.rb +0 -11
- data/lib/vanilla/dynasnips/link_to_current_snip.rb +0 -16
- data/lib/vanilla/dynasnips/login.rb +0 -56
- data/lib/vanilla/dynasnips/new.rb +0 -14
- data/lib/vanilla/dynasnips/notes.rb +0 -42
- data/lib/vanilla/dynasnips/url_to.rb +0 -7
- data/lib/vanilla/snip_handling.rb +0 -33
- data/lib/vanilla/snips/start.rb +0 -27
- data/lib/vanilla/snips/system.rb +0 -76
- data/lib/vanilla/snips/tutorial.rb +0 -157
- data/lib/vanilla/test_snips.rb +0 -85
- data/public/hatch.png +0 -0
- data/public/javascripts/jquery.js +0 -3549
- data/public/javascripts/vanilla.js +0 -21
- data/spec/dynasnip_spec.rb +0 -31
- data/spec/renderers/base_renderer_spec.rb +0 -40
- data/spec/renderers/erb_renderer_spec.rb +0 -27
- data/spec/renderers/markdown_renderer_spec.rb +0 -29
- data/spec/renderers/raw_renderer_spec.rb +0 -21
- data/spec/renderers/ruby_renderer_spec.rb +0 -42
- data/spec/renderers/vanilla_app_detecting_renderer_spec.rb +0 -35
- data/spec/spec_helper.rb +0 -64
- data/spec/vanilla_app_spec.rb +0 -38
- data/spec/vanilla_presenting_spec.rb +0 -84
- data/spec/vanilla_request_spec.rb +0 -73
- data/spec/vanilla_snip_finding_spec.rb +0 -28
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
{tutorial-links}
|
|
2
|
+
|
|
3
|
+
Snips - the basic concept
|
|
4
|
+
------------
|
|
5
|
+
|
|
6
|
+
Firstly, open the raw contents of this snip - either in your editor (search for `vanilla-rb-tutorial.snip`), or by opening <a href="{current_snip name}.raw">this snip in raw format</a> in a new window or tab. Ready? OK.
|
|
7
|
+
|
|
8
|
+
Every piece of information displayed here is stored as a {link_to snip}. Snips, within their contents, can also reference other snips. When you request a snip, it will render into a page (or another kind of response), and also render any snips that it internally references.
|
|
9
|
+
|
|
10
|
+
For example, consider the snip {link_to tutorial-basic-snip-inclusion}:
|
|
11
|
+
|
|
12
|
+
{raw tutorial-basic-snip-inclusion}
|
|
13
|
+
|
|
14
|
+
When this snip is rendered, it appears like this:
|
|
15
|
+
|
|
16
|
+
> {tutorial-basic-snip-inclusion}
|
|
17
|
+
|
|
18
|
+
Notice the use of curly brackets to reference one snip from inside another. {link_to vanilla-rb} finds these references to snips, then renders that snip and replaces it in the first snip. Neat!
|
|
19
|
+
|
|
20
|
+
Renderers
|
|
21
|
+
--------
|
|
22
|
+
|
|
23
|
+
The way that a snip is rendered depends on whether or not it has an extension, or a `render_as` attribute set. For instance, the extention of this snip is `{current_snip extension}`, and the `render_as` property of `markdown_example` is `Markdown`. Scroll to the bottom of the raw markdown_example snip in your editor, and you'll see this being declared.
|
|
24
|
+
|
|
25
|
+
This means that the `content` of this snip will be passed through `Vanilla::Renderers::Markdown` before it is then rendered to the page. There are several different renders provided by Vanilla.rb at the moment:
|
|
26
|
+
|
|
27
|
+
* Markdown - as described above
|
|
28
|
+
* Textile - which performs similarly for Textile. This means that you can mix how you write the content of snips!
|
|
29
|
+
* Raw - which simply returns the content of the snip, as-is. If you attach a `.raw` extension to this url, you'll see it in action
|
|
30
|
+
* Bold - simply wraps the content in bold. It's a demo, essentially.
|
|
31
|
+
* Erb - passes the snip contents through Ruby's `Erb` library. It also makes some information available for use by ruby code within the snip's contents
|
|
32
|
+
* Ruby - parses the snips content as Ruby itself.
|
|
33
|
+
|
|
34
|
+
You can see a lot of these renderers being exercised in the {link_to test} snip.
|
|
35
|
+
|
|
36
|
+
It's using this last renderer that a second concept of Vanilla is implemented - dynasnips.
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
Dynasnips
|
|
40
|
+
--------
|
|
41
|
+
|
|
42
|
+
Because the curly braces simply cause a snip to be rendered, we can use this in conjunction with the Ruby renderer to run actual code. For instance, in the snip above:
|
|
43
|
+
|
|
44
|
+
{raw tutorial-basic-snip-inclusion}
|
|
45
|
+
|
|
46
|
+
we can see a reference to the `link_to` snip - <tt>{link\_to snip}</tt>.
|
|
47
|
+
|
|
48
|
+
Lets look at the raw content of `link_to`:
|
|
49
|
+
|
|
50
|
+
{raw link_to}
|
|
51
|
+
|
|
52
|
+
As you can see, it simply refers to the Ruby class `LinkTo`, which is contained within the vanilla-rb codebase. When the Ruby renderer is called, expects the given code to evaulate to a Ruby class. It then instantiates the class, and calls a `handle` method on the instance, passing it any other arguments from the snip inclusion. So, in the case of <tt>{link\_to snip}</tt>, the only argument is `snip`.
|
|
53
|
+
|
|
54
|
+
### Included Dynasnips
|
|
55
|
+
|
|
56
|
+
Vanilla.rb includes a number of dynasnips by default. Here are a couple:
|
|
57
|
+
|
|
58
|
+
* `link_to`, to produce a link to another snip
|
|
59
|
+
* `raw`, which displays the raw contents of a snip
|
|
60
|
+
* `index`, which shows all of the available snips: {link_to index}
|
|
61
|
+
* ... and several others.
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
Anyway - that should be enough to get you started.
|
|
65
|
+
|
|
66
|
+
{tutorial-links}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
:updated_at: 2011-04-28 16:21:00 +01:00
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
Vanilla.rb is the software powering this site. It's a sort-of wiki/bliki thing, based on {link_to vanilla}.
|
|
2
|
+
|
|
3
|
+
Here's the [introductory blog post][3].
|
|
4
|
+
|
|
5
|
+
It's developed on [github][1], and has a [lighthouse bug tracker][2]. At the moment it's not very well documented, since I'm exploring how the concept might work and the internals are subject to change. However, please do play around with it.
|
|
6
|
+
|
|
7
|
+
Here's the tutorial (helpfully included from {link_to tutorial}).
|
|
8
|
+
|
|
9
|
+
{tutorial}
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
[1]: http://github.com/lazyatom/vanilla
|
|
13
|
+
[2]: http://lazyatom.lighthouseapp.com/projects/11797-vanilla/tickets
|
|
14
|
+
[3]: http://interblah.net/introducing-vanilla-rb
|
|
15
|
+
|
|
16
|
+
:render_as: Markdown
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
require 'vanilla/dynasnip'
|
|
3
|
+
|
|
4
|
+
describe Dynasnip do
|
|
5
|
+
context "when storing attributes" do
|
|
6
|
+
|
|
7
|
+
class ::TestDyna < Dynasnip
|
|
8
|
+
attribute :test_attribute, "test attribute content"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
should "make the attribute available as an instance method" do
|
|
12
|
+
assert_equal "test attribute content", TestDyna.new(@app).test_attribute
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
should "store the attribute in the soup" do
|
|
16
|
+
@app.soup << TestDyna.snip_attributes
|
|
17
|
+
assert_equal "test attribute content", @app.soup['test_dyna'].test_attribute
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
should "allow the attribute to be overriden by the soup contents" do
|
|
21
|
+
@app.soup << TestDyna.snip_attributes
|
|
22
|
+
snip = @app.soup['test_dyna']
|
|
23
|
+
snip.test_attribute = "altered content"
|
|
24
|
+
snip.save
|
|
25
|
+
|
|
26
|
+
assert_equal "altered content", TestDyna.new(@app).test_attribute
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
context "when rendering usage" do
|
|
31
|
+
class ::ShowUsage < Dynasnip
|
|
32
|
+
usage "This is the usage"
|
|
33
|
+
def handle
|
|
34
|
+
usage
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
should "show the usage defined in the snip" do
|
|
39
|
+
assert_equal "This is the usage", ShowUsage.new(@app).handle
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
$LOAD_PATH.unshift File.expand_path("../../../pristine_app/soups/dynasnips", __FILE__)
|
|
3
|
+
require "link_to_current_snip"
|
|
4
|
+
|
|
5
|
+
context "The link_to_current_snip dynasnip" do
|
|
6
|
+
setup do
|
|
7
|
+
@app.soup << LinkToCurrentSnip.snip_attributes
|
|
8
|
+
create_snip :name => "test", :content => "test {link_to_current_snip}"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
should "render a link to the snip that was requested" do
|
|
12
|
+
assert_response_body %{test <a href="/test">test</a>}, "/test"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
should "render a link to the snip that was requested even if it isn't the snip that included the dyna" do
|
|
16
|
+
create_snip :name => "othertest", :content => "othertest {test}"
|
|
17
|
+
assert_response_body %{othertest test <a href="/othertest">othertest</a>}, "/othertest"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
$LOAD_PATH.unshift File.expand_path("../../../pristine_app/soups/dynasnips", __FILE__)
|
|
3
|
+
require "link_to"
|
|
4
|
+
|
|
5
|
+
context "The link_to dynasnip" do
|
|
6
|
+
setup do
|
|
7
|
+
create_snip :name => "start", :content => "hello"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "render a link to a snip that exists" do
|
|
11
|
+
assert_equal %{<a href="/start">start</a>}, render_dynasnip(LinkTo, "start")
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should "allow specification of the link text" do
|
|
15
|
+
assert_equal %{<a href="/start">the start snip</a>}, render_dynasnip(LinkTo, "start", "the start snip")
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
should "mark snips that are missing with a class" do
|
|
19
|
+
assert_equal %{<a class="missing" href="/missing">missing</a>}, render_dynasnip(LinkTo, "missing")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
private
|
|
23
|
+
|
|
24
|
+
def render_dynasnip(klass, *args)
|
|
25
|
+
klass.new(@app).handle(*args)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
$LOAD_PATH.unshift File.expand_path("../../../pristine_app/soups/dynasnips", __FILE__)
|
|
3
|
+
require "page_title"
|
|
4
|
+
|
|
5
|
+
context "The page_title dynasnip" do
|
|
6
|
+
setup do
|
|
7
|
+
@app.soup << PageTitle.snip_attributes
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "render as the requested snip name if that snip has no title" do
|
|
11
|
+
create_snip :name => "test", :content => "{page_title}"
|
|
12
|
+
assert_response_body %{test}, "/test"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
should "render as the requested snip's page_title when that attribute is present" do
|
|
16
|
+
create_snip :name => "test", :content => "{page_title}", :page_title => "This is a test"
|
|
17
|
+
assert_response_body %{This is a test}, "/test"
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
|
|
3
|
+
describe Vanilla::Renderers::Base do
|
|
4
|
+
setup do
|
|
5
|
+
create_snip(:name => "test", :content => "content content", :part => "part content")
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
should "render the contents part of the snip as it is" do
|
|
9
|
+
assert_response_body "content content", "/test"
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
should "render the specified part of the snip" do
|
|
13
|
+
assert_response_body "part content", "/test/part"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
should "include the contents of a referenced snip" do
|
|
17
|
+
create_snip(:name => "snip_with_inclusions", :content => "loading {test}")
|
|
18
|
+
assert_response_body "loading content content", "/snip_with_inclusions"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
should "be able to render a snip attribute" do
|
|
22
|
+
create_snip(:name => "snip_with_inclusions", :content => "loading {test.part}")
|
|
23
|
+
assert_response_body "loading part content", "/snip_with_inclusions"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
should "perform snip inclusion when rendering a part" do
|
|
27
|
+
create_snip(:name => "snip_with_inclusions", :content => "other content", :part => "loading {test}")
|
|
28
|
+
assert_response_body "loading content content", "/snip_with_inclusions/part"
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
should "include other snips using their renderers" do
|
|
32
|
+
create_snip(:name => "including_snip", :content => "lets include {another_snip}")
|
|
33
|
+
create_snip(:name => "another_snip", :content => "blah", :render_as => "Bold")
|
|
34
|
+
assert_equal "lets include <b>blah</b>", response_body_for("/including_snip").gsub(/\s+/, ' ')
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
context "when trying to include a missing snip" do
|
|
38
|
+
should "return a string describing the missing snip" do
|
|
39
|
+
create_snip(:name => 'blah', :content => 'include a {missing_snip}')
|
|
40
|
+
assert_response_body "include a [snip 'missing_snip' cannot be found]", "/blah"
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
|
|
3
|
+
describe Vanilla::Renderers::Erb do
|
|
4
|
+
context "when rendering" do
|
|
5
|
+
should "insert evaluated Erb content into the snip" do
|
|
6
|
+
erb_snip(:name => "test", :content => "<%= 1 + 2 %>")
|
|
7
|
+
assert_response_body "3", "/test"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "evaluate Erb content in the snip" do
|
|
11
|
+
erb_snip(:name => "test", :content => "<% if false %>monkey<% else %>donkey<% end %>")
|
|
12
|
+
assert_response_body "donkey", "/test"
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
should "expose the snip as an instance variable" do
|
|
16
|
+
erb_snip(:name => "test", :content => "<%= @snip.name %>")
|
|
17
|
+
assert_response_body "test", "/test"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
should "expose the app as an instance variable" do
|
|
21
|
+
erb_snip(:name => "test", :content => "<%= @app.class.name %>")
|
|
22
|
+
assert_response_body "Vanilla::App", "/test"
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def erb_snip(params)
|
|
27
|
+
create_snip(params.merge(:render_as => "Erb"))
|
|
28
|
+
end
|
|
29
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
require 'test_helper'
|
|
2
|
+
require 'haml'
|
|
3
|
+
|
|
4
|
+
describe Vanilla::Renderers::Haml do
|
|
5
|
+
context "when rendering" do
|
|
6
|
+
should "render Haml into HTML" do
|
|
7
|
+
haml_snip(:name => "test", :content => "#hello\n stuff")
|
|
8
|
+
assert_response_body %{<div id='hello'>\n stuff\n</div>}, "/test"
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
should "insert evaluated Haml content into the snip" do
|
|
12
|
+
haml_snip(:name => "test", :content => "= 1 + 2")
|
|
13
|
+
assert_response_body "3", "/test"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
should "evaluate Erb content in the snip" do
|
|
17
|
+
haml_snip(:name => "test", :content => "- if false\n monkey\n- else\n donkey")
|
|
18
|
+
assert_response_body "donkey", "/test"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
should "expose the snip as an instance variable" do
|
|
22
|
+
haml_snip(:name => "test", :content => "= @snip.name")
|
|
23
|
+
assert_response_body "test", "/test"
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
should "expose the app as an instance variable" do
|
|
27
|
+
haml_snip(:name => "test", :content => "= @app.class.name")
|
|
28
|
+
assert_response_body "Vanilla::App", "/test"
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def haml_snip(params)
|
|
33
|
+
create_snip(params.merge(:render_as => "Haml"))
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
|
|
3
|
+
describe Vanilla::Renderers::Markdown do
|
|
4
|
+
context "when rendering" do
|
|
5
|
+
should "return the snip contents rendered via Markdown" do
|
|
6
|
+
content = <<Markdown
|
|
7
|
+
# markdown
|
|
8
|
+
|
|
9
|
+
* totally
|
|
10
|
+
* [rocks](http://www.example.com)!
|
|
11
|
+
Markdown
|
|
12
|
+
markdown_snip(:name => "test", :content => content)
|
|
13
|
+
assert_response_body BlueCloth.new(content).to_html, "/test"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
should "include other snips using their renderers" do
|
|
17
|
+
markdown_snip(:name => "test", :content => <<-Markdown
|
|
18
|
+
# markdown
|
|
19
|
+
|
|
20
|
+
and so lets include {another_snip}
|
|
21
|
+
Markdown
|
|
22
|
+
)
|
|
23
|
+
create_snip(:name => "another_snip", :content => "blah", :render_as => "Bold")
|
|
24
|
+
assert_equal "<h1>markdown</h1> <p>and so lets include <b>blah</b></p>", response_body_for("/test").gsub(/\s+/, ' ')
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def markdown_snip(attributes)
|
|
29
|
+
create_snip(attributes.merge(:render_as => "Markdown"))
|
|
30
|
+
end
|
|
31
|
+
end
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
|
|
3
|
+
describe Vanilla::Renderers::Raw do
|
|
4
|
+
context "when rendering" do
|
|
5
|
+
setup do
|
|
6
|
+
@snip = create_snip(:name => "test", :content => "raw content", :part => "raw part")
|
|
7
|
+
set_main_template "<tag>{current_snip}</tag>"
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
should "render the contents part of the snip as it is" do
|
|
11
|
+
assert_response_body "raw content", "/test.raw"
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
should "render the specified part of the snip" do
|
|
15
|
+
assert_response_body "raw part", "/test/part.raw"
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
should "not perform any snip inclusion" do
|
|
19
|
+
create_snip(:name => "snip_with_inclusions", :content => "loading {another_snip}")
|
|
20
|
+
assert_response_body "loading {another_snip}", "/snip_with_inclusions.raw"
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
|
|
3
|
+
describe Vanilla::Renderers::Ruby do
|
|
4
|
+
context "when rendering normally" do
|
|
5
|
+
class ::TestDyna < Dynasnip
|
|
6
|
+
def handle(*args)
|
|
7
|
+
'handle called'
|
|
8
|
+
end
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
setup do
|
|
12
|
+
@app.soup << TestDyna.snip_attributes
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
should "render the result of the handle method" do
|
|
16
|
+
assert_response_body 'handle called', "/test_dyna"
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
context "when responding restfully" do
|
|
21
|
+
class ::RestishDyna < Dynasnip
|
|
22
|
+
def get(*args)
|
|
23
|
+
'get called'
|
|
24
|
+
end
|
|
25
|
+
def post(*args)
|
|
26
|
+
'post called'
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
setup do
|
|
31
|
+
@app.soup << RestishDyna.snip_attributes
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
should "render the result of the get method on GET requests" do
|
|
35
|
+
assert_response_body 'get called', "/restish_dyna"
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
should "render the result of the post method on POST requests" do
|
|
39
|
+
assert_response_body 'post called', "/restish_dyna?_method=post"
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
context "when knowing about enclosing snips" do
|
|
44
|
+
class ::Encloser < Dynasnip
|
|
45
|
+
def handle(*args)
|
|
46
|
+
"enclosing snip is #{enclosing_snip.name}"
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
setup do
|
|
51
|
+
@app.soup << Encloser.snip_attributes
|
|
52
|
+
create_snip(:name => "test", :content => "{encloser}")
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
should "know about the snip that called this dynasnip" do
|
|
56
|
+
assert_response_body 'enclosing snip is test', "/test"
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
require "test_helper"
|
|
2
|
+
|
|
3
|
+
context "When including snips in other snips" do
|
|
4
|
+
setup do
|
|
5
|
+
create_snip :name => "test", :content => "snip content"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
should "match simple snips" do
|
|
9
|
+
assert_equal "rendering snip content", render("rendering {test}")
|
|
10
|
+
end
|
|
11
|
+
|
|
12
|
+
should "match snips with an argument" do
|
|
13
|
+
assert_equal "rendering snip content", render("rendering {test arg1}")
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
should "match snips with several arguments" do
|
|
17
|
+
assert_equal "rendering snip content", render("rendering {test arg1, arg2}")
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
should "match snips with hyphens" do
|
|
21
|
+
create_snip :name => "test-snip", :content => "snip content"
|
|
22
|
+
assert_equal "rendering snip content", render("rendering {test-snip}")
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
should "match snips with underscores" do
|
|
26
|
+
create_snip :name => "test_snip", :content => "snip content"
|
|
27
|
+
assert_equal "rendering snip content", render("rendering {test_snip}")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
should "match snips with numbers" do
|
|
31
|
+
create_snip :name => "test1", :content => "snip content"
|
|
32
|
+
assert_equal "rendering snip content", render("rendering {test1}")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
should "match snips with ruby 1.9 style hashes" do
|
|
36
|
+
create_snip :name => "test", :content => %{
|
|
37
|
+
class Blah
|
|
38
|
+
def handle(args)
|
|
39
|
+
args.inspect
|
|
40
|
+
end
|
|
41
|
+
self
|
|
42
|
+
end
|
|
43
|
+
}, :render_as => "Ruby"
|
|
44
|
+
assert_equal %{rendering {:x=>"1"}}, render("rendering {test x:1}")
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
should "ignore references that are rubyish" do
|
|
48
|
+
assert_equal "10.times { |x| puts x }", render("10.times { |x| puts x }")
|
|
49
|
+
assert_equal "10.times {|x| puts x }", render("10.times {|x| puts x }")
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def render(content)
|
|
53
|
+
snip = create_snip :name => "test-content", :content => content
|
|
54
|
+
Vanilla::Renderers::Base.new(@app).render(snip)
|
|
55
|
+
end
|
|
56
|
+
end
|