massimo 0.7.5 → 0.8.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.
- data/.document +5 -0
- data/.gitignore +6 -0
- data/Gemfile +2 -0
- data/Gemfile.lock +88 -0
- data/README.md +3 -1
- data/Rakefile +8 -0
- data/bin/massimo +1 -17
- data/lib/massimo/cli.rb +63 -0
- data/lib/massimo/config.rb +8 -5
- data/lib/massimo/javascript.rb +10 -2
- data/lib/massimo/reloader.rb +37 -0
- data/lib/massimo/site.rb +24 -21
- data/lib/massimo/templates/site/config.rb +18 -0
- data/lib/massimo/templates/site/javascripts/main.js +0 -0
- data/lib/massimo/templates/site/pages/index.erb +5 -0
- data/lib/massimo/templates/site/public/.empty_directory +0 -0
- data/lib/massimo/templates/site/stylesheets/main.scss +0 -0
- data/lib/massimo/templates/site/views/layouts/main.erb +12 -0
- data/lib/massimo/ui.rb +2 -2
- data/lib/massimo/version.rb +1 -1
- data/lib/massimo/watcher.rb +22 -7
- data/lib/massimo.rb +3 -11
- data/massimo.gemspec +40 -0
- data/spec/massimo/cli_spec.rb +254 -0
- data/spec/massimo/config_spec.rb +97 -0
- data/spec/massimo/helpers_spec.rb +26 -0
- data/spec/massimo/javascript_spec.rb +120 -0
- data/spec/massimo/massimo_spec.rb +23 -0
- data/spec/massimo/page_spec.rb +224 -0
- data/spec/massimo/reloader_spec.rb +135 -0
- data/spec/massimo/resource_spec.rb +208 -0
- data/spec/massimo/server_spec.rb +35 -0
- data/spec/massimo/site_spec.rb +299 -0
- data/spec/massimo/stylesheet_spec.rb +77 -0
- data/spec/massimo/ui_spec.rb +109 -0
- data/spec/massimo/view_spec.rb +46 -0
- data/spec/massimo/watcher_spec.rb +122 -0
- data/spec/spec_helper.rb +65 -0
- data/spec/support/matchers/be_a_directory_matcher.rb +5 -0
- data/spec/support/matchers/be_a_file_matcher.rb +26 -0
- metadata +74 -20
- data/lib/massimo/commands/base.rb +0 -85
- data/lib/massimo/commands/build.rb +0 -19
- data/lib/massimo/commands/generate.rb +0 -62
- data/lib/massimo/commands/help.rb +0 -34
- data/lib/massimo/commands/server.rb +0 -24
- data/lib/massimo/commands/version.rb +0 -9
- data/lib/massimo/commands/watch.rb +0 -16
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,65 @@
|
|
1
|
+
lib = File.expand_path('../../lib', __FILE__)
|
2
|
+
$:.unshift(lib) unless $:.include?(lib)
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'rspec'
|
6
|
+
require 'rr'
|
7
|
+
require 'construct'
|
8
|
+
require 'rack/test'
|
9
|
+
require 'unindent'
|
10
|
+
require 'sass'
|
11
|
+
require 'less'
|
12
|
+
require 'coffee-script'
|
13
|
+
require 'sprockets'
|
14
|
+
require 'jsmin'
|
15
|
+
require 'packr'
|
16
|
+
require 'yui/compressor'
|
17
|
+
require 'closure-compiler'
|
18
|
+
require 'growl'
|
19
|
+
require 'massimo'
|
20
|
+
|
21
|
+
# Requires supporting files with custom matchers and macros, etc,
|
22
|
+
# in ./support/ and its subdirectories.
|
23
|
+
Dir["#{File.dirname(__FILE__)}/support/**/*.rb"].each { |f| require f }
|
24
|
+
|
25
|
+
RSpec.configure do |config|
|
26
|
+
config.include Construct::Helpers
|
27
|
+
config.include Rack::Test::Methods
|
28
|
+
config.mock_with :rr
|
29
|
+
|
30
|
+
config.before :each do
|
31
|
+
stub($stdout).puts
|
32
|
+
stub(Growl).notify
|
33
|
+
end
|
34
|
+
|
35
|
+
config.after :each do
|
36
|
+
Massimo.site = nil
|
37
|
+
end
|
38
|
+
|
39
|
+
# Builds a construct with a single file in it.
|
40
|
+
def with_file(filename, content = nil)
|
41
|
+
within_construct do |construct|
|
42
|
+
construct.file filename, content
|
43
|
+
yield
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
# Captures the given stream and returns it:
|
48
|
+
#
|
49
|
+
# stream = capture(:stdout) { puts "Cool" }
|
50
|
+
# stream # => "Cool\n"
|
51
|
+
#
|
52
|
+
def capture(stream)
|
53
|
+
begin
|
54
|
+
stream = stream.to_s
|
55
|
+
eval "$#{stream} = StringIO.new"
|
56
|
+
yield
|
57
|
+
result = eval("$#{stream}").string
|
58
|
+
ensure
|
59
|
+
eval("$#{stream} = #{stream.upcase}")
|
60
|
+
end
|
61
|
+
|
62
|
+
result
|
63
|
+
end
|
64
|
+
alias :silence :capture
|
65
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
RSpec::Matchers.define :be_a_file do
|
2
|
+
match do |path|
|
3
|
+
@path = path.to_s
|
4
|
+
file? && content_matches?
|
5
|
+
end
|
6
|
+
|
7
|
+
def with_content(content)
|
8
|
+
@content = content
|
9
|
+
self
|
10
|
+
end
|
11
|
+
|
12
|
+
def file?
|
13
|
+
File.file?(@path)
|
14
|
+
end
|
15
|
+
|
16
|
+
def content_matches?
|
17
|
+
case @content
|
18
|
+
when String
|
19
|
+
File.read(@path).strip == @content.strip
|
20
|
+
when Regexp
|
21
|
+
File.read(@path) =~ @content
|
22
|
+
else
|
23
|
+
true
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
-
|
8
|
-
-
|
9
|
-
version: 0.
|
7
|
+
- 8
|
8
|
+
- 0
|
9
|
+
version: 0.8.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Pete Browne
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date:
|
17
|
+
date: 2011-01-25 00:00:00 -06:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -102,9 +102,9 @@ dependencies:
|
|
102
102
|
- !ruby/object:Gem::Version
|
103
103
|
segments:
|
104
104
|
- 1
|
105
|
-
-
|
105
|
+
- 2
|
106
106
|
- 0
|
107
|
-
version: 1.
|
107
|
+
version: 1.2.0
|
108
108
|
type: :runtime
|
109
109
|
version_requirements: *id006
|
110
110
|
- !ruby/object:Gem::Dependency
|
@@ -132,9 +132,9 @@ dependencies:
|
|
132
132
|
- !ruby/object:Gem::Version
|
133
133
|
segments:
|
134
134
|
- 2
|
135
|
+
- 4
|
135
136
|
- 0
|
136
|
-
|
137
|
-
version: 2.0.0
|
137
|
+
version: 2.4.0
|
138
138
|
type: :development
|
139
139
|
version_requirements: *id008
|
140
140
|
- !ruby/object:Gem::Dependency
|
@@ -288,9 +288,39 @@ dependencies:
|
|
288
288
|
type: :development
|
289
289
|
version_requirements: *id018
|
290
290
|
- !ruby/object:Gem::Dependency
|
291
|
-
name:
|
291
|
+
name: yui-compressor
|
292
292
|
prerelease: false
|
293
293
|
requirement: &id019 !ruby/object:Gem::Requirement
|
294
|
+
none: false
|
295
|
+
requirements:
|
296
|
+
- - ~>
|
297
|
+
- !ruby/object:Gem::Version
|
298
|
+
segments:
|
299
|
+
- 0
|
300
|
+
- 9
|
301
|
+
- 0
|
302
|
+
version: 0.9.0
|
303
|
+
type: :development
|
304
|
+
version_requirements: *id019
|
305
|
+
- !ruby/object:Gem::Dependency
|
306
|
+
name: closure-compiler
|
307
|
+
prerelease: false
|
308
|
+
requirement: &id020 !ruby/object:Gem::Requirement
|
309
|
+
none: false
|
310
|
+
requirements:
|
311
|
+
- - ~>
|
312
|
+
- !ruby/object:Gem::Version
|
313
|
+
segments:
|
314
|
+
- 0
|
315
|
+
- 3
|
316
|
+
- 0
|
317
|
+
version: 0.3.0
|
318
|
+
type: :development
|
319
|
+
version_requirements: *id020
|
320
|
+
- !ruby/object:Gem::Dependency
|
321
|
+
name: growl
|
322
|
+
prerelease: false
|
323
|
+
requirement: &id021 !ruby/object:Gem::Requirement
|
294
324
|
none: false
|
295
325
|
requirements:
|
296
326
|
- - ~>
|
@@ -301,7 +331,7 @@ dependencies:
|
|
301
331
|
- 0
|
302
332
|
version: 1.0.0
|
303
333
|
type: :development
|
304
|
-
version_requirements: *
|
334
|
+
version_requirements: *id021
|
305
335
|
description: Massimo builds HTML, Javascript, and CSS Files from your source.
|
306
336
|
email: me@petebrowne.com
|
307
337
|
executables:
|
@@ -311,29 +341,53 @@ extensions: []
|
|
311
341
|
extra_rdoc_files: []
|
312
342
|
|
313
343
|
files:
|
344
|
+
- .document
|
345
|
+
- .gitignore
|
346
|
+
- Gemfile
|
347
|
+
- Gemfile.lock
|
348
|
+
- LICENSE
|
349
|
+
- README.md
|
350
|
+
- Rakefile
|
314
351
|
- bin/massimo
|
315
|
-
- lib/massimo
|
316
|
-
- lib/massimo/
|
317
|
-
- lib/massimo/commands/generate.rb
|
318
|
-
- lib/massimo/commands/help.rb
|
319
|
-
- lib/massimo/commands/server.rb
|
320
|
-
- lib/massimo/commands/version.rb
|
321
|
-
- lib/massimo/commands/watch.rb
|
352
|
+
- lib/massimo.rb
|
353
|
+
- lib/massimo/cli.rb
|
322
354
|
- lib/massimo/config.rb
|
323
355
|
- lib/massimo/helpers.rb
|
324
356
|
- lib/massimo/javascript.rb
|
325
357
|
- lib/massimo/page.rb
|
358
|
+
- lib/massimo/reloader.rb
|
326
359
|
- lib/massimo/resource.rb
|
327
360
|
- lib/massimo/server.rb
|
328
361
|
- lib/massimo/site.rb
|
329
362
|
- lib/massimo/stylesheet.rb
|
363
|
+
- lib/massimo/templates/site/config.rb
|
364
|
+
- lib/massimo/templates/site/javascripts/main.js
|
365
|
+
- lib/massimo/templates/site/pages/index.erb
|
366
|
+
- lib/massimo/templates/site/public/.empty_directory
|
367
|
+
- lib/massimo/templates/site/stylesheets/main.scss
|
368
|
+
- lib/massimo/templates/site/views/layouts/main.erb
|
330
369
|
- lib/massimo/ui.rb
|
331
370
|
- lib/massimo/version.rb
|
332
371
|
- lib/massimo/view.rb
|
333
372
|
- lib/massimo/watcher.rb
|
334
|
-
-
|
335
|
-
-
|
336
|
-
-
|
373
|
+
- massimo.gemspec
|
374
|
+
- spec/massimo/cli_spec.rb
|
375
|
+
- spec/massimo/config_spec.rb
|
376
|
+
- spec/massimo/helpers_spec.rb
|
377
|
+
- spec/massimo/javascript_spec.rb
|
378
|
+
- spec/massimo/massimo_spec.rb
|
379
|
+
- spec/massimo/page_spec.rb
|
380
|
+
- spec/massimo/reloader_spec.rb
|
381
|
+
- spec/massimo/resource_spec.rb
|
382
|
+
- spec/massimo/server_spec.rb
|
383
|
+
- spec/massimo/site_spec.rb
|
384
|
+
- spec/massimo/stylesheet_spec.rb
|
385
|
+
- spec/massimo/ui_spec.rb
|
386
|
+
- spec/massimo/view_spec.rb
|
387
|
+
- spec/massimo/watcher_spec.rb
|
388
|
+
- spec/spec_helper.rb
|
389
|
+
- spec/support/matchers/be_a_directory_matcher.rb
|
390
|
+
- spec/support/matchers/be_a_file_matcher.rb
|
337
391
|
has_rdoc: true
|
338
392
|
homepage: http://petebrowne.github.com/massimo/
|
339
393
|
licenses: []
|
@@ -1,85 +0,0 @@
|
|
1
|
-
require 'optparse'
|
2
|
-
require 'thor/actions'
|
3
|
-
require 'thor/shell'
|
4
|
-
|
5
|
-
module Massimo
|
6
|
-
module Commands
|
7
|
-
class Base
|
8
|
-
include Thor::Actions
|
9
|
-
include Thor::Shell
|
10
|
-
|
11
|
-
attr_reader :options, :parser
|
12
|
-
|
13
|
-
def self.run
|
14
|
-
command = self.new
|
15
|
-
command.parse
|
16
|
-
command.run
|
17
|
-
end
|
18
|
-
|
19
|
-
def initialize
|
20
|
-
@options = {}
|
21
|
-
@parser = OptionParser.new
|
22
|
-
|
23
|
-
parser.banner = "#{banner}\n" if respond_to?(:banner)
|
24
|
-
common_options
|
25
|
-
add_options if respond_to?(:add_options)
|
26
|
-
|
27
|
-
# needed for Thor::Actions to work
|
28
|
-
self.destination_root = nil
|
29
|
-
end
|
30
|
-
|
31
|
-
def common_options
|
32
|
-
parser.on('-c', '--config FILE', 'Path to the config file') do |config|
|
33
|
-
options[:config] = config
|
34
|
-
end
|
35
|
-
|
36
|
-
parser.on('-s', '--source-path PATH', 'Path to the source dir') do |path|
|
37
|
-
options[:source_path] = path
|
38
|
-
end
|
39
|
-
|
40
|
-
parser.on('-o', '--output-path PATH', 'Path to the output dir') do |path|
|
41
|
-
options[:output_path] = path
|
42
|
-
end
|
43
|
-
|
44
|
-
parser.on('-e', '--environment ENV', 'Sets the Site environment') do |env|
|
45
|
-
options[:environment] = env
|
46
|
-
end
|
47
|
-
|
48
|
-
parser.on('-p', '--production', "Sets the Site environment to 'production'") do |production|
|
49
|
-
options[:environment] = 'production'
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def parse
|
54
|
-
begin
|
55
|
-
parser.parse(ARGV)
|
56
|
-
rescue
|
57
|
-
say parser
|
58
|
-
exit
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
def run
|
63
|
-
end
|
64
|
-
|
65
|
-
def site
|
66
|
-
@site ||= Massimo::Site.new(config_file(:yml)).tap do |site|
|
67
|
-
site.config.environment = options[:environment] if options[:environment]
|
68
|
-
site.config.source_path = options[:source_path] if options[:source_path]
|
69
|
-
site.config.output_path = options[:output_path] if options[:output_path]
|
70
|
-
if config_rb = config_file(:rb)
|
71
|
-
site.instance_eval File.read(config_rb)
|
72
|
-
end
|
73
|
-
end
|
74
|
-
end
|
75
|
-
|
76
|
-
def config_file(ext)
|
77
|
-
if options[:config] && File.extname(options[:config]) == ".#{ext}"
|
78
|
-
options[:config]
|
79
|
-
elsif File.exist?("config.#{ext}")
|
80
|
-
"config.#{ext}"
|
81
|
-
end
|
82
|
-
end
|
83
|
-
end
|
84
|
-
end
|
85
|
-
end
|
@@ -1,19 +0,0 @@
|
|
1
|
-
module Massimo
|
2
|
-
module Commands
|
3
|
-
class Build < Base
|
4
|
-
def banner
|
5
|
-
%{
|
6
|
-
#{Massimo::UI.color('massimo build', :cyan)}
|
7
|
-
Builds the site from the source files.
|
8
|
-
}
|
9
|
-
end
|
10
|
-
|
11
|
-
def run
|
12
|
-
exit Massimo::UI.report_errors {
|
13
|
-
site.process
|
14
|
-
Massimo::UI.say 'massimo has built your site', :growl => true
|
15
|
-
}
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
@@ -1,62 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/string/starts_ends_with'
|
2
|
-
require 'active_support/inflector'
|
3
|
-
|
4
|
-
module Massimo
|
5
|
-
module Commands
|
6
|
-
class Generate < Base
|
7
|
-
def banner
|
8
|
-
%{
|
9
|
-
#{Massimo::UI.color('massimo generate SITE_OR_RESOURCE [FILE]', :cyan)}
|
10
|
-
Generates a new site:
|
11
|
-
massimo generate myblog
|
12
|
-
Within a massimo project, you can generate a new resource file:
|
13
|
-
massimo generate page contact.haml
|
14
|
-
}
|
15
|
-
end
|
16
|
-
|
17
|
-
def add_options
|
18
|
-
@site_or_resource = ARGV.shift
|
19
|
-
|
20
|
-
if ARGV.first && !ARGV.first.starts_with?('-')
|
21
|
-
@file = ARGV.shift
|
22
|
-
end
|
23
|
-
|
24
|
-
options.merge!(
|
25
|
-
:page_ext => 'haml',
|
26
|
-
:javascript_ext => 'js',
|
27
|
-
:stylesheet_ext => 'sass'
|
28
|
-
)
|
29
|
-
|
30
|
-
parser.on('--page', '--page-ext EXT', 'The extension used for generated Pages and Views') do |ext|
|
31
|
-
options[:page_ext] = ext
|
32
|
-
end
|
33
|
-
|
34
|
-
parser.on('--js', '--javascript-ext EXT', 'The extension used for generated Javascripts') do |ext|
|
35
|
-
options[:javascript_ext] = ext
|
36
|
-
end
|
37
|
-
|
38
|
-
parser.on('--css', '--stylesheet-ext EXT', 'The extension used for generated Stylesheets') do |ext|
|
39
|
-
options[:stylesheet_ext] = ext
|
40
|
-
end
|
41
|
-
end
|
42
|
-
|
43
|
-
def run
|
44
|
-
if @file
|
45
|
-
create_file File.join(site.config.path_for(@site_or_resource.pluralize), @file)
|
46
|
-
else
|
47
|
-
empty_directory @site_or_resource
|
48
|
-
inside @site_or_resource do
|
49
|
-
site.resources.each do |resource|
|
50
|
-
empty_directory(resource.path)
|
51
|
-
end
|
52
|
-
create_file File.join(Massimo::Page.path, "index.#{options[:page_ext]}")
|
53
|
-
create_file File.join(Massimo::Javascript.path, "main.#{options[:javascript_ext]}")
|
54
|
-
create_file File.join(Massimo::Stylesheet.path, "main.#{options[:stylesheet_ext]}")
|
55
|
-
create_file File.join(Massimo::View.path, "layouts/main.#{options[:page_ext]}")
|
56
|
-
empty_directory site.config.output_path
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
@@ -1,34 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/string/conversions'
|
2
|
-
|
3
|
-
module Massimo
|
4
|
-
module Commands
|
5
|
-
class Help < Base
|
6
|
-
def add_options
|
7
|
-
command_name = ARGV.shift
|
8
|
-
unless command_name.nil? or %w( help version ).include?(command_name)
|
9
|
-
@command = "Massimo::Commands::#{command_name.camelize}".constantize rescue nil
|
10
|
-
end
|
11
|
-
end
|
12
|
-
|
13
|
-
def run
|
14
|
-
if @command
|
15
|
-
puts @command.new.parser
|
16
|
-
else
|
17
|
-
puts %{
|
18
|
-
#{Massimo::UI.color('massimo', :cyan)}
|
19
|
-
a static website builder
|
20
|
-
|
21
|
-
Commands:
|
22
|
-
massimo build # Builds the site
|
23
|
-
massimo generate SITE_OR_RESOURCE [FILE] # Generates a new site
|
24
|
-
Optionally generates a resource file
|
25
|
-
massimo help [COMMAND] # Shows info about a specific command
|
26
|
-
massimo server [PORT] # Runs a local web server
|
27
|
-
massimo version # Displays current version
|
28
|
-
massimo watch # Watches your files for changes
|
29
|
-
}
|
30
|
-
end
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
require 'active_support/core_ext/string/starts_ends_with'
|
2
|
-
|
3
|
-
module Massimo
|
4
|
-
module Commands
|
5
|
-
class Server < Base
|
6
|
-
def banner
|
7
|
-
%{
|
8
|
-
#{Massimo::UI.color('massimo server [PORT]', :cyan)}
|
9
|
-
Runs a local Rack based web server on the given port.
|
10
|
-
}
|
11
|
-
end
|
12
|
-
|
13
|
-
def add_options
|
14
|
-
if ARGV.first && !ARGV.first.starts_with?('-')
|
15
|
-
@port = ARGV.shift
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
def run
|
20
|
-
Massimo::Server.start(site, (@port || 3000).to_i)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,16 +0,0 @@
|
|
1
|
-
module Massimo
|
2
|
-
module Commands
|
3
|
-
class Watch < Base
|
4
|
-
def banner
|
5
|
-
%{
|
6
|
-
#{Massimo::UI.color('massimo watch', :cyan)}
|
7
|
-
Watches your files for changes and automatically builds the site.
|
8
|
-
}
|
9
|
-
end
|
10
|
-
|
11
|
-
def run
|
12
|
-
Massimo::Watcher.start(site)
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|