awestruct 0.5.3 → 0.5.4.beta1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (48) hide show
  1. data/lib/awestruct/cli/init.rb +35 -34
  2. data/lib/awestruct/cli/invoker.rb +4 -4
  3. data/lib/awestruct/cli/manifest.rb +57 -55
  4. data/lib/awestruct/cli/options.rb +11 -0
  5. data/lib/awestruct/config.rb +17 -14
  6. data/lib/awestruct/deploy/base_deploy.rb +13 -7
  7. data/lib/awestruct/deploy/github_pages_deploy.rb +14 -9
  8. data/lib/awestruct/engine.rb +17 -12
  9. data/lib/awestruct/extensions/intense_debate.rb +1 -1
  10. data/lib/awestruct/extensions/minify.rb +1 -1
  11. data/lib/awestruct/extensions/pipeline.rb +2 -2
  12. data/lib/awestruct/extensions/relative.rb +7 -1
  13. data/lib/awestruct/frameworks/base_Gemfile +5 -1
  14. data/lib/awestruct/frameworks/bootstrap/base_layout.html.haml +2 -2
  15. data/lib/awestruct/handler_chains.rb +2 -2
  16. data/lib/awestruct/handlers/asciidoctor_handler.rb +22 -4
  17. data/lib/awestruct/handlers/base_tilt_handler.rb +34 -10
  18. data/lib/awestruct/handlers/file_handler.rb +8 -12
  19. data/lib/awestruct/handlers/front_matter_handler.rb +1 -1
  20. data/lib/awestruct/handlers/interpolation_handler.rb +1 -6
  21. data/lib/awestruct/handlers/tilt_handler.rb +1 -7
  22. data/lib/awestruct/handlers/verbatim_file_handler.rb +12 -0
  23. data/lib/awestruct/scm/git.rb +14 -0
  24. data/lib/awestruct/version.rb +1 -1
  25. data/man/awestruct.1 +14 -3
  26. data/spec/asciidoc_handler_spec.rb +43 -40
  27. data/spec/awestruct/scm/git_spec.rb +29 -0
  28. data/spec/config_spec.rb +8 -2
  29. data/spec/engine_spec.rb +31 -9
  30. data/spec/erb_handler_spec.rb +33 -31
  31. data/spec/front_matter_handler_spec.rb +17 -6
  32. data/spec/github_pages_deploy_spec.rb +13 -7
  33. data/spec/haml_handler_spec.rb +62 -59
  34. data/spec/interpolation_handler_spec.rb +4 -8
  35. data/spec/javascript_handler_spec.rb +16 -13
  36. data/spec/minify_spec.rb +3 -1
  37. data/spec/mustache_handler_spec.rb +11 -7
  38. data/spec/options_spec.rb +20 -11
  39. data/spec/page_loader_spec.rb +3 -1
  40. data/spec/page_loader_spec_for_layouts.rb +3 -1
  41. data/spec/redirect_handler_spec.rb +21 -17
  42. data/spec/slim_handler_spec.rb +51 -49
  43. data/spec/support/shared_handler_example.rb +12 -8
  44. data/spec/test-data/front-matter-file-utf8.txt +5 -0
  45. data/spec/test-data/handlers/haml-error.html.haml +4 -0
  46. data/spec/test-data/handlers/hello.bogus +1 -0
  47. data/spec/tilt_handler_spec.rb +70 -3
  48. metadata +16 -25
@@ -1,12 +1,13 @@
1
1
  require 'awestruct/deploy/base_deploy'
2
+ require 'git'
2
3
 
3
4
  module Awestruct
4
5
  module Deploy
5
6
  class GitHubPagesDeploy < Base
6
- def initialize( site_config, deploy_config )
7
+ def initialize(site_config, deploy_config)
7
8
  @site_path = site_config.output_dir
8
- @branch = deploy_config[ 'branch' ] || 'gh-pages'
9
- @repo = deploy_config[ 'repository' ] || 'origin'
9
+ @branch = deploy_config['branch'] || 'gh-pages'
10
+ @repo = deploy_config['repository'] || 'origin'
10
11
  end
11
12
 
12
13
  def publish_site
@@ -16,15 +17,15 @@ module Awestruct
16
17
  if current_branch == '(no branch)'
17
18
  current_branch = git.revparse('HEAD')
18
19
  end
19
- git.branch( @branch ).checkout
20
+ git.branch(@branch).checkout
20
21
  add_and_commit_site @site_path
21
- git.push( @repo, @branch )
22
- git.checkout( current_branch )
22
+ git.push(@repo, @branch)
23
+ git.checkout(current_branch)
23
24
  end
24
25
 
25
26
  private
26
- def add_and_commit_site( path )
27
- git.with_working( path ) do
27
+ def add_and_commit_site(path)
28
+ git.with_working(path) do
28
29
  git.add(".")
29
30
  begin
30
31
  git.commit("Published #{@branch} to GitHub pages.")
@@ -34,8 +35,12 @@ module Awestruct
34
35
  end
35
36
  git.reset_hard
36
37
  end
38
+
39
+ def git
40
+ @git ||= ::Git.open('.')
41
+ end
37
42
  end
38
43
  end
39
44
  end
40
45
 
41
- Awestruct::Deployers.instance[ :github_pages ] = Awestruct::Deploy::GitHubPagesDeploy
46
+ Awestruct::Deployers.instance[:github_pages] = Awestruct::Deploy::GitHubPagesDeploy
@@ -24,6 +24,7 @@ module Awestruct
24
24
 
25
25
  attr_reader :site
26
26
  attr_reader :pipeline
27
+ attr_reader :config
27
28
 
28
29
  def self.instance
29
30
  @instance
@@ -39,6 +40,7 @@ module Awestruct
39
40
  @pipeline = Pipeline.new
40
41
  @site_page_loader = PageLoader.new( @site )
41
42
  @layout_page_loader = PageLoader.new( @site, :layouts )
43
+ @config = config
42
44
  end
43
45
 
44
46
  def config
@@ -46,29 +48,29 @@ module Awestruct
46
48
  end
47
49
 
48
50
  def run(profile, base_url, default_base_url, force=false)
49
- $LOG.debug "adjust_load_path" if $LOG.debug?
51
+ $LOG.debug 'adjust_load_path' if $LOG.debug?
50
52
  adjust_load_path
51
- $LOG.debug "load_default_site_yaml" if $LOG.debug?
53
+ $LOG.debug 'load_default_site_yaml' if $LOG.debug?
52
54
  load_default_site_yaml
53
- $LOG.debug "load_site_yaml -- profile" if $LOG.debug?
55
+ $LOG.debug 'load_site_yaml -- profile' if $LOG.debug?
54
56
  load_site_yaml(profile)
55
- $LOG.debug "set_base_url" if $LOG.debug?
57
+ $LOG.debug 'set_base_url' if $LOG.debug?
56
58
  set_base_url( base_url, default_base_url )
57
- $LOG.debug "load_yamls" if $LOG.debug?
59
+ $LOG.debug 'load_yamls' if $LOG.debug?
58
60
  load_yamls
59
- $LOG.debug "load_pipeline" if $LOG.debug?
61
+ $LOG.debug 'load_pipeline' if $LOG.debug?
60
62
  load_pipeline
61
- $LOG.debug "load_pages" if $LOG.debug?
63
+ $LOG.debug 'load_pages' if $LOG.debug?
62
64
  load_pages
63
- $LOG.debug "execute_pipeline" if $LOG.debug?
65
+ $LOG.debug 'execute_pipeline' if $LOG.debug?
64
66
  execute_pipeline
65
- $LOG.debug "configure_compass" if $LOG.debug?
67
+ $LOG.debug 'configure_compass' if $LOG.debug?
66
68
  configure_compass
67
- $LOG.debug "set_urls" if $LOG.debug?
69
+ $LOG.debug 'set_urls' if $LOG.debug?
68
70
  set_urls( site.pages )
69
- $LOG.debug "build_page_index" if $LOG.debug?
71
+ $LOG.debug 'build_page_index' if $LOG.debug?
70
72
  build_page_index
71
- $LOG.debug "generate_output" if $LOG.debug?
73
+ $LOG.debug 'generate_output' if $LOG.debug?
72
74
  generate_output
73
75
  end
74
76
 
@@ -233,6 +235,7 @@ module Awestruct
233
235
  Compass.configuration.project_type = :standalone
234
236
  Compass.configuration.project_path = site.config.dir
235
237
  Compass.configuration.sass_dir = 'stylesheets'
238
+ Compass.configuration.http_path = site.base_url
236
239
 
237
240
  site.images_dir = File.join( site.config.output_dir, 'images' )
238
241
  site.fonts_dir = File.join( site.config.output_dir, 'fonts' )
@@ -245,6 +248,8 @@ module Awestruct
245
248
  Compass.configuration.fonts_dir = 'fonts'
246
249
  Compass.configuration.line_comments = include_line_comments?
247
250
  Compass.configuration.output_style = compress_css?
251
+ Compass.configuration.relative_assets = false
252
+ # TODO: Should we add an on_stylesheet_error block?
248
253
 
249
254
  # port old style configuration to new Tilt-based configuration
250
255
  # TODO consider deprecating the old config mechanism and move to default-site.yml
@@ -26,7 +26,7 @@ module Awestruct
26
26
  html = %Q(<script>\n)
27
27
  html += %Q( var idcomments_acct='#{site.intense_debate_acct}';\n)
28
28
  html += %Q( var idcomments_post_id='#{post_id}';\n )
29
- html += %Q( var idcomments_post_url='#{self.url}';\n)
29
+ html += %Q( var idcomments_post_url='#{site.intense_debate_base_url || site.base_url}#{self.url}';\n)
30
30
  html += %Q(</script>\n)
31
31
  html += %Q(<script type='text/javascript' src='http://www.intensedebate.com/js/genericLinkWrapperV2.js'></script>\n)
32
32
  html
@@ -117,7 +117,7 @@ module Awestruct
117
117
 
118
118
  def pngcrush(page, input)
119
119
  filename = page.source_path
120
- cmd = Shellwords.escape("pngcrush #{filename} /tmp/pngcrush")
120
+ cmd = "pngcrush " + Shellwords.escape("#{filename}") + " /tmp/pngcrush"
121
121
  `#{cmd}`
122
122
  if $?.exitstatus != 0
123
123
  raise "Failed to execute pngcrush: #{cmd}"
@@ -3,9 +3,9 @@ Dir[ File.join( File.dirname(__FILE__), '*.rb' ) ].each do |f|
3
3
  begin
4
4
  require f
5
5
  rescue LoadError => e
6
- puts "WARNING: Missing required dependency to activate optional built-in extension #{File.basename(f)}\n #{e}"
6
+ puts "WARNING: Missing required dependency to activate optional built-in extension #{File.basename(f)}\n #{e}" if $LOG.debug?
7
7
  rescue StandardError => e
8
- puts "WARNING: Missing runtime configuration to activate optional built-in extension #{File.basename(f)}\n #{e}"
8
+ puts "WARNING: Missing runtime configuration to activate optional built-in extension #{File.basename(f)}\n #{e}" if $LOG.debug?
9
9
  end
10
10
  end
11
11
 
@@ -6,7 +6,13 @@ module Awestruct
6
6
 
7
7
  def relative(href, p = page)
8
8
  begin
9
- Pathname.new(href).relative_path_from(Pathname.new(File.dirname(p.output_path))).to_s
9
+ # Ignore absolute links
10
+ if href.start_with?("http://") || href.start_with?("https://")
11
+ result = href
12
+ else
13
+ result = Pathname.new(href).relative_path_from(Pathname.new(File.dirname(p.output_path))).to_s
14
+ end
15
+ result
10
16
  rescue Exception => e
11
17
  $LOG.error "#{e}" if $LOG.error?
12
18
  $LOG.error "#{e.backtrace.join("\n")}" if $LOG.error?
@@ -24,9 +24,13 @@
24
24
 
25
25
  source 'https://rubygems.org' # This tells Bundler where to look for gems
26
26
 
27
- gem 'awestruct', '>= 0.5.1' # Goes without saying
27
+ gem 'awestruct', '>= 0.5.3' # Goes without saying
28
28
  gem 'rake', '>= 0.9.2' # Needed for the Rakefile to work
29
29
  # gem 'coffee-script', '>= 2.2.0' # If using coffee-script or to remove the warning
30
+ # gem 'rb-fsevent', '~> 0.9', :require => false # to remove warning about pulling, Mac OSX
31
+ # gem 'rb-inotify', '>= 0.9.0', :require => false # to remove warning about pulling, Linux
32
+ # gem 'wdm', :platforms => [:mswin, :mingw], :require => false # to remove warning about pulling, Windows (ruby 1.9+)
33
+ # gem 'rb-fchange', '~> 0.0.6', :require => false # to remove warning about pulling, Windows (ruby 1.8.7)
30
34
  # gem 'therubyracer', '0.10.0', :platforms => :ruby # Javascript runtime on mri (needed for LESS and coffee-script)
31
35
  # gem 'therubyrhino', '~> 2.0.2', :platforms => :jruby # Javascript runtime on jruby (needed for LESS and coffee-script)
32
36
  # gem 'less', '>= 2.2.2' # If using LESS instead of sass
@@ -15,7 +15,7 @@
15
15
  .navbar.navbar-fixed-top
16
16
  .navbar-inner
17
17
  .container
18
- %a.brand{ :href=>"#{site.base_url}" } Project Name
18
+ %a.brand{ :href=>"#{site.base_url}" } #{site.name}
19
19
  %ul.nav
20
20
  %li
21
21
  %a{ :href=>"#{site.base_url}" } Home
@@ -23,7 +23,7 @@
23
23
  ~ content
24
24
  %hr
25
25
  %footer
26
- %p &copy; Organization #{Date.today.year}
26
+ %p &copy; #{site.org} #{Date.today.year}
27
27
  -# Uncomment script tags (remove leading -#) when you're ready to use behaviors
28
28
  -# %script{ :type=>'text/javascript', :src=>'//cdnjs.cloudflare.com/ajax/libs/jquery/1.9.1/jquery.min.js' }
29
29
  -# %script{ :type=>'text/javascript', :src=>"#{site.base_url}/javascripts/bootstrap-collapse.js" }
@@ -1,5 +1,5 @@
1
1
  require 'awestruct/handler_chain'
2
- require 'awestruct/handlers/file_handler'
2
+ require 'awestruct/handlers/verbatim_file_handler'
3
3
  require 'awestruct/handlers/css_tilt_handler'
4
4
  require 'awestruct/handlers/restructuredtext_handler'
5
5
  require 'awestruct/handlers/javascript_handler'
@@ -19,7 +19,7 @@ module Awestruct
19
19
  Awestruct::Handlers::AsciidoctorHandler::CHAIN,
20
20
  Awestruct::Handlers::TiltHandler::NON_INTERPOLATION_CHAIN,
21
21
  Awestruct::Handlers::TiltHandler::INTERPOLATION_CHAIN,
22
- HandlerChain.new( /.*/, Awestruct::Handlers::FileHandler )
22
+ HandlerChain.new( /.*/, Awestruct::Handlers::VerbatimFileHandler )
23
23
  ]
24
24
 
25
25
  def initialize(include_defaults=true)
@@ -10,16 +10,34 @@ require 'tilt'
10
10
  module Awestruct
11
11
  module Handlers
12
12
 
13
- class AsciidoctorMatcher
13
+ class AsciidoctorTiltMatcher < TiltMatcher
14
+ # Use a lightweight lookup to avoid loading Tilt templates for
15
+ # non-matching paths. Once we are sure this is a match, then
16
+ # attempt to load the Tilt template for AsciiDoc files.
14
17
  def match(path)
15
- engine = Tilt[path]
16
- engine == Tilt::AsciidoctorTemplate
18
+ # formal lookup as implemented in Tilt
19
+ pattern = File.basename(path.downcase)
20
+ registered = false
21
+ until pattern.empty? || (registered = Tilt.registered?(pattern))
22
+ # shave pattern down to next extension
23
+ pattern = pattern.sub(/^[^.]*\.?/, '')
24
+ end
25
+ if registered && (Tilt.mappings[pattern] || []).include?(Tilt::AsciidoctorTemplate)
26
+ begin
27
+ Tilt[File.basename(path)]
28
+ rescue LoadError
29
+ # swallowing error as it will be picked up again by primary TiltHandler
30
+ false
31
+ end
32
+ else
33
+ false
34
+ end
17
35
  end
18
36
  end
19
37
 
20
38
  class AsciidoctorHandler < BaseTiltHandler
21
39
 
22
- CHAIN = Awestruct::HandlerChain.new( Awestruct::Handlers::AsciidoctorMatcher.new(),
40
+ CHAIN = Awestruct::HandlerChain.new( Awestruct::Handlers::AsciidoctorTiltMatcher.new(),
23
41
  Awestruct::Handlers::FileHandler,
24
42
  Awestruct::Handlers::FrontMatterHandler,
25
43
  Awestruct::Handlers::AsciidoctorHandler,
@@ -4,10 +4,26 @@ require 'tilt'
4
4
 
5
5
  module Awestruct
6
6
  module Handlers
7
+
8
+ class TiltMatcher
9
+ # Returns the Tilt template class if a portion of the path is registered
10
+ # to a Tilt template and the Tilt template can be loaded. Returns false
11
+ # if no portions of the path are registered to a Tilt template or the
12
+ # Tilt template cannot be loaded.
13
+ def match(path)
14
+ begin
15
+ Tilt[File.basename(path)]
16
+ rescue LoadError => e
17
+ $LOG.warn(%(Copying #{path} to generated site without processing; missing required gem -- #{e.message.split(/ *-- */).last} (or equivalent)))
18
+ false
19
+ end
20
+ end
21
+ end
22
+
7
23
  class BaseTiltHandler < BaseHandler
8
24
 
9
25
  def initialize(site, delegate)
10
- super( site, delegate )
26
+ super(site, delegate)
11
27
  end
12
28
 
13
29
  def source_file_name
@@ -22,8 +38,8 @@ module Awestruct
22
38
  end
23
39
 
24
40
  def simple_name
25
- base = File.basename( source_file_name, File.extname( source_file_name ))
26
- return File.basename( base, File.extname( base ) ) if double_extension?
41
+ base = File.basename(source_file_name, File.extname(source_file_name))
42
+ return File.basename(base, File.extname(base)) if double_extension?
27
43
  return base
28
44
  end
29
45
 
@@ -32,11 +48,11 @@ module Awestruct
32
48
  end
33
49
 
34
50
  def input_extension
35
- File.extname( source_file_name )
51
+ File.extname(source_file_name)
36
52
  end
37
53
 
38
54
  def output_extension
39
- return File.extname( File.basename( source_file_name, File.extname( source_file_name ))) if double_extension?
55
+ return File.extname(File.basename(source_file_name, File.extname(source_file_name))) if double_extension?
40
56
 
41
57
  template = Tilt[path]
42
58
  if !template.nil?
@@ -55,7 +71,7 @@ module Awestruct
55
71
  def content_syntax
56
72
  # Check configuration for override, else convert extension to sym
57
73
  extension = input_extension[1..-1]
58
- if ( !site[:content_syntax].nil? && !site[:content_syntax].empty?)
74
+ if (!site[:content_syntax].nil? && !site[:content_syntax].empty?)
59
75
  syntax = site[:content_syntax][extension]
60
76
  return syntax.to_sym unless syntax.nil? or syntax.empty?
61
77
  end
@@ -103,10 +119,18 @@ module Awestruct
103
119
 
104
120
  def rendered_content(context, with_layouts=true)
105
121
  $LOG.debug "invoking tilt for #{delegate.path.to_s} with_layouts = #{with_layouts}" if $LOG.debug?
106
- template = Tilt::new(delegate.path.to_s, delegate.content_line_offset + 1, options) { |engine|
107
- delegate.rendered_content( context, with_layouts )
108
- }
109
- template.render( context )
122
+ begin
123
+ template = Tilt::new(delegate.path.to_s, delegate.content_line_offset + 1, options) { |engine|
124
+ delegate.rendered_content(context, with_layouts)
125
+ }
126
+ return template.render(context)
127
+ rescue LoadError => e
128
+ $LOG.error "Could not load template library required for rendering #{delegate.path.to_s}, please see rendered output for more information" if $LOG.error?
129
+ return "<h1>#{e.message}</h1><h2>Rendering file #{delegate.path.to_s} resulted in a failure.</h2><p>Backtrace: #{e.backtrace.join '<br>'}</p>"
130
+ rescue Exception => e
131
+ $LOG.error "An error during rendering #{delegate.path.to_s} occurred, please see rendered output for more information" if $LOG.error?
132
+ return "<h1>#{e.message}</h1><h2>Rendering file #{delegate.path.to_s} resulted in a failure.</h2><h3>Line: #{e.line if e.respond_to?(:line)}</h3><p>Backtrace: #{e.backtrace.join '<br>'}</p>"
133
+ end
110
134
  end
111
135
 
112
136
  end
@@ -43,27 +43,23 @@ module Awestruct
43
43
  end
44
44
 
45
45
  def raw_content
46
- read
47
- @content
46
+ load_content
48
47
  end
49
48
 
50
49
  def rendered_content(context, with_layouts=true)
51
50
  raw_content
52
51
  end
52
+
53
+ def read_content
54
+ File.open(@path, 'r') {|is| is.read }
55
+ end
53
56
 
54
57
  private
55
58
 
56
- def read
57
- ( @content = open ) if stale?
59
+ def load_content
60
+ ( @content = read_content ) if stale?
58
61
  @mtime = File.mtime( @path )
59
- return @content
60
- end
61
-
62
- def open
63
- input_stream = IO.open(IO.sysopen(@path, "rb"), "rb" )
64
- result = input_stream.read
65
- input_stream.close
66
- return result
62
+ @content
67
63
  end
68
64
 
69
65
  end
@@ -44,7 +44,7 @@ module Awestruct
44
44
  full_content = delegate.raw_content
45
45
 
46
46
  #if force_encoding is supported then set to charset defined in site config
47
- full_content.force_encoding(site.encoding) if (full_content.respond_to?(:force_encoding) && site.encoding)
47
+ full_content.force_encoding(site.encoding) if (site.encoding && full_content.respond_to?(:force_encoding))
48
48
 
49
49
  yaml_content = ''
50
50
 
@@ -17,7 +17,7 @@ module Awestruct
17
17
 
18
18
  content = content.gsub( /\\/, '\\\\\\\\' )
19
19
  content = content.gsub( /\\\\#/, '\\#' )
20
- content = content.gsub( Regexp.new('#(?!{)'), '\#' ) if ruby_19?
20
+ content = content.gsub( /#(?!\{)/, '\#' )
21
21
  content = content.gsub( '@', '\@' )
22
22
  content = "%@#{content}@"
23
23
  begin
@@ -30,11 +30,6 @@ module Awestruct
30
30
  c
31
31
 
32
32
  end
33
-
34
- def ruby_19?
35
- @is_ruby_19 ||= RUBY_VERSION >= '1.9'
36
- end
37
-
38
33
  end
39
34
  end
40
35
  end
@@ -11,18 +11,12 @@ require 'tilt'
11
11
  module Awestruct
12
12
  module Handlers
13
13
 
14
- class TiltMatcher
15
- def match(path)
16
- !Tilt[path].nil?
17
- end
18
- end
19
-
20
14
  class NonInterpolatingTiltMatcher
21
15
  EXT_REGEX = /\.(haml|slim|erb|mustache)$/
22
16
 
23
17
  def match(path)
24
18
  if match = EXT_REGEX.match(path)
25
- if match[0] == '.slim' && Tilt[path].nil?
19
+ if match[0] == '.slim' && !Tilt.registered?('slim')
26
20
  require 'slim'
27
21
  end
28
22
  true
@@ -0,0 +1,12 @@
1
+ require 'awestruct/handlers/file_handler'
2
+
3
+ module Awestruct
4
+ module Handlers
5
+ class VerbatimFileHandler < FileHandler
6
+ # Read file in binary mode so that it can be copied to the generated site as is
7
+ def read_content
8
+ File.open(@path, 'rb') {|is| is.read }
9
+ end
10
+ end
11
+ end
12
+ end