middleman 0.9.0.pre → 0.9.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.
Files changed (98) hide show
  1. data/.document +0 -0
  2. data/.gitignore +2 -3
  3. data/LICENSE +0 -0
  4. data/README.rdoc +0 -4
  5. data/Rakefile +36 -26
  6. data/VERSION +1 -1
  7. data/bin/mm-build +54 -3
  8. data/bin/mm-init +8 -11
  9. data/bin/mm-server +4 -56
  10. data/deps.rip +7 -0
  11. data/lib/middleman.rb +1 -5
  12. data/lib/middleman/base.rb +98 -120
  13. data/lib/middleman/builder.rb +8 -55
  14. data/lib/middleman/features/cache_buster.rb +7 -41
  15. data/lib/middleman/features/compass.rb +28 -0
  16. data/lib/middleman/features/content_for.rb +9 -0
  17. data/lib/middleman/features/growl.rb +2 -0
  18. data/lib/middleman/features/haml.rb +128 -0
  19. data/lib/middleman/features/markaby.rb +43 -0
  20. data/lib/middleman/features/maruku.rb +42 -0
  21. data/lib/middleman/features/minify_css.rb +2 -9
  22. data/lib/middleman/features/minify_javascript.rb +24 -13
  23. data/lib/middleman/features/relative_assets.rb +14 -21
  24. data/lib/middleman/features/slickmap.rb +4 -117
  25. data/lib/middleman/features/sprockets+ruby19.rb +29 -0
  26. data/lib/middleman/features/sprockets.rb +29 -0
  27. data/lib/middleman/helpers.rb +47 -0
  28. data/lib/middleman/template/init.rb +22 -0
  29. data/lib/middleman/template/views/index.haml +1 -0
  30. data/lib/middleman/template/views/layout.haml +4 -11
  31. data/lib/middleman/template/views/stylesheets/site.sass +1 -0
  32. data/middleman.gemspec +53 -109
  33. data/spec/builder_spec.rb +19 -16
  34. data/spec/fixtures/sample/init.rb +2 -28
  35. data/spec/fixtures/sample/public/javascripts/empty-with-include.js +1 -0
  36. data/spec/fixtures/sample/public/javascripts/to-be-included.js +1 -0
  37. data/spec/fixtures/sample/public/static.html +0 -0
  38. data/spec/fixtures/sample/public/stylesheets/static.css +0 -0
  39. data/spec/fixtures/sample/views/_partial.haml +0 -0
  40. data/spec/fixtures/sample/views/index.html.haml +0 -0
  41. data/spec/fixtures/sample/views/inline-js.html.haml +0 -0
  42. data/spec/fixtures/sample/views/layout.haml +1 -1
  43. data/spec/fixtures/sample/views/markaby.html.mab +5 -0
  44. data/spec/fixtures/sample/views/maruku.html.maruku +0 -0
  45. data/spec/fixtures/sample/views/services/index.html.haml +0 -0
  46. data/spec/fixtures/sample/views/stylesheets/site.css.sass +1 -1
  47. data/spec/generator_spec.rb +34 -0
  48. data/spec/spec_helper.rb +5 -3
  49. metadata +72 -288
  50. data/features/asset_host.feature +0 -12
  51. data/features/automatic_image_sizes.feature +0 -14
  52. data/features/cache_buster.feature +0 -22
  53. data/features/generator.feature +0 -8
  54. data/features/minify_css.feature +0 -22
  55. data/features/minify_javascript.feature +0 -12
  56. data/features/page_alias_and_layouts.feature +0 -12
  57. data/features/relative_assets.feature +0 -12
  58. data/features/step_definitions/asset_host_steps.rb +0 -7
  59. data/features/step_definitions/env.rb +0 -3
  60. data/features/step_definitions/generator_steps.rb +0 -24
  61. data/features/step_definitions/middleman_steps.rb +0 -28
  62. data/features/step_definitions/page_layout_steps.rb +0 -13
  63. data/lib/middleman/assets.rb +0 -33
  64. data/lib/middleman/config.ru +0 -2
  65. data/lib/middleman/features.rb +0 -39
  66. data/lib/middleman/features/asset_host.rb +0 -21
  67. data/lib/middleman/features/automatic_image_sizes.rb +0 -31
  68. data/lib/middleman/features/automatic_image_sizes/fastimage.rb +0 -282
  69. data/lib/middleman/features/default_helpers.rb +0 -68
  70. data/lib/middleman/features/livereload.rb +0 -19
  71. data/lib/middleman/features/minify_javascript/rack.rb +0 -31
  72. data/lib/middleman/features/smush_pngs.rb +0 -38
  73. data/lib/middleman/features/ugly_haml.rb +0 -7
  74. data/lib/middleman/renderers.rb +0 -26
  75. data/lib/middleman/renderers/coffee.rb +0 -28
  76. data/lib/middleman/renderers/haml.rb +0 -47
  77. data/lib/middleman/renderers/sass.rb +0 -67
  78. data/lib/middleman/template/init.rbt +0 -57
  79. data/lib/middleman/template/views/index.html.haml +0 -4
  80. data/lib/middleman/template/views/stylesheets/site.css.sass +0 -27
  81. data/lib/middleman/templater+dynamic_renderer.rb +0 -26
  82. data/spec/fixtures/sample/public/images/blank.gif +0 -0
  83. data/spec/fixtures/sample/public/stylesheets/auto-css.css +0 -0
  84. data/spec/fixtures/sample/public/stylesheets/sub1/auto-css.css +0 -0
  85. data/spec/fixtures/sample/public/stylesheets/sub1/sub2/auto-css.css +0 -0
  86. data/spec/fixtures/sample/views/asset_host.html.haml +0 -1
  87. data/spec/fixtures/sample/views/auto-css.html.haml +0 -1
  88. data/spec/fixtures/sample/views/auto-image-sizes.html.haml +0 -1
  89. data/spec/fixtures/sample/views/cache-buster.html.haml +0 -2
  90. data/spec/fixtures/sample/views/custom-layout.html.haml +0 -1
  91. data/spec/fixtures/sample/views/custom.haml +0 -5
  92. data/spec/fixtures/sample/views/inline-css.html.haml +0 -4
  93. data/spec/fixtures/sample/views/page-classes.html.haml +0 -1
  94. data/spec/fixtures/sample/views/stylesheets/asset_host.css.sass +0 -3
  95. data/spec/fixtures/sample/views/stylesheets/relative_assets.css.sass +0 -3
  96. data/spec/fixtures/sample/views/stylesheets/site_scss.css.scss +0 -1
  97. data/spec/fixtures/sample/views/stylesheets/test_less.css.less +0 -5
  98. data/spec/helpers_spec.rb +0 -43
data/.document CHANGED
File without changes
data/.gitignore CHANGED
@@ -1,7 +1,6 @@
1
+ *.sw?
1
2
  .DS_Store
2
3
  coverage
3
4
  rdoc
4
5
  pkg
5
- .sass-cache
6
- .sassc
7
- .tmp
6
+ .sass-cache
data/LICENSE CHANGED
File without changes
@@ -2,10 +2,6 @@
2
2
 
3
3
  The Middleman is ever-vigilant against tag-soup, unreadable CSS and repetition. He stands-watch over your Haml and Sass producing only the cleanest and efficient markup.
4
4
 
5
- == Getting Started
6
-
7
- Everything you need to know is on the wiki: http://wiki.github.com/tdreyno/middleman
8
-
9
5
  == Copyright
10
6
 
11
7
  Copyright (c) 2009 Thomas Reynolds. See LICENSE for details.
data/Rakefile CHANGED
@@ -1,36 +1,29 @@
1
- require 'lib/middleman'
1
+ require 'rubygems'
2
2
  require 'rake'
3
- require 'spec/rake/spectask'
4
- require 'cucumber/rake/task'
5
3
 
6
4
  begin
7
5
  require 'jeweler'
8
6
  Jeweler::Tasks.new do |gem|
9
7
  gem.name = "middleman"
10
- gem.summary = %Q{A static site generator utilizing Haml, Sass and providing YUI compression and cache busting}
8
+ gem.summary = %Q{A static site generator utilizing Haml and Sass}
11
9
  gem.email = "tdreyno@gmail.com"
12
- gem.homepage = "http://wiki.github.com/tdreyno/middleman"
10
+ gem.homepage = "http://github.com/tdreyno/middleman"
13
11
  gem.authors = ["Thomas Reynolds"]
14
12
  gem.rubyforge_project = "middleman"
13
+ # gem is a Gem::Specification... see http://www.rubygems.org/read/chapter/20 for additional settings
15
14
  gem.executables = %w(mm-init mm-build mm-server)
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")
30
-
31
- gem.add_development_dependency("rspec")
32
- gem.add_development_dependency("cucumber")
33
- gem.add_development_dependency("jeweler")
15
+ gem.add_dependency("templater")
16
+ gem.add_dependency("sprockets")
17
+ gem.add_dependency("sinatra")
18
+ gem.add_dependency("sinatra-content-for")
19
+ gem.add_dependency("rack-test")
20
+ gem.add_dependency("yui-compressor")
21
+ gem.add_dependency("haml", ">=2.1.0")
22
+ gem.add_dependency("chriseppstein-compass")
23
+ end
24
+
25
+ Jeweler::RubyforgeTasks.new do |rubyforge|
26
+ rubyforge.doc_task = "rdoc"
34
27
  end
35
28
 
36
29
  Jeweler::GemcutterTasks.new
@@ -38,15 +31,32 @@ rescue LoadError
38
31
  puts "Jeweler (or a dependency) not available. Install it with: gem install jeweler"
39
32
  end
40
33
 
34
+ require 'spec/rake/spectask'
41
35
  Spec::Rake::SpecTask.new(:spec) do |spec|
42
36
  spec.libs << 'lib' << 'spec'
43
37
  spec.spec_files = FileList['spec/**/*_spec.rb']
44
38
  end
45
39
 
46
- Cucumber::Rake::Task.new(:cucumber, 'Run features that should pass') do |t|
47
- t.cucumber_opts = "--color --tags ~@wip --strict --format #{ENV['CUCUMBER_FORMAT'] || 'pretty'}"
40
+ Spec::Rake::SpecTask.new(:rcov) do |spec|
41
+ spec.libs << 'lib' << 'spec'
42
+ spec.pattern = 'spec/**/*_spec.rb'
43
+ spec.rcov = true
48
44
  end
49
45
 
50
46
  task :spec => :check_dependencies
51
47
 
52
- task :default => [:cucumber, :spec]
48
+ task :default => :spec
49
+
50
+ require 'rake/rdoctask'
51
+ Rake::RDocTask.new do |rdoc|
52
+ if File.exist?('VERSION')
53
+ version = File.read('VERSION')
54
+ else
55
+ version = ""
56
+ end
57
+
58
+ rdoc.rdoc_dir = 'rdoc'
59
+ rdoc.title = "middleman #{version}"
60
+ rdoc.rdoc_files.include('README*')
61
+ rdoc.rdoc_files.include('lib/**/*.rb')
62
+ end
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.9.0.pre
1
+ 0.9.3
@@ -1,12 +1,63 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ require 'templater'
4
+
3
5
  ENV['MM_ENV'] = "build"
4
6
 
5
7
  # Require app
6
8
  require File.join(File.dirname(__FILE__), "..", "lib", "middleman")
7
9
  require 'middleman/builder'
8
10
 
9
- # Middleman::Base.init!
10
- Middleman::Builder.init!
11
+ Middleman::Base.init!
12
+
13
+ module Generators
14
+ extend Templater::Manifold
15
+ desc "Build a staticmatic site"
16
+
17
+ class Builder < Templater::Generator
18
+ # Define source and desintation
19
+ def self.source_root; Dir.pwd; end
20
+ def destination_root; File.join(Dir.pwd, Middleman::Base.build_dir); end
21
+
22
+ # Override template to ask middleman for the correct extension to output
23
+ def self.template(name, *args, &block)
24
+ return if args[0].include?('layout')
25
+
26
+ args.first.split('/').each do |part|
27
+ return if part[0,1] == '_'
28
+ end
29
+
30
+ if (args[0] === args[1])
31
+ args[1] = args[0].gsub("#{File.basename(Middleman::Base.views)}/", "")
32
+ .gsub("#{File.basename(Middleman::Base.public)}/", "")
33
+ if File.extname(args[1]) != ".js"
34
+ args[1] = args[1].gsub!(File.extname(args[1]), "") if File.basename(args[1]).split('.').length > 2
35
+ end
36
+ end
37
+
38
+ super(name, *args, &block)
39
+ end
40
+
41
+ def self.file(name, *args, &block)
42
+ if (args[0] === args[1])
43
+ args[1] = args[0].gsub("#{File.basename(Middleman::Base.views)}/", "")
44
+ .gsub("#{File.basename(Middleman::Base.public)}/", "")
45
+ end
46
+ super(name, *args, &block)
47
+ end
48
+
49
+ glob! File.basename(Middleman::Base.public), Middleman::Base.supported_formats
50
+ glob! File.basename(Middleman::Base.views), Middleman::Base.supported_formats
51
+ end
52
+
53
+ add :build, Builder
54
+ end
55
+
56
+ # Monkey-patch to use a dynamic renderer
57
+ class Templater::Actions::Template
58
+ def render
59
+ ::Middleman::Builder.render_file(source, destination)
60
+ end
61
+ end
11
62
 
12
- Middleman::Generators.run_cli(Dir.pwd, 'mm-build', 1, %w(build --force).concat(ARGV))
63
+ Generators.run_cli(Dir.pwd, 'mm-build', 1, %w(build --force).concat(ARGV))
@@ -1,5 +1,4 @@
1
1
  #!/usr/bin/env ruby
2
- require File.join(File.dirname(File.dirname(__FILE__)), 'lib', 'middleman')
3
2
  require 'templater'
4
3
 
5
4
  module Generators
@@ -7,12 +6,11 @@ module Generators
7
6
  desc "Generator for streamlining staticmatic"
8
7
 
9
8
  class NewSite < Templater::Generator
10
- desc "Creates a new middleman scaffold."
9
+ desc "Creates a new staticmatic scaffold."
11
10
  first_argument :location, :required => true, :desc => "Project location"
12
-
13
- option :css_dir, :desc => 'The path to the css files'
14
- option :js_dir, :desc => 'The path to the javascript files'
15
- option :images_dir, :desc => 'The path to the image files'
11
+
12
+ # css_dir
13
+ # images_dir
16
14
 
17
15
  def destination_root
18
16
  File.expand_path(location)
@@ -22,13 +20,12 @@ module Generators
22
20
  File.join(File.dirname(__FILE__), '..', 'lib', 'middleman', 'template')
23
21
  end
24
22
 
25
- template :init, "init.rb"
23
+ file :init, "init.rb"
26
24
  glob! :views
27
25
  glob! :public
28
-
29
- empty_directory :stylesheets, "public/stylesheets"#, File.join("public", css_dir)
30
- empty_directory :javascripts, "public/javascripts"#, File.join("public", js_dir)
31
- empty_directory :images, "public/images"#, File.join("public", images_dir)
26
+ empty_directory :stylesheets, "public/stylesheets"
27
+ empty_directory :javascripts, "public/javascripts"
28
+ empty_directory :images, "public/images"
32
29
  end
33
30
 
34
31
  add :setup, NewSite
@@ -1,61 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # Non-blocking site rebuilding
4
- trap("TSTP") do
5
- fork do
6
- require "open3"
7
- first_run = true
8
- Open3.popen3(%Q{cd "#{Dir.pwd}" && #{File.join(File.dirname(__FILE__), "mm-build")} | grep FORCED}) do |stdin, stdout, stderr|
9
- puts "\n== Building the site..."
10
- stdout.readlines.each do |l|
11
- puts "== Updated:" if first_run
12
- puts " " + l.split("[FORCED]").last.chomp
13
- first_run = false
14
- end
15
- puts "== Build complete"
16
- end
17
- end
18
- end
19
-
20
- require 'optparse'
21
-
22
3
  # Require Middleman
23
4
  require File.join(File.dirname(__FILE__), '..', 'lib', 'middleman')
24
5
 
25
- env = ENV['MM_ENV'] || ENV['RACK_ENV'] || 'development'
26
- options = { :Port => 4567, :AccessLog => [] }
27
-
28
- OptionParser.new { |opts|
29
- opts.banner = "Usage: mm-server [rack options]"
30
- opts.separator ""
31
- opts.separator "Rack options:"
32
- opts.on("-p", "--port PORT", "use PORT (default: 4567)") { |port|
33
- options[:Port] = port
34
- }
35
- opts.on("-E", "--env ENVIRONMENT", "use ENVIRONMENT for defaults (default: development)") { |e|
36
- env = e
37
- }
38
- opts.on("--debug", "Debug mode") {
39
- ::Middleman::Base.set :logging, true
40
- }
41
-
42
- opts.parse! ARGV
43
- }
44
-
45
- ENV['RACK_ENV'] = env
46
-
47
- class Middleman::Base
48
- set :root, Dir.pwd
49
- end
50
-
51
- require 'shotgun'
52
- config = File.join(File.dirname(__FILE__), '..', 'lib', 'middleman', 'config.ru')
53
- app = Shotgun.new(config, &lambda { |inner_app| Middleman::Base })
54
-
55
- require 'rubygems'
56
- require 'thin'
57
- Thin::Logging.silent = true
58
-
59
- Rack::Handler::Thin.run app, options do |inst|
60
- puts "== The Middleman is standing watch on port #{options[:Port]}"
61
- end
6
+ # Start Middleman
7
+ Middleman::Base.set({ :server => %w[thin webrick],
8
+ :root => Dir.pwd })
9
+ Middleman::Base.run!
@@ -0,0 +1,7 @@
1
+ git://github.com/jnicklas/templater.git
2
+ git://github.com/sstephenson/sprockets.git
3
+ git://github.com/sinatra/sinatra.git
4
+ git://github.com/nex3/haml.git
5
+ git://github.com/chriseppstein/compass.git
6
+ git://github.com/foca/sinatra-content-for.git
7
+ git://github.com/brynary/rack-test.git
@@ -1,8 +1,4 @@
1
1
  libdir = File.dirname(__FILE__)
2
2
  $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
3
3
 
4
- require 'rubygems'
5
-
6
- module Middleman
7
- autoload :Base, "middleman/base"
8
- end
4
+ require 'middleman/base'
@@ -1,147 +1,125 @@
1
- # We're riding on Sinatra, so let's include it
2
- require "sinatra/base"
3
- require "sinatra/content_for"
1
+ require 'rubygems' unless ENV['NO_RUBYGEMS']
2
+ require 'haml'
3
+ require 'sinatra/base'
4
+ require 'middleman/helpers'
4
5
 
5
- class Sinatra::Request
6
- attr_accessor :layout
6
+ def mime(ext, type)
7
+ ext = ".#{ext}" unless ext.to_s[0] == ?.
8
+ Rack::Mime::MIME_TYPES[ext.to_s] = type
7
9
  end
8
10
 
9
11
  module Middleman
10
12
  class Base < Sinatra::Base
11
13
  set :app_file, __FILE__
12
- set :root, ENV["MM_DIR"] || Dir.pwd
13
- set :reload, false
14
- set :sessions, false
15
- set :logging, false
14
+ set :root, Dir.pwd
16
15
  set :environment, ENV['MM_ENV'] || :development
17
- set :index_file, "index.html"
18
- set :js_dir, "javascripts"
16
+ set :supported_formats, []
17
+ set :index_file, 'index.html'
19
18
  set :css_dir, "stylesheets"
20
19
  set :images_dir, "images"
21
- set :fonts_dir, "fonts"
22
20
  set :build_dir, "build"
23
- set :http_prefix, nil
24
-
25
- helpers Sinatra::ContentFor
26
-
27
- set :features, []
28
- def self.enable(*opts)
29
- set :features, (self.features << opts).flatten
30
- super
31
- end
32
-
33
- def self.disable(*opts)
34
- current = self.features
35
- current -= opts.flatten
36
- set :features, current
37
- super
38
- end
39
-
40
- def self.set(option, value=self, &block)
41
- if block_given?
42
- value = Proc.new { block }
43
- end
44
-
45
- super(option, value, &nil)
46
- end
47
-
48
- @@afters = []
49
- def self.after_feature_init(&block)
50
- @@afters << block
21
+
22
+ enable :compass
23
+ enable :content_for
24
+ enable :sprockets
25
+ #enable :slickmap
26
+ disable :cache_buster
27
+ disable :minify_css
28
+ disable :minify_javascript
29
+ disable :relative_assets
30
+ disable :markaby
31
+ disable :maruku
32
+
33
+ # include helpers
34
+ helpers Middleman::Helpers
35
+
36
+ # Default build features
37
+ configure :build do
38
+ enable :minify_css
39
+ enable :minify_javascript
40
+ enable :cache_buster
41
+ # disable :slickmap
51
42
  end
52
-
53
- # Rack helper for adding mime-types during local preview
54
- def self.mime(ext, type)
55
- ext = ".#{ext}" unless ext.to_s[0] == ?.
56
- ::Rack::Mime::MIME_TYPES[ext.to_s] = type
43
+
44
+ def template_exists?(path, renderer=nil)
45
+ template_path = path.dup
46
+ template_path << ".#{renderer}" if renderer
47
+ File.exists? File.join(options.views, template_path)
57
48
  end
58
49
 
59
- @@layout = nil
60
- def self.page(url, options={}, &block)
61
- layout = @@layout
62
- layout = options[:layout] if !options[:layout].nil?
63
-
64
- get(url) do
65
- return yield if block_given?
66
- process_request(layout)
50
+ # Base case renderer (do nothing), Should be over-ridden
51
+ module StaticRender
52
+ def render_path(path)
53
+ false
67
54
  end
68
55
  end
69
-
70
- def self.with_layout(layout, &block)
71
- @@layout = layout
72
- class_eval(&block) if block_given?
73
- ensure
74
- @@layout = nil
75
- end
76
-
77
- def self.enabled?(name)
78
- name = (name.to_s << "?").to_sym
79
- self.respond_to?(name) && self.send(name)
80
- end
81
-
82
- def enabled?(name)
83
- self.class.enabled?(name)
84
- end
85
-
86
- # This will match all requests not overridden in the project's init.rb
56
+ include StaticRender
57
+
58
+ # All other files
59
+ disable :static
87
60
  not_found do
88
- process_request
89
- end
90
-
91
- private
92
- def process_request(layout = :layout)
93
- # Normalize the path and add index if we're looking at a directory
94
61
  path = request.path
95
- path << settings.index_file if path.match(%r{/$})
62
+ path << options.index_file if path.match(%r{/$})
96
63
  path.gsub!(%r{^/}, '')
97
-
98
- template_path = locate_template_file(path)
99
- if template_path
100
- content_type mime_type(File.extname(path)), :charset => 'utf-8'
101
-
102
- renderer = Middleman::Renderers.get_method(template_path)
103
- if respond_to? renderer
64
+
65
+ if content = render_path(path)
66
+ content_type media_type(File.extname(path)), :charset => 'utf-8'
67
+ status 200
68
+ content
69
+ else
70
+ # Otherwise, send the static file
71
+ path = File.join(options.public, request.path)
72
+ if File.exists?(path)
104
73
  status 200
105
- return send(renderer, path.to_sym, { :layout => layout })
74
+ send_file(path)
75
+ else
76
+ status 404
106
77
  end
107
78
  end
108
-
109
- status 404
110
79
  end
111
80
 
112
- def locate_template_file(path)
113
- template_path = File.join(settings.views, "#{path}.*")
114
- Dir.glob(template_path).first
115
- end
116
- end
117
- end
118
-
119
- require "middleman/assets"
120
- require "middleman/renderers"
121
- require "middleman/features"
122
-
123
- # The Rack App
124
- class Middleman::Base
125
- def self.new(*args, &block)
126
- # Check for and evaluate local configuration
127
- local_config = File.join(self.root, "init.rb")
128
- if File.exists? local_config
129
- puts "== Reading: Local config" if logging?
130
- Middleman::Base.class_eval File.read(local_config)
131
- set :app_file, File.expand_path(local_config)
81
+ def self.run!(options={}, &block)
82
+ init!
83
+ set options
84
+ handler = detect_rack_handler
85
+ handler_name = handler.name.gsub(/.*::/, '')
86
+ puts "== The Middleman is standing watch on port #{port}"
87
+ handler.run self, :Host => host, :Port => port do |server|
88
+ trap(:INT) do
89
+ ## Use thins' hard #stop! if available, otherwise just #stop
90
+ server.respond_to?(:stop!) ? server.stop! : server.stop
91
+ puts "\n== The Middleman has ended his patrol"
92
+ end
93
+
94
+ if block_given?
95
+ block.call
96
+ ## Use thins' hard #stop! if available, otherwise just #stop
97
+ server.respond_to?(:stop!) ? server.stop! : server.stop
98
+ end
99
+ end
100
+ rescue Errno::EADDRINUSE => e
101
+ puts "== The Middleman is already standing watch on port #{port}!"
132
102
  end
133
103
 
134
- # loop over enabled feature
135
- features.flatten.each do |feature_name|
136
- next unless send(:"#{feature_name}?")
137
- $stderr.puts "== Enabling: #{feature_name.to_s.capitalize}" if logging?
138
- Middleman::Features.run(feature_name, self)
104
+ def self.init!
105
+ # Check for local config
106
+ local_config = File.join(self.root, "init.rb")
107
+ if File.exists? local_config
108
+ puts "== Local config at: #{local_config}"
109
+ class_eval File.read(local_config)
110
+ end
111
+
112
+ require "middleman/features/haml"
113
+
114
+ # loop over enabled feature
115
+ features_path = File.expand_path("features/*.rb", File.dirname(__FILE__))
116
+ Dir[features_path].each do |f|
117
+ feature_name = File.basename(f, '.rb')
118
+ option_name = :"#{feature_name}?"
119
+ if respond_to?(option_name) && send(option_name) === true
120
+ require "middleman/features/#{feature_name}"
121
+ end
122
+ end
139
123
  end
140
-
141
- use ::Rack::ConditionalGet if environment == :development
142
-
143
- @@afters.each { |block| class_eval(&block) }
144
-
145
- super
146
124
  end
147
- end
125
+ end