vanilla 1.13.2 → 1.13.3

Sign up to get free protection for your applications and to get access to all the features.
data/README_FOR_APP CHANGED
@@ -7,7 +7,7 @@ What you've got:
7
7
  config.ru - this is the rack configuration, which is used to start
8
8
  the application by your webserver
9
9
  config.yml - the configuration; by default it specifies the directory
10
- which contains the soup, and a cookie secret
10
+ which contains the soup(s)
11
11
  soup/ - the default soup directory, where your snips are stored
12
12
 
13
13
 
@@ -16,32 +16,23 @@ For an overview of vanilla, start your site and look at the tutorial:
16
16
  $ rackup # then open http://localhost:9292/vanilla-rb-tutorial
17
17
 
18
18
 
19
- By default, you won't be able to edit anything on the site, because
20
- you can't log in. If you want to edit snips on the site, you'll need
21
- to create a user.
22
-
23
- $ rake vanilla:add_user
24
-
25
- Your other option is to edit the soup directly; you can edit any file
26
- in the soup directory using your favourite editor, and the changes
27
- will be reflected automatically. The snip files are slightly modified
28
- YAML files. Here's one describing Soup itself, in soup/soup.yml:
19
+ You can edit any file in the soup directory using your favourite editor,
20
+ and the changes will be reflected automatically. The snip files are
21
+ slightly modified YAML files. Here's one describing Soup itself, in
22
+ soup/system/tutorial/soup.snip:
29
23
 
30
24
  Soup is a data store supporting the {link_to snip}-space that {link_to vanilla-rb} expects.
31
25
 
32
26
  It's hosted on github [here][github].
33
27
 
34
28
  [github]: http://github.com/lazyatom/soup
35
- --- # Soup attributes
29
+
36
30
  :name: soup
37
31
  :created_at: 2009-09-27 14:14:16.096231 +01:00
38
32
  :updated_at: 2009-09-27 14:14:16.096232 +01:00
39
33
  :render_as: Markdown
40
34
 
41
- The 'content' of the snip is at the top of the file, followed by
42
-
43
- --- # Soup attributes
44
-
45
- which starts the rest of the snip attributes. Again, see the online
46
- tutorial for information about what each attribute signifies.
35
+ The 'content' of the snip is at the top of the file, followed by the
36
+ rest of the snip attributes. Again, see the online tutorial for information
37
+ about what each attribute signifies.
47
38
 
data/Rakefile CHANGED
@@ -48,7 +48,7 @@ if Object.const_defined?(:Gem)
48
48
  s.add_dependency("treetop", ">= 1.4.1")
49
49
  s.add_dependency("haml")
50
50
 
51
- s.add_development_dependency("kintama") # add any other gems for testing/development
51
+ s.add_development_dependency("kintama", ">= 0.1.5") # add any other gems for testing/development
52
52
  s.add_development_dependency("mocha")
53
53
 
54
54
  # If you want to publish automatically to rubyforge, you'll may need
data/config.ru CHANGED
@@ -5,6 +5,7 @@ $:.unshift File.join(File.dirname(__FILE__), *%w[lib])
5
5
  require 'vanilla'
6
6
  require 'vanilla/static'
7
7
 
8
- app = Vanilla::App.new(ENV['VANILLA_CONFIG'])
8
+ config = YAML.parse_file(ENV['VANILLA_CONFIG'])
9
+ app = Vanilla::App.new(config)
9
10
  use Vanilla::Static, File.join(File.dirname(__FILE__), 'public')
10
11
  run app
data/lib/vanilla.rb CHANGED
@@ -1,7 +1,7 @@
1
1
  require 'vanilla/app'
2
2
 
3
3
  module Vanilla
4
- VERSION = "1.13.2"
4
+ VERSION = "1.13.3"
5
5
  end
6
6
 
7
7
  # Load all the other renderer subclasses
data/lib/vanilla/app.rb CHANGED
@@ -13,8 +13,11 @@ module Vanilla
13
13
 
14
14
  attr_reader :request, :response, :config, :soup
15
15
 
16
- def initialize(config_file=nil)
17
- prepare_configuration(config_file)
16
+ def initialize(config={})
17
+ @config = config
18
+ if @config[:soup].nil? && @config[:soups].nil?
19
+ @config.merge!(:soup => File.expand_path("soup"))
20
+ end
18
21
  @soup = prepare_soup(config)
19
22
  end
20
23
 
@@ -42,9 +45,9 @@ module Vanilla
42
45
  when 'html', nil
43
46
  render(layout_for(snip))
44
47
  when 'raw', 'css', 'js'
45
- Renderers::Raw.new(self).render(snip, part || :content)
48
+ Renderers::Raw.new(self).render(snip, part)
46
49
  when 'text', 'atom', 'xml'
47
- render(snip, part || :content)
50
+ render(snip, part)
48
51
  else
49
52
  raise "Unknown format '#{format}'"
50
53
  end
@@ -78,7 +81,7 @@ module Vanilla
78
81
  elsif snip && snip.extension && !snip.extension.empty?
79
82
  Vanilla::Renderers.const_get(renderer_for_extension(snip.extension))
80
83
  else
81
- Vanilla::Renderers::Base
84
+ default_renderer
82
85
  end
83
86
  end
84
87
 
@@ -86,6 +89,10 @@ module Vanilla
86
89
  soup[config[:default_layout_snip] || 'layout']
87
90
  end
88
91
 
92
+ def default_renderer
93
+ config[:default_renderer] || Vanilla::Renderers::Base
94
+ end
95
+
89
96
  def layout_for(snip)
90
97
  if snip
91
98
  renderer_for(snip).new(self).layout_for(snip)
@@ -94,34 +101,23 @@ module Vanilla
94
101
  end
95
102
  end
96
103
 
97
- # Other things can call this when a snip cannot be loaded.
98
- def render_missing_snip(snip_name)
99
- "[snip '#{snip_name}' cannot be found]"
100
- end
101
-
102
104
  def snip(attributes)
103
105
  @soup << attributes
104
106
  end
105
107
 
106
108
  private
107
109
 
108
- def renderer_for_extension(extension)
109
- mapping = Hash.new("Base")
110
- mapping["markdown"] = "Markdown"
111
- mapping["textile"] = "Textile"
112
- mapping["erb"] = "Erb"
113
- mapping["rb"] = "Ruby"
114
- mapping["haml"] = "Haml"
115
- mapping[extension]
116
- end
110
+ DEFAULT_EXTENSION_RENDERERS = Hash.new("Base").merge({
111
+ "markdown" => "Markdown",
112
+ "textile" => "Textile",
113
+ "erb" => "Erb",
114
+ "rb" => "Ruby",
115
+ "haml" => "Haml"
116
+ })
117
117
 
118
- def prepare_configuration(config_file)
119
- config_file ||= "config.yml"
120
- @config = YAML.load(File.open(config_file)) rescue {}
121
- @config[:filename] = config_file
122
- def @config.save!
123
- File.open(self[:filename], 'w') { |f| f.puts self.to_yaml }
124
- end
118
+ def renderer_for_extension(extension)
119
+ @renderer_mapping ||= DEFAULT_EXTENSION_RENDERERS.merge(@config[:extensions] || {})
120
+ @renderer_mapping[extension]
125
121
  end
126
122
 
127
123
  def prepare_soup(config)
@@ -50,11 +50,10 @@ module Vanilla
50
50
  # Render the snip or snip part with the given args, and the current
51
51
  # context, but with the default renderer for that snip. We dispatch
52
52
  # *back* out to the root Vanilla.render method to do this.
53
- snip = soup[snip_name]
54
- if snip
53
+ if snip = soup[snip_name]
55
54
  app.render(snip, snip_attribute, snip_args, enclosing_snip)
56
55
  else
57
- app.render_missing_snip(snip_name)
56
+ render_missing_snip(snip_name)
58
57
  end
59
58
  else
60
59
  "malformed snip reference: #{$1.inspect}"
@@ -67,6 +66,10 @@ module Vanilla
67
66
  @parser.parse(string)
68
67
  end
69
68
 
69
+ def render_missing_snip(snip_name)
70
+ "[snip '#{snip_name}' cannot be found]"
71
+ end
72
+
70
73
  # Default rendering behaviour. Subclasses shouldn't really need to touch this.
71
74
  def render(snip, part=:content, args=[], enclosing_snip=snip)
72
75
  prepare(snip, part, args, enclosing_snip)
@@ -48,7 +48,7 @@ module Vanilla
48
48
  request.path_info
49
49
  end
50
50
 
51
- URL_ROOT = /\A\/\Z/ # i.e. /
51
+ URL_ROOT = /\A\/?\Z/ # i.e. / or nothing
52
52
  URL_SNIP = /\A\/([\w\-\s]+)(\/|\.(\w+))?\Z/ # i.e. /start, /start.html
53
53
  URL_SNIP_AND_PART = /\A\/([\w\-\s]+)\/([\w\-\s]+)(\/|\.(\w+))?\Z/ # i.e. /blah/part, /blah/part.raw
54
54
 
@@ -0,0 +1,4 @@
1
+
2
+
3
+ :name: blah
4
+ :render_as: Raw
@@ -0,0 +1,4 @@
1
+
2
+
3
+ :extension: erb
4
+ :name: blah
@@ -0,0 +1,4 @@
1
+
2
+
3
+ :extension: haml
4
+ :name: blah
@@ -0,0 +1,4 @@
1
+
2
+
3
+ :extension: markdown
4
+ :name: blah
@@ -0,0 +1,4 @@
1
+
2
+
3
+ :extension: rb
4
+ :name: blah
@@ -0,0 +1,4 @@
1
+
2
+
3
+ :extension: textile
4
+ :name: blah
@@ -0,0 +1,14 @@
1
+ CurrentSnip
2
+
3
+ :usage: |-
4
+ The current_snip dyna normally returns the result of rendering the snip named by the
5
+ 'snip' value in the parameters. This way, it can be used in templates to place the currently
6
+ requested snip, in its rendered form, within the page.
7
+
8
+ It can also be used to determine the name of the current snip in a consistent way:
9
+
10
+ &#123;current_snip name&#125;
11
+
12
+ will output the name of the current snip, or the name of the snip currently being edited.
13
+ :render_as: Ruby
14
+ :name: current_snip
@@ -0,0 +1,4 @@
1
+ {current_snip}
2
+
3
+ :render_as: Base
4
+ :name: layout
@@ -0,0 +1,3 @@
1
+ test
2
+
3
+ :name: test
@@ -0,0 +1,7 @@
1
+ TestDyna
2
+
3
+ :render_as: Ruby
4
+ :created_at: 2011-04-16 21:49:54 +01:00
5
+ :updated_at: 2011-04-16 21:49:54 +01:00
6
+ :test_attribute: altered content
7
+ :name: test_dyna
data/test/test_helper.rb CHANGED
@@ -3,7 +3,7 @@ require 'bundler/setup'
3
3
  $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
4
4
 
5
5
  require "kintama"
6
- require "mocha"
6
+ require "kintama/mocha"
7
7
  require "fileutils"
8
8
  require "rack/mock"
9
9
  require "vanilla"
@@ -11,9 +11,8 @@ require "vanilla"
11
11
  module Vanilla
12
12
  module Test
13
13
  def setup_clean_environment
14
- FileUtils.mkdir_p(File.dirname(config_file_for_tests))
15
- File.open(config_file_for_tests, 'w') { |f| f.write({:soup => soup_path}.to_yaml) }
16
- @app = Vanilla::App.new(config_file_for_tests)
14
+ clean_environment
15
+ @app = Vanilla::App.new(:soup => soup_path)
17
16
 
18
17
  require "vanilla/dynasnips/current_snip"
19
18
  @app.soup << CurrentSnip.snip_attributes
@@ -56,17 +55,13 @@ module Vanilla
56
55
  File.join(File.dirname(__FILE__), "tmp")
57
56
  end
58
57
 
59
- def config_file_for_tests
60
- File.join(test_app_directory, "config.yml")
61
- end
62
-
63
- def config_for_tests(options={})
64
- File.open(config_file_for_tests, 'w') { |f| f.write({:soup => soup_path}.update(options).to_yaml) }
65
- end
66
-
67
58
  def soup_path
68
59
  File.expand_path(File.join(test_app_directory, "soup"))
69
60
  end
61
+
62
+ def clean_environment
63
+ FileUtils.rm_rf(test_app_directory)
64
+ end
70
65
  end
71
66
  end
72
67
 
@@ -76,16 +71,5 @@ Kintama.setup do
76
71
  end
77
72
 
78
73
  Kintama.teardown do
79
- FileUtils.rm_rf(test_app_directory)
80
- end
81
-
82
- Kintama.include Mocha::API
83
- Kintama.teardown do
84
- begin
85
- mocha_verify
86
- rescue Mocha::ExpectationError => e
87
- raise e
88
- ensure
89
- mocha_teardown
90
- end
74
+ clean_environment
91
75
  end
@@ -13,32 +13,22 @@ describe Vanilla::App do
13
13
  end
14
14
 
15
15
  context "when being configured" do
16
- should "load a config file from the current working directory by default" do
17
- File.expects(:open).with("config.yml").returns(StringIO.new({:soup => soup_path}.to_yaml))
18
- Vanilla::App.new
16
+ should "default the root snip to 'start'" do
17
+ create_snip :name => "start", :content => "default"
18
+ assert_response_body "default", "/"
19
19
  end
20
20
 
21
- should "load a config file given" do
22
- File.open("/tmp/vanilla_config.yml", "w") { |f| f.write({:soup => soup_path, :hello => true}.to_yaml) }
23
- app = Vanilla::App.new("/tmp/vanilla_config.yml")
24
- assert app.config[:hello]
25
- end
26
-
27
- should "allow saving of configuration to the same file it was loaded from" do
28
- config_file = "/tmp/vanilla_config.yml"
29
- File.open(config_file, "w") { |f| f.write({:soup => soup_path, :hello => true}.to_yaml) }
30
- app = Vanilla::App.new(config_file)
31
- app.config[:saved] = true
32
- app.config.save!
33
-
34
- config = YAML.load(File.open(config_file))
35
- assert config[:saved]
21
+ should "allow a customised root snip" do
22
+ create_snip :name => "start", :content => "default"
23
+ create_snip :name => "custom", :content => "custom"
24
+ @app = Vanilla::App.new(:soup => soup_path, :root_snip => "custom")
25
+ assert_response_body "custom", "/"
36
26
  end
37
27
  end
38
28
 
39
29
  context "when detecting the snip renderer" do
40
30
  setup do
41
- @app = Vanilla::App.new(config_file_for_tests)
31
+ @app = Vanilla::App.new
42
32
  end
43
33
 
44
34
  should "return the constant refered to in the render_as property of the snip" do
@@ -61,6 +51,12 @@ describe Vanilla::App do
61
51
  end
62
52
  end
63
53
 
54
+ should "respect snip extensions pass in the config" do
55
+ app = Vanilla::App.new(:extensions => {"markdown" => "Bold"})
56
+ snip = create_snip(:name => "blah", :extension => "markdown")
57
+ assert_equal Vanilla::Renderers::Bold, app.renderer_for(snip)
58
+ end
59
+
64
60
  should "return Vanilla::Renderers::Base if no render_as property exists" do
65
61
  snip = create_snip(:name => "blah")
66
62
  assert_equal Vanilla::Renderers::Base, @app.renderer_for(snip)
@@ -94,6 +94,15 @@ context "When presenting" do
94
94
  end
95
95
  end
96
96
 
97
+ context "and a custom default renderer has been provided" do
98
+ should "use that renderer" do
99
+ @app = Vanilla::App.new(:default_renderer => ::Vanilla::Renderers::Bold)
100
+ create_snip :name => "layout", :content => "{current_snip}", :render_as => "Base"
101
+ create_snip :name => "test", :content => "test"
102
+ assert_response_body "<b>test</b>", "/test"
103
+ end
104
+ end
105
+
97
106
  context "and a missing snip is requested" do
98
107
  should "render missing snip content in the main template" do
99
108
  assert_response_body "<tag>Couldn't find snip #{LinkTo.new(@app).handle("missing_snip")}</tag>", "/missing_snip"
@@ -11,17 +11,6 @@ describe Vanilla::Request do
11
11
  should "set format to 'html'" do
12
12
  assert_equal "html", @request.format
13
13
  end
14
-
15
- context "with a start snip configuration set" do
16
- setup do
17
- config_for_tests(:root_snip => "custom")
18
- @app = Vanilla::App.new(config_file_for_tests)
19
- end
20
-
21
- should "use specified snip as default" do
22
- assert_equal "custom", Vanilla::Request.new(mock_env_for_url("/"), @app).snip_name
23
- end
24
- end
25
14
  end
26
15
 
27
16
  context "when requesting urls" do
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vanilla
3
3
  version: !ruby/object:Gem::Version
4
- hash: 39
4
+ hash: 37
5
5
  prerelease:
6
6
  segments:
7
7
  - 1
8
8
  - 13
9
- - 2
10
- version: 1.13.2
9
+ - 3
10
+ version: 1.13.3
11
11
  platform: ruby
12
12
  authors:
13
13
  - James Adam
@@ -15,7 +15,7 @@ autorequire:
15
15
  bindir: bin
16
16
  cert_chain: []
17
17
 
18
- date: 2011-03-01 00:00:00 +00:00
18
+ date: 2011-04-20 00:00:00 +01:00
19
19
  default_executable:
20
20
  dependencies:
21
21
  - !ruby/object:Gem::Dependency
@@ -136,10 +136,12 @@ dependencies:
136
136
  requirements:
137
137
  - - ">="
138
138
  - !ruby/object:Gem::Version
139
- hash: 3
139
+ hash: 17
140
140
  segments:
141
141
  - 0
142
- version: "0"
142
+ - 1
143
+ - 5
144
+ version: 0.1.5
143
145
  type: :development
144
146
  version_requirements: *id008
145
147
  - !ruby/object:Gem::Dependency
@@ -179,6 +181,16 @@ files:
179
181
  - test/ruby_renderer_test.rb
180
182
  - test/snip_reference_parser_test.rb
181
183
  - test/snip_reference_test.rb
184
+ - test/soup/blah.snip
185
+ - test/soup/blah.snip.erb
186
+ - test/soup/blah.snip.haml
187
+ - test/soup/blah.snip.markdown
188
+ - test/soup/blah.snip.rb
189
+ - test/soup/blah.snip.textile
190
+ - test/soup/current_snip.snip
191
+ - test/soup/layout.snip
192
+ - test/soup/test.snip
193
+ - test/soup/test_dyna.snip
182
194
  - test/test_helper.rb
183
195
  - test/vanilla_app_test.rb
184
196
  - test/vanilla_presenting_test.rb