kt-paperclip-compression 1.2.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 +7 -0
- data/bin/linux/x64/jpegtran +0 -0
- data/bin/linux/x64/optipng +0 -0
- data/bin/linux/x86/jpegtran +0 -0
- data/bin/linux/x86/optipng +0 -0
- data/bin/osx/32bit/jpegtran +0 -0
- data/bin/osx/32bit/optipng +0 -0
- data/bin/osx/64bit/jpegtran +0 -0
- data/bin/osx/64bit/optipng +0 -0
- data/bin/win32/jpegtran.exe +0 -0
- data/bin/win32/libjpeg-62.dll +0 -0
- data/bin/win32/optipng.exe +0 -0
- data/bin/win64/jpegtran.exe +0 -0
- data/bin/win64/libjpeg-62.dll +0 -0
- data/lib/kt-paperclip-compression.rb +1 -0
- data/lib/paperclip-compression.rb +13 -0
- data/lib/paperclip-compression/base.rb +85 -0
- data/lib/paperclip-compression/config.rb +85 -0
- data/lib/paperclip-compression/jpeg.rb +39 -0
- data/lib/paperclip-compression/paperclip/compression.rb +33 -0
- data/lib/paperclip-compression/png.rb +39 -0
- metadata +152 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 388c0d55aefababf29de64ca183f7150ed864c3bd8c32bea1be5bdd96a0c2ac0
|
4
|
+
data.tar.gz: ac1c7bd982f52d1242ceeec563403a9b2646c6974d36686d11fa2f36b7860d19
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 94d1c13bfc17cab2647ffe1a81a85ab1923842b8d8792f1e85d1ea1721d2c0bce73505e1efb57bd65235c2a23b9fa834eec58fe9d63307a5db9d442cf755d9e6
|
7
|
+
data.tar.gz: a6a9bc7bffb5c9ad747ee73f4f73278231135e5b69ab2947b9fa13eaaa26da88b878e272c85230dd0372f28c7410d5b918259bf6695b26bbd6dc9d888e8e3f70
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'paperclip-compression'
|
@@ -0,0 +1,13 @@
|
|
1
|
+
require 'kt-paperclip'
|
2
|
+
require 'os'
|
3
|
+
require 'paperclip-compression/paperclip/compression'
|
4
|
+
require 'paperclip-compression/base'
|
5
|
+
require 'paperclip-compression/config'
|
6
|
+
require 'paperclip-compression/jpeg'
|
7
|
+
require 'paperclip-compression/png'
|
8
|
+
|
9
|
+
module PaperclipCompression
|
10
|
+
def self.root
|
11
|
+
Gem::Specification.find_by_name('kt-paperclip-compression').gem_dir
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module PaperclipCompression
|
2
|
+
|
3
|
+
ExitStatusError = defined?(Cocaine) ? Cocaine::ExitStatusError : Terrapin::ExitStatusError
|
4
|
+
CommandNotFoundError = defined?(Cocaine) ? Cocaine::CommandNotFoundError : Terrapin::CommandNotFoundError
|
5
|
+
|
6
|
+
class Base
|
7
|
+
|
8
|
+
def initialize(file, first_processor)
|
9
|
+
@file = file
|
10
|
+
current_extension = File.extname(file.path)
|
11
|
+
@basename = File.basename(file.path, current_extension)
|
12
|
+
@dst = Paperclip::TempfileFactory.new.generate(@basename)
|
13
|
+
@dst_path = File.expand_path(@dst.path)
|
14
|
+
@src_path = File.expand_path(@file.path)
|
15
|
+
@first_processor = first_processor
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.make(file, first_processor, options = {})
|
19
|
+
new(file, first_processor, options).make
|
20
|
+
end
|
21
|
+
|
22
|
+
def process_file
|
23
|
+
# Close output file so compressors which require exclusive file rights
|
24
|
+
# work.
|
25
|
+
@dst.close
|
26
|
+
|
27
|
+
# Execute the child-compressor classes implementation of how to compress
|
28
|
+
# the output
|
29
|
+
compress
|
30
|
+
|
31
|
+
# Re-open the output file so downstream paperclip-middleware may
|
32
|
+
# read/write/etc. without having to re-open the file.
|
33
|
+
@dst.open
|
34
|
+
|
35
|
+
# Return the destination file for downstream paperclip processors.
|
36
|
+
@dst
|
37
|
+
end
|
38
|
+
|
39
|
+
protected
|
40
|
+
|
41
|
+
def process_file?
|
42
|
+
@cli_opts
|
43
|
+
end
|
44
|
+
|
45
|
+
def unprocessed_tempfile
|
46
|
+
copy_to_tempfile
|
47
|
+
first_processor? ? @dst : @file
|
48
|
+
end
|
49
|
+
|
50
|
+
def command_path(command)
|
51
|
+
folder = if OS.osx?
|
52
|
+
File.join('osx', catalina? ? '64bit' : '32bit')
|
53
|
+
elsif OS.linux?
|
54
|
+
File.join('linux', OS.bits.eql?(64) ? 'x64' : 'x86')
|
55
|
+
elsif OS.windows?
|
56
|
+
OS.bits.eql?(64) ? 'win64' : 'win32'
|
57
|
+
end
|
58
|
+
|
59
|
+
File.join(PaperclipCompression.root, 'bin', folder, command)
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def compress
|
65
|
+
fail MustImplementInSubClassesException,
|
66
|
+
'compress is overridden on a per compressor basis.'
|
67
|
+
end
|
68
|
+
|
69
|
+
def first_processor?
|
70
|
+
@first_processor
|
71
|
+
end
|
72
|
+
|
73
|
+
def copy_to_tempfile
|
74
|
+
FileUtils.cp(@src_path, @dst_path)
|
75
|
+
end
|
76
|
+
|
77
|
+
def catalina?
|
78
|
+
major = OS.host_os.match(/darwin(\d+)\./)[1].to_i
|
79
|
+
major >= 19
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
# Informs developers when a method is intended to be defined in # sub-classes.
|
84
|
+
class MustImplementInSubClassesException < Exception; end
|
85
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
module PaperclipCompression
|
2
|
+
class Config
|
3
|
+
|
4
|
+
PROCESSOR_OPTIONS_KEY = :processor_options
|
5
|
+
KEY = :compression
|
6
|
+
|
7
|
+
def self.create_with_fallbacks(style_options, type_key, gem_defaults)
|
8
|
+
gem_config = new({ KEY => { type_key => gem_defaults } }, type_key, nil, nil)
|
9
|
+
defaults_config = new(Paperclip::Attachment.default_options, type_key, gem_config, Paperclip::Attachment.default_options[:whiny])
|
10
|
+
new(style_options[PROCESSOR_OPTIONS_KEY], type_key, defaults_config, style_options[:whiny])
|
11
|
+
end
|
12
|
+
|
13
|
+
def initialize(options, type_key, fallback, whiny)
|
14
|
+
@whiny = whiny
|
15
|
+
@fallback = fallback
|
16
|
+
parse_options(options, type_key)
|
17
|
+
end
|
18
|
+
|
19
|
+
def process_file?
|
20
|
+
if defined?(@process_file)
|
21
|
+
@process_file
|
22
|
+
elsif @fallback
|
23
|
+
@fallback.process_file?
|
24
|
+
else
|
25
|
+
raise('options or fallback should have attributes')
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
def command
|
30
|
+
if defined?(@command)
|
31
|
+
@command
|
32
|
+
elsif @fallback
|
33
|
+
@fallback.command
|
34
|
+
else
|
35
|
+
raise("options or fallback should have 'command'")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def options
|
40
|
+
if defined?(@options)
|
41
|
+
@options
|
42
|
+
elsif @fallback
|
43
|
+
@fallback.options
|
44
|
+
else
|
45
|
+
raise("options or fallback should have 'options'")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
def whiny
|
50
|
+
@whiny
|
51
|
+
end
|
52
|
+
|
53
|
+
private
|
54
|
+
|
55
|
+
def parse_options(options, type_key)
|
56
|
+
if options && options.has_key?(KEY)
|
57
|
+
compression_opts = options[KEY]
|
58
|
+
|
59
|
+
if compression_opts.eql?(true)
|
60
|
+
@process_file = true
|
61
|
+
elsif compression_opts.eql?(false) || compression_opts.eql?(nil)
|
62
|
+
@process_file = false
|
63
|
+
elsif compression_opts.is_a?(Hash) && compression_opts.has_key?(type_key)
|
64
|
+
parse_type_options(compression_opts[type_key])
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def parse_type_options(type_opts)
|
70
|
+
if type_opts
|
71
|
+
@process_file = true
|
72
|
+
|
73
|
+
if type_opts.is_a?(String)
|
74
|
+
@options = type_opts
|
75
|
+
elsif type_opts.is_a?(Hash)
|
76
|
+
@command = type_opts[:command] if type_opts.has_key?(:command)
|
77
|
+
@options = type_opts[:options] if type_opts.has_key?(:options)
|
78
|
+
end
|
79
|
+
else
|
80
|
+
@process_file = false
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module PaperclipCompression
|
2
|
+
class Jpeg < Base
|
3
|
+
|
4
|
+
KEY = :jpeg
|
5
|
+
JPEGTRAN_DEFAULT_OPTS = '-copy none -optimize -perfect'
|
6
|
+
|
7
|
+
def initialize(file, first_processor, options = {})
|
8
|
+
super(file, first_processor)
|
9
|
+
@config = PaperclipCompression::Config.create_with_fallbacks(options, KEY, gem_defaults)
|
10
|
+
end
|
11
|
+
|
12
|
+
def make
|
13
|
+
begin
|
14
|
+
@config.process_file? ? process_file : unprocessed_tempfile
|
15
|
+
rescue ExitStatusError
|
16
|
+
raise Paperclip::Error, "JPEGTRAN : There was an error processing #{@basename}" if @config.whiny
|
17
|
+
rescue CommandNotFoundError
|
18
|
+
raise Paperclip::Errors::CommandNotFoundError.new("Could not run 'jpegtran'. Please install jpegtran.")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def gem_defaults
|
25
|
+
{
|
26
|
+
command: command_path('jpegtran'),
|
27
|
+
options: JPEGTRAN_DEFAULT_OPTS
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def compress
|
32
|
+
Paperclip.run(
|
33
|
+
@config.command,
|
34
|
+
"#{@config.options} :src_path > :dst_path",
|
35
|
+
src_path: @src_path, dst_path: @dst_path
|
36
|
+
)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Paperclip
|
2
|
+
# Compresses the JPEG and PNG files
|
3
|
+
class Compression < Processor
|
4
|
+
|
5
|
+
def make
|
6
|
+
case content_type
|
7
|
+
when 'image/jpeg' then make_jpeg
|
8
|
+
when 'image/png' then make_png
|
9
|
+
else
|
10
|
+
@file
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
def content_type
|
17
|
+
first_processor? ? @file.content_type : Paperclip::ContentTypeDetector.new(@file.path).detect
|
18
|
+
end
|
19
|
+
|
20
|
+
def first_processor?
|
21
|
+
@first_processor ||= @file.is_a?(Paperclip::AbstractAdapter)
|
22
|
+
end
|
23
|
+
|
24
|
+
def make_jpeg
|
25
|
+
PaperclipCompression::Jpeg.make(@file, first_processor?, @options)
|
26
|
+
end
|
27
|
+
|
28
|
+
def make_png
|
29
|
+
PaperclipCompression::Png.make(@file, first_processor?, @options)
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
module PaperclipCompression
|
2
|
+
class Png < Base
|
3
|
+
|
4
|
+
KEY = :png
|
5
|
+
OPTIPNG_DEFAULT_OPTS = '-o 5 -quiet'
|
6
|
+
|
7
|
+
def initialize(file, first_processor, options = {})
|
8
|
+
super(file, first_processor)
|
9
|
+
@config = PaperclipCompression::Config.create_with_fallbacks(options, KEY, gem_defaults)
|
10
|
+
end
|
11
|
+
|
12
|
+
def make
|
13
|
+
begin
|
14
|
+
@config.process_file? ? process_file : unprocessed_tempfile
|
15
|
+
rescue ExitStatusError
|
16
|
+
raise Paperclip::Error, "OPTIPNG : There was an error processing #{@basename}" if @config.whiny
|
17
|
+
rescue CommandNotFoundError
|
18
|
+
raise Paperclip::Errors::CommandNotFoundError.new("Could not run 'optipng'. Please install optipng.")
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
private
|
23
|
+
|
24
|
+
def gem_defaults
|
25
|
+
{
|
26
|
+
command: command_path('optipng'),
|
27
|
+
options: OPTIPNG_DEFAULT_OPTS
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
def compress
|
32
|
+
Paperclip.run(
|
33
|
+
@config.command,
|
34
|
+
"#{@config.options} -clobber :src_path -out :dst_path",
|
35
|
+
src_path: @src_path, dst_path: @dst_path
|
36
|
+
)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
metadata
ADDED
@@ -0,0 +1,152 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: kt-paperclip-compression
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.2.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- İ. Emre Kutlu, Adam Anderson
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-03-02 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: kt-paperclip
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '6.4'
|
20
|
+
- - ">="
|
21
|
+
- !ruby/object:Gem::Version
|
22
|
+
version: 6.4.1
|
23
|
+
type: :runtime
|
24
|
+
prerelease: false
|
25
|
+
version_requirements: !ruby/object:Gem::Requirement
|
26
|
+
requirements:
|
27
|
+
- - "~>"
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '6.4'
|
30
|
+
- - ">="
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 6.4.1
|
33
|
+
- !ruby/object:Gem::Dependency
|
34
|
+
name: os
|
35
|
+
requirement: !ruby/object:Gem::Requirement
|
36
|
+
requirements:
|
37
|
+
- - ">="
|
38
|
+
- !ruby/object:Gem::Version
|
39
|
+
version: 1.0.0
|
40
|
+
type: :runtime
|
41
|
+
prerelease: false
|
42
|
+
version_requirements: !ruby/object:Gem::Requirement
|
43
|
+
requirements:
|
44
|
+
- - ">="
|
45
|
+
- !ruby/object:Gem::Version
|
46
|
+
version: 1.0.0
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: bundler
|
49
|
+
requirement: !ruby/object:Gem::Requirement
|
50
|
+
requirements:
|
51
|
+
- - ">="
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '1.3'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
requirements:
|
58
|
+
- - ">="
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: '1.3'
|
61
|
+
- !ruby/object:Gem::Dependency
|
62
|
+
name: rake
|
63
|
+
requirement: !ruby/object:Gem::Requirement
|
64
|
+
requirements:
|
65
|
+
- - ">="
|
66
|
+
- !ruby/object:Gem::Version
|
67
|
+
version: 12.3.3
|
68
|
+
type: :development
|
69
|
+
prerelease: false
|
70
|
+
version_requirements: !ruby/object:Gem::Requirement
|
71
|
+
requirements:
|
72
|
+
- - ">="
|
73
|
+
- !ruby/object:Gem::Version
|
74
|
+
version: 12.3.3
|
75
|
+
- !ruby/object:Gem::Dependency
|
76
|
+
name: rspec
|
77
|
+
requirement: !ruby/object:Gem::Requirement
|
78
|
+
requirements:
|
79
|
+
- - '='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: 3.7.0
|
82
|
+
type: :development
|
83
|
+
prerelease: false
|
84
|
+
version_requirements: !ruby/object:Gem::Requirement
|
85
|
+
requirements:
|
86
|
+
- - '='
|
87
|
+
- !ruby/object:Gem::Version
|
88
|
+
version: 3.7.0
|
89
|
+
- !ruby/object:Gem::Dependency
|
90
|
+
name: guard-rspec
|
91
|
+
requirement: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - '='
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 4.7.3
|
96
|
+
type: :development
|
97
|
+
prerelease: false
|
98
|
+
version_requirements: !ruby/object:Gem::Requirement
|
99
|
+
requirements:
|
100
|
+
- - '='
|
101
|
+
- !ruby/object:Gem::Version
|
102
|
+
version: 4.7.3
|
103
|
+
description: JPEG and PNG compression for Paperclip gem
|
104
|
+
email: emrekutlu@gmail.com, adam@makeascene.com
|
105
|
+
executables: []
|
106
|
+
extensions: []
|
107
|
+
extra_rdoc_files: []
|
108
|
+
files:
|
109
|
+
- bin/linux/x64/jpegtran
|
110
|
+
- bin/linux/x64/optipng
|
111
|
+
- bin/linux/x86/jpegtran
|
112
|
+
- bin/linux/x86/optipng
|
113
|
+
- bin/osx/32bit/jpegtran
|
114
|
+
- bin/osx/32bit/optipng
|
115
|
+
- bin/osx/64bit/jpegtran
|
116
|
+
- bin/osx/64bit/optipng
|
117
|
+
- bin/win32/jpegtran.exe
|
118
|
+
- bin/win32/libjpeg-62.dll
|
119
|
+
- bin/win32/optipng.exe
|
120
|
+
- bin/win64/jpegtran.exe
|
121
|
+
- bin/win64/libjpeg-62.dll
|
122
|
+
- lib/kt-paperclip-compression.rb
|
123
|
+
- lib/paperclip-compression.rb
|
124
|
+
- lib/paperclip-compression/base.rb
|
125
|
+
- lib/paperclip-compression/config.rb
|
126
|
+
- lib/paperclip-compression/jpeg.rb
|
127
|
+
- lib/paperclip-compression/paperclip/compression.rb
|
128
|
+
- lib/paperclip-compression/png.rb
|
129
|
+
homepage: http://github.com/adamtao/kt-paperclip-compression
|
130
|
+
licenses:
|
131
|
+
- MIT
|
132
|
+
metadata: {}
|
133
|
+
post_install_message:
|
134
|
+
rdoc_options: []
|
135
|
+
require_paths:
|
136
|
+
- lib
|
137
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
138
|
+
requirements:
|
139
|
+
- - ">="
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
143
|
+
requirements:
|
144
|
+
- - ">="
|
145
|
+
- !ruby/object:Gem::Version
|
146
|
+
version: '0'
|
147
|
+
requirements: []
|
148
|
+
rubygems_version: 3.1.2
|
149
|
+
signing_key:
|
150
|
+
specification_version: 4
|
151
|
+
summary: Image compression for Paperclip
|
152
|
+
test_files: []
|