vanilla 1.16.2 → 1.17
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +3 -3
- data/bin/vanilla +13 -7
- data/lib/vanilla.rb +2 -1
- data/lib/vanilla/app.rb +38 -6
- data/lib/vanilla/console.rb +5 -16
- data/lib/vanilla/test_helper.rb +55 -0
- data/pristine_app/application.rb +43 -0
- data/pristine_app/config.ru +3 -23
- data/test/dynasnip_test.rb +7 -7
- data/test/dynasnips/link_to_current_snip_test.rb +1 -1
- data/test/dynasnips/link_to_test.rb +1 -1
- data/test/dynasnips/page_title_test.rb +1 -1
- data/test/renderers/base_renderer_test.rb +1 -1
- data/test/renderers/erb_renderer_test.rb +1 -1
- data/test/renderers/haml_renderer_test.rb +1 -1
- data/test/renderers/markdown_renderer_test.rb +1 -1
- data/test/renderers/ruby_renderer_test.rb +4 -3
- data/test/snip_inclusion_test.rb +1 -1
- data/test/test_helper.rb +16 -59
- data/test/vanilla_app_test.rb +47 -19
- data/test/vanilla_presenting_test.rb +12 -12
- data/test/vanilla_request_test.rb +13 -7
- metadata +64 -63
- data/pristine_app/Gemfile.lock +0 -32
- data/pristine_app/tmp/restart.txt +0 -0
data/Rakefile
CHANGED
@@ -36,10 +36,9 @@ if Object.const_defined?(:Gem)
|
|
36
36
|
s.rdoc_options = %w(--main README)
|
37
37
|
|
38
38
|
# Add any extra files to include in the gem
|
39
|
-
s.files = %w(Rakefile README .gemtest) + Dir.glob("{lib,bin,pristine_app}/**/*")
|
39
|
+
s.files = %w(Rakefile README .gemtest) + Dir.glob("{test,lib,bin,pristine_app}/**/*")
|
40
40
|
s.executables = ['vanilla']
|
41
41
|
s.require_paths = ["lib"]
|
42
|
-
s.test_files = Dir.glob("test/**/*")
|
43
42
|
|
44
43
|
# All the other gems we need.
|
45
44
|
s.add_dependency("rack", ">= 0.9.1")
|
@@ -47,8 +46,9 @@ if Object.const_defined?(:Gem)
|
|
47
46
|
s.add_dependency("ratom", ">= 0.3.5")
|
48
47
|
s.add_dependency("RedCloth", ">= 4.1.1")
|
49
48
|
s.add_dependency("BlueCloth", ">= 1.0.0")
|
50
|
-
s.add_dependency("haml")
|
49
|
+
s.add_dependency("haml", ">=3.1")
|
51
50
|
s.add_dependency("parslet", ">= 1.2.0")
|
51
|
+
s.add_dependency("rack-test", ">=0.5.7")
|
52
52
|
|
53
53
|
s.add_development_dependency("kintama", ">= 0.1.6") # add any other gems for testing/development
|
54
54
|
s.add_development_dependency("mocha")
|
data/bin/vanilla
CHANGED
@@ -14,13 +14,19 @@ end
|
|
14
14
|
|
15
15
|
def upgrade
|
16
16
|
require 'fileutils'
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
17
|
+
soups_directory = File.join(Dir.pwd, "soups")
|
18
|
+
if File.directory(soups_directory)
|
19
|
+
confirm("Upgrade system snips?") do
|
20
|
+
pristine_system = File.expand_path("../../pristine_app/soups/system", __FILE__)
|
21
|
+
copy(pristine_system, system_directory)
|
22
|
+
end
|
23
|
+
confirm("Upgrade tutorial snips?") do
|
24
|
+
pristine_system = File.expand_path("../../pristine_app/soups/tutorial", __FILE__)
|
25
|
+
copy(pristine_system, File.join(Dir.pwd, "soups"))
|
26
|
+
end
|
27
|
+
else
|
28
|
+
puts "Your soups must be in a directory called 'soups' to use this upgrade tool."
|
29
|
+
exit -1
|
24
30
|
end
|
25
31
|
end
|
26
32
|
|
data/lib/vanilla.rb
CHANGED
@@ -1,5 +1,5 @@
|
|
1
1
|
module Vanilla
|
2
|
-
VERSION = "1.
|
2
|
+
VERSION = "1.17"
|
3
3
|
|
4
4
|
autoload :Renderers, "vanilla/renderers"
|
5
5
|
autoload :App, "vanilla/app"
|
@@ -8,6 +8,7 @@ module Vanilla
|
|
8
8
|
autoload :Routes, "vanilla/routes"
|
9
9
|
autoload :Static, "vanilla/static"
|
10
10
|
autoload :SnipReferenceParser, "vanilla/snip_reference_parser"
|
11
|
+
autoload :TestHelper, "vanilla/test_helper"
|
11
12
|
end
|
12
13
|
|
13
14
|
# Load all the base dynasnip classes
|
data/lib/vanilla/app.rb
CHANGED
@@ -1,16 +1,45 @@
|
|
1
1
|
require 'soup'
|
2
|
+
require 'ostruct'
|
2
3
|
|
3
4
|
module Vanilla
|
4
5
|
class App
|
5
6
|
include Vanilla::Routes
|
6
7
|
|
8
|
+
class << self
|
9
|
+
attr_reader :config
|
10
|
+
def configure(&block)
|
11
|
+
reset! unless @config
|
12
|
+
yield @config
|
13
|
+
self
|
14
|
+
end
|
15
|
+
def reset!
|
16
|
+
@config = OpenStruct.new
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
7
20
|
attr_reader :request, :response, :config, :soup
|
8
21
|
|
22
|
+
def class_config
|
23
|
+
if self.class.config
|
24
|
+
{:soup => self.class.config.soup,
|
25
|
+
:soups => self.class.config.soups,
|
26
|
+
:root => self.class.config.root,
|
27
|
+
:root_snip => self.class.config.root_snip,
|
28
|
+
:renderers => self.class.config.renderers,
|
29
|
+
:default_layout_snip => self.class.config.default_layout_snip,
|
30
|
+
:default_renderer => self.class.config.default_renderer}
|
31
|
+
else
|
32
|
+
{}
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
9
36
|
# Create a new Vanilla application
|
10
37
|
# Configuration options:
|
11
38
|
#
|
12
39
|
# :soup - provide the path to the soup data
|
13
40
|
# :soups - provide an array of paths to soup data
|
41
|
+
# :root - the directory that the soup paths are relative to;
|
42
|
+
# defaults to Dir.pwd
|
14
43
|
# :renderers - a hash of names to classes
|
15
44
|
# :default_renderer - the class to use when no renderer is provided;
|
16
45
|
# defaults to 'Vanilla::Renderers::Base'
|
@@ -18,10 +47,11 @@ module Vanilla
|
|
18
47
|
# defaults to 'layout'
|
19
48
|
# :root_snip - the snip to load for the root ('/') url;
|
20
49
|
# defaults to 'start'
|
21
|
-
def initialize(
|
22
|
-
@config =
|
50
|
+
def initialize(additional_configuration={})
|
51
|
+
@config = class_config.merge(additional_configuration)
|
52
|
+
@root_directory = @config[:root] || Dir.pwd
|
23
53
|
if @config[:soup].nil? && @config[:soups].nil?
|
24
|
-
@config
|
54
|
+
@config[:soup] = File.expand_path("soup", @root_directory)
|
25
55
|
end
|
26
56
|
@soup = prepare_soup(config)
|
27
57
|
prepare_renderers(config[:renderers])
|
@@ -110,7 +140,7 @@ module Vanilla
|
|
110
140
|
private
|
111
141
|
|
112
142
|
def prepare_renderers(additional_renderers={})
|
113
|
-
@renderers = Hash.new
|
143
|
+
@renderers = Hash.new { config[:default_renderer] || Vanilla::Renderers::Base }
|
114
144
|
@renderers.merge!({
|
115
145
|
"base" => Vanilla::Renderers::Base,
|
116
146
|
"markdown" => Vanilla::Renderers::Markdown,
|
@@ -145,10 +175,12 @@ module Vanilla
|
|
145
175
|
|
146
176
|
def prepare_soup(config)
|
147
177
|
if config[:soups]
|
148
|
-
backends = [config[:soups]].flatten.map
|
178
|
+
backends = [config[:soups]].flatten.map do |path|
|
179
|
+
::Soup::Backends::FileBackend.new(File.expand_path(path, @root_directory))
|
180
|
+
end
|
149
181
|
::Soup.new(::Soup::Backends::MultiSoup.new(*backends))
|
150
182
|
else
|
151
|
-
::Soup.new(::Soup::Backends::FileBackend.new(config[:soup]))
|
183
|
+
::Soup.new(::Soup::Backends::FileBackend.new(File.expand_path(config[:soup], @root_directory)))
|
152
184
|
end
|
153
185
|
end
|
154
186
|
end
|
data/lib/vanilla/console.rb
CHANGED
@@ -1,23 +1,12 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
class RackShim
|
5
|
-
def run(app)
|
6
|
-
app # return it
|
7
|
-
end
|
8
|
-
def use(*args)
|
9
|
-
# ignore
|
10
|
-
end
|
11
|
-
def get_binding
|
12
|
-
binding
|
13
|
-
end
|
14
|
-
end
|
1
|
+
unless File.exist?("application.rb")
|
2
|
+
puts "Your application must reside in application.rb to use this console"
|
3
|
+
exit -1
|
15
4
|
end
|
16
5
|
|
17
6
|
def app(reload=false)
|
18
7
|
if !@__vanilla_console_app || reload
|
19
|
-
|
20
|
-
@__vanilla_console_app =
|
8
|
+
load "application.rb"
|
9
|
+
@__vanilla_console_app = Application.new
|
21
10
|
end
|
22
11
|
@__vanilla_console_app
|
23
12
|
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require "vanilla"
|
2
|
+
require "rack/test"
|
3
|
+
require "tmpdir"
|
4
|
+
require "fileutils"
|
5
|
+
|
6
|
+
module Vanilla
|
7
|
+
module TestHelper
|
8
|
+
include Rack::Test::Methods
|
9
|
+
|
10
|
+
def app
|
11
|
+
unless @__app
|
12
|
+
Application.configure do |config|
|
13
|
+
# inject a sandbox soup path first.
|
14
|
+
config.soups ||= []
|
15
|
+
config.soups.unshift test_soup_path
|
16
|
+
# Ensure that the root path is set; this helps with
|
17
|
+
# running tests from different directories
|
18
|
+
config.root_path = File.expand_path("../.", __FILE__)
|
19
|
+
end
|
20
|
+
@__app = Application.new
|
21
|
+
end
|
22
|
+
@__app
|
23
|
+
end
|
24
|
+
|
25
|
+
def vanilla_setup
|
26
|
+
FileUtils.mkdir_p(test_soup_path)
|
27
|
+
end
|
28
|
+
|
29
|
+
def assert_response_status(expected, uri)
|
30
|
+
get uri
|
31
|
+
assert_equal expected, last_response.status
|
32
|
+
end
|
33
|
+
|
34
|
+
def assert_response_body(expected, uri)
|
35
|
+
get uri
|
36
|
+
assert_equal expected.strip, last_response.body.strip
|
37
|
+
end
|
38
|
+
|
39
|
+
def set_main_template(template_content)
|
40
|
+
app.soup << {:name => "layout", :content => template_content}
|
41
|
+
end
|
42
|
+
|
43
|
+
def create_snip(params)
|
44
|
+
app.soup << params
|
45
|
+
end
|
46
|
+
|
47
|
+
def test_soup_path
|
48
|
+
File.expand_path(File.join(Dir.tmpdir, "soup"))
|
49
|
+
end
|
50
|
+
|
51
|
+
def vanilla_teardown
|
52
|
+
FileUtils.rm_rf(test_soup_path)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
$:.unshift File.expand_path("../lib", __FILE__)
|
2
|
+
require 'rubygems'
|
3
|
+
require 'bundler/setup'
|
4
|
+
require 'vanilla'
|
5
|
+
|
6
|
+
# This is your application subclass.
|
7
|
+
class Application < Vanilla::App
|
8
|
+
end
|
9
|
+
|
10
|
+
Application.configure do |config|
|
11
|
+
# The root directory of the application; normally the directory this
|
12
|
+
# file is in.
|
13
|
+
config.root_path = File.expand_path(__FILE__)
|
14
|
+
|
15
|
+
# You can partition your snips into subdirectories to keep things tidy.
|
16
|
+
# This doesn't affect their URL structure on the site (everything is
|
17
|
+
# flat).
|
18
|
+
#
|
19
|
+
# You should ensure that the system soup is at the bottom of this list
|
20
|
+
# unless you really know what you are doing.
|
21
|
+
config.soups = [
|
22
|
+
"soups/base",
|
23
|
+
"soups/system"
|
24
|
+
]
|
25
|
+
|
26
|
+
# If you don't want the tutorial on your site, remove this and delete the directory
|
27
|
+
config.soups << "soups/tutorial"
|
28
|
+
|
29
|
+
# This is a dumping ground of ideas at the moment
|
30
|
+
#
|
31
|
+
# config.soups << "soups/extras"
|
32
|
+
|
33
|
+
# The snip to render on requests to "/". This defaults to "start"
|
34
|
+
#
|
35
|
+
# config.root_snip = "some-other-snip"
|
36
|
+
|
37
|
+
# You can register additional renderer classes, to be used with snips
|
38
|
+
# with the given extensions or 'render_as' attributes
|
39
|
+
#
|
40
|
+
# config.renderers = {
|
41
|
+
# :awesome => "My::Custom::RendererClass"
|
42
|
+
# }
|
43
|
+
end
|
data/pristine_app/config.ru
CHANGED
@@ -1,26 +1,6 @@
|
|
1
|
-
|
2
|
-
require 'bundler/setup'
|
3
|
-
$:.unshift File.join(File.dirname(__FILE__), *%w[lib])
|
4
|
-
|
5
|
-
require 'vanilla'
|
6
|
-
|
7
|
-
# You can partition your snips into subdirectories to keep things tidy. This
|
8
|
-
# doesn't affect their URL structure on the site (everything is flat).
|
9
|
-
soups = [
|
10
|
-
"soups/base",
|
11
|
-
"soups/system"
|
12
|
-
]
|
13
|
-
|
14
|
-
# If you don't want the tutorial on your site, remove this and delete the directory
|
15
|
-
soups << "soups/tutorial"
|
16
|
-
|
17
|
-
# This is a dumping ground of ideas at the moment
|
18
|
-
# soups << "soups/extras"
|
19
|
-
|
20
|
-
app = Vanilla::App.new(:soups => soups)
|
21
|
-
|
22
|
-
# If you running your site under a proper webserver, you probably don't need this.
|
1
|
+
# If you're running your site under a proper webserver, you probably don't need this.
|
23
2
|
require 'vanilla/static'
|
24
3
|
use Vanilla::Static, File.join(File.dirname(__FILE__), 'public')
|
25
4
|
|
26
|
-
|
5
|
+
require "application"
|
6
|
+
run Application.new
|
data/test/dynasnip_test.rb
CHANGED
@@ -9,21 +9,21 @@ describe Dynasnip do
|
|
9
9
|
end
|
10
10
|
|
11
11
|
should "make the attribute available as an instance method" do
|
12
|
-
assert_equal "test attribute content", TestDyna.new(
|
12
|
+
assert_equal "test attribute content", TestDyna.new(app).test_attribute
|
13
13
|
end
|
14
14
|
|
15
15
|
should "store the attribute in the soup" do
|
16
|
-
|
17
|
-
assert_equal "test attribute content",
|
16
|
+
app.soup << TestDyna.snip_attributes
|
17
|
+
assert_equal "test attribute content", app.soup['test_dyna'].test_attribute
|
18
18
|
end
|
19
19
|
|
20
20
|
should "allow the attribute to be overriden by the soup contents" do
|
21
|
-
|
22
|
-
snip =
|
21
|
+
app.soup << TestDyna.snip_attributes
|
22
|
+
snip = app.soup['test_dyna']
|
23
23
|
snip.test_attribute = "altered content"
|
24
24
|
snip.save
|
25
25
|
|
26
|
-
assert_equal "altered content", TestDyna.new(
|
26
|
+
assert_equal "altered content", TestDyna.new(app).test_attribute
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
@@ -36,7 +36,7 @@ describe Dynasnip do
|
|
36
36
|
end
|
37
37
|
|
38
38
|
should "show the usage defined in the snip" do
|
39
|
-
assert_equal "This is the usage", ShowUsage.new(
|
39
|
+
assert_equal "This is the usage", ShowUsage.new(app).handle
|
40
40
|
end
|
41
41
|
end
|
42
42
|
end
|
@@ -4,7 +4,7 @@ require "link_to_current_snip"
|
|
4
4
|
|
5
5
|
context "The link_to_current_snip dynasnip" do
|
6
6
|
setup do
|
7
|
-
|
7
|
+
app.soup << LinkToCurrentSnip.snip_attributes
|
8
8
|
create_snip :name => "test", :content => "test {link_to_current_snip}"
|
9
9
|
end
|
10
10
|
|
@@ -31,7 +31,7 @@ describe Vanilla::Renderers::Base do
|
|
31
31
|
should "include other snips using their renderers" do
|
32
32
|
create_snip(:name => "including_snip", :content => "lets include {another_snip}")
|
33
33
|
create_snip(:name => "another_snip", :content => "blah", :render_as => "Bold")
|
34
|
-
|
34
|
+
assert_response_body "lets include <b>blah</b>", "/including_snip"
|
35
35
|
end
|
36
36
|
|
37
37
|
context "when trying to include a missing snip" do
|
@@ -18,7 +18,7 @@ describe Vanilla::Renderers::Erb do
|
|
18
18
|
end
|
19
19
|
|
20
20
|
should "expose the app as an instance variable" do
|
21
|
-
erb_snip(:name => "test", :content => "<%= @app.class.name %>")
|
21
|
+
erb_snip(:name => "test", :content => "<%= @app.class.superclass.name %>")
|
22
22
|
assert_response_body "Vanilla::App", "/test"
|
23
23
|
end
|
24
24
|
end
|
@@ -24,7 +24,7 @@ describe Vanilla::Renderers::Haml do
|
|
24
24
|
end
|
25
25
|
|
26
26
|
should "expose the app as an instance variable" do
|
27
|
-
haml_snip(:name => "test", :content => "= @app.class.name")
|
27
|
+
haml_snip(:name => "test", :content => "= @app.class.superclass.name")
|
28
28
|
assert_response_body "Vanilla::App", "/test"
|
29
29
|
end
|
30
30
|
end
|
@@ -21,7 +21,7 @@ and so lets include {another_snip}
|
|
21
21
|
Markdown
|
22
22
|
)
|
23
23
|
create_snip(:name => "another_snip", :content => "blah", :render_as => "Bold")
|
24
|
-
|
24
|
+
assert_response_body "<h1>markdown</h1>\n\n<p>and so lets include <b>blah</b></p>", "/test"
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require "test_helper"
|
2
|
+
require "vanilla/dynasnip"
|
2
3
|
|
3
4
|
describe Vanilla::Renderers::Ruby do
|
4
5
|
context "when rendering normally" do
|
@@ -9,7 +10,7 @@ describe Vanilla::Renderers::Ruby do
|
|
9
10
|
end
|
10
11
|
|
11
12
|
setup do
|
12
|
-
|
13
|
+
app.soup << TestDyna.snip_attributes
|
13
14
|
end
|
14
15
|
|
15
16
|
should "render the result of the handle method" do
|
@@ -28,7 +29,7 @@ describe Vanilla::Renderers::Ruby do
|
|
28
29
|
end
|
29
30
|
|
30
31
|
setup do
|
31
|
-
|
32
|
+
app.soup << RestishDyna.snip_attributes
|
32
33
|
end
|
33
34
|
|
34
35
|
should "render the result of the get method on GET requests" do
|
@@ -48,7 +49,7 @@ describe Vanilla::Renderers::Ruby do
|
|
48
49
|
end
|
49
50
|
|
50
51
|
setup do
|
51
|
-
|
52
|
+
app.soup << Encloser.snip_attributes
|
52
53
|
create_snip(:name => "test", :content => "{encloser}")
|
53
54
|
end
|
54
55
|
|
data/test/snip_inclusion_test.rb
CHANGED
data/test/test_helper.rb
CHANGED
@@ -1,71 +1,28 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.expand_path("../../lib"), __FILE__)
|
1
2
|
require "kintama"
|
2
3
|
require "kintama/mocha"
|
3
|
-
require "
|
4
|
-
require "rack/mock"
|
5
|
-
require "vanilla"
|
4
|
+
require "vanilla/test_helper"
|
6
5
|
|
7
|
-
|
8
|
-
|
9
|
-
def setup_clean_environment
|
10
|
-
clean_environment
|
11
|
-
@app = Vanilla::App.new(:soup => soup_path)
|
12
|
-
|
13
|
-
require File.expand_path("../../pristine_app/soups/system/current_snip", __FILE__)
|
14
|
-
@app.soup << CurrentSnip.snip_attributes
|
15
|
-
create_snip :name => "layout", :content => "{current_snip}"
|
16
|
-
end
|
17
|
-
|
18
|
-
def response_for(url)
|
19
|
-
@app.call(mock_env_for_url(url))
|
20
|
-
end
|
21
|
-
|
22
|
-
def response_body_for(url)
|
23
|
-
response_for(url)[2].body[0]
|
24
|
-
end
|
25
|
-
|
26
|
-
def response_code_for(url)
|
27
|
-
response_for(url)[0]
|
28
|
-
end
|
29
|
-
|
30
|
-
def assert_response_body(expected, uri)
|
31
|
-
assert_equal expected.strip, response_body_for(uri).strip
|
32
|
-
end
|
33
|
-
|
34
|
-
def set_main_template(template_content)
|
35
|
-
@app.soup << {:name => "layout", :content => template_content}
|
36
|
-
end
|
37
|
-
|
38
|
-
def create_snip(params)
|
39
|
-
@app.soup << params
|
40
|
-
end
|
41
|
-
|
42
|
-
def mock_env_for_url(url)
|
43
|
-
Rack::MockRequest.env_for(url)
|
44
|
-
end
|
45
|
-
|
46
|
-
def mock_request(url)
|
47
|
-
Rack::Request.new(mock_env_for_url(url))
|
48
|
-
end
|
49
|
-
|
50
|
-
def test_app_directory
|
51
|
-
File.join(File.dirname(__FILE__), "tmp")
|
52
|
-
end
|
53
|
-
|
54
|
-
def soup_path
|
55
|
-
File.expand_path(File.join(test_app_directory, "soup"))
|
56
|
-
end
|
6
|
+
class Application < Vanilla::App
|
7
|
+
end
|
57
8
|
|
58
|
-
|
59
|
-
|
60
|
-
|
9
|
+
module TestHelper
|
10
|
+
include Vanilla::TestHelper
|
11
|
+
|
12
|
+
def create_simple_layout
|
13
|
+
require File.expand_path("../../pristine_app/soups/system/current_snip", __FILE__)
|
14
|
+
app.soup << CurrentSnip.snip_attributes
|
15
|
+
create_snip :name => "layout", :content => "{current_snip}"
|
61
16
|
end
|
62
17
|
end
|
63
18
|
|
64
|
-
Kintama.include
|
19
|
+
Kintama.include TestHelper
|
20
|
+
|
65
21
|
Kintama.setup do
|
66
|
-
|
22
|
+
vanilla_setup
|
23
|
+
create_simple_layout
|
67
24
|
end
|
68
25
|
|
69
26
|
Kintama.teardown do
|
70
|
-
|
27
|
+
vanilla_teardown
|
71
28
|
end
|
data/test/vanilla_app_test.rb
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
require "test_helper"
|
2
|
+
require "tmpdir"
|
2
3
|
|
3
4
|
describe Vanilla::App do
|
4
5
|
context "when behaving as a Rack application" do
|
5
|
-
should "return
|
6
|
+
should "return a valid rack response" do
|
6
7
|
create_snip(:name => "test", :content => "content")
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
result[2].each{ |output| assert_equal "content", output }
|
8
|
+
get "/test.text"
|
9
|
+
assert_equal 200, last_response.status
|
10
|
+
assert_kind_of Hash, last_response.headers
|
11
|
+
assert_equal "content", last_response.body
|
12
12
|
end
|
13
13
|
end
|
14
14
|
|
@@ -21,19 +21,43 @@ describe Vanilla::App do
|
|
21
21
|
should "allow a customised root snip" do
|
22
22
|
create_snip :name => "start", :content => "default"
|
23
23
|
create_snip :name => "custom", :content => "custom"
|
24
|
-
|
24
|
+
app.config[:root_snip] = "custom"
|
25
25
|
assert_response_body "custom", "/"
|
26
26
|
end
|
27
|
-
end
|
28
27
|
|
29
|
-
|
30
|
-
|
31
|
-
|
28
|
+
should "allow specification of the root directory to aide loading external soups" do
|
29
|
+
soup_dir = File.join(Dir.tmpdir, "my_soup")
|
30
|
+
FileUtils.mkdir_p(soup_dir)
|
31
|
+
File.open(File.join(soup_dir, "blah.snip"), "w") { |f| f.write "Hello superfriends" }
|
32
|
+
|
33
|
+
class TestApp < Vanilla::App
|
34
|
+
configure do |c|
|
35
|
+
c.root = Dir.tmpdir
|
36
|
+
c.soups = ["my_soup"]
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
app =
|
41
|
+
assert_equal "Hello superfriends", TestApp.new.soup['blah'].content
|
42
|
+
end
|
43
|
+
|
44
|
+
should "allow configuration against the class" do
|
45
|
+
class TestApp < Vanilla::App
|
46
|
+
end
|
47
|
+
|
48
|
+
TestApp.configure do |config|
|
49
|
+
config.soups = ["blah", "monkey"]
|
50
|
+
config.root = Dir.tmpdir
|
51
|
+
end
|
52
|
+
|
53
|
+
assert_equal ["blah", "monkey"], TestApp.new.config[:soups]
|
32
54
|
end
|
55
|
+
end
|
33
56
|
|
57
|
+
context "when detecting the snip renderer" do
|
34
58
|
should "return the constant refered to in the render_as property of the snip" do
|
35
59
|
snip = create_snip(:name => "blah", :render_as => "Raw")
|
36
|
-
assert_equal Vanilla::Renderers::Raw,
|
60
|
+
assert_equal Vanilla::Renderers::Raw, app.renderer_for(snip)
|
37
61
|
end
|
38
62
|
|
39
63
|
context "using the snip extension" do
|
@@ -46,25 +70,27 @@ describe Vanilla::App do
|
|
46
70
|
}.each do |extension, renderer|
|
47
71
|
should "return the renderer #{renderer} when the snip has extension #{extension}" do
|
48
72
|
snip = create_snip(:name => "blah", :extension => extension)
|
49
|
-
assert_equal renderer,
|
73
|
+
assert_equal renderer, app.renderer_for(snip)
|
50
74
|
end
|
51
75
|
end
|
52
76
|
end
|
53
77
|
|
54
78
|
should "respect snip renderers passed in the config" do
|
55
|
-
|
79
|
+
TestApp.configure do |c|
|
80
|
+
c.renderers = {"markdown" => "Vanilla::Renderers::Bold"}
|
81
|
+
end
|
56
82
|
snip = create_snip(:name => "blah", :extension => "markdown")
|
57
|
-
assert_equal Vanilla::Renderers::Bold,
|
83
|
+
assert_equal Vanilla::Renderers::Bold, TestApp.new.renderer_for(snip)
|
58
84
|
end
|
59
85
|
|
60
86
|
should "return Vanilla::Renderers::Base if no render_as property exists" do
|
61
87
|
snip = create_snip(:name => "blah")
|
62
|
-
assert_equal Vanilla::Renderers::Base,
|
88
|
+
assert_equal Vanilla::Renderers::Base, app.renderer_for(snip)
|
63
89
|
end
|
64
90
|
|
65
91
|
should "return Vanilla::Renderers::Base if the render_as property is blank" do
|
66
92
|
snip = create_snip(:name => "blah", :render_as => '')
|
67
|
-
assert_equal Vanilla::Renderers::Base,
|
93
|
+
assert_equal Vanilla::Renderers::Base, app.renderer_for(snip)
|
68
94
|
end
|
69
95
|
|
70
96
|
should "raise an error if the specified renderer doesn't exist" do
|
@@ -75,9 +101,11 @@ describe Vanilla::App do
|
|
75
101
|
should "load constants presented as a string" do
|
76
102
|
class ::MyRenderer
|
77
103
|
end
|
78
|
-
|
104
|
+
TestApp.configure do |c|
|
105
|
+
c.renderers = {"my_renderer" => "MyRenderer"}
|
106
|
+
end
|
79
107
|
snip = create_snip(:name => "blah", :render_as => "my_renderer")
|
80
|
-
assert_equal MyRenderer,
|
108
|
+
assert_equal MyRenderer, TestApp.new.renderer_for(snip)
|
81
109
|
end
|
82
110
|
end
|
83
111
|
end
|
@@ -21,10 +21,10 @@ context "When presenting" do
|
|
21
21
|
end
|
22
22
|
|
23
23
|
should "have a response code of 200" do
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
24
|
+
assert_response_status 200, "/test"
|
25
|
+
assert_response_status 200, "/test.html"
|
26
|
+
assert_response_status 200, "/test/part"
|
27
|
+
assert_response_status 200, "/test/part.html"
|
28
28
|
end
|
29
29
|
|
30
30
|
should "not allow rendering of the layout to produce infinite recursion" do
|
@@ -42,8 +42,8 @@ context "When presenting" do
|
|
42
42
|
end
|
43
43
|
|
44
44
|
should "have a response code of 200" do
|
45
|
-
|
46
|
-
|
45
|
+
assert_response_status 200, "/test.text"
|
46
|
+
assert_response_status 200, "/test/part.text"
|
47
47
|
end
|
48
48
|
end
|
49
49
|
|
@@ -61,8 +61,8 @@ context "When presenting" do
|
|
61
61
|
end
|
62
62
|
|
63
63
|
should "have a response code of 200" do
|
64
|
-
|
65
|
-
|
64
|
+
assert_response_status 200, "/test.raw"
|
65
|
+
assert_response_status 200, "/test/part.raw"
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
@@ -82,7 +82,7 @@ context "When presenting" do
|
|
82
82
|
|
83
83
|
context "a snip using a renderer that specifies a template" do
|
84
84
|
setup do
|
85
|
-
|
85
|
+
app.register_renderer CustomRenderer, "custom"
|
86
86
|
create_snip :name => "custom-layout", :content => "<custom>{current_snip}</custom>"
|
87
87
|
end
|
88
88
|
|
@@ -100,7 +100,7 @@ context "When presenting" do
|
|
100
100
|
|
101
101
|
context "and a custom default renderer has been provided" do
|
102
102
|
should "use that renderer" do
|
103
|
-
|
103
|
+
app.config[:default_renderer] = ::Vanilla::Renderers::Bold
|
104
104
|
create_snip :name => "layout", :content => "{test}", :render_as => "base"
|
105
105
|
create_snip :name => "test", :content => "test"
|
106
106
|
assert_response_body "<b>test</b>", "/test"
|
@@ -113,13 +113,13 @@ context "When presenting" do
|
|
113
113
|
end
|
114
114
|
|
115
115
|
should "have a 404 response code" do
|
116
|
-
|
116
|
+
assert_response_status 404, "/missing_snip"
|
117
117
|
end
|
118
118
|
end
|
119
119
|
|
120
120
|
context "requesting an unknown format" do
|
121
121
|
should "return a 500 status code" do
|
122
|
-
|
122
|
+
assert_response_status 500, "/test.monkey"
|
123
123
|
end
|
124
124
|
end
|
125
125
|
end
|
@@ -2,7 +2,7 @@ require "test_helper"
|
|
2
2
|
|
3
3
|
describe Vanilla::Request do
|
4
4
|
context "when requesting the root" do
|
5
|
-
setup { @request = Vanilla::Request.new(mock_env_for_url("/"),
|
5
|
+
setup { @request = Vanilla::Request.new(mock_env_for_url("/"), app) }
|
6
6
|
|
7
7
|
should "set snip to 'start' by default" do
|
8
8
|
assert_equal "start", @request.snip_name
|
@@ -14,14 +14,14 @@ describe Vanilla::Request do
|
|
14
14
|
end
|
15
15
|
|
16
16
|
context "when requesting urls" do
|
17
|
-
setup { @request = Vanilla::Request.new(mock_env_for_url("/snip"),
|
17
|
+
setup { @request = Vanilla::Request.new(mock_env_for_url("/snip"), app) }
|
18
18
|
|
19
19
|
should "use the first segement as the snip name" do
|
20
20
|
assert_equal "snip", @request.snip_name
|
21
21
|
end
|
22
22
|
|
23
23
|
should "try to load the snip based on the snip name" do
|
24
|
-
|
24
|
+
app.soup.expects(:[]).with('snip').returns(:snip)
|
25
25
|
assert_equal :snip, @request.snip
|
26
26
|
end
|
27
27
|
|
@@ -39,7 +39,7 @@ describe Vanilla::Request do
|
|
39
39
|
end
|
40
40
|
|
41
41
|
context "when requesting a snip part" do
|
42
|
-
setup { @request = Vanilla::Request.new(mock_env_for_url("/snip/part"),
|
42
|
+
setup { @request = Vanilla::Request.new(mock_env_for_url("/snip/part"), app) }
|
43
43
|
|
44
44
|
should "use the first segment as the snip, and the second segment as the part" do
|
45
45
|
assert_equal "snip", @request.snip_name
|
@@ -52,7 +52,7 @@ describe Vanilla::Request do
|
|
52
52
|
end
|
53
53
|
|
54
54
|
context "when requesting a snip with a format" do
|
55
|
-
setup { @request = Vanilla::Request.new(mock_env_for_url("/snip.raw"),
|
55
|
+
setup { @request = Vanilla::Request.new(mock_env_for_url("/snip.raw"), app) }
|
56
56
|
|
57
57
|
should "use the extension as the format" do
|
58
58
|
assert_equal "raw", @request.format
|
@@ -64,7 +64,7 @@ describe Vanilla::Request do
|
|
64
64
|
end
|
65
65
|
|
66
66
|
context "when requesting a snip part with a format" do
|
67
|
-
setup { @request = Vanilla::Request.new(mock_env_for_url("/snip/part.raw"),
|
67
|
+
setup { @request = Vanilla::Request.new(mock_env_for_url("/snip/part.raw"), app) }
|
68
68
|
|
69
69
|
should "use the extension as the format" do
|
70
70
|
assert_equal "raw", @request.format
|
@@ -81,7 +81,13 @@ describe Vanilla::Request do
|
|
81
81
|
|
82
82
|
context "when requested with a _method parameter" do
|
83
83
|
should "return the method using the parameter" do
|
84
|
-
assert_equal 'put', Vanilla::Request.new(mock_env_for_url("/snip?_method=put"),
|
84
|
+
assert_equal 'put', Vanilla::Request.new(mock_env_for_url("/snip?_method=put"), app).method
|
85
85
|
end
|
86
86
|
end
|
87
|
+
|
88
|
+
private
|
89
|
+
|
90
|
+
def mock_env_for_url(url)
|
91
|
+
Rack::MockRequest.env_for(url)
|
92
|
+
end
|
87
93
|
end
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vanilla
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 45
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 1
|
8
|
-
-
|
9
|
-
|
10
|
-
version: 1.16.2
|
8
|
+
- 17
|
9
|
+
version: "1.17"
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- James Adam
|
@@ -15,11 +14,10 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date: 2011-05-
|
17
|
+
date: 2011-05-05 00:00:00 +01:00
|
19
18
|
default_executable:
|
20
19
|
dependencies:
|
21
20
|
- !ruby/object:Gem::Dependency
|
22
|
-
name: rack
|
23
21
|
version_requirements: &id001 !ruby/object:Gem::Requirement
|
24
22
|
none: false
|
25
23
|
requirements:
|
@@ -31,11 +29,11 @@ dependencies:
|
|
31
29
|
- 9
|
32
30
|
- 1
|
33
31
|
version: 0.9.1
|
32
|
+
requirement: *id001
|
34
33
|
prerelease: false
|
34
|
+
name: rack
|
35
35
|
type: :runtime
|
36
|
-
requirement: *id001
|
37
36
|
- !ruby/object:Gem::Dependency
|
38
|
-
name: soup
|
39
37
|
version_requirements: &id002 !ruby/object:Gem::Requirement
|
40
38
|
none: false
|
41
39
|
requirements:
|
@@ -47,11 +45,11 @@ dependencies:
|
|
47
45
|
- 0
|
48
46
|
- 6
|
49
47
|
version: 1.0.6
|
48
|
+
requirement: *id002
|
50
49
|
prerelease: false
|
50
|
+
name: soup
|
51
51
|
type: :runtime
|
52
|
-
requirement: *id002
|
53
52
|
- !ruby/object:Gem::Dependency
|
54
|
-
name: ratom
|
55
53
|
version_requirements: &id003 !ruby/object:Gem::Requirement
|
56
54
|
none: false
|
57
55
|
requirements:
|
@@ -63,11 +61,11 @@ dependencies:
|
|
63
61
|
- 3
|
64
62
|
- 5
|
65
63
|
version: 0.3.5
|
64
|
+
requirement: *id003
|
66
65
|
prerelease: false
|
66
|
+
name: ratom
|
67
67
|
type: :runtime
|
68
|
-
requirement: *id003
|
69
68
|
- !ruby/object:Gem::Dependency
|
70
|
-
name: RedCloth
|
71
69
|
version_requirements: &id004 !ruby/object:Gem::Requirement
|
72
70
|
none: false
|
73
71
|
requirements:
|
@@ -79,11 +77,11 @@ dependencies:
|
|
79
77
|
- 1
|
80
78
|
- 1
|
81
79
|
version: 4.1.1
|
80
|
+
requirement: *id004
|
82
81
|
prerelease: false
|
82
|
+
name: RedCloth
|
83
83
|
type: :runtime
|
84
|
-
requirement: *id004
|
85
84
|
- !ruby/object:Gem::Dependency
|
86
|
-
name: BlueCloth
|
87
85
|
version_requirements: &id005 !ruby/object:Gem::Requirement
|
88
86
|
none: false
|
89
87
|
requirements:
|
@@ -95,25 +93,26 @@ dependencies:
|
|
95
93
|
- 0
|
96
94
|
- 0
|
97
95
|
version: 1.0.0
|
96
|
+
requirement: *id005
|
98
97
|
prerelease: false
|
98
|
+
name: BlueCloth
|
99
99
|
type: :runtime
|
100
|
-
requirement: *id005
|
101
100
|
- !ruby/object:Gem::Dependency
|
102
|
-
name: haml
|
103
101
|
version_requirements: &id006 !ruby/object:Gem::Requirement
|
104
102
|
none: false
|
105
103
|
requirements:
|
106
104
|
- - ">="
|
107
105
|
- !ruby/object:Gem::Version
|
108
|
-
hash:
|
106
|
+
hash: 5
|
109
107
|
segments:
|
110
|
-
-
|
111
|
-
|
108
|
+
- 3
|
109
|
+
- 1
|
110
|
+
version: "3.1"
|
111
|
+
requirement: *id006
|
112
112
|
prerelease: false
|
113
|
+
name: haml
|
113
114
|
type: :runtime
|
114
|
-
requirement: *id006
|
115
115
|
- !ruby/object:Gem::Dependency
|
116
|
-
name: parslet
|
117
116
|
version_requirements: &id007 !ruby/object:Gem::Requirement
|
118
117
|
none: false
|
119
118
|
requirements:
|
@@ -125,12 +124,28 @@ dependencies:
|
|
125
124
|
- 2
|
126
125
|
- 0
|
127
126
|
version: 1.2.0
|
127
|
+
requirement: *id007
|
128
128
|
prerelease: false
|
129
|
+
name: parslet
|
129
130
|
type: :runtime
|
130
|
-
requirement: *id007
|
131
131
|
- !ruby/object:Gem::Dependency
|
132
|
-
name: kintama
|
133
132
|
version_requirements: &id008 !ruby/object:Gem::Requirement
|
133
|
+
none: false
|
134
|
+
requirements:
|
135
|
+
- - ">="
|
136
|
+
- !ruby/object:Gem::Version
|
137
|
+
hash: 5
|
138
|
+
segments:
|
139
|
+
- 0
|
140
|
+
- 5
|
141
|
+
- 7
|
142
|
+
version: 0.5.7
|
143
|
+
requirement: *id008
|
144
|
+
prerelease: false
|
145
|
+
name: rack-test
|
146
|
+
type: :runtime
|
147
|
+
- !ruby/object:Gem::Dependency
|
148
|
+
version_requirements: &id009 !ruby/object:Gem::Requirement
|
134
149
|
none: false
|
135
150
|
requirements:
|
136
151
|
- - ">="
|
@@ -141,12 +156,12 @@ dependencies:
|
|
141
156
|
- 1
|
142
157
|
- 6
|
143
158
|
version: 0.1.6
|
159
|
+
requirement: *id009
|
144
160
|
prerelease: false
|
161
|
+
name: kintama
|
145
162
|
type: :development
|
146
|
-
requirement: *id008
|
147
163
|
- !ruby/object:Gem::Dependency
|
148
|
-
|
149
|
-
version_requirements: &id009 !ruby/object:Gem::Requirement
|
164
|
+
version_requirements: &id010 !ruby/object:Gem::Requirement
|
150
165
|
none: false
|
151
166
|
requirements:
|
152
167
|
- - ">="
|
@@ -155,9 +170,10 @@ dependencies:
|
|
155
170
|
segments:
|
156
171
|
- 0
|
157
172
|
version: "0"
|
173
|
+
requirement: *id010
|
158
174
|
prerelease: false
|
175
|
+
name: mocha
|
159
176
|
type: :development
|
160
|
-
requirement: *id009
|
161
177
|
description:
|
162
178
|
email: james@lazyatom.com.com
|
163
179
|
executables:
|
@@ -170,6 +186,22 @@ files:
|
|
170
186
|
- Rakefile
|
171
187
|
- README
|
172
188
|
- .gemtest
|
189
|
+
- test/dynasnip_test.rb
|
190
|
+
- test/dynasnips/link_to_current_snip_test.rb
|
191
|
+
- test/dynasnips/link_to_test.rb
|
192
|
+
- test/dynasnips/page_title_test.rb
|
193
|
+
- test/renderers/base_renderer_test.rb
|
194
|
+
- test/renderers/erb_renderer_test.rb
|
195
|
+
- test/renderers/haml_renderer_test.rb
|
196
|
+
- test/renderers/markdown_renderer_test.rb
|
197
|
+
- test/renderers/raw_renderer_test.rb
|
198
|
+
- test/renderers/ruby_renderer_test.rb
|
199
|
+
- test/snip_inclusion_test.rb
|
200
|
+
- test/snip_reference_parser_test.rb
|
201
|
+
- test/test_helper.rb
|
202
|
+
- test/vanilla_app_test.rb
|
203
|
+
- test/vanilla_presenting_test.rb
|
204
|
+
- test/vanilla_request_test.rb
|
173
205
|
- lib/vanilla/app.rb
|
174
206
|
- lib/vanilla/console.rb
|
175
207
|
- lib/vanilla/dynasnip.rb
|
@@ -186,11 +218,12 @@ files:
|
|
186
218
|
- lib/vanilla/routes.rb
|
187
219
|
- lib/vanilla/snip_reference_parser.rb
|
188
220
|
- lib/vanilla/static.rb
|
221
|
+
- lib/vanilla/test_helper.rb
|
189
222
|
- lib/vanilla.rb
|
190
223
|
- bin/vanilla
|
224
|
+
- pristine_app/application.rb
|
191
225
|
- pristine_app/config.ru
|
192
226
|
- pristine_app/Gemfile
|
193
|
-
- pristine_app/Gemfile.lock
|
194
227
|
- pristine_app/public/vanilla.css
|
195
228
|
- pristine_app/README
|
196
229
|
- pristine_app/soups/base/layout.snip
|
@@ -223,23 +256,6 @@ files:
|
|
223
256
|
- pristine_app/soups/tutorial/tutorial.snip.markdown
|
224
257
|
- pristine_app/soups/tutorial/vanilla-rb.snip
|
225
258
|
- pristine_app/soups/tutorial/vanilla.snip
|
226
|
-
- pristine_app/tmp/restart.txt
|
227
|
-
- test/dynasnip_test.rb
|
228
|
-
- test/dynasnips/link_to_current_snip_test.rb
|
229
|
-
- test/dynasnips/link_to_test.rb
|
230
|
-
- test/dynasnips/page_title_test.rb
|
231
|
-
- test/renderers/base_renderer_test.rb
|
232
|
-
- test/renderers/erb_renderer_test.rb
|
233
|
-
- test/renderers/haml_renderer_test.rb
|
234
|
-
- test/renderers/markdown_renderer_test.rb
|
235
|
-
- test/renderers/raw_renderer_test.rb
|
236
|
-
- test/renderers/ruby_renderer_test.rb
|
237
|
-
- test/snip_inclusion_test.rb
|
238
|
-
- test/snip_reference_parser_test.rb
|
239
|
-
- test/test_helper.rb
|
240
|
-
- test/vanilla_app_test.rb
|
241
|
-
- test/vanilla_presenting_test.rb
|
242
|
-
- test/vanilla_request_test.rb
|
243
259
|
has_rdoc: true
|
244
260
|
homepage: http://github.com/lazyatom/vanilla-rb
|
245
261
|
licenses: []
|
@@ -271,24 +287,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
271
287
|
requirements: []
|
272
288
|
|
273
289
|
rubyforge_project: vanilla
|
274
|
-
rubygems_version: 1.
|
290
|
+
rubygems_version: 1.4.1
|
275
291
|
signing_key:
|
276
292
|
specification_version: 3
|
277
293
|
summary: A bliki-type web content thing.
|
278
|
-
test_files:
|
279
|
-
|
280
|
-
- test/dynasnips/link_to_current_snip_test.rb
|
281
|
-
- test/dynasnips/link_to_test.rb
|
282
|
-
- test/dynasnips/page_title_test.rb
|
283
|
-
- test/renderers/base_renderer_test.rb
|
284
|
-
- test/renderers/erb_renderer_test.rb
|
285
|
-
- test/renderers/haml_renderer_test.rb
|
286
|
-
- test/renderers/markdown_renderer_test.rb
|
287
|
-
- test/renderers/raw_renderer_test.rb
|
288
|
-
- test/renderers/ruby_renderer_test.rb
|
289
|
-
- test/snip_inclusion_test.rb
|
290
|
-
- test/snip_reference_parser_test.rb
|
291
|
-
- test/test_helper.rb
|
292
|
-
- test/vanilla_app_test.rb
|
293
|
-
- test/vanilla_presenting_test.rb
|
294
|
-
- test/vanilla_request_test.rb
|
294
|
+
test_files: []
|
295
|
+
|
data/pristine_app/Gemfile.lock
DELETED
@@ -1,32 +0,0 @@
|
|
1
|
-
PATH
|
2
|
-
remote: /Users/james/Code/lazyatom/vanilla-rb
|
3
|
-
specs:
|
4
|
-
vanilla (1.16.1)
|
5
|
-
BlueCloth (>= 1.0.0)
|
6
|
-
RedCloth (>= 4.1.1)
|
7
|
-
haml
|
8
|
-
parslet (>= 1.2.0)
|
9
|
-
rack (>= 0.9.1)
|
10
|
-
ratom (>= 0.3.5)
|
11
|
-
soup (>= 1.0.6)
|
12
|
-
|
13
|
-
GEM
|
14
|
-
remote: http://rubygems.org/
|
15
|
-
specs:
|
16
|
-
BlueCloth (1.0.1)
|
17
|
-
RedCloth (4.2.7)
|
18
|
-
blankslate (2.1.2.4)
|
19
|
-
haml (3.1.1)
|
20
|
-
libxml-ruby (2.0.4)
|
21
|
-
parslet (1.2.0)
|
22
|
-
blankslate (~> 2.0)
|
23
|
-
rack (1.2.2)
|
24
|
-
ratom (0.6.8)
|
25
|
-
libxml-ruby (>= 1.1.2)
|
26
|
-
soup (1.0.6)
|
27
|
-
|
28
|
-
PLATFORMS
|
29
|
-
ruby
|
30
|
-
|
31
|
-
DEPENDENCIES
|
32
|
-
vanilla!
|
File without changes
|