cloudinary 1.2.2 → 1.2.3

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
  SHA1:
3
- metadata.gz: 0fcfb2ec23208e42dc314f218a803b9ddc0d62fc
4
- data.tar.gz: d77b2eceee548a28eccca9f3b653cc8946936d2b
3
+ metadata.gz: 334dc407a90f5a0d121718d87976528ec216786c
4
+ data.tar.gz: e326b4b46e3a18c3bbe3367ad460d208f169972e
5
5
  SHA512:
6
- metadata.gz: 326be4f55c3abb55067a0dd4353e2b9bf4607a09f068bc78569094f4bb50006dfed3474863ffcea9a486b3f515ef7dc074d2833b54d8de1924cc8289edddafc7
7
- data.tar.gz: 755b17418a13dd7749947a78af187c01edec641a82097425af880a66b43a7d2b30036940f0e397788c6d65a1b7e84dbf9fcc053c90f81a2282bf52a3b74ccfb3
6
+ metadata.gz: e163279980d8a009331cf45d5f946e8ac7579c4c2086ff15311ccd872eef6e9a19e43e66996de42b5a6a6a719b52e0b1e3f59d5d8a9fa54c18141f931b6608c0
7
+ data.tar.gz: 5a0cabe2f96432e09427c89e8b790bb3d68f345f34658867d991f8784cbda8a0bd76b04c9e92f4501a46ead871bfd53b54a7206a597ae5b424d59f054c0b8034
@@ -1,4 +1,13 @@
1
1
 
2
+ 1.2.3 / 2016-08-21
3
+ ==================
4
+
5
+ * Allow a string to be passed as eager transformation
6
+ * Add `delete_derived_by_transformation` to the Api methods.
7
+ * Support videos mode for url suffixes.
8
+ * Support url suffixes without private cdn
9
+ * Fix `values_match?`
10
+
2
11
  1.2.2 / 2016-07-16
3
12
  ==================
4
13
 
@@ -126,6 +126,22 @@ class Cloudinary::Api
126
126
  call_api(:delete, uri, { :derived_resource_ids => derived_resource_ids }, options)
127
127
  end
128
128
 
129
+ # Delete derived resources identified by transformation for the provided public_ids
130
+ # @param [String|Array] public_ids The resources the derived resources belong to
131
+ # @param [String|Hash|Array] transformations the transformation(s) associated with the derived resources
132
+ # @param [Hash] options
133
+ # @option options [String] :resource_type ("image")
134
+ # @option options [String] :type ("upload")
135
+ def self.delete_derived_by_transformation(public_ids, transformations, options={})
136
+ resource_type = options[:resource_type] || "image"
137
+ type = options[:type] || "upload"
138
+ uri = "resources/#{resource_type}/#{type}"
139
+ params = {:public_ids => public_ids}.merge(only(options, :invalidate))
140
+ params[:keep_original] = true
141
+ params[:transformations] = Cloudinary::Utils.build_eager(transformations)
142
+ call_api(:delete, uri, params, options)
143
+ end
144
+
129
145
  def self.tags(options={})
130
146
  resource_type = options[:resource_type] || "image"
131
147
  uri = "tags/#{resource_type}"
@@ -144,9 +160,9 @@ class Cloudinary::Api
144
160
  call_api(:delete, "transformations/#{transformation_string(transformation)}", {}, options)
145
161
  end
146
162
 
147
- # updates - supports:
148
- # "allowed_for_strict" boolean
149
- # "unsafe_update" transformation params - updates a named transformation parameters without regenerating existing images
163
+ # updates - supports:
164
+ # "allowed_for_strict" boolean
165
+ # "unsafe_update" transformation params - updates a named transformation parameters without regenerating existing images
150
166
  def self.update_transformation(transformation, updates, options={})
151
167
  params = only(updates, :allowed_for_strict)
152
168
  params[:unsafe_update] = transformation_string(updates[:unsafe_update]) if updates[:unsafe_update]
@@ -157,7 +173,7 @@ class Cloudinary::Api
157
173
  call_api(:post, "transformations/#{name}", { :transformation => transformation_string(definition) }, options)
158
174
  end
159
175
 
160
- # upload presets
176
+ # upload presets
161
177
  def self.upload_presets(options={})
162
178
  call_api(:get, "upload_presets", only(options, :next_cursor, :max_results), options)
163
179
  end
@@ -286,6 +286,7 @@ class Cloudinary::Uploader
286
286
  api_url = Cloudinary::Utils.cloudinary_api_url(action, options)
287
287
  headers = { "User-Agent" => Cloudinary::USER_AGENT }
288
288
  headers['Content-Range'] = options[:content_range] if options[:content_range]
289
+ headers.merge!(options[:extra_headers]) if options[:extra_headers]
289
290
  RestClient::Request.execute(:method => :post, :url => api_url, :payload => params.reject { |k, v| v.nil? || v=="" }, :timeout => timeout, :headers => headers) do
290
291
  |response, request, tmpresult|
291
292
  raise CloudinaryException, "Server returned unexpected status code - #{response.code} - #{response.body}" unless [200, 400, 401, 403, 404, 500].include?(response.code)
@@ -316,8 +316,6 @@ class Cloudinary::Utils
316
316
  url_suffix = options.delete(:url_suffix)
317
317
  use_root_path = config_option_consume(options, :use_root_path)
318
318
 
319
- raise(CloudinaryException, "URL Suffix only supported in private CDN") if url_suffix.present? and not private_cdn
320
-
321
319
  original_source = source
322
320
  return original_source if source.blank?
323
321
  if defined?(CarrierWave::Uploader::Base) && source.is_a?(CarrierWave::Uploader::Base)
@@ -401,6 +399,9 @@ class Cloudinary::Utils
401
399
  when resource_type.to_s == "raw" && type.to_s == "upload"
402
400
  resource_type = "files"
403
401
  type = nil
402
+ when resource_type.to_s == "video" && type.to_s == "upload"
403
+ resource_type = "videos"
404
+ type = nil
404
405
  else
405
406
  raise(CloudinaryException, "URL Suffix only supported for image/upload, image/private and raw/upload")
406
407
  end
@@ -748,14 +749,21 @@ class Cloudinary::Utils
748
749
  }
749
750
  end
750
751
 
752
+ #
751
753
  # @private
754
+ # @param [String|Hash|Array] an eager transformation can be a string or hash, with or without a format. The parameter also accepts an array of eager transformations.
752
755
  def self.build_eager(eager)
753
756
  return nil if eager.nil?
754
757
  Cloudinary::Utils.build_array(eager).map do
755
758
  |transformation, format|
756
- transformation = transformation.clone
757
- format = transformation.delete(:format) || format
758
- [Cloudinary::Utils.generate_transformation_string(transformation, true), format].compact.join("/")
759
+ unless transformation.is_a? String
760
+ transformation = transformation.clone
761
+ if transformation.respond_to?(:delete)
762
+ format = transformation.delete(:format) || format
763
+ end
764
+ transformation = Cloudinary::Utils.generate_transformation_string(transformation, true)
765
+ end
766
+ [transformation, format].compact.join("/")
759
767
  end.join("|")
760
768
  end
761
769
 
@@ -1,4 +1,4 @@
1
1
  # Copyright Cloudinary
2
2
  module Cloudinary
3
- VERSION = "1.2.2"
3
+ VERSION = "1.2.3"
4
4
  end
@@ -125,6 +125,28 @@ describe Cloudinary::Api do
125
125
  @api.delete_derived_resources(derived_resource_id)
126
126
  end
127
127
 
128
+ it "should allow deleting derived resources by transformations" do
129
+ public_id = "public_id"
130
+ transformations = "c_crop,w_100"
131
+ expect(RestClient::Request).to receive(:execute).with(
132
+ deep_hash_value( {[:payload, :public_ids] => public_id,
133
+ [:payload, :transformations] => "c_crop,w_100"}))
134
+ @api.delete_derived_by_transformation(public_id, "c_crop,w_100")
135
+
136
+ transformations = {:crop => "crop", :width => 100}
137
+ expect(RestClient::Request).to receive(:execute).with(
138
+ deep_hash_value( {[:payload, :public_ids] => public_id,
139
+ [:payload, :transformations] => "c_crop,w_100"}))
140
+ @api.delete_derived_by_transformation(public_id, transformations)
141
+
142
+ transformations = [{:crop => "crop", :width => 100}, {:crop => "scale", :width => 300}]
143
+ expect(RestClient::Request).to receive(:execute).with(
144
+ deep_hash_value( {[:payload, :public_ids] => public_id,
145
+ [:payload, :transformations] => "c_crop,w_100|c_scale,w_300"}))
146
+ @api.delete_derived_by_transformation(public_id, transformations)
147
+
148
+ end
149
+
128
150
  it "should allow deleting resources" do
129
151
  expect(RestClient::Request).to receive(:execute).with(deep_hash_value( {[:payload, :public_ids] => ["apit_test", "test_id_2", "api_test3"]}))
130
152
  @api.delete_resources(["apit_test", "test_id_2", "api_test3"])
@@ -166,7 +166,7 @@ end
166
166
  RSpec::Matchers.define :deep_hash_value do |expected|
167
167
  match do |actual|
168
168
  expected.all? do |path, value|
169
- Cloudinary.values_match? deep_fetch(actual, path), value
169
+ Cloudinary.values_match? value, deep_fetch(actual, path)
170
170
  end
171
171
  end
172
172
  end
@@ -175,7 +175,7 @@ RSpec::Matchers.alias_matcher :have_deep_hash_values_of, :deep_hash_value
175
175
 
176
176
  module Cloudinary
177
177
  # @api private
178
- def self.values_match?( actual, expected)
178
+ def self.values_match?(expected, actual)
179
179
  if Hash === actual
180
180
  return hashes_match?(expected, actual) if Hash === expected
181
181
  elsif Array === expected && Enumerable === actual && !(Struct === actual)
@@ -83,7 +83,18 @@ describe Cloudinary::Uploader do
83
83
  end
84
84
 
85
85
  it "should support eager" do
86
- Cloudinary::Uploader.upload(TEST_IMG, :eager =>[{ :crop =>"scale", :width =>"2.0"}], :tags => [TEST_TAG, TIMESTAMP_TAG])
86
+ result = Cloudinary::Uploader.upload(TEST_IMG, :eager =>[{ :crop =>"scale", :width =>"2.0"}], :tags => [TEST_TAG, TIMESTAMP_TAG])
87
+ expect(result["eager"].length).to be(1)
88
+ expect(result).to have_deep_hash_values_of(["eager", 0, "transformation"] => "c_scale,w_2.0")
89
+ result = Cloudinary::Uploader.upload(TEST_IMG, :eager =>"c_scale,w_2.0", :tags => [TEST_TAG, TIMESTAMP_TAG])
90
+ expect(result["eager"].length).to be(1)
91
+ expect(result).to have_deep_hash_values_of(["eager", 0, "transformation"] => "c_scale,w_2.0")
92
+ result = Cloudinary::Uploader.upload(TEST_IMG, :eager =>["c_scale,w_2.0", { :crop =>"crop", :width =>"0.5", :format => "tiff"}], :tags => [TEST_TAG, TIMESTAMP_TAG])
93
+ expect(result["eager"].length).to be(2)
94
+ expect(result).to have_deep_hash_values_of(
95
+ ["eager", 0, "transformation"] => "c_scale,w_2.0",
96
+ ["eager", 1, "transformation"] => "c_crop,w_0.5/tiff"
97
+ )
87
98
  end
88
99
 
89
100
  it "should support headers" do
@@ -87,8 +87,13 @@ describe Cloudinary::Utils do
87
87
  .and empty_options
88
88
  end
89
89
 
90
- it "should disallow url_suffix in shared distribution" do
91
- expect { Cloudinary::Utils.cloudinary_url("test", { :url_suffix => "hello" }) }.to raise_error(CloudinaryException)
90
+ it "should support url_suffix in shared distribution" do
91
+ expect(["test", { :url_suffix => "hello" }])
92
+ .to produce_url("http://res.cloudinary.com/#{cloud_name}/images/test/hello")
93
+ .and empty_options
94
+ expect(["test", { :url_suffix => "hello", :angle => 0 }])
95
+ .to produce_url("http://res.cloudinary.com/#{cloud_name}/images/a_0/test/hello")
96
+ .and empty_options
92
97
  end
93
98
 
94
99
  it "should disallow url_suffix in non upload types" do
@@ -133,6 +138,12 @@ describe Cloudinary::Utils do
133
138
  .and empty_options
134
139
  end
135
140
 
141
+ it "should support url_suffix for videos" do
142
+ expect(["test", { :url_suffix => "hello", :private_cdn => true, :resource_type => :video }])
143
+ .to produce_url("http://#{cloud_name}-res.cloudinary.com/videos/test/hello")
144
+ .and empty_options
145
+ end
146
+
136
147
  it "should support url_suffix for private uploads" do
137
148
  expect(["test", { :url_suffix => "hello", :private_cdn => true, :resource_type => :image, :type => :private }])
138
149
  .to produce_url("http://#{cloud_name}-res.cloudinary.com/private_images/test/hello")
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cloudinary
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.2
4
+ version: 1.2.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nadav Soferman
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2016-07-16 00:00:00.000000000 Z
13
+ date: 2016-08-21 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: aws_cf_signer