aboutsummaryrefslogtreecommitdiffstats
path: root/app/models/active_storage/variation.rb
diff options
context:
space:
mode:
Diffstat (limited to 'app/models/active_storage/variation.rb')
-rw-r--r--app/models/active_storage/variation.rb41
1 files changed, 41 insertions, 0 deletions
diff --git a/app/models/active_storage/variation.rb b/app/models/active_storage/variation.rb
new file mode 100644
index 0000000000..f7c81bb99a
--- /dev/null
+++ b/app/models/active_storage/variation.rb
@@ -0,0 +1,41 @@
+require "active_support/core_ext/object/inclusion"
+
+# A set of transformations that can be applied to a blob to create a variant.
+class ActiveStorage::Variation
+ class_attribute :verifier
+
+ attr_reader :transformations
+
+ class << self
+ def decode(key)
+ new verifier.verify(key)
+ end
+
+ def encode(transformations)
+ verifier.generate(transformations)
+ end
+ end
+
+ def initialize(transformations)
+ @transformations = transformations
+ end
+
+ def transform(image)
+ transformations.each do |(method, argument)|
+ if eligible_argument?(argument)
+ image.public_send(method, argument)
+ else
+ image.public_send(method)
+ end
+ end
+ end
+
+ def key
+ self.class.encode(transformations)
+ end
+
+ private
+ def eligible_argument?(argument)
+ argument.present? && argument != true
+ end
+end