svg_optimizer 0.0.5 → 0.1.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.

Potentially problematic release.


This version of svg_optimizer might be problematic. Click here for more details.

Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +29 -0
  3. data/lib/svg_optimizer.rb +7 -10
  4. data/lib/svg_optimizer/plugins/base.rb +1 -0
  5. data/lib/svg_optimizer/plugins/cleanup_attribute.rb +1 -0
  6. data/lib/svg_optimizer/plugins/cleanup_id.rb +1 -0
  7. data/lib/svg_optimizer/plugins/collapse_groups.rb +15 -11
  8. data/lib/svg_optimizer/plugins/remove_comment.rb +1 -0
  9. data/lib/svg_optimizer/plugins/remove_editor_namespace.rb +14 -13
  10. data/lib/svg_optimizer/plugins/remove_empty_attribute.rb +2 -0
  11. data/lib/svg_optimizer/plugins/remove_empty_container.rb +2 -0
  12. data/lib/svg_optimizer/plugins/remove_empty_text_node.rb +2 -0
  13. data/lib/svg_optimizer/plugins/remove_hidden_element.rb +1 -0
  14. data/lib/svg_optimizer/plugins/remove_metadata.rb +1 -0
  15. data/lib/svg_optimizer/plugins/remove_raster_image.rb +1 -0
  16. data/lib/svg_optimizer/plugins/remove_unused_namespace.rb +1 -0
  17. data/lib/svg_optimizer/plugins/remove_useless_stroke_and_fill.rb +18 -17
  18. data/lib/svg_optimizer/version.rb +2 -1
  19. data/spec/spec_helper.rb +13 -6
  20. data/spec/svg_optimizer/plugins/cleanup_attribute_spec.rb +1 -0
  21. data/spec/svg_optimizer/plugins/cleanup_id_spec.rb +1 -0
  22. data/spec/svg_optimizer/plugins/collapse_groups_spec.rb +2 -1
  23. data/spec/svg_optimizer/plugins/remove_comment_spec.rb +1 -0
  24. data/spec/svg_optimizer/plugins/remove_editor_namespace_spec.rb +1 -0
  25. data/spec/svg_optimizer/plugins/remove_empty_attribute_spec.rb +1 -0
  26. data/spec/svg_optimizer/plugins/remove_empty_container_spec.rb +1 -0
  27. data/spec/svg_optimizer/plugins/remove_empty_text_node_spec.rb +1 -0
  28. data/spec/svg_optimizer/plugins/remove_hidden_element_spec.rb +1 -0
  29. data/spec/svg_optimizer/plugins/remove_metadata_spec.rb +1 -0
  30. data/spec/svg_optimizer/plugins/remove_raster_image_spec.rb +1 -0
  31. data/spec/svg_optimizer/plugins/remove_unused_namespace_spec.rb +1 -0
  32. data/spec/svg_optimizer/plugins/remove_useless_stroke_and_fill_spec.rb +2 -1
  33. data/spec/svg_optimizer/svg_optimizer_spec.rb +54 -0
  34. metadata +17 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 967fe8ee11fe2dfd0f45a43b8162f63407a9b66b
4
- data.tar.gz: 92ae939384c1111548a7972cab68c438c24066d3
3
+ metadata.gz: e80d8684aae3105745cd84db8c935a332bc58b02
4
+ data.tar.gz: 698bc37343bf931cea862afb939cd0a45547208b
5
5
  SHA512:
6
- metadata.gz: 00ed5692f1ca0e2cb01b99c3fb4fd05bf7a0f304841ed21f256d4dc819e0c56faf4b3b685d35316879d38632f253fe48ef15f967809ef97865078292d6d403f1
7
- data.tar.gz: 6f30a9fba01672b745858889f972fc562025b49f353032dcccdeff418c12daea995cfd3dcac122b9a82700f94cc3fca5b8966da9946ee1afab0e183f6a7c66eb
6
+ metadata.gz: 1d4bf32d76d719e774137c9a00231de35caaed49d4a7f970606f9f6e58b2729bbae67708df72719ac31a008c29bdbd3b0c3548fe6d54e6dd8a9f7bb888eacddf
7
+ data.tar.gz: 28a362b536013a61c426e0ccc3e3fc6d1f9674e9e011cfe50772e22d5aab954904925fb9209714e950556aef3700ab91cee876c0b634fae207b36ed3cd201a80
data/README.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # SvgOptimizer
2
2
 
3
+ [![Travis-CI](https://travis-ci.org/fnando/svg_optimizer.png)](https://travis-ci.org/fnando/svg_optimizer)
4
+ [![Code Climate](https://codeclimate.com/github/fnando/svg_optimizer/badges/gpa.svg)](https://codeclimate.com/github/fnando/svg_optimizer)
5
+ [![Test Coverage](https://codeclimate.com/github/fnando/svg_optimizer/badges/coverage.svg)](https://codeclimate.com/github/fnando/svg_optimizer/coverage)
6
+ [![Gem](https://img.shields.io/gem/v/svg_optimizer.svg)](https://rubygems.org/gems/svg_optimizer)
7
+ [![Gem](https://img.shields.io/gem/dt/svg_optimizer.svg)](https://rubygems.org/gems/svg_optimizer)
8
+
3
9
  Some small optimizations for SVG files.
4
10
 
5
11
  ## Installation
@@ -30,6 +36,29 @@ SvgOptimizer.optimize_file("file.svg")
30
36
  SvgOptimizer.optimize_file("file.svg", "optimized/file.svg")
31
37
  ```
32
38
 
39
+ You can specify the plugins you want to enable. The method signature is:
40
+
41
+ ```ruby
42
+ SvgOptimizer.optimize(xml, plugins)
43
+ SvgOptimizer.optimize_file(input, output, plugins)
44
+ ```
45
+
46
+ where `plugins` is an array of classes that implement the following contract:
47
+
48
+ ```ruby
49
+ class MyPlugin < SvgOptimizer::Plugins::Base
50
+ def process
51
+ xml.xpath("//comment()").remove
52
+ end
53
+ end
54
+ ```
55
+
56
+ The default list of plugins is stored at `SvgOptimizer::DEFAULT_PLUGINS`. To use your new plugin, just do something like this:
57
+
58
+ ```ruby
59
+ SvgOptimizer.optimize(xml, SvgOptimizer::DEFAULT_PLUGINS + [MyPlugin])
60
+ ```
61
+
33
62
  ## Contributing
34
63
 
35
64
  1. Fork it
data/lib/svg_optimizer.rb CHANGED
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "nokogiri"
2
3
 
3
4
  require "svg_optimizer/version"
@@ -17,7 +18,7 @@ require "svg_optimizer/plugins/remove_unused_namespace"
17
18
  require "svg_optimizer/plugins/remove_useless_stroke_and_fill"
18
19
 
19
20
  module SvgOptimizer
20
- PLUGINS = %w[
21
+ DEFAULT_PLUGINS = %w[
21
22
  CleanupAttribute
22
23
  CleanupId
23
24
  RemoveComment
@@ -31,20 +32,16 @@ module SvgOptimizer
31
32
  RemoveUselessStrokeAndFill
32
33
  RemoveEmptyTextNode
33
34
  RemoveEmptyContainer
34
- ]
35
+ ].map {|name| Plugins.const_get(name) }
35
36
 
36
- def self.optimize(contents)
37
+ def self.optimize(contents, plugins = DEFAULT_PLUGINS)
37
38
  xml = Nokogiri::XML(contents)
38
- PLUGINS.each do |plugin_name|
39
- Plugins.const_get(plugin_name).new(xml).process
40
- end
41
-
39
+ plugins.each {|plugin| plugin.new(xml).process }
42
40
  xml.root.to_xml
43
41
  end
44
42
 
45
- def self.optimize_file(path, target = path)
46
- contents = optimize(File.read(path))
47
-
43
+ def self.optimize_file(path, target = path, plugins = DEFAULT_PLUGINS)
44
+ contents = optimize(File.read(path), plugins)
48
45
  File.open(target, "w") {|file| file << contents }
49
46
  true
50
47
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
3
  module Plugins
3
4
  class Base
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
3
  module Plugins
3
4
  class CleanupAttribute < Base
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
3
  module Plugins
3
4
  class CleanupId < Base
@@ -1,8 +1,11 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
3
  module Plugins
3
4
  class CollapseGroups < Base
5
+ COLLAPSABLE_ATTRS = %w[transform class]
6
+
4
7
  def process
5
- xml.css('g:not(:empty)').each do |group|
8
+ xml.css("g:not(:empty)").each do |group|
6
9
  collapse(group)
7
10
  end
8
11
  end
@@ -19,28 +22,29 @@ module SvgOptimizer
19
22
  return unless collapse_attributes?(group, child)
20
23
 
21
24
  group.attributes.each do |attr, val|
22
- if %w(transform class).include?(attr)
23
- child[attr] = [val, child[attr]].compact.join(' ')
25
+ if COLLAPSABLE_ATTRS.include?(attr)
26
+ child[attr] = [val, child[attr]].compact.join(" ")
24
27
  else
25
28
  child[attr] ||= val
26
29
  end
30
+
27
31
  group.delete(attr)
28
32
  end
29
33
  end
30
34
 
31
35
  def collapse?(group)
32
36
  group.attributes.empty? &&
33
- !group.element_children.map(&:name).include?('animate')
37
+ !group.element_children.map(&:name).include?("animate")
34
38
  end
35
39
 
36
40
  def collapse_attributes?(group, child)
37
- return false unless group.attributes.any?
38
- return false unless group.element_children.length == 1
39
- return false if child.has_attribute?('id')
40
- return false unless !group.has_attribute?('clip-path') ||
41
- child.name == 'g' &&
42
- !group.has_attribute?('transform') &&
43
- !child.has_attribute?('transform')
41
+ return unless group.attributes.any?
42
+ return unless group.element_children.length == 1
43
+ return if child.has_attribute?("id")
44
+ return unless !group.has_attribute?("clip-path") ||
45
+ child.name == "g" &&
46
+ !group.has_attribute?("transform") &&
47
+ !child.has_attribute?("transform")
44
48
  true
45
49
  end
46
50
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
3
  module Plugins
3
4
  class RemoveComment < Base
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
3
  module Plugins
3
4
  class RemoveEditorNamespace < Base
@@ -17,6 +18,19 @@ module SvgOptimizer
17
18
  http://www.bohemiancoding.com/sketch/ns
18
19
  ]
19
20
 
21
+ def process
22
+ namespaces = xml.namespaces
23
+ remove_namespaced_attributes
24
+ xml.remove_namespaces!
25
+
26
+ namespaces.each do |name, value|
27
+ next if NAMESPACES.include?(value)
28
+
29
+ _, name = name.split(":")
30
+ xml.root.add_namespace name, value
31
+ end
32
+ end
33
+
20
34
  def namespaces_to_be_removed
21
35
  xml.namespaces.map do |name, value|
22
36
  _, name = name.split(":")
@@ -34,19 +48,6 @@ module SvgOptimizer
34
48
  end
35
49
  end
36
50
  end
37
-
38
- def process
39
- namespaces = xml.namespaces
40
- remove_namespaced_attributes
41
- xml.remove_namespaces!
42
-
43
- namespaces.each do |name, value|
44
- next if NAMESPACES.include?(value)
45
-
46
- _, name = name.split(":")
47
- xml.root.add_namespace name, value
48
- end
49
- end
50
51
  end
51
52
  end
52
53
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
3
  module Plugins
3
4
  class RemoveEmptyAttribute < Base
@@ -10,6 +11,7 @@ module SvgOptimizer
10
11
  end
11
12
 
12
13
  private
14
+
13
15
  def remove_if_empty(node, attr)
14
16
  node.remove_attribute(attr) if node[attr].empty?
15
17
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
3
  module Plugins
3
4
  class RemoveEmptyContainer < Base
@@ -11,6 +12,7 @@ module SvgOptimizer
11
12
  end
12
13
 
13
14
  private
15
+
14
16
  def remove_node(node)
15
17
  node.children.empty? && node.remove
16
18
  remove_node(node.parent) if node.parent
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
3
  module Plugins
3
4
  class RemoveEmptyTextNode < Base
@@ -6,6 +7,7 @@ module SvgOptimizer
6
7
  end
7
8
 
8
9
  private
10
+
9
11
  def remove_if_empty(node)
10
12
  node.remove if node.text.gsub(/\s/, "").empty?
11
13
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
3
  module Plugins
3
4
  class RemoveHiddenElement < Base
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
3
  module Plugins
3
4
  class RemoveMetadata < Base
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
3
  module Plugins
3
4
  class RemoveRasterImage < Base
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
3
  module Plugins
3
4
  class RemoveUnusedNamespace < Base
@@ -1,12 +1,14 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
3
  module Plugins
3
4
  class RemoveUselessStrokeAndFill < Base
4
- SELECTOR = %w(circle ellipse line path polygon polyline rect).join(',')
5
- STROKE_ATTRS = %w(stroke stroke-opacity stroke-width stroke-dashoffset)
6
- FILL_ATTRS = %w(fill-opacity fill-rule)
5
+ SELECTOR = %w[circle ellipse line path polygon polyline rect].join(",")
6
+ STROKE_ATTRS = %w[stroke stroke-opacity stroke-width stroke-dashoffset]
7
+ FILL_ATTRS = %w[fill-opacity fill-rule]
7
8
 
8
9
  def process
9
- return if xml.css('style, script').any?
10
+ return if xml.css("style, script").any?
11
+
10
12
  xml.css(SELECTOR).each do |node|
11
13
  remove_useless_attributes(node)
12
14
  end
@@ -15,48 +17,47 @@ module SvgOptimizer
15
17
  private
16
18
 
17
19
  def remove_useless_attributes(node)
18
- return if inherited_attribute(node, 'id')
20
+ return if inherited_attribute(node, "id")
19
21
  remove_stroke(node) if remove_stroke?(node)
20
22
  remove_fill(node) if remove_fill?(node)
21
23
  end
22
24
 
23
25
  def remove_stroke(node)
24
26
  STROKE_ATTRS.each { |attr| node.delete(attr) }
25
- node['stroke'] = 'none' if decline_inherited_stroke?(node)
27
+ node["stroke"] = "none" if decline_inherited_stroke?(node)
26
28
  end
27
29
 
28
30
  def remove_fill(node)
29
31
  FILL_ATTRS.each { |attr| node.delete(attr) }
30
- node['fill'] = 'none' if decline_inherited_fill?(node)
32
+ node["fill"] = "none" if decline_inherited_fill?(node)
31
33
  end
32
34
 
33
35
  def decline_inherited_stroke?(node)
34
- (inherited_attribute(node.parent, 'stroke') || 'none') != 'none'
36
+ (inherited_attribute(node.parent, "stroke") || "none") != "none"
35
37
  end
36
38
 
37
39
  def decline_inherited_fill?(node)
38
- !inherited_attribute(node, 'fill') || node.has_attribute?('fill')
40
+ !inherited_attribute(node, "fill") || node.has_attribute?("fill")
39
41
  end
40
42
 
41
43
  def remove_stroke?(node)
42
- return true if (inherited_attribute(node, 'stroke') || 'none') == 'none'
43
- return true if inherited_attribute(node, 'stroke-opacity') == '0'
44
- return inherited_attribute(node, 'stroke-width') == '0'
44
+ return true if (inherited_attribute(node, "stroke") || "none") == "none"
45
+ return true if inherited_attribute(node, "stroke-opacity") == "0"
46
+ return inherited_attribute(node, "stroke-width") == "0"
45
47
  end
46
48
 
47
49
  def remove_fill?(node)
48
- fill = inherited_attribute(node, 'fill')
49
- return true if fill == 'none'
50
- return true if inherited_attribute(node, 'fill-opacity') == '0'
50
+ fill = inherited_attribute(node, "fill")
51
+ return true if fill == "none"
52
+ return true if inherited_attribute(node, "fill-opacity") == "0"
51
53
  return !fill
52
54
  end
53
55
 
54
56
  def inherited_attribute(node, attr)
55
- return nil if node.nil? || node.document?
57
+ return if node.nil? || node.document?
56
58
  return node[attr] if node.has_attribute?(attr)
57
59
  inherited_attribute(node.parent, attr)
58
60
  end
59
61
  end
60
62
  end
61
63
  end
62
-
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  module SvgOptimizer
2
- VERSION = "0.0.5"
3
+ VERSION = "0.1.0"
3
4
  end
data/spec/spec_helper.rb CHANGED
@@ -1,5 +1,10 @@
1
+ # frozen_string_literal: true
2
+ require "codeclimate-test-reporter"
3
+ CodeClimate::TestReporter.start
4
+
1
5
  require "bundler/setup"
2
6
  require "svg_optimizer"
7
+ require "securerandom"
3
8
 
4
9
  module RSpecHelpers
5
10
  SVG = <<-XML
@@ -11,6 +16,10 @@ module RSpecHelpers
11
16
  </svg>
12
17
  XML
13
18
 
19
+ def build_svg(content)
20
+ SVG % content
21
+ end
22
+
14
23
  def fixtures_path
15
24
  File.expand_path("../fixtures", __FILE__)
16
25
  end
@@ -24,16 +33,16 @@ module RSpecHelpers
24
33
 
25
34
  def with_svg_plugin(content)
26
35
  let(:file_path) { File.join(fixtures_path, content) }
27
- let(:input_content) { File.file?(file_path) ? File.read(file_path) : SVG % content }
36
+ let(:input_content) { File.file?(file_path) ? File.read(file_path) : build_svg(content) }
28
37
  setup_plugin_test
29
38
  end
30
39
 
31
40
  def test_with_fixture_set(name)
32
- Dir.glob(File.join(fixtures_path, name, '*.svg')).each do |fixture|
41
+ Dir.glob(File.join(fixtures_path, name, "*.svg")).each do |fixture|
33
42
  context "output from fixture: #{fixture}" do
34
43
  let(:fixture_content) { File.read(fixture) }
35
- let(:input_content) { fixture_content.split('@@@')[0].strip }
36
- let(:expected_content) { fixture_content.split('@@@')[1].strip }
44
+ let(:input_content) { fixture_content.split("@@@")[0].strip }
45
+ let(:expected_content) { fixture_content.split("@@@")[1].strip }
37
46
  let(:expected) { Nokogiri::XML(expected_content, &:noblanks).root.to_xml }
38
47
  subject { xml.root.to_xml }
39
48
  setup_plugin_test
@@ -46,8 +55,6 @@ module RSpecHelpers
46
55
  end
47
56
 
48
57
  RSpec.configure do |config|
49
- config.run_all_when_everything_filtered = true
50
- config.filter_run :focus
51
58
  config.order = "random"
52
59
  config.extend RSpecHelpers
53
60
  config.include RSpecHelpers
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "spec_helper"
2
3
 
3
4
  describe SvgOptimizer::Plugins::CleanupAttribute do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "spec_helper"
2
3
 
3
4
  describe SvgOptimizer::Plugins::CleanupId do
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  require "spec_helper"
2
3
 
3
4
  describe SvgOptimizer::Plugins::CollapseGroups do
4
- test_with_fixture_set('collapse_groups')
5
+ test_with_fixture_set("collapse_groups")
5
6
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "spec_helper"
2
3
 
3
4
  describe SvgOptimizer::Plugins::RemoveComment do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "spec_helper"
2
3
 
3
4
  describe SvgOptimizer::Plugins::RemoveEditorNamespace do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "spec_helper"
2
3
 
3
4
  describe SvgOptimizer::Plugins::RemoveEmptyAttribute do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "spec_helper"
2
3
 
3
4
  describe SvgOptimizer::Plugins::RemoveEmptyContainer do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "spec_helper"
2
3
 
3
4
  describe SvgOptimizer::Plugins::RemoveEmptyTextNode do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "spec_helper"
2
3
 
3
4
  describe SvgOptimizer::Plugins::RemoveHiddenElement do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "spec_helper"
2
3
 
3
4
  describe SvgOptimizer::Plugins::RemoveMetadata do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "spec_helper"
2
3
 
3
4
  describe SvgOptimizer::Plugins::RemoveRasterImage do
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "spec_helper"
2
3
 
3
4
  describe SvgOptimizer::Plugins::RemoveUnusedNamespace do
@@ -1,5 +1,6 @@
1
+ # frozen_string_literal: true
1
2
  require "spec_helper"
2
3
 
3
4
  describe SvgOptimizer::Plugins::RemoveUselessStrokeAndFill do
4
- test_with_fixture_set('remove_useless_stroke_and_fill')
5
+ test_with_fixture_set("remove_useless_stroke_and_fill")
5
6
  end
@@ -0,0 +1,54 @@
1
+ require "spec_helper"
2
+
3
+ describe SvgOptimizer do
4
+ context "file saving" do
5
+ let(:input) { "/tmp/#{SecureRandom.uuid}.svg" }
6
+ let(:output) { "/tmp/#{SecureRandom.uuid}.svg" }
7
+ let(:raw_svg) { build_svg("<!-- foo --><text>SVG</text>") }
8
+ let(:output_svg) { SvgOptimizer.optimize(raw_svg) }
9
+
10
+ before do
11
+ File.open(input, "w") {|file| file << raw_svg }
12
+ end
13
+
14
+ it "overrides existing file with optimized version" do
15
+ SvgOptimizer.optimize_file(input)
16
+ expect(File.read(input)).to eq(output_svg)
17
+ end
18
+
19
+ it "saves new file file with optimized version" do
20
+ SvgOptimizer.optimize_file(input, output)
21
+ expect(File.read(input)).to eq(raw_svg)
22
+ expect(File.read(output)).to eq(output_svg)
23
+ end
24
+ end
25
+
26
+ context "plugin selection" do
27
+ it "applies all plugins" do
28
+ svg = build_svg <<-SVG
29
+ <!-- foo -->
30
+ <g></g>
31
+ <!-- bar -->
32
+ SVG
33
+
34
+ xml = Nokogiri::XML(SvgOptimizer.optimize(svg))
35
+
36
+ expect(xml.xpath("//comment()")).to be_empty
37
+ expect(xml.css("g")).to be_empty
38
+ end
39
+
40
+ it "applies just specified plugins" do
41
+ plugins = [SvgOptimizer::Plugins::RemoveComment]
42
+ svg = build_svg <<-SVG
43
+ <!-- foo -->
44
+ <g></g>
45
+ <!-- bar -->
46
+ SVG
47
+
48
+ xml = Nokogiri::XML(SvgOptimizer.optimize(svg, plugins))
49
+
50
+ expect(xml.xpath("//comment()")).to be_empty
51
+ expect(xml.css("g").length).to eql(1)
52
+ end
53
+ end
54
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: svg_optimizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 0.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nando Vieira
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: codeclimate-test-reporter
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
83
97
  description: SVG optimization based on Node's SVGO
84
98
  email:
85
99
  - fnando.vieira@gmail.com
@@ -138,6 +152,7 @@ files:
138
152
  - spec/svg_optimizer/plugins/remove_raster_image_spec.rb
139
153
  - spec/svg_optimizer/plugins/remove_unused_namespace_spec.rb
140
154
  - spec/svg_optimizer/plugins/remove_useless_stroke_and_fill_spec.rb
155
+ - spec/svg_optimizer/svg_optimizer_spec.rb
141
156
  homepage: https://github.com/fnando/svg_optimizer
142
157
  licenses:
143
158
  - MIT
@@ -196,3 +211,4 @@ test_files:
196
211
  - spec/svg_optimizer/plugins/remove_raster_image_spec.rb
197
212
  - spec/svg_optimizer/plugins/remove_unused_namespace_spec.rb
198
213
  - spec/svg_optimizer/plugins/remove_useless_stroke_and_fill_spec.rb
214
+ - spec/svg_optimizer/svg_optimizer_spec.rb