octopress-asset-pipeline 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +25 -0
  3. data/.travis.yml +5 -0
  4. data/CHANGELOG.md +7 -0
  5. data/Gemfile +4 -0
  6. data/LICENSE.txt +22 -0
  7. data/README.md +104 -0
  8. data/Rakefile +8 -0
  9. data/assets/docs/changelog.markdown +10 -0
  10. data/assets/docs/index.markdown +106 -0
  11. data/demo/Gemfile +8 -0
  12. data/demo/_config.yml +5 -0
  13. data/demo/_octopress.yml +2 -0
  14. data/demo/_sass/_partial.sass +1 -0
  15. data/demo/blah.js +1 -0
  16. data/demo/foo.coffee +3 -0
  17. data/demo/index.html +4 -0
  18. data/demo/sass-test.scss +5 -0
  19. data/demo/test.css +2 -0
  20. data/lib/octopress-asset-pipeline/assets/coffeescript.rb +23 -0
  21. data/lib/octopress-asset-pipeline/assets/css.rb +19 -0
  22. data/lib/octopress-asset-pipeline/assets/javascript.rb +12 -0
  23. data/lib/octopress-asset-pipeline/assets/local.rb +52 -0
  24. data/lib/octopress-asset-pipeline/assets/sass.rb +31 -0
  25. data/lib/octopress-asset-pipeline/version.rb +7 -0
  26. data/lib/octopress-asset-pipeline.rb +144 -0
  27. data/octopress-asset-pipeline.gemspec +26 -0
  28. data/test/Gemfile +8 -0
  29. data/test/_concat_false.yml +4 -0
  30. data/test/_config.yml +5 -0
  31. data/test/concat_false/blah.js +1 -0
  32. data/test/concat_false/foo.js +6 -0
  33. data/test/concat_false/index.html +2 -0
  34. data/test/concat_false/sass-test.css +2 -0
  35. data/test/concat_false/test.css +2 -0
  36. data/test/expected/index.html +2 -0
  37. data/test/expected/javascripts/all-.js +1 -0
  38. data/test/expected/stylesheets/all-.css +1 -0
  39. data/test/site/index.html +2 -0
  40. data/test/site/javascripts/all-.js +1 -0
  41. data/test/site/stylesheets/all-.css +1 -0
  42. data/test/source/_sass/_partial.sass +1 -0
  43. data/test/source/blah.js +1 -0
  44. data/test/source/foo.coffee +3 -0
  45. data/test/source/index.html +4 -0
  46. data/test/source/sass-test.scss +5 -0
  47. data/test/source/test.css +2 -0
  48. data/test/test.rb +14 -0
  49. data/test/test_suite.rb +160 -0
  50. metadata +172 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6109318c08d99e5cf10c768d12a28ed723ad0119
4
+ data.tar.gz: bde4e372ce2d8f5624cbf5bff3952a1bd859b79d
5
+ SHA512:
6
+ metadata.gz: 9be3958ab36d4761f49b00926a844d0cbed88e3bebf29cb288150c7d638e5455204ba51b52deb1208eb07e6e8b5d5804c9a305106f984d5562bb5afdfec038dc
7
+ data.tar.gz: 405f5be6958fdb36ec7806e2082065d2ef46abf5751e55dd5e41b2b32ba79bfba431ba05ae8faf8f353b6c1fc2897516ae46d239bf3c2304ecdcbd7379edee98
data/.gitignore ADDED
@@ -0,0 +1,25 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ mkmf.log
23
+ _site
24
+ .sass-cache
25
+ .DS_Store
data/.travis.yml ADDED
@@ -0,0 +1,5 @@
1
+ language: ruby
2
+ rvm:
3
+ - 2.0.0
4
+ - 1.9.3
5
+ script: cd test && bundle exec ruby test.rb
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # Changelog
2
+
3
+ ## Current version
4
+
5
+ ### 1.0.0 - 2014-05-25
6
+
7
+ - Initial release
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in octopress-ink-asset_pipeline.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2014 Brandon Mathis
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,104 @@
1
+ # Octopress Asset Pipeline
2
+
3
+ Combine and compress and fingerprint Stylesheets (CSS and Sass) and Javascripts (JS and Coffeescript) to a single fingerprinted .css or .js file.
4
+
5
+ **How it works:** This plugin will automatically search Jekyll's site index for .js, .coffee, .css, .scss and .sass
6
+ files and combine, compress and fingerprint them so they're ready for deployment. Then add the liquid tags to your site layout to write
7
+ the necessary script or link tags.
8
+
9
+ ## Installation
10
+
11
+ Add this line to your site's Gemfile:
12
+
13
+ gem 'octopress-asset-pipeline'
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it manually:
20
+
21
+ $ gem install octopress-asset-pipeline
22
+
23
+
24
+ ### Add gem to Jekyll
25
+
26
+ Add the gem to Jekyll's configuration file:
27
+
28
+ ```yaml
29
+ gems:
30
+ - octopress-asset-pipeline
31
+ ```
32
+
33
+ ## Liquid tags
34
+
35
+ Include these tags in your site's layout.
36
+
37
+ ```
38
+ {% css_asset_tag %}
39
+ {% js_asset_tag %}
40
+ ```
41
+
42
+ When Jekyll is compiled these will be replaced with something like this.
43
+
44
+ ```
45
+ <link href='/stylesheets/all-b5c56f2652600cde201589531c453ba1.css' media='all' rel='stylesheet' type='text/css'>
46
+ <script src='/javascripts/all-75489c7b2da6efce7ee1bc45795d400b.js'></script>
47
+ ```
48
+
49
+ ## Configuration
50
+
51
+ This plugin integrates with the core asset pipeline system in Octopress Ink, therefore
52
+ the configurations are set in the `_octopress.yml` configuration file.
53
+
54
+ | Option | Description | Default |
55
+ |:---------------------|:------------------------------------------|:------------|
56
+ | `combine_css` | Combine all .css, .scss and .sass files | true |
57
+ | `combine_js` | Combine all .js and .coffee files | true |
58
+ | `compress_css` | Compress stylesheets for production | true |
59
+ | `compress_js` | Compress Javascripts for production | true |
60
+ | `order_js` | Order for .js and .coffee files | [] |
61
+ | `order_css` | Order for .css, .scss, and .sass | [] |
62
+ | `uglifier` | Settings for Javascript Uglifier. [Documentaion](https://github.com/lautis/uglifier). | {} |
63
+
64
+ ### Ordering assets
65
+
66
+ By default when scripts and stylesheets are combined, they added based on
67
+ their order in the file system. You can manually specify order like this:
68
+
69
+ ```
70
+ order_js
71
+ - jquery.js
72
+ - kittens.coffee
73
+
74
+ order_css
75
+ - normalize.css
76
+ - site.sass
77
+ ```
78
+ Assets will ordered as specified. Any additional assets will be appended based on their order in the file system.
79
+
80
+ Note: It is not necessary to write full paths in these configurations. An asset at `javascripts/lib/jquery.js` will match `jquery.js` and be ordered accordingly.
81
+
82
+ ## Media files
83
+
84
+ Usually it's better to define print styles inside of the main CSS file beneath a print media query, like this.
85
+
86
+ ```
87
+ @media print {
88
+ * { background: none }
89
+ * { color: #000 }
90
+ ...
91
+ }
92
+ ```
93
+
94
+ If you want to specify a separate print stylesheet, include `@print` in your filename, before the extension.
95
+
96
+ When your site is compiled, this file will be written separately and its `<link>` tag will include a `media='print'` attribute.
97
+
98
+ ## Contributing
99
+
100
+ 1. Fork it ( https://github.com/[my-github-username]/octopress-asset-pipeline/fork )
101
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
102
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
103
+ 4. Push to the branch (`git push origin my-new-feature`)
104
+ 5. Create a new Pull Request
data/Rakefile ADDED
@@ -0,0 +1,8 @@
1
+ require "bundler/gem_tasks"
2
+ require "octopress-ink"
3
+
4
+ desc "Copy Readme and Changelog into docs"
5
+ task :update_docs do
6
+ Octopress::Ink.copy_doc 'README.md', 'assets/docs/index.markdown'
7
+ Octopress::Ink.copy_doc 'CHANGELOG.md', 'assets/docs/changelog.markdown', '/changelog/'
8
+ end
@@ -0,0 +1,10 @@
1
+ ---
2
+ title: "Changelog"
3
+ permalink: /changelog/
4
+ ---
5
+
6
+ ## Current version
7
+
8
+ ### 1.0.0 - 2014-05-25
9
+
10
+ - Initial release
@@ -0,0 +1,106 @@
1
+ ---
2
+ title: "Octopress Asset Pipeline"
3
+ ---
4
+
5
+ Combine and compress and fingerprint Stylesheets (CSS and Sass) and Javascripts (JS and Coffeescript) to a single fingerprinted .css or .js file.
6
+
7
+ **How it works:** This plugin will automatically search Jekyll's site index for .js, .coffee, .css, .scss and .sass
8
+ files and combine, compress and fingerprint them so they're ready for deployment. Then add the liquid tags to your site layout to write
9
+ the necessary script or link tags.
10
+
11
+ ## Installation
12
+
13
+ Add this line to your site's Gemfile:
14
+
15
+ gem 'octopress-asset-pipeline'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it manually:
22
+
23
+ $ gem install octopress-asset-pipeline
24
+
25
+
26
+ ### Add gem to Jekyll
27
+
28
+ Add the gem to Jekyll's configuration file:
29
+
30
+ ```yaml
31
+ gems:
32
+ - octopress-asset-pipeline
33
+ ```
34
+
35
+ ## Liquid tags
36
+
37
+ Include these tags in your site's layout.
38
+
39
+ ```
40
+ {% css_asset_tag %}
41
+ {% js_asset_tag %}
42
+ ```
43
+
44
+ When Jekyll is compiled these will be replaced with something like this.
45
+
46
+ ```
47
+ <link href='/stylesheets/all-b5c56f2652600cde201589531c453ba1.css' media='all' rel='stylesheet' type='text/css'>
48
+ <script src='/javascripts/all-75489c7b2da6efce7ee1bc45795d400b.js'></script>
49
+ ```
50
+
51
+ ## Configuration
52
+
53
+ This plugin integrates with the core asset pipeline system in Octopress Ink, therefore
54
+ the configurations are set in the `_octopress.yml` configuration file.
55
+
56
+ | Option | Description | Default |
57
+ |:---------------------|:------------------------------------------|:------------|
58
+ | `combine_css` | Combine all .css, .scss and .sass files | true |
59
+ | `combine_js` | Combine all .js and .coffee files | true |
60
+ | `compress_css` | Compress stylesheets for production | true |
61
+ | `compress_js` | Compress Javascripts for production | true |
62
+ | `order_js` | Order for .js and .coffee files | [] |
63
+ | `order_css` | Order for .css, .scss, and .sass | [] |
64
+ | `uglifier` | Settings for Javascript Uglifier. [Documentaion](https://github.com/lautis/uglifier). | {} |
65
+
66
+ ### Ordering assets
67
+
68
+ By default when scripts and stylesheets are combined, they added based on
69
+ their order in the file system. You can manually specify order like this:
70
+
71
+ ```
72
+ order_js
73
+ - jquery.js
74
+ - kittens.coffee
75
+
76
+ order_css
77
+ - normalize.css
78
+ - site.sass
79
+ ```
80
+ Assets will ordered as specified. Any additional assets will be appended based on their order in the file system.
81
+
82
+ Note: It is not necessary to write full paths in these configurations. An asset at `javascripts/lib/jquery.js` will match `jquery.js` and be ordered accordingly.
83
+
84
+ ## Media files
85
+
86
+ Usually it's better to define print styles inside of the main CSS file beneath a print media query, like this.
87
+
88
+ ```
89
+ @media print {
90
+ * { background: none }
91
+ * { color: #000 }
92
+ ...
93
+ }
94
+ ```
95
+
96
+ If you want to specify a separate print stylesheet, include `@print` in your filename, before the extension.
97
+
98
+ When your site is compiled, this file will be written separately and its `<link>` tag will include a `media='print'` attribute.
99
+
100
+ ## Contributing
101
+
102
+ 1. Fork it ( https://github.com/[my-github-username]/octopress-asset-pipeline/fork )
103
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
104
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
105
+ 4. Push to the branch (`git push origin my-new-feature`)
106
+ 5. Create a new Pull Request
data/demo/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ group :octopress do
4
+ gem 'octopress'
5
+ gem 'octopress-ink', path: '../../../ink'
6
+ gem 'octopress-asset-pipeline', path: '../'
7
+ gem 'pry-debugger'
8
+ end
data/demo/_config.yml ADDED
@@ -0,0 +1,5 @@
1
+ gems:
2
+ - octopress-asset-pipeline
3
+
4
+ exclude:
5
+ - Gemfile*
@@ -0,0 +1,2 @@
1
+ order_js:
2
+ - foo.coffee
@@ -0,0 +1 @@
1
+ $bg: black
data/demo/blah.js ADDED
@@ -0,0 +1 @@
1
+ console.log("Yo I'm a javascript")
data/demo/foo.coffee ADDED
@@ -0,0 +1,3 @@
1
+ ---
2
+ ---
3
+ console.log 'hi' unless false
data/demo/index.html ADDED
@@ -0,0 +1,4 @@
1
+ ---
2
+ ---
3
+ {% css_asset_tag %}
4
+ {% js_asset_tag %}
@@ -0,0 +1,5 @@
1
+ ---
2
+ file: partial
3
+ ---
4
+ @import "{{ page.file }}";
5
+ body { background: $bg; }
data/demo/test.css ADDED
@@ -0,0 +1,2 @@
1
+ body {
2
+ color: #444; }
@@ -0,0 +1,23 @@
1
+ module Octopress
2
+ module Ink
3
+ module Assets
4
+ class LocalCoffeeScriptAsset < LocalJavaScriptAsset
5
+ def read
6
+ compile
7
+ end
8
+
9
+ def path
10
+ File.join(file.site.source, file.path)
11
+ end
12
+
13
+ def compile
14
+ ::CoffeeScript.compile(render_page)
15
+ end
16
+
17
+ def destination
18
+ File.join(base, filename.sub(/\.coffee/,'.js'))
19
+ end
20
+ end
21
+ end
22
+ end
23
+ end
@@ -0,0 +1,19 @@
1
+ module Octopress
2
+ module Ink
3
+ module Assets
4
+ class LocalCssAsset < LocalAsset
5
+ def media
6
+ path.scan(/@(.+?)\./).flatten[0] || 'all'
7
+ end
8
+
9
+ def destination
10
+ File.join(base, filename.sub(/@(.+?)\./,'.'))
11
+ end
12
+
13
+ def tag
14
+ "<link href='#{Filters.expand_url(File.join(destination))}' media='#{media}' rel='stylesheet' type='text/css'>"
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,12 @@
1
+ module Octopress
2
+ module Ink
3
+ module Assets
4
+ class LocalJavaScriptAsset < LocalAsset
5
+ def tag
6
+ "<script src='#{Filters.expand_url(destination)}'></script>"
7
+ end
8
+ end
9
+ end
10
+ end
11
+ end
12
+
@@ -0,0 +1,52 @@
1
+ module Octopress
2
+ module Ink
3
+ module Assets
4
+ class LocalAsset < Asset
5
+ def initialize(plugin, file)
6
+ @plugin = plugin
7
+ @file = file
8
+ end
9
+
10
+ def info
11
+ message = filename.ljust(35)
12
+ message += "from: #{base}"
13
+ " - #{message}"
14
+ end
15
+
16
+ def filename
17
+ File.basename(path)
18
+ end
19
+
20
+ def base
21
+ file.relative_path.sub(filename,'').sub(/^\/(.+)\/$/,'\1')
22
+ end
23
+
24
+ def destination
25
+ File.join(base, filename)
26
+ end
27
+
28
+ def path
29
+ file.path
30
+ end
31
+
32
+ def read
33
+ File.open(path).read
34
+ end
35
+
36
+ # Copy is unncessary with local assets
37
+ #
38
+ def copy(target_dir); end
39
+
40
+ private
41
+
42
+ def render_page
43
+ payload = Ink.site.site_payload
44
+ payload['page'] = file.data
45
+
46
+ render_liquid(file.content, payload)
47
+ end
48
+
49
+ end
50
+ end
51
+ end
52
+ end
@@ -0,0 +1,31 @@
1
+ module Octopress
2
+ module Ink
3
+ module Assets
4
+ class LocalSassAsset < LocalCssAsset
5
+ def read
6
+ compile
7
+ end
8
+
9
+ def content
10
+ render_page
11
+ end
12
+
13
+ def ext
14
+ file.ext
15
+ end
16
+
17
+ def path
18
+ File.join(file.site.source, file.path)
19
+ end
20
+
21
+ def destination
22
+ File.join(base, filename.sub(/@(.+?)\./,'.').sub(/s.ss/, 'css'))
23
+ end
24
+
25
+ def compile
26
+ PluginAssetPipeline.compile_sass(self)
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,7 @@
1
+ module Octopress
2
+ module Ink
3
+ module LocalAssetPipeline
4
+ VERSION = "1.0.0"
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,144 @@
1
+ require 'octopress-ink'
2
+ require 'octopress-asset-pipeline/version'
3
+
4
+ require 'octopress-asset-pipeline/assets/local'
5
+ require 'octopress-asset-pipeline/assets/css'
6
+ require 'octopress-asset-pipeline/assets/sass'
7
+ require 'octopress-asset-pipeline/assets/javascript'
8
+ require 'octopress-asset-pipeline/assets/coffeescript'
9
+
10
+ module Octopress
11
+ module Ink
12
+ module AssetPipeline
13
+ class Plugin < Ink::Plugin
14
+ def configuration
15
+ {
16
+ name: "Octopress Asset Pipeline",
17
+ slug: "octopress-asset-pipeline",
18
+ assets_path: File.expand_path(File.join(File.dirname(__FILE__), "../../../assets")),
19
+ type: "plugin",
20
+ version: Octopress::Ink::LocalAssetPipeline::VERSION,
21
+ description: "Combine and compress CSS and Sass, Javascript and Coffeescript to a single fingerprinted file.",
22
+ website: "https://github.com/octopress/asset-pipeline",
23
+ local: true
24
+ }
25
+ end
26
+
27
+ def register
28
+ @config ||= Ink.config
29
+ # Tell Jekyll to read static files and pages
30
+ # This is necessary when Jekyll isn't being asked to build a site,
31
+ # like when a user runs the list command to list assets
32
+ #
33
+ if Ink.site.pages.empty? && Ink.site.posts.empty?
34
+ Ink.site.read_directories
35
+ end
36
+
37
+ add_stylesheets
38
+ add_javascripts
39
+ end
40
+
41
+ # Return stylesheets to be combined in the asset pipeline
42
+ def stylesheets
43
+ sort(@css.clone.concat(@sass), @config['order_css'] || [])
44
+ end
45
+
46
+ def javascripts
47
+ sort(@js.clone.concat(@coffee), @config['order_js'] || [])
48
+ end
49
+
50
+ private
51
+
52
+ def combine_js
53
+ @config['combine_js']
54
+ end
55
+
56
+ def combine_css
57
+ @config['combine_css']
58
+ end
59
+
60
+ def add_stylesheets
61
+ add_css
62
+ add_sass
63
+
64
+ if !combine_css
65
+ # Add tags for {% js_asset_tag %}
66
+ stylesheets.each { |f| Plugins.add_css_tag(f.tag) }
67
+ @css.clear
68
+ @sass.clear
69
+ end
70
+
71
+ end
72
+
73
+ def add_javascripts
74
+ add_js
75
+ add_coffee
76
+
77
+ if !combine_js
78
+ # Add tags for {% js_asset_tag %}
79
+ javascripts.each { |f| Plugins.add_js_tag(f.tag) }
80
+ @js.clear
81
+ @coffee.clear
82
+ end
83
+ end
84
+
85
+ def sort(files, config)
86
+ sorted = []
87
+ config.each do |item|
88
+ files.each do |file|
89
+ sorted << files.delete(file) if file.path.include? item
90
+ end
91
+ end
92
+
93
+ sorted.concat files
94
+ end
95
+
96
+ # Finds all Sass files registered by Jekyll
97
+ #
98
+ def add_sass
99
+ Ink.site.pages.each do |f|
100
+ if f.ext =~ /\.s[ca]ss/
101
+ @sass << Assets::LocalSassAsset.new(self, f)
102
+ Ink.site.pages.delete(f) if combine_css
103
+ end
104
+ end
105
+ end
106
+
107
+ # Finds all CSS files registered by Jekyll
108
+ #
109
+ def add_css
110
+ Ink.site.static_files.each do |f|
111
+ if f.path =~ /\.css$/
112
+ @css << Assets::LocalCssAsset.new(self, f)
113
+ Ink.site.static_files.delete(f) if combine_css
114
+ end
115
+ end
116
+ end
117
+
118
+ # Finds all Coffeescript files registered by Jekyll
119
+ #
120
+ def add_coffee
121
+ Ink.site.pages.each do |f|
122
+ if f.ext =~ /\.coffee$/
123
+ @coffee << Assets::LocalCoffeeScriptAsset.new(self, f)
124
+ Ink.site.pages.delete(f) if combine_js
125
+ end
126
+ end
127
+ end
128
+
129
+ # Finds all Javascript files registered by Jekyll
130
+ #
131
+ def add_js
132
+ Ink.site.static_files.each do |f|
133
+ if f.path =~ /\.js$/
134
+ @js << Assets::LocalJavaScriptAsset.new(self, f)
135
+ Ink.site.static_files.delete(f) if combine_js
136
+ end
137
+ end
138
+ end
139
+ end
140
+ end
141
+ end
142
+ end
143
+
144
+ Octopress::Ink.register_plugin(Octopress::Ink::AssetPipeline::Plugin)
@@ -0,0 +1,26 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'octopress-asset-pipeline/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "octopress-asset-pipeline"
8
+ spec.version = Octopress::Ink::LocalAssetPipeline::VERSION
9
+ spec.authors = ["Brandon Mathis"]
10
+ spec.email = ["brandon@imathis.com"]
11
+ spec.summary = %q{Combine and compress CSS and Sass, Javascript and Coffeescript to a single fingerprinted file.}
12
+ spec.description = %q{Combine and compress CSS and Sass, Javascript and Coffeescript to a single fingerprinted file.}
13
+ spec.homepage = "https://github.com/octopress/asset-pipeline"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files -z`.split("\x0")
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.6"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "octopress"
24
+
25
+ spec.add_runtime_dependency "octopress-ink", "~> 1.0.0.rc.1"
26
+ end
data/test/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ group :octopress do
4
+ gem 'octopress'
5
+ gem 'octopress-ink', path: '../../ink'
6
+ gem 'octopress-asset-pipeline', path: '../'
7
+ gem 'pry-debugger'
8
+ end
@@ -0,0 +1,4 @@
1
+ order_js:
2
+ - foo.coffee
3
+ combine_js: false
4
+ combine_css: false
data/test/_config.yml ADDED
@@ -0,0 +1,5 @@
1
+ gems:
2
+ - octopress-asset-pipeline
3
+
4
+ source: source
5
+ destination: site
@@ -0,0 +1 @@
1
+ console.log("Yo I'm a javascript")
@@ -0,0 +1,6 @@
1
+ (function() {
2
+ if (!false) {
3
+ console.log('hi');
4
+ }
5
+
6
+ }).call(this);
@@ -0,0 +1,2 @@
1
+ <script src='/foo.js'></script><script src='/blah.js'></script>
2
+ <link href='/test.css' media='all' rel='stylesheet' type='text/css'><link href='/css-test.scss' media='all' rel='stylesheet' type='text/css'>
@@ -0,0 +1,2 @@
1
+ body {
2
+ background: black; }
@@ -0,0 +1,2 @@
1
+ body {
2
+ color: #444; }
@@ -0,0 +1,2 @@
1
+ <script src='/javascripts/all-.js'></script>
2
+ <link href='/stylesheets/all-.css' media='all' rel='stylesheet' type='text/css'>
@@ -0,0 +1 @@
1
+ console.log("Yo I'm a javascript")(function(){console.log("hi")}).call(this);
@@ -0,0 +1 @@
1
+ body{color:#444}body{background:black}
@@ -0,0 +1,2 @@
1
+ <script src='/javascripts/all-.js'></script>
2
+ <link href='/stylesheets/all-.css' media='all' rel='stylesheet' type='text/css'>
@@ -0,0 +1 @@
1
+ console.log("Yo I'm a javascript")(function(){console.log("hi")}).call(this);
@@ -0,0 +1 @@
1
+ body{color:#444}body{background:black}
@@ -0,0 +1 @@
1
+ $bg: black
@@ -0,0 +1 @@
1
+ console.log("Yo I'm a javascript")
@@ -0,0 +1,3 @@
1
+ ---
2
+ ---
3
+ console.log 'hi' unless false
@@ -0,0 +1,4 @@
1
+ ---
2
+ ---
3
+ {% css_asset_tag %}
4
+ {% js_asset_tag %}
@@ -0,0 +1,5 @@
1
+ ---
2
+ file: partial
3
+ ---
4
+ @import "{{ page.file }}";
5
+ body { background: $bg; }
@@ -0,0 +1,2 @@
1
+ body {
2
+ color: #444; }
data/test/test.rb ADDED
@@ -0,0 +1,14 @@
1
+ require './test_suite'
2
+ ENV['JEKYLL_ENV'] = 'test'
3
+
4
+ @failures = []
5
+
6
+ build
7
+
8
+ test_dirs('Site build', 'site', 'expected')
9
+
10
+ #build({:octopress_config => '_concat_false.yml'})
11
+
12
+ #test_dirs('Site build', 'site', 'concat_false')
13
+
14
+ print_results
@@ -0,0 +1,160 @@
1
+ require 'colorator'
2
+ require 'find'
3
+
4
+ # This is a makeshift integration test-suite.
5
+ # It is unapologetically pragmatic.
6
+
7
+
8
+ # Build Jekyll
9
+ #
10
+ def build(options={})
11
+ if options[:octopress_config]
12
+ FileUtils.cp options[:octopress_config], '_octopress.yml'
13
+ end
14
+
15
+ config = ['_config.yml'] << options[:config]
16
+ cmd = "rm -rf site && bundle exec jekyll build --config #{config.join(',')}"
17
+
18
+ `#{cmd}`
19
+ `rm _octopress.yml` if options[:octopress_config]
20
+ end
21
+
22
+
23
+ # Find all files in a given directory
24
+ #
25
+ def dir_files(dir)
26
+ Find.find(dir).to_a.reject!{|f| File.directory?(f) }
27
+ end
28
+
29
+ # Recursively diff two directories
30
+ #
31
+ # This will walk through dir1 and diff matching paths in dir2
32
+ #
33
+ def test_dirs(desc, dir1, dir2)
34
+
35
+ test_missing_files(desc, dir1, dir2)
36
+
37
+ dir_files(dir1).each do |file|
38
+ file2 = file.sub(dir1, dir2)
39
+ if File.exist?(file2)
40
+ if diff = diff_file(file, file2)
41
+ @failures << {
42
+ desc: "#{desc}\nDiff of file: #{file.sub(dir1+'/', '')}\n",
43
+ result: format_diff(diff)
44
+ }
45
+ pout 'F'.red
46
+ else
47
+ pout '.'.green
48
+ end
49
+ end
50
+ end
51
+ end
52
+
53
+ def format_diff(diff)
54
+ "#{diff.gsub(/\A.+?\n/,'').gsub(/^[^><].+/,'---').gsub(/^>.+/){|m|
55
+ m.green
56
+ }.gsub(/^(<.+?)$/){ |m|
57
+ m.red
58
+ }}"
59
+ end
60
+
61
+ # List differences between files in two directories
62
+ #
63
+ def test_missing_files(desc, dir1, dir2)
64
+ files1 = dir_files(dir1).map {|f| f.sub(dir1,'') }
65
+ files2 = dir_files(dir2).map {|f| f.sub(dir2,'') }
66
+
67
+ missing = []
68
+
69
+ (files2 - files1).each do |file|
70
+ missing << File.join(dir1, file)
71
+ end
72
+
73
+ (files1 - files2).each do |file|
74
+ missing << File.join(dir2, file)
75
+ end
76
+
77
+ if !missing.empty?
78
+ @failures << {
79
+ desc: "#{desc}\nMissing files:\n",
80
+ result: " - " + missing.join("\n - ")
81
+ }
82
+
83
+ pout 'F'.red
84
+ else
85
+ pout '.'.green
86
+ end
87
+ end
88
+
89
+ # Diff two files
90
+ #
91
+ def diff_file(file1, file2)
92
+ diff = `diff #{file1} #{file2}`
93
+ if diff.size > 0
94
+ diff
95
+ else
96
+ false
97
+ end
98
+ end
99
+
100
+ # Test command output
101
+ #
102
+ # Input: options hash, format:
103
+ # {
104
+ # desc: description of task
105
+ # cmd: system command to be run, (String or Array)
106
+ # expect: expected output from command
107
+ # }
108
+ #
109
+ def test_cmd(options)
110
+ if cmd = options[:cmd]
111
+ cmd = [cmd] unless cmd.is_a? Array
112
+
113
+ # In debug mode command output is printed
114
+ #
115
+ if options[:debug]
116
+ system cmd.join('; ')
117
+ else
118
+ output = `#{cmd.join('; ')}`.gsub(/#{Dir.pwd}\/*/,'').strip
119
+
120
+ # Remove character color codes
121
+ output = output.gsub("\e",'').gsub(/\[\d+m/,'').gsub("\[0m",'')
122
+ end
123
+ if options[:expect] && options[:expect].strip == output
124
+ pout '.'.green
125
+ else
126
+ pout 'F'.red
127
+ @failures << {
128
+ desc: options[:desc]+"\n",
129
+ result: <<-HERE
130
+ expected: #{(options[:expect] || '').strip.green}
131
+ result: #{(output || '').strip.red}
132
+ HERE
133
+ }
134
+ end
135
+ end
136
+ end
137
+
138
+
139
+ # Print a single character without a newline
140
+ #
141
+ def pout(str)
142
+ print str
143
+ $stdout.flush
144
+ end
145
+
146
+ # Ouptut nicely formatted failure messages
147
+ #
148
+ def print_results
149
+ if !@failures.empty?
150
+ @failures.each do |test|
151
+ pout "\nFailed: #{test[:desc]}"
152
+ puts test[:result]
153
+ # print a newline for easier reading
154
+ puts ""
155
+ end
156
+ abort
157
+ else
158
+ puts "All passed!".green
159
+ end
160
+ end
metadata ADDED
@@ -0,0 +1,172 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: octopress-asset-pipeline
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Brandon Mathis
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2014-05-25 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.6'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.6'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: octopress
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: octopress-ink
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: 1.0.0.rc.1
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: 1.0.0.rc.1
69
+ description: Combine and compress CSS and Sass, Javascript and Coffeescript to a single
70
+ fingerprinted file.
71
+ email:
72
+ - brandon@imathis.com
73
+ executables: []
74
+ extensions: []
75
+ extra_rdoc_files: []
76
+ files:
77
+ - ".gitignore"
78
+ - ".travis.yml"
79
+ - CHANGELOG.md
80
+ - Gemfile
81
+ - LICENSE.txt
82
+ - README.md
83
+ - Rakefile
84
+ - assets/docs/changelog.markdown
85
+ - assets/docs/index.markdown
86
+ - demo/Gemfile
87
+ - demo/_config.yml
88
+ - demo/_octopress.yml
89
+ - demo/_sass/_partial.sass
90
+ - demo/blah.js
91
+ - demo/foo.coffee
92
+ - demo/index.html
93
+ - demo/sass-test.scss
94
+ - demo/test.css
95
+ - lib/octopress-asset-pipeline.rb
96
+ - lib/octopress-asset-pipeline/assets/coffeescript.rb
97
+ - lib/octopress-asset-pipeline/assets/css.rb
98
+ - lib/octopress-asset-pipeline/assets/javascript.rb
99
+ - lib/octopress-asset-pipeline/assets/local.rb
100
+ - lib/octopress-asset-pipeline/assets/sass.rb
101
+ - lib/octopress-asset-pipeline/version.rb
102
+ - octopress-asset-pipeline.gemspec
103
+ - test/Gemfile
104
+ - test/_concat_false.yml
105
+ - test/_config.yml
106
+ - test/concat_false/blah.js
107
+ - test/concat_false/foo.js
108
+ - test/concat_false/index.html
109
+ - test/concat_false/sass-test.css
110
+ - test/concat_false/test.css
111
+ - test/expected/index.html
112
+ - test/expected/javascripts/all-.js
113
+ - test/expected/stylesheets/all-.css
114
+ - test/site/index.html
115
+ - test/site/javascripts/all-.js
116
+ - test/site/stylesheets/all-.css
117
+ - test/source/_sass/_partial.sass
118
+ - test/source/blah.js
119
+ - test/source/foo.coffee
120
+ - test/source/index.html
121
+ - test/source/sass-test.scss
122
+ - test/source/test.css
123
+ - test/test.rb
124
+ - test/test_suite.rb
125
+ homepage: https://github.com/octopress/asset-pipeline
126
+ licenses:
127
+ - MIT
128
+ metadata: {}
129
+ post_install_message:
130
+ rdoc_options: []
131
+ require_paths:
132
+ - lib
133
+ required_ruby_version: !ruby/object:Gem::Requirement
134
+ requirements:
135
+ - - ">="
136
+ - !ruby/object:Gem::Version
137
+ version: '0'
138
+ required_rubygems_version: !ruby/object:Gem::Requirement
139
+ requirements:
140
+ - - ">="
141
+ - !ruby/object:Gem::Version
142
+ version: '0'
143
+ requirements: []
144
+ rubyforge_project:
145
+ rubygems_version: 2.2.2
146
+ signing_key:
147
+ specification_version: 4
148
+ summary: Combine and compress CSS and Sass, Javascript and Coffeescript to a single
149
+ fingerprinted file.
150
+ test_files:
151
+ - test/Gemfile
152
+ - test/_concat_false.yml
153
+ - test/_config.yml
154
+ - test/concat_false/blah.js
155
+ - test/concat_false/foo.js
156
+ - test/concat_false/index.html
157
+ - test/concat_false/sass-test.css
158
+ - test/concat_false/test.css
159
+ - test/expected/index.html
160
+ - test/expected/javascripts/all-.js
161
+ - test/expected/stylesheets/all-.css
162
+ - test/site/index.html
163
+ - test/site/javascripts/all-.js
164
+ - test/site/stylesheets/all-.css
165
+ - test/source/_sass/_partial.sass
166
+ - test/source/blah.js
167
+ - test/source/foo.coffee
168
+ - test/source/index.html
169
+ - test/source/sass-test.scss
170
+ - test/source/test.css
171
+ - test/test.rb
172
+ - test/test_suite.rb