Skip to content

Commit 17e0aee

Browse files
committed
Expand ActiveStorage variant mapping and tighten integration linting
1 parent aa09e3e commit 17e0aee

File tree

6 files changed

+56
-20
lines changed

6 files changed

+56
-20
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -526,6 +526,7 @@ url_for(record.file.preview(resize_to_limit: [320, 320]))
526526
```ruby
527527
image_tag(record.image.variant(resize_to_limit: [320, 320], quality: "smart"))
528528
image_tag(record.image.variant(resize_to_fill: [200, 120]))
529+
image_tag(record.image.variant(resize_to_fit: [640, 480]))
529530
```
530531

531532
### Uploadcare API interfaces

lib/uploadcare/rails/active_storage/integration.rb

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
module Uploadcare
77
module Rails
88
module ActiveStorage
9+
# :nodoc:
910
module Integration
1011
module_function
1112

lib/uploadcare/rails/active_storage/uploadcare_previewer.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
module Uploadcare
99
module Rails
1010
module ActiveStorage
11+
# :nodoc:
1112
class UploadcarePreviewer < ::ActiveStorage::Previewer
1213
class << self
1314
def accept?(blob)
@@ -47,13 +48,17 @@ def open_preview_io(url)
4748
tempfile.binmode
4849

4950
response = http_get(url)
50-
raise ::ActiveStorage::PreviewError, "Uploadcare preview fetch failed: #{response.code}" unless response.is_a?(Net::HTTPSuccess)
51+
raise_preview_error(response) unless response.is_a?(Net::HTTPSuccess)
5152

5253
tempfile.write(response.body)
5354
tempfile.rewind
5455
yield tempfile
5556
ensure
56-
tempfile.close! if tempfile
57+
tempfile&.close!
58+
end
59+
60+
def raise_preview_error(response)
61+
raise ::ActiveStorage::PreviewError, "Uploadcare preview fetch failed: #{response.code}"
5762
end
5863

5964
def http_get(url, limit = 5)

lib/uploadcare/rails/active_storage/variant_remote_processing.rb

Lines changed: 26 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
module Uploadcare
77
module Rails
88
module ActiveStorage
9+
# :nodoc:
910
module VariantRemoteProcessing
1011
private
1112

@@ -28,13 +29,13 @@ def download_transformed_uploadcare_image
2829
tempfile.binmode
2930

3031
response = http_get(variant_source_url)
31-
raise ::ActiveStorage::IntegrityError, "Uploadcare variant fetch failed: #{response.code}" unless response.is_a?(Net::HTTPSuccess)
32+
raise_integrity_error(response) unless response.is_a?(Net::HTTPSuccess)
3233

3334
tempfile.write(response.body)
3435
tempfile.rewind
3536
yield tempfile
3637
ensure
37-
tempfile.close! if tempfile
38+
tempfile&.close!
3839
end
3940

4041
def variant_source_url
@@ -48,23 +49,32 @@ def uploadcare_uuid
4849

4950
def uploadcare_transformations
5051
mapped = variation.transformations.deep_symbolize_keys.except(:format)
51-
resize_to_limit = mapped.delete(:resize_to_limit)
52-
resize_to_fill = mapped.delete(:resize_to_fill)
52+
map_resize!(mapped, mapped.delete(:resize_to_fit))
53+
map_resize!(mapped, mapped.delete(:resize_to_limit))
54+
map_scale_crop!(mapped, mapped.delete(:resize_to_fill))
5355

54-
if resize_to_limit.present?
55-
width, height = resize_to_limit
56-
mapped[:resize] = [width, height].compact.join('x')
57-
end
56+
mapped
57+
end
5858

59-
if resize_to_fill.present?
60-
width, height = resize_to_fill
61-
mapped[:scale_crop] = {
62-
dimensions: [width, height].compact.join('x'),
63-
offsets: '50%,50%'
64-
}
65-
end
59+
def map_resize!(mapped, dimensions)
60+
return if dimensions.blank?
6661

67-
mapped
62+
width, height = dimensions
63+
mapped[:resize] = [width, height].compact.join('x')
64+
end
65+
66+
def map_scale_crop!(mapped, dimensions)
67+
return if dimensions.blank?
68+
69+
width, height = dimensions
70+
mapped[:scale_crop] = {
71+
dimensions: [width, height].compact.join('x'),
72+
offsets: '50%,50%'
73+
}
74+
end
75+
76+
def raise_integrity_error(response)
77+
raise ::ActiveStorage::IntegrityError, "Uploadcare variant fetch failed: #{response.code}"
6878
end
6979

7080
def http_get(url, limit = 5)

spec/uploadcare/rails/active_storage/uploadcare_previewer_spec.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66
require 'uploadcare/rails/active_storage/uploadcare_previewer'
77

88
RSpec.describe Uploadcare::Rails::ActiveStorage::UploadcarePreviewer do
9-
let(:service) { ActiveStorage::Service::UploadcareService.new(public_key: 'demopublickey', secret_key: 'demosecretkey') }
9+
let(:service) do
10+
ActiveStorage::Service::UploadcareService.new(
11+
public_key: 'demopublickey',
12+
secret_key: 'demosecretkey'
13+
)
14+
end
1015
let(:uuid) { '2d33999d-c74a-4ff9-99ea-abc23496b052' }
1116
let(:filename) { double(base: 'report') }
1217
let(:blob) do

spec/uploadcare/rails/active_storage/variant_remote_processing_spec.rb

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@
66
require 'uploadcare/rails/active_storage/variant_remote_processing'
77

88
RSpec.describe Uploadcare::Rails::ActiveStorage::VariantRemoteProcessing do
9-
let(:service) { ActiveStorage::Service::UploadcareService.new(public_key: 'demopublickey', secret_key: 'demosecretkey') }
9+
let(:service) do
10+
ActiveStorage::Service::UploadcareService.new(
11+
public_key: 'demopublickey',
12+
secret_key: 'demosecretkey'
13+
)
14+
end
1015
let(:uuid) { '2d33999d-c74a-4ff9-99ea-abc23496b052' }
1116

1217
let(:variant_host_class) do
@@ -65,6 +70,15 @@ def process
6570
expect(mapped[:scale_crop]).to eq({ dimensions: '200x100', offsets: '50%,50%' })
6671
end
6772

73+
it 'maps resize_to_fit into uploadcare resize operation' do
74+
fit_variation = double(format: 'png', transformations: { resize_to_fit: [640, 480] })
75+
host = variant_host_class.new(service: service, blob: blob, variation: fit_variation)
76+
77+
mapped = host.send(:uploadcare_transformations)
78+
79+
expect(mapped[:resize]).to eq('640x480')
80+
end
81+
6882
it 'falls back to base process when service is not uploadcare service' do
6983
non_uploadcare_service = Object.new
7084
host = variant_host_class.new(service: non_uploadcare_service, blob: blob, variation: variation)

0 commit comments

Comments
 (0)