chisel 0.0.1

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/bin/chisel ADDED
@@ -0,0 +1,45 @@
1
+ #! /usr/bin/env ruby
2
+
3
+ require 'chisel/wrapper'
4
+ require 'optparse'
5
+
6
+ module Chisel
7
+ if ARGV.count == 0
8
+ w = Wrapper.new('.')
9
+ w.run
10
+ else
11
+
12
+ case ARGV[0].downcase
13
+
14
+ when 'new'
15
+ # TODO: Add checking for existing site, with option to "force" creation
16
+
17
+ if ARGV.length == 1 then
18
+ puts 'Creating new Chisel site in the current directory...'
19
+ SiteDirectory.create('.')
20
+ puts 'Done. Run \'chisel\' to create your site.'
21
+ else
22
+ dir = ARGV[1]
23
+ puts "Creating new Chisel site in directory '#{dir}'..."
24
+ SiteDirectory.create(dir)
25
+ puts "Done. Go into \'#{dir}\' and run \'chisel\' to create your site."
26
+ end
27
+
28
+ when 'resource'
29
+
30
+ if ARGV.length == 1 then
31
+ # TODO: Something
32
+ else
33
+ site_dir = SiteDirectory.new('.')
34
+ case ARGV[1].downcase
35
+ when 'new'
36
+ site_dir.create_resource(ARGV[2])
37
+ end
38
+ end
39
+
40
+ when 'help'
41
+
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,17 @@
1
+ ###############################################################################
2
+ # Chisel site configuration file
3
+ #
4
+ # For more information on the format of this configuration file:
5
+ #
6
+ # http://www.yaml.org/
7
+ #
8
+ # YAML does not use tabs for indentation! Instead, use two spaces per
9
+ # indentation level.
10
+ ###############################################################################
11
+
12
+ # The output directory is the root directory where the site will be generated.
13
+ # This directory will be completely replaced every time the generator is run.
14
+ output_dir: _output
15
+
16
+ # Any further configuration options specified will be available to views in the
17
+ # variable @config.
@@ -0,0 +1,18 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <title><%= title %></title>
5
+
6
+ <!--
7
+ -- Include references to stylesheets and scripts here, using the path_to() function
8
+ -- to get relative paths to the files. The paths are relative to the site root.
9
+ -->
10
+
11
+ </head>
12
+ <body>
13
+
14
+ <!-- Wrap your style around the content variable -->
15
+ <%= content %>
16
+
17
+ </body>
18
+ </html>
@@ -0,0 +1,8 @@
1
+ ---
2
+ layout: main
3
+ title: New Chisel Site
4
+ ---
5
+
6
+ <h1><%= title %></h1>
7
+
8
+ Index content goes here!
@@ -0,0 +1,76 @@
1
+ module Chisel
2
+ class Resource
3
+
4
+ @@cache = {}
5
+
6
+ def id
7
+ raise "You must implement #{self.class.name}.id"
8
+ end
9
+
10
+ def self.all
11
+ raise "You must implement #{self.class.name}.all"
12
+ end
13
+
14
+ def resource_type
15
+ self.class.name.underscore
16
+ end
17
+
18
+ def inspect
19
+ File.join(*self.id)
20
+ end
21
+
22
+ def cache(*keys)
23
+ @cache ||= {}
24
+ cached = true
25
+ keys.each { |key| cached &= @cache.key?(key) }
26
+ return keys.map { |key| @cache[key] } if cached
27
+ if keys.size == 1
28
+ results = yield
29
+ @cache[keys[0]] == results
30
+ else
31
+ results = [*yield]
32
+ keys.each_index { |i| @cache[keys[i]] = results[i] }
33
+ end
34
+ results
35
+ end
36
+
37
+ def self.class_cache(*keys)
38
+ cached = true
39
+ keys.each { |key| cached &= @@cache.key?(key) }
40
+ return keys.map { |key| @@cache[key] } if cached
41
+ if keys.size == 1
42
+ results = yield
43
+ @@cache[keys[0]] == results
44
+ else
45
+ results = [*yield]
46
+ keys.each_index { |i| @@cache[keys[i]] = results[i] }
47
+ end
48
+ results
49
+ end
50
+
51
+ def self.find_in(resources, parameters={})
52
+ return resources if parameters == {}
53
+ results = []
54
+
55
+ resources.each do |resource|
56
+ matches = true
57
+ parameters.each do |param, value|
58
+ param = param.to_sym
59
+ if resource.respond_to?(param)
60
+ param_value = resource.public_send(param)
61
+ if param_value != value
62
+ matches = false
63
+ break
64
+ end
65
+ end
66
+ end
67
+ results << resource if matches
68
+ end
69
+ results
70
+ end
71
+
72
+ def self.find(parameters={})
73
+ self.find_in(self.all, parameters)
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,32 @@
1
+ class Array
2
+ def sort_by(method_name, ascending=true)
3
+ method_name = method_name.to_sym
4
+ self.sort do |left, right|
5
+ if left.respond_to?(method_name) and right.respond_to?(method_name)
6
+ if ascending
7
+ left.public_send(method_name) <=> right.public_send(method_name)
8
+ else
9
+ right.public_send(method_name) <=> left.public_send(method_name)
10
+ end
11
+ else
12
+ raise "Could not sort items #{left} and #{right}. They do not both respond to method '#{method_name.to_s}'"
13
+ end
14
+ end
15
+ end
16
+
17
+ def unique(method_name)
18
+ method_name = method_name.to_sym
19
+ values = []
20
+
21
+ self.each do |item|
22
+ if item.respond_to?(method_name)
23
+ value = item.send(method_name)
24
+ values << value unless values.index(value)
25
+ else
26
+ raise "Could not pick out unique items: #{item} does not respond to method '#{method_name}'"
27
+ end
28
+ end
29
+
30
+ values
31
+ end
32
+ end
@@ -0,0 +1,20 @@
1
+ class Hash
2
+
3
+ def symbolize_keys
4
+ self.inject({}) do |memo,(k,v)|
5
+ if v.is_a?(Hash)
6
+ memo[k.to_sym] = v.symbolize_keys
7
+ else
8
+ memo[k.to_sym] = v
9
+ end
10
+ memo
11
+ end
12
+ end
13
+
14
+ def to_binding(object = Object.new)
15
+ object.instance_eval("def binding_for(#{keys.join(",")}) binding end")
16
+ # object.instance_eval('def method_missing(method_name); nil; end')
17
+ object.binding_for(*values)
18
+ end
19
+
20
+ end
@@ -0,0 +1,49 @@
1
+ class String
2
+
3
+ def underscored?
4
+ self[0].downcase == self[0]
5
+ end
6
+
7
+ def camelized?
8
+ self[0].upcase == self[0]
9
+ end
10
+
11
+ # Converts 'Foo::HerpDerp' to 'foo/herp_derp'
12
+ def underscore
13
+ tokens = self.split('::')
14
+ if tokens.count > 1
15
+ return (tokens.map { |token| token.underscore }).join('/')
16
+ end
17
+
18
+ result = ''
19
+ for i in (0..(self.length - 1))
20
+ result << '_' if self[i] == self[i].upcase and i != 0
21
+ result << self[i].downcase
22
+ end
23
+ result
24
+ end
25
+
26
+ # Converts 'foo/herp_derp' to 'Foo::HerpDerp'
27
+ def camelize
28
+ tokens = self.split('/')
29
+ if tokens.count > 1
30
+ return (tokens.map { |token| token.camelize }).join('::')
31
+ end
32
+
33
+ result = ''
34
+ capitalize = true
35
+
36
+ for i in (0..(self.length - 1))
37
+ if self[i] == '_'
38
+ capitalize = true
39
+ elsif capitalize
40
+ capitalize = false
41
+ result << self[i].upcase
42
+ else
43
+ result << self[i]
44
+ end
45
+ end
46
+ result
47
+ end
48
+
49
+ end
@@ -0,0 +1,21 @@
1
+ module YAML
2
+ module Syck
3
+ def YAML.remove_header(string)
4
+ matches = string.match(/---\r*\n(.*)\n---\r*\n(.*)/m)
5
+ return string unless matches and matches.size > 2
6
+ matches[2]
7
+ end
8
+
9
+ def YAML.header_string(string)
10
+ matches = string.match(/---\r*\n(.*)\r*\n---/m)
11
+ return '' unless matches and matches.size > 1
12
+ matches[1]
13
+ end
14
+
15
+ def YAML.load_header(string)
16
+ header_string = YAML.header_string(string)
17
+ return {} if header_string == ''
18
+ YAML.load(header_string)
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,120 @@
1
+ require 'fileutils'
2
+ require 'pathname'
3
+ require 'yaml'
4
+
5
+ module Chisel
6
+ class SiteDirectory < Pathname
7
+ attr_accessor :config
8
+
9
+ @config = {}
10
+
11
+ def initialize(site_dir)
12
+ super
13
+ config_path = self.join('_config.yml')
14
+ if config_path.exist?
15
+ @config = YAML::load_file(config_path) || {}
16
+ end
17
+ end
18
+
19
+ def output_dir
20
+ if @config['output_dir']
21
+ dir = Pathname.new(@config['output_dir']).expand_path(self)
22
+ if dir.absolute?
23
+ return dir
24
+ else
25
+ return self.join(dir)
26
+ end
27
+ else
28
+ return self.join('_output')
29
+ end
30
+ end
31
+
32
+ def resource_dir
33
+ self.join('_resources')
34
+ end
35
+
36
+ def view_dir
37
+ self.join('_views')
38
+ end
39
+
40
+ def layout_dir
41
+ self.view_dir.join('_layout')
42
+ end
43
+
44
+ def clear_output_dir
45
+ FileUtils.rm_r(output_dir) if File.exists?(output_dir)
46
+ FileUtils.mkdir(output_dir)
47
+ end
48
+
49
+ def require_resources
50
+ path = self.resource_dir.join("*.rb").expand_path
51
+ Dir[path].each do |resource_filename|
52
+ require resource_filename
53
+ end
54
+ end
55
+
56
+ def resource_type_view_path(resource_type, view)
57
+ self.view_dir.join(resource_type.to_s, "#{view_with_extension(view)}.erb")
58
+ end
59
+
60
+ def resource_view_output_path(resource, view)
61
+ self.output_dir.join(*resource.id, view_with_extension(view))
62
+ end
63
+
64
+ def page_output_path(page)
65
+ page = view_with_extension(page)
66
+ self.output_dir.join(page)
67
+ end
68
+
69
+ def layout_view_path(layout_name)
70
+ self.layout_dir.join("#{view_with_extension(layout_name).to_s}.erb")
71
+ end
72
+
73
+ def view_path(view)
74
+ self.view_dir.join("#{view_with_extension(view)}.erb")
75
+ end
76
+
77
+ def view_with_extension(view)
78
+ view = "#{view}index" if view[-1] == '/'
79
+ return "#{view}.html" if File.basename(view).split('.').count < 2
80
+ view
81
+ end
82
+
83
+ def self.create(dest)
84
+ dir = Pathname.new(__FILE__).dirname
85
+ src = dir.join('new_site')
86
+ dest = Pathname.new(dest)
87
+
88
+ FileUtils.cp_r(src.to_s + '/.', dest)
89
+
90
+ dest.join('_resources').mkpath
91
+ dest.join('_views', '_resource').mkpath
92
+ end
93
+
94
+ def create_resource(name)
95
+ name = name.underscore if name.camelized?
96
+
97
+ # Create resource.rb file
98
+
99
+ resource_template_filename = Pathname.new(__FILE__).dirname.join('templates', 'resource.rb')
100
+ resource_template = File.read(resource_template_filename)
101
+ resource_template.gsub!('{NAME}', name.camelize)
102
+
103
+ resource_filename = self.join('_resources', "#{name}.rb")
104
+ File.open(resource_filename, 'w') { |f| f.write(resource_template) }
105
+
106
+ # Create resource index.html file
107
+
108
+ self.join('_views', name).mkpath
109
+
110
+ index_template_filename = Pathname.new(__FILE__).dirname.join('templates', 'resource_index.html.erb')
111
+ index_template = File.read(index_template_filename)
112
+ index_template.gsub!('{NAME}', name.camelize)
113
+
114
+ index_filename = self.join('_views', name, 'index.html.erb')
115
+ File.open(index_filename, 'w') { |f| f.write(index_template) }
116
+
117
+ end
118
+
119
+ end
120
+ end
@@ -0,0 +1,15 @@
1
+ class {NAME} < Chisel::Resource
2
+
3
+ def initialize
4
+ # TODO: Implement a custom {NAME} resource class constructor
5
+ end
6
+
7
+ def self.all
8
+ raise 'You must implement {NAME}.all to return an array of all {NAME} resources'
9
+ end
10
+
11
+ def id
12
+ raise 'You must implement {NAME}.id to return an array that uniquely identifies this resource'
13
+ end
14
+
15
+ end
@@ -0,0 +1 @@
1
+ This is a placeholder index page for {NAME} resource with ID <%= resource.id.to_s %>
@@ -0,0 +1,209 @@
1
+ require 'yaml'
2
+ require 'pathname'
3
+ require 'erb'
4
+
5
+ module Chisel
6
+ class View
7
+
8
+ MarkupExtensions = ['erb', 'md', 'textile']
9
+
10
+ attr_accessor :type, :path, :view, :site_dir, :resource, :raw_content
11
+ @@cache = []
12
+ @@output_paths = []
13
+
14
+ def self.fetch(options={})
15
+ @@cache.each do |view|
16
+ return view if view.matches(options)
17
+ end
18
+
19
+ return View.new(options)
20
+ end
21
+
22
+ def initialize(options={})
23
+
24
+ # Do not call the initializer directly; use View.fetch(options)
25
+ # to take advantage of view caching
26
+
27
+ @path = Pathname.new(options[:path]) if options[:path]
28
+ @site_dir = SiteDirectory.new(options[:site_dir]) if options[:site_dir]
29
+
30
+ if options[:resource]
31
+ @type = :resource
32
+ @resource = options[:resource]
33
+ @view = options[:view]
34
+ @path = @site_dir.resource_type_view_path(@resource, @view)
35
+ elsif options[:layout]
36
+ @type = :layout
37
+ @view = options[:layout]
38
+ @path = @site_dir.layout_view_path(@view)
39
+ elsif options[:view]
40
+ @view = options[:view]
41
+ @path = @site_dir.view_path(@view)
42
+ end
43
+
44
+ raise 'Cannot initialize view without a path' unless @path
45
+
46
+ @raw_content = File.read(@path)
47
+ @@cache << self
48
+
49
+ end
50
+
51
+ def matches(options = {})
52
+
53
+ return true if options.key?(:resource) and @type == :resource and @view == options[:view] and @resource == options[:resource]
54
+ return true if options.key?(:layout) and @type == :layout and @view == options[:layout]
55
+ return true if @path == options[:path]
56
+
57
+ return false
58
+
59
+ end
60
+
61
+ def run(options = {})
62
+ if options[:output_path] then
63
+ output_path = options[:output_path]
64
+ else
65
+ view_relative_dir = @path.relative_path_from(@site_dir).dirname
66
+ file_output_dir = @site_dir.output_dir.join(view_relative_dir)
67
+ file_output_dir.mkpath
68
+ output_path = file_output_dir.join(output_basename)
69
+ end
70
+
71
+ return if @@output_paths.index(output_path) or output_path.exist?
72
+ @@output_paths << output_path
73
+
74
+ FileUtils.mkdir_p(output_path.dirname)
75
+
76
+ result = evaluate(output_path, options)
77
+
78
+ f = File.new(output_path, 'w')
79
+ f.write(result)
80
+ f.close
81
+
82
+ result
83
+ end
84
+
85
+ def evaluate(output_path, options = {})
86
+
87
+ if @type == :layout
88
+ puts "Evaluating layout for #{output_path}..."
89
+ else
90
+ puts "Evaluating #{output_path}..."
91
+ end
92
+
93
+ helper = ViewHelper.new(@site_dir, output_path)
94
+
95
+ # First evaluate header as ERB if necessary
96
+
97
+ header_vars = {}
98
+ if options[:resource]
99
+ header_vars[:resource] = options[:resource]
100
+ end
101
+
102
+ header_binding = header_vars.to_binding(helper)
103
+ header_string = ERB.new(YAML.header_string(@raw_content)).result(header_binding)
104
+ if header_string == ''
105
+ header = {}
106
+ else
107
+ header = YAML.load(header_string).symbolize_keys
108
+ end
109
+
110
+ # Maintin the binding if we were passed one; otherwise,
111
+ # create a brand new binding from our header info
112
+
113
+ if options[:binding]
114
+ content_binding = options[:binding]
115
+
116
+ # Overwrite layout that was passed in
117
+ if header[:layout]
118
+ content_binding.eval("layout = '#{header[:layout]}'")
119
+ else
120
+ content_binding.eval("layout = nil")
121
+ end
122
+
123
+ else
124
+
125
+ if options[:locals]
126
+ vars = header.merge(options[:locals])
127
+ else
128
+ vars = header.clone
129
+ end
130
+ vars[:content] = nil
131
+ vars[:layout] = nil unless vars.key?(:layout)
132
+
133
+ if options[:resource]
134
+ resource_key = options[:resource].resource_type.to_sym
135
+ vars[resource_key] = options[:resource]
136
+ vars[:resource] = options[:resource] # alias as "resource"
137
+ end
138
+
139
+ content_binding = vars.to_binding(helper)
140
+
141
+ end
142
+
143
+ # Evaluate the content with appropriate markup and ERB
144
+
145
+ content = YAML.remove_header(@raw_content)
146
+
147
+ markup_extensions.reverse.each do |extension|
148
+ case extension.downcase
149
+ when 'erb'
150
+ content = ERB.new(content).result(content_binding)
151
+ when 'textile'
152
+ begin
153
+ require 'RedCloth'
154
+ rescue LoadError
155
+ puts "
156
+ The RedCloth gem is required to evaluate Textile markup. Please run:
157
+
158
+ gem install RedCloth"
159
+ exit
160
+ end
161
+ content = RedCloth.new(content).to_html
162
+ when 'md'
163
+ begin
164
+ require 'maruku'
165
+ rescue LoadError
166
+ puts "
167
+ The Maruku gem is required to evaluate Markdown markup. Please run:
168
+
169
+ gem install maruku"
170
+ exit
171
+ end
172
+ content = Maruku.new(content).to_html
173
+ end
174
+ end
175
+
176
+ # Now evaluate the layout
177
+
178
+ if content_binding.eval('layout')
179
+ content_binding.eval("content = <<EOS\n#{content}\nEOS")
180
+ layout_view = View.fetch(:layout => content_binding.eval('layout'), :site_dir => @site_dir)
181
+ content = layout_view.evaluate(output_path, :binding => content_binding)
182
+ end
183
+
184
+ content
185
+ end
186
+
187
+ private
188
+
189
+ def markup_extensions
190
+ tokens = Pathname.new(@path).basename.to_s.split('.')
191
+ return nil if tokens.length == 1
192
+
193
+ i = tokens.length
194
+ tokens.reverse.each do |token|
195
+ break unless MarkupExtensions.index(token)
196
+ i = i - 1
197
+ end
198
+
199
+ return tokens[i..-1].map { |t| t.downcase }
200
+ end
201
+
202
+ def output_basename
203
+ return @path.basename unless markup_extensions
204
+ extensions = '.' + markup_extensions.join('.')
205
+ return @path.basename(extensions)
206
+ end
207
+
208
+ end
209
+ end
@@ -0,0 +1,61 @@
1
+ module Chisel
2
+ class ViewHelper
3
+ attr_accessor :site_dir, :output_path
4
+
5
+ def initialize(site_dir, output_path)
6
+ @site_dir = site_dir
7
+ @config = @site_dir.config
8
+ @output_path = output_path
9
+ end
10
+
11
+ def render(view, options = {})
12
+ locals = options[:locals] || {}
13
+
14
+ template = View.fetch(:view => view, :site_dir => @site_dir)
15
+ template.evaluate(@output_path, :locals => locals)
16
+ end
17
+
18
+
19
+ def link_to_resource(resource, text, options = {})
20
+ view = options[:view] || 'index'
21
+
22
+ view_path = @site_dir.resource_view_output_path(resource, view)
23
+ href = view_path.relative_path_from(@output_path.dirname).to_s
24
+
25
+ # Initialize the view template
26
+ template = View.fetch(:resource => resource.resource_type, :view => view, :site_dir => @site_dir)
27
+
28
+ # Compute the output path for this specific resource
29
+ output_path = @site_dir.resource_view_output_path(resource, view)
30
+
31
+ # Now run the view template against this resource
32
+ template.run(:output_path => output_path, :resource => resource)
33
+
34
+ link_to(href, text, options)
35
+ end
36
+
37
+ def link_to_page(page, text, options = {})
38
+ page_output_path = @site_dir.page_output_path(page)
39
+ href = page_output_path.relative_path_from(@output_path.dirname).to_s
40
+
41
+ link_to(href, text, options)
42
+ end
43
+
44
+ def path_to(site_relative_path)
45
+ @site_dir.output_dir.join(site_relative_path).relative_path_from(@output_path.dirname)
46
+ end
47
+
48
+ def link_to(href, text, options = {})
49
+ if options[:html]
50
+ attribute_string = ''
51
+ options[:html].each do |k, v|
52
+ attribute_string += " #{k}=\"#{v}\"" if LinkAttributes.index(k.to_s.downcase)
53
+ end
54
+ end
55
+
56
+ href = href[0..-11] if href.end_with?('index.html')
57
+
58
+ "<a href=\"#{href}\"#{attribute_string}>#{text}</a>"
59
+ end
60
+ end
61
+ end
@@ -0,0 +1,51 @@
1
+ require 'fileutils'
2
+ require 'json'
3
+ require 'chisel/resource'
4
+ require 'chisel/site_directory'
5
+ require 'chisel/view'
6
+ require 'chisel/view_helper'
7
+
8
+ require 'chisel/ruby/array'
9
+ require 'chisel/ruby/hash'
10
+ require 'chisel/ruby/string'
11
+ require 'chisel/ruby/yaml'
12
+
13
+ module Chisel
14
+ class Wrapper
15
+ attr_accessor :site_dir
16
+
17
+ def initialize(site_dir)
18
+ @site_dir = SiteDirectory.new(site_dir)
19
+ require_rb(@site_dir.resource_dir)
20
+ end
21
+
22
+ def run(dir = @site_dir)
23
+ @site_dir.clear_output_dir
24
+
25
+ # Get all views in the root site directory as well
26
+ # as any subdirectories (recursive). Don't include
27
+ # any files or folders beginning with an underscore.
28
+ view_paths = Pathname.glob(@site_dir.join('[^_]*.*'))
29
+ view_paths += Pathname.glob(@site_dir.join('[^_]**/**/*.*'))
30
+
31
+ view_paths.each do |view_path|
32
+ if view_path.extname == '.erb'
33
+ view = View.fetch(:path => view_path, :site_dir => @site_dir)
34
+ view.run
35
+ else
36
+ output_path = @site_dir.output_dir.join(view_path)
37
+ output_path.dirname.mkpath
38
+ FileUtils.cp(view_path, output_path)
39
+ end
40
+ end
41
+ end
42
+
43
+ private
44
+
45
+ def require_rb(path)
46
+ Dir["#{path}/*.rb"].each do |filename|
47
+ require File.expand_path(filename)
48
+ end
49
+ end
50
+ end
51
+ end
metadata ADDED
@@ -0,0 +1,68 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: chisel
3
+ version: !ruby/object:Gem::Version
4
+ prerelease:
5
+ version: 0.0.1
6
+ platform: ruby
7
+ authors:
8
+ - Rockwell Schrock
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+
13
+ date: 2011-06-07 00:00:00 Z
14
+ dependencies: []
15
+
16
+ description: Chisel is tool to generate simple, resource-based static Web sites.
17
+ email: schrockwell@gmail.com
18
+ executables:
19
+ - chisel
20
+ extensions: []
21
+
22
+ extra_rdoc_files: []
23
+
24
+ files:
25
+ - lib/chisel/new_site/_config.yml
26
+ - lib/chisel/new_site/_views/_layout/main.html.erb
27
+ - lib/chisel/new_site/index.html.erb
28
+ - lib/chisel/resource.rb
29
+ - lib/chisel/ruby/array.rb
30
+ - lib/chisel/ruby/hash.rb
31
+ - lib/chisel/ruby/string.rb
32
+ - lib/chisel/ruby/yaml.rb
33
+ - lib/chisel/site_directory.rb
34
+ - lib/chisel/templates/resource.rb
35
+ - lib/chisel/templates/resource_index.html.erb
36
+ - lib/chisel/view.rb
37
+ - lib/chisel/view_helper.rb
38
+ - lib/chisel/wrapper.rb
39
+ - bin/chisel
40
+ homepage: https://github.com/schrockwell/chisel
41
+ licenses: []
42
+
43
+ post_install_message:
44
+ rdoc_options: []
45
+
46
+ require_paths:
47
+ - lib
48
+ required_ruby_version: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ">="
52
+ - !ruby/object:Gem::Version
53
+ version: "0"
54
+ required_rubygems_version: !ruby/object:Gem::Requirement
55
+ none: false
56
+ requirements:
57
+ - - ">="
58
+ - !ruby/object:Gem::Version
59
+ version: "0"
60
+ requirements: []
61
+
62
+ rubyforge_project:
63
+ rubygems_version: 1.8.5
64
+ signing_key:
65
+ specification_version: 3
66
+ summary: A static Web site generator.
67
+ test_files: []
68
+