middleman 0.9.0.pre → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
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