jekyll-minibundle 2.2.0 → 3.0.0

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 (56) hide show
  1. checksums.yaml +5 -5
  2. data/CHANGELOG.md +162 -63
  3. data/README.md +62 -57
  4. data/Rakefile +27 -14
  5. data/jekyll-minibundle.gemspec +15 -13
  6. data/lib/jekyll/minibundle.rb +2 -0
  7. data/lib/jekyll/minibundle/asset_bundle.rb +16 -10
  8. data/lib/jekyll/minibundle/asset_file_drop.rb +5 -2
  9. data/lib/jekyll/minibundle/asset_file_properties.rb +2 -0
  10. data/lib/jekyll/minibundle/asset_file_registry.rb +9 -7
  11. data/lib/jekyll/minibundle/asset_stamp.rb +2 -0
  12. data/lib/jekyll/minibundle/asset_tag_markup.rb +6 -4
  13. data/lib/jekyll/minibundle/bundle_file.rb +8 -0
  14. data/lib/jekyll/minibundle/development_file.rb +4 -0
  15. data/lib/jekyll/minibundle/development_file_collection.rb +2 -0
  16. data/lib/jekyll/minibundle/environment.rb +5 -1
  17. data/lib/jekyll/minibundle/exceptions.rb +2 -0
  18. data/lib/jekyll/minibundle/files.rb +2 -0
  19. data/lib/jekyll/minibundle/hashes.rb +3 -0
  20. data/lib/jekyll/minibundle/log.rb +3 -1
  21. data/lib/jekyll/minibundle/mini_bundle_block.rb +8 -1
  22. data/lib/jekyll/minibundle/mini_stamp_tag.rb +3 -1
  23. data/lib/jekyll/minibundle/stamp_file.rb +4 -0
  24. data/lib/jekyll/minibundle/variable_template.rb +15 -12
  25. data/lib/jekyll/minibundle/variable_template_registry.rb +2 -0
  26. data/lib/jekyll/minibundle/version.rb +3 -1
  27. data/test/fixture/site/_bin/remove_comments +1 -0
  28. data/test/fixture/site/_bin/with_count +1 -0
  29. data/test/fixture/site/_config.yml +2 -1
  30. data/test/integration/minibundle_development_mode_test.rb +115 -29
  31. data/test/integration/minibundle_production_mode_test.rb +157 -69
  32. data/test/integration/ministamp_development_mode_test.rb +4 -2
  33. data/test/integration/ministamp_production_mode_test.rb +6 -4
  34. data/test/integration/static_files_as_asset_sources_test.rb +6 -4
  35. data/test/support/assertions.rb +2 -0
  36. data/test/support/fixture_config.rb +14 -12
  37. data/test/support/static_file_config.rb +18 -16
  38. data/test/support/test_case.rb +5 -3
  39. data/test/unit/asset_bundle_test.rb +14 -12
  40. data/test/unit/asset_file_drop_test.rb +4 -3
  41. data/test/unit/asset_file_registry_test.rb +16 -19
  42. data/test/unit/asset_tag_markup_test.rb +8 -6
  43. data/test/unit/bundle_file_properties_test.rb +6 -4
  44. data/test/unit/bundle_file_writing_test.rb +6 -4
  45. data/test/unit/development_file_properties_test.rb +5 -3
  46. data/test/unit/development_file_writing_test.rb +4 -2
  47. data/test/unit/environment_test.rb +6 -4
  48. data/test/unit/files_test.rb +3 -1
  49. data/test/unit/hashes_test.rb +3 -1
  50. data/test/unit/jekyll_static_file_api_test.rb +13 -9
  51. data/test/unit/mini_bundle_block_test.rb +42 -35
  52. data/test/unit/mini_stamp_tag_test.rb +4 -2
  53. data/test/unit/stamp_file_properties_test.rb +5 -3
  54. data/test/unit/stamp_file_writing_test.rb +4 -2
  55. data/test/unit/variable_template_test.rb +8 -8
  56. metadata +13 -14
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'fileutils'
2
4
  require 'rake/clean'
3
5
  require 'shellwords'
@@ -20,7 +22,11 @@ def run_jekyll_in_fixture_site(command)
20
22
  sh env, jekyll_cmd
21
23
  end
22
24
 
23
- desc 'Run benchmarks; BM=<benchmark_suite_path>'
25
+ desc <<~TEXT
26
+ Run benchmarks. Supported options from environment variables:
27
+
28
+ BM=<benchmark_suite_path>
29
+ TEXT
24
30
  task :benchmark do
25
31
  run_single_bm = ENV.key?('BM')
26
32
 
@@ -57,33 +63,40 @@ namespace :gem do
57
63
  end
58
64
  end
59
65
 
60
- desc 'Run tests; TEST=<test_suite_path>, NAME=<test_name_pattern>, DEBUG=1 to require Pry, PP, enable warnings'
61
- task :test do
62
- run_single_test = ENV.key?('TEST')
66
+ desc <<~TEXT
67
+ Run tests. Supported options from environment variables:
63
68
 
69
+ TEST=<test_suite_path>
70
+ NAME=<test_name_pattern>
71
+ DEBUG=1 Require Pry, PP, enable warnings
72
+ SEED=n Set the random seed
73
+ TEST_OPTS='-v' Enable other minitest options
74
+ TEXT
75
+ task :test do
64
76
  run_selected_or_all =
65
- if run_single_test
66
- rb_file = ENV['TEST']
67
- name_opt = ENV.key?('NAME') ? " -n #{ENV['NAME']}" : ''
68
- "#{rb_file}#{name_opt}"
77
+ if ENV.key?('TEST')
78
+ test_file = ENV['TEST']
79
+ minitest_opts = "#{ENV.key?('NAME') ? "-n #{ENV['NAME']} " : ''}#{ENV.fetch('TEST_OPTS', '')}"
80
+ "#{test_file} #{minitest_opts}"
69
81
  else
82
+ eval = "-e 'ARGV.each { |f| require \"#{Dir.pwd}/test/\#{f}\" }'"
70
83
  requirable_files =
71
84
  Dir['test/{unit,integration}/*_test.rb']
72
85
  .map { |file| %r{^test/(.+)\.rb$}.match(file)[1] }
73
86
  .shelljoin
74
- eval = "-e 'ARGV.each { |f| require f }'"
75
87
  "#{eval} #{requirable_files}"
76
88
  end
77
89
 
78
- extra_opts = ENV['DEBUG'] ? '-w -rpp -rpry ' : ''
90
+ ruby_opts = "-I lib#{ENV['DEBUG'] ? ' -w -rpp -rpry' : ''}"
79
91
 
80
- sh "ruby -I lib:test #{extra_opts}#{run_selected_or_all}"
92
+ puts "Jekyll version: #{Gem::Specification.find_by_name('jekyll').version}"
93
+ sh "ruby #{ruby_opts} #{run_selected_or_all}"
81
94
  end
82
95
 
83
96
  namespace :fixture do
84
- CLEAN.include 'test/fixture/site/_site'
97
+ CLOBBER.include 'test/fixture/site/_site', 'test/fixture/site/.jekyll-cache'
85
98
 
86
- desc 'Generate fixture site'
99
+ desc 'Generate fixture site (tests use it, this task allows manual inspection)'
87
100
  task :build do
88
101
  run_jekyll_in_fixture_site('build')
89
102
  end
@@ -96,4 +109,4 @@ end
96
109
 
97
110
  RuboCop::RakeTask.new
98
111
 
99
- task default: [:test, :rubocop]
112
+ task default: %i[rubocop test]
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require_relative 'lib/jekyll/minibundle/version'
2
4
 
3
5
  Gem::Specification.new do |s|
@@ -9,33 +11,33 @@ Gem::Specification.new do |s|
9
11
  s.homepage = 'https://github.com/tkareine/jekyll-minibundle'
10
12
  s.license = 'MIT'
11
13
 
12
- s.description = <<-END
13
- A straightforward asset bundling plugin for Jekyll, utilizing external
14
- minification tool of your choice. It provides asset concatenation for
15
- bundling and asset fingerprinting with MD5 digest for cache busting.
16
- There are no other runtime dependencies besides the minification tool
17
- (not even other gems).
18
- END
14
+ s.description = <<~TEXT
15
+ A straightforward asset bundling plugin for Jekyll, utilizing external
16
+ minification tool of your choice. It provides asset concatenation for
17
+ bundling and asset fingerprinting with MD5 digest for cache busting.
18
+ There are no other runtime dependencies besides the minification tool
19
+ (not even other gems).
20
+ TEXT
19
21
 
20
- s.files = %w{
22
+ s.files = %w[
21
23
  CHANGELOG.md
22
24
  LICENSE.txt
23
25
  README.md
24
26
  Rakefile
25
27
  jekyll-minibundle.gemspec
26
- } + `git ls-files -- lib`.split("\n")
28
+ ] + `git ls-files -- lib`.split("\n")
27
29
 
28
30
  s.test_files = `git ls-files -- test`.split("\n")
29
31
 
30
32
  s.add_development_dependency 'benchmark-ips', '~> 2.7'
31
- s.add_development_dependency 'jekyll', '~> 3.0'
33
+ s.add_development_dependency 'jekyll', '>= 3.0'
32
34
  s.add_development_dependency 'minitest', '~> 5.8'
33
35
  s.add_development_dependency 'nokogiri', '~> 1.6'
34
36
  s.add_development_dependency 'pry', '~> 0.10'
35
- s.add_development_dependency 'rake', '~> 12.0'
36
- s.add_development_dependency 'rubocop', '~> 0.47.0'
37
+ s.add_development_dependency 'rake', '~> 13.0'
38
+ s.add_development_dependency 'rubocop', '~> 0.90.0'
37
39
 
38
- s.required_ruby_version = '>= 2.0.0'
40
+ s.required_ruby_version = '>= 2.4.0'
39
41
 
40
42
  s.rdoc_options << '--line-numbers' << '--title' << s.name << '--exclude' << 'test'
41
43
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  if defined?(Jekyll::VERSION) &&
2
4
  defined?(Gem::Version) &&
3
5
  (Gem::Version.create(Jekyll::VERSION) < Gem::Version.create('3.0.0'))
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'tempfile'
2
4
  require 'jekyll/minibundle/exceptions'
3
5
  require 'jekyll/minibundle/files'
@@ -5,7 +7,7 @@ require 'jekyll/minibundle/log'
5
7
 
6
8
  module Jekyll::Minibundle
7
9
  class AssetBundle
8
- TEMPFILE_PREFIX = 'jekyll-minibundle-'.freeze
10
+ TEMPFILE_PREFIX = 'jekyll-minibundle-'
9
11
 
10
12
  def initialize(config)
11
13
  @type = config.fetch(:type)
@@ -15,12 +17,12 @@ module Jekyll::Minibundle
15
17
  @minifier_cmd = config.fetch(:minifier_cmd)
16
18
 
17
19
  unless @minifier_cmd
18
- raise <<-END
19
- Missing minification command for bundling #{bundle_destination_path.inspect}. Specify it in
20
- 1) minibundle.minifier_commands.#{@type} setting in _config.yml,
21
- 2) $JEKYLL_MINIBUNDLE_CMD_#{@type.to_s.upcase} environment variable, or
22
- 3) minifier_cmd setting inside minibundle block.
23
- END
20
+ raise <<~MESSAGE
21
+ Missing minification command for bundling #{bundle_destination_path.inspect}. Specify it in
22
+ 1) minibundle.minifier_commands.#{@type} setting in _config.yml,
23
+ 2) $JEKYLL_MINIBUNDLE_CMD_#{@type.to_s.upcase} environment variable, or
24
+ 3) minifier_cmd setting inside minibundle block.
25
+ MESSAGE
24
26
  end
25
27
 
26
28
  @tempfile = Tempfile.new([TEMPFILE_PREFIX, ".#{@type}"])
@@ -33,25 +35,29 @@ Missing minification command for bundling #{bundle_destination_path.inspect}. Sp
33
35
 
34
36
  def path
35
37
  raise IllegalStateError, 'Cannot get path of closed AssetBundle' unless @tempfile
38
+
36
39
  @tempfile.path
37
40
  end
38
41
 
39
42
  def make_bundle
40
43
  raise IllegalStateError, 'Cannot make bundle with closed AssetBundle' unless @tempfile
44
+
41
45
  exit_status = spawn_minifier(@minifier_cmd) do |input|
42
46
  $stdout.puts # place newline after "(Re)generating..." log messages
43
47
  Log.info("Bundling #{bundle_destination_path}:")
44
48
  @asset_paths.each do |asset|
45
- Log.info(' ' + relative_path_from(asset, @site_dir))
49
+ Log.info(" #{relative_path_from(asset, @site_dir)}")
46
50
  IO.foreach(asset) { |line| input.write(line) }
47
51
  input.puts(';') if @type == :js
48
52
  end
49
53
  end
54
+
50
55
  if exit_status != 0
51
56
  msg = "Bundling #{bundle_destination_path.inspect} failed with exit status #{exit_status}, command: #{@minifier_cmd.inspect}"
52
57
  log_minifier_error(msg)
53
58
  raise msg
54
59
  end
60
+
55
61
  self
56
62
  end
57
63
 
@@ -72,7 +78,7 @@ Missing minification command for bundling #{bundle_destination_path.inspect}. Sp
72
78
  wr.close
73
79
  _, status = Process.waitpid2(pid)
74
80
  status.exitstatus
75
- rescue => e
81
+ rescue StandardError => e
76
82
  raise "Bundling #{bundle_destination_path.inspect} failed: #{e}"
77
83
  ensure
78
84
  [rd, wr].each { |io| io.close unless io.closed? }
@@ -86,7 +92,7 @@ Missing minification command for bundling #{bundle_destination_path.inspect}. Sp
86
92
  Log.error("#{message}, last #{last_bytes.size} bytes of minifier output:")
87
93
 
88
94
  last_bytes
89
- .gsub(/[^[:print:]\t\n]/) { |ch| '\x' + ch.unpack('H2').first }
95
+ .gsub(/[^[:print:]\t\n]/) { |ch| "\\x#{ch.unpack1('H2')}" }
90
96
  .split("\n")
91
97
  .each { |line| Log.error(line) }
92
98
  end
@@ -1,19 +1,22 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'forwardable'
2
4
 
3
5
  module Jekyll::Minibundle
4
6
  class AssetFileDrop < ::Liquid::Drop
5
7
  extend Forwardable
6
8
 
7
- KEYS = %w{
9
+ KEYS = %w[
8
10
  name
9
11
  extname
10
12
  basename
11
13
  modified_time
12
14
  path
13
15
  collection
14
- }.freeze
16
+ ].freeze
15
17
 
16
18
  def initialize(file)
19
+ super()
17
20
  @file = file
18
21
  end
19
22
 
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'jekyll/minibundle/asset_file_drop'
2
4
 
3
5
  module Jekyll::Minibundle
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'jekyll/minibundle/bundle_file'
2
4
  require 'jekyll/minibundle/development_file'
3
5
  require 'jekyll/minibundle/development_file_collection'
@@ -13,7 +15,7 @@ module Jekyll::Minibundle
13
15
 
14
16
  def clear_unused
15
17
  @_files
16
- .select { |_, cached| !cached.fetch(:is_used) }
18
+ .reject { |_, cached| cached.fetch(:is_used) }
17
19
  .each do |asset_destination_path, cached|
18
20
  cached.fetch(:file).cleanup
19
21
  @_files.delete(asset_destination_path)
@@ -66,9 +68,9 @@ module Jekyll::Minibundle
66
68
  end
67
69
 
68
70
  if cached_is_used
69
- raise <<-END
70
- Two or more minibundle blocks with the same destination path #{asset_destination_path.inspect}, but having different asset configuration: #{bundle_config.inspect} vs. #{cached_config.inspect}
71
- END
71
+ raise <<~MESSAGE
72
+ Two or more minibundle blocks with the same destination path #{asset_destination_path.inspect}, but having different asset configuration: #{bundle_config.inspect} vs. #{cached_config.inspect}
73
+ MESSAGE
72
74
  end
73
75
 
74
76
  cached_file.cleanup
@@ -107,9 +109,9 @@ Two or more minibundle blocks with the same destination path #{asset_destination
107
109
  end
108
110
 
109
111
  if cached_is_used
110
- raise <<-END
111
- Two or more ministamp tags with the same destination path #{asset_destination_path.inspect}, but different asset source paths: #{asset_source_path.inspect} vs. #{cached_config.inspect}
112
- END
112
+ raise <<~MESSAGE
113
+ Two or more ministamp tags with the same destination path #{asset_destination_path.inspect}, but different asset source paths: #{asset_source_path.inspect} vs. #{cached_config.inspect}
114
+ MESSAGE
113
115
  end
114
116
 
115
117
  cached_file.cleanup
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'digest/md5'
2
4
 
3
5
  module Jekyll::Minibundle
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'cgi/util'
2
4
 
3
5
  module Jekyll::Minibundle
@@ -8,9 +10,9 @@ module Jekyll::Minibundle
8
10
 
9
11
  case type
10
12
  when :js
11
- %{<script type="text/javascript" src="#{url_str}"#{attributes_str}></script>}
13
+ %(<script type="text/javascript" src="#{url_str}"#{attributes_str}></script>)
12
14
  when :css
13
- %{<link rel="stylesheet" href="#{url_str}"#{attributes_str}>}
15
+ %(<link rel="stylesheet" href="#{url_str}"#{attributes_str}>)
14
16
  else
15
17
  raise ArgumentError, "Unknown type for generating bundle markup: #{type}, #{url}"
16
18
  end
@@ -22,9 +24,9 @@ module Jekyll::Minibundle
22
24
 
23
25
  def self.make_attribute(name, value)
24
26
  if value.nil?
25
- %{ #{name}}
27
+ %( #{name})
26
28
  else
27
- %{ #{name}="#{CGI.escape_html(value.to_s)}"}
29
+ %( #{name}="#{CGI.escape_html(value.to_s)}")
28
30
  end
29
31
  end
30
32
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'jekyll/minibundle/files'
2
4
  require 'jekyll/minibundle/asset_bundle'
3
5
  require 'jekyll/minibundle/asset_file_properties'
@@ -14,12 +16,17 @@ module Jekyll::Minibundle
14
16
  @site = site
15
17
  @type = config.fetch('type')
16
18
  asset_source_dir = File.join(@site.source, config.fetch('source_dir'))
19
+
17
20
  raise ArgumentError, "Bundle source directory does not exist: #{asset_source_dir}" unless File.directory?(asset_source_dir)
21
+
18
22
  @asset_paths = config.fetch('assets').map do |asset_path|
19
23
  path = File.join(asset_source_dir, "#{asset_path}.#{@type}")
24
+
20
25
  raise ArgumentError, "Bundle asset source file does not exist: #{path}" unless File.file?(path)
26
+
21
27
  path
22
28
  end
29
+
23
30
  @destination_path = config.fetch('destination_path')
24
31
  @asset_destination_dir = File.dirname(@destination_path)
25
32
  @asset_destination_filename_prefix = File.basename(@destination_path)
@@ -31,6 +38,7 @@ module Jekyll::Minibundle
31
38
 
32
39
  def cleanup
33
40
  return unless @_asset_bundle
41
+
34
42
  @_asset_bundle.close
35
43
  @_asset_bundle = nil
36
44
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'jekyll/minibundle/files'
2
4
  require 'jekyll/minibundle/asset_file_properties'
3
5
 
@@ -13,7 +15,9 @@ module Jekyll::Minibundle
13
15
  def initialize(site, asset_source_path, asset_destination_path)
14
16
  @site = site
15
17
  @asset_source_path = File.join(@site.source, asset_source_path)
18
+
16
19
  raise ArgumentError, "Development source file does not exist: #{@asset_source_path}" unless File.file?(@asset_source_path)
20
+
17
21
  @asset_destination_dir = File.dirname(asset_destination_path)
18
22
  @asset_destination_filename = File.basename(asset_destination_path)
19
23
  @stamped_at = nil
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'jekyll/minibundle/development_file'
2
4
 
3
5
  module Jekyll::Minibundle
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'jekyll/minibundle/hashes'
2
4
 
3
5
  module Jekyll::Minibundle
@@ -8,15 +10,17 @@ module Jekyll::Minibundle
8
10
  end
9
11
 
10
12
  def self.development?(site)
11
- mode = ENV['JEKYLL_MINIBUNDLE_MODE'] || Environment.find_site_config(site, %w{minibundle mode}, String)
13
+ mode = ENV['JEKYLL_MINIBUNDLE_MODE'] || Environment.find_site_config(site, %w[minibundle mode], String)
12
14
  mode == 'development'
13
15
  end
14
16
 
15
17
  def self.find_site_config(site, keys, type)
16
18
  value = Hashes.dig(site.config, *keys)
19
+
17
20
  if value && !value.is_a?(type)
18
21
  raise "Invalid site configuration for key #{keys.join('.')}; expecting type #{type}"
19
22
  end
23
+
20
24
  value
21
25
  end
22
26
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Jekyll::Minibundle
2
4
  class IllegalStateError < RuntimeError; end
3
5
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'fileutils'
2
4
 
3
5
  module Jekyll::Minibundle
@@ -1,9 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Jekyll::Minibundle
2
4
  module Hashes
3
5
  def self.dig(obj, *keys)
4
6
  value = obj
5
7
  keys.each do |key|
6
8
  return nil unless value
9
+
7
10
  value = value[key]
8
11
  end
9
12
  value
@@ -1,6 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module Jekyll::Minibundle
2
4
  module Log
3
- TOPIC = 'Minibundle:'.freeze
5
+ TOPIC = 'Minibundle:'
4
6
 
5
7
  def self.error(msg)
6
8
  ::Jekyll.logger.error(TOPIC, msg)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'pathname'
2
4
  require 'jekyll/minibundle/hashes'
3
5
  require 'jekyll/minibundle/files'
@@ -9,7 +11,9 @@ module Jekyll::Minibundle
9
11
  class MiniBundleBlock < Liquid::Block
10
12
  def initialize(tag_name, type, _tokens)
11
13
  super
14
+
12
15
  @type = type.strip.downcase.to_sym
16
+
13
17
  raise ArgumentError, "Missing asset type for minibundle block; pass value such as 'css' or 'js' as the argument" if @type.empty?
14
18
  end
15
19
 
@@ -56,14 +60,17 @@ module Jekyll::Minibundle
56
60
 
57
61
  def parse_contents(contents)
58
62
  raise ArgumentError, 'Missing configuration for minibundle block; pass configuration in YAML syntax' if contents =~ /\A\s+\z/
63
+
59
64
  structure = parse_structure(contents)
65
+
60
66
  raise ArgumentError, "Unsupported minibundle block contents type (#{structure.class}), only Hash is supported: #{contents}" unless structure.is_a?(Hash)
67
+
61
68
  structure
62
69
  end
63
70
 
64
71
  def parse_structure(contents)
65
72
  ::SafeYAML.load(contents)
66
- rescue => e
73
+ rescue StandardError => e
67
74
  raise ArgumentError, "Failed parsing minibundle block contents syntax as YAML: #{contents.strip.inspect}. Cause: #{e}"
68
75
  end
69
76