lbenicio-minimal-v1 1.0.2 → 1.0.5

Sign up to get free protection for your applications and to get access to all the features.
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 +68 -4
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