lbenicio-minimal-v1 1.0.3 → 1.0.6

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 (66) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +471 -0
  3. data/_includes/analytics.html +10 -0
  4. data/_includes/anchor_headings.html +172 -0
  5. data/_includes/blog-navigation.html +18 -0
  6. data/_includes/conclusion.html +4 -0
  7. data/_includes/footer.html +13 -0
  8. data/_includes/fork.html +6 -0
  9. data/_includes/head.html +45 -0
  10. data/_includes/navigation.html +42 -0
  11. data/_includes/pagination.html +23 -0
  12. data/_includes/postList.html +20 -0
  13. data/_layouts/autopage_category.html +9 -0
  14. data/_layouts/autopage_collection.html +7 -0
  15. data/_layouts/autopage_tags.html +9 -0
  16. data/_layouts/default.html +28 -0
  17. data/_layouts/home.html +19 -0
  18. data/_layouts/posts.html +7 -0
  19. data/assets/favicon.ico +0 -0
  20. data/assets/monokai.scss +354 -0
  21. data/assets/postStyle.scss +26 -0
  22. data/assets/profile.jpg +0 -0
  23. data/assets/style.scss +143 -0
  24. data/assets/vendor/all.min.css +5 -0
  25. data/assets/webfonts/fa-brands-400.eot +0 -0
  26. data/assets/webfonts/fa-brands-400.svg +3717 -0
  27. data/assets/webfonts/fa-brands-400.ttf +0 -0
  28. data/assets/webfonts/fa-brands-400.woff +0 -0
  29. data/assets/webfonts/fa-brands-400.woff2 +0 -0
  30. data/assets/webfonts/fa-regular-400.eot +0 -0
  31. data/assets/webfonts/fa-regular-400.svg +801 -0
  32. data/assets/webfonts/fa-regular-400.ttf +0 -0
  33. data/assets/webfonts/fa-regular-400.woff +0 -0
  34. data/assets/webfonts/fa-regular-400.woff2 +0 -0
  35. data/assets/webfonts/fa-solid-900.eot +0 -0
  36. data/assets/webfonts/fa-solid-900.svg +5034 -0
  37. data/assets/webfonts/fa-solid-900.ttf +0 -0
  38. data/assets/webfonts/fa-solid-900.woff +0 -0
  39. data/assets/webfonts/fa-solid-900.woff2 +0 -0
  40. data/benchmark/capture-assign.rb +23 -0
  41. data/benchmark/conditional_liquid.rb +102 -0
  42. data/benchmark/end-with-vs-regexp +18 -0
  43. data/benchmark/file-dir-ensure-trailing-slash +56 -0
  44. data/benchmark/find-filter-vs-where-first-filters.rb +49 -0
  45. data/benchmark/flat-map +19 -0
  46. data/benchmark/hash-fetch +12 -0
  47. data/benchmark/jekyll-sanitize-path +47 -0
  48. data/benchmark/local-require +29 -0
  49. data/benchmark/native-vs-pathutil-relative +33 -0
  50. data/benchmark/parse-date +26 -0
  51. data/benchmark/parse-include-tag-params.rb +85 -0
  52. data/benchmark/path-manager.rb +65 -0
  53. data/benchmark/proc-call-vs-yield +17 -0
  54. data/benchmark/regexp-vs-include.rb +53 -0
  55. data/benchmark/sanitize-url.rb +27 -0
  56. data/benchmark/schwartzian_transform.rb +110 -0
  57. data/benchmark/sequential-assignment +15 -0
  58. data/benchmark/static-drop-vs-forwarded.rb +83 -0
  59. data/benchmark/string-concat +11 -0
  60. data/benchmark/string-replacement +16 -0
  61. data/benchmark/symbol-to-proc +9 -0
  62. data/rubocop/jekyll/assert_equal_literal_actual.rb +149 -0
  63. data/rubocop/jekyll/no_p_allowed.rb +23 -0
  64. data/rubocop/jekyll/no_puts_allowed.rb +23 -0
  65. data/rubocop/jekyll.rb +5 -0
  66. metadata +71 -7
Binary file
Binary file
Binary file
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'liquid'
5
+ require 'benchmark/ips'
6
+
7
+ puts "Ruby #{RUBY_VERSION}-p#{RUBY_PATCHLEVEL}"
8
+ puts "Liquid #{Liquid::VERSION}"
9
+
10
+ template1 = '{% capture foobar %}foo{{ bar }}{% endcapture %}{{ foo }}{{ foobar }}'
11
+ template2 = '{% assign foobar = "foo" | append: bar %}{{ foobar }}'
12
+
13
+ def render(template)
14
+ Liquid::Template.parse(template).render('bar' => '42')
15
+ end
16
+
17
+ puts render(template1)
18
+ puts render(template2)
19
+
20
+ Benchmark.ips do |x|
21
+ x.report('capture') { render(template1) }
22
+ x.report('assign') { render(template2) }
23
+ end
@@ -0,0 +1,102 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'liquid'
5
+ require 'benchmark/ips'
6
+
7
+ # Test if processing content string without any Liquid constructs, via Liquid,
8
+ # is slower than checking whether constructs exist ( using `String#include?` )
9
+ # and return-ing the "plaintext" content string as is..
10
+ #
11
+ # Ref: https://github.com/jekyll/jekyll/pull/6735
12
+
13
+ # Sample contents
14
+ WITHOUT_LIQUID = <<~TEXT
15
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor libero at
16
+ pharetra tempus. Etiam bibendum magna et metus fermentum, eu cursus lorem
17
+ mattis. Curabitur vel dui et lacus rutrum suscipit et eget neque.
18
+
19
+ Nullam luctus fermentum est id blandit. Phasellus consectetur ullamcorper
20
+ ligula, at finibus eros laoreet id. Etiam sit amet est in libero efficitur
21
+ tristique. Ut nec magna augue. Quisque ut fringilla lacus, ac dictum enim.
22
+ Aliquam vel ornare mauris. Suspendisse ornare diam tempor nulla facilisis
23
+ aliquet. Sed ultrices placerat ultricies.
24
+ TEXT
25
+
26
+ WITH_LIQUID = <<~LIQUID
27
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor libero at
28
+ pharetra tempus. {{ author }} et metus fermentum, eu cursus lorem
29
+ mattis. Curabitur vel dui et lacus rutrum suscipit et eget neque.
30
+
31
+ Nullam luctus fermentum est id blandit. Phasellus consectetur ullamcorper
32
+ ligula, {% if author == "Jane Doe" %} at finibus eros laoreet id. {% else %}
33
+ Etiam sit amet est in libero efficitur.{% endif %}
34
+ tristique. Ut nec magna augue. Quisque ut fringilla lacus, ac dictum enim.
35
+ Aliquam vel ornare mauris. Suspendisse ornare diam tempor nulla facilisis
36
+ aliquet. Sed ultrices placerat ultricies.
37
+ LIQUID
38
+
39
+ WITH_JUST_LIQUID_VAR = <<~LIQUID
40
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce auctor libero at
41
+ pharetra tempus. et metus fermentum, eu cursus lorem, ac dictum enim.
42
+ mattis. Curabitur vel dui et lacus rutrum suscipit et {{ title }} neque.
43
+
44
+ Nullam luctus fermentum est id blandit. Phasellus consectetur ullamcorper
45
+ ligula, at finibus eros laoreet id. Etiam sit amet est in libero efficitur.
46
+ tristique. Ut nec magna augue. {{ author }} Quisque ut fringilla lacus
47
+ Aliquam vel ornare mauris. Suspendisse ornare diam tempor nulla facilisis
48
+ aliquet. Sed ultrices placerat ultricies.
49
+ LIQUID
50
+
51
+ SUITE = {
52
+ "plain text": WITHOUT_LIQUID,
53
+ "tags n vars": WITH_LIQUID,
54
+ "just vars": WITH_JUST_LIQUID_VAR
55
+ }.freeze
56
+
57
+ # Mimic how Jekyll's LiquidRenderer would process a non-static file, with
58
+ # some dummy payload
59
+ def always_liquid(content)
60
+ Liquid::Template.error_mode = :warn
61
+ Liquid::Template.parse(content, line_numbers: true).render(
62
+ 'author' => 'John Doe',
63
+ 'title' => 'FooBar'
64
+ )
65
+ end
66
+
67
+ # Mimic how the proposed change would first execute a couple of checks and
68
+ # proceed to process with Liquid if necessary
69
+ def conditional_liquid(content)
70
+ return content if content.nil? || content.empty?
71
+ return content unless content.include?('{%') || content.include?('{{')
72
+
73
+ always_liquid(content)
74
+ end
75
+
76
+ # Test https://github.com/jekyll/jekyll/pull/6735#discussion_r165499868
77
+ # ------------------------------------------------------------------------
78
+ def check_with_regex(content)
79
+ !content.to_s.match?(/{[{%]/)
80
+ end
81
+
82
+ def check_with_builtin(content)
83
+ content.include?('{%') || content.include?('{{')
84
+ end
85
+
86
+ SUITE.each do |key, text|
87
+ Benchmark.ips do |x|
88
+ x.report("regex-check - #{key}") { check_with_regex(text) }
89
+ x.report("builtin-check - #{key}") { check_with_builtin(text) }
90
+ x.compare!
91
+ end
92
+ end
93
+ # ------------------------------------------------------------------------
94
+
95
+ # Let's roll!
96
+ SUITE.each do |key, text|
97
+ Benchmark.ips do |x|
98
+ x.report("always thru liquid - #{key}") { always_liquid(text) }
99
+ x.report("conditional liquid - #{key}") { conditional_liquid(text) }
100
+ x.compare!
101
+ end
102
+ end
@@ -0,0 +1,18 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'benchmark/ips'
5
+
6
+ Benchmark.ips do |x|
7
+ path_without_ending_slash = '/some/very/very/long/path/to/a/file/i/like'
8
+ x.report('no slash regexp') { path_without_ending_slash =~ %r{/$} }
9
+ x.report('no slash end_with?') { path_without_ending_slash.end_with?('/') }
10
+ x.report('no slash [-1, 1]') { path_without_ending_slash[-1, 1] == '/' }
11
+ end
12
+
13
+ Benchmark.ips do |x|
14
+ path_with_ending_slash = '/some/very/very/long/path/to/a/file/i/like/'
15
+ x.report('slash regexp') { path_with_ending_slash =~ %r{/$} }
16
+ x.report('slash end_with?') { path_with_ending_slash.end_with?('/') }
17
+ x.report('slash [-1, 1]') { path_with_ending_slash[-1, 1] == '/' }
18
+ end
@@ -0,0 +1,56 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'benchmark/ips'
5
+
6
+ # For this pull request, which changes Page#dir
7
+ # https://github.com/jekyll/jekyll/pull/4403
8
+
9
+ FORWARD_SLASH = '/'
10
+
11
+ def pre_pr(url)
12
+ url[-1, 1] == FORWARD_SLASH ? url : File.dirname(url)
13
+ end
14
+
15
+ def pr(url)
16
+ if url.end_with?(FORWARD_SLASH)
17
+ url
18
+ else
19
+ url_dir = File.dirname(url)
20
+ url_dir.end_with?(FORWARD_SLASH) ? url_dir : "#{url_dir}/"
21
+ end
22
+ end
23
+
24
+ def envygeeks(url)
25
+ return url if url.end_with?(FORWARD_SLASH) || url == FORWARD_SLASH
26
+
27
+ url = File.dirname(url)
28
+ url == FORWARD_SLASH ? url : "#{url}/"
29
+ end
30
+
31
+ # Just a slash
32
+ Benchmark.ips do |x|
33
+ path = '/'
34
+ x.report("pre_pr:#{path}") { pre_pr(path) }
35
+ x.report("pr:#{path}") { pr(path) }
36
+ x.report("envygeeks:#{path}") { pr(path) }
37
+ x.compare!
38
+ end
39
+
40
+ # No trailing slash
41
+ Benchmark.ips do |x|
42
+ path = '/some/very/very/long/path/to/a/file/i/like'
43
+ x.report("pre_pr:#{path}") { pre_pr(path) }
44
+ x.report("pr:#{path}") { pr(path) }
45
+ x.report("envygeeks:#{path}") { pr(path) }
46
+ x.compare!
47
+ end
48
+
49
+ # No trailing slash
50
+ Benchmark.ips do |x|
51
+ path = '/some/very/very/long/path/to/a/file/i/like/'
52
+ x.report("pre_pr:#{path}") { pre_pr(path) }
53
+ x.report("pr:#{path}") { pr(path) }
54
+ x.report("envygeeks:#{path}") { pr(path) }
55
+ x.compare!
56
+ end
@@ -0,0 +1,49 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'benchmark/ips'
5
+ require_relative '../lib/jekyll'
6
+
7
+ puts ''
8
+ print 'Setting up... '
9
+
10
+ SITE = Jekyll::Site.new(
11
+ Jekyll.configuration({
12
+ 'source' => File.expand_path('../docs', __dir__),
13
+ 'destination' => File.expand_path('../docs/_site', __dir__),
14
+ 'disable_disk_cache' => true,
15
+ 'quiet' => true
16
+ })
17
+ )
18
+
19
+ TEMPLATE_1 = Liquid::Template.parse(<<~HTML)
20
+ {%- assign doc = site.documents | where: 'url', '/docs/assets/' | first -%}
21
+ {{- doc.title -}}
22
+ HTML
23
+
24
+ TEMPLATE_2 = Liquid::Template.parse(<<~HTML)
25
+ {%- assign doc = site.documents | find: 'url', '/docs/assets/' -%}
26
+ {{- doc.title -}}
27
+ HTML
28
+
29
+ %i[reset read generate].each { |phase| SITE.send(phase) }
30
+
31
+ puts 'done.'
32
+ puts 'Testing... '
33
+ puts " #{'where + first'.cyan} results in #{TEMPLATE_1.render(SITE.site_payload).inspect.green}"
34
+ puts " #{'find'.cyan} results in #{TEMPLATE_2.render(SITE.site_payload).inspect.green}"
35
+
36
+ if TEMPLATE_1.render(SITE.site_payload) == TEMPLATE_2.render(SITE.site_payload)
37
+ puts 'Success! Proceeding to run benchmarks.'.green
38
+ puts ''
39
+ else
40
+ puts 'Something went wrong. Aborting.'.magenta
41
+ puts ''
42
+ return
43
+ end
44
+
45
+ Benchmark.ips do |x|
46
+ x.report('where + first') { TEMPLATE_1.render(SITE.site_payload) }
47
+ x.report('find') { TEMPLATE_2.render(SITE.site_payload) }
48
+ x.compare!
49
+ end
@@ -0,0 +1,19 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'benchmark/ips'
5
+
6
+ enum = (0..50).to_a
7
+ nested = enum.map { |i| [i] }
8
+
9
+ def do_thing(blah)
10
+ blah * 1
11
+ end
12
+
13
+ Benchmark.ips do |x|
14
+ x.report('.map.flatten with nested arrays') { nested.map { |i| do_thing(i) }.flatten(1) }
15
+ x.report('.flat_map with nested arrays') { nested.flat_map { |i| do_thing(i) } }
16
+
17
+ x.report('.map.flatten with no nested arrays') { enum.map { |i| do_thing(i) }.flatten(1) }
18
+ x.report('.flat_map with no nested arrays') { enum.flat_map { |i| do_thing(i) } }
19
+ end
@@ -0,0 +1,12 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'benchmark/ips'
5
+
6
+ h = { bar: 'uco' }
7
+
8
+ Benchmark.ips do |x|
9
+ x.report('fetch with no block') { h.fetch(:bar, (0..9).to_a) }
10
+ x.report('fetch with a block') { h.fetch(:bar) { (0..9).to_a } }
11
+ x.report('brackets with an ||') { h[:bar] || (0..9).to_a }
12
+ end
@@ -0,0 +1,47 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative '../lib/jekyll'
5
+ require 'benchmark/ips'
6
+
7
+ base_directory = Dir.pwd
8
+
9
+ Benchmark.ips do |x|
10
+ #
11
+ # Does not include the base_directory
12
+ #
13
+ x.report('with no questionable path') do
14
+ Jekyll.sanitized_path(base_directory, '')
15
+ end
16
+ x.report('with a single-part questionable path') do
17
+ Jekyll.sanitized_path(base_directory, 'thingy')
18
+ end
19
+ x.report('with a multi-part questionable path') do
20
+ Jekyll.sanitized_path(base_directory, 'thingy/in/my/soup')
21
+ end
22
+ x.report('with a single-part traversal path') do
23
+ Jekyll.sanitized_path(base_directory, '../thingy')
24
+ end
25
+ x.report('with a multi-part traversal path') do
26
+ Jekyll.sanitized_path(base_directory, '../thingy/in/my/../../soup')
27
+ end
28
+
29
+ #
30
+ # Including the base_directory
31
+ #
32
+ x.report('with the exact same paths') do
33
+ Jekyll.sanitized_path(base_directory, base_directory)
34
+ end
35
+ x.report('with a single-part absolute path including the base_directory') do
36
+ Jekyll.sanitized_path(base_directory, File.join(base_directory, 'thingy'))
37
+ end
38
+ x.report('with a multi-part absolute path including the base_directory') do
39
+ Jekyll.sanitized_path(base_directory, File.join(base_directory, 'thingy/in/my/soup'))
40
+ end
41
+ x.report('with a single-part traversal path including the base_directory') do
42
+ Jekyll.sanitized_path(base_directory, File.join(base_directory, 'thingy/..'))
43
+ end
44
+ x.report('with a multi-part traversal path including the base_directory') do
45
+ Jekyll.sanitized_path(base_directory, File.join('thingy/in/my/../../soup'))
46
+ end
47
+ end
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'benchmark/ips'
5
+ require 'jekyll'
6
+ require 'json'
7
+
8
+ DATA = { 'foo' => 'bar', 'alpha' => { 'beta' => 'gamma' }, 'lipsum' => %w[lorem ipsum dolor] }.freeze
9
+
10
+ def local_require
11
+ require 'json'
12
+ JSON.pretty_generate(DATA)
13
+ end
14
+
15
+ def global_require
16
+ JSON.pretty_generate(DATA)
17
+ end
18
+
19
+ def graceful_require
20
+ Jekyll::External.require_with_graceful_fail('json')
21
+ JSON.pretty_generate(DATA)
22
+ end
23
+
24
+ Benchmark.ips do |x|
25
+ x.report('local-require') { local_require }
26
+ x.report('global-require') { global_require }
27
+ x.report('graceful-require') { graceful_require }
28
+ x.compare!
29
+ end
@@ -0,0 +1,33 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # -------------------------------------------------------------------
5
+ # Benchmarking changes in https://github.com/jekyll/jekyll/pull/6767
6
+ # -------------------------------------------------------------------
7
+
8
+ require 'benchmark/ips'
9
+ require 'pathutil'
10
+
11
+ DOC_PATH = File.join(File.expand_path(__dir__), '_puppies', 'rover.md')
12
+ COL_PATH = File.join(File.expand_path(__dir__), '_puppies')
13
+
14
+ def pathutil_relative
15
+ Pathutil.new(DOC_PATH).relative_path_from(COL_PATH).to_s
16
+ end
17
+
18
+ def native_relative
19
+ DOC_PATH.sub("#{COL_PATH}/", '')
20
+ end
21
+
22
+ if pathutil_relative == native_relative
23
+ Benchmark.ips do |x|
24
+ x.report('pathutil') { pathutil_relative }
25
+ x.report('native') { native_relative }
26
+ x.compare!
27
+ end
28
+ else
29
+ print 'PATHUTIL: '
30
+ puts pathutil_relative
31
+ print 'NATIVE: '
32
+ puts native_relative
33
+ end
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require_relative '../lib/jekyll'
5
+ require 'benchmark/ips'
6
+
7
+ date = '2014-08-02 14:43:06 PDT'
8
+ time = Time.parse(date)
9
+
10
+ Benchmark.ips do |x|
11
+ x.report('Time.parse') do
12
+ Time.parse(date)
13
+ end
14
+
15
+ x.report('localtime') do
16
+ Time.parse(date).localtime
17
+ end
18
+
19
+ x.report('localtime parsed') do
20
+ time.localtime
21
+ end
22
+
23
+ x.report('Utils.parse_date') do
24
+ Jekyll::Utils.parse_date(date)
25
+ end
26
+ end
@@ -0,0 +1,85 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ # For pull request: https://github.com/jekyll/jekyll/pull/8192
5
+
6
+ require 'benchmark/ips'
7
+ require 'bundler/setup'
8
+ require 'memory_profiler'
9
+ require 'jekyll'
10
+
11
+ CONTEXT = { 'bar' => 'The quick brown fox' }.freeze
12
+ MARKUP_1 = %(foo=bar lorem="ipsum \\"dolor\\"" alpha='beta \\'gamma\\'')
13
+ MARKUP_2 = %(foo=bar lorem="ipsum 'dolor'" alpha='beta "gamma"')
14
+
15
+ def old_parse_params(markup)
16
+ params = {}
17
+
18
+ while (match = Jekyll::Tags::IncludeTag::VALID_SYNTAX.match(markup))
19
+ markup = markup[match.end(0)..]
20
+
21
+ value = if match[2]
22
+ match[2].gsub('\\"', '"')
23
+ elsif match[3]
24
+ match[3].gsub("\\'", "'")
25
+ elsif match[4]
26
+ CONTEXT[match[4]]
27
+ end
28
+
29
+ params[match[1]] = value
30
+ end
31
+ params
32
+ end
33
+
34
+ def new_parse_params(markup)
35
+ params = {}
36
+ markup.scan(Jekyll::Tags::IncludeTag::VALID_SYNTAX) do |key, d_quoted, s_quoted, variable|
37
+ value = if d_quoted
38
+ d_quoted.include?('\\"') ? d_quoted.gsub('\\"', '"') : d_quoted
39
+ elsif s_quoted
40
+ s_quoted.include?("\\'") ? s_quoted.gsub("\\'", "'") : s_quoted
41
+ elsif variable
42
+ CONTEXT[variable]
43
+ end
44
+
45
+ params[key] = value
46
+ end
47
+ params
48
+ end
49
+
50
+ def report(label, markup, color, &block)
51
+ prof_report = MemoryProfiler.report(&block)
52
+
53
+ allocated_memory = prof_report.scale_bytes(prof_report.total_allocated_memsize)
54
+ allocated_objects = prof_report.total_allocated
55
+ retained_memory = prof_report.scale_bytes(prof_report.total_retained_memsize)
56
+ retained_objects = prof_report.total_retained
57
+
58
+ puts <<~MSG.send(color)
59
+ #{"#{label} ".ljust(49, '-')}
60
+
61
+ MARKUP: #{markup}
62
+ RESULT: #{yield}
63
+
64
+ Total allocated: #{allocated_memory} (#{allocated_objects} objects)
65
+ Total retained: #{retained_memory} (#{retained_objects} objects)
66
+ MSG
67
+ end
68
+
69
+ report('old w/ escaping', MARKUP_1, :magenta) { old_parse_params(MARKUP_1) }
70
+ report('new w/ escaping', MARKUP_1, :cyan) { new_parse_params(MARKUP_1) }
71
+
72
+ report('old no escaping', MARKUP_2, :green) { old_parse_params(MARKUP_2) }
73
+ report('new no escaping', MARKUP_2, :yellow) { new_parse_params(MARKUP_2) }
74
+
75
+ Benchmark.ips do |x|
76
+ x.report('old + esc'.magenta) { old_parse_params(MARKUP_1) }
77
+ x.report('new + esc'.cyan) { new_parse_params(MARKUP_1) }
78
+ x.compare!
79
+ end
80
+
81
+ Benchmark.ips do |x|
82
+ x.report('old - esc'.green) { old_parse_params(MARKUP_2) }
83
+ x.report('new - esc'.yellow) { new_parse_params(MARKUP_2) }
84
+ x.compare!
85
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'benchmark/ips'
4
+ require 'jekyll'
5
+
6
+ class FooPage
7
+ def initialize(dir:, name:)
8
+ @dir = dir
9
+ @name = name
10
+ end
11
+
12
+ def slow_path
13
+ File.join(*[@dir, @name].map(&:to_s).reject(&:empty?)).sub(%r{\A/}, '')
14
+ end
15
+
16
+ def fast_path
17
+ Jekyll::PathManager.join(@dir, @name).sub(%r{\A/}, '')
18
+ end
19
+ end
20
+
21
+ nil_page = FooPage.new(dir: nil, name: nil)
22
+ empty_page = FooPage.new(dir: '', name: '')
23
+ root_page = FooPage.new(dir: '', name: 'ipsum.md')
24
+ nested_page = FooPage.new(dir: 'lorem', name: 'ipsum.md')
25
+ slashed_page = FooPage.new(dir: '/lorem/', name: '/ipsum.md')
26
+
27
+ if nil_page.slow_path == nil_page.fast_path
28
+ Benchmark.ips do |x|
29
+ x.report('nil_page slow') { nil_page.slow_path }
30
+ x.report('nil_page fast') { nil_page.fast_path }
31
+ x.compare!
32
+ end
33
+ end
34
+
35
+ if empty_page.slow_path == empty_page.fast_path
36
+ Benchmark.ips do |x|
37
+ x.report('empty_page slow') { empty_page.slow_path }
38
+ x.report('empty_page fast') { empty_page.fast_path }
39
+ x.compare!
40
+ end
41
+ end
42
+
43
+ if root_page.slow_path == root_page.fast_path
44
+ Benchmark.ips do |x|
45
+ x.report('root_page slow') { root_page.slow_path }
46
+ x.report('root_page fast') { root_page.fast_path }
47
+ x.compare!
48
+ end
49
+ end
50
+
51
+ if nested_page.slow_path == nested_page.fast_path
52
+ Benchmark.ips do |x|
53
+ x.report('nested_page slow') { nested_page.slow_path }
54
+ x.report('nested_page fast') { nested_page.fast_path }
55
+ x.compare!
56
+ end
57
+ end
58
+
59
+ if slashed_page.slow_path == slashed_page.fast_path
60
+ Benchmark.ips do |x|
61
+ x.report('slashed_page slow') { slashed_page.slow_path }
62
+ x.report('slashed_page fast') { slashed_page.fast_path }
63
+ x.compare!
64
+ end
65
+ end
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'benchmark/ips'
5
+
6
+ def fast
7
+ yield
8
+ end
9
+
10
+ def slow(&block)
11
+ block.call
12
+ end
13
+
14
+ Benchmark.ips do |x|
15
+ x.report('yield') { fast { (0..9).to_a } }
16
+ x.report('block.call') { slow { (0..9).to_a } }
17
+ end
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'benchmark/ips'
5
+
6
+ # For this pull request, which changes Page#dir
7
+ # https://github.com/jekyll/jekyll/pull/4403
8
+
9
+ CONTENT_CONTAINING = <<~HTML
10
+ <!DOCTYPE HTML>
11
+ <html lang="en-US">
12
+ <head>
13
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
14
+ <meta charset="UTF-8">
15
+ <title>Jemoji</title>
16
+ <meta name="viewport" content="width=device-width,initial-scale=1">
17
+ <link rel="stylesheet" href="/css/screen.css">
18
+ </head>
19
+ <body class="wrap">
20
+ <p><img class="emoji" title=":+1:" alt=":+1:" src="https://assets.github.com/images/icons/emoji/unicode/1f44d.png" height="20" width="20" align="absmiddle"></p>
21
+
22
+ </body>
23
+ </html>
24
+ HTML
25
+ CONTENT_NOT_CONTAINING = <<~HTML
26
+ <!DOCTYPE HTML>
27
+ <html lang="en-US">
28
+ <head>
29
+ <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
30
+ <meta charset="UTF-8">
31
+ <title>Jemoji</title>
32
+ <meta name="viewport" content="width=device-width,initial-scale=1">
33
+ <link rel="stylesheet" href="/css/screen.css">
34
+ </head>
35
+ <body class="wrap">
36
+ <p><img class="emoji" title=":+1:" alt=":+1:" src="https://assets.github.com/images/icons/emoji/unicode/1f44d.png" height="20" width="20" align="absmiddle"></p>
37
+
38
+ </body>
39
+ </html>
40
+ HTML
41
+
42
+ Benchmark.ips do |x|
43
+ x.report('no body include?') { CONTENT_NOT_CONTAINING.include?('<body') }
44
+ x.report('no body regexp') { CONTENT_NOT_CONTAINING =~ /<\s*body/ }
45
+ x.compare!
46
+ end
47
+
48
+ # No trailing slash
49
+ Benchmark.ips do |x|
50
+ x.report('with body include?') { CONTENT_CONTAINING.include?('<body') }
51
+ x.report('with body regexp') { CONTENT_CONTAINING =~ /<\s*body/ }
52
+ x.compare!
53
+ end
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require 'benchmark/ips'
5
+
6
+ PATH = '/../../..../...//.....//lorem/ipsum//dolor///sit.xyz'
7
+
8
+ def sanitize_with_regex
9
+ "/#{PATH.gsub(%r!/{2,}!, '/').gsub(%r{\.+/|\A/+}, '')}"
10
+ end
11
+
12
+ def sanitize_with_builtin
13
+ "/#{PATH}".gsub('..', '/').gsub('./', '').squeeze('/')
14
+ end
15
+
16
+ if sanitize_with_regex == sanitize_with_builtin
17
+ Benchmark.ips do |x|
18
+ x.report('sanitize w/ regexes') { sanitize_with_regex }
19
+ x.report('sanitize w/ builtin') { sanitize_with_builtin }
20
+ x.compare!
21
+ end
22
+ else
23
+ puts "w/ regexes: #{sanitize_with_regex}"
24
+ puts "w/ builtin: #{sanitize_with_builtin}"
25
+ puts ''
26
+ puts 'Thank you. Do try again :('
27
+ end