sprockets-svg 0.4.2 → 1.0.0.beta1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a1d0b1f522eaf1ac2f387b14122706132b0cf0b3
4
- data.tar.gz: 029dae652ab761ab8191d97d10a03226c893ceb2
3
+ metadata.gz: 53db6df6150544cc5980d807795150e37467ef64
4
+ data.tar.gz: c6617061fa6ba299513e78879557320b0ce87dfe
5
5
  SHA512:
6
- metadata.gz: 7c5b95750b1821fc93e4ab829249c8f2d736a87300b17095d64c2b085f3cbcb56a419144961a9958758b51b43e8d3346ce8260dab7ced10d1f2b15769baee9de
7
- data.tar.gz: ce0c58a163e0ea056da210f9f98e23d660ec8fb36c3197e717094a34a0be49999555b48d1303c7c2f233e523cb2ca1a042a2b255ff257dba44f20df5f5c214ee
6
+ metadata.gz: 2ef4008781a13823cc905fff0bb1e4ff084ac70721abe720fa5d7a4a7dabe19ff063c9aa43378101bb62e6e8e898e1028a651b6d547283734a935625b20a6997
7
+ data.tar.gz: 749fb5253184279f9b1af415447988079f841ea42e90f32c63952a5d4c93abb1a3aac025abf7c6a873fb6a88e8e90bf6377a1a0d4ab4d2ebab7c06f09c8894dd
data/Gemfile CHANGED
@@ -8,6 +8,7 @@ gem 'rspec'
8
8
  gem 'rspec-rails'
9
9
  gem 'sass-rails'
10
10
  gem 'rails'
11
+ gem 'sprockets-rails', '>= 3.0.0.beta2'
11
12
 
12
13
  if RUBY_VERSION >= '2'
13
14
  gem 'byebug'
data/lib/sprockets/svg.rb CHANGED
@@ -1,6 +1,5 @@
1
1
  require 'sprockets/svg/version'
2
2
 
3
- require 'nokogiri'
4
3
  require 'rmagick'
5
4
 
6
5
  module Sprockets
@@ -9,42 +8,26 @@ module Sprockets
9
8
 
10
9
  # TODO: integrate svgo instead: https://github.com/svg/svgo
11
10
  # See https://github.com/lautis/uglifier on how to integrate a npm package as a gem.
12
- def self.convert(svg_path, png_path)
13
- image = Magick::ImageList.new(svg_path)
14
- image.write(png_path)
15
- end
16
-
17
- def self.image?(path)
18
- return false unless path.ends_with?('.svg')
19
-
20
- document = Nokogiri::XML(File.read(path))
21
- svg = document.css('svg')
22
- svg.attribute('height') && svg.attribute('width')
23
- end
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
11
+ def self.convert(svg_blob)
12
+ image_list = Magick::Image.from_blob(svg_blob) { self.format = 'SVG' }
13
+ image = image_list.first
14
+ image.format = 'PNG'
15
+ image.to_blob
31
16
  end
32
17
 
33
18
  def install(assets)
34
19
  assets.register_preprocessor 'image/svg+xml', :svg_min do |context, data|
35
20
  Sprockets::Svg::Cleaner.process(data)
36
21
  end
22
+
23
+ assets.register_transformer 'image/svg+xml', 'image/png', -> (input) {
24
+ Sprockets::Svg.convert(input[:data])
25
+ }
37
26
  end
38
27
 
39
28
  end
40
29
  end
41
30
 
42
31
  require_relative 'svg/cleaner'
43
- require_relative 'svg/proxy_asset'
44
- require_relative 'svg/sass_functions'
45
- require_relative 'svg/server'
46
-
47
- Sprockets::Environment.send(:include, Sprockets::Svg::Server)
48
- Sprockets::Index.send(:include, Sprockets::Svg::Server)
49
32
 
50
33
  require_relative 'svg/railtie' if defined?(Rails)
@@ -3,10 +3,12 @@ begin
3
3
 
4
4
  module Sprockets::Svg
5
5
  class Railtie < ::Rails::Railtie
6
- initializer :setup_sprockets_svg, group: :all do |app|
7
- Sprockets::Svg.install(app.assets)
6
+ initializer :setup_sprockets_svg do
7
+ config.assets.configure do |env|
8
+ Sprockets::Svg.install(env)
9
+ end
8
10
  end
9
11
  end
10
12
  end
11
13
  rescue LoadError
12
- end
14
+ end
@@ -1,5 +1,5 @@
1
1
  module Sprockets
2
2
  module Svg
3
- VERSION = '0.4.2'
3
+ VERSION = '1.0.0.beta1'
4
4
  end
5
5
  end
@@ -1,4 +1,4 @@
1
1
  .facebook-icon {
2
- background-image: image-url('facebook.svg.png');
2
+ background-image: image-url('facebook.png');
3
3
  background-image: image-url('facebook.svg'), none;
4
4
  }
@@ -1,7 +1,9 @@
1
1
  App::Application.configure do
2
+ config.cache_store = :memory_store
3
+ config.assets.configure { |env| env.cache = Rails.cache }
2
4
  config.assets.digest = true
3
5
  config.cache_classes = true
4
- config.serve_static_assets = true
6
+ config.serve_static_files = true
5
7
  config.static_cache_control = "public, max-age=3600"
6
8
  config.eager_load = false
7
9
  config.consider_all_requests_local = true
data/spec/rails_spec.rb CHANGED
@@ -9,19 +9,19 @@ ASSETS = Pathname.new(COMPILED_ASSETS_PATH)
9
9
 
10
10
  describe 'Sprockets::Svg' do
11
11
 
12
- let(:svg_name) { 'facebook-83a94368b23ba9e928820abc2cc12254.svg' }
12
+ let(:svg_name) { manifest['assets']['facebook.svg'] }
13
13
 
14
- let(:png_name) { 'facebook.svg-83a94368b23ba9e928820abc2cc12254.png' }
14
+ let(:png_name) { manifest['assets']['facebook.png'] }
15
15
 
16
16
  let(:svg_path) { ASSETS.join(svg_name) }
17
17
 
18
18
  let(:png_path) { ASSETS.join(png_name) }
19
19
 
20
- let(:font_path) { ASSETS.join('fontawesome-webfont-be512ff93d0957609a535f25f438ac42.svg') }
20
+ let(:font_path) { ASSETS.join('fontawesome-webfont-62b810b30c0775c7680f56a9d411feb0b239a24aa33afcdda468c4686eeee9bb.svg') }
21
21
 
22
22
  let(:svg_fingerprint) { Digest::MD5.hexdigest(svg_path.read) }
23
23
 
24
- let(:manifest_path) { Dir[ASSETS.join('manifest-*.json')].first }
24
+ let(:manifest_path) { Dir[ASSETS.join('.sprockets-manifest-*.json')].first }
25
25
 
26
26
  let(:manifest) { JSON.parse(File.read(manifest_path)) }
27
27
 
@@ -41,6 +41,9 @@ describe 'Sprockets::Svg' do
41
41
  puts output unless $?.success?
42
42
  expect($?).to be_success
43
43
 
44
+ expect(svg_name).not_to be_nil
45
+ expect(png_name).not_to be_nil
46
+
44
47
  expect(svg_path).to be_exist
45
48
  expect(png_path).to be_exist
46
49
 
@@ -51,7 +54,7 @@ describe 'Sprockets::Svg' do
51
54
  expect(manifest['files'][svg_name]).to be_present
52
55
  expect(manifest['files'][png_name]).to be_present
53
56
 
54
- expect(manifest['assets']['facebook.svg.png']).to be == png_name
57
+ expect(manifest['assets']['facebook.png']).to be == png_name
55
58
 
56
59
  expect(font_path).to be_exist
57
60
  expect(Dir[ASSETS.join('fontawesome-webfont-*.png')]).to be_empty
@@ -61,7 +64,7 @@ describe 'Sprockets::Svg' do
61
64
  describe AssetsController, type: :controller do
62
65
 
63
66
  it 'rack' do
64
- get :test, file: 'facebook.svg.png'
67
+ get :test, file: 'facebook.png'
65
68
  expect(response).to be_success
66
69
  expect(response.body.force_encoding('utf-8')).to be_starts_with("\x89PNG\r\n".force_encoding('utf-8'))
67
70
  expect(response.headers['Content-Type']).to be == 'image/png'
@@ -70,8 +73,8 @@ describe 'Sprockets::Svg' do
70
73
  it 'compile scss' do
71
74
  get :test, file: 'application.css'
72
75
  expect(response).to be_success
73
- expect(response.body).to include svg_name
74
- expect(response.body).to include png_name
76
+ expect(response.body).to match %r{url\(/assets/facebook-\w+\.svg\)}
77
+ expect(response.body).to match %r{url\(/assets/facebook-\w+\.png\)}
75
78
  end
76
79
 
77
80
  end
@@ -19,7 +19,7 @@ Gem::Specification.new do |spec|
19
19
  spec.require_paths = ['lib']
20
20
 
21
21
  spec.add_development_dependency 'bundler', '~> 1.5'
22
- spec.add_dependency 'sprockets'
22
+ spec.add_dependency 'sprockets', '>= 3'
23
23
  spec.add_dependency 'nokogiri'
24
24
  spec.add_dependency 'rmagick'
25
25
  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.2
4
+ version: 1.0.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jean Boussier
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-04-28 00:00:00.000000000 Z
11
+ date: 2015-08-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -30,14 +30,14 @@ dependencies:
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0'
33
+ version: '3'
34
34
  type: :runtime
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '0'
40
+ version: '3'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: nokogiri
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -83,10 +83,7 @@ files:
83
83
  - lib/sprockets-svg.rb
84
84
  - lib/sprockets/svg.rb
85
85
  - lib/sprockets/svg/cleaner.rb
86
- - lib/sprockets/svg/proxy_asset.rb
87
86
  - lib/sprockets/svg/railtie.rb
88
- - lib/sprockets/svg/sass_functions.rb
89
- - lib/sprockets/svg/server.rb
90
87
  - lib/sprockets/svg/version.rb
91
88
  - spec/app/.gitignore
92
89
  - spec/app/Rakefile
@@ -122,9 +119,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
122
119
  version: '0'
123
120
  required_rubygems_version: !ruby/object:Gem::Requirement
124
121
  requirements:
125
- - - ">="
122
+ - - ">"
126
123
  - !ruby/object:Gem::Version
127
- version: '0'
124
+ version: 1.3.1
128
125
  requirements: []
129
126
  rubyforge_project:
130
127
  rubygems_version: 2.4.6
@@ -150,4 +147,3 @@ test_files:
150
147
  - spec/fixtures/source.svg
151
148
  - spec/rails_spec.rb
152
149
  - spec/spec_helper.rb
153
- has_rdoc:
@@ -1,93 +0,0 @@
1
- module Sprockets
2
- module Svg
3
- class ProxyAsset
4
-
5
- def initialize(original_asset)
6
- @original_asset = original_asset
7
- end
8
-
9
- def digest_path
10
- ::Sprockets::Svg.png_path(@original_asset.digest_path)
11
- end
12
-
13
- def logical_path
14
- @original_asset.logical_path + '.png'
15
- end
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
-
28
- def write_to(filename, options = {})
29
- # Gzip contents if filename has '.gz'
30
- options[:compress] ||= File.extname(filename) == '.gz'
31
-
32
- file = Tempfile.new(['svg2png', '.svg'])
33
- tmp_path = file.path
34
- png_path = tmp_path + '.png'
35
-
36
- @original_asset.write_to(tmp_path, options.merge(compress: false))
37
- Svg.convert(tmp_path, png_path)
38
-
39
- FileUtils.mkdir_p File.dirname(filename)
40
-
41
- if options[:compress]
42
- # Open file and run it through `Zlib`
43
- File.open(png_path, 'rb') do |rd|
44
- File.open("#{filename}+", 'wb') do |wr|
45
- gz = Zlib::GzipWriter.new(wr, Zlib::BEST_COMPRESSION)
46
- gz.mtime = mtime.to_i
47
- buf = ""
48
- while rd.read(16384, buf)
49
- gz.write(buf)
50
- end
51
- gz.close
52
- end
53
- end
54
- else
55
- # If no compression needs to be done, we can just copy it into place.
56
- FileUtils.cp(png_path, "#{filename}+")
57
- end
58
-
59
- # Atomic write
60
- FileUtils.mv("#{filename}+", filename)
61
-
62
- # Set mtime correctly
63
- File.utime(mtime, mtime, filename)
64
-
65
- @length = File.stat(filename).size
66
-
67
- nil
68
- ensure
69
- # Ensure tmp file gets cleaned up
70
- FileUtils.rm("#{filename}+") if File.exist?("#{filename}+")
71
- end
72
-
73
- def to_s
74
- @source ||= begin
75
- tmp_path = Tempfile.new(['png-cache', '.png']).path
76
- write_to(tmp_path)
77
- File.read(tmp_path)
78
- end
79
- end
80
-
81
- private
82
-
83
- def method_missing(name, *args, &block)
84
- if @original_asset.respond_to?(name)
85
- @original_asset.public_send(name, *args, &block)
86
- else
87
- super
88
- end
89
- end
90
-
91
- end
92
- end
93
- end
@@ -1,38 +0,0 @@
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
@@ -1,41 +0,0 @@
1
- require 'tempfile'
2
- require 'pathname'
3
-
4
- module Sprockets
5
- module Svg
6
- module Server
7
-
8
- def self.included(base)
9
- base.send(:alias_method, :find_asset_without_conversion, :find_asset)
10
- base.send(:alias_method, :find_asset, :find_asset_with_conversion)
11
- end
12
-
13
- def find_asset_with_conversion(path, options = {})
14
- convert = false
15
- if path.to_s.ends_with?('.svg.png')
16
- path = path.gsub(/\.png/, '')
17
- convert = true
18
- end
19
- asset = find_asset_without_conversion(path, options)
20
-
21
- if asset && convert
22
- asset = ProxyAsset.new(asset)
23
- end
24
-
25
- asset
26
- end
27
-
28
- def each_file(*args)
29
- return to_enum(__method__) unless block_given?
30
-
31
- super do |path|
32
- yield path
33
- if Svg.image?(path.to_s)
34
- yield Pathname.new(path.to_s + '.png')
35
- end
36
- end
37
- end
38
-
39
- end
40
- end
41
- end