awestruct 0.5.6.beta8 → 0.5.6.beta9

Sign up to get free protection for your applications and to get access to all the features.
Files changed (60) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +2 -4
  3. data/Rakefile +1 -1
  4. data/awestruct.gemspec +22 -18
  5. data/lib/awestruct/cli/auto.rb +25 -21
  6. data/lib/awestruct/cli/generate.rb +3 -2
  7. data/lib/awestruct/cli/init.rb +2 -1
  8. data/lib/awestruct/cli/invoker.rb +4 -3
  9. data/lib/awestruct/cli/manifest.rb +41 -0
  10. data/lib/awestruct/cli/options.rb +10 -1
  11. data/lib/awestruct/cli/server.rb +36 -6
  12. data/lib/awestruct/config/default-site.yml +3 -0
  13. data/lib/awestruct/context.rb +17 -0
  14. data/lib/awestruct/context_helper.rb +25 -21
  15. data/lib/awestruct/deploy/s3_deploy.rb +41 -3
  16. data/lib/awestruct/engine.rb +64 -33
  17. data/lib/awestruct/extensions/disqus.rb +2 -2
  18. data/lib/awestruct/extensions/flattr.rb +1 -1
  19. data/lib/awestruct/extensions/pipeline.rb +30 -8
  20. data/lib/awestruct/extensions/relative.rb +3 -1
  21. data/lib/awestruct/extensions/sitemap.rb +6 -0
  22. data/lib/awestruct/extensions/sitemap.xml.haml +2 -1
  23. data/lib/awestruct/extensions/tagger.rb +7 -6
  24. data/lib/awestruct/extensions/template.atom.haml +1 -1
  25. data/lib/awestruct/frameworks/base_Gemfile +12 -1
  26. data/lib/awestruct/frameworks/bootstrap/base_index.html.haml +22 -20
  27. data/lib/awestruct/frameworks/bootstrap/base_layout.html.haml +9 -7
  28. data/lib/awestruct/handlers/asciidoctor_handler.rb +1 -1
  29. data/lib/awestruct/handlers/base_tilt_handler.rb +3 -1
  30. data/lib/awestruct/pipeline.rb +57 -7
  31. data/lib/awestruct/rack/generate.rb +43 -0
  32. data/lib/awestruct/util/exception_helper.rb +3 -0
  33. data/lib/awestruct/version.rb +1 -1
  34. data/spec/awestruct/cli/invoker_spec.rb +1 -1
  35. data/spec/awestruct/cli/options_spec.rb +14 -13
  36. data/spec/awestruct/cli/server_spec.rb +15 -0
  37. data/spec/awestruct/context_helper_spec.rb +5 -5
  38. data/spec/awestruct/engine_spec.rb +110 -1
  39. data/spec/awestruct/extensions/relative_spec.rb +22 -0
  40. data/spec/awestruct/handlers/asciidoc_handler_spec.rb +7 -1
  41. data/spec/awestruct/handlers/layout_handler_spec.rb +7 -7
  42. data/spec/awestruct/handlers/tilt_handler_spec.rb +1 -1
  43. data/spec/awestruct/pipeline_spec.rb +27 -2
  44. data/spec/awestruct/scm/git_spec.rb +4 -4
  45. data/spec/spec_helper.rb +6 -1
  46. data/spec/support/emmet_matchers.rb +1 -1
  47. data/spec/support/nokogiri_matchers.rb +1 -1
  48. data/spec/support/shared_handler_example.rb +66 -71
  49. data/spec/support/test-data/engine-generate-no-errors/_config/site.yml +26 -0
  50. data/spec/support/test-data/engine-generate-no-errors/_ext/pipeline.rb +8 -0
  51. data/spec/support/test-data/engine-generate-no-errors/_layouts/base.html.slim +6 -0
  52. data/spec/support/test-data/engine-generate-no-errors/index.html.slim +5 -0
  53. data/spec/support/test-data/engine-generate-with-errors/_config/site.yml +26 -0
  54. data/spec/support/test-data/engine-generate-with-errors/_ext/pipeline.rb +8 -0
  55. data/spec/support/test-data/engine-generate-with-errors/_layouts/base.html.slim +6 -0
  56. data/spec/support/test-data/engine-generate-with-errors/index.html.slim +6 -0
  57. data/spec/support/test-data/engine-yaml/_config/site.yml +9 -0
  58. data/spec/support/test-data/pipeline/_ext/extensions.rb +26 -0
  59. data/spec/support/test-data/pipeline/_ext/pipeline.rb +12 -0
  60. metadata +229 -72
@@ -24,6 +24,11 @@ module Awestruct
24
24
  if site.sitemap["excluded_extensions"]
25
25
  @excluded_extensions.merge(site.sitemap.excluded_extensions)
26
26
  end
27
+
28
+ # Check for a specified stylesheet for the sitemap
29
+ if site.sitemap["stylesheet_url"]
30
+ stylesheet_url = site.sitemap["stylesheet_url"]
31
+ end
27
32
  end
28
33
 
29
34
  # Go through all of the site's pages and add sitemap metadata
@@ -50,6 +55,7 @@ module Awestruct
50
55
  page.output_path = 'sitemap.xml'
51
56
  page.sitemap_entries = sitemap_pages
52
57
  page.do_not_track_dependencies = true
58
+ page.stylesheet_url = stylesheet_url || nil
53
59
 
54
60
  # Add the sitemap to our site
55
61
  site.pages << page
@@ -1,7 +1,8 @@
1
1
  ---
2
2
  ---
3
3
  !!! XML
4
-
4
+ - if !page.stylesheet_url.nil?
5
+ <?xml-stylesheet type='text/xsl' href='#{site.baseurl}#{page.stylesheet_url}'?>
5
6
  %urlset{ :xmlns=>'http://www.sitemaps.org/schemas/sitemap/0.9' }
6
7
  - unless page.sitemap_entries.empty?
7
8
  - for entry in page.sitemap_entries
@@ -20,7 +20,11 @@ module Awestruct
20
20
  module TagLinker
21
21
  def tag_links(delimiter = ', ', style_class = nil)
22
22
  class_attr = (style_class ? ' class="' + style_class + '"' : '')
23
- tags.map{|tag| %Q{<a#{class_attr} href="#{tag.primary_page.url}">#{tag}</a>}}.join(delimiter)
23
+ tags.map do |tag|
24
+ url = tag.primary_page.url
25
+ url << '/' unless (url.include?('.htm') || url.end_with?('/'))
26
+ %Q{<a#{class_attr} href="#{url}">#{tag}</a>}
27
+ end.join(delimiter)
24
28
  end
25
29
  end
26
30
 
@@ -45,14 +49,11 @@ module Awestruct
45
49
  @tags[tag] ||= TagStat.new( tag, [] )
46
50
  @tags[tag].pages << page
47
51
  end
52
+ page.tags = (page.tags || []).collect{|t| @tags[t]}
53
+ page.extend( TagLinker )
48
54
  end
49
55
  end
50
56
 
51
- all.each do |page|
52
- page.tags = (page.tags||[]).collect{|t| @tags[t]}
53
- page.extend( TagLinker )
54
- end
55
-
56
57
  ordered_tags = @tags.values
57
58
  ordered_tags.sort!{|l,r| -(l.pages.size <=> r.pages.size)}
58
59
  #ordered_tags = ordered_tags[0,100]
@@ -36,7 +36,7 @@
36
36
  - for tag in entry.tags
37
37
  %category{:term=>"#{tag}"}
38
38
  %summary
39
- #{summarize( html_to_text( entry.content ), 100 )}
39
+ #{summarize( html_to_text( entry.content ).strip, 100 )}
40
40
  %content{:type=>'html'}
41
41
  = clean_html( html_escape( fully_qualify_urls( site.base_url, find_and_preserve( entry.content ) ) ) )
42
42
 
@@ -24,9 +24,20 @@
24
24
 
25
25
  source 'https://rubygems.org' # This tells Bundler where to look for gems
26
26
 
27
- gem 'awestruct', '~> 0.5.3' # Goes without saying
27
+ gem 'awestruct', '>= <%= awestruct_version %>' # Goes without saying
28
28
  gem 'webrick', '~> 1.3.1' # The rack webserver to use in dev mode
29
29
 
30
+ gem 'compass', '<%= dependencies['compass'].requirement %>'
31
+ <% if framework.eql? 'bootstrap' %>
32
+ gem 'bootstrap-sass', '<%= dependencies['bootstrap-sass'].requirement %>'
33
+ <% end %>
34
+ <% if framework.eql? 'foundation' %>
35
+ gem 'zurb-foundation', '<%= dependencies['zurb-foundation'].requirement %>'
36
+ <% end %>
37
+ <% if framework.eql? '960' %>
38
+ gem 'compass-960-plugin', '<%= dependencies['compass-960-plugin'].requirement %>'
39
+ <% end %>
40
+
30
41
  # FIXME
31
42
  # gem 'rake', '>= 0.9.2' # Needed for the Rakefile to work
32
43
  # gem 'coffee-script', '>= 2.2.0' # If using coffee-script or to remove the warning
@@ -1,27 +1,29 @@
1
1
  ---
2
2
  layout: base
3
3
  ---
4
- .hero-unit
4
+ .jumbotron
5
5
  %h1 You're awestruct!
6
- %p This site is all setup to use Bootstrap 2 with Awestruct.
6
+ %p This site is all setup to use Bootstrap 3 with Awestruct.
7
7
  %p
8
- %a.btn.btn-primary.btn-large{ :href=>'http://awestruct.org' }
8
+ %a.btn.btn-primary.btn-lg{ :href=>'http://awestruct.org', :role=>"button" }
9
9
  %i.icon-info-sign.icon-white
10
10
  Learn more &raquo;
11
- .row
12
- .span4
13
- %h2 About
14
- %p Awestruct is a framework for creating static HTML sites. It's inspired by the awesome Jekyll utility in the same genre.
15
- %p Additionally, Awestruct integrates technologies such as Compass, Markdown and Haml.
16
- %p
17
- %a.btn{ :href=>'http://awestruct.org' } View details &raquo;
18
- .span4
19
- %h2 Goal
20
- %p The goal of Awestruct is to make it trivially easy to bake out non-trivial static websites. In addition to providing template-driven site creation (using Haml), Awestruct provides facilities for easily priming the site creation with additional non-page data.
21
- %p
22
- %a.btn{ :href=>'http://awestruct.org' } View details &raquo;
23
- .span4
24
- %h2 Concept
25
- %p The core concept of Awestruct is that of structures, specifically Ruby OpenStruct structures. The struct aspect allows arbitrary, schema-less data to be associated with a specific page or the entire site.
26
- %p
27
- %a.btn{ :href=>'http://awestruct.org' } View details &raquo;
11
+
12
+ .container-fluid
13
+ .row
14
+ .col-md-4
15
+ %h2 About
16
+ %p Awestruct is a framework for creating static HTML sites. It's inspired by the awesome Jekyll utility in the same genre.
17
+ %p Additionally, Awestruct integrates technologies such as Compass, Markdown and Haml.
18
+ %p
19
+ %a.btn{ :href=>'http://awestruct.org' } View details &raquo;
20
+ .col-md-4
21
+ %h2 Goal
22
+ %p The goal of Awestruct is to make it trivially easy to bake out non-trivial static websites. In addition to providing template-driven site creation (using Haml), Awestruct provides facilities for easily priming the site creation with additional non-page data.
23
+ %p
24
+ %a.btn{ :href=>'http://awestruct.org' } View details &raquo;
25
+ .col-md-4
26
+ %h2 Concept
27
+ %p The core concept of Awestruct is that of structures, specifically Ruby OpenStruct structures. The struct aspect allows arbitrary, schema-less data to be associated with a specific page or the entire site.
28
+ %p
29
+ %a.btn{ :href=>'http://awestruct.org' } View details &raquo;
@@ -12,13 +12,15 @@
12
12
  /[if lt IE 9]
13
13
  %script{ :type=>'text/javascript', :src=>'//html5shim.googlecode.com/svn/trunk/html5.js' }
14
14
  %body
15
- .navbar.navbar-fixed-top
16
- .navbar-inner
17
- .container
18
- %a.brand{ :href=>"#{site.base_url}" } #{site.name}
19
- %ul.nav
20
- %li
21
- %a{ :href=>"#{site.base_url}" } Home
15
+ %nav.navbar.navbar-default.navbar-fixed-top{:role=>'navigation'}
16
+ .container-fluid
17
+ .navbar-header
18
+ %a.navbar-brand{ :href=>"#{site.base_url}" } #{site.name}
19
+
20
+ %ul.nav.navbar-nav.navbar-right
21
+ %li
22
+ %a{ :href=>"#{site.base_url}" } Home
23
+
22
24
  .container
23
25
  ~ content
24
26
  %hr
@@ -23,7 +23,7 @@ module Awestruct
23
23
  end
24
24
  end
25
25
 
26
- class AsciidoctorHandler < BaseTiltHandler
26
+ class AsciidoctorHandler < TiltHandler
27
27
 
28
28
  CHAIN = Awestruct::HandlerChain.new( Awestruct::Handlers::AsciidoctorTiltMatcher.new(),
29
29
  Awestruct::Handlers::FileHandler,
@@ -137,12 +137,14 @@ module Awestruct
137
137
  ExceptionHelper.log_message "Could not load template library required for rendering #{File.join site.dir, error_page.source_path}."
138
138
  ExceptionHelper.log_message "Please see #{File.join site.dir, error_page.output_path} for more information"
139
139
  return ExceptionHelper.html_error_report e, error_page.source_path
140
- rescue Exception => e
140
+ rescue => e
141
141
  error_page = context[:page]
142
142
  if error_page[:__is_layout] == true
143
143
  ExceptionHelper.log_message "An error during rendering layout file #{File.join site.dir, error_page.source_path} occurred."
144
+ ExceptionHelper.log_building_error e, error_page.source_path
144
145
  else
145
146
  ExceptionHelper.log_message "An error during rendering #{File.join site.dir, error_page.source_path} occurred."
147
+ ExceptionHelper.log_building_error e, error_page.source_path
146
148
  end
147
149
  ExceptionHelper.log_message "Please see #{File.join site.dir, error_page.output_path} for more information"
148
150
  return ExceptionHelper.html_error_report e, error_page.source_path
@@ -6,18 +6,35 @@ module Awestruct
6
6
  class Pipeline
7
7
 
8
8
  attr_reader :handler_chains
9
+ attr_reader :before_all_extensions
10
+ attr_reader :extensions
11
+ attr_reader :after_all_extensions
12
+ attr_reader :helpers
13
+ attr_reader :transformers
14
+ attr_reader :after_generation_extensions
9
15
 
10
16
  def initialize()
11
17
  @handler_chains = HandlerChains.new
12
- @extensions = []
13
- @helpers = []
14
- @transformers = []
18
+ @before_all_extensions = []
19
+ @extensions = []
20
+ @helpers = []
21
+ @transformers = []
22
+ @after_all_extensions = []
23
+ @after_generation_extensions = []
24
+ end
25
+
26
+ def add_before_extension(e)
27
+ @before_all_extensions << e
15
28
  end
16
29
 
17
30
  def extension(e)
18
31
  @extensions << e
19
32
  # TC: why? transformer and extension?
20
- e.transform(@transformers) if e.respond_to?('transform')
33
+ e.transform(@transformers) if e.respond_to?(:transform)
34
+ end
35
+
36
+ def add_after_extension(e)
37
+ @after_all_extensions << e
21
38
  end
22
39
 
23
40
  def helper(h)
@@ -28,14 +45,37 @@ module Awestruct
28
45
  @transformers << t
29
46
  end
30
47
 
31
- def execute(site)
32
- execute_extensions(site)
48
+ def add_after_generation_extension(e)
49
+ @after_generation_extensions << e
33
50
  end
34
51
 
35
- def execute_extensions(site)
52
+ def execute(site, on_reload = false)
53
+ execute_extensions(site, on_reload)
54
+ end
55
+
56
+ def execute_extensions(site, on_reload)
57
+ @before_all_extensions.each do |e|
58
+ e.on_reload(site) if (on_reload && e.respond_to?(:on_reload))
59
+ if (e.respond_to? :execute)
60
+ e.execute(site)
61
+ else
62
+ e.before_extensions(site)
63
+ end
64
+ end
65
+
36
66
  @extensions.each do |e|
67
+ e.on_reload(site) if (on_reload && e.respond_to?(:on_reload))
37
68
  e.execute(site)
38
69
  end
70
+
71
+ @after_all_extensions.each do |e|
72
+ e.on_reload(site) if (on_reload && e.respond_to?(:on_reload))
73
+ if e.respond_to? :execute
74
+ e.execute(site)
75
+ else
76
+ e.after_generation(site)
77
+ end
78
+ end
39
79
  end
40
80
 
41
81
  def apply_transformers(site, page, rendered)
@@ -45,6 +85,16 @@ module Awestruct
45
85
  rendered
46
86
  end
47
87
 
88
+ def execute_after_generation(site)
89
+ @after_generation_extensions.each do |e|
90
+ if e.respond_to? :execute
91
+ e.execute(site)
92
+ else
93
+ e.after_generation(site)
94
+ end
95
+ end
96
+ end
97
+
48
98
  def mixin_helpers(context)
49
99
  context.extend( Awestruct::ContextHelper )
50
100
  @helpers.each do |h|
@@ -0,0 +1,43 @@
1
+
2
+ module Awestruct
3
+ module Rack
4
+
5
+ class GenerateOnAccess
6
+ def initialize(app)
7
+ @app = app
8
+ end
9
+
10
+ def call(env)
11
+ engine = ::Awestruct::Engine.instance
12
+
13
+ generate = false
14
+
15
+ req_path = env['REQUEST_PATH']
16
+ path = req_path
17
+ path = req_path + "index.html" if req_path.end_with? '/'
18
+
19
+ page = engine.site.pages_by_output_path[path]
20
+ if page.nil? and !req_path.end_with? '/'
21
+ path = req_path + "/index.html"
22
+ page = engine.site.pages_by_output_path[path]
23
+ end
24
+
25
+ if !page.nil?
26
+ generate_path = File.join( engine.site.config.output_dir, page.output_path )
27
+
28
+ generate = true if page.stale_output? generate_path
29
+ generate = true if path.end_with? '.html'
30
+ end
31
+
32
+ if generate
33
+ puts "Regenerate #{page.source_path}"
34
+
35
+ engine.generate_page page, true
36
+ end
37
+
38
+ @app.call(env)
39
+ end
40
+ end
41
+
42
+ end
43
+ end
@@ -1,5 +1,8 @@
1
1
  module Awestruct
2
2
  class ExceptionHelper
3
+
4
+ EXITCODES = {:generation_error => 125, :success => 0}
5
+
3
6
  @@failed = false
4
7
 
5
8
  def self.log_message message
@@ -1,3 +1,3 @@
1
1
  module Awestruct
2
- VERSION = '0.5.6.beta8'
2
+ VERSION = '0.5.6.beta9'
3
3
  end
@@ -76,7 +76,7 @@ describe Awestruct::CLI::Invoker do
76
76
  generator = double
77
77
  Awestruct::CLI::Generate.should_receive( :new ).and_return( generator )
78
78
  generator.should_receive( :run ).and_return( false )
79
- Awestruct::CLI::Invoker.new( %w(--source-dir spec/support/test-config --generate) ).invoke!.should be_false
79
+ expect(Awestruct::CLI::Invoker.new( %w(--source-dir spec/support/test-config --generate) ).invoke!).to be_falsey
80
80
  end
81
81
 
82
82
 
@@ -63,37 +63,38 @@ describe Awestruct::CLI::Options do
63
63
  parse!( '--auto' ).auto.should == true
64
64
  end
65
65
 
66
- it 'should parse script-related args' do
67
- pending 'Not yet implemented. See issue #248.'
68
- #parse!( '--run', 'puts "hi"' ).script.should == 'puts "hi"'
69
- end
66
+ # I'm not sure if we'll ever do this
67
+ # it 'should parse script-related args' do
68
+ # pending 'Not yet implemented. See issue #248.'
69
+ # #parse!( '--run', 'puts "hi"' ).script.should == 'puts "hi"'
70
+ # end
70
71
 
71
72
  it 'should turn off generate when doing a --deploy' do
72
73
  result = parse!( '--deploy' )
73
- result.deploy.should be_true
74
- result.generate.should be_false
74
+ result.deploy.should be_truthy
75
+ result.generate.should be_falsey
75
76
  end
76
77
 
77
78
  it 'should turn off generate when doing a --deploy unless explicitly turned back on' do
78
79
  result = parse!( '--deploy', '--generate' )
79
- result.deploy.should be_true
80
- result.generate.should be_true
80
+ result.deploy.should be_truthy
81
+ result.generate.should be_truthy
81
82
 
82
83
  result = parse!( '--generate', '--deploy' )
83
- result.deploy.should be_true
84
- result.generate.should be_true
84
+ result.deploy.should be_truthy
85
+ result.generate.should be_truthy
85
86
  end
86
87
 
87
88
  it 'should turn on verbose when -w or --verbose is explicitly turned back on' do
88
89
  result = parse!( '-w' )
89
- result.verbose.should be_true
90
+ result.verbose.should be_truthy
90
91
 
91
92
  result = parse!( '--verbose' )
92
- result.verbose.should be_true
93
+ result.verbose.should be_truthy
93
94
  end
94
95
 
95
96
  it 'should generate by default' do
96
- parse!().generate.should be_true
97
+ parse!().generate.should be_truthy
97
98
  end
98
99
 
99
100
  it 'should parse directory options' do
@@ -0,0 +1,15 @@
1
+ require 'awestruct/cli/server'
2
+ require 'awestruct/cli/options'
3
+ require 'socket'
4
+ require 'timeout'
5
+
6
+ describe Awestruct::CLI::Server do
7
+
8
+ let(:subject) { Awestruct::CLI::Server.new('./')}
9
+
10
+ it 'should abort if the port is already in use' do
11
+ server = class_double(TCPServer).as_stubbed_const(:transfer_nested_constants => true)
12
+ expect(server).to receive(:new).and_raise(Errno::EADDRINUSE)
13
+ expect(lambda { Timeout.timeout(0.2) { subject.run } }).to raise_error(SystemExit)
14
+ end
15
+ end
@@ -76,21 +76,21 @@ describe Awestruct::ContextHelper do
76
76
  describe "fully_qualify_urls" do
77
77
  it "should fix anchor tags" do
78
78
  str = "<a href='/foo'>foobar</a>"
79
- @tester.fully_qualify_urls('http://foobar.com', str).should == "<a href=\"http://foobar.com/foo\">foobar</a>"
79
+ @tester.fully_qualify_urls('http://foobar.com', str).should == %q(<a href="http://foobar.com/foo">foobar</a>)
80
80
  end
81
81
 
82
82
  it "should fix link tags" do
83
- str = "<link href='/foo' />"
84
- @tester.fully_qualify_urls('http://foobar.com', str).should == "<link href=\"http://foobar.com/foo\"/>"
83
+ str = "<link href='/foo'>"
84
+ @tester.fully_qualify_urls('http://foobar.com', str).should == %q(<link href="http://foobar.com/foo" />)
85
85
  end
86
86
 
87
87
  it "should fix image tags" do
88
88
  str = "<img src='/foo' />"
89
- @tester.fully_qualify_urls('http://foobar.com', str).should == "<img src=\"http://foobar.com/foo\"/>"
89
+ @tester.fully_qualify_urls('http://foobar.com', str).should == %q(<img src="http://foobar.com/foo" />)
90
90
  end
91
91
 
92
92
  it "should leave anchor tags with no href attribute (for page anchors) unchanged" do
93
- str = "<a target=\"#foo\">foobar</a>"
93
+ str = %q(<a target="#foo">foobar</a>)
94
94
  @tester.fully_qualify_urls('http://foobar.com', str).should == str
95
95
  end
96
96
  end