jekyll-minibundle 1.4.2 → 1.4.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (33) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/README.md +35 -25
  4. data/Rakefile +6 -6
  5. data/jekyll-minibundle.gemspec +11 -11
  6. data/lib/jekyll/minibundle/asset_bundle.rb +19 -16
  7. data/lib/jekyll/minibundle/asset_file_operations.rb +3 -3
  8. data/lib/jekyll/minibundle/asset_file_paths.rb +2 -6
  9. data/lib/jekyll/minibundle/asset_file_registry.rb +28 -30
  10. data/lib/jekyll/minibundle/asset_stamp.rb +1 -1
  11. data/lib/jekyll/minibundle/asset_tag_markup.rb +16 -14
  12. data/lib/jekyll/minibundle/bundle_file.rb +10 -9
  13. data/lib/jekyll/minibundle/development_file.rb +6 -6
  14. data/lib/jekyll/minibundle/development_file_collection.rb +6 -6
  15. data/lib/jekyll/minibundle/environment.rb +10 -8
  16. data/lib/jekyll/minibundle/mini_bundle_block.rb +4 -4
  17. data/lib/jekyll/minibundle/mini_stamp_tag.rb +2 -2
  18. data/lib/jekyll/minibundle/stamp_file.rb +8 -7
  19. data/lib/jekyll/minibundle/version.rb +1 -1
  20. data/test/fixture/site/_bin/with_count +1 -1
  21. data/test/integration/minibundle_development_mode_test.rb +62 -40
  22. data/test/integration/minibundle_production_mode_test.rb +78 -70
  23. data/test/integration/ministamp_test.rb +23 -23
  24. data/test/integration/static_files_as_asset_sources_test.rb +11 -11
  25. data/test/support/fixture_config.rb +4 -4
  26. data/test/support/test_case.rb +18 -14
  27. data/test/unit/asset_bundle_test.rb +4 -4
  28. data/test/unit/asset_file_registry_test.rb +7 -7
  29. data/test/unit/asset_tag_markup_test.rb +1 -1
  30. data/test/unit/bundle_file_test.rb +43 -33
  31. data/test/unit/development_file_collection_test.rb +44 -0
  32. data/test/unit/stamp_file_test.rb +30 -18
  33. metadata +26 -24
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: cb4db2142f8fea9e137638a9f81fcf1673b0076c
4
- data.tar.gz: 391293041abe19a1f143b28c6592fe2932bbac2e
3
+ metadata.gz: 477c2a1ad9364dfb5457b7b2b7894d74a0d5dcf8
4
+ data.tar.gz: 3212bf6bb364f63ad2e565c2eff35fed43c984b1
5
5
  SHA512:
6
- metadata.gz: a23acbd135fc4100e284bb059a98c18dc981deb0dd83e0a7ee9aaba52bab6b8188f2fb2121ace3970086292db53053518e3633ff4b73d0f63406f7017dd07395
7
- data.tar.gz: 56506b2a3bafebeef270f7630a69ff8c7ba08ed87ee33f13d595487b05e5804843a429d7f1382600c718006b4e03683d8824671395aeb04f108c3ede05868c2e
6
+ metadata.gz: c563707b1fa6b8cb468b96b22e3bc5ac99ec11d6cf0ef7eb4d520af3a1909744ef6c18d9beb646939d5f72efb83d3b28912fe44a3e66e402ea144183e64a8d43
7
+ data.tar.gz: bdf079e3b4af862ba04f19c17b1ec832cbfc4994af873ffefea3c7f500327a9ec2769d85eefc275810dd133417faaa99e95a2840b70cc32bacfb046b6b8a6216
data/CHANGELOG.md CHANGED
@@ -1,3 +1,12 @@
1
+ # 1.4.3 / 2014-01-16
2
+
3
+ * Do not leak read pipe file descriptor upon minifier command failure
4
+ * Loosen version constraints for development gem dependencies
5
+ * Clarify documentation
6
+ * Fix some Ruby coding style issues
7
+ * Minor internal state handling improvements
8
+ * Clarify tests, increase test coverage
9
+
1
10
  # 1.4.2 / 2013-12-28
2
11
 
3
12
  * Ensure touching asset source triggers destination write. This was an
data/README.md CHANGED
@@ -3,8 +3,10 @@
3
3
  A straightforward asset bundling plugin for [Jekyll][Jekyll],
4
4
  utilizing external minification tool of your choice. It provides asset
5
5
  concatenation for bundling and asset fingerprinting with MD5 digest
6
- for cache busting. There are no other runtime dependencies besides the
7
- minification tool (not even other gems).
6
+ for cache busting.
7
+
8
+ There are no runtime dependencies, except for the minification tool
9
+ used for bundling (fingerprinting has no dependencies).
8
10
 
9
11
  Tested with Ruby MRI 1.9.3, 2.0, and 2.1. Ruby 1.8 is *not* supported.
10
12
 
@@ -46,7 +48,7 @@ The plugin is shipped as a
46
48
  $ gem install jekyll-minibundle
47
49
  ```
48
50
 
49
- Add file `_plugins/minibundle.rb` to your Jekyll site project with
51
+ Add `_plugins/minibundle.rb` file to your Jekyll site project with
50
52
  this line:
51
53
 
52
54
  ``` ruby
@@ -58,16 +60,11 @@ You must allow Jekyll to use custom plugins. In
58
60
 
59
61
  ## Asset fingerprinting
60
62
 
61
- Asset fingerprinting is intended to be used together with
62
- [Compass](http://compass-style.org/) and similar asset generation
63
- tools that have their own configuration for input sources.
64
-
65
- Configure Compass to take inputs from `_assets/styles/*.scss` and to
66
- put output to `_tmp/site.css`. Use `ministamp` tag to copy the
67
- processed style asset to the generated site:
63
+ If you just want to have a fingerprint in your asset's path, use
64
+ `ministamp` tag:
68
65
 
69
66
  ``` html
70
- <link href="{% ministamp _tmp/site.css assets/site.css %}" rel="stylesheet" media="screen, projection">
67
+ <link href="{% ministamp _assets/site.css assets/site.css %}" rel="stylesheet" media="screen, projection">
71
68
  ```
72
69
 
73
70
  Output, containing the MD5 digest of the file in the filename:
@@ -76,7 +73,18 @@ Output, containing the MD5 digest of the file in the filename:
76
73
  <link href="assets/site-390be921ee0eff063817bb5ef2954300.css" rel="stylesheet" media="screen, projection">
77
74
  ```
78
75
 
79
- This feature does not require any external tools.
76
+ Jekyll's output directory will have the asset file at that path.
77
+
78
+ This feature is useful when combined with asset generation tools
79
+ external to Jekyll. For example, you can configure
80
+ [Compass](http://compass-style.org/) to take inputs from
81
+ `_assets/styles/*.scss` and to produce output to
82
+ `_tmp/site.css`. Then, you use `ministamp` tag to copy the file with a
83
+ fingerprint to Jekyll's output directory:
84
+
85
+ ``` html
86
+ <link href="{% ministamp _tmp/site.css assets/site.css %}" rel="stylesheet">
87
+ ```
80
88
 
81
89
  ## Asset bundling
82
90
 
@@ -85,8 +93,8 @@ tool that supports reading input from STDIN and writing the output to
85
93
  STDOUT. You write the configuration for input sources directly into
86
94
  the content file where you want the markup tag for the bundle file to
87
95
  appear. The outcome will be a markup tag containing the path to the
88
- bundle file, and the generated site will have the bundle file in that
89
- path. The MD5 digest of the file will be included in the filename.
96
+ bundle file, and the Jekyll's output directory will have the bundle
97
+ file at that path. The path will contain a fingerprint.
90
98
 
91
99
  Place `minibundle` block with configuration into your content file
92
100
  where you want the generated markup to appear. For example, to bundle
@@ -157,12 +165,13 @@ result, there will be both `src.css` and `dest-<md5>.css` files in
157
165
 
158
166
  In order to avoid this, exclude the asset source file from
159
167
  Jekyll. Because Jekyll excludes directories beginning with underscore
160
- character (`_`), consider the following directory layout:
168
+ character (`_`), consider using the following directory layout:
161
169
 
162
- * `_assets/` for JS and CSS assets handled by the plugin that are in
163
- version control
164
- * `_tmp/` for temporary JS and CSS assets handled by the plugin that
165
- are not in version control (for example, Compass output files)
170
+ * `_assets/` for JavaScript and CSS assets handled by the plugin that
171
+ are in version control
172
+ * `_tmp/` for temporary JavaScript and CSS assets handled by the
173
+ plugin that are not in version control (for example, Compass output
174
+ files)
166
175
  * `assets/` for images and other assets handled by Jekyll directly
167
176
 
168
177
  See [Jekyll configuration][JekyllConf] for more about excluding files
@@ -170,12 +179,13 @@ and directories.
170
179
 
171
180
  ## Development mode
172
181
 
173
- The plugin has one more trick in its sleeves. If you set environment
174
- variable `$JEKYLL_MINIBUNDLE_MODE` to `development`, then the plugin
175
- will copy asset files as is to the destination directory (using
176
- `destination_path` as directory for `minibundle` block), and omit
177
- fingerprinting. This is useful in development workflow, where you need
178
- the filenames and line numbers of the original asset sources.
182
+ The plugin has one more trick in its sleeves. If you set
183
+ `$JEKYLL_MINIBUNDLE_MODE` environment variable to `development`, then
184
+ the plugin will copy asset files as is to Jekyll's output directory
185
+ and omit fingerprinting. The `destination_path` setting in
186
+ `minibundle` block sets the destination directory for bundled
187
+ files. This is useful in development workflow, where you need the
188
+ filenames and line numbers of the original asset sources.
179
189
 
180
190
  ``` bash
181
191
  $ JEKYLL_MINIBUNDLE_MODE=development jekyll serve --watch
data/Rakefile CHANGED
@@ -14,8 +14,8 @@ def get_minibundle_env(overrides = {})
14
14
  end
15
15
 
16
16
  def run_jekyll_in_fixture_site(command)
17
- Dir.chdir 'test/fixture/site'
18
- FileUtils.rm_rf '_site'
17
+ Dir.chdir('test/fixture/site')
18
+ FileUtils.rm_rf('_site')
19
19
  sh get_minibundle_env, "jekyll #{command}"
20
20
  end
21
21
 
@@ -40,7 +40,7 @@ namespace :gem do
40
40
  end
41
41
  end
42
42
 
43
- desc 'Run tests'
43
+ desc 'Run tests; envars: tests=<test_path> to select a particular suite, debug=1 to require Pry and PP'
44
44
  task :test do
45
45
  glob = ENV['tests'] || 'test/{unit,integration}/*_test.rb'
46
46
  files = Dir[glob].
@@ -49,7 +49,7 @@ task :test do
49
49
  opts = ENV['debug'] ? '-rpp -rpry' : ''
50
50
  eval = %{-e 'ARGV.each { |f| require f }'}
51
51
  cmd = "ruby #{opts} #{eval} #{files}"
52
- env = get_minibundle_env 'RUBYLIB' => 'lib:test'
52
+ env = get_minibundle_env('RUBYLIB' => 'lib:test')
53
53
  sh env, cmd
54
54
  end
55
55
 
@@ -58,12 +58,12 @@ namespace :fixture do
58
58
 
59
59
  desc 'Generate fixture site'
60
60
  task :build do
61
- run_jekyll_in_fixture_site 'build'
61
+ run_jekyll_in_fixture_site('build')
62
62
  end
63
63
 
64
64
  desc 'Generate fixture site in watch mode'
65
65
  task :watch do
66
- run_jekyll_in_fixture_site 'build --watch'
66
+ run_jekyll_in_fixture_site('build --watch')
67
67
  end
68
68
  end
69
69
 
@@ -1,13 +1,13 @@
1
1
  require File.expand_path(File.join(File.dirname(__FILE__), 'lib/jekyll/minibundle/version'))
2
2
 
3
3
  Gem::Specification.new do |s|
4
- s.name = 'jekyll-minibundle'
5
- s.version = Jekyll::Minibundle::VERSION
6
- s.summary = 'A minimalistic asset bundling plugin for Jekyll'
7
- s.authors = ['Tuomas Kareinen']
8
- s.email = 'tkareine@gmail.com'
9
- s.homepage = 'https://github.com/tkareine/jekyll-minibundle'
10
- s.licenses = %w{MIT}
4
+ s.name = 'jekyll-minibundle'
5
+ s.version = Jekyll::Minibundle::VERSION
6
+ s.summary = 'A minimalistic asset bundling plugin for Jekyll'
7
+ s.authors = ['Tuomas Kareinen']
8
+ s.email = 'tkareine@gmail.com'
9
+ s.homepage = 'https://github.com/tkareine/jekyll-minibundle'
10
+ s.license = 'MIT'
11
11
 
12
12
  s.description = <<-END
13
13
  A straightforward asset bundling plugin for Jekyll, utilizing external
@@ -27,10 +27,10 @@ minification tool (not even other gems).
27
27
 
28
28
  s.test_files = `git ls-files -- test`.split("\n")
29
29
 
30
- s.add_development_dependency 'jekyll', '~> 1.4.2'
31
- s.add_development_dependency 'minitest', '~> 5.2.0'
32
- s.add_development_dependency 'nokogiri', '~> 1.6.1'
33
- s.add_development_dependency 'rake', '~> 10.1.1'
30
+ s.add_development_dependency 'jekyll', '~> 1.4'
31
+ s.add_development_dependency 'minitest', '~> 5.2'
32
+ s.add_development_dependency 'nokogiri', '~> 1.6'
33
+ s.add_development_dependency 'rake', '~> 10.1'
34
34
 
35
35
  s.required_ruby_version = '>= 1.9.3'
36
36
 
@@ -5,7 +5,7 @@ module Jekyll::Minibundle
5
5
  class AssetBundle
6
6
  def initialize(type, assets, site_dir)
7
7
  @type, @assets, @site_dir = type, assets, site_dir
8
- @temp_file = Tempfile.new "jekyll-minibundle-#{@type}-"
8
+ @temp_file = Tempfile.new("jekyll-minibundle-#{@type}-")
9
9
  at_exit { @temp_file.close! }
10
10
  end
11
11
 
@@ -14,15 +14,17 @@ module Jekyll::Minibundle
14
14
  end
15
15
 
16
16
  def make_bundle
17
- pipe_bundling_to_temp_file bundling_cmd do |wr|
17
+ cmd = get_minifier_cmd
18
+ exit_status = spawn_minifier(cmd) do |input|
18
19
  $stdout.puts # place newline after "(Re)generating..." log messages
19
- log "Bundling #{@type} assets:"
20
+ log("Bundling #{@type} assets:")
20
21
  @assets.each do |asset|
21
- log asset
22
- IO.foreach(asset) { |line| wr.write line }
23
- wr.puts ';' if @type == :js
22
+ log(asset)
23
+ IO.foreach(asset) { |line| input.write(line) }
24
+ input.puts(';') if @type == :js
24
25
  end
25
26
  end
27
+ fail "Bundling #{@type} assets failed with exit status #{exit_status}, command: #{cmd}" if exit_status != 0
26
28
  self
27
29
  end
28
30
 
@@ -30,30 +32,31 @@ module Jekyll::Minibundle
30
32
 
31
33
  if defined? ::Jekyll.logger # introduced in Jekyll 1.0.0
32
34
  def log(msg)
33
- ::Jekyll.logger.info 'Minibundle:', msg
35
+ ::Jekyll.logger.info('Minibundle:', msg)
34
36
  end
35
37
  else
36
38
  def log(msg)
37
- $stdout.puts msg
39
+ $stdout.puts(msg)
38
40
  end
39
41
  end
40
42
 
41
- def bundling_cmd
42
- Environment.command_for @type
43
+ def get_minifier_cmd
44
+ Environment.command_for(@type)
43
45
  end
44
46
 
45
- def pipe_bundling_to_temp_file(cmd)
47
+ def spawn_minifier(cmd)
46
48
  pid = nil
47
49
  rd, wr = IO.pipe
48
- Dir.chdir @site_dir do
49
- pid = spawn cmd, out: [@temp_file.path, 'w'], in: rd
50
+ Dir.chdir(@site_dir) do
51
+ pid = spawn(cmd, out: [@temp_file.path, 'w'], in: rd)
50
52
  end
53
+ rd.close
51
54
  yield wr
52
55
  wr.close
53
- _, status = Process.waitpid2 pid
54
- raise "Bundling #{@type} assets failed with exit status #{status.exitstatus}, command: #{cmd}" if status.exitstatus != 0
56
+ _, status = Process.waitpid2(pid)
57
+ status.exitstatus
55
58
  ensure
56
- wr.close unless wr.closed?
59
+ [rd, wr].each { |io| io.close unless io.closed? }
57
60
  end
58
61
  end
59
62
  end
@@ -9,9 +9,9 @@ module Jekyll::Minibundle
9
9
  end
10
10
 
11
11
  def write_destination(site_destination_dir)
12
- destination_path = destination site_destination_dir
13
- FileUtils.mkdir_p File.dirname(destination_path)
14
- FileUtils.cp path, destination_path
12
+ destination_path = destination(site_destination_dir)
13
+ FileUtils.mkdir_p(File.dirname(destination_path))
14
+ FileUtils.cp(path, destination_path)
15
15
  end
16
16
  end
17
17
  end
@@ -5,15 +5,11 @@ module Jekyll::Minibundle
5
5
  end
6
6
 
7
7
  def asset_destination_path
8
- File.join asset_destination_dir, asset_destination_basename
8
+ File.join(asset_destination_dir, asset_destination_basename)
9
9
  end
10
10
 
11
11
  def destination(site_destination_dir)
12
- File.join site_destination_dir, asset_destination_path
13
- end
14
-
15
- def destination_exists?(site_destination_dir)
16
- File.exists? destination(site_destination_dir)
12
+ File.join(site_destination_dir, asset_destination_path)
17
13
  end
18
14
 
19
15
  def mtime
@@ -5,45 +5,43 @@ require 'jekyll/minibundle/stamp_file'
5
5
 
6
6
  module Jekyll::Minibundle
7
7
  module AssetFileRegistry
8
- def self.clear
9
- @@_instances = {}
10
- end
11
-
12
- clear
13
-
14
- def self.bundle_file(config)
15
- asset_destination_path = "#{config['destination_path']}.#{config['type']}"
16
- @@_instances[asset_destination_path] ||= register_bundle_file config
17
- end
8
+ class << self
9
+ def clear
10
+ @_instances = {}
11
+ end
18
12
 
19
- def self.stamp_file(asset_source_path, asset_destination_path)
20
- @@_instances[asset_destination_path] ||= register_stamp_file asset_source_path, asset_destination_path
21
- end
13
+ def bundle_file(config)
14
+ asset_destination_path = "#{config['destination_path']}.#{config['type']}"
15
+ @_instances[asset_destination_path] ||= register_bundle_file(config)
16
+ end
22
17
 
23
- def self.register_bundle_file(config)
24
- if Environment.development?
25
- DevelopmentFileCollection.new config
26
- else
27
- BundleFile.new config
18
+ def stamp_file(asset_source_path, asset_destination_path)
19
+ @_instances[asset_destination_path] ||= register_stamp_file(asset_source_path, asset_destination_path)
28
20
  end
29
- end
30
21
 
31
- private_class_method :register_bundle_file
22
+ private
32
23
 
33
- def self.register_stamp_file(asset_source_path, asset_destination_path)
34
- StampFile.new(asset_source_path, asset_destination_path, &get_stamp_file_basenamer)
35
- end
24
+ def register_bundle_file(config)
25
+ if Environment.development?
26
+ DevelopmentFileCollection.new(config)
27
+ else
28
+ BundleFile.new(config)
29
+ end
30
+ end
36
31
 
37
- private_class_method :register_stamp_file
32
+ def register_stamp_file(asset_source_path, asset_destination_path)
33
+ StampFile.new(asset_source_path, asset_destination_path, &get_stamp_file_basenamer)
34
+ end
38
35
 
39
- def self.get_stamp_file_basenamer
40
- if Environment.development?
41
- ->(base, ext, _) { base + ext }
42
- else
43
- ->(base, ext, stamper) { "#{base}-#{stamper.call}#{ext}" }
36
+ def get_stamp_file_basenamer
37
+ if Environment.development?
38
+ ->(base, ext, _) { base + ext }
39
+ else
40
+ ->(base, ext, stamper) { "#{base}-#{stamper.call}#{ext}" }
41
+ end
44
42
  end
45
43
  end
46
44
 
47
- private_class_method :get_stamp_file_basenamer
45
+ clear
48
46
  end
49
47
  end
@@ -3,7 +3,7 @@ require 'digest/md5'
3
3
  module Jekyll::Minibundle
4
4
  module AssetStamp
5
5
  def self.from_file(path)
6
- Digest::MD5.hexdigest File.read(path)
6
+ Digest::MD5.hexdigest(File.read(path))
7
7
  end
8
8
  end
9
9
  end
@@ -2,23 +2,25 @@ require 'cgi'
2
2
 
3
3
  module Jekyll::Minibundle
4
4
  module AssetTagMarkup
5
- def self.make_markup(type, path, attributes)
6
- case type
7
- when :js
8
- %{<script type="text/javascript" src="#{path}"#{make_attributes(attributes)}></script>}
9
- when :css
10
- %{<link rel="stylesheet" href="#{path}"#{make_attributes(attributes)}>}
11
- else
12
- raise "Unknown type for generating bundle markup: #{type}, #{path}"
5
+ class << self
6
+ def make_markup(type, path, attributes)
7
+ case type
8
+ when :js
9
+ %{<script type="text/javascript" src="#{path}"#{make_attributes(attributes)}></script>}
10
+ when :css
11
+ %{<link rel="stylesheet" href="#{path}"#{make_attributes(attributes)}>}
12
+ else
13
+ fail "Unknown type for generating bundle markup: #{type}, #{path}"
14
+ end
13
15
  end
14
- end
15
16
 
16
- def self.make_attributes(attributes)
17
- attributes.map { |name, value| make_attribute(name, value) }.join('')
18
- end
17
+ def make_attributes(attributes)
18
+ attributes.map { |name, value| make_attribute(name, value) }.join('')
19
+ end
19
20
 
20
- def self.make_attribute(name, value)
21
- %{ #{name}="#{CGI.escape_html(value)}"}
21
+ def make_attribute(name, value)
22
+ %{ #{name}="#{CGI.escape_html(value)}"}
23
+ end
22
24
  end
23
25
  end
24
26
  end