jekyll-assets 0.3.0 → 0.3.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.
- data/.yardopts +1 -0
- data/HISTORY.md +5 -0
- data/README.md +7 -0
- data/lib/jekyll-assets.rb +1 -1
- data/lib/jekyll/assets_plugin.rb +4 -20
- data/lib/jekyll/assets_plugin/asset_file.rb +12 -7
- data/lib/jekyll/assets_plugin/configuration.rb +25 -51
- data/lib/jekyll/assets_plugin/environment.rb +73 -0
- data/lib/jekyll/assets_plugin/environment/context_patch.rb +18 -0
- data/lib/jekyll/assets_plugin/filters.rb +5 -0
- data/lib/jekyll/assets_plugin/liquid_processor.rb +18 -0
- data/lib/jekyll/assets_plugin/renderer.rb +10 -17
- data/lib/jekyll/assets_plugin/site_patch.rb +11 -41
- data/lib/jekyll/assets_plugin/tag.rb +9 -40
- data/lib/jekyll/assets_plugin/version.rb +1 -1
- data/spec/fixtures/_assets/app.js +2 -0
- data/spec/lib/jekyll-assets/bourbon_spec.rb +4 -4
- data/spec/lib/jekyll-assets/compass_spec.rb +4 -4
- data/spec/lib/jekyll/assets_plugin/asset_file_spec.rb +3 -3
- data/spec/lib/jekyll/assets_plugin/configuration_spec.rb +34 -46
- data/spec/lib/jekyll/assets_plugin/filters_spec.rb +4 -4
- data/spec/lib/jekyll/assets_plugin/site_patch_spec.rb +24 -18
- data/spec/lib/jekyll/assets_plugin/tag_spec.rb +32 -32
- data/spec/spec_helper.rb +8 -8
- data/spec/support/fixtures_path.rb +2 -2
- metadata +7 -3
data/.yardopts
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
lib/**/*.rb - README.md HISTORY.md LICENSE
|
data/HISTORY.md
CHANGED
data/README.md
CHANGED
@@ -35,6 +35,13 @@ information about amazing features it gives you.
|
|
35
35
|
[sprockets]: https://github.com/sstephenson/sprockets#readme
|
36
36
|
[extjs]: https://github.com/sstephenson/execjs#readme
|
37
37
|
|
38
|
+
For a quick start check out [jekyll-assets introduction][jekyll-assets-intro]
|
39
|
+
that shows how to use it step by step. Also you might want to take a look on
|
40
|
+
[my blog sources][ixti-blog-src] as a real-world example as well.
|
41
|
+
|
42
|
+
[jekyll-assets-intro]: http://ixti.net/software/2012/12/30/unleash-mr-hyde-introduction-of-jekyll-assets.html
|
43
|
+
[ixti-blog-src]: https://github.com/ixti/ixti.github.com
|
44
|
+
|
38
45
|
|
39
46
|
## Installation
|
40
47
|
|
data/lib/jekyll-assets.rb
CHANGED
@@ -1 +1 @@
|
|
1
|
-
require
|
1
|
+
require "jekyll/assets_plugin"
|
data/lib/jekyll/assets_plugin.rb
CHANGED
@@ -1,20 +1,4 @@
|
|
1
|
-
require
|
2
|
-
require
|
3
|
-
|
4
|
-
|
5
|
-
require 'jekyll/assets_plugin/site_patch'
|
6
|
-
require 'jekyll/assets_plugin/filters'
|
7
|
-
require 'jekyll/assets_plugin/tag'
|
8
|
-
require 'jekyll/assets_plugin/version'
|
9
|
-
|
10
|
-
|
11
|
-
Jekyll::Site.send :include, Jekyll::AssetsPlugin::SitePatch
|
12
|
-
|
13
|
-
|
14
|
-
Liquid::Template.register_filter Jekyll::AssetsPlugin::Filters
|
15
|
-
|
16
|
-
|
17
|
-
Liquid::Template.register_tag 'javascript', Jekyll::AssetsPlugin::Tag
|
18
|
-
Liquid::Template.register_tag 'stylesheet', Jekyll::AssetsPlugin::Tag
|
19
|
-
Liquid::Template.register_tag 'asset_path', Jekyll::AssetsPlugin::Tag
|
20
|
-
Liquid::Template.register_tag 'asset', Jekyll::AssetsPlugin::Tag
|
1
|
+
require "jekyll/assets_plugin/site_patch"
|
2
|
+
require "jekyll/assets_plugin/filters"
|
3
|
+
require "jekyll/assets_plugin/tag"
|
4
|
+
require "jekyll/assets_plugin/version"
|
@@ -1,38 +1,38 @@
|
|
1
|
-
# stdlib
|
2
|
-
require 'set'
|
3
|
-
|
4
|
-
|
5
1
|
module Jekyll
|
6
2
|
module AssetsPlugin
|
7
|
-
# Represents single asset that can be used as StaticFile for Site
|
8
|
-
#
|
9
3
|
class AssetFile
|
10
|
-
class NotFound < StandardError; end
|
11
4
|
|
12
5
|
@@mtimes = Hash.new
|
13
6
|
|
7
|
+
|
14
8
|
attr_reader :asset
|
15
9
|
|
10
|
+
|
16
11
|
def initialize site, asset
|
17
12
|
@site, @asset = site, asset
|
18
13
|
end
|
19
14
|
|
15
|
+
|
20
16
|
def destination dest
|
21
17
|
File.join(dest, @site.assets_config.dirname, @asset.digest_path)
|
22
18
|
end
|
23
19
|
|
20
|
+
|
24
21
|
def path
|
25
22
|
@asset.pathname.to_s
|
26
23
|
end
|
27
24
|
|
25
|
+
|
28
26
|
def mtime
|
29
27
|
@asset.mtime.to_i
|
30
28
|
end
|
31
29
|
|
30
|
+
|
32
31
|
def modified?
|
33
32
|
@@mtimes[path] != mtime
|
34
33
|
end
|
35
34
|
|
35
|
+
|
36
36
|
def write dest
|
37
37
|
dest_path = destination dest
|
38
38
|
|
@@ -43,6 +43,7 @@ module Jekyll
|
|
43
43
|
true
|
44
44
|
end
|
45
45
|
|
46
|
+
|
46
47
|
def == other
|
47
48
|
case other
|
48
49
|
when AssetFile then same_asset? other.asset
|
@@ -51,15 +52,19 @@ module Jekyll
|
|
51
52
|
end
|
52
53
|
end
|
53
54
|
|
55
|
+
|
54
56
|
def to_s
|
55
57
|
"#<Jekyll::AssetsPlugin::AssetFile:#{asset.logical_path}>"
|
56
58
|
end
|
57
59
|
|
60
|
+
|
58
61
|
protected
|
59
62
|
|
63
|
+
|
60
64
|
def same_asset? other
|
61
65
|
other.pathname.cleanpath == asset.pathname.cleanpath
|
62
66
|
end
|
67
|
+
|
63
68
|
end
|
64
69
|
end
|
65
70
|
end
|
@@ -1,72 +1,46 @@
|
|
1
1
|
# stdlib
|
2
|
-
require
|
2
|
+
require "ostruct"
|
3
3
|
|
4
4
|
|
5
5
|
module Jekyll
|
6
6
|
module AssetsPlugin
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
# ##### sources
|
11
|
-
#
|
12
|
-
# Pathnames where to find assets relative to the root of the site.
|
13
|
-
#
|
14
|
-
# Default: ['_assets/javascripts', '_assets/stylesheets', '_assets/images']
|
15
|
-
#
|
16
|
-
#
|
17
|
-
# ##### compress
|
18
|
-
#
|
19
|
-
# Sets compressors for the specific types of file: `js`, or `css`.
|
20
|
-
#
|
21
|
-
# Possible variants:
|
22
|
-
#
|
23
|
-
# css => 'yui', 'sass', nil
|
24
|
-
# js => 'yui', 'uglifier', nil
|
25
|
-
#
|
26
|
-
# Default: { 'css' => nil, 'js' => nil } (no compression at all)
|
27
|
-
#
|
28
|
-
#
|
29
|
-
# ##### dirname
|
30
|
-
#
|
31
|
-
# Destination pathname of processed assets relative to the compiled site
|
32
|
-
# root (which is `_site` by default).
|
33
|
-
#
|
34
|
-
# Default: 'assets'
|
35
|
-
#
|
36
|
-
#
|
37
|
-
# ##### baseurl
|
38
|
-
#
|
39
|
-
# Base URL for assets paths. By default equals dirname surrunded with
|
40
|
-
# slashes. You ight want to change it if your blog has baseurl configuration
|
41
|
-
# and served not from the root of the server, or if you want to keep your
|
42
|
-
# assets on CDN.
|
43
|
-
#
|
44
|
-
class Configuration < OpenStruct
|
45
|
-
@@defaults = {
|
46
|
-
:dirname => 'assets',
|
7
|
+
class Configuration
|
8
|
+
DEFAULTS = {
|
9
|
+
:dirname => "assets",
|
47
10
|
:sources => %w{_assets/javascripts _assets/stylesheets _assets/images},
|
48
11
|
:compress => { :css => nil, :js => nil }
|
49
|
-
}
|
12
|
+
}.freeze
|
13
|
+
|
50
14
|
|
51
15
|
def initialize config = {}
|
52
|
-
|
16
|
+
@data = OpenStruct.new DEFAULTS.merge(config)
|
53
17
|
|
54
|
-
|
55
|
-
|
56
|
-
|
18
|
+
@data.sources = [ @data.sources ] if @data.sources.is_a? String
|
19
|
+
@data.compress = OpenStruct.new @data.compress
|
20
|
+
@data.dirname = @data.dirname.gsub(/^\/+|\/+$/, "")
|
57
21
|
|
58
22
|
# if baseurl not given - autoguess base on dirname
|
59
|
-
|
23
|
+
@data.baseurl ||= "/#{@data.dirname}/".squeeze '/'
|
60
24
|
end
|
61
25
|
|
26
|
+
|
27
|
+
def baseurl
|
28
|
+
@data.baseurl.chomp "/"
|
29
|
+
end
|
30
|
+
|
31
|
+
|
62
32
|
def js_compressor
|
63
|
-
|
64
|
-
false
|
33
|
+
@data.compress.js ? @data.compress.js.to_sym : false
|
65
34
|
end
|
66
35
|
|
36
|
+
|
67
37
|
def css_compressor
|
68
|
-
|
69
|
-
|
38
|
+
@data.compress.css ? @data.compress.css.to_sym : false
|
39
|
+
end
|
40
|
+
|
41
|
+
|
42
|
+
def method_missing name, *args, &block
|
43
|
+
@data.send name, *args, &block
|
70
44
|
end
|
71
45
|
end
|
72
46
|
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# 3rd-party
|
2
|
+
require "sprockets"
|
3
|
+
|
4
|
+
|
5
|
+
# internal
|
6
|
+
require "jekyll/assets_plugin/asset_file"
|
7
|
+
require "jekyll/assets_plugin/liquid_processor"
|
8
|
+
|
9
|
+
|
10
|
+
module Jekyll
|
11
|
+
module AssetsPlugin
|
12
|
+
class Environment < Sprockets::Environment
|
13
|
+
|
14
|
+
class AssetNotFound < StandardError
|
15
|
+
def initialize path
|
16
|
+
super "Couldn't find file '#{path}'"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
autoload :ContextPatch, "jekyll/assets_plugin/environment/context_patch"
|
22
|
+
|
23
|
+
|
24
|
+
attr_reader :site
|
25
|
+
|
26
|
+
|
27
|
+
def initialize site
|
28
|
+
super site.source
|
29
|
+
|
30
|
+
@site = site
|
31
|
+
|
32
|
+
# append asset paths
|
33
|
+
@site.assets_config.sources.each { |p| append_path p }
|
34
|
+
|
35
|
+
self.js_compressor = @site.assets_config.js_compressor
|
36
|
+
self.css_compressor = @site.assets_config.css_compressor
|
37
|
+
|
38
|
+
register_preprocessor "text/css", LiquidProcessor
|
39
|
+
register_preprocessor "application/javascript", LiquidProcessor
|
40
|
+
|
41
|
+
# bind jekyll and Sprockets context together
|
42
|
+
context_class.instance_variable_set :@site, @site
|
43
|
+
|
44
|
+
context_class.send :include, ContextPatch
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
def find_asset path, *args
|
49
|
+
super or raise AssetNotFound, path
|
50
|
+
end
|
51
|
+
|
52
|
+
|
53
|
+
def index
|
54
|
+
super.tap do |index|
|
55
|
+
index.instance_eval do
|
56
|
+
def find_asset path, options = {}
|
57
|
+
site = @environment.site
|
58
|
+
asset = super
|
59
|
+
bundle = options[:bundle]
|
60
|
+
|
61
|
+
if asset and bundle and not site.static_files.include? asset
|
62
|
+
site.static_files << AssetFile.new(site, asset)
|
63
|
+
end
|
64
|
+
|
65
|
+
asset
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module Jekyll
|
2
|
+
module AssetsPlugin
|
3
|
+
class Environment
|
4
|
+
module ContextPatch
|
5
|
+
|
6
|
+
def site
|
7
|
+
self.class.instance_variable_get :@site
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
def asset_path *args
|
12
|
+
"#{site.assets_config.baseurl}/#{site.assets[*args].digest_path}"
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -5,6 +5,7 @@ require 'jekyll/assets_plugin/renderer'
|
|
5
5
|
module Jekyll
|
6
6
|
module AssetsPlugin
|
7
7
|
module Filters
|
8
|
+
|
8
9
|
%w{ asset asset_path javascript stylesheet }.each do |name|
|
9
10
|
module_eval <<-RUBY, __FILE__, __LINE__
|
10
11
|
def #{name} path # def stylesheet logical_path
|
@@ -13,6 +14,10 @@ module Jekyll
|
|
13
14
|
end # end
|
14
15
|
RUBY
|
15
16
|
end
|
17
|
+
|
16
18
|
end
|
17
19
|
end
|
18
20
|
end
|
21
|
+
|
22
|
+
|
23
|
+
Liquid::Template.register_filter Jekyll::AssetsPlugin::Filters
|
@@ -0,0 +1,18 @@
|
|
1
|
+
# 3rd-party
|
2
|
+
require 'tilt'
|
3
|
+
|
4
|
+
|
5
|
+
module Jekyll
|
6
|
+
module AssetsPlugin
|
7
|
+
class LiquidProcessor < Tilt::LiquidTemplate
|
8
|
+
def evaluate context, locals, &block
|
9
|
+
@engine.render locals, {
|
10
|
+
:filters => [Jekyll::Filters],
|
11
|
+
:registers => {
|
12
|
+
:site => context.site
|
13
|
+
}
|
14
|
+
}
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -1,47 +1,40 @@
|
|
1
1
|
module Jekyll
|
2
2
|
module AssetsPlugin
|
3
3
|
class Renderer
|
4
|
+
|
4
5
|
STYLESHEET = '<link rel="stylesheet" type="text/css" href="%s">'
|
5
6
|
JAVASCRIPT = '<script type="text/javascript" src="%s"></script>'
|
6
7
|
|
8
|
+
|
7
9
|
def initialize context, logical_path
|
8
10
|
@site = context.registers[:site]
|
9
11
|
@path = logical_path.strip
|
10
12
|
end
|
11
13
|
|
14
|
+
|
12
15
|
def render_asset
|
13
|
-
|
16
|
+
@site.assets[@path].to_s
|
14
17
|
end
|
15
18
|
|
16
|
-
def render_asset_path
|
17
|
-
unless @site.static_files.include? asset
|
18
|
-
@site.static_files << AssetFile.new(@site, asset)
|
19
|
-
end
|
20
19
|
|
21
|
-
|
20
|
+
def render_asset_path
|
21
|
+
"#{@site.assets_config.baseurl}/#{@site.assets[@path].digest_path}"
|
22
22
|
end
|
23
23
|
|
24
|
+
|
24
25
|
def render_javascript
|
25
|
-
@path <<
|
26
|
+
@path << ".js" if File.extname(@path).empty?
|
26
27
|
|
27
28
|
JAVASCRIPT % render_asset_path
|
28
29
|
end
|
29
30
|
|
31
|
+
|
30
32
|
def render_stylesheet
|
31
|
-
@path <<
|
33
|
+
@path << ".css" if File.extname(@path).empty?
|
32
34
|
|
33
35
|
STYLESHEET % render_asset_path
|
34
36
|
end
|
35
37
|
|
36
|
-
protected
|
37
|
-
|
38
|
-
def asset
|
39
|
-
unless @asset ||= @site.assets[@path]
|
40
|
-
raise AssetFile::NotFound, "couldn't find file '#{@path}'"
|
41
|
-
end
|
42
|
-
|
43
|
-
@asset
|
44
|
-
end
|
45
38
|
end
|
46
39
|
end
|
47
40
|
end
|
@@ -1,58 +1,28 @@
|
|
1
1
|
# 3rd-party
|
2
|
-
require
|
2
|
+
require "jekyll"
|
3
3
|
|
4
4
|
|
5
5
|
# internal
|
6
|
-
require
|
7
|
-
require
|
6
|
+
require "jekyll/assets_plugin/configuration"
|
7
|
+
require "jekyll/assets_plugin/environment"
|
8
8
|
|
9
9
|
|
10
10
|
module Jekyll
|
11
11
|
module AssetsPlugin
|
12
|
-
# Patch that provides #assets and #assets_config to Site
|
13
|
-
#
|
14
12
|
module SitePatch
|
13
|
+
|
15
14
|
def assets_config
|
16
|
-
@assets_config ||= Configuration.new(self.config[
|
15
|
+
@assets_config ||= Configuration.new(self.config["assets"] || {})
|
17
16
|
end
|
18
17
|
|
19
|
-
def assets
|
20
|
-
unless @assets
|
21
|
-
@assets = Sprockets::Environment.new(self.source)
|
22
|
-
|
23
|
-
assets_config.sources.each(&@assets.method(:append_path))
|
24
|
-
|
25
|
-
@assets.js_compressor = assets_config.js_compressor
|
26
|
-
@assets.css_compressor = assets_config.css_compressor
|
27
|
-
|
28
|
-
# bind jekyll and Sprockets context together
|
29
|
-
@assets.context_class.instance_variable_set :@site, self
|
30
|
-
|
31
|
-
@assets.context_class.class_eval do
|
32
|
-
def site
|
33
|
-
self.class.instance_variable_get :@site
|
34
|
-
end
|
35
|
-
|
36
|
-
def asset_baseurl
|
37
|
-
site.assets_config.baseurl.chomp "/"
|
38
|
-
end
|
39
18
|
|
40
|
-
|
41
|
-
|
42
|
-
raise AssetFile::NotFound, "couldn't find file '#{path}'"
|
43
|
-
end
|
44
|
-
|
45
|
-
unless site.static_files.include? asset
|
46
|
-
site.static_files << AssetFile.new(site, asset)
|
47
|
-
end
|
48
|
-
|
49
|
-
"#{asset_baseurl}/#{asset.digest_path}".squeeze "/"
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
|
54
|
-
@assets
|
19
|
+
def assets
|
20
|
+
@assets ||= Environment.new self
|
55
21
|
end
|
22
|
+
|
56
23
|
end
|
57
24
|
end
|
58
25
|
end
|
26
|
+
|
27
|
+
|
28
|
+
Jekyll::Site.send :include, Jekyll::AssetsPlugin::SitePatch
|
@@ -1,55 +1,24 @@
|
|
1
1
|
# 3rd-party
|
2
|
-
require
|
2
|
+
require "liquid"
|
3
3
|
|
4
4
|
|
5
5
|
# internal
|
6
|
-
require
|
6
|
+
require "jekyll/assets_plugin/renderer"
|
7
7
|
|
8
8
|
|
9
9
|
module Jekyll
|
10
10
|
module AssetsPlugin
|
11
|
-
# Class that implements some useful liquid tags:
|
12
|
-
#
|
13
|
-
#
|
14
|
-
# ##### stylesheet
|
15
|
-
#
|
16
|
-
# Renders `<link>` tag for a logical path:
|
17
|
-
#
|
18
|
-
# {% stylesheet foo.css %}
|
19
|
-
# # => '<link type="text/css" rel="stylesheet"
|
20
|
-
# href="/assets/foo-b39e528efc3afe2def4bbc39de17f2b82cd8bd0d.css">
|
21
|
-
#
|
22
|
-
# You may omit extension so the following will give same result as above:
|
23
|
-
#
|
24
|
-
# {% stylesheet foo %}
|
25
|
-
#
|
26
|
-
#
|
27
|
-
# ##### javascript
|
28
|
-
#
|
29
|
-
# Renders `<script>` tag for a logical path:
|
30
|
-
#
|
31
|
-
# {% javascript foo.js %}
|
32
|
-
# # => '<script type="text/javascript"
|
33
|
-
# src="/assets/foo-b39e528efc3afe2def4bbc39de17f2b82cd8bd0d.js">
|
34
|
-
# </script>
|
35
|
-
#
|
36
|
-
# You may omit extension so the following will give same result as above:
|
37
|
-
#
|
38
|
-
# {% javascript foo %}
|
39
|
-
#
|
40
|
-
#
|
41
|
-
# ##### asset_path
|
42
|
-
#
|
43
|
-
# Renders asset path for an asset (useful for images):
|
44
|
-
#
|
45
|
-
# {% asset_path foo.jpg %}
|
46
|
-
# # => '/assets/foo-b39e528efc3afe2def4bbc39de17f2b82cd8bd0d.jpg"
|
47
|
-
#
|
48
|
-
#
|
49
11
|
class Tag < Liquid::Tag
|
12
|
+
|
50
13
|
def render context
|
51
14
|
Renderer.new(context, @markup).send :"render_#{@tag_name}"
|
52
15
|
end
|
16
|
+
|
53
17
|
end
|
54
18
|
end
|
55
19
|
end
|
20
|
+
|
21
|
+
|
22
|
+
%w{ javascript stylesheet asset asset_path }.each do |tag|
|
23
|
+
Liquid::Template.register_tag tag, Jekyll::AssetsPlugin::Tag
|
24
|
+
end
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "spec_helper"
|
2
|
+
require "jekyll-assets/bourbon"
|
3
3
|
|
4
4
|
|
5
5
|
module Jekyll::AssetsPlugin
|
6
|
-
describe
|
6
|
+
describe "Bourbon integration" do
|
7
7
|
it "should globally append bourbon paths into Sprockets environment" do
|
8
|
-
asset = @site.assets[
|
8
|
+
asset = @site.assets["vendor/bourbon.css"].to_s
|
9
9
|
|
10
10
|
asset.should =~ /-webkit-box-shadow/
|
11
11
|
asset.should =~ /box-shadow/
|
@@ -1,11 +1,11 @@
|
|
1
|
-
require
|
2
|
-
require
|
1
|
+
require "spec_helper"
|
2
|
+
require "jekyll-assets/compass"
|
3
3
|
|
4
4
|
|
5
5
|
module Jekyll::AssetsPlugin
|
6
|
-
describe
|
6
|
+
describe "Compass integration" do
|
7
7
|
it "should globally append compass paths into Sprockets environment" do
|
8
|
-
asset = @site.assets[
|
8
|
+
asset = @site.assets["vendor/compass.css"].to_s
|
9
9
|
|
10
10
|
asset.should =~ /-webkit-box-shadow/
|
11
11
|
asset.should =~ /-moz-box-shadow/
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
|
4
4
|
module Jekyll::AssetsPlugin
|
5
5
|
describe AssetFile do
|
6
|
-
context
|
7
|
-
let(:file) { AssetFile.new(@site, @site.assets[
|
6
|
+
context "#destination" do
|
7
|
+
let(:file) { AssetFile.new(@site, @site.assets["app.css"]) }
|
8
8
|
subject { file.destination @dest.to_s }
|
9
9
|
it { should match %r{/app-[0-9a-f]{32}\.css$} }
|
10
10
|
end
|
@@ -1,98 +1,86 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
|
4
4
|
module Jekyll::AssetsPlugin
|
5
5
|
describe Configuration do
|
6
|
-
|
7
|
-
{
|
8
|
-
:dirname => 'assets',
|
9
|
-
:baseurl => '/assets/',
|
10
|
-
:sources => %w{_assets/javascripts _assets/stylesheets _assets/images}
|
11
|
-
}
|
12
|
-
end
|
13
|
-
|
14
|
-
context 'with defaults' do
|
6
|
+
context "with defaults" do
|
15
7
|
let(:config){ Configuration.new }
|
16
8
|
|
17
|
-
context
|
9
|
+
context "output assets dirname" do
|
18
10
|
subject { config.dirname }
|
19
|
-
it { should ==
|
11
|
+
it { should == Configuration::DEFAULTS[:dirname] }
|
20
12
|
end
|
21
13
|
|
22
|
-
context
|
14
|
+
context "assets baseurl" do
|
23
15
|
subject { config.baseurl }
|
24
|
-
it { should ==
|
16
|
+
it { should == "/" + Configuration::DEFAULTS[:dirname] }
|
25
17
|
end
|
26
18
|
|
27
|
-
context
|
19
|
+
context "sources list" do
|
28
20
|
subject { config.sources }
|
29
|
-
it { should =~
|
21
|
+
it { should =~ Configuration::DEFAULTS[:sources] }
|
30
22
|
end
|
31
23
|
|
32
|
-
context
|
24
|
+
context "js compressor" do
|
33
25
|
subject { config.compress.js }
|
34
26
|
it { should be_nil }
|
35
27
|
end
|
36
28
|
|
37
|
-
context
|
29
|
+
context "css compressor" do
|
38
30
|
subject { config.compress.css }
|
39
31
|
it { should be_nil }
|
40
32
|
end
|
41
33
|
end
|
42
34
|
|
43
|
-
it
|
35
|
+
it "should override specified options and leave defaults for missing" do
|
44
36
|
config = Configuration.new({
|
45
37
|
:sources => %w{abc},
|
46
|
-
:compress => { :css =>
|
38
|
+
:compress => { :css => "sass" }
|
47
39
|
})
|
48
40
|
|
49
|
-
config.dirname.should
|
50
|
-
config.sources.should
|
51
|
-
config.compress.js.should
|
52
|
-
config.compress.css.should
|
41
|
+
config.dirname.should == "assets"
|
42
|
+
config.sources.should =~ %w{abc}
|
43
|
+
config.compress.js.should be_nil
|
44
|
+
config.compress.css.should == "sass"
|
53
45
|
end
|
54
46
|
|
55
|
-
context
|
56
|
-
it
|
57
|
-
|
58
|
-
:dirname =>
|
59
|
-
:baseurl =>
|
60
|
-
})
|
61
|
-
|
62
|
-
config.baseurl.should == '/bar/'
|
47
|
+
context "#baseurl" do
|
48
|
+
it "should respect explicit overrides" do
|
49
|
+
Configuration.new({
|
50
|
+
:dirname => "foo",
|
51
|
+
:baseurl => "/bar/"
|
52
|
+
}).baseurl.should == "/bar"
|
63
53
|
end
|
64
54
|
|
65
|
-
it
|
66
|
-
|
67
|
-
:dirname =>
|
68
|
-
})
|
69
|
-
|
70
|
-
config.baseurl.should == '/foo/'
|
55
|
+
it "should be auto-guessed from dirname" do
|
56
|
+
Configuration.new({
|
57
|
+
:dirname => "foo"
|
58
|
+
}).baseurl.should == "/foo"
|
71
59
|
end
|
72
60
|
end
|
73
61
|
|
74
|
-
context
|
75
|
-
context
|
76
|
-
let(:config){ Configuration.new(:compress => {:js =>
|
62
|
+
context "#js_compressor" do
|
63
|
+
context "when js compressor is given as `uglify`" do
|
64
|
+
let(:config){ Configuration.new(:compress => {:js => "uglify"}) }
|
77
65
|
subject { config.js_compressor }
|
78
66
|
it { should be :uglify }
|
79
67
|
end
|
80
68
|
|
81
|
-
context
|
69
|
+
context "otherwise" do
|
82
70
|
let(:config){ Configuration.new }
|
83
71
|
subject { config.js_compressor }
|
84
72
|
it { should be_false }
|
85
73
|
end
|
86
74
|
end
|
87
75
|
|
88
|
-
context
|
89
|
-
context
|
90
|
-
let(:config){ Configuration.new(:compress => {:css =>
|
76
|
+
context "#css_compressor" do
|
77
|
+
context "when css compressor is given as `sass`" do
|
78
|
+
let(:config){ Configuration.new(:compress => {:css => "sass"}) }
|
91
79
|
subject { config.css_compressor }
|
92
80
|
it { should be :sass }
|
93
81
|
end
|
94
82
|
|
95
|
-
context
|
83
|
+
context "otherwise" do
|
96
84
|
let(:config){ Configuration.new }
|
97
85
|
subject { config.css_compressor }
|
98
86
|
it { should be_false }
|
@@ -27,7 +27,7 @@ module Jekyll::AssetsPlugin
|
|
27
27
|
|
28
28
|
context "when <file> does not exists" do
|
29
29
|
subject { render("{{ 'not-found.css' | stylesheet }}") }
|
30
|
-
it { should match "Liquid error:
|
30
|
+
it { should match "Liquid error: Couldn't find file 'not-found.css'" }
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
@@ -49,7 +49,7 @@ module Jekyll::AssetsPlugin
|
|
49
49
|
|
50
50
|
context "when <file> does not exists" do
|
51
51
|
subject { render("{{ 'not-found.js' | javascript }}") }
|
52
|
-
it { should match "Liquid error:
|
52
|
+
it { should match "Liquid error: Couldn't find file 'not-found.js'" }
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
@@ -61,7 +61,7 @@ module Jekyll::AssetsPlugin
|
|
61
61
|
|
62
62
|
context "when <file> does not exists" do
|
63
63
|
subject { render("{{ 'not-found.css' | asset_path }}") }
|
64
|
-
it { should match "Liquid error:
|
64
|
+
it { should match "Liquid error: Couldn't find file 'not-found.css'" }
|
65
65
|
end
|
66
66
|
|
67
67
|
context "with baseurl given as /foobar/" do
|
@@ -79,7 +79,7 @@ module Jekyll::AssetsPlugin
|
|
79
79
|
|
80
80
|
context "when <file> does not exists" do
|
81
81
|
subject { render("{{ 'not-found.js' | asset }}") }
|
82
|
-
it { should match "Liquid error:
|
82
|
+
it { should match "Liquid error: Couldn't find file 'not-found.js'" }
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
|
4
4
|
module Jekyll::AssetsPlugin
|
@@ -13,9 +13,9 @@ module Jekyll::AssetsPlugin
|
|
13
13
|
|
14
14
|
def config
|
15
15
|
@config ||= {
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
"dirname" => "foobar",
|
17
|
+
"assets" => {
|
18
|
+
"sources" => [ "foobar", "_assets" ]
|
19
19
|
}
|
20
20
|
}
|
21
21
|
end
|
@@ -26,26 +26,26 @@ module Jekyll::AssetsPlugin
|
|
26
26
|
end.new
|
27
27
|
end
|
28
28
|
|
29
|
-
context
|
29
|
+
context "#assets" do
|
30
30
|
subject { site.assets }
|
31
|
-
it { should
|
31
|
+
it { should be_a_kind_of Sprockets::Environment }
|
32
32
|
|
33
|
-
context
|
34
|
-
context
|
35
|
-
it
|
33
|
+
context "calling #asset_path within assets" do
|
34
|
+
context "when requested file not found" do
|
35
|
+
it "should raise a NotFound error" do
|
36
36
|
Proc.new do
|
37
37
|
site.assets["should_fail.css"]
|
38
|
-
end.should raise_error(
|
38
|
+
end.should raise_error(Environment::AssetNotFound)
|
39
39
|
end
|
40
40
|
end
|
41
41
|
|
42
|
-
context
|
43
|
-
it
|
42
|
+
context "when requested file found" do
|
43
|
+
it "should have proper asset path" do
|
44
44
|
noise_img_re = %r{url\(/assets/noise-[a-f0-9]{32}\.png\)}
|
45
45
|
site.assets["app.css"].to_s.should match(noise_img_re)
|
46
46
|
end
|
47
47
|
|
48
|
-
it
|
48
|
+
it "should be appended to the static files list" do
|
49
49
|
asset = site.assets["app.css"] # make sure main asset was compiled
|
50
50
|
asset = site.assets["noise.png"]
|
51
51
|
|
@@ -53,19 +53,25 @@ module Jekyll::AssetsPlugin
|
|
53
53
|
end
|
54
54
|
end
|
55
55
|
end
|
56
|
+
|
57
|
+
context "with Liquid markup within assets" do
|
58
|
+
it "should be rendered" do
|
59
|
+
site.assets["app.js"].to_s.should match(/noise-[a-f0-9]{32}\.png/)
|
60
|
+
end
|
61
|
+
end
|
56
62
|
end
|
57
63
|
|
58
|
-
context
|
64
|
+
context "#assets_config" do
|
59
65
|
subject { site.assets_config }
|
60
66
|
it { should be_an_instance_of Configuration }
|
61
67
|
|
62
|
-
it
|
63
|
-
site.assets_config.dirname.should_not ==
|
64
|
-
site.assets_config.sources.should include
|
68
|
+
it "should been populated with `assets` section of config" do
|
69
|
+
site.assets_config.dirname.should_not == "foobar"
|
70
|
+
site.assets_config.sources.should include "foobar"
|
65
71
|
end
|
66
72
|
end
|
67
73
|
|
68
|
-
it
|
74
|
+
it "should be included into Jekyll::Site" do
|
69
75
|
Jekyll::Site.included_modules.should include SitePatch
|
70
76
|
end
|
71
77
|
end
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "spec_helper"
|
2
2
|
|
3
3
|
|
4
4
|
module Jekyll::AssetsPlugin
|
@@ -9,77 +9,77 @@ module Jekyll::AssetsPlugin
|
|
9
9
|
Liquid::Template.parse(content).render({}, context)
|
10
10
|
end
|
11
11
|
|
12
|
-
context
|
12
|
+
context "{% stylesheet <file> %}" do
|
13
13
|
def tag_re name
|
14
14
|
file = "/assets/#{name}-[a-f0-9]{32}\.css"
|
15
15
|
Regexp.new "^#{Renderer::STYLESHEET % file}$"
|
16
16
|
end
|
17
17
|
|
18
|
-
context
|
19
|
-
subject { render(
|
18
|
+
context "when <file> exists" do
|
19
|
+
subject { render("{% stylesheet app.css %}") }
|
20
20
|
it { should match tag_re("app") }
|
21
21
|
end
|
22
22
|
|
23
|
-
context
|
24
|
-
subject { render(
|
23
|
+
context "when <file> extension is omited" do
|
24
|
+
subject { render("{% stylesheet app %}") }
|
25
25
|
it { should match tag_re("app") }
|
26
26
|
end
|
27
27
|
|
28
|
-
context
|
29
|
-
subject { render(
|
30
|
-
it { should match "Liquid error:
|
28
|
+
context "when <file> does not exists" do
|
29
|
+
subject { render("{% stylesheet not-found.css %}") }
|
30
|
+
it { should match "Liquid error: Couldn't find file 'not-found.css'" }
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
context
|
34
|
+
context "{% javascript <file> %}" do
|
35
35
|
def tag_re name
|
36
36
|
file = "/assets/#{name}-[a-f0-9]{32}\.js"
|
37
37
|
Regexp.new "^#{Renderer::JAVASCRIPT % file}$"
|
38
38
|
end
|
39
39
|
|
40
|
-
context
|
41
|
-
subject { render(
|
40
|
+
context "when <file> exists" do
|
41
|
+
subject { render("{% javascript app.js %}") }
|
42
42
|
it { should match tag_re("app") }
|
43
43
|
end
|
44
44
|
|
45
|
-
context
|
46
|
-
subject { render(
|
45
|
+
context "when <file> extension omited" do
|
46
|
+
subject { render("{% javascript app %}") }
|
47
47
|
it { should match tag_re("app") }
|
48
48
|
end
|
49
49
|
|
50
|
-
context
|
51
|
-
subject { render(
|
52
|
-
it { should match "Liquid error:
|
50
|
+
context "when <file> does not exists" do
|
51
|
+
subject { render("{% javascript not-found.js %}") }
|
52
|
+
it { should match "Liquid error: Couldn't find file 'not-found.js'" }
|
53
53
|
end
|
54
54
|
end
|
55
55
|
|
56
|
-
context
|
57
|
-
context
|
58
|
-
subject { render(
|
56
|
+
context "{% asset_path <file.ext> %}" do
|
57
|
+
context "when <file> exists" do
|
58
|
+
subject { render("{% asset_path app.css %}") }
|
59
59
|
it { should match(%r{^/assets/app-[a-f0-9]{32}\.css$}) }
|
60
60
|
end
|
61
61
|
|
62
|
-
context
|
63
|
-
subject { render(
|
64
|
-
it { should match "Liquid error:
|
62
|
+
context "when <file> does not exists" do
|
63
|
+
subject { render("{% asset_path not-found.js %}") }
|
64
|
+
it { should match "Liquid error: Couldn't find file 'not-found.js'" }
|
65
65
|
end
|
66
66
|
|
67
|
-
context
|
68
|
-
before { context[:registers][:site].assets_config.baseurl =
|
69
|
-
subject { render(
|
67
|
+
context "with baseurl given as /foobar/" do
|
68
|
+
before { context[:registers][:site].assets_config.baseurl = "/foobar/" }
|
69
|
+
subject { render("{% asset_path app.css %}") }
|
70
70
|
it { should match(%r{^/foobar/app-[a-f0-9]{32}\.css$}) }
|
71
71
|
end
|
72
72
|
end
|
73
73
|
|
74
|
-
context
|
75
|
-
context
|
76
|
-
subject { render(
|
74
|
+
context "{% asset <file.ext> %}" do
|
75
|
+
context "when <file> exists" do
|
76
|
+
subject { render("{% asset app.css %}") }
|
77
77
|
it { should match(/body \{ background-image: url\(.+?\) \}/) }
|
78
78
|
end
|
79
79
|
|
80
|
-
context
|
81
|
-
subject { render(
|
82
|
-
it { should match "Liquid error:
|
80
|
+
context "when <file> does not exists" do
|
81
|
+
subject { render("{% asset_path not-found.js %}") }
|
82
|
+
it { should match "Liquid error: Couldn't find file 'not-found.js'" }
|
83
83
|
end
|
84
84
|
end
|
85
85
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,24 +1,24 @@
|
|
1
|
-
require
|
1
|
+
require "rubygems"
|
2
2
|
|
3
3
|
|
4
|
-
require
|
5
|
-
require
|
6
|
-
require
|
4
|
+
require "jekyll"
|
5
|
+
require "liquid"
|
6
|
+
require "sprockets"
|
7
7
|
|
8
8
|
|
9
9
|
# Requires supporting ruby files with custom matchers and macros, etc,
|
10
10
|
# in spec/support/ and its subdirectories.
|
11
|
-
Dir[File.expand_path(
|
11
|
+
Dir[File.expand_path("../support", __FILE__) + "/**/*.rb"].each {|f| require f}
|
12
12
|
|
13
13
|
|
14
14
|
RSpec.configure do |config|
|
15
15
|
config.include Jekyll::AssetsPlugin::RSpecHelpers
|
16
16
|
|
17
17
|
config.before(:all) do
|
18
|
-
@dest = fixtures_path.join(
|
18
|
+
@dest = fixtures_path.join("_site")
|
19
19
|
@site = Jekyll::Site.new(Jekyll.configuration({
|
20
|
-
|
21
|
-
|
20
|
+
"source" => fixtures_path.to_s,
|
21
|
+
"destination" => @dest.to_s
|
22
22
|
}))
|
23
23
|
|
24
24
|
@dest.rmtree if @dest.exist?
|
@@ -1,4 +1,4 @@
|
|
1
|
-
require
|
1
|
+
require "pathname"
|
2
2
|
|
3
3
|
|
4
4
|
module Jekyll::AssetsPlugin
|
@@ -6,7 +6,7 @@ module Jekyll::AssetsPlugin
|
|
6
6
|
extend self
|
7
7
|
|
8
8
|
def fixtures_path
|
9
|
-
@fixtures_path ||= Pathname.new(__FILE__).parent.parent.join(
|
9
|
+
@fixtures_path ||= Pathname.new(__FILE__).parent.parent.join("fixtures")
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jekyll-assets
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2013-
|
12
|
+
date: 2013-02-02 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: jekyll
|
@@ -151,6 +151,7 @@ files:
|
|
151
151
|
- .gitignore
|
152
152
|
- .rspec
|
153
153
|
- .travis.yml
|
154
|
+
- .yardopts
|
154
155
|
- Gemfile
|
155
156
|
- Guardfile
|
156
157
|
- HISTORY.md
|
@@ -164,7 +165,10 @@ files:
|
|
164
165
|
- lib/jekyll/assets_plugin.rb
|
165
166
|
- lib/jekyll/assets_plugin/asset_file.rb
|
166
167
|
- lib/jekyll/assets_plugin/configuration.rb
|
168
|
+
- lib/jekyll/assets_plugin/environment.rb
|
169
|
+
- lib/jekyll/assets_plugin/environment/context_patch.rb
|
167
170
|
- lib/jekyll/assets_plugin/filters.rb
|
171
|
+
- lib/jekyll/assets_plugin/liquid_processor.rb
|
168
172
|
- lib/jekyll/assets_plugin/renderer.rb
|
169
173
|
- lib/jekyll/assets_plugin/site_patch.rb
|
170
174
|
- lib/jekyll/assets_plugin/tag.rb
|
@@ -214,7 +218,7 @@ rubyforge_project:
|
|
214
218
|
rubygems_version: 1.8.23
|
215
219
|
signing_key:
|
216
220
|
specification_version: 3
|
217
|
-
summary: jekyll-assets-0.3.
|
221
|
+
summary: jekyll-assets-0.3.1
|
218
222
|
test_files:
|
219
223
|
- spec/fixtures/.gitignore
|
220
224
|
- spec/fixtures/_assets/app.css.erb
|