rails-webp 0.1 → 0.1.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3ec97dc302098c80af96495f165ee8afd728db23dce34c88b3e580ff608a659b
4
- data.tar.gz: 5edfe398846e8cb4d44e36d769a74fb9cc2e486c11b8eaf710d2c6daaac33b81
3
+ metadata.gz: 71dc74349b769d210dfac65270ca98c18370085679b7dc65571a4561cf502b3a
4
+ data.tar.gz: ade953a26071ceab38f52137acb6188d2805d9641629fc7831f778666dff270f
5
5
  SHA512:
6
- metadata.gz: b817eb8374517d1d3312da730a2b492447dfff9f98b57274fd4d9fa773ed2201da75bc7914b40477bbe3f38839ca53de7d7e86004e539861780c80c5a301067f
7
- data.tar.gz: 770838c077d9973a6bfc276303c0b1aa6ea8e285d9ffd8bcf39dd6a64620f6df88cc4a443fc6bf8c0733180210798aa4e55eb2d949792ca80d11cdb47968b275
6
+ metadata.gz: 6e141952f99a18c8063373a4fc0480620856d857873ce7eb6c7e19b6cdfa6c707344cee1bed6e2c40404e9515febf5f62634dbfdc05d3db9965d0b505bf013ba
7
+ data.tar.gz: 960db331883e44ca712d049faabfdceaf35863018e5252fa5fe47c1d053f5ee62c254fb3efdc27b15578adc8ab9f43aebcb506ba17b9a933ae4dfe28918c0adb
data/Gemfile.lock ADDED
@@ -0,0 +1,39 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ rails-webp (0.1)
5
+ mini_magick
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ byebug (11.0.1)
11
+ diff-lcs (1.3)
12
+ mini_magick (4.9.3)
13
+ rake (10.5.0)
14
+ rspec (3.8.0)
15
+ rspec-core (~> 3.8.0)
16
+ rspec-expectations (~> 3.8.0)
17
+ rspec-mocks (~> 3.8.0)
18
+ rspec-core (3.8.0)
19
+ rspec-support (~> 3.8.0)
20
+ rspec-expectations (3.8.3)
21
+ diff-lcs (>= 1.2.0, < 2.0)
22
+ rspec-support (~> 3.8.0)
23
+ rspec-mocks (3.8.0)
24
+ diff-lcs (>= 1.2.0, < 2.0)
25
+ rspec-support (~> 3.8.0)
26
+ rspec-support (3.8.0)
27
+
28
+ PLATFORMS
29
+ ruby
30
+
31
+ DEPENDENCIES
32
+ bundler (~> 2.0)
33
+ byebug
34
+ rails-webp!
35
+ rake (~> 10.0)
36
+ rspec (~> 3.0)
37
+
38
+ BUNDLED WITH
39
+ 2.0.1
data/README.md CHANGED
@@ -1,11 +1,11 @@
1
1
  # Rails::Webp
2
2
 
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/rails/webp`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- TODO: Delete this and the text above, and describe your gem
3
+ Create webp copies of your image assets the easy way using [minimagick](https://github.com/minimagick/minimagick)!
6
4
 
7
5
  ## Installation
8
6
 
7
+ Before installing, make sure you have [ImageMagick](https://imagemagick.org/script/download.php) installed on your host.
8
+
9
9
  Add this line to your application's Gemfile:
10
10
 
11
11
  ```ruby
@@ -22,7 +22,35 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- TODO: Write usage instructions here
25
+ This gem is intended to be used as a post processor step in your asset pipeline:
26
+ ```
27
+ bundle exec rake assets:precompile
28
+ ```
29
+
30
+ You can configure options passed to ImageMagick in an initializer:
31
+
32
+ `config/initializers/webp.rb`:
33
+
34
+ ```
35
+ Rails::WebP.encode_options = { quality: 80, lossless: true, method: 6, alpha_filtering: 2, alpha_compression: 0, alpha_quality: 100 }
36
+ ```
37
+
38
+ A comprehensive list of options can be found [here](https://imagemagick.org/script/webp.php).
39
+
40
+ **Note:** a digest is included in the processed webp image's file name. This digest is compared for each time compilation occurs.
41
+ By default, `rails-webp` will only process images that have a mismatched digest (AKA hash of source image contents).
42
+ If you wish to force webp processing:
43
+
44
+ ```
45
+ Rails::WebP.force = true # default: false
46
+ ```
47
+
48
+
49
+ ## Motivations for this gem
50
+
51
+ In my experience, the existing gems for processing webp images in the Rails Asset Pipeline made questionable assumptions.
52
+ More importantly, I could not use the native libraries used by those gems in my team's acceptance/production environment.
53
+ ImageMagick was an easy choice for this reason because it's widely implemented, used, and understood (my opinion).
26
54
 
27
55
  ## Development
28
56
 
@@ -0,0 +1,67 @@
1
+ require 'fileutils'
2
+ require 'logger'
3
+ require 'mini_magick'
4
+
5
+ module Rails
6
+ module WebP
7
+ class Converter
8
+ class << self
9
+ attr_reader :context
10
+
11
+ def process(input_path, data, context)
12
+ @context = context
13
+ app = Rails.application
14
+ prefix = app.config.assets.prefix
15
+ digest = data_digest(data)
16
+ webp_file = webp_file_name(data, digest)
17
+ output_path = Pathname.new(File.join(app.root, 'public', prefix, webp_file))
18
+ if WebP.force || !webp_file_exists?(digest, output_path)
19
+ FileUtils.mkdir_p(output_path.dirname) unless Dir.exists?(output_path.dirname)
20
+ convert_to_webp(input_path, output_path)
21
+ logger.info "Writing #{output_path}"
22
+ end
23
+ data
24
+ end
25
+
26
+ def convert_to_webp(input_path, output_path)
27
+ # Ex: convert wizard.png -quality 50 -define webp:lossless=true wizard.webp
28
+ MiniMagick::Tool::Convert.new do |convert|
29
+ convert << input_path
30
+ options = WebP.encode_options
31
+ convert << '-quality' << options[:quality]
32
+ options.except(:quality).each do |name, value|
33
+ convert << "-define" << "webp:#{name.to_s.dasherize}=#{value}"
34
+ end
35
+ convert << output_path
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def data_digest(data)
42
+ "-#{context.environment.digest_class.new.update(data).to_s}"
43
+ end
44
+
45
+ def webp_file_name(data, digest)
46
+ file_name = context.logical_path # Original File name w/o extension
47
+ file_ext = context.pathname.extname # Original File extension
48
+ "#{file_name}#{digest}.webp" # WebP File fullname
49
+ end
50
+
51
+ def webp_file_exists?(digest, output_path)
52
+ File.exists?(output_path) && digest == output_path.to_s.split('-').last.split('.').first
53
+ end
54
+
55
+ def logger
56
+ if context && context.environment
57
+ context.environment.logger
58
+ else
59
+ logger = Logger.new($stderr)
60
+ logger.level = Logger::FATAL
61
+ logger
62
+ end
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,27 @@
1
+ module Rails
2
+ module WebP
3
+ class PostProcessor
4
+ def initialize(filename, &block)
5
+ @filename = filename
6
+ @source = block.call
7
+ end
8
+
9
+ def render(context, empty_hash_wtf)
10
+ self.class.run(@filename, @source, context)
11
+ end
12
+
13
+ def self.run(filename, data, context)
14
+ Converter.process(filename, data, context)
15
+ end
16
+
17
+ def self.call(input)
18
+ filename = input[:filename]
19
+ source = input[:data]
20
+ context = input[:environment].context_class.new(input)
21
+
22
+ result = run(filename, source, context)
23
+ context.metadata.merge(data: result)
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,19 @@
1
+ require 'sprockets/processing'
2
+
3
+ module Rails
4
+ module WebP
5
+ class Railtie < ::Rails::Railtie
6
+ extend Sprockets::Processing
7
+
8
+ initializer :webp, group: :all do |app|
9
+ app.config.assets.configure do |env|
10
+ env.register_mime_type 'image/jpeg', '.jpeg'
11
+ env.register_postprocessor 'image/jpeg', PostProcessor
12
+
13
+ env.register_mime_type 'image/png', '.png'
14
+ env.register_postprocessor 'image/png', PostProcessor
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -1,5 +1,5 @@
1
1
  module Rails
2
2
  module WebP
3
- VERSION = "0.1"
3
+ VERSION = "0.1.1"
4
4
  end
5
5
  end
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rails-webp
3
3
  version: !ruby/object:Gem::Version
4
- version: '0.1'
4
+ version: 0.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jake Peterson
@@ -90,16 +90,20 @@ extra_rdoc_files: []
90
90
  files:
91
91
  - ".gitignore"
92
92
  - ".rspec"
93
- - ".travis.yml"
94
93
  - CODE_OF_CONDUCT.md
95
94
  - Gemfile
95
+ - Gemfile.lock
96
96
  - LICENSE.txt
97
97
  - README.md
98
98
  - Rakefile
99
99
  - bin/console
100
100
  - bin/setup
101
101
  - lib/rails/webp.rb
102
+ - lib/rails/webp/converter.rb
103
+ - lib/rails/webp/post_processor.rb
104
+ - lib/rails/webp/railtie.rb
102
105
  - lib/rails/webp/version.rb
106
+ - rails-webp-0.1.gem
103
107
  - rails-webp.gemspec
104
108
  homepage: https://github.com/jakenberg
105
109
  licenses:
data/.travis.yml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- sudo: false
3
- language: ruby
4
- cache: bundler
5
- rvm:
6
- - 2.5.3
7
- before_install: gem install bundler -v 2.0.1