hydra-derivatives 4.0.0 → 4.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 0320cb9c40c7d32320a33c09092567f69176ef7ba09d0e3eb85a4d8a59e9324d
4
- data.tar.gz: 84689d529bc702a13c067cead22b253de5982c185850032186c7d0ba72683b10
3
+ metadata.gz: d57cbceda9c0d06164a39a9d02c08f87d3595d2c7e4b651c45febd2b1f170304
4
+ data.tar.gz: 335f28d6f50ca793f9209cc0d178333958fe0900885dd60db887ee1d7967da39
5
5
  SHA512:
6
- metadata.gz: 2138cc83cfa2bd0db1825831f4d4a70a4112ce0b728d957df5119c4af55163e932653758f06035c0734a6b284e1be6b0428ebaf71289b94e8108328f2ef12bfc
7
- data.tar.gz: ff20e72fcd91fda4a9b52aad791af7c467b893a3ae1df79fef818a4606be8c3ec507598ab20f0afc3ec1477b5621f14c2a0538d890ec4ba3125ff38df6972b5c
6
+ metadata.gz: 6f9a349b34da727f960c055363c6c49d82d1606e2f5679bf75c6c5d476493cc966f6257e74c171736e0ecacf28a8d997e20381b098844380d7a6deed24db54e9
7
+ data.tar.gz: 54834ba67208b3345c030b068ebe67c6b831e3541d9632973c91930c5b27a6e9025ca009fca5abec3313692062c0928131bcfbf1f924afd0345f20cbec739767
data/.circleci/config.yml CHANGED
@@ -29,7 +29,7 @@ jobs:
29
29
  command: |
30
30
  wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -
31
31
  sudo apt-get update
32
- sudo apt-get install ghostscript libpng-dev imagemagick graphicsmagick ffmpeg libreoffice dcraw
32
+ sudo apt-get install ghostscript libpng-dev imagemagick graphicsmagick libvips libvips-dev libvips-tools ffmpeg libreoffice dcraw
33
33
  - restore_cache:
34
34
  name: Restore Kakadu Cache
35
35
  keys:
data/.rubocop_todo.yml CHANGED
@@ -8,6 +8,7 @@ Layout/SpaceBeforeBlockBraces:
8
8
  Metrics/ClassLength:
9
9
  Exclude:
10
10
  - lib/hydra/derivatives/processors/jpeg2k_image.rb
11
+ - lib/hydra/derivatives/processors/image.rb
11
12
 
12
13
  Metrics/CyclomaticComplexity:
13
14
  Exclude:
data/Dockerfile CHANGED
@@ -7,6 +7,9 @@ RUN apt update && apt -y install \
7
7
  zip \
8
8
  ghostscript \
9
9
  libpng-dev \
10
+ libvips \
11
+ libvips-dev \
12
+ libvips-tools \
10
13
  graphicsmagick \
11
14
  ffmpeg \
12
15
  libreoffice \
@@ -14,10 +17,11 @@ RUN apt update && apt -y install \
14
17
  dcraw \
15
18
  libyaml-dev
16
19
 
17
- RUN mkdir -p /opt/kakadu/downloads
18
- RUN wget http://kakadusoftware.com/wp-content/uploads/KDU805_Demo_Apps_for_Linux-x86-64_200602.zip -O /opt/kakadu/downloads/kakadu.zip \
19
- && unzip /opt/kakadu/downloads/kakadu.zip \
20
- && mv KDU805_Demo_Apps_for_Linux-x86-64_200602 kakadu \
20
+ ARG KAKADU_ZIP
21
+ RUN mkdir -p /opt/kakadu
22
+ COPY $KAKADU_ZIP.zip /opt/kakadu/downloads/kakadu.zip
23
+ RUN unzip /opt/kakadu/downloads/kakadu.zip \
24
+ && mv $KAKADU_ZIP kakadu \
21
25
  && cp kakadu/*.so /usr/lib \
22
26
  && cp kakadu/* /usr/bin
23
27
 
data/README.md CHANGED
@@ -257,10 +257,18 @@ If you don't want to run the whole suite all at once like CI, do the following:
257
257
 
258
258
  First, make sure you have installed [Docker](https://www.docker.com/).
259
259
 
260
- Within your cloned repository, tell Docker to get started installing your development environment:
260
+ Download the most recent version of the Linux Kakadu demo from [the downloads page](https://kakadusoftware.com/documentation-downloads/downloads/)
261
+ and place it in your cloned repository. (This requires signing up with an email address.)
262
+
263
+ Note the name of the zip file without the .zip extension. We will pass this name as an argument when building
264
+ the docker container. For example, if the name of the zip file is `KDU841_Demo_Apps_for_Linux-x86-64_231117.zip`,
265
+ we will pass `KDU841_Demo_Apps_for_Linux-x86-64_231117` to `docker compose build`.
266
+
267
+ Within your cloned repository, tell Docker to get started installing your development environment, replacing
268
+ `<name of zip file>` with the name of your downloaded file above.
261
269
 
262
270
  ```sh
263
- docker compose build
271
+ docker compose build --build-arg KAKADU_ZIP=<name of zip file>
264
272
  docker compose up
265
273
  ```
266
274
 
data/VERSION CHANGED
@@ -1 +1 @@
1
- 4.0.0
1
+ 4.1.0
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.add_development_dependency 'bundler', '~> 2.1'
19
19
  spec.add_development_dependency 'fcrepo_wrapper', '~> 0.2'
20
20
  spec.add_development_dependency 'pry-byebug'
21
- spec.add_development_dependency 'rails', '> 5.1', '< 8.0'
21
+ spec.add_development_dependency 'rails', '> 5.1', '< 9.0'
22
22
  spec.add_development_dependency 'rake'
23
23
  spec.add_development_dependency 'rspec', '~> 3.1'
24
24
  spec.add_development_dependency "solr_wrapper"
@@ -26,9 +26,10 @@ Gem::Specification.new do |spec|
26
26
  spec.add_dependency 'active_encode', '~> 1.2'
27
27
  spec.add_dependency 'active-fedora', '>= 14.0'
28
28
  spec.add_dependency 'active-triples', '>= 1.2'
29
- spec.add_dependency 'activesupport', '>= 4.0', '< 8.0'
29
+ spec.add_dependency 'activesupport', '>= 4.0', '< 9.0'
30
30
  spec.add_dependency 'addressable', '~> 2.5'
31
31
  spec.add_dependency 'deprecation'
32
32
  spec.add_dependency 'mime-types', '> 2.0', '< 4.0'
33
33
  spec.add_dependency 'mini_magick', '>= 3.2', '< 5'
34
+ spec.add_dependency 'ruby-vips'
34
35
  end
@@ -1,5 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
  require 'mini_magick'
3
+ require 'ruby-vips'
3
4
 
4
5
  module Hydra::Derivatives::Processors
5
6
  class Image < Processor
@@ -22,6 +23,8 @@ module Hydra::Derivatives::Processors
22
23
  def create_resized_image
23
24
  if Hydra::Derivatives::ImageService.processor == :graphicsmagick
24
25
  create_resized_image_with_graphicsmagick
26
+ elsif Hydra::Derivatives::ImageService.processor == :libvips
27
+ create_resized_image_with_libvips
25
28
  else
26
29
  create_resized_image_with_imagemagick
27
30
  end
@@ -52,12 +55,38 @@ module Hydra::Derivatives::Processors
52
55
  end
53
56
  end
54
57
 
58
+ # rubocop:disable Metrics/MethodLength
59
+ def create_resized_image_with_libvips
60
+ Hydra::Derivatives::Logger.debug('[ImageProcessor] Using libvips resize method')
61
+ create_image do |temp_file|
62
+ if size
63
+ width, height, option = size.match(/(\d+)x(\d+)(.)?/).captures
64
+ # Translate imagemagick resize syntax into ruby-vips
65
+ size_option = case option
66
+ when '>'
67
+ :down
68
+ when '<'
69
+ :up
70
+ when '!'
71
+ :force
72
+ end
73
+ temp_file.thumbnail_image(width.to_i, height: height.to_i, size: size_option)
74
+ end
75
+ end
76
+ end
77
+ # rubocop:enable Metrics/MethodLength
78
+
55
79
  def create_image
56
- xfrm = selected_layers(load_image_transformer)
57
- yield(xfrm) if block_given?
58
- xfrm.format(directives.fetch(:format))
59
- xfrm.quality(quality.to_s) if quality
60
- write_image(xfrm)
80
+ if Hydra::Derivatives::ImageService.processor == :libvips
81
+ image = block_given? ? yield(load_image_transformer) : load_image_transformer
82
+ write_image_with_vips(image, directives)
83
+ else
84
+ xfrm = selected_layers(load_image_transformer)
85
+ yield(xfrm) if block_given?
86
+ xfrm.format(directives.fetch(:format))
87
+ xfrm.quality(quality.to_s) if quality
88
+ write_image(xfrm)
89
+ end
61
90
  end
62
91
 
63
92
  def write_image(xfrm)
@@ -67,10 +96,24 @@ module Hydra::Derivatives::Processors
67
96
  output_file_service.call(output_io, directives)
68
97
  end
69
98
 
99
+ def write_image_with_vips(image, directives)
100
+ output_io = StringIO.new
101
+ format = directives.fetch(:format, "jpg")
102
+ format_string = ".#{format}#{"[Q=#{quality}]" if quality}"
103
+ output_io.write(image.write_to_buffer(format_string))
104
+ output_io.rewind
105
+ output_file_service.call(output_io, directives)
106
+ end
107
+
70
108
  # Override this method if you want a different transformer, or need to load the
71
109
  # raw image from a different source (e.g. external file)
72
110
  def load_image_transformer
73
- MiniMagick::Image.open(source_path)
111
+ if Hydra::Derivatives::ImageService.processor == :libvips
112
+ # Vips specifies pdf layers at load time
113
+ selected_vips_layers(source_path)
114
+ else
115
+ MiniMagick::Image.open(source_path)
116
+ end
74
117
  end
75
118
 
76
119
  private
@@ -92,5 +135,13 @@ module Hydra::Derivatives::Processors
92
135
  image
93
136
  end
94
137
  end
138
+
139
+ def selected_vips_layers(source_path)
140
+ if `vipsheader #{Shellwords.escape(source_path)}` =~ /pdfload/i && directives.fetch(:layer, false)
141
+ Vips::Image.new_from_file(source_path, page: directives.fetch(:layer))
142
+ else
143
+ Vips::Image.new_from_file(source_path)
144
+ end
145
+ end
95
146
  end
96
147
  end
@@ -13,8 +13,11 @@ module Hydra::Derivatives
13
13
  when 'graphicsmagick'
14
14
  Hydra::Derivatives::Logger.debug('[ImageProcessor] Using GraphicsMagick as image processor')
15
15
  :graphicsmagick
16
+ when 'libvips'
17
+ Hydra::Derivatives::Logger.debug('[ImageProcessor] Using libvips as image processor')
18
+ :libvips
16
19
  else
17
- Hydra::Derivatives::Logger.debug("[ImageProcessor] The environment variable IMAGE_PROCESSOR should be set to either 'imagemagick' or 'graphicsmagick'. It is currently set to: #{ENV['IMAGE_PROCESSOR']}. Defaulting to using #{default_processor}")
20
+ Hydra::Derivatives::Logger.debug("[ImageProcessor] The environment variable IMAGE_PROCESSOR should be set to 'imagemagick','graphicsmagick' or 'libvips'. It is currently set to: #{ENV['IMAGE_PROCESSOR']}. Defaulting to using #{default_processor}")
18
21
  default_processor
19
22
  end
20
23
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hydra-derivatives
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.0.0
4
+ version: 4.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Justin Coyne
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-01 00:00:00.000000000 Z
11
+ date: 2025-12-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -61,7 +61,7 @@ dependencies:
61
61
  version: '5.1'
62
62
  - - "<"
63
63
  - !ruby/object:Gem::Version
64
- version: '8.0'
64
+ version: '9.0'
65
65
  type: :development
66
66
  prerelease: false
67
67
  version_requirements: !ruby/object:Gem::Requirement
@@ -71,7 +71,7 @@ dependencies:
71
71
  version: '5.1'
72
72
  - - "<"
73
73
  - !ruby/object:Gem::Version
74
- version: '8.0'
74
+ version: '9.0'
75
75
  - !ruby/object:Gem::Dependency
76
76
  name: rake
77
77
  requirement: !ruby/object:Gem::Requirement
@@ -165,7 +165,7 @@ dependencies:
165
165
  version: '4.0'
166
166
  - - "<"
167
167
  - !ruby/object:Gem::Version
168
- version: '8.0'
168
+ version: '9.0'
169
169
  type: :runtime
170
170
  prerelease: false
171
171
  version_requirements: !ruby/object:Gem::Requirement
@@ -175,7 +175,7 @@ dependencies:
175
175
  version: '4.0'
176
176
  - - "<"
177
177
  - !ruby/object:Gem::Version
178
- version: '8.0'
178
+ version: '9.0'
179
179
  - !ruby/object:Gem::Dependency
180
180
  name: addressable
181
181
  requirement: !ruby/object:Gem::Requirement
@@ -244,6 +244,20 @@ dependencies:
244
244
  - - "<"
245
245
  - !ruby/object:Gem::Version
246
246
  version: '5'
247
+ - !ruby/object:Gem::Dependency
248
+ name: ruby-vips
249
+ requirement: !ruby/object:Gem::Requirement
250
+ requirements:
251
+ - - ">="
252
+ - !ruby/object:Gem::Version
253
+ version: '0'
254
+ type: :runtime
255
+ prerelease: false
256
+ version_requirements: !ruby/object:Gem::Requirement
257
+ requirements:
258
+ - - ">="
259
+ - !ruby/object:Gem::Version
260
+ version: '0'
247
261
  description: Derivative generation plugin for hydra
248
262
  email:
249
263
  - jenlindner@gmail.com
@@ -352,7 +366,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
352
366
  - !ruby/object:Gem::Version
353
367
  version: '0'
354
368
  requirements: []
355
- rubygems_version: 3.5.3
369
+ rubygems_version: 3.5.22
356
370
  signing_key:
357
371
  specification_version: 4
358
372
  summary: Derivative generation plugin for hydra