jekyll-assets 0.1.2 → 0.2.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.
- data/README.md +142 -30
- data/lib/jekyll/assets_plugin.rb +0 -1
- data/lib/jekyll/assets_plugin/asset_file.rb +14 -0
- data/lib/jekyll/assets_plugin/configuration.rb +1 -37
- data/lib/jekyll/assets_plugin/site_patch.rb +22 -15
- data/lib/jekyll/assets_plugin/tag.rb +8 -22
- data/lib/jekyll/assets_plugin/version.rb +1 -1
- data/spec/fixtures/_assets/should_fail.css.erb +1 -0
- data/spec/lib/jekyll/assets_plugin/configuration_spec.rb +1 -8
- data/spec/lib/jekyll/assets_plugin/site_patch_spec.rb +36 -11
- data/spec/lib/jekyll/assets_plugin/tag_spec.rb +43 -28
- metadata +5 -9
- data/lib/jekyll/assets_plugin/generator.rb +0 -26
- data/lib/jekyll/assets_plugin/logging.rb +0 -10
- data/spec/lib/jekyll/assets_plugin/generator_spec.rb +0 -12
- data/spec/lib/jekyll/assets_plugin/logging_spec.rb +0 -17
data/README.md
CHANGED
@@ -4,7 +4,31 @@
|
|
4
4
|
[](https://gemnasium.com/ixti/jekyll-assets)
|
5
5
|
[](https://codeclimate.com/github/ixti/jekyll-assets)
|
6
6
|
|
7
|
-
Jekyll plugin, that adds Rails-alike assets
|
7
|
+
Jekyll plugin, that adds Rails-alike assets pipeline, that means that:
|
8
|
+
|
9
|
+
- It allows you to write these assets in other languages such as CoffeeScript,
|
10
|
+
Sass, Less and ERB.
|
11
|
+
- It allows you to specify dependencies between your assets and automatically
|
12
|
+
concatenates them.
|
13
|
+
- It allows you to minify/compress your JavaScript and CSS assets using
|
14
|
+
compressor you like: YUI, SASS, Uglifier or no compression at all.
|
15
|
+
- It supports JavaScript templates for client-side rendering of strings or
|
16
|
+
markup. JavaScript templates have the special format extension `.jst` and are
|
17
|
+
compiled to JavaScript functions.
|
18
|
+
- Automaticaly adds MD5 fingerprint suffix for _cache busting_. That means
|
19
|
+
that your `app.css` will become `app-908e25f4bf641868d8683022a5b62f54.css`.
|
20
|
+
|
21
|
+
Jekyll-Assets uses fabulous [Sprockets][sprockets] under the hood, so you may
|
22
|
+
refer to Rails guide about [Asset Pipeline][rails-guide] for detailed
|
23
|
+
information about amazing features it gives you.
|
24
|
+
|
25
|
+
*Notice:* You must have an [ExecJS][extjs] supported runtime in order to use
|
26
|
+
CoffeeScript.
|
27
|
+
|
28
|
+
|
29
|
+
[rails-guide]: http://guides.rubyonrails.org/asset_pipeline.html
|
30
|
+
[sprockets]: https://github.com/sstephenson/sprockets#readme
|
31
|
+
[extjs]: https://github.com/sstephenson/execjs#readme
|
8
32
|
|
9
33
|
|
10
34
|
## Installation
|
@@ -22,33 +46,128 @@ Or install it yourself as:
|
|
22
46
|
$ gem install jekyll-assets
|
23
47
|
|
24
48
|
|
25
|
-
##
|
49
|
+
## How to Use Jekyll-Assets
|
50
|
+
|
51
|
+
First of all make sure to require it. Common practice is to add following line
|
52
|
+
into `_plugins/ext.rb` file:
|
53
|
+
|
54
|
+
``` ruby
|
55
|
+
require "jekyll-assets"
|
56
|
+
```
|
57
|
+
|
58
|
+
Once plugin installed, you'll have following liquid tags available:
|
59
|
+
|
60
|
+
- `javascript app`: Generates `<script>` tag for `app.js`
|
61
|
+
- `stylesheet app`: Generates `<link>` tag for `app.css`
|
62
|
+
- `asset_path logo.png`: Returns _resulting_ URL for `logo.png`
|
63
|
+
- `asset app.css`: Returns _compiled_ body of `app.css`
|
64
|
+
|
65
|
+
All compiled assets will be stored under `assets/` dir of generated site.
|
66
|
+
|
67
|
+
Pipeline assets should be under your sources directory of Jekyll site. When a
|
68
|
+
file is referenced with liquid tag or with helper from another asset, Sprockets
|
69
|
+
searches the three default asset locations for it: `_assets/images`,
|
70
|
+
`_assets/javascripts` and `_assets/stylesheets`.
|
71
|
+
|
72
|
+
For example these files:
|
73
|
+
|
74
|
+
```
|
75
|
+
_assets/stylesheets/app.css
|
76
|
+
_assets/javascripts/app.js
|
77
|
+
_assets/javascripts/vendor/jquery.js
|
78
|
+
```
|
79
|
+
|
80
|
+
would be referenced like this:
|
81
|
+
|
82
|
+
``` html
|
83
|
+
{% stylesheet app %}
|
84
|
+
{% javascript app %}
|
85
|
+
{% javascript vendor/jquery %}
|
86
|
+
```
|
87
|
+
|
88
|
+
You might want to require `vendor/jquery.js` into your `app.js`. To do so, just
|
89
|
+
put following line in the beginning of your `app.js` to get it concatenated:
|
90
|
+
|
91
|
+
``` javascript
|
92
|
+
//= require vendor/jquery
|
26
93
|
|
27
|
-
|
94
|
+
$(function () {
|
95
|
+
alert('I love BIG BOOKS!');
|
96
|
+
});
|
97
|
+
```
|
28
98
|
|
29
|
-
|
99
|
+
Now, if you want to use CoffeScript, just add `.coffee` suffix to the file you
|
100
|
+
want and you good to go. For example, here's how your `app.js.coffe` might look
|
101
|
+
like:
|
30
102
|
|
31
|
-
|
103
|
+
``` coffeescript
|
104
|
+
#= require vendor/jquery
|
32
105
|
|
33
|
-
|
34
|
-
|
35
|
-
|
106
|
+
$ ->
|
107
|
+
alert 'I love BIG BOOKS! And small ones too!'
|
108
|
+
```
|
36
109
|
|
37
|
-
|
110
|
+
Now, you might want your stylesheets and javascripts to be minified. In this
|
111
|
+
case just install `uglifier` gem and add following lines into your `config.yml`:
|
38
112
|
|
39
|
-
|
40
|
-
|
41
|
-
|
113
|
+
``` yaml
|
114
|
+
assets:
|
115
|
+
compress:
|
116
|
+
js: uglifier
|
117
|
+
css: sass
|
118
|
+
```
|
42
119
|
|
43
|
-
|
44
|
-
`
|
45
|
-
|
120
|
+
You might want to use YUI compressor for minification. In this case install
|
121
|
+
`yui-compressor` gem and put `yui` in place of `uglifier` and/or `sass` in the
|
122
|
+
config file.
|
123
|
+
|
124
|
+
Let's go crazy now! Assume you want your blog's `body` background color to be
|
125
|
+
white all the time, but red in December. Just add `.erb` suffix extension and
|
126
|
+
you can use ruby to "pre-process" asset, something like this:
|
127
|
+
|
128
|
+
```
|
129
|
+
# file: _assets/stylesheets/app.css.sass.erb
|
130
|
+
|
131
|
+
body
|
132
|
+
background-color: <%= (12 == Date.today.month) ? "red" : "white" %>
|
133
|
+
```
|
134
|
+
|
135
|
+
Want more? Sure, here you are. You can use JavaScript templating with EJS or ECO
|
136
|
+
for example. Create a file `_assets/javascripts/hello.jst.ejs` with following
|
137
|
+
contents:
|
138
|
+
|
139
|
+
``` html
|
140
|
+
<p>Hello, <span><%= name %></span>!</p>
|
141
|
+
<p><%= info %></p>
|
142
|
+
```
|
143
|
+
|
144
|
+
Then use it in your `app.js` file like this:
|
145
|
+
|
146
|
+
``` coffeescript
|
147
|
+
#= require vendor/jquery
|
148
|
+
#= require hello
|
149
|
+
|
150
|
+
$ ->
|
151
|
+
$("body").html JST["hello"]
|
152
|
+
name: "ixti"
|
153
|
+
info: "I love BIG BOOKS! And small ones too!"
|
154
|
+
```
|
155
|
+
|
156
|
+
That's all. Feel free to ask questions if any on [twitter][twitter],
|
157
|
+
[jabber][jabber] or [e-mail][e-mail].
|
158
|
+
|
159
|
+
[twitter]: https://twitter.com/zapparov
|
160
|
+
[jabber]: xmpp://zapparov@jabber.ru
|
161
|
+
[e-mail]: mailto://ixti@member.fsf.org
|
46
162
|
|
47
163
|
|
48
164
|
## Configuration
|
49
165
|
|
50
166
|
You can fine-tune configuration by editing your `_config.yml`:
|
51
167
|
|
168
|
+
#
|
169
|
+
# Plugin: jekyll-assets
|
170
|
+
#
|
52
171
|
assets:
|
53
172
|
#
|
54
173
|
# Pathname of the destination of generated (bundled) assets relative
|
@@ -67,33 +186,26 @@ You can fine-tune configuration by editing your `_config.yml`:
|
|
67
186
|
- _assets/stylesheets
|
68
187
|
- _assets/images
|
69
188
|
#
|
70
|
-
# Array of filenames or filename patterns that needs to be generated for
|
71
|
-
# the generated site. You can use `*` and `**` wildcards in patterns:
|
72
|
-
#
|
73
|
-
# 'foobar.jpg' will match 'foobar.jpg' only
|
74
|
-
# '*.jpg' will match 'foo.jpg', but not 'foo/bar.jpg'
|
75
|
-
# '**.jpg' will match 'foo.jpg', 'foo/bar.jpg', etc.
|
76
|
-
#
|
77
|
-
bundles:
|
78
|
-
- 'app.css'
|
79
|
-
- 'app.js'
|
80
|
-
- '**.jpg'
|
81
|
-
- '**.png'
|
82
|
-
- '**.gif'
|
83
|
-
#
|
84
189
|
# Sets compressors for the specific types of file: `js`, or `css`.
|
85
190
|
# No compression by default.
|
86
191
|
#
|
87
192
|
# Possible variants:
|
88
193
|
#
|
89
194
|
# css => 'yui', 'sass', nil
|
90
|
-
# js => 'yui', '
|
195
|
+
# js => 'yui', 'uglifier', nil
|
91
196
|
#
|
92
197
|
compress:
|
93
198
|
js: ~
|
94
199
|
css: ~
|
95
200
|
|
96
201
|
|
202
|
+
## "Ben, I need help!" (c) Brother 2
|
203
|
+
|
204
|
+
Feel free to send me any comments, recommendations, suggestions. Improve this
|
205
|
+
README, as I really suck in documenting things (thanks @imathis for pointing
|
206
|
+
this out).
|
207
|
+
|
208
|
+
|
97
209
|
## Contributing
|
98
210
|
|
99
211
|
1. Fork it
|
data/lib/jekyll/assets_plugin.rb
CHANGED
@@ -7,6 +7,8 @@ module Jekyll
|
|
7
7
|
# Represents single asset that can be used as StaticFile for Site
|
8
8
|
#
|
9
9
|
class AssetFile
|
10
|
+
class NotFound < StandardError; end
|
11
|
+
|
10
12
|
@@mtimes = Hash.new
|
11
13
|
|
12
14
|
attr_reader :asset
|
@@ -40,6 +42,18 @@ module Jekyll
|
|
40
42
|
@asset.write_to dest_path
|
41
43
|
true
|
42
44
|
end
|
45
|
+
|
46
|
+
def == other
|
47
|
+
case other
|
48
|
+
when AssetFile then other.asset.logical_path == asset.logical_path
|
49
|
+
when Sprockets::Asset then other.logical_path == asset.logical_path
|
50
|
+
else false
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_s
|
55
|
+
"#<Jekyll::AssetsPlugin::AssetFile:#{asset.logical_path}>"
|
56
|
+
end
|
43
57
|
end
|
44
58
|
end
|
45
59
|
end
|
@@ -14,18 +14,6 @@ module Jekyll
|
|
14
14
|
# Default: ['_assets/javascripts', '_assets/stylesheets', '_assets/images']
|
15
15
|
#
|
16
16
|
#
|
17
|
-
# ##### bundles
|
18
|
-
#
|
19
|
-
# Array of filenames or filename patterns that needs to be generated for the
|
20
|
-
# generated site. You can use `*` and `**` wildcards in filename patterns:
|
21
|
-
#
|
22
|
-
# 'foobar.jpg' will match 'foobar.jpg' only
|
23
|
-
# '*.jpg' will match 'foo.jpg', but not 'foo/bar.jpg'
|
24
|
-
# '**.jpg' will match 'foo.jpg', 'foo/bar.jpg', etc.
|
25
|
-
#
|
26
|
-
# Default: ['app.css', 'app.js', '**.jpg', '**.png', '**.gif']
|
27
|
-
#
|
28
|
-
#
|
29
17
|
# ##### compress
|
30
18
|
#
|
31
19
|
# Sets compressors for the specific types of file: `js`, or `css`.
|
@@ -33,7 +21,7 @@ module Jekyll
|
|
33
21
|
# Possible variants:
|
34
22
|
#
|
35
23
|
# css => 'yui', 'sass', nil
|
36
|
-
# js => 'yui', '
|
24
|
+
# js => 'yui', 'uglifier', nil
|
37
25
|
#
|
38
26
|
# Default: { 'css' => nil, 'js' => nil } (no compression at all)
|
39
27
|
#
|
@@ -57,7 +45,6 @@ module Jekyll
|
|
57
45
|
@@defaults = {
|
58
46
|
:dirname => 'assets',
|
59
47
|
:sources => %w{_assets/javascripts _assets/stylesheets _assets/images},
|
60
|
-
:bundles => %w{app.css app.js **.jpg **.png **.gif},
|
61
48
|
:compress => { :css => nil, :js => nil }
|
62
49
|
}
|
63
50
|
|
@@ -65,7 +52,6 @@ module Jekyll
|
|
65
52
|
super @@defaults.merge(config)
|
66
53
|
|
67
54
|
self.sources = [ self.sources ] if self.sources.is_a? String
|
68
|
-
self.bundles = [ self.bundles ] if self.bundles.is_a? String
|
69
55
|
self.compress = OpenStruct.new(self.compress)
|
70
56
|
self.dirname = self.dirname.gsub(/^\/+|\/+$/, '')
|
71
57
|
|
@@ -73,28 +59,6 @@ module Jekyll
|
|
73
59
|
self.baseurl ||= "/#{self.dirname}/".squeeze '/'
|
74
60
|
end
|
75
61
|
|
76
|
-
# Returns bundles array with pattern strings converted to RegExps
|
77
|
-
#
|
78
|
-
# 'foobar.jpg' => 'foobar.jpg'
|
79
|
-
# '*.png' => /[^\]+\.png/
|
80
|
-
# '**.gif' => /.+?\.gif/
|
81
|
-
#
|
82
|
-
def bundle_filenames
|
83
|
-
bundles.map do |pattern|
|
84
|
-
if pattern =~ /^\*/
|
85
|
-
pattern = pattern.dup
|
86
|
-
|
87
|
-
pattern.gsub!(/\./, '\\.')
|
88
|
-
pattern.sub!(/\*{2}/, '.+?')
|
89
|
-
pattern.sub!(/\*{1}/, '[^/]+')
|
90
|
-
|
91
|
-
pattern = /^#{pattern}$/
|
92
|
-
end
|
93
|
-
|
94
|
-
pattern
|
95
|
-
end
|
96
|
-
end
|
97
|
-
|
98
62
|
def js_compressor
|
99
63
|
return compress.js.to_sym if compress.js
|
100
64
|
false
|
@@ -25,26 +25,33 @@ module Jekyll
|
|
25
25
|
@assets.js_compressor = assets_config.js_compressor
|
26
26
|
@assets.css_compressor = assets_config.css_compressor
|
27
27
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
28
|
+
# bind jekyll and Sprockets context together
|
29
|
+
@assets.context_class.instance_variable_set :@jekyll_site, self
|
30
|
+
|
31
|
+
@assets.context_class.class_eval do
|
32
|
+
def jekyll_site
|
33
|
+
self.class.instance_variable_get :@jekyll_site
|
33
34
|
end
|
34
|
-
RUBY
|
35
|
-
end
|
36
35
|
|
37
|
-
|
38
|
-
|
36
|
+
def asset_baseurl
|
37
|
+
jekyll_site.assets_config.baseurl.chomp "/"
|
38
|
+
end
|
39
39
|
|
40
|
-
|
41
|
-
|
42
|
-
|
40
|
+
def asset_path(path, options = {})
|
41
|
+
unless (asset = environment.find_asset path, options)
|
42
|
+
raise AssetFile::NotFound, "couldn't find file '#{path}'"
|
43
|
+
end
|
44
|
+
|
45
|
+
unless jekyll_site.static_files.include? asset
|
46
|
+
jekyll_site.static_files << AssetFile.new(jekyll_site, asset)
|
47
|
+
end
|
48
|
+
|
49
|
+
"#{asset_baseurl}/#{asset.digest_path}".squeeze "/"
|
50
|
+
end
|
51
|
+
end
|
43
52
|
end
|
44
53
|
|
45
|
-
|
46
|
-
file.is_a? AssetFile and file.asset == asset
|
47
|
-
end.nil?
|
54
|
+
@assets
|
48
55
|
end
|
49
56
|
end
|
50
57
|
end
|
@@ -6,10 +6,6 @@ require 'liquid'
|
|
6
6
|
require 'set'
|
7
7
|
|
8
8
|
|
9
|
-
# internal
|
10
|
-
require 'jekyll/assets_plugin/logging'
|
11
|
-
|
12
|
-
|
13
9
|
module Jekyll
|
14
10
|
module AssetsPlugin
|
15
11
|
# Class that implements some useful liquid tags:
|
@@ -51,8 +47,6 @@ module Jekyll
|
|
51
47
|
#
|
52
48
|
#
|
53
49
|
class Tag < Liquid::Tag
|
54
|
-
include Logging
|
55
|
-
|
56
50
|
STYLESHEET = '<link rel="stylesheet" type="text/css" href="%s">'
|
57
51
|
JAVASCRIPT = '<script type="text/javascript" src="%s"></script>'
|
58
52
|
EXTENSIONS = { 'stylesheet' => '.css', 'javascript' => '.js' }
|
@@ -78,23 +72,12 @@ module Jekyll
|
|
78
72
|
EXTENSIONS[@tag_name].to_s
|
79
73
|
end
|
80
74
|
|
81
|
-
def asset_not_found
|
82
|
-
if @@errors.add? @logical_path
|
83
|
-
log :error, "File not found: #{@logical_path}"
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
def asset_not_bundled
|
88
|
-
if @@errors.add? @logical_path
|
89
|
-
log :warn, "File was not bundled: #{@logical_path}"
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
75
|
def with_asset context, &block
|
94
|
-
site
|
95
|
-
|
76
|
+
site = context.registers[:site]
|
77
|
+
path = @logical_path
|
78
|
+
asset = site.assets[path]
|
96
79
|
|
97
|
-
|
80
|
+
raise AssetFile::NotFound, "couldn't find file '#{path}'" unless asset
|
98
81
|
|
99
82
|
yield asset, site
|
100
83
|
end
|
@@ -107,7 +90,10 @@ module Jekyll
|
|
107
90
|
|
108
91
|
def render_asset_path context
|
109
92
|
with_asset context do |asset, site|
|
110
|
-
|
93
|
+
unless site.static_files.include? asset
|
94
|
+
site.static_files << AssetFile.new(site, asset)
|
95
|
+
end
|
96
|
+
|
111
97
|
return "#{site.assets_config.baseurl.chomp '/'}/#{asset.digest_path}"
|
112
98
|
end
|
113
99
|
end
|
@@ -0,0 +1 @@
|
|
1
|
+
body { background-image: url(<%= image_path 'not-found.png' %>) }
|
@@ -7,8 +7,7 @@ module Jekyll::AssetsPlugin
|
|
7
7
|
{
|
8
8
|
:dirname => 'assets',
|
9
9
|
:baseurl => '/assets/',
|
10
|
-
:sources => %w{_assets/javascripts _assets/stylesheets _assets/images}
|
11
|
-
:bundles => %w{app.css app.js **.jpg **.png **.gif}
|
10
|
+
:sources => %w{_assets/javascripts _assets/stylesheets _assets/images}
|
12
11
|
}
|
13
12
|
end
|
14
13
|
|
@@ -30,11 +29,6 @@ module Jekyll::AssetsPlugin
|
|
30
29
|
it { should =~ defaults[:sources] }
|
31
30
|
end
|
32
31
|
|
33
|
-
context 'bundles list' do
|
34
|
-
subject { config.bundles }
|
35
|
-
it { should =~ defaults[:bundles] }
|
36
|
-
end
|
37
|
-
|
38
32
|
context 'js compressor' do
|
39
33
|
subject { config.compress.js }
|
40
34
|
it { should be_nil }
|
@@ -54,7 +48,6 @@ module Jekyll::AssetsPlugin
|
|
54
48
|
|
55
49
|
config.dirname.should == 'assets'
|
56
50
|
config.sources.should =~ %w{abc}
|
57
|
-
config.bundles.should =~ defaults[:bundles]
|
58
51
|
config.compress.js.should be_nil
|
59
52
|
config.compress.css.should == 'sass'
|
60
53
|
end
|
@@ -4,18 +4,24 @@ require 'spec_helper'
|
|
4
4
|
module Jekyll::AssetsPlugin
|
5
5
|
describe SitePatch do
|
6
6
|
let(:site) do
|
7
|
-
Class.new do
|
7
|
+
Class.new(Jekyll::Site) do
|
8
8
|
include SitePatch
|
9
9
|
|
10
|
+
def initialize
|
11
|
+
self.reset
|
12
|
+
end
|
13
|
+
|
10
14
|
def config
|
11
15
|
@config ||= {
|
12
|
-
'
|
13
|
-
'assets' => {
|
16
|
+
'dirname' => 'foobar',
|
17
|
+
'assets' => {
|
18
|
+
'sources' => [ 'foobar', '_assets' ]
|
19
|
+
}
|
14
20
|
}
|
15
21
|
end
|
16
22
|
|
17
23
|
def source
|
18
|
-
@
|
24
|
+
@source ||= RSpecHelpers.fixtures_path.to_s
|
19
25
|
end
|
20
26
|
end.new
|
21
27
|
end
|
@@ -23,6 +29,30 @@ module Jekyll::AssetsPlugin
|
|
23
29
|
context '#assets' do
|
24
30
|
subject { site.assets }
|
25
31
|
it { should be_an_instance_of Sprockets::Environment }
|
32
|
+
|
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
|
+
Proc.new do
|
37
|
+
site.assets["should_fail.css"]
|
38
|
+
end.should raise_error(AssetFile::NotFound)
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
context 'when requested file found' do
|
43
|
+
it 'should have proper asset path' do
|
44
|
+
noise_img_re = %r{url\(/assets/noise-[a-f0-9]{32}\.png\)}
|
45
|
+
site.assets["app.css"].to_s.should match(noise_img_re)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'should be appended to the static files list' do
|
49
|
+
asset = site.assets["app.css"] # make sure main asset was compiled
|
50
|
+
asset = site.assets["noise.png"]
|
51
|
+
|
52
|
+
site.static_files.include?(asset).should be_true
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
26
56
|
end
|
27
57
|
|
28
58
|
context '#assets_config' do
|
@@ -30,18 +60,13 @@ module Jekyll::AssetsPlugin
|
|
30
60
|
it { should be_an_instance_of Configuration }
|
31
61
|
|
32
62
|
it 'should been populated with `assets` section of config' do
|
33
|
-
site.assets_config.
|
34
|
-
site.assets_config.sources.should
|
63
|
+
site.assets_config.dirname.should_not == 'foobar'
|
64
|
+
site.assets_config.sources.should include 'foobar'
|
35
65
|
end
|
36
66
|
end
|
37
67
|
|
38
68
|
it 'should be included into Jekyll::Site' do
|
39
69
|
Jekyll::Site.included_modules.should include SitePatch
|
40
70
|
end
|
41
|
-
|
42
|
-
it 'should respond to #has_bundled_asset?' do
|
43
|
-
@site.has_bundled_asset?(@site.assets['app.css']).should be_true
|
44
|
-
@site.has_bundled_asset?(@site.assets['normalize.css']).should be_false
|
45
|
-
end
|
46
71
|
end
|
47
72
|
end
|
@@ -10,54 +10,56 @@ module Jekyll::AssetsPlugin
|
|
10
10
|
end
|
11
11
|
|
12
12
|
context '{% stylesheet <file> %}' do
|
13
|
-
|
14
|
-
|
13
|
+
def tag_re name
|
14
|
+
file = "/assets/#{name}-[a-f0-9]{32}\.css"
|
15
|
+
Regexp.new "^#{Tag::STYLESHEET % file}$"
|
15
16
|
end
|
16
17
|
|
17
18
|
context 'when <file> is bundled' do
|
18
19
|
subject { render('{% stylesheet app.css %}') }
|
19
|
-
it { should match tag_re }
|
20
|
+
it { should match tag_re("app") }
|
21
|
+
end
|
22
|
+
|
23
|
+
context 'when <file> is not explicitly bundled' do
|
24
|
+
subject { render('{% stylesheet vapor.css %}') }
|
25
|
+
it { should match tag_re("vapor") }
|
20
26
|
end
|
21
27
|
|
22
28
|
context 'when <file> extension is omited' do
|
23
29
|
subject { render('{% stylesheet app %}') }
|
24
|
-
it { should match tag_re }
|
30
|
+
it { should match tag_re("app") }
|
25
31
|
end
|
26
32
|
|
27
33
|
context 'when <file> is not found' do
|
28
34
|
subject { render('{% stylesheet not-found.css %}') }
|
29
|
-
it { should
|
30
|
-
end
|
31
|
-
|
32
|
-
context 'when <file> is not bundled' do
|
33
|
-
subject { render('{% stylesheet vapor.css %}') }
|
34
|
-
it { should be_empty }
|
35
|
+
it { should match "Liquid error: couldn't find file 'not-found.css'" }
|
35
36
|
end
|
36
37
|
end
|
37
38
|
|
38
|
-
context '{%
|
39
|
-
|
40
|
-
|
39
|
+
context '{% javascript <file> %}' do
|
40
|
+
def tag_re name
|
41
|
+
file = "/assets/#{name}-[a-f0-9]{32}\.js"
|
42
|
+
Regexp.new "^#{Tag::JAVASCRIPT % file}$"
|
41
43
|
end
|
42
44
|
|
43
45
|
context 'when <file> is bundled' do
|
44
46
|
subject { render('{% javascript app.js %}') }
|
45
|
-
it { should match tag_re }
|
47
|
+
it { should match tag_re("app") }
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'when <file> is not explicitly bundled' do
|
51
|
+
subject { render('{% javascript vapor.js %}') }
|
52
|
+
it { should match tag_re("vapor") }
|
46
53
|
end
|
47
54
|
|
48
55
|
context 'when <file> extension omited' do
|
49
56
|
subject { render('{% javascript app %}') }
|
50
|
-
it { should match tag_re }
|
57
|
+
it { should match tag_re("app") }
|
51
58
|
end
|
52
59
|
|
53
60
|
context 'when <file> is not found' do
|
54
61
|
subject { render('{% javascript not-found.js %}') }
|
55
|
-
it { should
|
56
|
-
end
|
57
|
-
|
58
|
-
context 'when <file> is not bundled' do
|
59
|
-
subject { render('{% javascript vapor.js %}') }
|
60
|
-
it { should be_empty }
|
62
|
+
it { should match "Liquid error: couldn't find file 'not-found.js'" }
|
61
63
|
end
|
62
64
|
end
|
63
65
|
|
@@ -67,14 +69,27 @@ module Jekyll::AssetsPlugin
|
|
67
69
|
it { should match(%r{^/assets/app-[a-f0-9]{32}\.css$}) }
|
68
70
|
end
|
69
71
|
|
70
|
-
context 'when <file> is not
|
71
|
-
subject { render('{% asset_path
|
72
|
-
it { should
|
72
|
+
context 'when <file> is not explicitly bundled, but required' do
|
73
|
+
subject { render('{% asset_path vapor.js %}') }
|
74
|
+
it { should match(%r{^/assets/vapor-[a-f0-9]{32}\.js$}) }
|
75
|
+
|
76
|
+
it "should be appended to the static files list" do
|
77
|
+
asset = context[:registers][:site].assets["vapor.js"]
|
78
|
+
|
79
|
+
context[:registers][:site].static_files.include?(asset).should be_true
|
80
|
+
end
|
81
|
+
|
82
|
+
it "should be bundled file automagically upon site#write" do
|
83
|
+
context[:registers][:site].cleanup
|
84
|
+
context[:registers][:site].write
|
85
|
+
|
86
|
+
File.exist?("#{fixtures_path.join '_site'}#{subject}").should be_true
|
87
|
+
end
|
73
88
|
end
|
74
89
|
|
75
|
-
context 'when <file> is not
|
76
|
-
subject { render('{% asset_path
|
77
|
-
it { should
|
90
|
+
context 'when <file> is not found' do
|
91
|
+
subject { render('{% asset_path not-found.js %}') }
|
92
|
+
it { should match "Liquid error: couldn't find file 'not-found.js'" }
|
78
93
|
end
|
79
94
|
|
80
95
|
context 'with baseurl given as /foobar/' do
|
@@ -92,7 +107,7 @@ module Jekyll::AssetsPlugin
|
|
92
107
|
|
93
108
|
context 'when <file> is not found' do
|
94
109
|
subject { render('{% asset_path not-found.js %}') }
|
95
|
-
it { should
|
110
|
+
it { should match "Liquid error: couldn't find file 'not-found.js'" }
|
96
111
|
end
|
97
112
|
end
|
98
113
|
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.
|
4
|
+
version: 0.2.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date: 2012-12-
|
14
|
+
date: 2012-12-28 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: jekyll
|
@@ -129,8 +129,6 @@ files:
|
|
129
129
|
- lib/jekyll/assets_plugin.rb
|
130
130
|
- lib/jekyll/assets_plugin/asset_file.rb
|
131
131
|
- lib/jekyll/assets_plugin/configuration.rb
|
132
|
-
- lib/jekyll/assets_plugin/generator.rb
|
133
|
-
- lib/jekyll/assets_plugin/logging.rb
|
134
132
|
- lib/jekyll/assets_plugin/site_patch.rb
|
135
133
|
- lib/jekyll/assets_plugin/tag.rb
|
136
134
|
- lib/jekyll/assets_plugin/version.rb
|
@@ -138,6 +136,7 @@ files:
|
|
138
136
|
- spec/fixtures/_assets/app.css.erb
|
139
137
|
- spec/fixtures/_assets/app.js
|
140
138
|
- spec/fixtures/_assets/noise.png
|
139
|
+
- spec/fixtures/_assets/should_fail.css.erb
|
141
140
|
- spec/fixtures/_assets/vapor.css
|
142
141
|
- spec/fixtures/_assets/vapor.js
|
143
142
|
- spec/fixtures/_config.yml
|
@@ -146,8 +145,6 @@ files:
|
|
146
145
|
- spec/fixtures/index.html
|
147
146
|
- spec/lib/jekyll/assets_plugin/asset_file_spec.rb
|
148
147
|
- spec/lib/jekyll/assets_plugin/configuration_spec.rb
|
149
|
-
- spec/lib/jekyll/assets_plugin/generator_spec.rb
|
150
|
-
- spec/lib/jekyll/assets_plugin/logging_spec.rb
|
151
148
|
- spec/lib/jekyll/assets_plugin/site_patch_spec.rb
|
152
149
|
- spec/lib/jekyll/assets_plugin/tag_spec.rb
|
153
150
|
- spec/spec_helper.rb
|
@@ -175,12 +172,13 @@ rubyforge_project:
|
|
175
172
|
rubygems_version: 1.8.23
|
176
173
|
signing_key:
|
177
174
|
specification_version: 3
|
178
|
-
summary: jekyll-assets-0.
|
175
|
+
summary: jekyll-assets-0.2.0
|
179
176
|
test_files:
|
180
177
|
- spec/fixtures/.gitignore
|
181
178
|
- spec/fixtures/_assets/app.css.erb
|
182
179
|
- spec/fixtures/_assets/app.js
|
183
180
|
- spec/fixtures/_assets/noise.png
|
181
|
+
- spec/fixtures/_assets/should_fail.css.erb
|
184
182
|
- spec/fixtures/_assets/vapor.css
|
185
183
|
- spec/fixtures/_assets/vapor.js
|
186
184
|
- spec/fixtures/_config.yml
|
@@ -189,8 +187,6 @@ test_files:
|
|
189
187
|
- spec/fixtures/index.html
|
190
188
|
- spec/lib/jekyll/assets_plugin/asset_file_spec.rb
|
191
189
|
- spec/lib/jekyll/assets_plugin/configuration_spec.rb
|
192
|
-
- spec/lib/jekyll/assets_plugin/generator_spec.rb
|
193
|
-
- spec/lib/jekyll/assets_plugin/logging_spec.rb
|
194
190
|
- spec/lib/jekyll/assets_plugin/site_patch_spec.rb
|
195
191
|
- spec/lib/jekyll/assets_plugin/tag_spec.rb
|
196
192
|
- spec/spec_helper.rb
|
@@ -1,26 +0,0 @@
|
|
1
|
-
# internal
|
2
|
-
require 'jekyll/assets_plugin/logging'
|
3
|
-
require 'jekyll/assets_plugin/asset_file'
|
4
|
-
|
5
|
-
|
6
|
-
module Jekyll
|
7
|
-
module AssetsPlugin
|
8
|
-
# Jekyll hook that bundles all files specified in `bundles` config
|
9
|
-
#
|
10
|
-
class Generator < ::Jekyll::Generator
|
11
|
-
include Logging
|
12
|
-
|
13
|
-
safe false
|
14
|
-
priority :low
|
15
|
-
|
16
|
-
def generate site
|
17
|
-
filenames = site.assets_config.bundle_filenames
|
18
|
-
site.assets.each_logical_path(filenames).each do |logical_path|
|
19
|
-
if asset = site.assets.find_asset(logical_path)
|
20
|
-
site.static_files << AssetFile.new(site, asset) if asset
|
21
|
-
end
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
@@ -1,12 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
module Jekyll::AssetsPlugin
|
5
|
-
describe Generator do
|
6
|
-
it 'should output bundled files only' do
|
7
|
-
files = []
|
8
|
-
@dest.join('assets').each_child(false, &files.method(:push))
|
9
|
-
files.map(&:to_s).should have(3).thing
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
require 'spec_helper'
|
2
|
-
|
3
|
-
|
4
|
-
module Jekyll::AssetsPlugin
|
5
|
-
describe Logging do
|
6
|
-
it 'puts strings with [AssetsPlugin] prefix' do
|
7
|
-
loggable = Class.new do
|
8
|
-
include Logging
|
9
|
-
# make sure #log is public
|
10
|
-
def log(*args) super; end
|
11
|
-
end.new
|
12
|
-
|
13
|
-
loggable.should_receive(:puts).with(match %r{^\[AssetsPlugin\]})
|
14
|
-
loggable.log :info, 'test'
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|