spinto 0.2.3

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/Gemfile ADDED
@@ -0,0 +1,2 @@
1
+ source :rubygems
2
+ gemspec
data/Rakefile ADDED
@@ -0,0 +1,151 @@
1
+ require 'rubygems'
2
+ require 'rake'
3
+ require 'rdoc'
4
+ require 'date'
5
+
6
+ $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib]))
7
+
8
+ #############################################################################
9
+ #
10
+ # Helper functions
11
+ #
12
+ #############################################################################
13
+
14
+ def name
15
+ @name ||= Dir['*.gemspec'].first.split('.').first
16
+ end
17
+
18
+ def version
19
+ line = File.read("lib/#{name}.rb")[/^\s*VERSION\s*=\s*.*/]
20
+ line.match(/.*VERSION\s*=\s*['"](.*)['"]/)[1]
21
+ end
22
+
23
+ def date
24
+ Date.today.to_s
25
+ end
26
+
27
+ def rubyforge_project
28
+ name
29
+ end
30
+
31
+ def gemspec_file
32
+ "#{name}.gemspec"
33
+ end
34
+
35
+ def gem_file
36
+ "#{name}-#{version}.gem"
37
+ end
38
+
39
+ def replace_header(head, header_name)
40
+ head.sub!(/(\.#{header_name}\s*= ').*'/) { "#{$1}#{send(header_name)}'"}
41
+ end
42
+
43
+ #############################################################################
44
+ #
45
+ # Standard tasks
46
+ #
47
+ #############################################################################
48
+
49
+ task :default => [:test, :features]
50
+
51
+ require 'rake/testtask'
52
+ Rake::TestTask.new(:test) do |test|
53
+ if `which pygmentize` == ''
54
+ puts "You must have Pygments installed to run the tests."
55
+ exit 1
56
+ end
57
+ test.libs << 'lib' << 'test'
58
+ test.pattern = 'test/**/test_*.rb'
59
+ test.verbose = true
60
+ end
61
+
62
+ desc "Generate RCov test coverage and open in your browser"
63
+ task :coverage do
64
+ require 'rcov'
65
+ sh "rm -fr coverage"
66
+ sh "rcov test/test_*.rb"
67
+ sh "open coverage/index.html"
68
+ end
69
+
70
+ require 'rdoc/task'
71
+ Rake::RDocTask.new do |rdoc|
72
+ rdoc.rdoc_dir = 'rdoc'
73
+ rdoc.title = "#{name} #{version}"
74
+ rdoc.rdoc_files.include('README*')
75
+ rdoc.rdoc_files.include('lib/**/*.rb')
76
+ end
77
+
78
+ desc "Open an irb session preloaded with this library"
79
+ task :console do
80
+ sh "irb -rubygems -r ./lib/#{name}.rb"
81
+ end
82
+
83
+ #############################################################################
84
+ #
85
+ # Custom tasks (add your own tasks here)
86
+ #
87
+ #############################################################################
88
+
89
+ begin
90
+ require 'cucumber/rake/task'
91
+ Cucumber::Rake::Task.new(:features) do |t|
92
+ t.cucumber_opts = "--format progress"
93
+ end
94
+ rescue LoadError
95
+ desc 'Cucumber rake task not available'
96
+ task :features do
97
+ abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
98
+ end
99
+ end
100
+
101
+ #############################################################################
102
+ #
103
+ # Packaging tasks
104
+ #
105
+ #############################################################################
106
+
107
+ task :release => :build do
108
+ unless `git branch` =~ /^\* master$/
109
+ puts "You must be on the master branch to release!"
110
+ exit!
111
+ end
112
+ sh "git commit --allow-empty -m 'Release #{version}'"
113
+ sh "git tag v#{version}"
114
+ sh "git push origin master"
115
+ sh "git push origin v#{version}"
116
+ sh "gem push pkg/#{name}-#{version}.gem"
117
+ end
118
+
119
+ task :build => :gemspec do
120
+ sh "mkdir -p pkg"
121
+ sh "gem build #{gemspec_file}"
122
+ sh "mv #{gem_file} pkg"
123
+ end
124
+
125
+ task :gemspec do
126
+ # read spec file and split out manifest section
127
+ spec = File.read(gemspec_file)
128
+ head, manifest, tail = spec.split(" # = MANIFEST =\n")
129
+
130
+ # replace name version and date
131
+ replace_header(head, :name)
132
+ replace_header(head, :version)
133
+ replace_header(head, :date)
134
+ #comment this out if your rubyforge_project has a different name
135
+ # replace_header(head, :rubyforge_project)
136
+
137
+ # determine file list from git ls-files
138
+ files = `git ls-files`.
139
+ split("\n").
140
+ sort.
141
+ reject { |file| file =~ /^\./ }.
142
+ reject { |file| file =~ /^(rdoc|pkg|coverage)/ }.
143
+ map { |file| " #{file}" }.
144
+ join("\n")
145
+
146
+ # piece file back together and write
147
+ manifest = " s.files = %w[\n#{files}\n ]\n"
148
+ spec = [head, manifest, tail].join(" # = MANIFEST =\n")
149
+ File.open(gemspec_file, 'w') { |io| io.write(spec) }
150
+ puts "Updated #{gemspec_file}"
151
+ end
@@ -0,0 +1,29 @@
1
+ # Build .coffee and .coffeescript files into
2
+ # Javascript.
3
+ #
4
+ # From: https://gist.github.com/959938
5
+ #
6
+
7
+ module Jekyll
8
+ require 'coffee-script'
9
+ class CoffeeScriptConverter < Converter
10
+ safe true
11
+ priority :normal
12
+
13
+ def matches(ext)
14
+ ext =~ /coffee/i
15
+ end
16
+
17
+ def output_ext(ext)
18
+ ".js"
19
+ end
20
+
21
+ def convert(content)
22
+ begin
23
+ CoffeeScript.compile content
24
+ rescue StandardError => e
25
+ puts "CoffeeScript error:" + e.message
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,87 @@
1
+ Jekyll::Post.class_eval do
2
+
3
+ def location_on_server
4
+ to_liquid['url']
5
+ end
6
+
7
+ def path_to_source
8
+ "/_posts/#{File.join(@name)}"
9
+ end
10
+
11
+ end
12
+
13
+ Jekyll::Page.class_eval do
14
+
15
+ # It is important that this is the same
16
+ # as the key used on the hash in the watcher.
17
+ def location_on_server
18
+ to_liquid['url']
19
+ end
20
+
21
+ def path_to_source
22
+ File.join(@dir, @name)
23
+ end
24
+
25
+ end
26
+
27
+ Jekyll::StaticFile.class_eval do
28
+
29
+ def location_on_server
30
+ File.join(@dir, @name)
31
+ end
32
+
33
+ def path_to_source
34
+ File.join(@dir, @name)
35
+ end
36
+
37
+ end
38
+
39
+ Jekyll::Site.class_eval do
40
+ require 'json'
41
+
42
+ alias :render_without_include_tree :render
43
+ def render
44
+ # First, render like Jekyll normally does
45
+ render_without_include_tree
46
+
47
+ # Set a blank array for files that did not have
48
+ # inclusions fired.
49
+ (pages + posts + static_files).each do |file|
50
+ Jekyll::IncludeWatcher.inclusions[file.location_on_server] ||= {}
51
+ Jekyll::IncludeWatcher.inclusions[file.location_on_server].merge!(source: file.path_to_source)
52
+ if file.respond_to?(:data) && file.data
53
+ data = {}
54
+ ['editable', '_content', 'title', 'description'].each do |key|
55
+ data[key] = file.data[key] if file.data[key]
56
+ end
57
+ Jekyll::IncludeWatcher.inclusions[file.location_on_server].merge!(data)
58
+ end
59
+ end
60
+
61
+ # Clean up index.html to be '/'
62
+ Jekyll::IncludeWatcher.inclusions.keys.each do |key|
63
+ matches = key.match(/^(.*\/)index.html$/)
64
+ if matches
65
+ clean_name = if matches[1] == '/'
66
+ matches[1]
67
+ else
68
+ matches[1].gsub(/\/$/, '')
69
+ end
70
+ Jekyll::IncludeWatcher.inclusions[clean_name] = \
71
+ Jekyll::IncludeWatcher.inclusions.delete(key)
72
+ end
73
+ end
74
+
75
+ # Write our inclusions to a dot-file
76
+ filename = '.include_tree'
77
+
78
+ File.open(File.join(source, filename), "w") do |f|
79
+ f.write JSON.dump( Jekyll::IncludeWatcher.inclusions )
80
+ end
81
+
82
+ # Ensure Jekyll doesn't clean ths up.
83
+ static_files << Jekyll::StaticFile.new(self, source, "/", filename)
84
+ end
85
+
86
+ end
87
+
@@ -0,0 +1,78 @@
1
+ module Jekyll
2
+
3
+ class IncludeWatcher < Jekyll::IncludeTag
4
+
5
+ @@inclusions = {}
6
+ def self.inclusions; @@inclusions; end
7
+
8
+ def render(context)
9
+ Jekyll::IncludeWatcher.inclusions[context.registers[:page]['url']] ||= {}
10
+ Jekyll::IncludeWatcher.inclusions[context.registers[:page]['url']][:includes] ||= {}
11
+ Jekyll::IncludeWatcher.inclusions[context.registers[:page]['url']][:includes] = \
12
+ (Jekyll::IncludeWatcher.inclusions[context.registers[:page]['url']][:includes] || {}).merge(
13
+ @file => { 'editable' => true }
14
+ )
15
+ super
16
+ end
17
+
18
+ end
19
+
20
+ module Convertible
21
+
22
+ # Add any necessary layouts to this convertible document.
23
+ #
24
+ # payload - The site payload Hash.
25
+ # layouts - A Hash of {"name" => "layout"}.
26
+ #
27
+ # Returns nothing.
28
+
29
+ # Monkey patched for page passing to tags.
30
+ #
31
+ # https://github.com/mojombo/jekyll/pull/413
32
+ #
33
+ def do_layout(payload, layouts)
34
+ info = { :filters => [Jekyll::Filters], :registers => { :site => self.site, :page => payload['page'] } }
35
+
36
+ # render and transform content (this becomes the final content of the object)
37
+ payload["pygments_prefix"] = converter.pygments_prefix
38
+ payload["pygments_suffix"] = converter.pygments_suffix
39
+
40
+ begin
41
+ self.content = Liquid::Template.parse(self.content).render(payload, info)
42
+ rescue => e
43
+ puts "Liquid Exception: #{e.message} in #{self.name}"
44
+ end
45
+
46
+ self.transform
47
+
48
+ # output keeps track of what will finally be written
49
+ self.output = self.content
50
+
51
+ # recursively render layouts
52
+ layout = layouts[self.data["layout"]]
53
+ used = Set.new([layout])
54
+
55
+ while layout
56
+ payload = payload.deep_merge({"content" => self.output, "page" => layout.data})
57
+
58
+ begin
59
+ self.output = Liquid::Template.parse(layout.content).render(payload, info)
60
+ rescue => e
61
+ puts "Liquid Exception: #{e.message} in #{self.data["layout"]}"
62
+ end
63
+
64
+ if layout = layouts[layout.data["layout"]]
65
+ if used.include?(layout)
66
+ layout = nil # avoid recursive chain
67
+ else
68
+ used << layout
69
+ end
70
+ end
71
+ end
72
+ end
73
+
74
+ end
75
+
76
+ end
77
+
78
+ Liquid::Template.register_tag('include', Jekyll::IncludeWatcher)
@@ -0,0 +1,26 @@
1
+ # Build .less files into CSS
2
+ #
3
+
4
+ module Jekyll
5
+ require 'less'
6
+ class LessConverter < Converter
7
+ safe true
8
+ priority :normal
9
+
10
+ def matches(ext)
11
+ ext =~ /less/i
12
+ end
13
+
14
+ def output_ext(ext)
15
+ ".css"
16
+ end
17
+
18
+ def convert(content)
19
+ begin
20
+ Less::Engine.new(content).to_css
21
+ rescue StandardError => e
22
+ puts "Less error:" + e.message
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # Build .sass files into CSS
2
+ #
3
+
4
+ module Jekyll
5
+ require 'sass'
6
+ class SassConverter < Converter
7
+ safe true
8
+ priority :normal
9
+
10
+ def matches(ext)
11
+ ext =~ /sass/i
12
+ end
13
+
14
+ def output_ext(ext)
15
+ ".css"
16
+ end
17
+
18
+ def convert(content)
19
+ begin
20
+ Sass::Engine.new(content, :syntax => :sass).render
21
+ rescue StandardError => e
22
+ puts "Sass error:" + e.message
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,26 @@
1
+ # Build .scss files into CSS
2
+ #
3
+
4
+ module Jekyll
5
+ require 'scss'
6
+ class ScssConverter < Converter
7
+ safe true
8
+ priority :normal
9
+
10
+ def matches(ext)
11
+ ext =~ /scss/i
12
+ end
13
+
14
+ def output_ext(ext)
15
+ ".css"
16
+ end
17
+
18
+ def convert(content)
19
+ begin
20
+ Sass::Engine.new(content, :syntax => :scss).render
21
+ rescue StandardError => e
22
+ puts "Scss error:" + e.message
23
+ end
24
+ end
25
+ end
26
+ end
data/bin/spinto-site ADDED
@@ -0,0 +1,147 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ $:.unshift File.join(File.dirname(__FILE__), *%w[.. lib])
4
+
5
+ help = <<HELP
6
+ Spinto-site is the spintoapp.com wrapper of jekyll,
7
+ the blog-aware, static site generator.
8
+
9
+ Basic Command Line Usage:
10
+ spinto-site # . -> ./_site
11
+ spinto-site <path to write generated site> # . -> <path>
12
+ spinto-site <path to source> <path to write generated site> # <path> -> <path>
13
+ spinto-site --auto --server # Host your site locally
14
+
15
+ Configuration is read from '<source>/_config.yml' but can be overriden
16
+ using the following options:
17
+
18
+ HELP
19
+
20
+ require 'optparse'
21
+ require 'jekyll'
22
+ require 'spinto'
23
+
24
+ exec = {}
25
+ options = {}
26
+ opts = OptionParser.new do |opts|
27
+ opts.banner = help
28
+
29
+ opts.on("--[no-]auto", "Auto-regenerate") do |auto|
30
+ options['auto'] = auto
31
+ end
32
+
33
+ opts.on("--server [PORT]", "Start web server (default port 4000)") do |port|
34
+ options['server'] = true
35
+ options['server_port'] = port unless port.nil?
36
+ end
37
+
38
+ opts.on("--no-server", "Do not start a web server") do |part|
39
+ options['server'] = false
40
+ end
41
+
42
+ opts.on("--url [URL]", "Set custom site.url") do |url|
43
+ options['url'] = url
44
+ end
45
+
46
+ opts.on("--version", "Display current version") do
47
+ puts "Spinto " + Spinto::VERSION
48
+ exit 0
49
+ end
50
+ end
51
+
52
+ # Read command line options into `options` hash
53
+ opts.parse!
54
+
55
+
56
+ # Get source and destintation from command line
57
+ case ARGV.size
58
+ when 0
59
+ when 1
60
+ options['destination'] = ARGV[0]
61
+ when 2
62
+ options['source'] = ARGV[0]
63
+ options['destination'] = ARGV[1]
64
+ else
65
+ puts "Invalid options. Run `spinto-site --help` for assistance."
66
+ exit(1)
67
+ end
68
+
69
+ options['safe'] = false
70
+ options['plugins'] = File.join(File.dirname(__FILE__), '..', '_plugins')
71
+
72
+ options = Jekyll.configuration(options)
73
+
74
+ # Get source and destination directories (possibly set by config file)
75
+ source = options['source']
76
+ destination = options['destination']
77
+
78
+ # Files to watch
79
+ def globs(source)
80
+ Dir.chdir(source) do
81
+ dirs = Dir['*'].select { |x| File.directory?(x) }
82
+ dirs -= ['_site']
83
+ dirs = dirs.map { |x| "#{x}/**/*" }
84
+ dirs += ['*']
85
+ end
86
+ end
87
+
88
+ # Create the Site
89
+ site = Jekyll::Site.new(options)
90
+
91
+ # Run the directory watcher for auto-generation, if required
92
+ if options['auto']
93
+ require 'directory_watcher'
94
+
95
+ puts "Auto-regenerating enabled: #{source} -> #{destination}"
96
+
97
+ dw = DirectoryWatcher.new(source)
98
+ dw.interval = 1
99
+ dw.glob = globs(source)
100
+
101
+ dw.add_observer do |*args|
102
+ t = Time.now.strftime("%Y-%m-%d %H:%M:%S")
103
+ puts "[#{t}] regeneration: #{args.size} files changed"
104
+ site.process
105
+ end
106
+
107
+ dw.start
108
+
109
+ unless options['server']
110
+ loop { sleep 1000 }
111
+ end
112
+ else
113
+ puts "Building site: #{source} -> #{destination}"
114
+ begin
115
+ site.process
116
+ rescue Jekyll::FatalException => e
117
+ puts
118
+ puts "ERROR: YOUR SITE COULD NOT BE BUILT:"
119
+ puts "------------------------------------"
120
+ puts e.message
121
+ exit(1)
122
+ end
123
+ puts "Successfully generated site: #{source} -> #{destination}"
124
+ end
125
+
126
+ # Run the server on the specified port, if required
127
+ if options['server']
128
+ require 'webrick'
129
+ include WEBrick
130
+
131
+ FileUtils.mkdir_p(destination)
132
+
133
+ mime_types = WEBrick::HTTPUtils::DefaultMimeTypes
134
+ mime_types.store 'js', 'application/javascript'
135
+
136
+ s = HTTPServer.new(
137
+ :Port => options['server_port'],
138
+ :MimeTypes => mime_types
139
+ )
140
+ s.mount(options['baseurl'], HTTPServlet::FileHandler, destination)
141
+ t = Thread.new {
142
+ s.start
143
+ }
144
+
145
+ trap("INT") { s.shutdown }
146
+ t.join()
147
+ end
data/lib/spinto.rb ADDED
@@ -0,0 +1,4 @@
1
+ module Spinto
2
+ VERSION = '0.2.3'
3
+
4
+ end
data/spinto.gemspec ADDED
@@ -0,0 +1,50 @@
1
+ Gem::Specification.new do |s|
2
+ s.specification_version = 2 if s.respond_to? :specification_version=
3
+ s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
4
+ s.rubygems_version = '1.3.5'
5
+
6
+ s.name = 'spinto'
7
+ s.version = '0.2.3'
8
+ s.date = '2012-02-09'
9
+
10
+ s.summary = "The site generator used at spintoapp.com"
11
+ s.description = "Spinto uses Jekyll and plugins to build static sites, this gem provides the spinto-site builder."
12
+
13
+ s.authors = ["Matthew Beale"]
14
+ s.email = 'matt.beale@madhatted.com'
15
+ s.homepage = 'http://github.com/mixonic/spinto'
16
+
17
+ s.require_paths = %w[lib]
18
+
19
+ s.executables = ["spinto-site"]
20
+
21
+ s.rdoc_options = ["--charset=UTF-8"]
22
+ s.extra_rdoc_files = %w[]
23
+
24
+ s.add_runtime_dependency('jekyll', "0.11.0")
25
+ s.add_runtime_dependency('coffee-script', "2.2.0")
26
+ s.add_runtime_dependency('sass', "3.1.15")
27
+ s.add_runtime_dependency('less', "2.0.9")
28
+ s.add_runtime_dependency('RedCloth', "4.2.9")
29
+
30
+ s.add_development_dependency('rake', "~> 0.9")
31
+ s.add_development_dependency('rdoc', "~> 3.11")
32
+
33
+ # = MANIFEST =
34
+ s.files = %w[
35
+ Gemfile
36
+ Rakefile
37
+ _plugins/coffeescript_converter.rb
38
+ _plugins/include_tree.rb
39
+ _plugins/include_watcher.rb
40
+ _plugins/less_converter.rb
41
+ _plugins/sass_converter.rb
42
+ _plugins/scss_converter.rb
43
+ bin/spinto-site
44
+ lib/spinto.rb
45
+ spinto.gemspec
46
+ ]
47
+ # = MANIFEST =
48
+
49
+ s.test_files = s.files.select { |path| path =~ /^test\/test_.*\.rb/ }
50
+ end
metadata ADDED
@@ -0,0 +1,138 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: spinto
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.2.3
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Matthew Beale
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-02-09 00:00:00.000000000Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: jekyll
16
+ requirement: &2153561060 !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - =
20
+ - !ruby/object:Gem::Version
21
+ version: 0.11.0
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: *2153561060
25
+ - !ruby/object:Gem::Dependency
26
+ name: coffee-script
27
+ requirement: &2153560600 !ruby/object:Gem::Requirement
28
+ none: false
29
+ requirements:
30
+ - - =
31
+ - !ruby/object:Gem::Version
32
+ version: 2.2.0
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: *2153560600
36
+ - !ruby/object:Gem::Dependency
37
+ name: sass
38
+ requirement: &2153560140 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - =
42
+ - !ruby/object:Gem::Version
43
+ version: 3.1.15
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *2153560140
47
+ - !ruby/object:Gem::Dependency
48
+ name: less
49
+ requirement: &2153559680 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - =
53
+ - !ruby/object:Gem::Version
54
+ version: 2.0.9
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *2153559680
58
+ - !ruby/object:Gem::Dependency
59
+ name: RedCloth
60
+ requirement: &2153559220 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - =
64
+ - !ruby/object:Gem::Version
65
+ version: 4.2.9
66
+ type: :runtime
67
+ prerelease: false
68
+ version_requirements: *2153559220
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: &2153558760 !ruby/object:Gem::Requirement
72
+ none: false
73
+ requirements:
74
+ - - ~>
75
+ - !ruby/object:Gem::Version
76
+ version: '0.9'
77
+ type: :development
78
+ prerelease: false
79
+ version_requirements: *2153558760
80
+ - !ruby/object:Gem::Dependency
81
+ name: rdoc
82
+ requirement: &2153558300 !ruby/object:Gem::Requirement
83
+ none: false
84
+ requirements:
85
+ - - ~>
86
+ - !ruby/object:Gem::Version
87
+ version: '3.11'
88
+ type: :development
89
+ prerelease: false
90
+ version_requirements: *2153558300
91
+ description: Spinto uses Jekyll and plugins to build static sites, this gem provides
92
+ the spinto-site builder.
93
+ email: matt.beale@madhatted.com
94
+ executables:
95
+ - spinto-site
96
+ extensions: []
97
+ extra_rdoc_files: []
98
+ files:
99
+ - Gemfile
100
+ - Rakefile
101
+ - _plugins/coffeescript_converter.rb
102
+ - _plugins/include_tree.rb
103
+ - _plugins/include_watcher.rb
104
+ - _plugins/less_converter.rb
105
+ - _plugins/sass_converter.rb
106
+ - _plugins/scss_converter.rb
107
+ - bin/spinto-site
108
+ - lib/spinto.rb
109
+ - spinto.gemspec
110
+ homepage: http://github.com/mixonic/spinto
111
+ licenses: []
112
+ post_install_message:
113
+ rdoc_options:
114
+ - --charset=UTF-8
115
+ require_paths:
116
+ - lib
117
+ required_ruby_version: !ruby/object:Gem::Requirement
118
+ none: false
119
+ requirements:
120
+ - - ! '>='
121
+ - !ruby/object:Gem::Version
122
+ version: '0'
123
+ segments:
124
+ - 0
125
+ hash: -379297724553837064
126
+ required_rubygems_version: !ruby/object:Gem::Requirement
127
+ none: false
128
+ requirements:
129
+ - - ! '>='
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubyforge_project:
134
+ rubygems_version: 1.8.15
135
+ signing_key:
136
+ specification_version: 2
137
+ summary: The site generator used at spintoapp.com
138
+ test_files: []