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
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1a8d2495c7be41463bac737e49d8dca28bf76af3
4
- data.tar.gz: 6f60f7e695ef3c1531c99f946fc0a1203775c6e5
3
+ metadata.gz: ca256f329051e03285724bbdd41dde4562ce6ce6
4
+ data.tar.gz: 995924213e455a5840477dacda5263c860f44225
5
5
  SHA512:
6
- metadata.gz: ed6f840947b88fa82175af61ac409e5d28ad640cf10cbb0fddb1b932b9c8685d11a93b2406d311e2a4b2009ab953d927e3d525073de245c0bd580e1d0b1f09fd
7
- data.tar.gz: dfa0cf671a112d65e40967a53e9e86d4823c05cbed74273b4080d15c3fe57818eeaeb5940e6e6becb1765e9c80b406f84734f8a0e07339475659483de30cc6fd
6
+ metadata.gz: 1ac323c0af741443132a7e8c1fa15a7e2d35e82af15c0333ddc38997ff9743311843a3acf09afebb007f5908d2835dae488ec4f29dcf59eeeaca3c6e1bbf719f
7
+ data.tar.gz: 5841d1ab558f57cd09a8bcf51ab91d4e98a709fe76f6e6fe4a086240d823615a0d88740d58071418a2734ec0eee18a39b01fe3dc345df4a8162ef3c5561f8f6a
data/Gemfile CHANGED
@@ -2,10 +2,8 @@ source 'https://rubygems.org'
2
2
 
3
3
  group :development do
4
4
  gem 'hashery', '~> 2.1.1'
5
- gem 'rspec', '~> 2.14.1'
6
- gem 'rake', '~> 10.2.2'
7
- gem 'guard-rspec', '~> 4.2.0', :require => false
8
5
  gem 'pry', :require => false
6
+ gem 'rake', :require => false
9
7
  #gem 'pry-byebug', :require => false
10
8
  end
11
9
 
@@ -14,7 +12,7 @@ group :test do
14
12
  gem 'rack-test', '~> 0.6.2'
15
13
  gem 'tilt', '~> 2.0.1'
16
14
  gem 'coffee-script', '~> 2.2.0'
17
- gem 'asciidoctor', '~> 0.1.4'
15
+ gem 'asciidoctor', '1.5.2'
18
16
  gem 'slim', '~> 2.0.2'
19
17
  gem 'kramdown', '~> 1.3.3'
20
18
  gem 'therubyracer', '~> 0.12.1', :platforms => :ruby
data/Rakefile CHANGED
@@ -40,7 +40,7 @@ else
40
40
  desc 'Run all specs'
41
41
  RSpec::Core::RakeTask.new(:spec) do |t|
42
42
  t.pattern = 'spec/**/*_spec.rb'
43
- t.rspec_opts = ['-cfs']
43
+ t.rspec_opts = ['-c']
44
44
  end
45
45
  end
46
46
 
data/awestruct.gemspec CHANGED
@@ -4,7 +4,7 @@ require 'awestruct/version'
4
4
  spec = Gem::Specification.new do |s|
5
5
  s.name = 'awestruct'
6
6
  s.version = Awestruct::VERSION
7
- s.date = '2015-01-12'
7
+ s.date = '2015-07-24'
8
8
 
9
9
  s.authors = ['Bob McWhirter', 'Jason Porter', 'Lance Ball', 'Dan Allen', 'Torsten Curdt', 'other contributors']
10
10
  s.email = ['bob@mcwhirter.org', 'lightguard.jp@gmail.com', 'lball@redhat.com', 'dan.j.allen@gmail.com', 'tcurdt@vafer.org']
@@ -32,22 +32,26 @@ Any markup languages you are using and its dependencies.
32
32
  Haml and Markdown filters are touchy things. Redcarpet or Rdiscount work well if you're running on MRI. JRuby should be using haml 4.0.0+ with Kramdown.'
33
33
  EOS
34
34
 
35
- s.add_dependency 'haml', '~> 4.0.5'
36
- s.add_dependency 'asciidoctor' # we're pretty good about backwards compat
37
- s.add_dependency 'tilt', '~> 2.0.1'
38
- s.add_dependency 'compass', '~> 1.0.1'
39
- s.add_dependency 'compass-960-plugin', '~> 0.10.4'
40
- s.add_dependency 'bootstrap-sass', '~> 3.2.0.2'
41
- s.add_dependency 'zurb-foundation', '~> 4.3.2'
35
+ s.add_dependency 'haml', '~> 4.0', '>= 4.0.5'
36
+ s.add_dependency 'asciidoctor', '~> 1.5', '>= 1.5.2'
37
+ s.add_dependency 'tilt', '~> 2.0', '>= 2.0.1'
42
38
  s.add_dependency 'mime-types', '~> 2.1'
43
- s.add_dependency 'rest-client', '~> 1.7.2'
44
- s.add_dependency 'ruby-s3cmd', '~> 0.1.5'
45
- s.add_dependency 'listen', '~> 2.7.1'
46
- s.add_dependency 'rack', '~> 1.5.2'
47
- s.add_dependency 'git', '~> 1.2.6'
48
- s.add_dependency 'guard-livereload', '~> 2.1.2'
49
- s.add_dependency 'colorize', '~> 0.7.1'
50
- s.add_dependency 'parallel', '> 1.1.1'
51
-
52
- s.add_development_dependency 'nokogiri', '~> 1.5.10'
39
+ s.add_dependency 'rest-client', '~> 1.7', '>= 1.7.2'
40
+ s.add_dependency 'listen', '~> 2.7', '>= 2.7.1'
41
+ s.add_dependency 'rack', '~> 1.5', '>= 1.5.2'
42
+ s.add_dependency 'git', '~> 1.2', '>= 1.2.6'
43
+ s.add_dependency 'guard-livereload', '~> 2.1', '>= 2.1.2'
44
+ s.add_dependency 'colorize', '~> 0.7', '>= 0.7.1'
45
+ s.add_dependency 'oga', '~> 0.3'
46
+ s.add_dependency 'sass', '~> 3.2'
47
+ s.add_dependency 'compass', '~> 1', '>= 1.0.1'
48
+ s.add_dependency 'parallel', '~> 1.1', '> 1.1.1'
49
+
50
+ s.add_development_dependency 'nokogiri', '~> 1.5.0','>= 1.5.10'
51
+ s.add_development_dependency 'compass-960-plugin', '~> 0.10','>= 0.10.4'
52
+ s.add_development_dependency 'bootstrap-sass', '~> 3', '>= 3.2.0.2'
53
+ s.add_development_dependency 'zurb-foundation', '~> 4.3.2', '>= 4.3.2'
54
+ s.add_development_dependency 'simplecov', '~> 0.9'
55
+ s.add_development_dependency 'rspec', '~> 3.0'
56
+ s.add_development_dependency 'guard-rspec', '~> 4.0'
53
57
  end
@@ -18,12 +18,18 @@ module Awestruct
18
18
  generate_thread = nil
19
19
  current_path = nil
20
20
 
21
- guard = if ( @config.options.livereload )
22
- guard = Guard::LiveReload.new
23
- guard.start
24
- guard
25
- else
26
- nil
21
+ begin
22
+ guard = if ( @config.options.livereload )
23
+ Guard.init({})
24
+ guard = Guard::LiveReload.new
25
+ guard.start
26
+ guard
27
+ else
28
+ nil
29
+ end
30
+ rescue => e
31
+ puts e
32
+ puts e.backtrace
27
33
  end
28
34
 
29
35
  force_polling = ( RUBY_PLATFORM =~ /mingw/ ? true : false )
@@ -45,26 +51,24 @@ module Awestruct
45
51
 
46
52
  generate_thread = Thread.new {
47
53
  begin
48
- if ( File.extname(path) == '.sass' || File.extname(path) == '.scss' )
49
- # TODO use sass here, eventually, as soon as I can figure out how to get it and sprites to work
50
- ::Compass::Commands::UpdateProject.new(engine.site.dir, {}).perform
51
- # fixes the nil later on, there's an outstanding bug that css
52
- # pages aren't output in the correct directory
53
- pages = []
54
- else
55
- page = engine.page_by_source_path(path)
56
- pages = []
57
- if ( page )
54
+ page = engine.page_by_source_path(path)
55
+ pages = []
56
+ if ( page )
57
+ unless ( guard )
58
58
  pages = engine.generate_page_and_dependencies( page )
59
59
  else
60
- if File.exist? path
61
- # chances are this is an extension or yaml file
62
- pages = engine.run_auto_for_non_page(path)
63
- end
60
+ pages = engine.page_dependencies( page )
61
+ end
62
+ else
63
+ if File.exist? path
64
+ # chances are this is an extension or yaml file
65
+ pages = engine.run_auto_for_non_page(path, !@config.options.generate_on_access)
64
66
  end
65
67
  end
66
68
 
67
- $LOG.info "Regeneration finished." if $LOG.info?
69
+ unless ( guard )
70
+ $LOG.info "Regeneration finished." if $LOG.info?
71
+ end
68
72
 
69
73
  if ( guard )
70
74
  urls = pages.map do |p|
@@ -6,11 +6,12 @@ module Awestruct
6
6
  module CLI
7
7
  class Generate
8
8
 
9
- def initialize(config, profile=nil, base_url=nil, default_base_url=Options::DEFAULT_BASE_URL, force=false)
9
+ def initialize(config, profile=nil, base_url=nil, default_base_url=Options::DEFAULT_BASE_URL, force=false, generate=true)
10
10
  @profile = profile
11
11
  @base_url = base_url
12
12
  @default_base_url = default_base_url
13
13
  @force = force
14
+ @generate = generate
14
15
  @engine = Awestruct::Engine.new( config )
15
16
  end
16
17
 
@@ -18,7 +19,7 @@ module Awestruct
18
19
  begin
19
20
  base_url = @base_url || @default_base_url
20
21
  $LOG.info "Generating site: #{base_url}" if $LOG.info?
21
- @engine.run( @profile, @base_url, @default_base_url, @force )
22
+ @engine.run( @profile, @base_url, @default_base_url, @force, @generate )
22
23
  rescue =>e
23
24
  ExceptionHelper.log_building_error e, ''
24
25
  return false
@@ -18,7 +18,6 @@ module Awestruct
18
18
  copy_file('_ext/pipeline.rb', Init.framework_path('base_pipeline.rb'))
19
19
  copy_file('.awestruct_ignore', Init.framework_path('base_awestruct_ignore'))
20
20
  copy_file('Rakefile', Init.framework_path('base_Rakefile'))
21
- copy_file('Gemfile', Init.framework_path('base_Gemfile'))
22
21
  mkdir('stylesheets')
23
22
  }
24
23
 
@@ -31,6 +30,8 @@ module Awestruct
31
30
  def run()
32
31
  manifest = Manifest.new(BASE_MANIFEST)
33
32
  scaffold_name = @framework
33
+ manifest.template_file('Gemfile', Init.framework_path('base_Gemfile'), {:framework => @framework})
34
+
34
35
  lib = nil
35
36
  case @framework
36
37
  when 'compass'
@@ -3,6 +3,7 @@ require 'logger'
3
3
  require 'awestruct/logger'
4
4
  require 'awestruct/cli/options'
5
5
  require 'awestruct/util/exception_helper'
6
+ require 'erb'
6
7
 
7
8
  module Awestruct
8
9
  module CLI
@@ -72,7 +73,7 @@ module Awestruct
72
73
  abort( "No config file at #{site_yaml_file}" )
73
74
  end
74
75
 
75
- site_yaml = YAML.load( File.read( site_yaml_file ) )
76
+ site_yaml = YAML.load( ERB.new(File.read( site_yaml_file )).result )
76
77
 
77
78
  if ( !site_yaml )
78
79
  abort( "Failed to parse #{site_yaml_file}" )
@@ -122,7 +123,7 @@ module Awestruct
122
123
 
123
124
  def invoke_generate()
124
125
  base_url = profile['base_url'] || options.base_url
125
- @success = Awestruct::CLI::Generate.new( config, options.profile, base_url, Options::DEFAULT_BASE_URL, options.force ).run
126
+ @success = Awestruct::CLI::Generate.new( config, options.profile, base_url, Options::DEFAULT_BASE_URL, options.force, !options.generate_on_access ).run
126
127
  end
127
128
 
128
129
  def invoke_deploy()
@@ -144,7 +145,7 @@ module Awestruct
144
145
  end
145
146
 
146
147
  def invoke_server()
147
- run_in_thread( Awestruct::CLI::Server.new( options.output_dir, options.bind_addr, options.port ) )
148
+ run_in_thread( Awestruct::CLI::Server.new( options.output_dir, options.bind_addr, options.port, options.generate_on_access ) )
148
149
  end
149
150
 
150
151
 
@@ -1,6 +1,9 @@
1
1
  require 'sass/callbacks'
2
2
  require 'compass'
3
3
  require 'compass/commands'
4
+ require 'erb'
5
+ require 'rubygems/specification'
6
+ require 'ostruct'
4
7
 
5
8
  # TODO: We could create our own installer and use that
6
9
 
@@ -22,6 +25,10 @@ module Awestruct
22
25
  steps << MkDir.new(path)
23
26
  end
24
27
 
28
+ def template_file(path, input_path, state = {})
29
+ steps << TemplateFile.new(path, input_path, state.merge(load_gem))
30
+ end
31
+
25
32
  def copy_file(path, input_path, opts = {})
26
33
  steps << CopyFile.new(path, input_path, opts)
27
34
  end
@@ -68,6 +75,18 @@ module Awestruct
68
75
  end
69
76
  end
70
77
 
78
+ private
79
+
80
+ def load_gem
81
+ spec = {:dependencies => {}}
82
+ gem_spec = Gem::Specification::load(
83
+ File.join(File.dirname(__FILE__), "../../../", "awestruct.gemspec"))
84
+
85
+ gem_spec.dependencies.each { |d| spec[:dependencies][d.name] = d}
86
+ spec[:awestruct_version] = gem_spec.version
87
+ spec
88
+ end
89
+
71
90
  ##
72
91
  ##
73
92
  ##
@@ -202,6 +221,28 @@ module Awestruct
202
221
 
203
222
  end
204
223
 
224
+ class TemplateFile
225
+ def initialize(path, input_path, state = {})
226
+ @path = path
227
+ @input_path = input_path
228
+ @state = state
229
+ end
230
+
231
+ def perform(dir)
232
+
233
+ rendered = ERB.new(File.read(@input_path), nil, '<>').result(
234
+ OpenStruct.new(@state).instance_eval { binding })
235
+
236
+ p = File.join(dir, @path)
237
+ $LOG.info "Create file: #{p}" if $LOG.info?
238
+ File.open(p, 'w') { |f| f.write(rendered) }
239
+ end
240
+
241
+ def unperform(dir)
242
+ # nothing
243
+ end
244
+ end
245
+
205
246
  class InstallCompass
206
247
  def initialize(framework='compass')
207
248
  @framework = framework
@@ -16,6 +16,7 @@ module Awestruct
16
16
  DEFAULT_BIND_ADDR = '0.0.0.0'
17
17
  DEFAULT_PORT = 4242
18
18
  DEFAULT_BASE_URL = %(http://#{LOCAL_HOSTS[DEFAULT_BIND_ADDR] || DEFAULT_BIND_ADDR}:#{DEFAULT_PORT})
19
+ DEFAULT_GENERATE_ON_ACCESS = false
19
20
 
20
21
  attr_accessor :generate
21
22
  attr_accessor :server
@@ -36,6 +37,7 @@ module Awestruct
36
37
  attr_accessor :output_dir
37
38
  attr_accessor :livereload
38
39
  attr_accessor :debug
40
+ attr_accessor :generate_on_access
39
41
 
40
42
  def initialize()
41
43
  @generate = nil
@@ -56,6 +58,7 @@ module Awestruct
56
58
  @livereload = false
57
59
  @source_dir = Dir.pwd
58
60
  @output_dir = File.expand_path '_site'
61
+ @generate_on_access = DEFAULT_GENERATE_ON_ACCESS
59
62
  end
60
63
 
61
64
  def self.parse!(args)
@@ -92,12 +95,13 @@ module Awestruct
92
95
  opts.on( '-u', '--url URL', 'Set site.base_url' ) do |url|
93
96
  self.base_url = url
94
97
  end
95
- opts.on( '-d', '--dev', "Run site in development mode (--auto, --server, --port #{DEFAULT_PORT} and --profile development)" ) do |url|
98
+ opts.on( '-d', '--dev', "Run site in development mode (--auto, --server, --port #{DEFAULT_PORT}, --profile development, --livereload and --generate_on_access)" ) do |url|
96
99
  self.server = true
97
100
  self.auto = true
98
101
  self.port = DEFAULT_PORT
99
102
  self.profile = 'development'
100
103
  self.livereload = true
104
+ self.generate_on_access = true
101
105
  end
102
106
  opts.on( '-a', '--auto', 'Auto-generate when changes are noticed' ) do |a|
103
107
  self.auto = a
@@ -105,6 +109,11 @@ module Awestruct
105
109
  end
106
110
  opts.on( '--[no-]livereload', 'Support for browser livereload' ) do |livereload|
107
111
  self.livereload = livereload
112
+ self.generate_on_access = true if self.livereload
113
+ end
114
+
115
+ opts.on( '--[no-]generate-on-access', 'Support for calling generate on HTTP access' ) do |generate_on_access|
116
+ self.generate_on_access = generate_on_access
108
117
  end
109
118
 
110
119
  opts.on( '-P', '--profile PROFILE', 'Activate a configuration profile' ) do |profile|
@@ -1,27 +1,57 @@
1
1
  require 'rack'
2
+ require 'rack/builder'
2
3
  require 'rack/server'
3
4
  require 'awestruct/rack/app'
5
+ require 'awestruct/rack/generate'
6
+ require 'awestruct/cli/options'
4
7
 
5
8
  module Awestruct
6
9
  module CLI
7
10
  class Server
8
11
  attr_reader :server
9
12
 
10
- def initialize(path, bind_addr=Options::DEFAULT_BIND_ADDR, port=Options::DEFAULT_PORT)
13
+ def initialize(path, bind_addr=Options::DEFAULT_BIND_ADDR, port=Options::DEFAULT_PORT, generate_on_access=Options::DEFAULT_GENERATE_ON_ACCESS)
11
14
  @path = path
12
15
  @bind_addr = bind_addr
13
16
  @port = port
17
+ @generate_on_access = generate_on_access
14
18
  end
15
19
 
16
20
  def run
21
+ unless port_open? (Options::LOCAL_HOSTS[@bind_addr] || @bind_addr), @port
22
+ $LOG.error "#{Options::LOCAL_HOSTS[@bind_addr] || @bind_addr}:#{@port} not available for server" if $LOG.error?
23
+ abort
24
+ end
17
25
  url = %(http://#{Options::LOCAL_HOSTS[@bind_addr] || @bind_addr}:#{@port})
18
26
  msg = %(Starting preview server at #{url} (Press Ctrl-C to shutdown))
19
- puts %(#{'*' * msg.length}\n#{msg}\n#{'*' * msg.length}\n)
20
- ::Rack::Server::start( :app => Awestruct::Rack::App.new( @path ),
21
- :Port => @port,
22
- :Host => @bind_addr
23
- )
27
+ $LOG.info %(#{'*' * msg.length}\n#{msg}\n#{'*' * msg.length}\n) if $LOG.info?
28
+
29
+ path = @path
30
+ generate_on_access = @generate_on_access
31
+ app = ::Rack::Builder.new do
32
+ use Awestruct::Rack::GenerateOnAccess if generate_on_access
33
+ map "/" do
34
+ run Awestruct::Rack::App.new( path )
35
+ end
36
+ end
37
+
38
+ ::Rack::Server::start( :app => app,
39
+ :Port => @port,
40
+ :Host => @bind_addr
41
+ )
24
42
  end
43
+
44
+ private
45
+ # Private. Checks to see if the port is open.
46
+ def port_open?(addr, port)
47
+ begin
48
+ s = TCPServer.new(addr, port)
49
+ s.close
50
+ true
51
+ rescue
52
+ false
53
+ end
54
+ end
25
55
  end
26
56
  end
27
57
  end
@@ -42,6 +42,9 @@ asciidoctor:
42
42
  textile:
43
43
  :no_span_caps: true
44
44
 
45
+ generation:
46
+ :in_theads: <%= Parallel.processor_count * 10 %>
47
+
45
48
  profiles:
46
49
  development:
47
50
  show_drafts: true
@@ -11,6 +11,23 @@ module Awestruct
11
11
  @page = hash[:page]
12
12
  @site = hash[:site]
13
13
 
14
+ # Update the front matter from the handler chain
15
+ @page.handler.front_matter.each do |k,v|
16
+ k_sym = k.to_sym
17
+ if @page.key? k_sym
18
+ if @page[k_sym].is_a?(Array) && v.is_a?(Array)
19
+ page_values = @page[k_sym].collect {|value| value.class.to_s}.sort
20
+ front_matter_values = v.collect {|value| value.class.to_s}.sort
21
+ @page[k_sym] = v if page_values.eql? front_matter_values
22
+ elsif @page[k_sym].is_a?(Hash) && v.is_a?(Hash)
23
+ page_values = @page[k_sym].collect {|key, value| value.class.to_s}.sort
24
+ front_matter_values = v.collect {|key, value| value.class.to_s}.sort
25
+ @page[k_sym] = v if page_values.eql? front_matter_values
26
+ else
27
+ @page[k_sym] = v if @page.key?(k_sym) && (@page[k_sym].class == v.class)
28
+ end
29
+ end
30
+ end
14
31
  end
15
32
 
16
33
  def inspect