jekyll 4.0.1 → 4.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 (124) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +350 -163
  3. data/LICENSE +21 -21
  4. data/README.markdown +86 -90
  5. data/exe/jekyll +57 -57
  6. data/lib/blank_template/_config.yml +3 -3
  7. data/lib/blank_template/_layouts/default.html +12 -12
  8. data/lib/blank_template/_sass/main.scss +9 -9
  9. data/lib/blank_template/assets/css/main.scss +4 -4
  10. data/lib/blank_template/index.md +8 -8
  11. data/lib/jekyll/cache.rb +190 -190
  12. data/lib/jekyll/cleaner.rb +111 -111
  13. data/lib/jekyll/collection.rb +309 -309
  14. data/lib/jekyll/command.rb +105 -103
  15. data/lib/jekyll/commands/build.rb +93 -93
  16. data/lib/jekyll/commands/clean.rb +45 -45
  17. data/lib/jekyll/commands/doctor.rb +177 -173
  18. data/lib/jekyll/commands/help.rb +34 -34
  19. data/lib/jekyll/commands/new.rb +169 -169
  20. data/lib/jekyll/commands/new_theme.rb +40 -42
  21. data/lib/jekyll/commands/serve/live_reload_reactor.rb +122 -122
  22. data/lib/jekyll/commands/serve/livereload_assets/livereload.js +1183 -1183
  23. data/lib/jekyll/commands/serve/servlet.rb +202 -202
  24. data/lib/jekyll/commands/serve/websockets.rb +81 -81
  25. data/lib/jekyll/commands/serve.rb +362 -354
  26. data/lib/jekyll/configuration.rb +313 -316
  27. data/lib/jekyll/converter.rb +54 -54
  28. data/lib/jekyll/converters/identity.rb +41 -41
  29. data/lib/jekyll/converters/markdown/kramdown_parser.rb +199 -130
  30. data/lib/jekyll/converters/markdown.rb +113 -113
  31. data/lib/jekyll/converters/smartypants.rb +70 -70
  32. data/lib/jekyll/convertible.rb +257 -254
  33. data/lib/jekyll/deprecator.rb +50 -50
  34. data/lib/jekyll/document.rb +544 -522
  35. data/lib/jekyll/drops/collection_drop.rb +20 -20
  36. data/lib/jekyll/drops/document_drop.rb +70 -69
  37. data/lib/jekyll/drops/drop.rb +293 -215
  38. data/lib/jekyll/drops/excerpt_drop.rb +19 -19
  39. data/lib/jekyll/drops/jekyll_drop.rb +32 -32
  40. data/lib/jekyll/drops/site_drop.rb +66 -66
  41. data/lib/jekyll/drops/static_file_drop.rb +14 -14
  42. data/lib/jekyll/drops/unified_payload_drop.rb +26 -26
  43. data/lib/jekyll/drops/url_drop.rb +140 -132
  44. data/lib/jekyll/entry_filter.rb +121 -110
  45. data/lib/jekyll/errors.rb +20 -20
  46. data/lib/jekyll/excerpt.rb +201 -201
  47. data/lib/jekyll/external.rb +79 -79
  48. data/lib/jekyll/filters/date_filters.rb +110 -110
  49. data/lib/jekyll/filters/grouping_filters.rb +64 -64
  50. data/lib/jekyll/filters/url_filters.rb +98 -68
  51. data/lib/jekyll/filters.rb +535 -454
  52. data/lib/jekyll/frontmatter_defaults.rb +240 -245
  53. data/lib/jekyll/generator.rb +5 -5
  54. data/lib/jekyll/hooks.rb +107 -106
  55. data/lib/jekyll/inclusion.rb +32 -0
  56. data/lib/jekyll/layout.rb +67 -62
  57. data/lib/jekyll/liquid_extensions.rb +22 -22
  58. data/lib/jekyll/liquid_renderer/file.rb +77 -77
  59. data/lib/jekyll/liquid_renderer/table.rb +55 -75
  60. data/lib/jekyll/liquid_renderer.rb +80 -77
  61. data/lib/jekyll/log_adapter.rb +151 -151
  62. data/lib/jekyll/mime.types +866 -866
  63. data/lib/jekyll/page.rb +217 -186
  64. data/lib/jekyll/page_excerpt.rb +25 -0
  65. data/lib/jekyll/page_without_a_file.rb +14 -14
  66. data/lib/jekyll/path_manager.rb +74 -31
  67. data/lib/jekyll/plugin.rb +92 -92
  68. data/lib/jekyll/plugin_manager.rb +115 -115
  69. data/lib/jekyll/profiler.rb +58 -0
  70. data/lib/jekyll/publisher.rb +23 -23
  71. data/lib/jekyll/reader.rb +192 -187
  72. data/lib/jekyll/readers/collection_reader.rb +23 -22
  73. data/lib/jekyll/readers/data_reader.rb +79 -75
  74. data/lib/jekyll/readers/layout_reader.rb +62 -61
  75. data/lib/jekyll/readers/page_reader.rb +25 -24
  76. data/lib/jekyll/readers/post_reader.rb +85 -84
  77. data/lib/jekyll/readers/static_file_reader.rb +25 -24
  78. data/lib/jekyll/readers/theme_assets_reader.rb +52 -51
  79. data/lib/jekyll/regenerator.rb +195 -195
  80. data/lib/jekyll/related_posts.rb +52 -52
  81. data/lib/jekyll/renderer.rb +265 -267
  82. data/lib/jekyll/site.rb +551 -527
  83. data/lib/jekyll/static_file.rb +208 -203
  84. data/lib/jekyll/stevenson.rb +60 -60
  85. data/lib/jekyll/tags/highlight.rb +110 -110
  86. data/lib/jekyll/tags/include.rb +275 -221
  87. data/lib/jekyll/tags/link.rb +42 -41
  88. data/lib/jekyll/tags/post_url.rb +106 -107
  89. data/lib/jekyll/theme.rb +86 -80
  90. data/lib/jekyll/theme_builder.rb +121 -121
  91. data/lib/jekyll/url.rb +167 -164
  92. data/lib/jekyll/utils/ansi.rb +57 -57
  93. data/lib/jekyll/utils/exec.rb +26 -26
  94. data/lib/jekyll/utils/internet.rb +37 -37
  95. data/lib/jekyll/utils/platforms.rb +67 -82
  96. data/lib/jekyll/utils/thread_event.rb +31 -31
  97. data/lib/jekyll/utils/win_tz.rb +75 -75
  98. data/lib/jekyll/utils.rb +367 -367
  99. data/lib/jekyll/version.rb +5 -5
  100. data/lib/jekyll.rb +195 -206
  101. data/lib/site_template/.gitignore +5 -5
  102. data/lib/site_template/404.html +25 -25
  103. data/lib/site_template/_config.yml +55 -55
  104. data/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb +29 -29
  105. data/lib/site_template/about.markdown +18 -18
  106. data/lib/site_template/index.markdown +6 -6
  107. data/lib/theme_template/CODE_OF_CONDUCT.md.erb +74 -74
  108. data/lib/theme_template/Gemfile +4 -4
  109. data/lib/theme_template/LICENSE.txt.erb +21 -21
  110. data/lib/theme_template/README.md.erb +52 -52
  111. data/lib/theme_template/_layouts/default.html +1 -1
  112. data/lib/theme_template/_layouts/page.html +5 -5
  113. data/lib/theme_template/_layouts/post.html +5 -5
  114. data/lib/theme_template/example/_config.yml.erb +1 -1
  115. data/lib/theme_template/example/_post.md +12 -12
  116. data/lib/theme_template/example/index.html +14 -14
  117. data/lib/theme_template/example/style.scss +7 -7
  118. data/lib/theme_template/gitignore.erb +6 -6
  119. data/lib/theme_template/theme.gemspec.erb +16 -19
  120. data/rubocop/jekyll/assert_equal_literal_actual.rb +149 -149
  121. data/rubocop/jekyll/no_p_allowed.rb +23 -23
  122. data/rubocop/jekyll/no_puts_allowed.rb +23 -23
  123. data/rubocop/jekyll.rb +5 -5
  124. metadata +20 -38
data/lib/jekyll/url.rb CHANGED
@@ -1,164 +1,167 @@
1
- # frozen_string_literal: true
2
-
3
- # Public: Methods that generate a URL for a resource such as a Post or a Page.
4
- #
5
- # Examples
6
- #
7
- # URL.new({
8
- # :template => /:categories/:title.html",
9
- # :placeholders => {:categories => "ruby", :title => "something"}
10
- # }).to_s
11
- #
12
- module Jekyll
13
- class URL
14
- # options - One of :permalink or :template must be supplied.
15
- # :template - The String used as template for URL generation,
16
- # for example "/:path/:basename:output_ext", where
17
- # a placeholder is prefixed with a colon.
18
- # :placeholders - A hash containing the placeholders which will be
19
- # replaced when used inside the template. E.g.
20
- # { "year" => Time.now.strftime("%Y") } would replace
21
- # the placeholder ":year" with the current year.
22
- # :permalink - If supplied, no URL will be generated from the
23
- # template. Instead, the given permalink will be
24
- # used as URL.
25
- def initialize(options)
26
- @template = options[:template]
27
- @placeholders = options[:placeholders] || {}
28
- @permalink = options[:permalink]
29
-
30
- if (@template || @permalink).nil?
31
- raise ArgumentError, "One of :template or :permalink must be supplied."
32
- end
33
- end
34
-
35
- # The generated relative URL of the resource
36
- #
37
- # Returns the String URL
38
- def to_s
39
- sanitize_url(generated_permalink || generated_url)
40
- end
41
-
42
- # Generates a URL from the permalink
43
- #
44
- # Returns the _unsanitized String URL
45
- def generated_permalink
46
- (@generated_permalink ||= generate_url(@permalink)) if @permalink
47
- end
48
-
49
- # Generates a URL from the template
50
- #
51
- # Returns the unsanitized String URL
52
- def generated_url
53
- @generated_url ||= generate_url(@template)
54
- end
55
-
56
- # Internal: Generate the URL by replacing all placeholders with their
57
- # respective values in the given template
58
- #
59
- # Returns the unsanitized String URL
60
- def generate_url(template)
61
- if @placeholders.is_a? Drops::UrlDrop
62
- generate_url_from_drop(template)
63
- else
64
- generate_url_from_hash(template)
65
- end
66
- end
67
-
68
- def generate_url_from_hash(template)
69
- @placeholders.inject(template) do |result, token|
70
- break result if result.index(":").nil?
71
-
72
- if token.last.nil?
73
- # Remove leading "/" to avoid generating urls with `//`
74
- result.gsub("/:#{token.first}", "")
75
- else
76
- result.gsub(":#{token.first}", self.class.escape_path(token.last))
77
- end
78
- end
79
- end
80
-
81
- # We include underscores in keys to allow for 'i_month' and so forth.
82
- # This poses a problem for keys which are followed by an underscore
83
- # but the underscore is not part of the key, e.g. '/:month_:day'.
84
- # That should be :month and :day, but our key extraction regexp isn't
85
- # smart enough to know that so we have to make it an explicit
86
- # possibility.
87
- def possible_keys(key)
88
- if key.end_with?("_")
89
- [key, key.chomp("_")]
90
- else
91
- [key]
92
- end
93
- end
94
-
95
- def generate_url_from_drop(template)
96
- template.gsub(%r!:([a-z_]+)!) do |match|
97
- pool = possible_keys(match.sub(":", ""))
98
-
99
- winner = pool.find { |key| @placeholders.key?(key) }
100
- if winner.nil?
101
- raise NoMethodError,
102
- "The URL template doesn't have #{pool.join(" or ")} keys. "\
103
- "Check your permalink template!"
104
- end
105
-
106
- value = @placeholders[winner]
107
- value = "" if value.nil?
108
- replacement = self.class.escape_path(value)
109
-
110
- match.sub(":#{winner}", replacement)
111
- end.squeeze("/")
112
- end
113
-
114
- # Returns a sanitized String URL, stripping "../../" and multiples of "/",
115
- # as well as the beginning "/" so we can enforce and ensure it.
116
-
117
- def sanitize_url(str)
118
- "/#{str}".gsub("..", "/").gsub("./", "").squeeze("/")
119
- end
120
-
121
- # Escapes a path to be a valid URL path segment
122
- #
123
- # path - The path to be escaped.
124
- #
125
- # Examples:
126
- #
127
- # URL.escape_path("/a b")
128
- # # => "/a%20b"
129
- #
130
- # Returns the escaped path.
131
- def self.escape_path(path)
132
- return path if path.empty? || %r!^[a-zA-Z0-9./-]+$!.match?(path)
133
-
134
- # Because URI.escape doesn't escape "?", "[" and "]" by default,
135
- # specify unsafe string (except unreserved, sub-delims, ":", "@" and "/").
136
- #
137
- # URI path segment is defined in RFC 3986 as follows:
138
- # segment = *pchar
139
- # pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
140
- # unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
141
- # pct-encoded = "%" HEXDIG HEXDIG
142
- # sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
143
- # / "*" / "+" / "," / ";" / "="
144
- Addressable::URI.encode(path).encode("utf-8").sub("#", "%23")
145
- end
146
-
147
- # Unescapes a URL path segment
148
- #
149
- # path - The path to be unescaped.
150
- #
151
- # Examples:
152
- #
153
- # URL.unescape_path("/a%20b")
154
- # # => "/a b"
155
- #
156
- # Returns the unescaped path.
157
- def self.unescape_path(path)
158
- path = path.encode("utf-8")
159
- return path unless path.include?("%")
160
-
161
- Addressable::URI.unencode(path)
162
- end
163
- end
164
- end
1
+ # frozen_string_literal: true
2
+
3
+ # Public: Methods that generate a URL for a resource such as a Post or a Page.
4
+ #
5
+ # Examples
6
+ #
7
+ # URL.new({
8
+ # :template => /:categories/:title.html",
9
+ # :placeholders => {:categories => "ruby", :title => "something"}
10
+ # }).to_s
11
+ #
12
+ module Jekyll
13
+ class URL
14
+ # options - One of :permalink or :template must be supplied.
15
+ # :template - The String used as template for URL generation,
16
+ # for example "/:path/:basename:output_ext", where
17
+ # a placeholder is prefixed with a colon.
18
+ # :placeholders - A hash containing the placeholders which will be
19
+ # replaced when used inside the template. E.g.
20
+ # { "year" => Time.now.strftime("%Y") } would replace
21
+ # the placeholder ":year" with the current year.
22
+ # :permalink - If supplied, no URL will be generated from the
23
+ # template. Instead, the given permalink will be
24
+ # used as URL.
25
+ def initialize(options)
26
+ @template = options[:template]
27
+ @placeholders = options[:placeholders] || {}
28
+ @permalink = options[:permalink]
29
+
30
+ if (@template || @permalink).nil?
31
+ raise ArgumentError, "One of :template or :permalink must be supplied."
32
+ end
33
+ end
34
+
35
+ # The generated relative URL of the resource
36
+ #
37
+ # Returns the String URL
38
+ def to_s
39
+ sanitize_url(generated_permalink || generated_url)
40
+ end
41
+
42
+ # Generates a URL from the permalink
43
+ #
44
+ # Returns the _unsanitized String URL
45
+ def generated_permalink
46
+ (@generated_permalink ||= generate_url(@permalink)) if @permalink
47
+ end
48
+
49
+ # Generates a URL from the template
50
+ #
51
+ # Returns the unsanitized String URL
52
+ def generated_url
53
+ @generated_url ||= generate_url(@template)
54
+ end
55
+
56
+ # Internal: Generate the URL by replacing all placeholders with their
57
+ # respective values in the given template
58
+ #
59
+ # Returns the unsanitized String URL
60
+ def generate_url(template)
61
+ if @placeholders.is_a? Drops::UrlDrop
62
+ generate_url_from_drop(template)
63
+ else
64
+ generate_url_from_hash(template)
65
+ end
66
+ end
67
+
68
+ def generate_url_from_hash(template)
69
+ @placeholders.inject(template) do |result, token|
70
+ break result if result.index(":").nil?
71
+
72
+ if token.last.nil?
73
+ # Remove leading "/" to avoid generating urls with `//`
74
+ result.gsub("/:#{token.first}", "")
75
+ else
76
+ result.gsub(":#{token.first}", self.class.escape_path(token.last))
77
+ end
78
+ end
79
+ end
80
+
81
+ # We include underscores in keys to allow for 'i_month' and so forth.
82
+ # This poses a problem for keys which are followed by an underscore
83
+ # but the underscore is not part of the key, e.g. '/:month_:day'.
84
+ # That should be :month and :day, but our key extraction regexp isn't
85
+ # smart enough to know that so we have to make it an explicit
86
+ # possibility.
87
+ def possible_keys(key)
88
+ if key.end_with?("_")
89
+ [key, key.chomp("_")]
90
+ else
91
+ [key]
92
+ end
93
+ end
94
+
95
+ def generate_url_from_drop(template)
96
+ template.gsub(%r!:([a-z_]+)!) do |match|
97
+ name = Regexp.last_match(1)
98
+ pool = name.end_with?("_") ? [name, name.chomp!("_")] : [name]
99
+
100
+ winner = pool.find { |key| @placeholders.key?(key) }
101
+ if winner.nil?
102
+ raise NoMethodError,
103
+ "The URL template doesn't have #{pool.join(" or ")} keys. "\
104
+ "Check your permalink template!"
105
+ end
106
+
107
+ value = @placeholders[winner]
108
+ value = "" if value.nil?
109
+ replacement = self.class.escape_path(value)
110
+
111
+ match.sub!(":#{winner}", replacement)
112
+ end
113
+ end
114
+
115
+ # Returns a sanitized String URL, stripping "../../" and multiples of "/",
116
+ # as well as the beginning "/" so we can enforce and ensure it.
117
+ def sanitize_url(str)
118
+ "/#{str}".gsub("..", "/").tap do |result|
119
+ result.gsub!("./", "")
120
+ result.squeeze!("/")
121
+ end
122
+ end
123
+
124
+ # Escapes a path to be a valid URL path segment
125
+ #
126
+ # path - The path to be escaped.
127
+ #
128
+ # Examples:
129
+ #
130
+ # URL.escape_path("/a b")
131
+ # # => "/a%20b"
132
+ #
133
+ # Returns the escaped path.
134
+ def self.escape_path(path)
135
+ return path if path.empty? || %r!^[a-zA-Z0-9./-]+$!.match?(path)
136
+
137
+ # Because URI.escape doesn't escape "?", "[" and "]" by default,
138
+ # specify unsafe string (except unreserved, sub-delims, ":", "@" and "/").
139
+ #
140
+ # URI path segment is defined in RFC 3986 as follows:
141
+ # segment = *pchar
142
+ # pchar = unreserved / pct-encoded / sub-delims / ":" / "@"
143
+ # unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~"
144
+ # pct-encoded = "%" HEXDIG HEXDIG
145
+ # sub-delims = "!" / "$" / "&" / "'" / "(" / ")"
146
+ # / "*" / "+" / "," / ";" / "="
147
+ Addressable::URI.encode(path).encode("utf-8").sub("#", "%23")
148
+ end
149
+
150
+ # Unescapes a URL path segment
151
+ #
152
+ # path - The path to be unescaped.
153
+ #
154
+ # Examples:
155
+ #
156
+ # URL.unescape_path("/a%20b")
157
+ # # => "/a b"
158
+ #
159
+ # Returns the unescaped path.
160
+ def self.unescape_path(path)
161
+ path = path.encode("utf-8")
162
+ return path unless path.include?("%")
163
+
164
+ Addressable::URI.unencode(path)
165
+ end
166
+ end
167
+ end
@@ -1,57 +1,57 @@
1
- # Frozen-string-literal: true
2
-
3
- module Jekyll
4
- module Utils
5
- module Ansi
6
- extend self
7
-
8
- ESCAPE = format("%c", 27)
9
- MATCH = %r!#{ESCAPE}\[(?:\d+)(?:;\d+)*(j|k|m|s|u|A|B|G)|\e\(B\e\[m!ix.freeze
10
- COLORS = {
11
- :red => 31,
12
- :green => 32,
13
- :black => 30,
14
- :magenta => 35,
15
- :yellow => 33,
16
- :white => 37,
17
- :blue => 34,
18
- :cyan => 36,
19
- }.freeze
20
-
21
- # Strip ANSI from the current string. It also strips cursor stuff,
22
- # well some of it, and it also strips some other stuff that a lot of
23
- # the other ANSI strippers don't.
24
-
25
- def strip(str)
26
- str.gsub MATCH, ""
27
- end
28
-
29
- #
30
-
31
- def has?(str)
32
- !!(str =~ MATCH)
33
- end
34
-
35
- # Reset the color back to the default color so that you do not leak any
36
- # colors when you move onto the next line. This is probably normally
37
- # used as part of a wrapper so that we don't leak colors.
38
-
39
- def reset(str = "")
40
- @ansi_reset ||= format("%c[0m", 27)
41
- "#{@ansi_reset}#{str}"
42
- end
43
-
44
- # SEE: `self::COLORS` for a list of methods. They are mostly
45
- # standard base colors supported by pretty much any xterm-color, we do
46
- # not need more than the base colors so we do not include them.
47
- # Actually... if I'm honest we don't even need most of the
48
- # base colors.
49
-
50
- COLORS.each do |color, num|
51
- define_method color do |str|
52
- "#{format("%c", 27)}[#{num}m#{str}#{reset}"
53
- end
54
- end
55
- end
56
- end
57
- end
1
+ # Frozen-string-literal: true
2
+
3
+ module Jekyll
4
+ module Utils
5
+ module Ansi
6
+ extend self
7
+
8
+ ESCAPE = format("%c", 27)
9
+ MATCH = %r!#{ESCAPE}\[(?:\d+)(?:;\d+)*(j|k|m|s|u|A|B|G)|\e\(B\e\[m!ix.freeze
10
+ COLORS = {
11
+ :red => 31,
12
+ :green => 32,
13
+ :black => 30,
14
+ :magenta => 35,
15
+ :yellow => 33,
16
+ :white => 37,
17
+ :blue => 34,
18
+ :cyan => 36,
19
+ }.freeze
20
+
21
+ # Strip ANSI from the current string. It also strips cursor stuff,
22
+ # well some of it, and it also strips some other stuff that a lot of
23
+ # the other ANSI strippers don't.
24
+
25
+ def strip(str)
26
+ str.gsub MATCH, ""
27
+ end
28
+
29
+ #
30
+
31
+ def has?(str)
32
+ !!(str =~ MATCH)
33
+ end
34
+
35
+ # Reset the color back to the default color so that you do not leak any
36
+ # colors when you move onto the next line. This is probably normally
37
+ # used as part of a wrapper so that we don't leak colors.
38
+
39
+ def reset(str = "")
40
+ @ansi_reset ||= format("%c[0m", 27)
41
+ "#{@ansi_reset}#{str}"
42
+ end
43
+
44
+ # SEE: `self::COLORS` for a list of methods. They are mostly
45
+ # standard base colors supported by pretty much any xterm-color, we do
46
+ # not need more than the base colors so we do not include them.
47
+ # Actually... if I'm honest we don't even need most of the
48
+ # base colors.
49
+
50
+ COLORS.each do |color, num|
51
+ define_method color do |str|
52
+ "#{format("%c", 27)}[#{num}m#{str}#{reset}"
53
+ end
54
+ end
55
+ end
56
+ end
57
+ end
@@ -1,26 +1,26 @@
1
- # frozen_string_literal: true
2
-
3
- require "open3"
4
-
5
- module Jekyll
6
- module Utils
7
- module Exec
8
- extend self
9
-
10
- # Runs a program in a sub-shell.
11
- #
12
- # *args - a list of strings containing the program name and arguments
13
- #
14
- # Returns a Process::Status and a String of output in an array in
15
- # that order.
16
- def run(*args)
17
- stdin, stdout, stderr, process = Open3.popen3(*args)
18
- out = stdout.read.strip
19
- err = stderr.read.strip
20
-
21
- [stdin, stdout, stderr].each(&:close)
22
- [process.value, out + err]
23
- end
24
- end
25
- end
26
- end
1
+ # frozen_string_literal: true
2
+
3
+ require "open3"
4
+
5
+ module Jekyll
6
+ module Utils
7
+ module Exec
8
+ extend self
9
+
10
+ # Runs a program in a sub-shell.
11
+ #
12
+ # *args - a list of strings containing the program name and arguments
13
+ #
14
+ # Returns a Process::Status and a String of output in an array in
15
+ # that order.
16
+ def run(*args)
17
+ stdin, stdout, stderr, process = Open3.popen3(*args)
18
+ out = stdout.read.strip
19
+ err = stderr.read.strip
20
+
21
+ [stdin, stdout, stderr].each(&:close)
22
+ [process.value, out + err]
23
+ end
24
+ end
25
+ end
26
+ end
@@ -1,37 +1,37 @@
1
- # frozen_string_literal: true
2
-
3
- module Jekyll
4
- module Utils
5
- module Internet
6
- # Public: Determine whether the present device has a connection to
7
- # the Internet. This allows plugin writers which require the outside
8
- # world to have a neat fallback mechanism for offline building.
9
- #
10
- # Example:
11
- # if Internet.connected?
12
- # Typhoeus.get("https://pages.github.com/versions.json")
13
- # else
14
- # Jekyll.logger.warn "Warning:", "Version check has been disabled."
15
- # Jekyll.logger.warn "", "Connect to the Internet to enable it."
16
- # nil
17
- # end
18
- #
19
- # Returns true if a DNS call can successfully be made, or false if not.
20
-
21
- module_function
22
-
23
- def connected?
24
- !dns("example.com").nil?
25
- end
26
-
27
- def dns(domain)
28
- require "resolv"
29
- Resolv::DNS.open do |resolver|
30
- resolver.getaddress(domain)
31
- end
32
- rescue Resolv::ResolvError, Resolv::ResolvTimeout
33
- nil
34
- end
35
- end
36
- end
37
- end
1
+ # frozen_string_literal: true
2
+
3
+ module Jekyll
4
+ module Utils
5
+ module Internet
6
+ # Public: Determine whether the present device has a connection to
7
+ # the Internet. This allows plugin writers which require the outside
8
+ # world to have a neat fallback mechanism for offline building.
9
+ #
10
+ # Example:
11
+ # if Internet.connected?
12
+ # Typhoeus.get("https://pages.github.com/versions.json")
13
+ # else
14
+ # Jekyll.logger.warn "Warning:", "Version check has been disabled."
15
+ # Jekyll.logger.warn "", "Connect to the Internet to enable it."
16
+ # nil
17
+ # end
18
+ #
19
+ # Returns true if a DNS call can successfully be made, or false if not.
20
+
21
+ module_function
22
+
23
+ def connected?
24
+ !dns("example.com").nil?
25
+ end
26
+
27
+ def dns(domain)
28
+ require "resolv"
29
+ Resolv::DNS.open do |resolver|
30
+ resolver.getaddress(domain)
31
+ end
32
+ rescue Resolv::ResolvError, Resolv::ResolvTimeout
33
+ nil
34
+ end
35
+ end
36
+ end
37
+ end