middleman 0.14.1 → 0.99.0.pre

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.
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