blossom 0.0.12 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/blossom +141 -44
- data/lib/blossom.rb +266 -92
- data/lib/blossom/version.rb +3 -0
- metadata +24 -39
data/bin/blossom
CHANGED
@@ -1,7 +1,9 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
-
|
4
|
-
|
3
|
+
BLOSSOM_HOME = File.join(File.dirname(__FILE__), "..")
|
4
|
+
|
5
|
+
require "fileutils"
|
6
|
+
require "#{BLOSSOM_HOME}/lib/blossom"
|
5
7
|
|
6
8
|
include FileUtils
|
7
9
|
|
@@ -9,83 +11,178 @@ def make_file(name, content)
|
|
9
11
|
File.open(name, "w") { |file| file.write(content) }
|
10
12
|
end
|
11
13
|
|
12
|
-
def
|
13
|
-
|
14
|
+
def copy_file(name, destination)
|
15
|
+
FileUtils.cp "#{BLOSSOM_HOME}/#{name}", "#{destination}/#{name}"
|
16
|
+
end
|
17
|
+
|
18
|
+
def usage
|
19
|
+
"Usage: #$0 PROJECT-NAME"
|
20
|
+
end
|
21
|
+
|
22
|
+
def die(message)
|
23
|
+
error message
|
24
|
+
exit 1
|
25
|
+
end
|
26
|
+
|
27
|
+
def error(message)
|
28
|
+
warn "Blossom: Error: #{message}"
|
29
|
+
end
|
30
|
+
|
31
|
+
def run(command)
|
32
|
+
puts "$ #{command}"
|
33
|
+
system command or die "Command failed: #{command}"
|
14
34
|
end
|
15
35
|
|
16
36
|
if ARGV.empty?
|
17
|
-
|
37
|
+
puts usage
|
18
38
|
elsif ARGV[0].start_with? "-"
|
19
39
|
case ARGV[0]
|
20
40
|
when "--version", "-v"
|
21
41
|
puts Blossom::VERSION
|
22
42
|
when "--help", "-h", "-?"
|
23
|
-
|
43
|
+
puts usage
|
24
44
|
else
|
25
|
-
|
45
|
+
error "Unrecognized option: #{ARGV[0]}"
|
46
|
+
warn usage
|
47
|
+
exit 1
|
26
48
|
end
|
27
49
|
else
|
28
50
|
name = ARGV.first
|
29
51
|
name_symbol = name =~ /\W|^\d/ ? ":'#{name}'" : ":#{name}"
|
30
|
-
|
31
|
-
|
32
|
-
|
52
|
+
name_pretty = name.capitalize.gsub(/[-_]/, " ")
|
53
|
+
|
54
|
+
if File.exist? name
|
55
|
+
die "File already exists: #{name}"
|
56
|
+
else
|
57
|
+
puts "Blossom creating project: #{name}"
|
58
|
+
|
59
|
+
puts "$ mkdir #{name}; cd #{name}"
|
60
|
+
mkdir name; cd name
|
61
|
+
|
62
|
+
puts "Installing Blossom boilerplate."
|
63
|
+
|
64
|
+
make_file "#{name}.blossom", <<"^D"
|
65
|
+
## This is the Blossom configuration file.
|
66
|
+
##
|
67
|
+
## All settings are listed here with their default values.
|
68
|
+
## To change a setting, you have to uncomment the line first.
|
69
|
+
|
70
|
+
## The directory in which to put arbitrary public files:
|
71
|
+
# Public-Directory: public
|
72
|
+
|
73
|
+
## Files with these extensions are always public:
|
74
|
+
# Public-Extensions: js css html png jpg
|
75
|
+
|
76
|
+
## The maximum amount of time browsers may cache the site:
|
77
|
+
# Max-Cache-Time: 1 day
|
78
|
+
|
79
|
+
## Whether or not to remove the "www." part of the domain:
|
80
|
+
# Remove-WWW-From-Domain: yes
|
81
|
+
^D
|
33
82
|
|
34
83
|
make_file ".gitignore", "tmp\n"
|
35
84
|
|
36
|
-
make_file "config.ru",
|
85
|
+
make_file "config.ru", <<"^D"
|
37
86
|
require "rubygems"
|
38
87
|
require "bundler/setup"
|
39
88
|
require "blossom"
|
40
89
|
|
41
|
-
run Blossom
|
42
|
-
|
90
|
+
run Blossom __FILE__
|
91
|
+
^D
|
43
92
|
|
44
|
-
make_file "Gemfile",
|
93
|
+
make_file "Gemfile", <<"^D"
|
45
94
|
source :rubygems
|
46
95
|
|
47
|
-
gem
|
48
|
-
|
96
|
+
gem "blossom", "~> #{Blossom::VERSION}"
|
97
|
+
|
98
|
+
# Uncomment the following if you want to use CoffeeScript.
|
99
|
+
# (See further instructions in #{name}.js.)
|
100
|
+
#
|
101
|
+
# gem "rack-coffee"
|
102
|
+
^D
|
49
103
|
|
50
|
-
|
104
|
+
mkdir "public"
|
105
|
+
|
106
|
+
make_file "#{name}.haml", <<"^D"
|
51
107
|
!!!
|
52
108
|
%html
|
53
109
|
%head
|
54
110
|
%meta(charset="utf-8")
|
55
|
-
%title
|
56
|
-
%meta(name="description" content="
|
111
|
+
%title [insert title here]
|
112
|
+
%meta(name="description" content="[insert description here]")
|
57
113
|
%link(rel="stylesheet" href="#{name}.css")
|
114
|
+
%script(src="#{name}.js")
|
115
|
+
/[if lt IE 9]
|
116
|
+
%script(src="//html5shiv.googlecode.com/svn/trunk/html5.js")
|
58
117
|
%body
|
59
|
-
%h1
|
60
|
-
|
118
|
+
%h1 #{name}.haml
|
119
|
+
^D
|
61
120
|
|
62
|
-
make_file "#{name}.sass",
|
121
|
+
make_file "#{name}.sass", <<"^D"
|
63
122
|
@import compass/reset
|
64
|
-
|
65
|
-
|
66
|
-
width: 600px
|
67
|
-
margin: auto
|
123
|
+
@import compass/utilities
|
124
|
+
@import compass/css3
|
68
125
|
|
69
126
|
h1
|
70
|
-
font:
|
71
|
-
margin-top:
|
72
|
-
|
127
|
+
font: 48px monospace
|
128
|
+
margin-top: 1em
|
129
|
+
text-align: center
|
130
|
+
^D
|
131
|
+
|
132
|
+
make_file "#{name}.sinatra.rb", <<"^D"
|
133
|
+
# Put any custom Sinatra routes or configuration here.
|
134
|
+
# See <http://www.sinatrarb.com/documentation> for help.
|
135
|
+
|
136
|
+
# This is also where you insert middleware (just remember to add
|
137
|
+
# any new dependencies to your Gemfile and to run \`bundle\'):
|
138
|
+
#
|
139
|
+
# require "some/middleware"
|
140
|
+
# use Some::Middleware
|
141
|
+
|
142
|
+
# get "/hello" do
|
143
|
+
# "Hello World"
|
144
|
+
# end
|
145
|
+
^D
|
146
|
+
|
147
|
+
make_file "#{name}.js", <<"^D"
|
148
|
+
// If you do not want to use CoffeeScript, you can delete this comment.
|
149
|
+
// If you do, first install the CoffeeScript compiler and Rack::Coffee:
|
150
|
+
//
|
151
|
+
// $ npm install -g coffee-script
|
152
|
+
// $ sudo gem install rack-coffee
|
153
|
+
// $ echo 'gem "rack-coffee"' >> Gemfile
|
154
|
+
// $ bundle
|
155
|
+
//
|
156
|
+
// Then simply delete this file and create #{name}.coffee instead.
|
157
|
+
^D
|
158
|
+
|
159
|
+
run "bundle --local"
|
160
|
+
run "git init"
|
161
|
+
run "git add -A"
|
162
|
+
run "git commit -m 'Create project.'"
|
163
|
+
|
164
|
+
puts <<"^D"
|
73
165
|
|
74
|
-
|
166
|
+
Application created! Now type \`cd #{name}\' and then \`rackup\'.
|
167
|
+
This will run your application at <http://localhost:9292/>.
|
75
168
|
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
169
|
+
Start hacking in \`#{name}.haml\' and \`#{name}.sass\'. If you
|
170
|
+
create \`x.haml\', it will show up at <http://localhost:9292/x>.
|
171
|
+
|
172
|
+
Public files go in the \`public/\' directory, but you can put images
|
173
|
+
and Javascript files directly in the root directory if you want.
|
174
|
+
This (and other things) can be configured in \`#{name}.blossom\'.
|
175
|
+
|
176
|
+
Put any custom middleware or Sinatra code in \`#{name}.sinatra.rb\',
|
177
|
+
but remember to restart your application after changing this file.
|
178
|
+
|
179
|
+
If you restart your application a lot, there is a drop-in replacement
|
180
|
+
for rackup called Shotgun <https://github.com/rtomayko/shotgun>:
|
181
|
+
|
182
|
+
$ sudo gem install shotgun
|
183
|
+
$ shotgun # Like rackup, except with automatic reloading.
|
184
|
+
|
185
|
+
Good luck and have fun! :-)
|
186
|
+
^D
|
90
187
|
end
|
91
188
|
end
|
data/lib/blossom.rb
CHANGED
@@ -1,115 +1,289 @@
|
|
1
|
-
require "
|
1
|
+
require "blossom/version"
|
2
2
|
|
3
|
-
require "
|
3
|
+
require "sass"
|
4
|
+
require "compass"
|
5
|
+
|
6
|
+
require "haml"
|
7
|
+
require "rack"
|
8
|
+
require "rack/normalize-domain"
|
4
9
|
require "sinatra/base"
|
5
|
-
require "
|
6
|
-
require "rack/strip-www"
|
7
|
-
require "hassle"
|
10
|
+
require "yaml"
|
8
11
|
|
9
|
-
|
10
|
-
|
12
|
+
begin
|
13
|
+
require "rack/coffee"
|
14
|
+
rescue LoadError
|
11
15
|
end
|
12
16
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
value
|
18
|
-
when :minutes, :minute
|
19
|
-
value * 60
|
20
|
-
when :hours, :hour
|
21
|
-
value * 60 * 60
|
22
|
-
when :days, :day
|
23
|
-
value * days
|
24
|
-
when :weeks, :week
|
25
|
-
value * days * 7
|
26
|
-
when :months, :month
|
27
|
-
value * days * 30
|
28
|
-
when :years, :year
|
29
|
-
value * days * 365
|
30
|
-
else
|
31
|
-
raise ArgumentError, "Unrecognized unit: #{unit}"
|
17
|
+
module Blossom
|
18
|
+
def self.fail(message)
|
19
|
+
info "Error: #{message}"
|
20
|
+
exit 1
|
32
21
|
end
|
33
|
-
end
|
34
22
|
|
35
|
-
def
|
36
|
-
|
37
|
-
cache = options[:cache]
|
38
|
-
use Hassle
|
39
|
-
use Rack::StripWWW unless options[:strip_www?] == false
|
40
|
-
defined? Rack::Coffee and use Rack::Coffee,
|
41
|
-
:static => false,
|
42
|
-
:urls => "/",
|
43
|
-
:cache => !!cache,
|
44
|
-
:ttl => cache && Blossom.get_seconds(*cache)
|
45
|
-
run Blossom::Base(root_file, index, options)
|
23
|
+
def self.info(message)
|
24
|
+
Kernel.warn "[Blossom] #{message}"
|
46
25
|
end
|
47
26
|
end
|
48
27
|
|
49
|
-
def Blossom
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
28
|
+
def Blossom(root_filename)
|
29
|
+
Blossom::Application.new(File.dirname(root_filename))
|
30
|
+
end
|
31
|
+
|
32
|
+
class Blossom::Application < Rack::Builder
|
33
|
+
def initialize(root)
|
34
|
+
super()
|
35
|
+
|
36
|
+
@root = root
|
37
|
+
|
38
|
+
determine_name!
|
39
|
+
load_configuration!
|
40
|
+
configure!
|
41
|
+
build_rack!
|
42
|
+
end
|
43
|
+
|
44
|
+
# --------------------------------------------------------
|
45
|
+
|
46
|
+
def compass_options
|
47
|
+
return \
|
48
|
+
:cache_dir => "tmp/sass-cache",
|
49
|
+
:http_images_path => "/",
|
50
|
+
:images_dir => @config.public_directory,
|
51
|
+
:line_comments => false,
|
52
|
+
:output_style => :compact,
|
53
|
+
:project_path => @root,
|
54
|
+
:sass_dir => ""
|
55
|
+
end
|
56
|
+
|
57
|
+
def coffee_options
|
58
|
+
return \
|
59
|
+
:cache => @config.cache_content?,
|
60
|
+
:static => false,
|
61
|
+
:ttl => @config.content_max_age,
|
62
|
+
:urls => "/"
|
63
|
+
end
|
64
|
+
|
65
|
+
def haml_options
|
66
|
+
return \
|
67
|
+
:format => :html5,
|
68
|
+
:attr_wrapper => '"'
|
69
|
+
end
|
70
|
+
|
71
|
+
def sass_options
|
72
|
+
Compass.sass_engine_options
|
73
|
+
end
|
74
|
+
|
75
|
+
# --------------------------------------------------------
|
76
|
+
|
77
|
+
def determine_name!
|
78
|
+
names = glob("*.blossom")
|
79
|
+
case names.size
|
80
|
+
when 0
|
81
|
+
Blossom.fail "Missing configuration file: NAME.blossom"
|
82
|
+
when 1
|
83
|
+
@name = names[0].sub(/\.blossom$/, '')
|
84
|
+
else
|
85
|
+
Blossom.fail "Multiple configuration files: #{names * ', '}"
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def load_configuration!
|
90
|
+
@config = Configuration.new(configuration_hash)
|
91
|
+
end
|
92
|
+
|
93
|
+
def configuration_hash
|
94
|
+
case result = YAML.load_file(configuration_filename)
|
95
|
+
when false then {} # Empty file.
|
96
|
+
when Hash then result
|
97
|
+
else Blossom.fail "Bad configuration file: #{configuration_filename}"
|
98
|
+
end
|
99
|
+
rescue Errno::ENOENT
|
100
|
+
{}
|
101
|
+
end
|
102
|
+
|
103
|
+
# --------------------------------------------------------
|
104
|
+
|
105
|
+
def configuration_filename
|
106
|
+
filename("#@name.blossom") end
|
107
|
+
def sinatra_code_filename
|
108
|
+
filename("#@name.sinatra.rb") end
|
109
|
+
def public_dirname
|
110
|
+
filename(@config.public_directory) end
|
111
|
+
|
112
|
+
def glob(glob)
|
113
|
+
Dir[filename(glob)].map { |name| File.basename(name) } end
|
114
|
+
def filename(*components)
|
115
|
+
File.join(@root, *components) end
|
116
|
+
|
117
|
+
# --------------------------------------------------------
|
118
|
+
|
119
|
+
def configure!
|
120
|
+
compass_options.each do |key, value|
|
121
|
+
Compass.configuration.send("#{key}=", value)
|
122
|
+
end
|
123
|
+
|
124
|
+
Compass.configure_sass_plugin!
|
125
|
+
end
|
126
|
+
|
127
|
+
def build_rack!
|
128
|
+
use_rack_normalize_domain!
|
129
|
+
use_rack_coffee!
|
130
|
+
run sinatra_app
|
131
|
+
end
|
132
|
+
|
133
|
+
def use_rack_normalize_domain!
|
134
|
+
if @config.strip_www?
|
135
|
+
use Rack::NormalizeDomain
|
136
|
+
Blossom.info "Normalizing domains by removing initial www."
|
137
|
+
else
|
138
|
+
Blossom.info "Not normalizing domains."
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
def use_rack_coffee!
|
143
|
+
if defined? Rack::Coffee
|
144
|
+
use Rack::Coffee, coffee_options
|
145
|
+
Blossom.info "Using CoffeeScript."
|
146
|
+
else
|
147
|
+
Blossom.info "Not using CoffeeScript."
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def sinatra_app
|
152
|
+
app = Sinatra.new
|
153
|
+
app.set :blossom, self
|
154
|
+
|
155
|
+
app.set :root, @root
|
156
|
+
app.set :index, @name.to_sym
|
157
|
+
|
158
|
+
app.set :views, @root
|
159
|
+
app.set :public, public_dirname
|
160
|
+
|
161
|
+
app.set :haml, haml_options
|
162
|
+
app.set :sass, sass_options
|
163
|
+
|
164
|
+
if custom_sinatra_code
|
165
|
+
app.class_eval(custom_sinatra_code)
|
166
|
+
end
|
167
|
+
|
168
|
+
# Need variable here for lexical scoping.
|
169
|
+
max_age = @config.max_age
|
170
|
+
app.before { cache_control :max_age => max_age }
|
171
|
+
|
172
|
+
app.register do
|
173
|
+
def path_exists? suffix
|
174
|
+
condition do
|
175
|
+
basename = File.basename(request.path_info)
|
176
|
+
File.exist? File.join(settings.root, "#{basename}.#{suffix}")
|
177
|
+
end
|
78
178
|
end
|
79
179
|
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
180
|
+
def file_exists? suffix
|
181
|
+
condition do
|
182
|
+
basename = File.basename(request.path_info)
|
183
|
+
barename = basename.sub(/\.[^.]*$/, '')
|
184
|
+
File.exist? File.join(settings.root, "#{barename}.#{suffix}")
|
185
|
+
end
|
186
|
+
end
|
187
|
+
end
|
188
|
+
|
189
|
+
@config.public_extensions.each do |extension|
|
190
|
+
app.get "/:name.#{extension}", :file_exists? => extension do
|
191
|
+
send_file "#{params[:name]}.#{extension}"
|
84
192
|
end
|
193
|
+
end
|
194
|
+
|
195
|
+
app.get "/:name.css", :file_exists? => :sass do
|
196
|
+
content_type :css
|
197
|
+
sass params[:name].to_sym
|
198
|
+
end
|
85
199
|
|
86
|
-
|
87
|
-
|
88
|
-
|
200
|
+
app.get "/:name", :path_exists? => :haml do
|
201
|
+
haml params[:name].to_sym
|
202
|
+
end
|
203
|
+
|
204
|
+
app.get "/" do
|
205
|
+
haml settings.index
|
206
|
+
end
|
207
|
+
|
208
|
+
app
|
209
|
+
end
|
210
|
+
|
211
|
+
def custom_sinatra_code
|
212
|
+
File.read(sinatra_code_filename) rescue nil
|
213
|
+
end
|
214
|
+
|
215
|
+
# --------------------------------------------------------
|
216
|
+
|
217
|
+
class Configuration < Struct.new(:user_data)
|
218
|
+
DEFAULTS = YAML.load <<"^D"
|
219
|
+
Public-Directory: public
|
220
|
+
Public-Extensions: js css html png jpg
|
221
|
+
Max-Cache-Time: 1 day
|
222
|
+
Remove-WWW-From-Domain: yes
|
223
|
+
^D
|
224
|
+
|
225
|
+
def public_directory
|
226
|
+
get("Public-Directory").string end
|
227
|
+
def strip_www?
|
228
|
+
get("Remove-WWW-From-Domain").boolean end
|
229
|
+
def max_age
|
230
|
+
get("Max-Cache-Time").duration end
|
231
|
+
def public_extensions
|
232
|
+
get("Public-Extensions").words end
|
233
|
+
|
234
|
+
private
|
235
|
+
|
236
|
+
def get(name)
|
237
|
+
if user_data.include? name
|
238
|
+
Value.new(user_data[name])
|
239
|
+
else
|
240
|
+
Value.new(DEFAULTS[name])
|
241
|
+
end
|
242
|
+
end
|
243
|
+
|
244
|
+
class Value < Struct.new(:value)
|
245
|
+
def string
|
246
|
+
value.to_s
|
247
|
+
end
|
248
|
+
|
249
|
+
def words
|
250
|
+
value.gsub(/^\s+|\s$/, "").split(/\s+/)
|
251
|
+
end
|
252
|
+
|
253
|
+
def boolean
|
254
|
+
if value == true or value == false
|
255
|
+
value
|
256
|
+
else
|
257
|
+
fail "Must be \`yes' or \`no\': #{name}"
|
258
|
+
end
|
89
259
|
end
|
90
|
-
|
91
|
-
|
92
|
-
if
|
93
|
-
|
94
|
-
{ 'Cache-Control' => "max-age=#{seconds}" }
|
260
|
+
|
261
|
+
def duration
|
262
|
+
if value =~ /^((?:\d+\.)?\d+) ([a-z]+?)s?$/
|
263
|
+
$1.to_f * time_unit($2.to_sym)
|
95
264
|
else
|
96
|
-
{}
|
265
|
+
error "Bad duration: #{value}"
|
97
266
|
end
|
98
267
|
end
|
99
|
-
end
|
100
268
|
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
269
|
+
private
|
270
|
+
|
271
|
+
def fail(message)
|
272
|
+
Blossom.fail "Configuration: #{value}: #{message}"
|
273
|
+
end
|
105
274
|
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
275
|
+
def time_unit(name)
|
276
|
+
case name
|
277
|
+
when :second then 1
|
278
|
+
when :minute then 60
|
279
|
+
when :hour then 60 * 60
|
280
|
+
when :day then 24 * time_unit(:hour)
|
281
|
+
when :week then 7 * time_unit(:day)
|
282
|
+
when :month then 30 * time_unit(:day)
|
283
|
+
when :year then 365 * time_unit(:day)
|
284
|
+
else fail "Unknown time unit: #{name}"
|
285
|
+
end
|
286
|
+
end
|
113
287
|
end
|
114
288
|
end
|
115
289
|
end
|
metadata
CHANGED
@@ -1,13 +1,12 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: blossom
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
|
5
|
-
prerelease:
|
4
|
+
prerelease: false
|
6
5
|
segments:
|
7
6
|
- 0
|
7
|
+
- 1
|
8
8
|
- 0
|
9
|
-
|
10
|
-
version: 0.0.12
|
9
|
+
version: 0.1.0
|
11
10
|
platform: ruby
|
12
11
|
authors:
|
13
12
|
- Daniel Brockman
|
@@ -15,81 +14,70 @@ autorequire:
|
|
15
14
|
bindir: bin
|
16
15
|
cert_chain: []
|
17
16
|
|
18
|
-
date:
|
17
|
+
date: 2012-01-10 00:00:00 +01:00
|
18
|
+
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
21
21
|
name: sinatra
|
22
22
|
prerelease: false
|
23
23
|
requirement: &id001 !ruby/object:Gem::Requirement
|
24
|
-
none: false
|
25
24
|
requirements:
|
26
25
|
- - ~>
|
27
26
|
- !ruby/object:Gem::Version
|
28
|
-
hash: 23
|
29
27
|
segments:
|
30
28
|
- 1
|
31
29
|
- 0
|
32
|
-
|
33
|
-
version: 1.0.0
|
30
|
+
version: "1.0"
|
34
31
|
type: :runtime
|
35
32
|
version_requirements: *id001
|
36
33
|
- !ruby/object:Gem::Dependency
|
37
|
-
name:
|
34
|
+
name: sass
|
38
35
|
prerelease: false
|
39
36
|
requirement: &id002 !ruby/object:Gem::Requirement
|
40
|
-
none: false
|
41
37
|
requirements:
|
42
38
|
- - ~>
|
43
39
|
- !ruby/object:Gem::Version
|
44
|
-
hash: 7
|
45
40
|
segments:
|
46
41
|
- 3
|
47
|
-
-
|
48
|
-
-
|
49
|
-
version: 3.
|
42
|
+
- 1
|
43
|
+
- 1
|
44
|
+
version: 3.1.1
|
50
45
|
type: :runtime
|
51
46
|
version_requirements: *id002
|
52
47
|
- !ruby/object:Gem::Dependency
|
53
|
-
name:
|
48
|
+
name: haml
|
54
49
|
prerelease: false
|
55
50
|
requirement: &id003 !ruby/object:Gem::Requirement
|
56
|
-
none: false
|
57
51
|
requirements:
|
58
52
|
- - ~>
|
59
53
|
- !ruby/object:Gem::Version
|
60
|
-
hash: 55
|
61
54
|
segments:
|
62
|
-
-
|
63
|
-
-
|
64
|
-
-
|
65
|
-
version:
|
55
|
+
- 3
|
56
|
+
- 1
|
57
|
+
- 1
|
58
|
+
version: 3.1.1
|
66
59
|
type: :runtime
|
67
60
|
version_requirements: *id003
|
68
61
|
- !ruby/object:Gem::Dependency
|
69
|
-
name:
|
62
|
+
name: compass
|
70
63
|
prerelease: false
|
71
64
|
requirement: &id004 !ruby/object:Gem::Requirement
|
72
|
-
none: false
|
73
65
|
requirements:
|
74
66
|
- - ~>
|
75
67
|
- !ruby/object:Gem::Version
|
76
|
-
hash: 23
|
77
68
|
segments:
|
78
69
|
- 0
|
79
|
-
-
|
80
|
-
|
81
|
-
version: 0.2.0
|
70
|
+
- 10
|
71
|
+
version: "0.10"
|
82
72
|
type: :runtime
|
83
73
|
version_requirements: *id004
|
84
74
|
- !ruby/object:Gem::Dependency
|
85
|
-
name:
|
75
|
+
name: rack-normalize-domain
|
86
76
|
prerelease: false
|
87
77
|
requirement: &id005 !ruby/object:Gem::Requirement
|
88
|
-
none: false
|
89
78
|
requirements:
|
90
79
|
- - ~>
|
91
80
|
- !ruby/object:Gem::Version
|
92
|
-
hash: 29
|
93
81
|
segments:
|
94
82
|
- 0
|
95
83
|
- 0
|
@@ -98,8 +86,7 @@ dependencies:
|
|
98
86
|
type: :runtime
|
99
87
|
version_requirements: *id005
|
100
88
|
description:
|
101
|
-
email:
|
102
|
-
- daniel@brockman.se
|
89
|
+
email: daniel@gointeractive.se
|
103
90
|
executables:
|
104
91
|
- blossom
|
105
92
|
extensions: []
|
@@ -107,8 +94,10 @@ extensions: []
|
|
107
94
|
extra_rdoc_files: []
|
108
95
|
|
109
96
|
files:
|
110
|
-
- lib/blossom.rb
|
111
97
|
- bin/blossom
|
98
|
+
- lib/blossom.rb
|
99
|
+
- lib/blossom/version.rb
|
100
|
+
has_rdoc: true
|
112
101
|
homepage: http://github.com/dbrock/blossom
|
113
102
|
licenses: []
|
114
103
|
|
@@ -118,27 +107,23 @@ rdoc_options: []
|
|
118
107
|
require_paths:
|
119
108
|
- lib
|
120
109
|
required_ruby_version: !ruby/object:Gem::Requirement
|
121
|
-
none: false
|
122
110
|
requirements:
|
123
111
|
- - ">="
|
124
112
|
- !ruby/object:Gem::Version
|
125
|
-
hash: 3
|
126
113
|
segments:
|
127
114
|
- 0
|
128
115
|
version: "0"
|
129
116
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
130
|
-
none: false
|
131
117
|
requirements:
|
132
118
|
- - ">="
|
133
119
|
- !ruby/object:Gem::Version
|
134
|
-
hash: 3
|
135
120
|
segments:
|
136
121
|
- 0
|
137
122
|
version: "0"
|
138
123
|
requirements: []
|
139
124
|
|
140
125
|
rubyforge_project:
|
141
|
-
rubygems_version: 1.
|
126
|
+
rubygems_version: 1.3.6
|
142
127
|
signing_key:
|
143
128
|
specification_version: 3
|
144
129
|
summary: Quick-start web development with Haml, Sass and Compass.
|