bridgetown-core 0.13.0 → 0.15.0.beta3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (74) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +3 -1
  3. data/bin/bridgetown +9 -48
  4. data/bridgetown-core.gemspec +6 -2
  5. data/lib/bridgetown-core.rb +13 -3
  6. data/lib/bridgetown-core/cleaner.rb +1 -0
  7. data/lib/bridgetown-core/commands/apply.rb +73 -0
  8. data/lib/bridgetown-core/commands/base.rb +45 -0
  9. data/lib/bridgetown-core/commands/build.rb +91 -86
  10. data/lib/bridgetown-core/commands/clean.rb +30 -29
  11. data/lib/bridgetown-core/commands/concerns/actions.rb +123 -0
  12. data/lib/bridgetown-core/commands/concerns/build_options.rb +76 -0
  13. data/lib/bridgetown-core/commands/concerns/configuration_overridable.rb +18 -0
  14. data/lib/bridgetown-core/commands/concerns/summarizable.rb +13 -0
  15. data/lib/bridgetown-core/commands/console.rb +46 -39
  16. data/lib/bridgetown-core/commands/doctor.rb +126 -127
  17. data/lib/bridgetown-core/commands/new.rb +120 -158
  18. data/lib/bridgetown-core/commands/plugins.rb +206 -0
  19. data/lib/bridgetown-core/commands/registrations.rb +16 -0
  20. data/lib/bridgetown-core/commands/serve.rb +214 -215
  21. data/lib/bridgetown-core/{convertible.rb → concerns/convertible.rb} +3 -6
  22. data/lib/bridgetown-core/concerns/site/configurable.rb +153 -0
  23. data/lib/bridgetown-core/concerns/site/content.rb +111 -0
  24. data/lib/bridgetown-core/concerns/site/extensible.rb +56 -0
  25. data/lib/bridgetown-core/concerns/site/processable.rb +74 -0
  26. data/lib/bridgetown-core/concerns/site/renderable.rb +49 -0
  27. data/lib/bridgetown-core/concerns/site/writable.rb +31 -0
  28. data/lib/bridgetown-core/configuration.rb +2 -9
  29. data/lib/bridgetown-core/converters/markdown/kramdown_parser.rb +0 -3
  30. data/lib/bridgetown-core/document.rb +1 -1
  31. data/lib/bridgetown-core/drops/page_drop.rb +1 -1
  32. data/lib/bridgetown-core/drops/site_drop.rb +1 -1
  33. data/lib/bridgetown-core/excerpt.rb +4 -1
  34. data/lib/bridgetown-core/external.rb +17 -21
  35. data/lib/bridgetown-core/filters.rb +10 -0
  36. data/lib/bridgetown-core/generators/prototype_generator.rb +3 -1
  37. data/lib/bridgetown-core/hooks.rb +62 -62
  38. data/lib/bridgetown-core/layout.rb +10 -4
  39. data/lib/bridgetown-core/liquid_renderer.rb +1 -0
  40. data/lib/bridgetown-core/liquid_renderer/file.rb +1 -4
  41. data/lib/bridgetown-core/liquid_renderer/file_system.rb +3 -1
  42. data/lib/bridgetown-core/page.rb +11 -19
  43. data/lib/bridgetown-core/plugin.rb +2 -0
  44. data/lib/bridgetown-core/plugin_manager.rb +88 -21
  45. data/lib/bridgetown-core/reader.rb +5 -0
  46. data/lib/bridgetown-core/readers/data_reader.rb +5 -2
  47. data/lib/bridgetown-core/readers/layout_reader.rb +9 -2
  48. data/lib/bridgetown-core/readers/plugin_content_reader.rb +48 -0
  49. data/lib/bridgetown-core/renderer.rb +38 -28
  50. data/lib/bridgetown-core/site.rb +20 -463
  51. data/lib/bridgetown-core/tags/include.rb +12 -0
  52. data/lib/bridgetown-core/tags/render_content.rb +29 -16
  53. data/lib/bridgetown-core/tags/with.rb +15 -0
  54. data/lib/bridgetown-core/utils.rb +45 -27
  55. data/lib/bridgetown-core/utils/ruby_exec.rb +1 -4
  56. data/lib/bridgetown-core/version.rb +2 -2
  57. data/lib/bridgetown-core/watcher.rb +21 -10
  58. data/lib/site_template/Gemfile.erb +19 -0
  59. data/lib/site_template/package.json +1 -0
  60. data/lib/site_template/plugins/{.keep → builders/.keep} +0 -0
  61. data/lib/site_template/plugins/site_builder.rb +4 -0
  62. data/lib/site_template/src/_components/footer.html +3 -0
  63. data/lib/site_template/src/_components/head.html +9 -0
  64. data/lib/site_template/src/{_includes → _components}/navbar.html +1 -0
  65. data/lib/site_template/src/_layouts/default.html +3 -3
  66. data/lib/site_template/src/posts.md +15 -0
  67. data/lib/site_template/start.js +1 -1
  68. data/lib/site_template/webpack.config.js +3 -3
  69. metadata +90 -18
  70. data/lib/bridgetown-core/command.rb +0 -106
  71. data/lib/bridgetown-core/commands/help.rb +0 -34
  72. data/lib/site_template/src/_components/.keep +0 -0
  73. data/lib/site_template/src/_includes/footer.html +0 -3
  74. data/lib/site_template/src/_includes/head.html +0 -9
@@ -2,40 +2,41 @@
2
2
 
3
3
  module Bridgetown
4
4
  module Commands
5
- class Clean < Command
6
- class << self
7
- def init_with_program(prog)
8
- prog.command(:clean) do |c|
9
- c.syntax "clean [subcommand]"
10
- c.description "Clean the site " \
11
- "(removes site output and metadata file) without building."
5
+ class Clean < Thor::Group
6
+ extend BuildOptions
7
+ extend Summarizable
8
+ include ConfigurationOverridable
12
9
 
13
- add_build_options(c)
10
+ Registrations.register do
11
+ register(Clean, "clean", "clean", Clean.summary)
12
+ end
14
13
 
15
- c.action do |_, options|
16
- Bridgetown::Commands::Clean.process(options)
17
- end
18
- end
19
- end
14
+ def self.banner
15
+ "bridgetown clean [options]"
16
+ end
17
+ summary "Clean the site (removes site output and metadata file) without building"
20
18
 
21
- def process(options)
22
- options = configuration_from_options(options)
23
- destination = options["destination"]
24
- metadata_file = File.join(options["source"], ".bridgetown-metadata")
25
- cache_dir = File.join(options["source"], options["cache_dir"])
19
+ def clean
20
+ config = configuration_with_overrides(options)
21
+ destination = config["destination"]
22
+ metadata_file = File.join(config["root_dir"], ".bridgetown-metadata")
23
+ cache_dir = File.join(config["root_dir"], config["cache_dir"])
24
+ webpack_dir = File.join(config["root_dir"], ".bridgetown-webpack")
26
25
 
27
- remove(destination, checker_func: :directory?)
28
- remove(metadata_file, checker_func: :file?)
29
- remove(cache_dir, checker_func: :directory?)
30
- end
26
+ remove(destination, checker_func: :directory?)
27
+ remove(metadata_file, checker_func: :file?)
28
+ remove(cache_dir, checker_func: :directory?)
29
+ remove(webpack_dir, checker_func: :directory?)
30
+ end
31
+
32
+ protected
31
33
 
32
- def remove(filename, checker_func: :file?)
33
- if File.public_send(checker_func, filename)
34
- Bridgetown.logger.info "Cleaner:", "Removing #{filename}..."
35
- FileUtils.rm_rf(filename)
36
- else
37
- Bridgetown.logger.info "Cleaner:", "Nothing to do for #{filename}."
38
- end
34
+ def remove(filename, checker_func: :file?)
35
+ if File.public_send(checker_func, filename)
36
+ Bridgetown.logger.info "Cleaner:", "Removing #{filename}..."
37
+ FileUtils.rm_rf(filename)
38
+ else
39
+ Bridgetown.logger.info "Cleaner:", "Nothing to do for #{filename}."
39
40
  end
40
41
  end
41
42
  end
@@ -0,0 +1,123 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Mostly not used here, but may come in handy in new automations
4
+ require "active_support/core_ext/array/extract_options"
5
+ require "active_support/core_ext/string/strip"
6
+ require "active_support/core_ext/string/indent"
7
+
8
+ module Bridgetown
9
+ module Commands
10
+ module Actions
11
+ def create_builder(filename, data = nil)
12
+ say_status :create_builder, filename
13
+ data ||= yield if block_given?
14
+
15
+ site_builder = File.join("plugins", "site_builder.rb")
16
+ unless File.exist?(site_builder)
17
+ create_file("plugins/site_builder.rb", verbose: true) do
18
+ <<~RUBY
19
+ class SiteBuilder < Bridgetown::Builder
20
+ end
21
+ RUBY
22
+ end
23
+ end
24
+
25
+ create_file("plugins/builders/#{filename}", data, verbose: false)
26
+ end
27
+
28
+ def javascript_import(data = nil, filename: "index.js")
29
+ data ||= yield if block_given?
30
+ data += "\n" unless data.chars.last == "\n"
31
+
32
+ say_status :javascript_import, filename
33
+
34
+ js_index = File.join("frontend", "javascript", filename)
35
+ if File.exist?(js_index)
36
+ index_file = File.read(js_index)
37
+
38
+ last_import = ""
39
+ index_file.each_line do |line|
40
+ line.start_with?("import ") ? last_import = line : break
41
+ end
42
+
43
+ if last_import == ""
44
+ # add to top of file
45
+ prepend_file js_index, data, verbose: false
46
+ else
47
+ # inject after the last import line
48
+ inject_into_file js_index, data, after: last_import, verbose: false, force: false
49
+ end
50
+ else
51
+ create_file(js_index, data, verbose: false)
52
+ end
53
+ end
54
+
55
+ def add_bridgetown_plugin(gemname, version: nil)
56
+ version = " -v \"#{version}\"" if version
57
+ run "bundle add #{gemname}#{version} -g bridgetown_plugins"
58
+ rescue SystemExit
59
+ say_status :run, "Gem not added due to bundler error", :red
60
+ end
61
+
62
+ def add_yarn_for_gem(gemname)
63
+ say_status :add_yarn, gemname
64
+
65
+ Bundler.reset!
66
+ available_gems = Bundler.setup Bridgetown::PluginManager::PLUGINS_GROUP
67
+ Bridgetown::PluginManager.install_yarn_dependencies(
68
+ available_gems.requested_specs, gemname
69
+ )
70
+ rescue SystemExit
71
+ say_status :add_yarn, "Package not added due to yarn error", :red
72
+ end
73
+
74
+ def apply_from_url(url)
75
+ apply transform_automation_url(url.dup)
76
+ end
77
+
78
+ private
79
+
80
+ def determine_remote_filename(arg)
81
+ if arg.end_with?(".rb")
82
+ arg.split("/").yield_self do |segments|
83
+ arg.sub!(%r!/#{segments.last}$!, "")
84
+ segments.last
85
+ end
86
+ else
87
+ "bridgetown.automation.rb"
88
+ end
89
+ end
90
+
91
+ # TODO: option to download and confirm remote automation?
92
+ def transform_automation_url(arg)
93
+ return arg unless arg.start_with?("http")
94
+
95
+ remote_file = determine_remote_filename(arg)
96
+
97
+ github_regex = %r!https://github\.com!
98
+ github_tree_regex = %r!#{github_regex}/.*/.*/tree/.*/?!
99
+
100
+ github_match = github_regex.match(arg)
101
+ github_tree_match = github_tree_regex.match(arg)
102
+
103
+ if arg.start_with?("https://gist.github.com")
104
+ return arg.sub(
105
+ "https://gist.github.com", "https://gist.githubusercontent.com"
106
+ ) + "/raw/#{remote_file}"
107
+ elsif github_match
108
+ new_url = arg.sub(github_regex, "https://raw.githubusercontent.com")
109
+
110
+ if github_tree_match
111
+ new_url = new_url.sub("/tree/", "/")
112
+ else
113
+ new_url += "/master"
114
+ end
115
+
116
+ return "#{new_url}/#{remote_file}"
117
+ end
118
+
119
+ arg + "/#{remote_file}"
120
+ end
121
+ end
122
+ end
123
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bridgetown
4
+ module Commands
5
+ module BuildOptions
6
+ def self.extended(klass)
7
+ klass.class_option :trace,
8
+ type: :boolean,
9
+ aliases: "-t",
10
+ desc: "Show the full backtrace when an error occurs during watch mode"
11
+
12
+ klass.class_option :config,
13
+ type: :array,
14
+ banner: "FILE1 FILE2",
15
+ desc: "Custom configuration file(s)"
16
+ klass.class_option :source,
17
+ aliases: "-s",
18
+ desc: "Source directory (defaults to src)"
19
+ klass.class_option :destination,
20
+ aliases: "-d",
21
+ desc: "Destination directory (defaults to output)"
22
+ klass.class_option :root_dir,
23
+ aliases: "-r",
24
+ desc: "The top-level root folder" \
25
+ " where config files are located"
26
+ klass.class_option :plugins_dir,
27
+ aliases: "-p",
28
+ type: :array,
29
+ banner: "DIR1 DIR2",
30
+ desc: "Plugins directory (defaults to plugins)"
31
+ klass.class_option :layouts_dir,
32
+ desc: "Layouts directory (defaults to src/_layouts)"
33
+ klass.class_option :future,
34
+ type: :boolean,
35
+ desc: "Publishes posts with a future date"
36
+ klass.class_option :limit_posts,
37
+ type: :numeric,
38
+ desc: "Limits the number of posts to parse and publish"
39
+ klass.class_option :baseurl,
40
+ aliases: "-b",
41
+ desc: "Serve the website from the given base URL"
42
+ klass.class_option :force_polling,
43
+ type: :boolean,
44
+ desc: "Force watch to use polling"
45
+ klass.class_option :lsi,
46
+ type: :boolean,
47
+ desc: "Use LSI for improved related posts"
48
+ klass.class_option :unpublished,
49
+ type: :boolean,
50
+ aliases: "-U",
51
+ desc: "Render posts that were marked as unpublished"
52
+ klass.class_option :disable_disk_cache,
53
+ type: :boolean,
54
+ desc: "Disable caching to disk"
55
+ klass.class_option :profile,
56
+ type: :boolean,
57
+ desc: "Generate a Liquid rendering profile"
58
+ klass.class_option :quiet,
59
+ aliases: "-q",
60
+ type: :boolean,
61
+ desc: "Silence output."
62
+ klass.class_option :verbose,
63
+ aliases: "-V",
64
+ type: :boolean,
65
+ desc: "Print verbose output."
66
+ klass.class_option :incremental,
67
+ aliases: "-I",
68
+ type: :boolean,
69
+ desc: "Enable incremental rebuild."
70
+ klass.class_option :strict_front_matter,
71
+ type: :boolean,
72
+ desc: "Fail if errors are present in front matter"
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bridgetown
4
+ module Commands
5
+ module ConfigurationOverridable
6
+ # Create a full Bridgetown configuration with the options passed in as overrides
7
+ #
8
+ # options - the configuration overrides
9
+ #
10
+ # Returns a full Bridgetown configuration
11
+ def configuration_with_overrides(options)
12
+ return options if options.is_a?(Bridgetown::Configuration)
13
+
14
+ Bridgetown.configuration(options)
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Bridgetown
4
+ module Commands
5
+ module Summarizable
6
+ def summary(description = nil)
7
+ return @desc.split("\n").last.strip unless description
8
+
9
+ desc "Description:\n #{description}"
10
+ end
11
+ end
12
+ end
13
+ end
@@ -4,54 +4,61 @@ require "irb"
4
4
 
5
5
  module Bridgetown
6
6
  module Commands
7
- class Console < Command
8
- class << self
9
- def init_with_program(prog)
10
- prog.command(:console) do |c|
11
- c.syntax "console"
12
- c.description "Invoke an IRB console with the site loaded"
13
- c.alias :c
14
-
15
- c.option "config", "--config CONFIG_FILE[,CONFIG_FILE2,...]", Array,
16
- "Custom configuration file"
17
-
18
- c.action do |_, options|
19
- Bridgetown::Commands::Console.process(options)
20
- end
21
- end
22
- end
7
+ class Console < Thor::Group
8
+ extend Summarizable
9
+ include ConfigurationOverridable
10
+
11
+ Registrations.register do
12
+ register(Console, "console", "console", Console.summary)
13
+ end
14
+
15
+ def self.banner
16
+ "bridgetown console [options]"
17
+ end
18
+ summary "Invoke an IRB console with the site loaded"
23
19
 
24
- # TODO: is there a way to add a unit test for this command?
25
- # rubocop:disable Style/GlobalVars, Metrics/AbcSize, Metrics/MethodLength
26
- def process(options)
27
- Bridgetown.logger.info "Starting:", "Bridgetown v#{Bridgetown::VERSION.magenta}" \
28
- " (codename \"#{Bridgetown::CODE_NAME.yellow}\")" \
29
- " console…"
30
- Bridgetown.logger.info "Environment:", Bridgetown.environment.cyan
31
- site = Bridgetown::Site.new(configuration_from_options(options))
20
+ class_option :config,
21
+ type: :array,
22
+ banner: "FILE1 FILE2",
23
+ desc: "Custom configuration file(s)"
24
+ class_option :blank,
25
+ type: :boolean,
26
+ desc: "Skip reading content and running generators before opening console"
27
+
28
+ def console
29
+ Bridgetown.logger.info "Starting:", "Bridgetown v#{Bridgetown::VERSION.magenta}" \
30
+ " (codename \"#{Bridgetown::CODE_NAME.yellow}\")" \
31
+ " console…"
32
+ Bridgetown.logger.info "Environment:", Bridgetown.environment.cyan
33
+ site = Bridgetown::Site.new(configuration_with_overrides(options))
34
+
35
+ unless options[:blank]
32
36
  site.reset
37
+ Bridgetown.logger.info "Reading files..."
33
38
  site.read
39
+ Bridgetown.logger.info "", "done!"
40
+ Bridgetown.logger.info "Running generators..."
34
41
  site.generate
42
+ Bridgetown.logger.info "", "done!"
43
+ end
35
44
 
36
- $BRIDGETOWN_SITE = site
37
- IRB.setup(nil)
38
- workspace = IRB::WorkSpace.new
39
- irb = IRB::Irb.new(workspace)
40
- IRB.conf[:MAIN_CONTEXT] = irb.context
41
- eval("site = $BRIDGETOWN_SITE", workspace.binding, __FILE__, __LINE__)
42
- Bridgetown.logger.info "Console:", "Now loaded as " + "site".cyan + " variable."
45
+ $BRIDGETOWN_SITE = site
46
+ IRB.setup(nil)
47
+ workspace = IRB::WorkSpace.new
48
+ irb = IRB::Irb.new(workspace)
49
+ IRB.conf[:MAIN_CONTEXT] = irb.context
50
+ eval("site = $BRIDGETOWN_SITE", workspace.binding, __FILE__, __LINE__)
51
+ Bridgetown.logger.info "Console:", "Now loaded as " + "site".cyan + " variable."
43
52
 
44
- trap("SIGINT") do
45
- irb.signal_handle
46
- end
53
+ trap("SIGINT") do
54
+ irb.signal_handle
55
+ end
47
56
 
48
- begin
49
- catch(:IRB_EXIT) do
50
- irb.eval_input
51
- end
57
+ begin
58
+ catch(:IRB_EXIT) do
59
+ irb.eval_input
52
60
  end
53
61
  end
54
- # rubocop:enable Style/GlobalVars, Metrics/AbcSize, Metrics/MethodLength
55
62
  end
56
63
  end
57
64
  end
@@ -2,161 +2,160 @@
2
2
 
3
3
  module Bridgetown
4
4
  module Commands
5
- class Doctor < Command
6
- class << self
7
- def init_with_program(prog)
8
- prog.command(:doctor) do |c|
9
- c.syntax "doctor"
10
- c.description "Search site and print specific deprecation warnings"
11
-
12
- c.option "config", "--config CONFIG_FILE[,CONFIG_FILE2,...]", Array,
13
- "Custom configuration file"
14
-
15
- c.action do |_, options|
16
- Bridgetown::Commands::Doctor.process(options)
17
- end
18
- end
19
- end
5
+ class Doctor < Thor::Group
6
+ extend BuildOptions
7
+ extend Summarizable
8
+ include ConfigurationOverridable
20
9
 
21
- def process(options)
22
- site = Bridgetown::Site.new(configuration_from_options(options))
23
- site.reset
24
- site.read
25
- site.generate
10
+ Registrations.register do
11
+ register(Doctor, "doctor", "doctor", Doctor.summary)
12
+ end
26
13
 
27
- if healthy?(site)
28
- Bridgetown.logger.info "Your test results", "are in. Everything looks fine."
29
- else
30
- abort
31
- end
14
+ def self.banner
15
+ "bridgetown doctor [options]"
16
+ end
17
+ summary "Search site and print specific deprecation warnings"
18
+
19
+ def doctor
20
+ site = Bridgetown::Site.new(configuration_with_overrides(options))
21
+ site.reset
22
+ site.read
23
+ site.generate
24
+
25
+ if healthy?(site)
26
+ Bridgetown.logger.info "Your test results", "are in. Everything looks fine."
27
+ else
28
+ abort
32
29
  end
30
+ end
33
31
 
34
- def healthy?(site)
35
- [
36
- fsnotify_buggy?(site),
37
- !conflicting_urls(site),
38
- !urls_only_differ_by_case(site),
39
- proper_site_url?(site),
40
- properly_gathered_posts?(site),
41
- ].all?
42
- end
32
+ protected
33
+
34
+ def healthy?(site)
35
+ [
36
+ fsnotify_buggy?(site),
37
+ !conflicting_urls(site),
38
+ !urls_only_differ_by_case(site),
39
+ proper_site_url?(site),
40
+ properly_gathered_posts?(site),
41
+ ].all?
42
+ end
43
43
 
44
- def properly_gathered_posts?(site)
45
- return true if site.config["collections_dir"].empty?
44
+ def properly_gathered_posts?(site)
45
+ return true if site.config["collections_dir"].empty?
46
46
 
47
- posts_at_root = site.in_source_dir("_posts")
48
- return true unless File.directory?(posts_at_root)
47
+ posts_at_root = site.in_source_dir("_posts")
48
+ return true unless File.directory?(posts_at_root)
49
49
 
50
- Bridgetown.logger.warn "Warning:",
51
- "Detected '_posts' directory outside custom `collections_dir`!"
52
- Bridgetown.logger.warn "",
53
- "Please move '#{posts_at_root}' into the custom directory at " \
54
- "'#{site.in_source_dir(site.config["collections_dir"])}'"
55
- false
56
- end
50
+ Bridgetown.logger.warn "Warning:",
51
+ "Detected '_posts' directory outside custom `collections_dir`!"
52
+ Bridgetown.logger.warn "",
53
+ "Please move '#{posts_at_root}' into the custom directory at " \
54
+ "'#{site.in_source_dir(site.config["collections_dir"])}'"
55
+ false
56
+ end
57
57
 
58
- def conflicting_urls(site)
59
- conflicting_urls = false
60
- urls = {}
61
- urls = collect_urls(urls, site.pages, site.dest)
62
- urls = collect_urls(urls, site.posts.docs, site.dest)
63
- urls.each do |url, paths|
64
- next unless paths.size > 1
65
-
66
- conflicting_urls = true
67
- Bridgetown.logger.warn "Conflict:", "The URL '#{url}' is the destination" \
68
- " for the following pages: #{paths.join(", ")}"
69
- end
70
- conflicting_urls
58
+ def conflicting_urls(site)
59
+ conflicting_urls = false
60
+ urls = {}
61
+ urls = collect_urls(urls, site.pages, site.dest)
62
+ urls = collect_urls(urls, site.posts.docs, site.dest)
63
+ urls.each do |url, paths|
64
+ next unless paths.size > 1
65
+
66
+ conflicting_urls = true
67
+ Bridgetown.logger.warn "Conflict:", "The URL '#{url}' is the destination" \
68
+ " for the following pages: #{paths.join(", ")}"
71
69
  end
70
+ conflicting_urls
71
+ end
72
72
 
73
- def fsnotify_buggy?(_site)
74
- return true unless Utils::Platforms.osx?
75
-
76
- if Dir.pwd != `pwd`.strip
77
- Bridgetown.logger.error " " + <<-STR.strip.gsub(%r!\n\s+!, "\n ")
78
- We have detected that there might be trouble using fsevent on your
79
- operating system, you can read https://github.com/thibaudgg/rb-fsevent/wiki/no-fsevents-fired-(OSX-bug)
80
- for possible work arounds or you can work around it immediately
81
- with `--force-polling`.
82
- STR
73
+ def fsnotify_buggy?(_site)
74
+ return true unless Utils::Platforms.osx?
83
75
 
84
- false
85
- end
76
+ if Dir.pwd != `pwd`.strip
77
+ Bridgetown.logger.error " " + <<-STR.strip.gsub(%r!\n\s+!, "\n ")
78
+ We have detected that there might be trouble using fsevent on your
79
+ operating system, you can read https://github.com/thibaudgg/rb-fsevent/wiki/no-fsevents-fired-(OSX-bug)
80
+ for possible work arounds or you can work around it immediately
81
+ with `--force-polling`.
82
+ STR
86
83
 
87
- true
84
+ false
88
85
  end
89
86
 
90
- def urls_only_differ_by_case(site)
91
- urls_only_differ_by_case = false
92
- urls = case_insensitive_urls(site.pages + site.docs_to_write, site.dest)
93
- urls.each_value do |real_urls|
94
- next unless real_urls.uniq.size > 1
87
+ true
88
+ end
95
89
 
96
- urls_only_differ_by_case = true
97
- Bridgetown.logger.warn "Warning:", "The following URLs only differ" \
98
- " by case. On a case-insensitive file system one of the URLs" \
99
- " will be overwritten by the other: #{real_urls.join(", ")}"
100
- end
101
- urls_only_differ_by_case
102
- end
90
+ def urls_only_differ_by_case(site)
91
+ urls_only_differ_by_case = false
92
+ urls = case_insensitive_urls(site.pages + site.docs_to_write, site.dest)
93
+ urls.each_value do |real_urls|
94
+ next unless real_urls.uniq.size > 1
103
95
 
104
- def proper_site_url?(site)
105
- url = site.config["url"]
106
- [
107
- url_exists?(url),
108
- url_valid?(url),
109
- url_absolute(url),
110
- ].all?
96
+ urls_only_differ_by_case = true
97
+ Bridgetown.logger.warn "Warning:", "The following URLs only differ" \
98
+ " by case. On a case-insensitive file system one of the URLs" \
99
+ " will be overwritten by the other: #{real_urls.join(", ")}"
111
100
  end
101
+ urls_only_differ_by_case
102
+ end
112
103
 
113
- private
104
+ def proper_site_url?(site)
105
+ url = site.config["url"]
106
+ [
107
+ url_exists?(url),
108
+ url_valid?(url),
109
+ url_absolute(url),
110
+ ].all?
111
+ end
114
112
 
115
- def collect_urls(urls, things, destination)
116
- things.each do |thing|
117
- dest = thing.destination(destination)
118
- if urls[dest]
119
- urls[dest] << thing.path
120
- else
121
- urls[dest] = [thing.path]
122
- end
113
+ private
114
+
115
+ def collect_urls(urls, things, destination)
116
+ things.each do |thing|
117
+ dest = thing.destination(destination)
118
+ if urls[dest]
119
+ urls[dest] << thing.path
120
+ else
121
+ urls[dest] = [thing.path]
123
122
  end
124
- urls
125
123
  end
124
+ urls
125
+ end
126
126
 
127
- def case_insensitive_urls(things, destination)
128
- things.each_with_object({}) do |thing, memo|
129
- dest = thing.destination(destination)
130
- (memo[dest.downcase] ||= []) << dest
131
- end
127
+ def case_insensitive_urls(things, destination)
128
+ things.each_with_object({}) do |thing, memo|
129
+ dest = thing.destination(destination)
130
+ (memo[dest.downcase] ||= []) << dest
132
131
  end
132
+ end
133
133
 
134
- def url_exists?(url)
135
- return true unless url.nil? || url.empty?
134
+ def url_exists?(url)
135
+ return true unless url.nil? || url.empty?
136
136
 
137
- Bridgetown.logger.warn "Warning:", "You didn't set an URL in the config file, "\
138
- "you may encounter problems with some plugins."
139
- false
140
- end
137
+ Bridgetown.logger.warn "Warning:", "You didn't set an URL in the config file, "\
138
+ "you may encounter problems with some plugins."
139
+ false
140
+ end
141
141
 
142
- def url_valid?(url)
143
- Addressable::URI.parse(url)
144
- true
145
- # Addressable::URI#parse only raises a TypeError
146
- # https://git.io/vFfbx
147
- rescue TypeError
148
- Bridgetown.logger.warn "Warning:", "The site URL does not seem to be valid, "\
149
- "check the value of `url` in your config file."
150
- false
151
- end
142
+ def url_valid?(url)
143
+ Addressable::URI.parse(url)
144
+ true
145
+ # Addressable::URI#parse only raises a TypeError
146
+ # https://git.io/vFfbx
147
+ rescue TypeError
148
+ Bridgetown.logger.warn "Warning:", "The site URL does not seem to be valid, "\
149
+ "check the value of `url` in your config file."
150
+ false
151
+ end
152
152
 
153
- def url_absolute(url)
154
- return true if url.is_a?(String) && Addressable::URI.parse(url).absolute?
153
+ def url_absolute(url)
154
+ return true if url.is_a?(String) && Addressable::URI.parse(url).absolute?
155
155
 
156
- Bridgetown.logger.warn "Warning:", "Your site URL does not seem to be absolute, "\
157
- "check the value of `url` in your config file."
158
- false
159
- end
156
+ Bridgetown.logger.warn "Warning:", "Your site URL does not seem to be absolute, "\
157
+ "check the value of `url` in your config file."
158
+ false
160
159
  end
161
160
  end
162
161
  end