optipng-r 0.3.1 → 0.4.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/Gemfile +4 -4
- data/Gemfile.lock +3 -5
- data/Rakefile +5 -9
- data/lib/optipng.rb +107 -102
- data/optipng.gemspec +14 -28
- metadata +4 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fe66587475756541e77b98e04cece132a115c43a
|
4
|
+
data.tar.gz: def6fb1397bd895f93c6bbc220d1bf8437aef8cc
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 36c122227f4755108a73472f0d51bf2b9776ce5e8a62ae535a90afe771f7d62431ee3c9b1c6504802f47e126a611646ef1ec4b11a2773cc1c520192ac605d69c
|
7
|
+
data.tar.gz: 84ec24493accd2bcc10e99f5c95f89e11beb51df090c6adcc0d743a30daefee76ef3324560a3afdd9a3da090260d727f0afdb92a2a591e12c6d8723cf5d00aed
|
data/Gemfile
CHANGED
@@ -1,11 +1,11 @@
|
|
1
|
-
source
|
1
|
+
source 'http://rubygems.org'
|
2
2
|
# Add dependencies required to use your gem here.
|
3
3
|
# Example:
|
4
|
-
gem
|
4
|
+
gem 'command-builder', '>= 0.3.2'
|
5
5
|
|
6
6
|
# Add dependencies to develop your gem here.
|
7
7
|
# Include everything needed to run rake, tests, features, etc.
|
8
8
|
group :development do
|
9
|
-
gem
|
10
|
-
gem
|
9
|
+
gem 'bundler', '>= 1.0.0'
|
10
|
+
gem 'jeweler', '>= 1.5.2'
|
11
11
|
end
|
data/Gemfile.lock
CHANGED
@@ -1,16 +1,14 @@
|
|
1
1
|
GEM
|
2
2
|
remote: http://rubygems.org/
|
3
3
|
specs:
|
4
|
-
command-builder (0.2
|
5
|
-
hash-utils (>= 0.18.0)
|
4
|
+
command-builder (0.3.2)
|
6
5
|
pipe-run (>= 0.2.1)
|
7
6
|
git (1.2.5)
|
8
|
-
hash-utils (0.18.0)
|
9
7
|
jeweler (1.6.4)
|
10
8
|
bundler (~> 1.0)
|
11
9
|
git (>= 1.2.5)
|
12
10
|
rake
|
13
|
-
pipe-run (0.
|
11
|
+
pipe-run (0.3.0)
|
14
12
|
rake (0.9.2)
|
15
13
|
|
16
14
|
PLATFORMS
|
@@ -18,5 +16,5 @@ PLATFORMS
|
|
18
16
|
|
19
17
|
DEPENDENCIES
|
20
18
|
bundler (>= 1.0.0)
|
21
|
-
command-builder (>= 0.2
|
19
|
+
command-builder (>= 0.3.2)
|
22
20
|
jeweler (>= 1.5.2)
|
data/Rakefile
CHANGED
@@ -15,15 +15,11 @@ require 'jeweler'
|
|
15
15
|
|
16
16
|
Jeweler::Tasks.new do |gem|
|
17
17
|
# gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
|
18
|
-
gem.name =
|
19
|
-
gem.homepage =
|
20
|
-
gem.license =
|
18
|
+
gem.name = 'optipng-r'
|
19
|
+
gem.homepage = 'https://github.com/Artie18/optipng'
|
20
|
+
gem.license = 'MIT'
|
21
21
|
gem.summary = "Ruby interface to 'optipng' tool."
|
22
|
-
gem.email =
|
23
|
-
gem.authors = [
|
24
|
-
# Include your dependencies below. Runtime dependencies are required when using your gem,
|
25
|
-
# and development dependencies are only needed for development (ie running rake tasks, tests, etc)
|
26
|
-
# gem.add_runtime_dependency 'jabber4r', '> 0.1'
|
27
|
-
# gem.add_development_dependency 'rspec', '> 1.2.3'
|
22
|
+
gem.email = 'artyomfedenko@hotmail.com'
|
23
|
+
gem.authors = ['Artyom Fedenko']
|
28
24
|
end
|
29
25
|
Jeweler::RubygemsDotOrgTasks.new
|
data/lib/optipng.rb
CHANGED
@@ -12,127 +12,132 @@ require 'mkmf'
|
|
12
12
|
|
13
13
|
module Optipng
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
15
|
+
##
|
16
|
+
# Holds +optipng+ command.
|
17
|
+
#
|
18
|
+
|
19
|
+
COMMAND = :optipng
|
20
|
+
|
21
|
+
##
|
22
|
+
# Result structure.
|
23
|
+
#
|
24
|
+
|
25
|
+
Result = Struct::new(:succeed, :errors)
|
26
|
+
|
27
|
+
##
|
28
|
+
# Holds output matchers.
|
29
|
+
#
|
30
|
+
|
31
|
+
MATCHERS = [
|
32
|
+
/^Processing\:\s*(.*)/,
|
33
|
+
/^Error:\s*(.*)/,
|
34
|
+
/(\d+\.\d+)%/,
|
35
|
+
/already optimized\.$/,
|
36
|
+
]
|
37
|
+
|
38
|
+
##
|
39
|
+
# Checks if +jpegoptim+ is available.
|
40
|
+
# @return [Boolean] +true+ if it is, +false+ in otherwise
|
41
|
+
#
|
42
|
+
|
43
|
+
def self.available?
|
44
|
+
find_executable(self::COMMAND.to_s).nil? ? false : true
|
45
|
+
end
|
46
|
+
|
47
|
+
##
|
48
|
+
# Performs optimizations above file or set of files.
|
49
|
+
#
|
50
|
+
# If block is given, runs +optipng+ asynchronously. In that case,
|
51
|
+
# +em-pipe-run+ file must be already required.
|
52
|
+
#
|
53
|
+
# @param [String, Array] paths file path or array of paths for optimizing
|
54
|
+
# @param [Hash] options options
|
55
|
+
# @param [Proc] block block for giving back the results
|
56
|
+
# @option options [Integer] :level optimization level (0-7)
|
57
|
+
# @option options [Boolean] :debug turn on debugging mode, so command will be put out to the +STDERR+
|
58
|
+
# @return [Struct] see {Result}
|
59
|
+
#
|
60
|
+
|
61
|
+
def self.optimize(paths, options = {}, &block)
|
62
|
+
|
63
|
+
# Check if optipng available
|
64
|
+
unless options[:is_available] && self.available?
|
65
|
+
throw Exception.new('Optipng is not installed')
|
45
66
|
end
|
46
67
|
|
47
|
-
|
48
|
-
|
49
|
-
#
|
50
|
-
# If block is given, runs +optipng+ asynchronously. In that case,
|
51
|
-
# +em-pipe-run+ file must be already required.
|
52
|
-
#
|
53
|
-
# @param [String, Array] paths file path or array of paths for optimizing
|
54
|
-
# @param [Hash] options options
|
55
|
-
# @param [Proc] block block for giving back the results
|
56
|
-
# @option options [Integer] :level optimization level (0-7)
|
57
|
-
# @option options [Boolean] :debug turn on debugging mode, so command will be put out to the +STDERR+
|
58
|
-
# @return [Struct] see {Result}
|
59
|
-
#
|
60
|
-
|
61
|
-
def self.optimize(paths, options = { }, &block)
|
62
|
-
|
63
|
-
# Command
|
64
|
-
cmd = CommandBuilder::new(self::COMMAND)
|
65
|
-
|
66
|
-
# Max
|
67
|
-
if options[:level].kind_of? Integer
|
68
|
-
cmd.arg(:o, options[:level].to_i)
|
69
|
-
end
|
68
|
+
# Command
|
69
|
+
cmd = CommandBuilder::new(self::COMMAND)
|
70
70
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
71
|
+
# Max
|
72
|
+
if options[:level].kind_of? Integer
|
73
|
+
cmd.arg(:o, options[:level].to_i)
|
74
|
+
end
|
75
75
|
|
76
|
-
|
77
|
-
|
76
|
+
# Files
|
77
|
+
if paths.kind_of? String
|
78
|
+
paths = [paths]
|
79
|
+
end
|
78
80
|
|
79
|
-
|
80
|
-
|
81
|
-
end
|
81
|
+
# Runs the command
|
82
|
+
cmd << paths
|
82
83
|
|
83
|
-
|
84
|
-
|
85
|
-
|
84
|
+
if options[:debug]
|
85
|
+
STDERR.write "#{cmd.to_s}\n"
|
86
|
+
end
|
86
87
|
|
87
|
-
|
88
|
-
|
89
|
-
|
88
|
+
# Blocking
|
89
|
+
if block.nil?
|
90
|
+
output = cmd.execute!
|
90
91
|
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
succeed, errors = __parse_output(output)
|
95
|
-
block.call(self::Result::new(succeed, errors))
|
96
|
-
end
|
97
|
-
end
|
92
|
+
# Parses output
|
93
|
+
succeed, errors = __parse_output(output)
|
94
|
+
return self::Result::new(succeed, errors)
|
98
95
|
|
96
|
+
# Non-blocking
|
97
|
+
else
|
98
|
+
cmd.execute do |output|
|
99
|
+
succeed, errors = __parse_output(output)
|
100
|
+
block.call(self::Result::new(succeed, errors))
|
101
|
+
end
|
99
102
|
end
|
100
103
|
|
104
|
+
end
|
101
105
|
|
102
|
-
private
|
103
106
|
|
104
|
-
|
105
|
-
# Parses output.
|
106
|
-
#
|
107
|
+
private
|
107
108
|
|
108
|
-
|
109
|
-
|
110
|
-
|
109
|
+
##
|
110
|
+
# Parses output.
|
111
|
+
#
|
111
112
|
|
112
|
-
|
113
|
-
|
114
|
-
|
113
|
+
def self.__parse_output(output)
|
114
|
+
errors = []
|
115
|
+
succeed = {}
|
115
116
|
|
116
|
-
|
117
|
-
|
117
|
+
output.split('**').each do |section|
|
118
|
+
section.strip!
|
119
|
+
if section.start_with? 'Processing:'
|
118
120
|
|
119
|
-
|
120
|
-
|
121
|
-
filename = m[1]
|
122
|
-
elsif m = line.match(self::MATCHERS[1])
|
123
|
-
errors << [filename, m[1]]
|
124
|
-
next
|
125
|
-
elsif m = line.match(self::MATCHERS[2])
|
126
|
-
succeed[filename] = -1 * m[1].to_f
|
127
|
-
next
|
128
|
-
elsif m = line.match(self::MATCHERS[3])
|
129
|
-
succeed[filename] = 0.0
|
130
|
-
end
|
131
|
-
end
|
121
|
+
# Scans each line
|
122
|
+
filename = nil
|
132
123
|
|
133
|
-
|
124
|
+
section.each_line do |line|
|
125
|
+
if m = line.match(self::MATCHERS[0])
|
126
|
+
filename = m[1]
|
127
|
+
elsif m = line.match(self::MATCHERS[1])
|
128
|
+
errors << [filename, m[1]]
|
129
|
+
next
|
130
|
+
elsif m = line.match(self::MATCHERS[2])
|
131
|
+
succeed[filename] = -1 * m[1].to_f
|
132
|
+
next
|
133
|
+
elsif line.match(self::MATCHERS[3])
|
134
|
+
succeed[filename] = 0.0
|
135
|
+
end
|
134
136
|
end
|
135
137
|
|
136
|
-
|
138
|
+
end
|
137
139
|
end
|
140
|
+
|
141
|
+
return [succeed, errors]
|
142
|
+
end
|
138
143
|
end
|
data/optipng.gemspec
CHANGED
@@ -5,28 +5,14 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{optipng-r}
|
8
|
-
s.version =
|
8
|
+
s.version = '0.4.0'
|
9
9
|
|
10
|
-
s.required_rubygems_version = Gem::Requirement.new(
|
10
|
+
s.required_rubygems_version = Gem::Requirement.new('>= 0') if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = [%q{Artyom Fedenko}]
|
12
|
-
s.date = %q{2015-09-
|
12
|
+
s.date = %q{2015-09-31}
|
13
13
|
s.email = %q{artyomfedenko@hotmail.com}
|
14
|
-
s.extra_rdoc_files =
|
15
|
-
|
16
|
-
"README.md"
|
17
|
-
]
|
18
|
-
s.files = [
|
19
|
-
".document",
|
20
|
-
"Gemfile",
|
21
|
-
"Gemfile.lock",
|
22
|
-
"LICENSE.txt",
|
23
|
-
"README.md",
|
24
|
-
"Rakefile",
|
25
|
-
"VERSION",
|
26
|
-
"lib/optipng.rb",
|
27
|
-
"optipng.gemspec",
|
28
|
-
"test"
|
29
|
-
]
|
14
|
+
s.extra_rdoc_files = %w(LICENSE.txt README.md)
|
15
|
+
s.files = %w(.document Gemfile Gemfile.lock LICENSE.txt README.md Rakefile VERSION lib/optipng.rb optipng.gemspec test)
|
30
16
|
s.homepage = %q{https://github.com/artie18/optipng}
|
31
17
|
s.licenses = [%q{MIT}]
|
32
18
|
s.require_paths = [%q{lib}]
|
@@ -37,17 +23,17 @@ Gem::Specification.new do |s|
|
|
37
23
|
s.specification_version = 3
|
38
24
|
|
39
25
|
if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
|
40
|
-
s.add_runtime_dependency(%q<command-builder>, [
|
41
|
-
s.add_development_dependency(%q<bundler>, [
|
42
|
-
s.add_development_dependency(%q<jeweler>, [
|
26
|
+
s.add_runtime_dependency(%q<command-builder>, ['>= 0.3.2'])
|
27
|
+
s.add_development_dependency(%q<bundler>, ['>= 1.0.0'])
|
28
|
+
s.add_development_dependency(%q<jeweler>, ['>= 1.5.2'])
|
43
29
|
else
|
44
|
-
s.add_dependency(%q<command-builder>, [
|
45
|
-
s.add_dependency(%q<bundler>, [
|
46
|
-
s.add_dependency(%q<jeweler>, [
|
30
|
+
s.add_dependency(%q<command-builder>, ['>= 0.3.2'])
|
31
|
+
s.add_dependency(%q<bundler>, ['>= 1.0.0'])
|
32
|
+
s.add_dependency(%q<jeweler>, ['>= 1.5.2'])
|
47
33
|
end
|
48
34
|
else
|
49
|
-
s.add_dependency(%q<command-builder>, [
|
50
|
-
s.add_dependency(%q<bundler>, [
|
51
|
-
s.add_dependency(%q<jeweler>, [
|
35
|
+
s.add_dependency(%q<command-builder>, ['>= 0.3.2'])
|
36
|
+
s.add_dependency(%q<bundler>, ['>= 1.0.0'])
|
37
|
+
s.add_dependency(%q<jeweler>, ['>= 1.5.2'])
|
52
38
|
end
|
53
39
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: optipng-r
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Artyom Fedenko
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2015-
|
11
|
+
date: 2015-10-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: command-builder
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 0.2
|
19
|
+
version: 0.3.2
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 0.2
|
26
|
+
version: 0.3.2
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: bundler
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|