jekyll_picture_tag 2.0.0 → 2.0.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: 3f9db202e681087ec43ee9cc26b3e32dbc76de45c394ea834039b72f100215e1
4
- data.tar.gz: 2c195508efb7d9e05bda81dd529366f47fa25c5e1ce7bc6ca60edbd5e2db8a4f
3
+ metadata.gz: 5d6d2bf0edc139d12f269e614e3585ecf18ace2a48a92e9bc1367a6e654ba2d0
4
+ data.tar.gz: e6fe2197c58c368255472631adeef9dd9a593230c7655617ad66d00330ba4b4e
5
5
  SHA512:
6
- metadata.gz: fc17dcd0e8a5ffb70f3ca67bf22e8bb34b2e9c5af61ffabaf5e92e853b01bec6a0b56a01f45ccc44f55be11112aed75e04ac293e4d8012af3b135ce20aaa84fb
7
- data.tar.gz: '09b01489bcd3dc1e7428ae41fe6f603488f1863cc731ad0d70f5861cb1c3525dda04f7445a9f97d22f005b5a900c8d6ba019467f7379575fe07c0370e9a0d8cb'
6
+ metadata.gz: 8682488670153d69640703aa1cd128f57be84c979efff085d19144e4861c3a7d854ae9d638e766ce2398ccafec68b9243613b65b2186e51c83a3d89ef9bc3c9d
7
+ data.tar.gz: 631adc8189614973ab8ad6b14c2b08fd335abcf53cf8a7b6b63cd23f66bcfb9e5f2c800e188b0eeee46242d2a409db776ec5ad64bae0df4fd7c7ca4694429e49
@@ -1,6 +1,9 @@
1
1
  ---
2
2
  ---
3
3
  # Release History
4
+ * 2.0.1 March 31, 2021
5
+ * Select imagemagick deliberately when appropriate, rather than simply rescuing all vips errors
6
+ and trying again. This will stop JPT from suppressing useful vips errors.
4
7
  * **2.0** March 25, 2021 - [Migration guide](/jekyll_picture_tag/users/notes/migration_2)
5
8
  * Switch from ImageMagick to libvips.
6
9
  * 🚀🔥🔥**MUCH MORE FASTER**🔥🔥🚀
data/docs/index.md CHANGED
@@ -5,6 +5,11 @@
5
5
 
6
6
  _Responsive Images, Done Correctly._
7
7
 
8
+ **Warning:** Deploying JPT can be tricky, especially with the new version using libvips. We depend
9
+ on system libraries to generate images, whose presence varies greatly between different
10
+ environments. Before investing a great deal of time, ensure that your deployment process can handle
11
+ all image formats (both input and output) which you will use.
12
+
8
13
  **Note:** These docs are for versions >= 2.0. Documentation for the last stable 1.x version may be
9
14
  found by browsing the repository,
10
15
  [here](https://github.com/rbuchberger/jekyll_picture_tag/tree/v1.14.0/docs). This [migration
@@ -0,0 +1,49 @@
1
+ ---
2
+ sort: 4
3
+ ---
4
+
5
+ # Deployment
6
+
7
+ Deploying a site with JPT is surprisingly tricky. This is because we depend on system libraries
8
+ (libvips and its dependencies) to generate images, but build environments have huge variation in
9
+ what is actually present. Just because a site build works on your local machine, doesn't mean it
10
+ will work when you try to deploy using a build service.
11
+
12
+ Generally, anything which involves building locally and uploading the generated site somewhere, will
13
+ work. Anything which pulls down a git repository and builds it in some container somewhere needs
14
+ extra verification. Often some image formats will be supported, while others will not without
15
+ installing additional packages.
16
+
17
+ ## Help Wanted
18
+
19
+ We could really use help improving this page's guidance. I've created
20
+ [this](https://github.com/rbuchberger/jekyll_picture_tag/issues/240) issue for feedback; I want to
21
+ hear how you're deploying with JPT. I want to hear what worked well for you, and what did not. If
22
+ you're extra motivated and cool, you could make a pull request adding that information to this page.
23
+
24
+ ## Netlify
25
+
26
+ As of March 26, 2021, with version 2.0.0, Netlify is mostly broken. It only supports jpg. I want to
27
+ support netlify as much as reasonably possible, so if a solution isn't found I'll re-add imagemagick
28
+ as an alternate backend and offer it as a configurable setting. Until then, stick with version 1.14.
29
+
30
+ ## AWS S3
31
+
32
+ This method has a somewhat difficult setup, but once configured it works _very_ well. Since you
33
+ build the site locally, if your development build works then your production build will work.
34
+
35
+ [This](https://aws.amazon.com/premiumsupport/knowledge-center/cloudfront-serve-static-website/) is
36
+ the guide you want; **specifically the second option** (Using a website endpoint as the origin, with
37
+ anonymous (public) access allowed). This allows you to have https and excellent performance.
38
+
39
+ For deployment, you'll want to put together either some rake tasks or shell commands to do the
40
+ following:
41
+
42
+ * build: `JEKYLL_ENV=production bundle exec jekyll build`
43
+ * push: `aws s3 sync _site s3://(your bucket here)`
44
+ * invalidate: `aws cloudfront create-invalidation --distribution-id (your distribution id here) --paths '/*'`
45
+ * Cloudfront caches assets for 24 hours. This command invalidates that cache, so your changes go
46
+ live immediately.
47
+ * deploy: `build && push && invalidate`
48
+
49
+ (All of these depend on having the aws cli installed, with proper credentials configured.)
@@ -2,6 +2,15 @@ module PictureTag
2
2
  # Basically a wrapper class for vips. Handles image operations.
3
3
  # Vips returns new images for Crop, resize, and autorotate operations.
4
4
  # Quality, metadata stripping, and format are applied on write.
5
+ #
6
+ # This deserves to be two classes and a factory, one for normal vips save and
7
+ # one for magicksave. This is illustrated by the fact that stubbing backend
8
+ # determination logic for its unit tests would basically require
9
+ # re-implementing it completely.
10
+ #
11
+ # I'm planning to implement standalone imagemagick as an alternative to vips,
12
+ # so when I add that I'll also do that refactoring. For now it works fine and
13
+ # it's not too bloated.
5
14
  class ImageFile
6
15
  def initialize(source, base)
7
16
  @source = source
@@ -35,13 +44,21 @@ module PictureTag
35
44
  image.autorot
36
45
  end
37
46
 
47
+ def handler
48
+ PictureTag.backend.handler_for(@base.format)
49
+ end
50
+
51
+ def quality_key
52
+ handler == :vips ? :Q : :quality
53
+ end
54
+
38
55
  def write_opts
39
56
  opts = PictureTag.preset['image_options'][@base.format] || {}
40
57
 
41
58
  opts[:strip] = PictureTag.preset['strip_metadata']
42
59
 
43
60
  # gifs don't accept a quality setting.
44
- opts[:Q] = base.quality unless base.format == 'gif'
61
+ opts[quality_key] = base.quality unless base.format == 'gif'
45
62
 
46
63
  opts.transform_keys(&:to_sym)
47
64
  end
@@ -51,15 +68,12 @@ module PictureTag
51
68
  end
52
69
 
53
70
  def write(image)
54
- begin
71
+ case handler
72
+ when :vips
55
73
  image.write_to_file(base.absolute_filename, **write_opts)
56
- rescue Vips::Error
57
74
  # If vips can't handle it, fall back to imagemagick.
58
- opts = write_opts.transform_keys do |key|
59
- key == :Q ? :quality : key
60
- end
61
-
62
- image.magicksave(base.absolute_filename, **opts)
75
+ when :magick
76
+ image.magicksave(base.absolute_filename, **write_opts)
63
77
  end
64
78
 
65
79
  # Fix permissions. TODO - still necessary?
@@ -37,5 +37,12 @@ module PictureTag
37
37
  )
38
38
  end
39
39
  end
40
+
41
+ # Main job is to determine which backend should handle which image formats.
42
+ class Backend < Instruction
43
+ def source
44
+ PictureTag::Parsers::ImageBackend.new
45
+ end
46
+ end
40
47
  end
41
48
  end
@@ -3,3 +3,4 @@ require_relative 'parsers/configuration'
3
3
  require_relative 'parsers/html_attributes'
4
4
  require_relative 'parsers/preset'
5
5
  require_relative 'parsers/tag_parser'
6
+ require_relative 'parsers/image_backend'
@@ -0,0 +1,33 @@
1
+ module PictureTag
2
+ module Parsers
3
+ # Returns information regarding image handlers
4
+ class ImageBackend
5
+ def handler_for(format)
6
+ if vips_formats.include? format
7
+ :vips
8
+ elsif magick_formats.include? format
9
+ :magick
10
+ else
11
+ raise "No support for generating #{format} files in this environment."
12
+ end
13
+ end
14
+
15
+ # Returns array of formats that vips can save to
16
+ def vips_formats
17
+ @vips_formats ||= `vips -l filesave`
18
+ .scan(/\.[a-z]{1,5}/)
19
+ .uniq
20
+ .map { |format| format.strip.delete_prefix('.') }
21
+ end
22
+
23
+ # Returns an array of formats that imagemagick can handle.
24
+ def magick_formats
25
+ @magick_formats ||= `convert -version`
26
+ .split("\n")
27
+ .last
28
+ .delete_prefix('Delegates (built-in):')
29
+ .split
30
+ end
31
+ end
32
+ end
33
+ end
@@ -1,3 +1,3 @@
1
1
  module PictureTag
2
- VERSION = '2.0.0'.freeze
2
+ VERSION = '2.0.1'.freeze
3
3
  end
data/readme.md CHANGED
@@ -47,6 +47,35 @@ https://rbuchberger.github.io/jekyll_picture_tag/devs/releases
47
47
 
48
48
  Recent releases:
49
49
 
50
+ * 2.0.1 March 31, 2021
51
+ * Select imagemagick deliberately when appropriate, rather than simply rescuing all vips errors
52
+ and trying again. This will stop JPT from suppressing useful vips errors.
53
+ * **2.0** March 25, 2021 - [Migration guide](https://rbuchberger.github.io/jekyll_picture_tag/users/notes/migration_2)
54
+ * Switch from ImageMagick to libvips.
55
+ * 🚀🔥🔥**MUCH MORE FASTER**🔥🔥🚀
56
+ * Will still attempt to use imagemagick if libvips cannot handle a
57
+ particular image format.
58
+ * Eliminate the ImageMagick v7 on Ubuntu pain we've been dealing with for so
59
+ long.
60
+ * Require Ruby >= 2.6, support Ruby 3.0
61
+ * Require Jekyll >= 4.0
62
+ * Cropping is changing.
63
+ * We now use the libvips
64
+ [smartcrop function](https://www.rubydoc.info/gems/ruby-vips/Vips/Image#smartcrop-instance_method),
65
+ which does some magic to keep the most useful part of the image.
66
+ * Geometry is renamed to 'crop', and reduced to simple aspect ratios only. (`width:height`)
67
+ * Gravity is gone, replaced by 'keep' which is translated to a libvips
68
+ [interestingness](https://www.rubydoc.info/gems/ruby-vips/Vips/Interesting) setting.
69
+ * Add stock presets and media queries, under the `jpt-` prefix.
70
+ * Add `format_quality` default settings for webp, avif, and jp2.
71
+ * Add image-format-specific write options.
72
+ * Overhaul user input handling; we can now validate inputs and give error
73
+ messages which are less useless. Stronger validation and nicer errors will be added in future
74
+ releases.
75
+ * Drop support for `markup_presets` and `media_presets`. They are now
76
+ officially and only `presets` and `media_queries`.
77
+ * Improve docs with an introductory tutorial and 'how-to' flow.
78
+
50
79
  * 1.14.0 January 10, 2021
51
80
  * Gracefully handle empty tag arguments.
52
81
  * Re-add metadata stripping. I removed it inadvertently when refactoring; now
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll_picture_tag
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.0
4
+ version: 2.0.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Robert Wierzbowski
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2021-03-25 00:00:00.000000000 Z
13
+ date: 2021-03-31 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: addressable
@@ -320,6 +320,7 @@ files:
320
320
  - docs/users/configuration/kramdown_fix.md
321
321
  - docs/users/configuration/suppress_warnings.md
322
322
  - docs/users/configuration/urls.md
323
+ - docs/users/deployment.md
323
324
  - docs/users/getting_started.md
324
325
  - docs/users/index.md
325
326
  - docs/users/installation.md
@@ -395,6 +396,7 @@ files:
395
396
  - lib/jekyll_picture_tag/parsers/arg_splitter.rb
396
397
  - lib/jekyll_picture_tag/parsers/configuration.rb
397
398
  - lib/jekyll_picture_tag/parsers/html_attributes.rb
399
+ - lib/jekyll_picture_tag/parsers/image_backend.rb
398
400
  - lib/jekyll_picture_tag/parsers/preset.rb
399
401
  - lib/jekyll_picture_tag/parsers/tag_parser.rb
400
402
  - lib/jekyll_picture_tag/router.rb