bunto 3.0.0 → 3.2.1

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 (101) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +124 -76
  3. data/README.markdown +49 -12
  4. data/{bin → exe}/bunto +18 -14
  5. data/lib/bunto.rb +83 -78
  6. data/lib/bunto/cleaner.rb +10 -8
  7. data/lib/bunto/collection.rb +33 -17
  8. data/lib/bunto/command.rb +19 -13
  9. data/lib/bunto/commands/build.rb +22 -14
  10. data/lib/bunto/commands/clean.rb +9 -8
  11. data/lib/bunto/commands/doctor.rb +10 -8
  12. data/lib/bunto/commands/help.rb +4 -3
  13. data/lib/bunto/commands/new.rb +30 -21
  14. data/lib/bunto/commands/new_theme.rb +36 -0
  15. data/lib/bunto/commands/serve.rb +26 -20
  16. data/lib/bunto/commands/serve/servlet.rb +4 -5
  17. data/lib/bunto/configuration.rb +187 -125
  18. data/lib/bunto/converters/markdown.rb +19 -9
  19. data/lib/bunto/converters/markdown/kramdown_parser.rb +12 -5
  20. data/lib/bunto/converters/markdown/rdiscount_parser.rb +4 -4
  21. data/lib/bunto/converters/markdown/redcarpet_parser.rb +90 -84
  22. data/lib/bunto/convertible.rb +38 -25
  23. data/lib/bunto/deprecator.rb +11 -6
  24. data/lib/bunto/desktop.ini +2 -0
  25. data/lib/bunto/document.rb +53 -51
  26. data/lib/bunto/drops/bunto_drop.rb +12 -0
  27. data/lib/bunto/drops/document_drop.rb +40 -5
  28. data/lib/bunto/drops/drop.rb +49 -10
  29. data/lib/bunto/drops/excerpt_drop.rb +15 -0
  30. data/lib/bunto/drops/site_drop.rb +4 -2
  31. data/lib/bunto/drops/url_drop.rb +4 -4
  32. data/lib/bunto/entry_filter.rb +64 -19
  33. data/lib/bunto/errors.rb +6 -3
  34. data/lib/bunto/excerpt.rb +4 -6
  35. data/lib/bunto/external.rb +4 -4
  36. data/lib/bunto/filters.rb +72 -39
  37. data/lib/bunto/frontmatter_defaults.rb +45 -38
  38. data/lib/bunto/hooks.rb +21 -21
  39. data/lib/bunto/layout.rb +4 -8
  40. data/lib/bunto/liquid_renderer.rb +14 -3
  41. data/lib/bunto/liquid_renderer/file.rb +5 -1
  42. data/lib/bunto/liquid_renderer/table.rb +11 -11
  43. data/lib/bunto/log_adapter.rb +2 -2
  44. data/lib/bunto/page.rb +10 -10
  45. data/lib/bunto/plugin.rb +5 -5
  46. data/lib/bunto/plugin_manager.rb +12 -8
  47. data/lib/bunto/publisher.rb +1 -1
  48. data/lib/bunto/reader.rb +11 -7
  49. data/lib/bunto/readers/data_reader.rb +9 -9
  50. data/lib/bunto/readers/layout_reader.rb +7 -7
  51. data/lib/bunto/readers/page_reader.rb +3 -1
  52. data/lib/bunto/readers/post_reader.rb +9 -10
  53. data/lib/bunto/readers/static_file_reader.rb +3 -1
  54. data/lib/bunto/regenerator.rb +50 -28
  55. data/lib/bunto/related_posts.rb +1 -1
  56. data/lib/bunto/renderer.rb +33 -23
  57. data/lib/bunto/site.rb +94 -51
  58. data/lib/bunto/static_file.rb +33 -26
  59. data/lib/bunto/stevenson.rb +6 -5
  60. data/lib/bunto/tags/highlight.rb +50 -35
  61. data/lib/bunto/tags/include.rb +42 -31
  62. data/lib/bunto/tags/link.rb +11 -4
  63. data/lib/bunto/tags/post_url.rb +8 -7
  64. data/lib/bunto/theme.rb +10 -8
  65. data/lib/bunto/theme_builder.rb +117 -0
  66. data/lib/bunto/url.rb +21 -14
  67. data/lib/bunto/utils.rb +57 -28
  68. data/lib/bunto/utils/ansi.rb +9 -9
  69. data/lib/bunto/utils/platforms.rb +2 -2
  70. data/lib/bunto/version.rb +1 -1
  71. data/lib/site_template/_config.yml +3 -1
  72. data/lib/site_template/_posts/0000-00-00-welcome-to-bunto.markdown.erb +3 -3
  73. data/lib/site_template/about.md +3 -3
  74. data/lib/site_template/css/main.scss +3 -17
  75. data/lib/theme_template/CODE_OF_CONDUCT.md.erb +74 -0
  76. data/lib/theme_template/Gemfile +2 -0
  77. data/lib/theme_template/LICENSE.txt.erb +21 -0
  78. data/lib/theme_template/README.md.erb +48 -0
  79. data/lib/theme_template/_layouts/default.html +1 -0
  80. data/lib/theme_template/_layouts/page.html +5 -0
  81. data/lib/theme_template/_layouts/post.html +5 -0
  82. data/lib/theme_template/example/_config.yml.erb +1 -0
  83. data/lib/theme_template/example/_post.md +12 -0
  84. data/lib/theme_template/example/index.html +14 -0
  85. data/lib/theme_template/example/style.scss +7 -0
  86. data/lib/theme_template/gitignore.erb +4 -0
  87. data/lib/theme_template/theme.gemspec.erb +18 -0
  88. metadata +40 -19
  89. data/lib/site_template/_includes/footer.html +0 -38
  90. data/lib/site_template/_includes/head.html +0 -12
  91. data/lib/site_template/_includes/header.html +0 -27
  92. data/lib/site_template/_includes/icon-github.html +0 -1
  93. data/lib/site_template/_includes/icon-github.svg +0 -1
  94. data/lib/site_template/_includes/icon-twitter.html +0 -1
  95. data/lib/site_template/_includes/icon-twitter.svg +0 -1
  96. data/lib/site_template/_layouts/default.html +0 -20
  97. data/lib/site_template/_layouts/page.html +0 -14
  98. data/lib/site_template/_layouts/post.html +0 -15
  99. data/lib/site_template/_sass/_base.scss +0 -200
  100. data/lib/site_template/_sass/_layout.scss +0 -242
  101. data/lib/site_template/_sass/_syntax-highlighting.scss +0 -71
@@ -0,0 +1,36 @@
1
+ require "erb"
2
+
3
+ class Bunto::Commands::NewTheme < Bunto::Command
4
+ class << self
5
+ def init_with_program(prog)
6
+ prog.command(:"new-theme") do |c|
7
+ c.syntax "new-theme NAME"
8
+ c.description "Creates a new Bunto theme scaffold"
9
+ c.option "code_of_conduct", \
10
+ "-c", "--code-of-conduct", \
11
+ "Include a Code of Conduct. (defaults to false)"
12
+
13
+ c.action do |args, opts|
14
+ Bunto::Commands::NewTheme.process(args, opts)
15
+ end
16
+ end
17
+ end
18
+
19
+ def process(args, opts)
20
+ if !args || args.empty?
21
+ raise Bunto::Errors::InvalidThemeName, "You must specify a theme name."
22
+ end
23
+
24
+ new_theme_name = args.join("_")
25
+ theme = Bunto::ThemeBuilder.new(new_theme_name, opts)
26
+ if theme.path.exist?
27
+ Bunto.logger.abort_with "Conflict:", "#{theme.path} already exists."
28
+ end
29
+
30
+ theme.create!
31
+ Bunto.logger.info "Your new Bunto theme, #{theme.name}," \
32
+ " is ready for you in #{theme.path}!"
33
+ Bunto.logger.info "For help getting started, read #{theme.path}/README.md."
34
+ end
35
+ end
36
+ end
@@ -3,18 +3,17 @@ module Bunto
3
3
  class Serve < Command
4
4
  class << self
5
5
  COMMAND_OPTIONS = {
6
- "ssl_cert" => ["--ssl-cert [CERT]", "X.509 (SSL) certificate."],
7
- "host" => ["host", "-H", "--host [HOST]", "Host to bind to"],
8
- "open_url" => ["-o", "--open-url", "Launch your browser with your site."],
9
- "detach" => ["-B", "--detach", "Run the server in the background (detach)"],
10
- "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."],
11
- "port" => ["-P", "--port [PORT]", "Port to listen on"],
12
- "baseurl" => ["-b", "--baseurl [URL]", "Base URL"],
13
- "show_dir_listing" => ["--show-dir-listing",
6
+ "ssl_cert" => ["--ssl-cert [CERT]", "X.509 (SSL) certificate."],
7
+ "host" => ["host", "-H", "--host [HOST]", "Host to bind to"],
8
+ "open_url" => ["-o", "--open-url", "Launch your site in a browser"],
9
+ "detach" => ["-B", "--detach", "Run the server in the background"],
10
+ "ssl_key" => ["--ssl-key [KEY]", "X.509 (SSL) Private Key."],
11
+ "port" => ["-P", "--port [PORT]", "Port to listen on"],
12
+ "show_dir_listing" => ["--show-dir-listing",
14
13
  "Show a directory listing instead of loading your index file."],
15
14
  "skip_initial_build" => ["skip_initial_build", "--skip-initial-build",
16
15
  "Skips the initial site build which occurs before the server is started."]
17
- }
16
+ }.freeze
18
17
 
19
18
  #
20
19
 
@@ -33,7 +32,9 @@ module Bunto
33
32
  cmd.action do |_, opts|
34
33
  opts["serving"] = true
35
34
  opts["watch" ] = true unless opts.key?("watch")
35
+ config = opts["config"]
36
36
  Build.process(opts)
37
+ opts["config"] = config
37
38
  Serve.process(opts)
38
39
  end
39
40
  end
@@ -93,7 +94,7 @@ module Bunto
93
94
  )
94
95
  }
95
96
 
96
- opts[:DirectoryIndex] = [] if opts[:BuntoOptions]['show_dir_listing']
97
+ opts[:DirectoryIndex] = [] if opts[:BuntoOptions]["show_dir_listing"]
97
98
 
98
99
  enable_ssl(opts)
99
100
  enable_logging(opts)
@@ -107,7 +108,7 @@ module Bunto
107
108
  WEBrick::Config::FileHandler.merge({
108
109
  :FancyIndexing => true,
109
110
  :NondisclosureName => [
110
- '.ht*', '~*'
111
+ ".ht*", "~*"
111
112
  ]
112
113
  })
113
114
  end
@@ -116,12 +117,12 @@ module Bunto
116
117
 
117
118
  private
118
119
  def server_address(server, opts)
119
- "%{prefix}://%{address}:%{port}%{baseurl}" % {
120
- :prefix => server.config[:SSLEnable] ? "https" : "http",
120
+ format("%{prefix}://%{address}:%{port}%{baseurl}", {
121
+ :prefix => server.config[:SSLEnable] ? "https" : "http",
121
122
  :baseurl => opts["baseurl"] ? "#{opts["baseurl"]}/" : "",
122
123
  :address => server.config[:BindAddress],
123
- :port => server.config[:Port]
124
- }
124
+ :port => server.config[:Port]
125
+ })
125
126
  end
126
127
 
127
128
  #
@@ -171,22 +172,27 @@ module Bunto
171
172
  # forget to add one of the certificates.
172
173
 
173
174
  private
175
+ # rubocop:disable Metrics/AbcSize
174
176
  def enable_ssl(opts)
175
177
  return if !opts[:BuntoOptions]["ssl_cert"] && !opts[:BuntoOptions]["ssl_key"]
176
178
  if !opts[:BuntoOptions]["ssl_cert"] || !opts[:BuntoOptions]["ssl_key"]
179
+ # rubocop:disable Style/RedundantException
177
180
  raise RuntimeError, "--ssl-cert or --ssl-key missing."
178
181
  end
179
-
180
182
  require "openssl"
181
183
  require "webrick/https"
182
- source_key = Bunto.sanitized_path(opts[:BuntoOptions]["source"], opts[:BuntoOptions]["ssl_key" ])
183
- source_certificate = Bunto.sanitized_path(opts[:BuntoOptions]["source"], opts[:BuntoOptions]["ssl_cert"])
184
- opts[:SSLCertificate] = OpenSSL::X509::Certificate.new(File.read(source_certificate))
184
+ source_key = Bunto.sanitized_path(opts[:BuntoOptions]["source"], \
185
+ opts[:BuntoOptions]["ssl_key" ])
186
+ source_certificate = Bunto.sanitized_path(opts[:BuntoOptions]["source"], \
187
+ opts[:BuntoOptions]["ssl_cert"])
188
+ opts[:SSLCertificate] =
189
+ OpenSSL::X509::Certificate.new(File.read(source_certificate))
185
190
  opts[:SSLPrivateKey ] = OpenSSL::PKey::RSA.new(File.read(source_key))
186
191
  opts[:SSLEnable] = true
187
192
  end
188
193
 
189
194
  private
195
+
190
196
  def start_callback(detached)
191
197
  unless detached
192
198
  proc do
@@ -197,7 +203,7 @@ module Bunto
197
203
 
198
204
  private
199
205
  def mime_types
200
- file = File.expand_path('../mime.types', File.dirname(__FILE__))
206
+ file = File.expand_path("../mime.types", File.dirname(__FILE__))
201
207
  WEBrick::HTTPUtils.load_mime_types(file)
202
208
  end
203
209
  end
@@ -7,7 +7,7 @@ module Bunto
7
7
  DEFAULTS = {
8
8
  "Cache-Control" => "private, max-age=0, proxy-revalidate, " \
9
9
  "no-store, no-cache, must-revalidate"
10
- }
10
+ }.freeze
11
11
 
12
12
  def initialize(server, root, callbacks)
13
13
  # So we can access them easily.
@@ -25,8 +25,7 @@ module Bunto
25
25
  super || super(req, res, "#{basename}.html")
26
26
  end
27
27
 
28
- #
29
-
28
+ # rubocop:disable Style/MethodName
30
29
  def do_GET(req, res)
31
30
  rtn = super
32
31
  validate_and_ensure_charset(req, res)
@@ -38,10 +37,10 @@ module Bunto
38
37
 
39
38
  private
40
39
  def validate_and_ensure_charset(_req, res)
41
- key = res.header.keys.grep(/content-type/i).first
40
+ key = res.header.keys.grep(%r!content-type!i).first
42
41
  typ = res.header[key]
43
42
 
44
- unless typ =~ /;\s*charset=/
43
+ unless typ =~ %r!;\s*charset=!
45
44
  res.header[key] = "#{typ}; charset=#{@bunto_opts["encoding"]}"
46
45
  end
47
46
  end
@@ -6,73 +6,94 @@ module Bunto
6
6
  # Strings rather than symbols are used for compatibility with YAML.
7
7
  DEFAULTS = Configuration[{
8
8
  # Where things are
9
- 'source' => Dir.pwd,
10
- 'destination' => File.join(Dir.pwd, '_site'),
11
- 'plugins_dir' => '_plugins',
12
- 'layouts_dir' => '_layouts',
13
- 'data_dir' => '_data',
14
- 'includes_dir' => '_includes',
15
- 'collections' => {},
9
+ "source" => Dir.pwd,
10
+ "destination" => File.join(Dir.pwd, "_site"),
11
+ "plugins_dir" => "_plugins",
12
+ "layouts_dir" => "_layouts",
13
+ "data_dir" => "_data",
14
+ "includes_dir" => "_includes",
15
+ "collections" => {},
16
16
 
17
17
  # Handling Reading
18
- 'safe' => false,
19
- 'include' => ['.htaccess'],
20
- 'exclude' => [],
21
- 'keep_files' => ['.git', '.svn'],
22
- 'encoding' => 'utf-8',
23
- 'markdown_ext' => 'markdown,mkdown,mkdn,mkd,md',
18
+ "safe" => false,
19
+ "include" => [".htaccess"],
20
+ "exclude" => [],
21
+ "keep_files" => [".git", ".svn"],
22
+ "encoding" => "utf-8",
23
+ "markdown_ext" => "markdown,mkdown,mkdn,mkd,md",
24
24
 
25
25
  # Filtering Content
26
- 'show_drafts' => nil,
27
- 'limit_posts' => 0,
28
- 'future' => false,
29
- 'unpublished' => false,
26
+ "show_drafts" => nil,
27
+ "limit_posts" => 0,
28
+ "future" => false,
29
+ "unpublished" => false,
30
30
 
31
31
  # Plugins
32
- 'whitelist' => [],
33
- 'gems' => [],
32
+ "whitelist" => [],
33
+ "gems" => [],
34
34
 
35
35
  # Conversion
36
- 'markdown' => 'kramdown',
37
- 'highlighter' => 'rouge',
38
- 'lsi' => false,
39
- 'excerpt_separator' => "\n\n",
40
- 'incremental' => false,
36
+ "markdown" => "kramdown",
37
+ "highlighter" => "rouge",
38
+ "lsi" => false,
39
+ "excerpt_separator" => "\n\n",
40
+ "incremental" => false,
41
41
 
42
42
  # Serving
43
- 'detach' => false, # default to not detaching the server
44
- 'port' => '4000',
45
- 'host' => '127.0.0.1',
46
- 'baseurl' => '',
47
- 'show_dir_listing' => false,
43
+ "detach" => false, # default to not detaching the server
44
+ "port" => "4000",
45
+ "host" => "127.0.0.1",
46
+ "baseurl" => "",
47
+ "show_dir_listing" => false,
48
48
 
49
49
  # Output Configuration
50
- 'permalink' => 'date',
51
- 'paginate_path' => '/page:num',
52
- 'timezone' => nil, # use the local timezone
50
+ "permalink" => "date",
51
+ "paginate_path" => "/page:num",
52
+ "timezone" => nil, # use the local timezone
53
53
 
54
- 'quiet' => false,
55
- 'verbose' => false,
56
- 'defaults' => [],
54
+ "quiet" => false,
55
+ "verbose" => false,
56
+ "defaults" => [],
57
57
 
58
- 'rdiscount' => {
59
- 'extensions' => []
58
+ "liquid" => {
59
+ "error_mode" => "warn"
60
60
  },
61
61
 
62
- 'redcarpet' => {
63
- 'extensions' => []
62
+ "rdiscount" => {
63
+ "extensions" => []
64
64
  },
65
65
 
66
- 'kramdown' => {
67
- 'auto_ids' => true,
68
- 'toc_levels' => '1..6',
69
- 'entity_output' => 'as_char',
70
- 'smart_quotes' => 'lsquo,rsquo,ldquo,rdquo',
71
- 'input' => "GFM",
72
- 'hard_wrap' => false,
73
- 'footnote_nr' => 1
66
+ "redcarpet" => {
67
+ "extensions" => []
68
+ },
69
+
70
+ "kramdown" => {
71
+ "auto_ids" => true,
72
+ "toc_levels" => "1..6",
73
+ "entity_output" => "as_char",
74
+ "smart_quotes" => "lsquo,rsquo,ldquo,rdquo",
75
+ "input" => "GFM",
76
+ "hard_wrap" => false,
77
+ "footnote_nr" => 1
74
78
  }
75
- }]
79
+ }.map { |k, v| [k, v.freeze] }].freeze
80
+
81
+ class << self
82
+ # Static: Produce a Configuration ready for use in a Site.
83
+ # It takes the input, fills in the defaults where values do not
84
+ # exist, and patches common issues including migrating options for
85
+ # backwards compatiblity. Except where a key or value is being fixed,
86
+ # the user configuration will override the defaults.
87
+ #
88
+ # user_config - a Hash or Configuration of overrides.
89
+ #
90
+ # Returns a Configuration filled with defaults and fixed for common
91
+ # problems and backwards-compatibility.
92
+ def from(user_config)
93
+ Utils.deep_merge_hashes(DEFAULTS, Configuration[user_config].stringify_keys)
94
+ .fix_common_issues.add_default_collections
95
+ end
96
+ end
76
97
 
77
98
  # Public: Turn all keys into string
78
99
  #
@@ -91,28 +112,29 @@ module Bunto
91
112
  #
92
113
  # Returns the path to the Bunto source directory
93
114
  def source(override)
94
- get_config_value_with_override('source', override)
115
+ get_config_value_with_override("source", override)
95
116
  end
96
117
 
97
118
  def quiet(override = {})
98
- get_config_value_with_override('quiet', override)
119
+ get_config_value_with_override("quiet", override)
99
120
  end
100
121
  alias_method :quiet?, :quiet
101
122
 
102
123
  def verbose(override = {})
103
- get_config_value_with_override('verbose', override)
124
+ get_config_value_with_override("verbose", override)
104
125
  end
105
126
  alias_method :verbose?, :verbose
106
127
 
107
128
  def safe_load_file(filename)
108
129
  case File.extname(filename)
109
- when /\.toml/i
110
- Bunto::External.require_with_graceful_fail('toml') unless defined?(TOML)
130
+ when %r!\.toml!i
131
+ Bunto::External.require_with_graceful_fail("toml") unless defined?(TOML)
111
132
  TOML.load_file(filename)
112
- when /\.ya?ml/i
133
+ when %r!\.ya?ml!i
113
134
  SafeYAML.load_file(filename) || {}
114
135
  else
115
- raise ArgumentError, "No parser for '#{filename}' is available. Use a .toml or .y(a)ml file instead."
136
+ raise ArgumentError, "No parser for '#{filename}' is available.
137
+ Use a .toml or .y(a)ml file instead."
116
138
  end
117
139
  end
118
140
 
@@ -123,12 +145,15 @@ module Bunto
123
145
  # Returns an Array of config files
124
146
  def config_files(override)
125
147
  # Adjust verbosity quickly
126
- Bunto.logger.adjust_verbosity(:quiet => quiet?(override), :verbose => verbose?(override))
148
+ Bunto.logger.adjust_verbosity(
149
+ :quiet => quiet?(override),
150
+ :verbose => verbose?(override)
151
+ )
127
152
 
128
153
  # Get configuration from <source>/_config.yml or <source>/<config_file>
129
- config_files = override.delete('config')
154
+ config_files = override.delete("config")
130
155
  if config_files.to_s.empty?
131
- default = %w(yml yaml).find(-> { 'yml' }) do |ext|
156
+ default = %w(yml yaml).find(-> { "yml" }) do |ext|
132
157
  File.exist?(Bunto.sanitized_path(source(override), "_config.#{ext}"))
133
158
  end
134
159
  config_files = Bunto.sanitized_path(source(override), "_config.#{default}")
@@ -153,7 +178,8 @@ module Bunto
153
178
  Bunto.logger.warn "Configuration file:", "none"
154
179
  {}
155
180
  else
156
- Bunto.logger.error "Fatal:", "The configuration file '#{file}' could not be found."
181
+ Bunto.logger.error "Fatal:", "The configuration file '#{file}'
182
+ could not be found."
157
183
  raise LoadError, "The Configuration file '#{file}' could not be found."
158
184
  end
159
185
  end
@@ -169,13 +195,14 @@ module Bunto
169
195
 
170
196
  begin
171
197
  files.each do |config_file|
198
+ next if config_file.nil? || config_file.empty?
172
199
  new_config = read_config_file(config_file)
173
200
  configuration = Utils.deep_merge_hashes(configuration, new_config)
174
201
  end
175
202
  rescue ArgumentError => err
176
203
  Bunto.logger.warn "WARNING:", "Error reading configuration. " \
177
204
  "Using defaults (and options)."
178
- $stderr.puts "#{err}"
205
+ $stderr.puts err
179
206
  end
180
207
 
181
208
  configuration.fix_common_issues.backwards_compatibilize.add_default_collections
@@ -197,61 +224,18 @@ module Bunto
197
224
  def backwards_compatibilize
198
225
  config = clone
199
226
  # Provide backwards-compatibility
200
- if config.key?('auto') || config.key?('watch')
201
- Bunto::Deprecator.deprecation_message "Auto-regeneration can no longer" \
202
- " be set from your configuration file(s). Use the"\
203
- " --[no-]watch/-w command-line option instead."
204
- config.delete('auto')
205
- config.delete('watch')
206
- end
207
-
208
- if config.key? 'server'
209
- Bunto::Deprecator.deprecation_message "The 'server' configuration option" \
210
- " is no longer accepted. Use the 'bunto serve'" \
211
- " subcommand to serve your site with WEBrick."
212
- config.delete('server')
213
- end
227
+ check_auto(config)
228
+ check_server(config)
214
229
 
215
- renamed_key 'server_port', 'port', config
216
- renamed_key 'plugins', 'plugins_dir', config
217
- renamed_key 'layouts', 'layouts_dir', config
218
- renamed_key 'data_source', 'data_dir', config
230
+ renamed_key "server_port", "port", config
231
+ renamed_key "plugins", "plugins_dir", config
232
+ renamed_key "layouts", "layouts_dir", config
233
+ renamed_key "data_source", "data_dir", config
219
234
 
220
- if config.key? 'pygments'
221
- Bunto::Deprecator.deprecation_message "The 'pygments' configuration option" \
222
- " has been renamed to 'highlighter'. Please update your" \
223
- " config file accordingly. The allowed values are 'rouge', " \
224
- "'pygments' or null."
225
-
226
- config['highlighter'] = 'pygments' if config['pygments']
227
- config.delete('pygments')
228
- end
229
-
230
- %w(include exclude).each do |option|
231
- config[option] ||= []
232
- if config[option].is_a?(String)
233
- Bunto::Deprecator.deprecation_message "The '#{option}' configuration option" \
234
- " must now be specified as an array, but you specified" \
235
- " a string. For now, we've treated the string you provided" \
236
- " as a list of comma-separated values."
237
- config[option] = csv_to_array(config[option])
238
- end
239
- config[option].map!(&:to_s)
240
- end
241
-
242
- if (config['kramdown'] || {}).key?('use_coderay')
243
- Bunto::Deprecator.deprecation_message "Please change 'use_coderay'" \
244
- " to 'enable_coderay' in your configuration file."
245
- config['kramdown']['use_coderay'] = config['kramdown'].delete('enable_coderay')
246
- end
247
-
248
- if config.fetch('markdown', 'kramdown').to_s.downcase.eql?("maruku")
249
- Bunto.logger.abort_with "Error:", "You're using the 'maruku' " \
250
- "Markdown processor, which has been removed as of 3.0.0. " \
251
- "We recommend you switch to Kramdown. To do this, replace " \
252
- "`markdown: maruku` with `markdown: kramdown` in your " \
253
- "`_config.yml` file."
254
- end
235
+ check_pygments(config)
236
+ check_include_exclude(config)
237
+ check_coderay(config)
238
+ check_maruku(config)
255
239
 
256
240
  config
257
241
  end
@@ -259,10 +243,12 @@ module Bunto
259
243
  def fix_common_issues
260
244
  config = clone
261
245
 
262
- if config.key?('paginate') && (!config['paginate'].is_a?(Integer) || config['paginate'] < 1)
263
- Bunto.logger.warn "Config Warning:", "The `paginate` key must be a" \
264
- " positive integer or nil. It's currently set to '#{config['paginate'].inspect}'."
265
- config['paginate'] = nil
246
+ if config.key?("paginate") && (!config["paginate"].is_a?(Integer) ||
247
+ config["paginate"] < 1)
248
+
249
+ Bunto.logger.warn "Config Warning:", "The `paginate` key must be a positive" \
250
+ " integer or nil. It's currently set to '#{config["paginate"].inspect}'."
251
+ config["paginate"] = nil
266
252
  end
267
253
 
268
254
  config
@@ -271,14 +257,22 @@ module Bunto
271
257
  def add_default_collections
272
258
  config = clone
273
259
 
274
- return config if config['collections'].nil?
260
+ # It defaults to `{}`, so this is only if someone sets it to null manually.
261
+ return config if config["collections"].nil?
275
262
 
276
- if config['collections'].is_a?(Array)
277
- config['collections'] = Hash[config['collections'].map { |c| [c, {}] }]
263
+ # Ensure we have a hash.
264
+ if config["collections"].is_a?(Array)
265
+ config["collections"] = Hash[config["collections"].map { |c| [c, {}] }]
266
+ end
267
+
268
+ config["collections"] = Utils.deep_merge_hashes(
269
+ { "posts" => {} }, config["collections"]
270
+ ).tap do |collections|
271
+ collections["posts"]["output"] = true
272
+ if config["permalink"]
273
+ collections["posts"]["permalink"] ||= style_to_permalink(config["permalink"])
274
+ end
278
275
  end
279
- config['collections']['posts'] ||= {}
280
- config['collections']['posts']['output'] = true
281
- config['collections']['posts']['permalink'] = style_to_permalink(config['permalink'])
282
276
 
283
277
  config
284
278
  end
@@ -293,7 +287,6 @@ module Bunto
293
287
  end
294
288
 
295
289
  private
296
-
297
290
  def style_to_permalink(permalink_style)
298
291
  case permalink_style.to_sym
299
292
  when :pretty
@@ -315,9 +308,78 @@ module Bunto
315
308
  # file - the file from which the config was extracted
316
309
  #
317
310
  # Raises an ArgumentError if given config is not a hash
311
+ private
318
312
  def check_config_is_hash!(extracted_config, file)
319
313
  unless extracted_config.is_a?(Hash)
320
- raise ArgumentError.new("Configuration file: (INVALID) #{file}".yellow)
314
+ raise ArgumentError, "Configuration file: (INVALID) #{file}".yellow
315
+ end
316
+ end
317
+
318
+ private
319
+ def check_auto(config)
320
+ if config.key?("auto") || config.key?("watch")
321
+ Bunto::Deprecator.deprecation_message "Auto-regeneration can no longer" \
322
+ " be set from your configuration file(s). Use the" \
323
+ " --[no-]watch/-w command-line option instead."
324
+ config.delete("auto")
325
+ config.delete("watch")
326
+ end
327
+ end
328
+
329
+ private
330
+ def check_server(config)
331
+ if config.key?("server")
332
+ Bunto::Deprecator.deprecation_message "The 'server' configuration option" \
333
+ " is no longer accepted. Use the 'bunto serve'" \
334
+ " subcommand to serve your site with WEBrick."
335
+ config.delete("server")
336
+ end
337
+ end
338
+
339
+ private
340
+ def check_pygments(config)
341
+ if config.key?("pygments")
342
+ Bunto::Deprecator.deprecation_message "The 'pygments' configuration option" \
343
+ " has been renamed to 'highlighter'. Please update your" \
344
+ " config file accordingly. The allowed values are 'rouge', " \
345
+ "'pygments' or null."
346
+
347
+ config["highlighter"] = "pygments" if config["pygments"]
348
+ config.delete("pygments")
349
+ end
350
+ end
351
+
352
+ private
353
+ def check_include_exclude(config)
354
+ %w(include exclude).each do |option|
355
+ if config[option].is_a?(String)
356
+ Bunto::Deprecator.deprecation_message "The '#{option}' configuration option" \
357
+ " must now be specified as an array, but you specified" \
358
+ " a string. For now, we've treated the string you provided" \
359
+ " as a list of comma-separated values."
360
+ config[option] = csv_to_array(config[option])
361
+ end
362
+ config[option].map!(&:to_s) if config[option]
363
+ end
364
+ end
365
+
366
+ private
367
+ def check_coderay(config)
368
+ if (config["kramdown"] || {}).key?("use_coderay")
369
+ Bunto::Deprecator.deprecation_message "Please change 'use_coderay'" \
370
+ " to 'enable_coderay' in your configuration file."
371
+ config["kramdown"]["use_coderay"] = config["kramdown"].delete("enable_coderay")
372
+ end
373
+ end
374
+
375
+ private
376
+ def check_maruku(config)
377
+ if config.fetch("markdown", "kramdown").to_s.casecmp("maruku").zero?
378
+ Bunto.logger.abort_with "Error:", "You're using the 'maruku' " \
379
+ "Markdown processor, which has been removed as of 3.0.0. " \
380
+ "We recommend you switch to Kramdown. To do this, replace " \
381
+ "`markdown: maruku` with `markdown: kramdown` in your " \
382
+ "`_config.yml` file."
321
383
  end
322
384
  end
323
385
  end