lavender 0.0.0

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.
@@ -0,0 +1,2 @@
1
+ lavender.gemspec
2
+ pkg
data/LICENCE ADDED
@@ -0,0 +1,13 @@
1
+ Copyright © 2010, Tom Adams <tom@holizz.com>
2
+
3
+ Permission to use, copy, modify, and/or distribute this software for any
4
+ purpose with or without fee is hereby granted, provided that the above
5
+ copyright notice and this permission notice appear in all copies.
6
+
7
+ THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
8
+ WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
+ MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
10
+ ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12
+ ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13
+ OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
@@ -0,0 +1,20 @@
1
+ = lavender
2
+
3
+ Minimalistic YAML-based CMS
4
+
5
+ == Usage
6
+
7
+ ...
8
+
9
+ == Inspiration
10
+
11
+ - http://blog.peepcode.com/tutorials/2010/about-this-blog
12
+ - http://jekyllrb.com/
13
+
14
+ == Author
15
+
16
+ Tom Adams <tom@holizz.com>
17
+
18
+ == Copying
19
+
20
+ ISC licence (see LICENCE for the full text).
@@ -0,0 +1,19 @@
1
+ begin
2
+ require 'jeweler'
3
+ Jeweler::Tasks.new do |gem|
4
+ gem.name = 'lavender'
5
+ gem.summary = %Q{Minimalistic YAML-based CMS}
6
+ gem.email = 'tom@holizz.com'
7
+ gem.homepage = 'http://github.com/holizz/lavender'
8
+ gem.authors = ['Tom Adams']
9
+ gem.add_dependency 'haml'
10
+ gem.add_development_dependency 'rspec'
11
+ gem.add_development_dependency 'jeweler'
12
+ end
13
+ Jeweler::GemcutterTasks.new
14
+ rescue LoadError
15
+ puts 'Jeweler (or a dependency) not available. Install it with: gem install jeweler'
16
+ end
17
+
18
+ require 'rspec/core/rake_task'
19
+ RSpec::Core::RakeTask.new
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.0
@@ -0,0 +1,4 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'lavender'
4
+ Lavender::Command.run(ARGV)
@@ -0,0 +1,8 @@
1
+ require 'erb'
2
+ require 'haml'
3
+
4
+ require 'lavender/renderer'
5
+ require 'lavender/converter'
6
+ require 'lavender/config'
7
+ require 'lavender/static'
8
+ require 'lavender/command'
@@ -0,0 +1,31 @@
1
+ module Lavender
2
+ class Command
3
+ def self.run args
4
+ case args.first
5
+ when 'help'
6
+ self.help
7
+ when nil
8
+ self.help
9
+
10
+ when 'compile'
11
+ static = Lavender::Static.new true
12
+ static.run
13
+ when 'server'
14
+ raise ArgumentError, "Not yet implemented"
15
+
16
+ else
17
+ raise ArgumentError, "Command not recognised"
18
+ end
19
+ end
20
+
21
+ def self.help
22
+ puts <<END
23
+ Usage: lavender command
24
+
25
+ Commands:
26
+ help This message
27
+ compile Compiles the project in the current working directory
28
+ END
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,75 @@
1
+ module Lavender
2
+ class Config
3
+
4
+ class OpenStruct
5
+ def method_missing(method)
6
+ method = method.to_s
7
+ if @hsh[method].is_a? Hash
8
+ OpenStruct.new(@hsh[method])
9
+ else
10
+ @hsh[method]
11
+ end
12
+ end
13
+ def initialize(hsh)
14
+ @hsh = hsh
15
+ end
16
+ def to_hash
17
+ @hsh
18
+ end
19
+ end
20
+
21
+ def method_missing(method, *args)
22
+ @obj.send(method, *args)
23
+ end
24
+
25
+ LOCATIONS = %w[config.yml]
26
+
27
+ def initialize config = nil
28
+ @config = config
29
+ @config ||= {
30
+ 'defaults' => {'layout' => 'default', 'processor' => 'haml'},
31
+ 'paths' => {
32
+ 'pages' => 'pages',
33
+ 'layouts' => 'layouts',
34
+ 'compiled' => 'compiled',
35
+ 'public' => 'public'
36
+ },
37
+ 'pwd' => Dir.pwd
38
+ }
39
+
40
+ user_config = {}
41
+ LOCATIONS.each do |y|
42
+ if File.exist? y
43
+ user_config = YAML::load_file y
44
+ break
45
+ end
46
+ end
47
+
48
+ @config = recursive_merge user_config, @config
49
+
50
+ @obj = OpenStruct.new @config
51
+ end
52
+
53
+ def recursive_merge primary, secondary
54
+ # merges secondary into primary
55
+
56
+ return primary unless primary.is_a? Hash
57
+
58
+ output = {}
59
+
60
+ primary.each_key do |k|
61
+ if secondary.has_key? k
62
+ output[k] = recursive_merge primary[k], secondary[k]
63
+ else
64
+ output[k] = user_config[k]
65
+ end
66
+ end
67
+
68
+ (secondary.keys-primary.keys).each do |k|
69
+ output[k] = secondary[k]
70
+ end
71
+
72
+ output
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,47 @@
1
+ module Lavender
2
+ class Converter
3
+ def initialize options
4
+ @options = options
5
+ @options[:defaults] ||= {}
6
+ end
7
+
8
+ def render
9
+ yaml = @options[:page]
10
+ conf = nil
11
+ page = nil
12
+
13
+ if yaml.match /\A---\s?\n(.+?\n)---\s?\n(.*)\Z/m
14
+ conf = YAML.load($1)
15
+ page = $2
16
+ else
17
+ conf = {}
18
+ page = yaml
19
+ end
20
+
21
+ pro = if conf.has_key? 'processor'
22
+ conf['processor']
23
+ else
24
+ @options[:defaults][:processor]
25
+ end
26
+ pro = pro.to_sym unless pro.nil?
27
+ r = Renderer.new(pro, page)
28
+ output = r.render(conf)
29
+
30
+ layout = if conf.has_key? 'layout'
31
+ conf['layout']
32
+ else
33
+ @options[:defaults][:layout]
34
+ end
35
+ layout = layout.to_sym unless layout.nil?
36
+ if layout
37
+ hsh = @options[:layouts][layout]
38
+ pro = hsh.keys.first
39
+ content = hsh[pro]
40
+ r = Renderer.new(pro, content)
41
+ output = r.render(conf) { output }
42
+ end
43
+
44
+ output
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,24 @@
1
+ module Lavender
2
+ class Renderer
3
+ def initialize type, input
4
+ @type = type
5
+ @input = input
6
+ end
7
+
8
+ def render vars = {}, &block
9
+ @vars = vars
10
+
11
+ case @type
12
+ when :raw
13
+ @input
14
+ when :erb
15
+ def method_missing name
16
+ @vars[name] || @vars[name.to_s]
17
+ end
18
+ ERB.new(@input).result(binding)
19
+ when :haml
20
+ Haml::Engine.new(@input).to_html(Object.new, @vars, &block)
21
+ end
22
+ end
23
+ end
24
+ end
@@ -0,0 +1,59 @@
1
+ require 'fileutils'
2
+
3
+ module Lavender
4
+ class Static
5
+ def initialize verbose = false
6
+ @config = Lavender::Config.new
7
+ @verbose = verbose
8
+ end
9
+
10
+ def run
11
+ # Public
12
+ Dir["#{path(:public)}/**/*"].each do |file|
13
+ out = file.sub(/^#{path(:public)}/, path(:compiled))
14
+ write_file out, File.read(file)
15
+ end
16
+
17
+ # Layouts
18
+ layouts = {}
19
+ Dir["#{path(:layouts)}/**/*"].each do |file|
20
+ name, ext = file.sub(/^#{path(:layouts)}\//,'').match(/^(.+)\.([^\.]+)$/)[1..-1]
21
+ layouts[name.to_sym] = {ext.to_sym => File.read(file)}
22
+ end
23
+
24
+ # Pages
25
+ Dir["#{path(:pages)}/**/*.yml"].each do |file|
26
+ target = file.sub(/^#{path(:pages)}/, path(:compiled))
27
+ target.sub!(/\.yml$/, '')
28
+
29
+ conv = Lavender::Converter.new(:page => File.read(file), :layouts => layouts, :defaults => defaults)
30
+
31
+ write_file target, conv.render
32
+ end
33
+ end
34
+
35
+ def path path
36
+ File.join(@config.pwd, @config.paths.send(path))
37
+ end
38
+
39
+ def defaults
40
+ @config.defaults.to_hash.reduce({}) do |a,b|
41
+ c = b.last
42
+ c = c.to_sym if c.is_a? String
43
+ a[b.first.to_sym] = c
44
+ a
45
+ end
46
+ end
47
+
48
+ def write_file path, data
49
+ FileUtils.mkdir_p File.dirname(path)
50
+ File.open(path, 'w+') do |f|
51
+ f.write data
52
+ end
53
+ if @verbose
54
+ basepath = path.sub(/^#{@config.pwd}\//,'')
55
+ puts " create: #{basepath}"
56
+ end
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,18 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lavender::Command do
4
+ it "should call Static correctly" do
5
+ m=RSpec::Mocks::Mock.new
6
+ m.stub!(:run)
7
+ Lavender::Static.should_receive(:new).with(true).and_return(m)
8
+ Lavender::Command.run(%w[compile])
9
+ end
10
+
11
+ it "should have a placeholder for Server" do
12
+ lambda { Lavender::Command.run(%w[server]) }.should raise_error
13
+ end
14
+
15
+ it "should bork on unrecognised commands" do
16
+ lambda { Lavender::Command.run(%w[on the ning nang nong]) }.should raise_error
17
+ end
18
+ end
@@ -0,0 +1,26 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lavender::Config do
4
+ before do
5
+ FakeFS.activate!
6
+ stub_files 'config.yml' => <<END
7
+ ---
8
+ defaults:
9
+ layout: main
10
+ END
11
+ end
12
+
13
+ after do
14
+ FakeFS.deactivate!
15
+ end
16
+
17
+ it "should take values from the config file" do
18
+ config = Lavender::Config.new
19
+ config.defaults.layout.should == 'main'
20
+ end
21
+
22
+ it "should have pre-defined default values" do
23
+ config = Lavender::Config.new
24
+ config.defaults.processor.should == 'haml'
25
+ end
26
+ end
@@ -0,0 +1,172 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lavender::Converter do
4
+ it "should render anything that isn't YAML with the default layout/processor" do
5
+ layout = <<END
6
+ <body>
7
+ <%= yield %>
8
+ </body>
9
+ END
10
+
11
+ page = <<END
12
+ %p My paragraph
13
+ END
14
+
15
+ c = Lavender::Converter.new(:page => page, :layouts => {:default => {:erb => layout}}, :defaults => {:layout => :default, :processor => :haml})
16
+ c.render.should == <<END
17
+ <body>
18
+ <p>My paragraph</p>
19
+
20
+ </body>
21
+ END
22
+ end
23
+
24
+ it "should render pages with the given template processor" do
25
+ page = <<END
26
+ ---
27
+ processor: erb
28
+ layout: null
29
+ text: content
30
+ ---
31
+ <p>Document <%= text %>.</p>
32
+ END
33
+
34
+ c = Lavender::Converter.new(:page => page)
35
+
36
+ c.render.should == <<END
37
+ <p>Document content.</p>
38
+ END
39
+ end
40
+
41
+ it "should render pages with a layout" do
42
+ page = <<END
43
+ ---
44
+ processor: haml
45
+ layout: default
46
+ title: your face
47
+ ---
48
+ %p Document content.
49
+ END
50
+ layout = <<END
51
+ %html
52
+ %head
53
+ %title= title
54
+ %body
55
+ = yield
56
+ END
57
+
58
+ c = Lavender::Converter.new(:page => page, :layouts => {:default => {:haml => layout}})
59
+
60
+ c.render.should == <<END
61
+ <html>
62
+ <head>
63
+ <title>your face</title>
64
+ </head>
65
+ <body>
66
+ <p>Document content.</p>
67
+ </body>
68
+ </html>
69
+ END
70
+ end
71
+
72
+ it "should allow mixing templating languages" do
73
+ page = <<END
74
+ ---
75
+ processor: haml
76
+ layout: page
77
+ title: your face
78
+ ---
79
+ %p Document content.
80
+ END
81
+ layout = <<END
82
+ <html>
83
+ <head>
84
+ <title><%= title %></title>
85
+ </head>
86
+ <body>
87
+ <%= yield %>
88
+ </body>
89
+ </html>
90
+ END
91
+
92
+ c = Lavender::Converter.new(:page => page, :layouts => {:page => {:erb => layout}})
93
+
94
+ c.render.should == <<END
95
+ <html>
96
+ <head>
97
+ <title>your face</title>
98
+ </head>
99
+ <body>
100
+ <p>Document content.</p>
101
+
102
+ </body>
103
+ </html>
104
+ END
105
+ end
106
+
107
+ it "should use a default processor and layout" do
108
+ page = <<END
109
+ ---
110
+ title: your face
111
+ ---
112
+ %p Document content.
113
+ END
114
+ layout = <<END
115
+ <html>
116
+ <head>
117
+ <title><%= title %></title>
118
+ </head>
119
+ <body>
120
+ <%= yield %>
121
+ </body>
122
+ </html>
123
+ END
124
+
125
+ c = Lavender::Converter.new(:page => page, :layouts => {:default => {:erb => layout}}, :defaults => {:layout => :default, :processor => :haml})
126
+
127
+ c.render.should == <<END
128
+ <html>
129
+ <head>
130
+ <title>your face</title>
131
+ </head>
132
+ <body>
133
+ <p>Document content.</p>
134
+
135
+ </body>
136
+ </html>
137
+ END
138
+ end
139
+
140
+ it "should not try to parse HAML as YAML" do
141
+ page = <<END
142
+ ---
143
+ layout: null
144
+ ---
145
+ %p
146
+ %img{:src => "hamsterdance.gif"}
147
+ END
148
+
149
+ c = Lavender::Converter.new(:page => page, :defaults => {:processor => :haml})
150
+
151
+ c.render.should == <<END
152
+ <p>
153
+ <img src='hamsterdance.gif' />
154
+ </p>
155
+ END
156
+ end
157
+
158
+ it "should not try to parse HAML as YAML (no preamble)" do
159
+ page = <<END
160
+ %p
161
+ %img{:src => "hamsterdance.gif"}
162
+ END
163
+
164
+ c = Lavender::Converter.new(:page => page, :defaults => {:processor => :haml})
165
+
166
+ c.render.should == <<END
167
+ <p>
168
+ <img src='hamsterdance.gif' />
169
+ </p>
170
+ END
171
+ end
172
+ end
@@ -0,0 +1,45 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lavender::Renderer do
4
+ it "should render raw stuff as-is" do
5
+ page = '<p>My paragraph</p>'
6
+ r = Lavender::Renderer.new(:raw, page)
7
+ r.render.should == page
8
+ end
9
+
10
+ it "should render ERB" do
11
+ page = '<p>Document <%= "content" %>.</p>'
12
+ r = Lavender::Renderer.new(:erb, page)
13
+ r.render.should == '<p>Document content.</p>'
14
+ end
15
+
16
+ it "should render HAML" do
17
+ page = '%p Document content.'
18
+ r = Lavender::Renderer.new(:haml, page)
19
+ r.render.should == "<p>Document content.</p>\n"
20
+ end
21
+
22
+ it "should set variables" do
23
+ # ERB
24
+ page = '<p>Document <%= text %>.</p>'
25
+ r = Lavender::Renderer.new(:erb, page)
26
+ r.render({:text => 'content'}).should == '<p>Document content.</p>'
27
+
28
+ # HAML
29
+ page = '%p= "Document #{text}."'
30
+ r = Lavender::Renderer.new(:haml, page)
31
+ r.render({:text => 'content'}).should == "<p>Document content.</p>\n"
32
+ end
33
+
34
+ it "should yield" do
35
+ # ERB
36
+ page = '<p>Document <%= yield %>.</p>'
37
+ r = Lavender::Renderer.new(:erb, page)
38
+ r.render{ 'content' }.should == '<p>Document content.</p>'
39
+
40
+ # HAML
41
+ page = '%p= "Document #{yield}."'
42
+ r = Lavender::Renderer.new(:haml, page) { 'content' }
43
+ r.render{ 'content' }.should == "<p>Document content.</p>\n"
44
+ end
45
+ end
@@ -0,0 +1,4 @@
1
+ require 'lavender'
2
+ require 'fakefs/safe'
3
+
4
+ Dir[File.join(File.dirname(__FILE__),"support/**/*.rb")].each {|f| require f}
@@ -0,0 +1,100 @@
1
+ require 'spec_helper'
2
+
3
+ describe Lavender::Static do
4
+ before do
5
+ FakeFS.activate!
6
+ end
7
+
8
+ after do
9
+ FakeFS.deactivate!
10
+ end
11
+
12
+ it "should compile raw files" do
13
+ stub_files_and_run 'pages/index.html.yml' => <<END
14
+ ---
15
+ layout: null
16
+ processor: raw
17
+ ---
18
+ <audio src="girlfriendboy.wav"></audio>
19
+ END
20
+
21
+ File.should exist 'compiled/index.html'
22
+ File.read('compiled/index.html').should == <<END
23
+ <audio src="girlfriendboy.wav"></audio>
24
+ END
25
+ end
26
+
27
+ it "should ignore non-.yml files" do
28
+ stub_files_and_run 'pages/igonreme.txt' => <<END
29
+ Ignore this!!!
30
+ END
31
+ File.should_not exist 'compiled/ignoreme.txt'
32
+ File.should_not exist 'compiled/ignoreme'
33
+ end
34
+
35
+ it "should handle layouts and processing languages" do
36
+ stub_files_and_run(
37
+ 'pages/hamster.html.yml' => <<END,
38
+ %p Text
39
+ END
40
+ 'layouts/main.erb' => <<END)
41
+ <body>
42
+ <%= yield %>
43
+ </body>
44
+ END
45
+ File.should exist 'compiled/hamster.html'
46
+ File.read('compiled/hamster.html').should == <<END
47
+ <body>
48
+ <p>Text</p>
49
+
50
+ </body>
51
+ END
52
+ end
53
+
54
+ it "should handle layouts in subdirectories" do
55
+ stub_files_and_run(
56
+ 'pages/refectory.html.yml' => <<END,
57
+ ---
58
+ layout: clarissa/explains
59
+ processor: raw
60
+ ---
61
+ Hello there
62
+ END
63
+ 'layouts/clarissa/explains.erb' => <<END)
64
+ <noscript>
65
+ <%= yield %>
66
+ </noscript>
67
+ END
68
+ File.should exist 'compiled/refectory.html'
69
+ File.read('compiled/refectory.html').should == <<END
70
+ <noscript>
71
+ Hello there
72
+
73
+ </noscript>
74
+ END
75
+ end
76
+
77
+ it "should create directories" do
78
+ stub_files_and_run 'pages/s/ash.html.yml' => <<END
79
+ ---
80
+ layout: null
81
+ processor: raw
82
+ ---
83
+ Hello there
84
+ END
85
+ File.should exist 'compiled/s/ash.html'
86
+ File.read('compiled/s/ash.html').should == <<END
87
+ Hello there
88
+ END
89
+ end
90
+
91
+ it "should copy over public" do
92
+ stub_files_and_run 'public/t.txt' => <<END
93
+ Some plain text
94
+ END
95
+ File.should exist 'compiled/t.txt'
96
+ File.read('compiled/t.txt').should == <<END
97
+ Some plain text
98
+ END
99
+ end
100
+ end
@@ -0,0 +1,15 @@
1
+ def stub_files files
2
+ files.each_pair do |name,content|
3
+ dir = File.dirname(name)
4
+ FileUtils.mkdir_p dir unless File.directory? dir
5
+ File.open(name,'w+') do |f|
6
+ f.write content
7
+ end
8
+ end
9
+ end
10
+
11
+ def stub_files_and_run files
12
+ stub_files files
13
+ c = Lavender::Static.new
14
+ c.run
15
+ end
metadata ADDED
@@ -0,0 +1,126 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: lavender
3
+ version: !ruby/object:Gem::Version
4
+ prerelease: false
5
+ segments:
6
+ - 0
7
+ - 0
8
+ - 0
9
+ version: 0.0.0
10
+ platform: ruby
11
+ authors:
12
+ - Tom Adams
13
+ autorequire:
14
+ bindir: bin
15
+ cert_chain: []
16
+
17
+ date: 2010-10-16 00:00:00 -04:00
18
+ default_executable: lavender
19
+ dependencies:
20
+ - !ruby/object:Gem::Dependency
21
+ name: haml
22
+ prerelease: false
23
+ requirement: &id001 !ruby/object:Gem::Requirement
24
+ none: false
25
+ requirements:
26
+ - - ">="
27
+ - !ruby/object:Gem::Version
28
+ segments:
29
+ - 0
30
+ version: "0"
31
+ type: :runtime
32
+ version_requirements: *id001
33
+ - !ruby/object:Gem::Dependency
34
+ name: rspec
35
+ prerelease: false
36
+ requirement: &id002 !ruby/object:Gem::Requirement
37
+ none: false
38
+ requirements:
39
+ - - ">="
40
+ - !ruby/object:Gem::Version
41
+ segments:
42
+ - 0
43
+ version: "0"
44
+ type: :development
45
+ version_requirements: *id002
46
+ - !ruby/object:Gem::Dependency
47
+ name: jeweler
48
+ prerelease: false
49
+ requirement: &id003 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ segments:
55
+ - 0
56
+ version: "0"
57
+ type: :development
58
+ version_requirements: *id003
59
+ description:
60
+ email: tom@holizz.com
61
+ executables:
62
+ - lavender
63
+ extensions: []
64
+
65
+ extra_rdoc_files:
66
+ - README.rdoc
67
+ files:
68
+ - .gitignore
69
+ - LICENCE
70
+ - README.rdoc
71
+ - Rakefile
72
+ - VERSION
73
+ - bin/lavender
74
+ - lib/lavender.rb
75
+ - lib/lavender/command.rb
76
+ - lib/lavender/config.rb
77
+ - lib/lavender/converter.rb
78
+ - lib/lavender/renderer.rb
79
+ - lib/lavender/static.rb
80
+ - spec/command_spec.rb
81
+ - spec/config_spec.rb
82
+ - spec/converter_spec.rb
83
+ - spec/renderer_spec.rb
84
+ - spec/spec_helper.rb
85
+ - spec/static_spec.rb
86
+ - spec/support/stub_files.rb
87
+ has_rdoc: true
88
+ homepage: http://github.com/holizz/lavender
89
+ licenses: []
90
+
91
+ post_install_message:
92
+ rdoc_options:
93
+ - --charset=UTF-8
94
+ require_paths:
95
+ - lib
96
+ required_ruby_version: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ segments:
102
+ - 0
103
+ version: "0"
104
+ required_rubygems_version: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ segments:
110
+ - 0
111
+ version: "0"
112
+ requirements: []
113
+
114
+ rubyforge_project:
115
+ rubygems_version: 1.3.7
116
+ signing_key:
117
+ specification_version: 3
118
+ summary: Minimalistic YAML-based CMS
119
+ test_files:
120
+ - spec/converter_spec.rb
121
+ - spec/command_spec.rb
122
+ - spec/static_spec.rb
123
+ - spec/renderer_spec.rb
124
+ - spec/support/stub_files.rb
125
+ - spec/config_spec.rb
126
+ - spec/spec_helper.rb