sprockets-svg 0.2.0 → 0.3.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.
- checksums.yaml +4 -4
- data/.travis.yml +2 -3
- data/Gemfile +4 -1
- data/lib/sprockets/svg.rb +9 -0
- data/lib/sprockets/svg/proxy_asset.rb +19 -12
- data/lib/sprockets/svg/sass_functions.rb +38 -0
- data/lib/sprockets/svg/version.rb +1 -1
- data/spec/app/app/assets/stylesheets/application.css.scss +4 -0
- data/spec/app/app/controllers/assets_controller.rb +2 -1
- data/spec/rails_spec.rb +43 -31
- data/spec/spec_helper.rb +0 -9
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b586a285d7659583918ac48a90a7e03ae09cbdbb
|
4
|
+
data.tar.gz: 5f582344fde414f8a5ec3005b7694e9b0a85bf58
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b2bef4d6f33651aa2cb7cfccc06ec89aac8a9b06d14794030b84fff2c0af408e396d7e6e59f1ba05dd4a1167de3027e93b7f74ab75289457330ecbc0db2e2b40
|
7
|
+
data.tar.gz: 7a1c248d2a2e82b125987c08f7c51c863d1119db9dfba072343191ce40f81b3a4fa8e8444f1825acba2e8973957734a04585b7723a08aecbf0a4abce17169352
|
data/.travis.yml
CHANGED
data/Gemfile
CHANGED
data/lib/sprockets/svg.rb
CHANGED
@@ -22,6 +22,14 @@ module Sprockets
|
|
22
22
|
svg.attribute('height') && svg.attribute('width')
|
23
23
|
end
|
24
24
|
|
25
|
+
def self.png_path(svg_path)
|
26
|
+
if svg_path =~ /^(.*)\-([0-9a-f]{32})\.svg$/
|
27
|
+
"#{$1}.svg-#{$2}.png"
|
28
|
+
else
|
29
|
+
"#{svg_path}.png"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
25
33
|
def install(assets)
|
26
34
|
assets.register_preprocessor 'image/svg+xml', :svg_min do |context, data|
|
27
35
|
Sprockets::Svg::Cleaner.process(data)
|
@@ -33,6 +41,7 @@ end
|
|
33
41
|
|
34
42
|
require_relative 'svg/cleaner'
|
35
43
|
require_relative 'svg/proxy_asset'
|
44
|
+
require_relative 'svg/sass_functions'
|
36
45
|
require_relative 'svg/server'
|
37
46
|
|
38
47
|
Sprockets::Environment.send(:include, Sprockets::Svg::Server)
|
@@ -7,13 +7,24 @@ module Sprockets
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def digest_path
|
10
|
-
png_path(@original_asset.digest_path)
|
10
|
+
::Sprockets::Svg.png_path(@original_asset.digest_path)
|
11
11
|
end
|
12
12
|
|
13
13
|
def logical_path
|
14
14
|
@original_asset.logical_path + '.png'
|
15
15
|
end
|
16
16
|
|
17
|
+
def length
|
18
|
+
# If length isn't already set we default to original asset length.
|
19
|
+
# It is most certainly wrong, but at least it will be bigger than the real size, so it is unlikely to create any issue.
|
20
|
+
# And most importantly it prevent useless on the fly compilation
|
21
|
+
@length || @original_asset.length
|
22
|
+
end
|
23
|
+
|
24
|
+
def content_type
|
25
|
+
'image/png'
|
26
|
+
end
|
27
|
+
|
17
28
|
def write_to(filename, options = {})
|
18
29
|
# Gzip contents if filename has '.gz'
|
19
30
|
options[:compress] ||= File.extname(filename) == '.gz'
|
@@ -50,6 +61,8 @@ module Sprockets
|
|
50
61
|
# Set mtime correctly
|
51
62
|
File.utime(mtime, mtime, filename)
|
52
63
|
|
64
|
+
@length = File.stat(filename).size
|
65
|
+
|
53
66
|
nil
|
54
67
|
ensure
|
55
68
|
# Ensure tmp file gets cleaned up
|
@@ -57,21 +70,15 @@ module Sprockets
|
|
57
70
|
end
|
58
71
|
|
59
72
|
def to_s
|
60
|
-
|
61
|
-
|
62
|
-
|
73
|
+
@source ||= begin
|
74
|
+
tmp_path = Tempfile.new(['png-cache', '.png']).path
|
75
|
+
write_to(tmp_path)
|
76
|
+
File.read(tmp_path)
|
77
|
+
end
|
63
78
|
end
|
64
79
|
|
65
80
|
private
|
66
81
|
|
67
|
-
def png_path(svg_path)
|
68
|
-
if svg_path =~ /^(.*)\-([0-9a-f]{32})\.svg$/
|
69
|
-
"#{$1}.svg-#{$2}.png"
|
70
|
-
else
|
71
|
-
"#{svg_path}.png"
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
82
|
def method_missing(name, *args, &block)
|
76
83
|
if @original_asset.respond_to?(name)
|
77
84
|
@original_asset.public_send(name, *args, &block)
|
@@ -0,0 +1,38 @@
|
|
1
|
+
module Sprockets
|
2
|
+
module Svg
|
3
|
+
module SassFunctions
|
4
|
+
|
5
|
+
def image_path(path)
|
6
|
+
Sass::Script::String.new(svg2png_image_path(path.value), :string)
|
7
|
+
end
|
8
|
+
|
9
|
+
def image_url(path)
|
10
|
+
Sass::Script::String.new("url(" + svg2png_image_path(path.value) + ")")
|
11
|
+
end
|
12
|
+
|
13
|
+
def svg2png_image_path(path)
|
14
|
+
convert = false
|
15
|
+
if path.ends_with?('.svg.png')
|
16
|
+
path = path.gsub(/\.png$/, '')
|
17
|
+
convert = true
|
18
|
+
end
|
19
|
+
|
20
|
+
url = sprockets_context.image_path(path)
|
21
|
+
convert ? ::Sprockets::Svg.png_path(url) : url
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
Sprockets::SassTemplate.class_eval do
|
29
|
+
|
30
|
+
def initialize_engine_with_png_conversion
|
31
|
+
initialize_engine_without_png_conversion
|
32
|
+
::Sass::Script::Functions.send :include, Sprockets::Svg::SassFunctions
|
33
|
+
end
|
34
|
+
|
35
|
+
alias_method :initialize_engine_without_png_conversion, :initialize_engine
|
36
|
+
alias_method :initialize_engine, :initialize_engine_with_png_conversion
|
37
|
+
|
38
|
+
end
|
data/spec/rails_spec.rb
CHANGED
@@ -7,24 +7,17 @@ require 'json'
|
|
7
7
|
COMPILED_ASSETS_PATH = File.expand_path('app/public/assets/', File.dirname(__FILE__))
|
8
8
|
ASSETS = Pathname.new(COMPILED_ASSETS_PATH)
|
9
9
|
|
10
|
-
describe '
|
11
|
-
before :each do
|
12
|
-
FileUtils.mkdir_p(COMPILED_ASSETS_PATH)
|
13
|
-
end
|
14
|
-
|
15
|
-
after :each do
|
16
|
-
FileUtils.rm_rf(COMPILED_ASSETS_PATH)
|
17
|
-
end
|
10
|
+
describe 'Sprockets::Svg' do
|
18
11
|
|
19
|
-
let(:svg_name) { 'facebook-
|
12
|
+
let(:svg_name) { 'facebook-213385e4d9304ef93b23578fc4c93440.svg' }
|
20
13
|
|
21
|
-
let(:png_name) { 'facebook.svg-
|
14
|
+
let(:png_name) { 'facebook.svg-213385e4d9304ef93b23578fc4c93440.png' }
|
22
15
|
|
23
16
|
let(:svg_path) { ASSETS.join(svg_name) }
|
24
17
|
|
25
18
|
let(:png_path) { ASSETS.join(png_name) }
|
26
19
|
|
27
|
-
let(:font_path) { ASSETS.join('fontawesome-webfont-
|
20
|
+
let(:font_path) { ASSETS.join('fontawesome-webfont-040e9dcf8f420c96cbb5f0985fe09185.svg') }
|
28
21
|
|
29
22
|
let(:svg_fingerprint) { Digest::MD5.hexdigest(svg_path.read) }
|
30
23
|
|
@@ -34,34 +27,53 @@ describe 'Rake task' do
|
|
34
27
|
|
35
28
|
let(:png_source) { png_path.read }
|
36
29
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
30
|
+
describe 'Rake task' do
|
31
|
+
before :each do
|
32
|
+
FileUtils.mkdir_p(COMPILED_ASSETS_PATH)
|
33
|
+
end
|
34
|
+
|
35
|
+
after :each do
|
36
|
+
FileUtils.rm_rf(COMPILED_ASSETS_PATH)
|
37
|
+
end
|
41
38
|
|
42
|
-
|
43
|
-
|
39
|
+
it "generate a PNG from the SVG source" do
|
40
|
+
output = `cd spec/app; bundle exec rake assets:precompile 2>&1`
|
41
|
+
puts output unless $?.success?
|
42
|
+
expect($?).to be_success
|
44
43
|
|
45
|
-
|
46
|
-
|
47
|
-
expect(png_source).to be_starts_with("\x89PNG\r\n")
|
44
|
+
expect(svg_path).to be_exist
|
45
|
+
expect(png_path).to be_exist
|
48
46
|
|
49
|
-
|
50
|
-
|
47
|
+
expect(svg_fingerprint).to be == '85385a2b8357015a4ae6d8ab782d5389'
|
48
|
+
# Metadata etc are kinda time dependant, so this assertion is the best I can do.
|
49
|
+
expect(png_source).to be_starts_with("\x89PNG\r\n")
|
51
50
|
|
52
|
-
|
51
|
+
expect(manifest['files'][svg_name]).to be_present
|
52
|
+
expect(manifest['files'][png_name]).to be_present
|
53
53
|
|
54
|
-
|
55
|
-
|
54
|
+
expect(manifest['assets']['facebook.svg.png']).to be == png_name
|
55
|
+
|
56
|
+
expect(font_path).to be_exist
|
57
|
+
expect(Dir[ASSETS.join('fontawesome-webfont-*.png')]).to be_empty
|
58
|
+
end
|
56
59
|
end
|
57
|
-
end
|
58
60
|
|
59
|
-
describe AssetsController, type: :controller do
|
61
|
+
describe AssetsController, type: :controller do
|
62
|
+
|
63
|
+
it 'rack' do
|
64
|
+
get :test, file: 'facebook.svg.png'
|
65
|
+
expect(response).to be_success
|
66
|
+
expect(response.body.force_encoding('utf-8')).to be_starts_with("\x89PNG\r\n".force_encoding('utf-8'))
|
67
|
+
expect(response.headers['Content-Type']).to be == 'image/png'
|
68
|
+
end
|
69
|
+
|
70
|
+
it 'compile scss' do
|
71
|
+
get :test, file: 'application.css'
|
72
|
+
expect(response).to be_success
|
73
|
+
expect(response.body).to include svg_name
|
74
|
+
expect(response.body).to include png_name
|
75
|
+
end
|
60
76
|
|
61
|
-
it 'rack' do
|
62
|
-
get :test, file: 'facebook.svg.png'
|
63
|
-
expect(response).to be_success
|
64
|
-
expect(response.body.force_encoding('utf-8')).to be_starts_with("\x89PNG\r\n")
|
65
77
|
end
|
66
78
|
|
67
79
|
end
|
data/spec/spec_helper.rb
CHANGED
@@ -4,15 +4,6 @@ require_relative 'app/config/environment'
|
|
4
4
|
require 'rspec/rails'
|
5
5
|
require_relative '../lib/sprockets-svg'
|
6
6
|
|
7
|
-
|
8
|
-
RSpec.configure do |c|
|
9
|
-
c.filter_run_excluding not_jruby: RUBY_PLATFORM == 'java'
|
10
|
-
end
|
11
|
-
|
12
|
-
|
13
7
|
RSpec.configure do |config|
|
14
|
-
config.treat_symbols_as_metadata_keys_with_true_values = true
|
15
|
-
config.run_all_when_everything_filtered = true
|
16
|
-
config.filter_run :focus
|
17
8
|
config.order = 'random'
|
18
9
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sprockets-svg
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean Boussier
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-07-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -85,12 +85,14 @@ files:
|
|
85
85
|
- lib/sprockets/svg/cleaner.rb
|
86
86
|
- lib/sprockets/svg/proxy_asset.rb
|
87
87
|
- lib/sprockets/svg/railtie.rb
|
88
|
+
- lib/sprockets/svg/sass_functions.rb
|
88
89
|
- lib/sprockets/svg/server.rb
|
89
90
|
- lib/sprockets/svg/version.rb
|
90
91
|
- spec/app/.gitignore
|
91
92
|
- spec/app/Rakefile
|
92
93
|
- spec/app/app/assets/fonts/fontawesome-webfont.svg
|
93
94
|
- spec/app/app/assets/images/facebook.svg
|
95
|
+
- spec/app/app/assets/stylesheets/application.css.scss
|
94
96
|
- spec/app/app/controllers/application_controller.rb
|
95
97
|
- spec/app/app/controllers/assets_controller.rb
|
96
98
|
- spec/app/config.ru
|
@@ -123,7 +125,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
125
|
version: '0'
|
124
126
|
requirements: []
|
125
127
|
rubyforge_project:
|
126
|
-
rubygems_version: 2.2.
|
128
|
+
rubygems_version: 2.2.2
|
127
129
|
signing_key:
|
128
130
|
specification_version: 4
|
129
131
|
summary: SVG toolchain for sprockets
|
@@ -132,6 +134,7 @@ test_files:
|
|
132
134
|
- spec/app/Rakefile
|
133
135
|
- spec/app/app/assets/fonts/fontawesome-webfont.svg
|
134
136
|
- spec/app/app/assets/images/facebook.svg
|
137
|
+
- spec/app/app/assets/stylesheets/application.css.scss
|
135
138
|
- spec/app/app/controllers/application_controller.rb
|
136
139
|
- spec/app/app/controllers/assets_controller.rb
|
137
140
|
- spec/app/config.ru
|