cloudinary 1.24.0 → 1.26.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 4dfd5beeebb091b480f5b9e43dec47fea57c876c62499c8a93356d4b9318051f
4
- data.tar.gz: 588c68c6ccd722bdfd9d303ca76b34aee2eab30d64cbedfb57d1411160d60ff5
3
+ metadata.gz: 9bb33366a739a067a66cbcaf66534e48663e726d57f4d4b3657c44ec43f092e7
4
+ data.tar.gz: 0dd05a5beabf06fc8d1914c7375fa7a6d37fce532edca0021919e13d9b28d318
5
5
  SHA512:
6
- metadata.gz: eb8daa2242a6ad57553aeb65f9bef53440a075518922510e4901eef1c29d952e15c75456a1b4cdfbc35aaced3ac3adcbca18f3b307e72521bebad48138139095
7
- data.tar.gz: 67fb1cb9c9e299fd0a914b49a7083afdd076b064690afc25faa4250a04bed0a1e9077cac72cb102fe70c8da23399e1e62066395c53ba2c34d9e1e5d6b8dfa9fa
6
+ metadata.gz: 64cb7b27cd9909da6fbbaaf98777d4f05046098a6adb1572998323fd7517bf30c73095844683c83da59808f5945c93e90f1e2c685e06ff156b682fe92e902878
7
+ data.tar.gz: f098206a8c9f6c73609ad2415cfc90f8359c678461d0bb22f5164aba57111fe55129eed6e98767c6242387ee6294bf4139b034848a1ff9b792cf1dba9fa3ef77
data/.travis.yml CHANGED
@@ -16,7 +16,7 @@ matrix:
16
16
  dist: xenial
17
17
  rvm: ruby-2.5.9
18
18
  before_install:
19
- - gem install bundler
19
+ - gem install bundler -v 2.3.26
20
20
 
21
21
  before_script: >
22
22
  export CLOUDINARY_URL=$(bash tools/get_test_cloud.sh);
data/CHANGELOG.md CHANGED
@@ -1,3 +1,19 @@
1
+ 1.26.0 / 2023-06-01
2
+ ==================
3
+
4
+ New functionality and features
5
+ ------------------------------
6
+
7
+ * Add support for related assets Admin APIs
8
+ * Add support for expressions in `start_offset` and `end_offset` parameters
9
+ * Add support for Conditional Metadata Rules API
10
+ * Add support for large files in Active Storage
11
+
12
+ 1.25.0 / 2023-01-04
13
+ ==================
14
+
15
+ * Add support for `mount_uploaders` in `CarrierWave`
16
+
1
17
  1.24.0 / 2022-12-06
2
18
  ==================
3
19
 
data/cloudinary.gemspec CHANGED
@@ -39,8 +39,12 @@ Gem::Specification.new do |s|
39
39
  else
40
40
  s.add_development_dependency "rake", "<= 12.2.1"
41
41
  end
42
+ if RUBY_VERSION >= "2.7.0"
43
+ s.add_development_dependency "sqlite3"
44
+ else
45
+ s.add_development_dependency "sqlite3", "< 1.6.0"
46
+ end
42
47
 
43
- s.add_development_dependency "sqlite3"
44
48
  s.add_development_dependency "rspec", '>=3.5'
45
49
  s.add_development_dependency "rspec-retry"
46
50
 
@@ -57,6 +61,8 @@ Gem::Specification.new do |s|
57
61
 
58
62
  if RUBY_VERSION <= "2.4.0"
59
63
  s.add_development_dependency "simplecov", "<= 0.17.1" # support testing Ruby 1.9
64
+ s.add_development_dependency 'loofah', '~>2.19.1'
65
+ s.add_development_dependency "rails-html-sanitizer", "<1.5.0"
60
66
  else
61
67
  s.add_development_dependency "simplecov", "> 0.18.0"
62
68
  end
@@ -39,7 +39,7 @@ module ActiveStorage
39
39
  begin
40
40
  extra_headers = checksum.nil? ? {} : {Headers::CONTENT_MD5 => checksum}
41
41
  options = @options.merge(options)
42
- Cloudinary::Uploader.upload(
42
+ Cloudinary::Uploader.upload_large(
43
43
  io,
44
44
  public_id: public_id_internal(key),
45
45
  resource_type: resource_type(io, key),
@@ -406,6 +406,76 @@ class Cloudinary::Api
406
406
  call_api(:delete, uri, params, options)
407
407
  end
408
408
 
409
+ # Relates an asset to other assets by public IDs.
410
+ #
411
+ # @param [String] public_id The public ID of the asset.
412
+ # @param [String|Array] assets_to_relate The array of up to 10 fully_qualified_public_ids given as
413
+ # resource_type/type/public_id.
414
+ # @param [Hash] options The optional parameters. See the
415
+ # {https://cloudinary.com/documentation/admin_api#add_related_assets Admin API} documentation.
416
+ #
417
+ # @return [Cloudinary::Api::Response]
418
+ #
419
+ # @raise [Cloudinary::Api::Error]
420
+ def self.add_related_assets(public_id, assets_to_relate, options={})
421
+ resource_type = options[:resource_type] || "image"
422
+ type = options[:type] || "upload"
423
+ uri = "resources/related_assets/#{resource_type}/#{type}/#{public_id}"
424
+ params = {:assets_to_relate => Cloudinary::Utils.build_array(assets_to_relate)}
425
+ call_api(:post, uri, params, options)
426
+ end
427
+
428
+ # Relates an asset to other assets by asset IDs.
429
+ #
430
+ # @param [String] asset_id The asset ID of the asset to update.
431
+ # @param [String|Array] assets_to_relate The array of up to 10 asset IDs.
432
+ # @param [Hash] options The optional parameters. See the
433
+ # {https://cloudinary.com/documentation/admin_api#add_related_assets_by_asset_id Admin API} documentation.
434
+ #
435
+ # @return [Cloudinary::Api::Response]
436
+ #
437
+ # @raise [Cloudinary::Api::Error]
438
+ def self.add_related_assets_by_asset_ids(asset_id, assets_to_relate, options={})
439
+ uri = "resources/related_assets/#{asset_id}"
440
+ params = {:assets_to_relate => Cloudinary::Utils.build_array(assets_to_relate)}
441
+ call_api(:post, uri, params, options)
442
+ end
443
+
444
+ # Unrelates an asset from other assets by public IDs.
445
+ #
446
+ # @param [String] public_id The public ID of the asset.
447
+ # @param [String|Array] assets_to_unrelate The array of up to 10 fully_qualified_public_ids given as
448
+ # resource_type/type/public_id.
449
+ # @param [Hash] options The optional parameters. See the
450
+ # {https://cloudinary.com/documentation/admin_api#delete_related_assets Admin API} documentation.
451
+ #
452
+ # @return [Cloudinary::Api::Response]
453
+ #
454
+ # @raise [Cloudinary::Api::Error]
455
+ def self.delete_related_assets(public_id, assets_to_unrelate, options={})
456
+ resource_type = options[:resource_type] || "image"
457
+ type = options[:type] || "upload"
458
+ uri = "resources/related_assets/#{resource_type}/#{type}/#{public_id}"
459
+ params = {:assets_to_unrelate => Cloudinary::Utils.build_array(assets_to_unrelate)}
460
+ call_api(:delete, uri, params, options)
461
+ end
462
+
463
+ # Unrelates an asset from other assets by asset IDs.
464
+ #
465
+ # @param [String] asset_id The asset ID of the asset to update.
466
+ # @param [String|Array] assets_to_unrelate The array of up to 10 asset IDs.
467
+ # @param [Hash] options The optional parameters. See the
468
+ # {https://cloudinary.com/documentation/admin_api#delete_related_assets_by_asset_id Admin API} documentation.
469
+ #
470
+ # @return [Cloudinary::Api::Response]
471
+ #
472
+ # @raise [Cloudinary::Api::Error]
473
+ def self.delete_related_assets_by_asset_ids(asset_id, assets_to_unrelate, options={})
474
+ uri = "resources/related_assets/#{asset_id}"
475
+ params = {:assets_to_unrelate => Cloudinary::Utils.build_array(assets_to_unrelate)}
476
+ call_api(:delete, uri, params, options)
477
+ end
478
+
409
479
  # Lists all the tags currently used for a specified asset type.
410
480
  #
411
481
  # @param [Hash] options The optional parameters. See the
@@ -1077,6 +1147,75 @@ class Cloudinary::Api
1077
1147
  call_metadata_api(:put, uri, params, options)
1078
1148
  end
1079
1149
 
1150
+ # Lists all metadata rules definitions.
1151
+ #
1152
+ # @param [Hash] options The optional parameters.
1153
+ #
1154
+ # @return [Cloudinary::Api::Response]
1155
+ #
1156
+ # @raise [Cloudinary::Api::Error]
1157
+ #
1158
+ # @see https://cloudinary.com/documentation/conditional_metadata_rules_api#get_metadata_rules
1159
+ def self.list_metadata_rules(options = {})
1160
+ call_metadata_rules_api(:get, [], {}, options)
1161
+ end
1162
+
1163
+
1164
+ # Creates a new metadata rule definition.
1165
+ #
1166
+ # @param [Hash] rule The rule to add.
1167
+ # @param [Hash] options The optional parameters.
1168
+ #
1169
+ # @return [Cloudinary::Api::Response]
1170
+ #
1171
+ # @raise [Cloudinary::Api::Error]
1172
+ #
1173
+ # @see https://cloudinary.com/documentation/conditional_metadata_rules_api#create_a_metadata_rule
1174
+ def self.add_metadata_rule(rule, options = {})
1175
+ params = only(rule, :metadata_field_id, :condition, :result, :name)
1176
+
1177
+ call_metadata_rules_api(:post, [], params, options)
1178
+ end
1179
+
1180
+ # Updates a metadata rule by external ID.
1181
+ #
1182
+ # Updates an existing metadata rule definition. Expects a JSON object which defines the updated rule.
1183
+ #
1184
+ # @param [String] external_id The ID of the rule to update.
1185
+ # @param [Hash] rule The rule definition.
1186
+ # @param [Hash] options The optional parameters.
1187
+ #
1188
+ # @return [Cloudinary::Api::Response]
1189
+ #
1190
+ # @raise [Cloudinary::Api::Error]
1191
+ #
1192
+ # @see https://cloudinary.com/documentation/conditional_metadata_rules_api#update_a_metadata_rule_by_id
1193
+ def self.update_metadata_rule(external_id, rule, options = {})
1194
+ uri = [external_id]
1195
+ params = only(rule, :metadata_field_id, :condition, :result, :name, :state)
1196
+
1197
+ call_metadata_rules_api(:put, uri, params, options)
1198
+ end
1199
+
1200
+ # Deletes a metadata rule definition by external ID.
1201
+ #
1202
+ # The rule should no longer be considered a valid candidate for all other endpoints
1203
+ # (it will not show up in the list of rules, etc).
1204
+ #
1205
+ # @param [String] external_id The ID of the rule to delete.
1206
+ # @param [Hash] options The optional parameters.
1207
+ #
1208
+ # @return [Cloudinary::Api::Response]
1209
+ #
1210
+ # @raise [Cloudinary::Api::Error]
1211
+ #
1212
+ # @see https://cloudinary.com/documentation/conditional_metadata_rules_api#delete_a_metadata_rule_by_id
1213
+ def self.delete_metadata_rule(external_id, options = {})
1214
+ uri = [external_id]
1215
+
1216
+ call_metadata_rules_api(:delete, uri, {}, options)
1217
+ end
1218
+
1080
1219
  protected
1081
1220
 
1082
1221
  # Execute a call api for input params.
@@ -1128,6 +1267,22 @@ class Cloudinary::Api
1128
1267
  call_api(method, uri, params, options)
1129
1268
  end
1130
1269
 
1270
+ # Protected function that assists with performing an API call to the metadata_rules part of the Admin API.
1271
+ #
1272
+ # @protected
1273
+ # @param [Symbol] method The HTTP method. Valid methods: get, post, put, delete
1274
+ # @param [Array] uri REST endpoint of the API (without 'metadata_rules')
1275
+ # @param [Hash] params Query/body parameters passed to the method
1276
+ # @param [Hash] options Additional options. Can be an override of the configuration, headers, etc.
1277
+ # @return [Cloudinary::Api::Response] Returned response from Cloudinary
1278
+ # @raise [Cloudinary::Api::Error]
1279
+ def self.call_metadata_rules_api(method, uri, params, options)
1280
+ options[:content_type] = :json
1281
+ uri = ["metadata_rules", uri].reject(&:empty?).join("/")
1282
+
1283
+ call_api(method, uri, params, options)
1284
+ end
1285
+
1131
1286
  # Prepares optional parameters for asset/assetByAssetId API calls.
1132
1287
  # @param [Hash] options Additional options
1133
1288
  # @return [Object] Optional parameters
@@ -163,7 +163,11 @@ module Cloudinary::CarrierWave
163
163
  super
164
164
 
165
165
  column = model.send(:_mounter, mounted_as).send(:serialization_column)
166
- identifier = model.read_attribute(column)
167
- retrieve_from_store!(identifier) unless identifier.nil?
166
+ original_value = model.read_attribute(column)
167
+ identifiers = original_value.is_a?(Array) ? original_value : [original_value]
168
+
169
+ identifiers.each do |identifier|
170
+ retrieve_from_store!(identifier) unless identifier.nil?
171
+ end
168
172
  end
169
173
  end
@@ -71,6 +71,16 @@ class Cloudinary::CarrierWave::Storage < ::CarrierWave::Storage::Abstract
71
71
  end
72
72
  model_class = uploader.model.class
73
73
  column = uploader.model.send(:_mounter, uploader.mounted_as).send(:serialization_column)
74
+ original_value = uploader.model.read_attribute(column)
75
+ return if original_value == name
76
+
77
+ if original_value.is_a?(Array)
78
+ if index = original_value.index(identifier)
79
+ original_value[index] = name
80
+ end
81
+ name = original_value
82
+ end
83
+
74
84
  if defined?(ActiveRecord::Base) && uploader.model.is_a?(ActiveRecord::Base)
75
85
  primary_key = model_class.primary_key.to_sym
76
86
  if defined?(::ActiveRecord::VERSION::MAJOR) && ::ActiveRecord::VERSION::MAJOR > 2
@@ -108,26 +108,38 @@ class Cloudinary::Uploader
108
108
  public_id = public_id_or_options
109
109
  options = old_options
110
110
  end
111
+
112
+ options.merge(:public_id => public_id)
113
+
111
114
  if Cloudinary::Utils.is_remote?(file)
112
- return upload(file, options.merge(:public_id => public_id))
113
- elsif file.is_a?(Pathname) || !file.respond_to?(:read)
115
+ return upload(file, options)
116
+ end
117
+
118
+ if file.is_a?(Pathname) || !file.respond_to?(:read)
114
119
  filename = file
115
120
  file = File.open(file, "rb")
116
121
  else
117
122
  filename = "cloudinaryfile"
118
123
  end
119
124
 
125
+ chunk_size = options[:chunk_size] || 20_000_000
126
+
127
+ if file.size < chunk_size
128
+ return upload(file, options)
129
+ end
130
+
120
131
  filename = options[:filename] if options[:filename]
121
132
 
122
133
  unique_upload_id = Cloudinary::Utils.random_public_id
123
134
  upload = nil
124
135
  index = 0
125
- chunk_size = options[:chunk_size] || 20_000_000
136
+
126
137
  until file.eof?
127
138
  buffer = file.read(chunk_size)
128
139
  current_loc = index*chunk_size
129
140
  range = "bytes #{current_loc}-#{current_loc+buffer.size - 1}/#{file.size}"
130
- upload = upload_large_part(Cloudinary::Blob.new(buffer, :original_filename => filename), options.merge(:public_id => public_id, :unique_upload_id => unique_upload_id, :content_range => range))
141
+ upload = upload_large_part(Cloudinary::Blob.new(buffer, :original_filename => filename),
142
+ options.merge(:unique_upload_id => unique_upload_id, :content_range => range))
131
143
  index += 1
132
144
  end
133
145
  upload
@@ -1175,11 +1175,13 @@ class Cloudinary::Utils
1175
1175
  # @private
1176
1176
  def self.norm_range_value(value) # :nodoc:
1177
1177
  offset = /^#{offset_any_pattern}$/.match( value.to_s)
1178
+
1178
1179
  if offset
1179
- modifier = offset[5].present? ? 'p' : ''
1180
- value = "#{offset[1]}#{modifier}"
1180
+ modifier = offset[5].present? ? 'p' : ''
1181
+ "#{offset[1]}#{modifier}"
1182
+ else
1183
+ normalize_expression(value)
1181
1184
  end
1182
- value
1183
1185
  end
1184
1186
  private_class_method :norm_range_value
1185
1187
 
@@ -1,4 +1,4 @@
1
1
  # Copyright Cloudinary
2
2
  module Cloudinary
3
- VERSION = "1.24.0"
3
+ VERSION = "1.26.0"
4
4
  end
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.24.0
4
+ version: 1.26.0
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: 2022-12-06 00:00:00.000000000 Z
13
+ date: 2023-06-01 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: aws_cf_signer
@@ -276,8 +276,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
276
276
  - !ruby/object:Gem::Version
277
277
  version: '0'
278
278
  requirements: []
279
- rubyforge_project: cloudinary
280
- rubygems_version: 2.7.6
279
+ rubygems_version: 3.4.12
281
280
  signing_key:
282
281
  specification_version: 4
283
282
  summary: Client library for easily using the Cloudinary service