middleman 0.14.1 → 0.99.0.pre

Sign up to get free protection for your applications and to get access to all the features.
Files changed (44) hide show
  1. data/Rakefile +14 -18
  2. data/VERSION +1 -1
  3. data/features/automatic_image_sizes.feature +7 -7
  4. data/features/cache_buster.feature +10 -10
  5. data/features/minify_css.feature +10 -10
  6. data/features/minify_javascript.feature +6 -6
  7. data/features/step_definitions/asset_host_steps.rb +1 -0
  8. data/features/step_definitions/middleman_steps.rb +1 -1
  9. data/lib/middleman.rb +1 -18
  10. data/lib/middleman/assets.rb +33 -0
  11. data/lib/middleman/base.rb +25 -66
  12. data/lib/middleman/builder.rb +8 -4
  13. data/lib/middleman/features.rb +39 -0
  14. data/lib/middleman/features/asset_host.rb +16 -19
  15. data/lib/middleman/features/automatic_image_sizes.rb +24 -24
  16. data/lib/middleman/{fastimage.rb → features/automatic_image_sizes/fastimage.rb} +0 -0
  17. data/lib/middleman/features/cache_buster.rb +31 -38
  18. data/lib/middleman/{helpers.rb → features/default_helpers.rb} +8 -11
  19. data/lib/middleman/features/livereload.rb +19 -0
  20. data/lib/middleman/features/minify_css.rb +9 -0
  21. data/lib/middleman/features/minify_javascript.rb +15 -17
  22. data/lib/middleman/features/minify_javascript/rack.rb +31 -0
  23. data/lib/middleman/features/relative_assets.rb +29 -40
  24. data/lib/middleman/features/slickmap.rb +69 -70
  25. data/lib/middleman/features/smush_pngs.rb +8 -6
  26. data/lib/middleman/features/ugly_haml.rb +7 -0
  27. data/lib/middleman/renderers.rb +26 -0
  28. data/lib/middleman/renderers/coffee.rb +28 -0
  29. data/lib/middleman/renderers/haml.rb +2 -25
  30. data/lib/middleman/renderers/sass.rb +40 -87
  31. data/lib/middleman/template/init.rbt +30 -7
  32. data/middleman.gemspec +58 -69
  33. data/spec/builder_spec.rb +10 -4
  34. data/spec/fixtures/sample/views/stylesheets/site_scss.css.scss +1 -0
  35. data/spec/fixtures/sample/views/stylesheets/test_less.css.less +5 -0
  36. metadata +125 -113
  37. data/lib/middleman/rack/minify_css.rb +0 -25
  38. data/lib/middleman/rack/minify_javascript.rb +0 -25
  39. data/lib/middleman/rack/sprockets.rb +0 -61
  40. data/lib/middleman/renderers/builder.rb +0 -23
  41. data/lib/middleman/renderers/erb.rb +0 -24
  42. data/lib/middleman/renderers/less.rb +0 -23
  43. data/spec/fixtures/sample/public/javascripts/to-be-included.js +0 -1
  44. data/spec/fixtures/sample/views/javascripts/empty-with-include.js +0 -1
data/Rakefile CHANGED
@@ -13,24 +13,20 @@ begin
13
13
  gem.authors = ["Thomas Reynolds"]
14
14
  gem.rubyforge_project = "middleman"
15
15
  gem.executables = %w(mm-init mm-build mm-server)
16
- gem.add_dependency("rack")
17
- gem.add_dependency("thin")
18
-
19
- gem.add_dependency("shotgun", ">=0.8")
20
- gem.add_dependency("templater")
21
- gem.add_dependency("sprockets")
22
- gem.add_dependency("sinatra", ">=1.0")
23
- gem.add_dependency("sinatra-content-for")
24
- gem.add_dependency("less")
25
- gem.add_dependency("builder")
26
- gem.add_dependency("rack-test")
27
- gem.add_dependency("yui-compressor")
28
- gem.add_dependency("haml", ">=3.0")
29
- gem.add_dependency("compass", ">=0.10")
30
- gem.add_dependency("fancy-buttons")
31
- gem.add_dependency("json_pure")
32
- gem.add_dependency("smusher")
33
- gem.add_dependency("compass-slickmap")
16
+ gem.add_dependency("rack", "~>1.0")
17
+ gem.add_dependency("thin", "~>1.2.0")
18
+ gem.add_dependency("shotgun", "~>0.8.0")
19
+ gem.add_dependency("templater", "~>1.0.0")
20
+ gem.add_dependency("sinatra", "~>1.0")
21
+ gem.add_dependency("sinatra-content-for", "~>0.2.0")
22
+ gem.add_dependency("rack-test", "~>0.5.0")
23
+ gem.add_dependency("yui-compressor", "~>0.9.0")
24
+ gem.add_dependency("haml", "~>3.0")
25
+ gem.add_dependency("compass", "~>0.10.0")
26
+ gem.add_dependency("json_pure", "~>1.4.0")
27
+ gem.add_dependency("smusher", "~>0.4.5")
28
+ gem.add_dependency("compass-slickmap", "~>0.3.0")
29
+ # gem.add_dependency("livereload", "~>1.4.0")
34
30
 
35
31
  gem.add_development_dependency("rspec")
36
32
  gem.add_development_dependency("cucumber")
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.14.1
1
+ 0.99.0.pre
@@ -1,14 +1,14 @@
1
1
  Feature: Automatically detect and insert image dimensions into tags
2
2
  In order to speed up development and appease YSlow
3
-
4
- Scenario: Rendering an image with the feature enabled
5
- Given "automatic_image_sizes" feature is "enabled"
6
- When I go to "/auto-image-sizes.html"
7
- Then I should see "width="
8
- And I should see "height="
9
3
 
10
4
  Scenario: Rendering an image with the feature disabled
11
5
  Given "automatic_image_sizes" feature is "disabled"
12
6
  When I go to "/auto-image-sizes.html"
13
7
  Then I should not see "width="
14
- And I should not see "height="
8
+ And I should not see "height="
9
+
10
+ Scenario: Rendering an image with the feature enabled
11
+ Given "automatic_image_sizes" feature is "enabled"
12
+ When I go to "/auto-image-sizes.html"
13
+ Then I should see "width="
14
+ And I should see "height="
@@ -1,15 +1,5 @@
1
1
  Feature: Generate mtime-based query string for busting browser caches
2
2
  In order to display the most recent content for IE & CDNs and appease YSlow
3
-
4
- Scenario: Rendering css with the feature enabled
5
- Given "cache_buster" feature is "enabled"
6
- When I go to "/stylesheets/relative_assets.css"
7
- Then I should see "?"
8
-
9
- Scenario: Rendering html with the feature enabled
10
- Given "cache_buster" feature is "enabled"
11
- When I go to "/cache-buster.html"
12
- Then I should not see "?"
13
3
 
14
4
  Scenario: Rendering css with the feature disabled
15
5
  Given "cache_buster" feature is "disabled"
@@ -19,4 +9,14 @@ Feature: Generate mtime-based query string for busting browser caches
19
9
  Scenario: Rendering html with the feature disabled
20
10
  Given "cache_buster" feature is "disabled"
21
11
  When I go to "/cache-buster.html"
12
+ Then I should not see "?"
13
+
14
+ Scenario: Rendering css with the feature enabled
15
+ Given "cache_buster" feature is "enabled"
16
+ When I go to "/stylesheets/relative_assets.css"
17
+ Then I should see "?"
18
+
19
+ Scenario: Rendering html with the feature enabled
20
+ Given "cache_buster" feature is "enabled"
21
+ When I go to "/cache-buster.html"
22
22
  Then I should not see "?"
@@ -1,22 +1,22 @@
1
1
  Feature: Minify CSS
2
2
  In order reduce bytes sent to client and appease YSlow
3
-
4
- Scenario: Rendering inline css with the feature enabled
5
- Given "minify_css" feature is "enabled"
6
- When I go to "/inline-css.html"
7
- Then I should see "1" lines
8
3
 
9
4
  Scenario: Rendering inline css with the feature disabled
10
5
  Given "minify_css" feature is "disabled"
11
6
  When I go to "/inline-css.html"
12
7
  Then I should see "4" lines
13
8
 
14
- Scenario: Rendering external css with the feature enabled
15
- Given "minify_css" feature is "enabled"
9
+ Scenario: Rendering external css with the feature disabled
10
+ Given "minify_css" feature is "disabled"
16
11
  When I go to "/stylesheets/site.css"
12
+ Then I should see "51" lines
13
+
14
+ Scenario: Rendering inline css with the feature enabled
15
+ Given "minify_css" feature is "enabled"
16
+ When I go to "/inline-css.html"
17
17
  Then I should see "1" lines
18
18
 
19
- Scenario: Rendering external css with the feature disabled
20
- Given "minify_css" feature is "disabled"
19
+ Scenario: Rendering external css with the feature enabled
20
+ Given "minify_css" feature is "enabled"
21
21
  When I go to "/stylesheets/site.css"
22
- Then I should see "51" lines
22
+ Then I should see "1" lines
@@ -1,12 +1,12 @@
1
1
  Feature: Minify Javascript
2
2
  In order reduce bytes sent to client and appease YSlow
3
3
 
4
- Scenario: Rendering inline js with the feature enabled
5
- Given "minify_javascript" feature is "enabled"
6
- When I go to "/inline-js.html"
7
- Then I should see "1" lines
8
-
9
4
  Scenario: Rendering inline js with the feature disabled
10
5
  Given "minify_javascript" feature is "disabled"
11
6
  When I go to "/inline-js.html"
12
- Then I should see "10" lines
7
+ Then I should see "10" lines
8
+
9
+ Scenario: Rendering inline js with the feature enabled
10
+ Given "minify_javascript" feature is "enabled"
11
+ When I go to "/inline-js.html"
12
+ Then I should see "1" lines
@@ -1,4 +1,5 @@
1
1
  Given /^I am using an asset host$/ do
2
+ Middleman::Base.enable :asset_host
2
3
  Middleman::Base.set :asset_host do |asset|
3
4
  "http://assets%d.example.com" % (asset.hash % 4)
4
5
  end
@@ -23,6 +23,6 @@ Then /^I should not see "([^\"]*)"$/ do |expected|
23
23
  end
24
24
 
25
25
  Then /^I should see "([^\"]*)" lines$/ do |lines|
26
- puts @browser.last_response.body
26
+ $stderr.puts @browser.last_response.body
27
27
  @browser.last_response.body.chomp.split($/).length.should == lines.to_i
28
28
  end
data/lib/middleman.rb CHANGED
@@ -4,22 +4,5 @@ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
4
4
  require 'rubygems'
5
5
 
6
6
  module Middleman
7
-
8
- module Rack
9
- autoload :Sprockets, "middleman/rack/sprockets"
10
- autoload :MinifyJavascript, "middleman/rack/minify_javascript"
11
- autoload :MinifyCSS, "middleman/rack/minify_css"
12
- end
13
-
14
- module Renderers
15
- autoload :ERb, "middleman/renderers/erb"
16
- autoload :Builder, "middleman/renderers/builder"
17
- autoload :Less, "middleman/renderers/less"
18
- end
19
-
20
- autoload :Base, "middleman/base"
21
- autoload :Haml, "middleman/renderers/haml"
22
- autoload :Sass, "middleman/renderers/sass"
23
- autoload :Helpers, "middleman/helpers"
24
-
7
+ autoload :Base, "middleman/base"
25
8
  end
@@ -0,0 +1,33 @@
1
+ module Middleman
2
+ module Assets
3
+ @@asset_handler_map = []
4
+ @@asset_handler_stack = []
5
+
6
+ def self.register(handler_name, &block)
7
+ if block_given?
8
+ @@asset_handler_stack << block
9
+ @@asset_handler_map << handler_name
10
+ end
11
+ end
12
+
13
+ def self.get_url(path, prefix="", request=nil)
14
+ @@asset_handler_stack.last.call(path, prefix, request)
15
+ end
16
+
17
+ def self.before(position, *args)
18
+ current_index = @@asset_handler_map.index(position)
19
+ return nil unless current_index
20
+
21
+ previous = current_index - 1
22
+ if (previous >= 0) && (previous < @@asset_handler_map.length)
23
+ @@asset_handler_stack[previous].call(*args)
24
+ else
25
+ nil
26
+ end
27
+ end
28
+ end
29
+ end
30
+
31
+ Middleman::Assets.register :base do |path, prefix, request|
32
+ path.include?("://") ? path : File.join(Middleman::Base.http_prefix || "/", prefix, path)
33
+ end
@@ -7,7 +7,6 @@ class Sinatra::Request
7
7
  end
8
8
 
9
9
  module Middleman
10
- module Rack; end
11
10
  class Base < Sinatra::Base
12
11
  set :app_file, __FILE__
13
12
  set :root, ENV["MM_DIR"] || Dir.pwd
@@ -15,7 +14,6 @@ module Middleman
15
14
  set :sessions, false
16
15
  set :logging, false
17
16
  set :environment, ENV['MM_ENV'] || :development
18
- set :supported_formats, %w(erb)
19
17
  set :index_file, "index.html"
20
18
  set :js_dir, "javascripts"
21
19
  set :css_dir, "stylesheets"
@@ -42,10 +40,9 @@ module Middleman
42
40
  def self.set(option, value=self, &block)
43
41
  if block_given?
44
42
  value = Proc.new { block }
45
- super(option, value, &nil)
46
- else
47
- super
48
43
  end
44
+
45
+ super(option, value, &nil)
49
46
  end
50
47
 
51
48
  @@afters = []
@@ -58,22 +55,6 @@ module Middleman
58
55
  ext = ".#{ext}" unless ext.to_s[0] == ?.
59
56
  ::Rack::Mime::MIME_TYPES[ext.to_s] = type
60
57
  end
61
-
62
- # Convenience function to discover if a template exists for the requested renderer (haml, sass, etc)
63
- def template_exists?(path, renderer=nil)
64
- template_path = path.dup
65
- template_path << ".#{renderer}" if renderer
66
- File.readable? File.join(settings.views, template_path)
67
- end
68
-
69
- # Base case renderer (do nothing), Should be over-ridden
70
- module StaticRender
71
- def render_path(path, layout)
72
- return false if !template_exists?(path, :erb)
73
- erb(path.to_sym, :layout => layout)
74
- end
75
- end
76
- include StaticRender
77
58
 
78
59
  @@layout = nil
79
60
  def self.page(url, options={}, &block)
@@ -106,7 +87,7 @@ module Middleman
106
87
  not_found do
107
88
  process_request
108
89
  end
109
-
90
+
110
91
  private
111
92
  def process_request(layout = :layout)
112
93
  # Normalize the path and add index if we're looking at a directory
@@ -114,44 +95,33 @@ module Middleman
114
95
  path << settings.index_file if path.match(%r{/$})
115
96
  path.gsub!(%r{^/}, '')
116
97
 
117
- # If the enabled renderers succeed, return the content, mime-type and an HTTP 200
118
- if content = render_path(path, layout)
98
+ template_path = locate_template_file(path)
99
+ if template_path
119
100
  content_type mime_type(File.extname(path)), :charset => 'utf-8'
120
- status 200
121
- content
122
- else
123
- status 404
101
+
102
+ renderer = Middleman::Renderers.get_method(template_path)
103
+ if respond_to? renderer
104
+ status 200
105
+ return send(renderer, path.to_sym, { :layout => layout })
106
+ end
124
107
  end
108
+
109
+ status 404
110
+ end
111
+
112
+ def locate_template_file(path)
113
+ template_path = File.join(settings.views, "#{path}.*")
114
+ Dir.glob(template_path).first
125
115
  end
126
116
  end
127
117
  end
128
118
 
129
- require "middleman/renderers/erb"
130
- require "middleman/renderers/haml"
131
- require "middleman/renderers/sass"
132
- require "middleman/renderers/less"
133
- require "middleman/renderers/builder"
119
+ require "middleman/assets"
120
+ require "middleman/renderers"
121
+ require "middleman/features"
134
122
 
123
+ # The Rack App
135
124
  class Middleman::Base
136
- helpers Middleman::Helpers
137
-
138
- # Features disabled by default
139
- enable :asset_host
140
- disable :slickmap
141
- disable :cache_buster
142
- disable :minify_css
143
- disable :minify_javascript
144
- disable :relative_assets
145
- disable :smush_pngs
146
- disable :automatic_image_sizes
147
- disable :relative_assets
148
- disable :cache_buster
149
- disable :ugly_haml
150
-
151
- # Default build features
152
- configure :build do
153
- end
154
-
155
125
  def self.new(*args, &block)
156
126
  # Check for and evaluate local configuration
157
127
  local_config = File.join(self.root, "init.rb")
@@ -164,22 +134,11 @@ class Middleman::Base
164
134
  # loop over enabled feature
165
135
  features.flatten.each do |feature_name|
166
136
  next unless send(:"#{feature_name}?")
167
-
168
- feature_path = "features/#{feature_name}"
169
- if File.exists? File.join(File.dirname(__FILE__), "#{feature_path}.rb")
170
- puts "== Enabling: #{feature_name.to_s.capitalize}" if logging?
171
- require "middleman/#{feature_path}"
172
- end
137
+ $stderr.puts "== Enabling: #{feature_name.to_s.capitalize}" if logging?
138
+ Middleman::Features.run(feature_name, self)
173
139
  end
174
140
 
175
- use ::Rack::ConditionalGet if environment == :development
176
- use Middleman::Rack::MinifyJavascript if minify_javascript?
177
- use Middleman::Rack::MinifyCSS if minify_css?
178
-
179
- # Built-in javascript combination
180
- use Middleman::Rack::Sprockets, :root => Middleman::Base.root,
181
- :load_path => [ File.join("public", Middleman::Base.js_dir),
182
- File.join("views", Middleman::Base.js_dir) ]
141
+ use ::Rack::ConditionalGet if environment == :development
183
142
 
184
143
  @@afters.each { |block| class_eval(&block) }
185
144
 
@@ -1,9 +1,13 @@
1
+ require 'middleman/base'
1
2
  require 'templater'
2
3
  require 'middleman/templater+dynamic_renderer.rb'
3
4
 
4
5
  # Placeholder for any methods the builder needs to abstract to allow feature integration
5
6
  module Middleman
6
7
  class Builder < ::Templater::Generator
8
+
9
+ @@template_extensions = ::Tilt.mappings.keys << "js"
10
+
7
11
  # Define source and desintation
8
12
  def self.source_root; Dir.pwd; end
9
13
  def destination_root; File.join(Dir.pwd, Middleman::Base.build_dir); end
@@ -28,7 +32,8 @@ module Middleman
28
32
 
29
33
  def self.file(name, *args, &block)
30
34
  file_ext = File.extname(args[0])
31
- return if Middleman::Base.supported_formats.include? file_ext[1..file_ext.length]
35
+
36
+ return unless ::Tilt[file_ext].nil?
32
37
 
33
38
  if (args[0] === args[1])
34
39
  args[1] = args[0].gsub("#{File.basename(Middleman::Base.views)}/", "").gsub("#{File.basename(Middleman::Base.public)}/", "")
@@ -37,9 +42,8 @@ module Middleman
37
42
  end
38
43
 
39
44
  def self.init!
40
- glob! File.basename(Middleman::Base.public), Middleman::Base.supported_formats
41
- glob! File.basename(Middleman::Base.views), %w(sass js)
42
- glob! File.basename(Middleman::Base.views), Middleman::Base.supported_formats - %w(sass js)
45
+ glob! File.basename(Middleman::Base.public), @@template_extensions
46
+ glob! File.basename(Middleman::Base.views), @@template_extensions
43
47
  end
44
48
 
45
49
  def after_run
@@ -0,0 +1,39 @@
1
+ module Middleman
2
+ module Features
3
+ # Top-level method to register a new feature
4
+ @@features = {}
5
+ def self.register(feature_name, feature_class=nil, options={})
6
+ @@features[feature_name] = feature_class
7
+
8
+ # Default to disabled, unless the class asks to auto-enable
9
+ activate_method = (options.has_key?(:auto_enable) && options[:auto_enable]) ? :enable : :disable
10
+ Middleman::Base.send(activate_method, feature_name)
11
+ end
12
+
13
+ def self.run(feature_name, scope)
14
+ feature_class = @@features[feature_name]
15
+ feature_class.new(scope) unless feature_class.nil?
16
+ end
17
+
18
+ def self.all
19
+ @@features
20
+ end
21
+
22
+ end
23
+ end
24
+
25
+ # livereload
26
+ %w(asset_host
27
+ automatic_image_sizes
28
+ cache_buster
29
+ default_helpers
30
+ minify_css
31
+ minify_javascript
32
+ relative_assets
33
+ slickmap
34
+ smush_pngs
35
+ ugly_haml).each do |feature|
36
+
37
+ require File.join("middleman/features", feature)
38
+
39
+ end