cloudinary 1.9.1 → 1.20.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 +5 -5
- data/.github/ISSUE_TEMPLATE/bug_report.md +42 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +21 -0
- data/.github/pull_request_template.md +24 -0
- data/.gitignore +7 -1
- data/.travis.yml +15 -8
- data/CHANGELOG.md +261 -0
- data/README.md +3 -0
- data/Rakefile +3 -45
- data/cloudinary.gemspec +27 -20
- data/lib/active_storage/blob_key.rb +20 -0
- data/lib/active_storage/service/cloudinary_service.rb +249 -0
- data/lib/cloudinary.rb +53 -63
- data/lib/cloudinary/account_api.rb +231 -0
- data/lib/cloudinary/account_config.rb +30 -0
- data/lib/cloudinary/api.rb +228 -71
- data/lib/cloudinary/auth_token.rb +10 -4
- data/lib/cloudinary/base_api.rb +79 -0
- data/lib/cloudinary/base_config.rb +70 -0
- data/lib/cloudinary/cache.rb +38 -0
- data/lib/cloudinary/cache/breakpoints_cache.rb +31 -0
- data/lib/cloudinary/cache/key_value_cache_adapter.rb +25 -0
- data/lib/cloudinary/cache/rails_cache_adapter.rb +34 -0
- data/lib/cloudinary/cache/storage/rails_cache_storage.rb +5 -0
- data/lib/cloudinary/carrier_wave.rb +4 -2
- data/lib/cloudinary/carrier_wave/remote.rb +3 -2
- data/lib/cloudinary/carrier_wave/storage.rb +2 -1
- data/lib/cloudinary/{controller.rb → cloudinary_controller.rb} +3 -5
- data/lib/cloudinary/config.rb +43 -0
- data/lib/cloudinary/helper.rb +77 -7
- data/lib/cloudinary/migrator.rb +3 -1
- data/lib/cloudinary/railtie.rb +7 -3
- data/lib/cloudinary/responsive.rb +111 -0
- data/lib/cloudinary/uploader.rb +67 -15
- data/lib/cloudinary/utils.rb +324 -54
- data/lib/cloudinary/version.rb +1 -1
- data/lib/cloudinary/video_helper.rb +96 -22
- data/lib/tasks/cloudinary/fetch_assets.rake +48 -0
- data/lib/tasks/{cloudinary.rake → cloudinary/sync_static.rake} +0 -0
- data/tools/allocate_test_cloud.sh +9 -0
- data/tools/get_test_cloud.sh +9 -0
- data/tools/update_version +220 -0
- data/vendor/assets/javascripts/cloudinary/jquery.cloudinary.js +51 -13
- data/vendor/assets/javascripts/cloudinary/jquery.fileupload.js +24 -4
- data/vendor/assets/javascripts/cloudinary/jquery.ui.widget.js +741 -561
- data/vendor/assets/javascripts/cloudinary/load-image.all.min.js +1 -1
- metadata +92 -67
- data/spec/access_control_spec.rb +0 -99
- data/spec/api_spec.rb +0 -545
- data/spec/archive_spec.rb +0 -129
- data/spec/auth_token_spec.rb +0 -79
- data/spec/cloudinary_helper_spec.rb +0 -190
- data/spec/cloudinary_spec.rb +0 -32
- data/spec/data/sync_static/app/assets/javascripts/1.coffee +0 -1
- data/spec/data/sync_static/app/assets/javascripts/1.js +0 -1
- data/spec/data/sync_static/app/assets/stylesheets/1.css +0 -3
- data/spec/docx.docx +0 -0
- data/spec/favicon.ico +0 -0
- data/spec/logo.png +0 -0
- data/spec/rake_spec.rb +0 -160
- data/spec/sample_asset_file.tsv +0 -4
- data/spec/search_spec.rb +0 -109
- data/spec/spec_helper.rb +0 -245
- data/spec/storage_spec.rb +0 -44
- data/spec/streaminig_profiles_api_spec.rb +0 -74
- data/spec/support/helpers/temp_file_helpers.rb +0 -22
- data/spec/support/shared_contexts/rake.rb +0 -19
- data/spec/uploader_spec.rb +0 -363
- data/spec/utils_methods_spec.rb +0 -54
- data/spec/utils_spec.rb +0 -906
- data/spec/video_tag_spec.rb +0 -251
- data/spec/video_url_spec.rb +0 -164
@@ -0,0 +1,231 @@
|
|
1
|
+
class Cloudinary::AccountApi
|
2
|
+
extend Cloudinary::BaseApi
|
3
|
+
|
4
|
+
# Creates a new sub-account. Any users that have access to all sub-accounts will also automatically have access to the
|
5
|
+
# new sub-account.
|
6
|
+
# @param [String] name The display name as shown in the management console
|
7
|
+
# @param [String] cloud_name A case-insensitive cloud name comprised of alphanumeric and underscore characters.
|
8
|
+
# Generates an error if the specified cloud name is not unique across all Cloudinary accounts.
|
9
|
+
# Note: Once created, the name can only be changed for accounts with fewer than 1000 assets.
|
10
|
+
# @param [Object] custom_attributes Any custom attributes you want to associate with the sub-account
|
11
|
+
# @param [Boolean] enabled Whether to create the account as enabled (default is enabled)
|
12
|
+
# @param [String] base_account ID of sub-account from which to copy settings
|
13
|
+
# @param [Object] options additional options
|
14
|
+
def self.create_sub_account(name, cloud_name = nil, custom_attributes = {}, enabled = nil, base_account = nil, options = {})
|
15
|
+
params = {
|
16
|
+
name: name,
|
17
|
+
cloud_name: cloud_name,
|
18
|
+
custom_attributes: custom_attributes,
|
19
|
+
enabled: enabled,
|
20
|
+
base_sub_account_id: base_account
|
21
|
+
}
|
22
|
+
|
23
|
+
call_account_api(:post, 'sub_accounts', params, options.merge(content_type: :json))
|
24
|
+
end
|
25
|
+
|
26
|
+
# Updates the specified details of the sub-account.
|
27
|
+
# @param [String] sub_account_id The ID of the sub-account.
|
28
|
+
# @param [String] name The display name as shown in the management console
|
29
|
+
# @param [String] cloud_name A case-insensitive cloud name comprised of alphanumeric and underscore characters.
|
30
|
+
# Generates an error if the specified cloud name is not unique across all Cloudinary accounts.
|
31
|
+
# Note: Once created, the name can only be changed for accounts with fewer than 1000 assets.
|
32
|
+
# @param [Object] custom_attributes Any custom attributes you want to associate with the sub-account, as a map/hash
|
33
|
+
# of key/value pairs.
|
34
|
+
# @param [Boolean] enabled Whether the sub-account is enabled.
|
35
|
+
# @param [Object] options additional options
|
36
|
+
def self.update_sub_account(sub_account_id, name = nil, cloud_name = nil, custom_attributes = nil, enabled = nil, options = {})
|
37
|
+
params = {
|
38
|
+
name: name,
|
39
|
+
cloud_name: cloud_name,
|
40
|
+
custom_attributes: custom_attributes,
|
41
|
+
enabled: enabled
|
42
|
+
}
|
43
|
+
|
44
|
+
call_account_api(:put, ['sub_accounts', sub_account_id], params, options.merge(content_type: :json))
|
45
|
+
end
|
46
|
+
|
47
|
+
# Lists sub-accounts.
|
48
|
+
# @param [Boolean] enabled Whether to only return enabled sub-accounts (true) or disabled accounts (false).
|
49
|
+
# Default: all accounts are returned (both enabled and disabled).
|
50
|
+
# @param [Array<String>] ids A list of up to 100 sub-account IDs. When provided, other parameters are ignored.
|
51
|
+
# @param [String] prefix Returns accounts where the name begins with the specified case-insensitive string.
|
52
|
+
# @param [Object] options additional options
|
53
|
+
def self.sub_accounts(enabled = nil, ids = [], prefix = nil, options = {})
|
54
|
+
params = {
|
55
|
+
enabled: enabled,
|
56
|
+
ids: ids,
|
57
|
+
prefix: prefix
|
58
|
+
}
|
59
|
+
|
60
|
+
call_account_api(:get, 'sub_accounts', params, options.merge(content_type: :json))
|
61
|
+
end
|
62
|
+
|
63
|
+
# Retrieves the details of the specified sub-account.
|
64
|
+
# @param [String] sub_account_id The ID of the sub-account.
|
65
|
+
# @param [Object] options additional options
|
66
|
+
def self.sub_account(sub_account_id, options = {})
|
67
|
+
call_account_api(:get, ['sub_accounts', sub_account_id], {}, options.merge(content_type: :json))
|
68
|
+
end
|
69
|
+
|
70
|
+
# Deletes the specified sub-account. Supported only for accounts with fewer than 1000 assets.
|
71
|
+
# @param [String] sub_account_id The ID of the sub-account.
|
72
|
+
# @param [Object] options additional options
|
73
|
+
def self.delete_sub_account(sub_account_id, options = {})
|
74
|
+
call_account_api(:delete, ['sub_accounts', sub_account_id], {}, options)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Creates a new user in the account.
|
78
|
+
# @param [String] name The name of the user.
|
79
|
+
# @param [String] email A unique email address, which serves as the login name and notification address.
|
80
|
+
# @param [String] role The role to assign. Possible values: master_admin, admin, billing, technical_admin, reports,
|
81
|
+
# media_library_admin, media_library_user
|
82
|
+
# @param [Array<String>] sub_account_ids The list of sub-account IDs that this user can access.
|
83
|
+
# Note: This parameter is ignored if the role is specified as master_admin.
|
84
|
+
# @param [Object] options additional options
|
85
|
+
def self.create_user(name, email, role, sub_account_ids = [], options = {})
|
86
|
+
params = {
|
87
|
+
name: name,
|
88
|
+
email: email,
|
89
|
+
role: role,
|
90
|
+
sub_account_ids: sub_account_ids
|
91
|
+
}
|
92
|
+
|
93
|
+
call_account_api(:post, 'users', params, options.merge(content_type: :json))
|
94
|
+
end
|
95
|
+
|
96
|
+
# Deletes an existing user.
|
97
|
+
# @param [String] user_id The ID of the user to delete.
|
98
|
+
# @param [Object] options additional options
|
99
|
+
def self.delete_user(user_id, options = {})
|
100
|
+
call_account_api(:delete, ['users', user_id], {}, options)
|
101
|
+
end
|
102
|
+
|
103
|
+
# Updates the details of the specified user.
|
104
|
+
# @param [String] user_id The ID of the user to update.
|
105
|
+
# @param [String] name The name of the user.
|
106
|
+
# @param [String] email A unique email address, which serves as the login name and notification address.
|
107
|
+
# @param [String] role The role to assign. Possible values: master_admin, admin, billing, technical_admin, reports,
|
108
|
+
# media_library_admin, media_library_user
|
109
|
+
# @param [Array<String>] sub_account_ids The list of sub-account IDs that this user can access.
|
110
|
+
# Note: This parameter is ignored if the role is specified as master_admin.
|
111
|
+
# @param [Object] options additional options
|
112
|
+
def self.update_user(user_id, name = nil, email = nil, role = nil, sub_account_ids = nil, options = {})
|
113
|
+
params = {
|
114
|
+
name: name,
|
115
|
+
email: email,
|
116
|
+
role: role,
|
117
|
+
sub_account_ids: sub_account_ids
|
118
|
+
}
|
119
|
+
|
120
|
+
call_account_api(:put, ['users', user_id], params, options.merge(content_type: :json))
|
121
|
+
end
|
122
|
+
|
123
|
+
# Returns the user with the specified ID.
|
124
|
+
# @param [String] user_id The ID of the user.
|
125
|
+
# @param [Object] options additional options
|
126
|
+
def self.user(user_id, options = {})
|
127
|
+
call_account_api(:get, ['users', user_id], {}, options.merge(content_type: :json))
|
128
|
+
end
|
129
|
+
|
130
|
+
# Lists users in the account.
|
131
|
+
# @param [Boolean] pending Whether to only return pending users. Default: all users
|
132
|
+
# @param [Array<String>] user_ids A list of up to 100 user IDs. When provided, other parameters are ignored.
|
133
|
+
# @param [String] prefix Returns users where the name or email address begins with the specified case-insensitive string.
|
134
|
+
# @param [String] sub_account_id Only returns users who have access to the specified account.
|
135
|
+
# @param [Object] options additional options
|
136
|
+
def self.users(pending = nil, user_ids = [], prefix = nil, sub_account_id = nil, options = {})
|
137
|
+
params = if user_ids && user_ids.count > 0
|
138
|
+
{
|
139
|
+
ids: user_ids
|
140
|
+
}
|
141
|
+
else
|
142
|
+
{
|
143
|
+
prefix: prefix,
|
144
|
+
sub_account_id: sub_account_id,
|
145
|
+
pending: pending
|
146
|
+
}
|
147
|
+
end
|
148
|
+
|
149
|
+
call_account_api(:get, 'users', params, options.merge(content_type: :json))
|
150
|
+
end
|
151
|
+
|
152
|
+
# Creates a new user group.
|
153
|
+
# @param [String] name The name for the user group.
|
154
|
+
# @param [Object] options additional options
|
155
|
+
def self.create_user_group(name, options = {})
|
156
|
+
params = {
|
157
|
+
name: name
|
158
|
+
}
|
159
|
+
|
160
|
+
call_account_api(:post, 'user_groups', params, options.merge(content_type: :json))
|
161
|
+
end
|
162
|
+
|
163
|
+
# Updates the specified user group.
|
164
|
+
# @param [String] group_id The ID of the user group to update.
|
165
|
+
# @param [String] name The name for the user group.
|
166
|
+
# @param [Object] options additional options
|
167
|
+
def self.update_user_group(group_id, name, options = {})
|
168
|
+
params = {
|
169
|
+
name: name
|
170
|
+
}
|
171
|
+
|
172
|
+
call_account_api(:put, ['user_groups', group_id], params, options.merge(content_type: :json))
|
173
|
+
end
|
174
|
+
|
175
|
+
# Adds a user to a group with the specified ID.
|
176
|
+
# @param [String] group_id The ID of the user group.
|
177
|
+
# @param [String] user_id The ID of the user.
|
178
|
+
# @param [Object] options additional options
|
179
|
+
def self.add_user_to_group(group_id, user_id, options = {})
|
180
|
+
call_account_api(:post, ['user_groups', group_id, 'users', user_id], {}, options.merge(content_type: :json))
|
181
|
+
end
|
182
|
+
|
183
|
+
# Removes a user from a group with the specified ID.
|
184
|
+
# @param [String] group_id The ID of the user group.
|
185
|
+
# @param [String] user_id The ID of the user.
|
186
|
+
# @param [Object] options additional options
|
187
|
+
def self.remove_user_from_group(group_id, user_id, options = {})
|
188
|
+
call_account_api(:delete, ['user_groups', group_id, 'users', user_id], {}, options.merge(content_type: :json))
|
189
|
+
end
|
190
|
+
|
191
|
+
# Deletes the user group with the specified ID.
|
192
|
+
# @param [String] group_id The ID of the user group to delete.
|
193
|
+
# @param [Object] options additional options
|
194
|
+
def self.delete_user_group(group_id, options = {})
|
195
|
+
call_account_api(:delete, ['user_groups', group_id], {}, options)
|
196
|
+
end
|
197
|
+
|
198
|
+
# Lists user groups in the account.
|
199
|
+
# @param [Object] options additional options
|
200
|
+
def self.user_groups(options = {})
|
201
|
+
call_account_api(:get, 'user_groups', {}, options.merge(content_type: :json))
|
202
|
+
end
|
203
|
+
|
204
|
+
# Retrieves the details of the specified user group.
|
205
|
+
# @param [String] group_id The ID of the user group to retrieve.
|
206
|
+
# @param [Object] options additional options
|
207
|
+
def self.user_group(group_id, options = {})
|
208
|
+
call_account_api(:get, ['user_groups', group_id], {}, options.merge(content_type: :json))
|
209
|
+
end
|
210
|
+
|
211
|
+
# Lists users in the specified user group.
|
212
|
+
# @param [String] group_id The ID of the user group.
|
213
|
+
# @param [Object] options additional options
|
214
|
+
def self.user_group_users(group_id, options = {})
|
215
|
+
call_account_api(:get, ['user_groups', group_id, 'users'], {}, options.merge(content_type: :json))
|
216
|
+
end
|
217
|
+
|
218
|
+
def self.call_account_api(method, uri, params, options)
|
219
|
+
account_id = options[:account_id] || Cloudinary.account_config.account_id || raise('Must supply account_id')
|
220
|
+
api_key = options[:provisioning_api_key] || Cloudinary.account_config.provisioning_api_key || raise('Must supply provisioning api_key')
|
221
|
+
api_secret = options[:provisioning_api_secret] || Cloudinary.account_config.provisioning_api_secret || raise('Must supply provisioning api_secret')
|
222
|
+
|
223
|
+
params.reject! { |_, v| v.nil? }
|
224
|
+
|
225
|
+
call_cloudinary_api(method, uri, api_key, api_secret, params, options) do |cloudinary, inner_uri|
|
226
|
+
[cloudinary, 'v1_1', 'provisioning', 'accounts', account_id, inner_uri]
|
227
|
+
end
|
228
|
+
end
|
229
|
+
|
230
|
+
private_class_method :call_account_api
|
231
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
module Cloudinary
|
2
|
+
module AccountConfig
|
3
|
+
include BaseConfig
|
4
|
+
|
5
|
+
ENV_URL = "CLOUDINARY_ACCOUNT_URL"
|
6
|
+
SCHEME = "account"
|
7
|
+
|
8
|
+
def load_config_from_env
|
9
|
+
load_from_url(ENV[ENV_URL]) if ENV[ENV_URL]
|
10
|
+
end
|
11
|
+
|
12
|
+
private
|
13
|
+
|
14
|
+
def env_url
|
15
|
+
ENV_URL
|
16
|
+
end
|
17
|
+
|
18
|
+
def expected_scheme
|
19
|
+
SCHEME
|
20
|
+
end
|
21
|
+
|
22
|
+
def config_from_parsed_url(parsed_url)
|
23
|
+
{
|
24
|
+
"account_id" => parsed_url.host,
|
25
|
+
"provisioning_api_key" => parsed_url.user,
|
26
|
+
"provisioning_api_secret" => parsed_url.password
|
27
|
+
}
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
data/lib/cloudinary/api.rb
CHANGED
@@ -1,37 +1,28 @@
|
|
1
|
-
require 'rest_client'
|
2
|
-
require 'json'
|
3
|
-
|
4
1
|
class Cloudinary::Api
|
5
|
-
|
6
|
-
class NotFound < Error; end
|
7
|
-
class NotAllowed < Error; end
|
8
|
-
class AlreadyExists < Error; end
|
9
|
-
class RateLimited < Error; end
|
10
|
-
class BadRequest < Error; end
|
11
|
-
class GeneralError < Error; end
|
12
|
-
class AuthorizationRequired < Error; end
|
13
|
-
|
14
|
-
class Response < Hash
|
15
|
-
attr_reader :rate_limit_reset_at, :rate_limit_remaining, :rate_limit_allowed
|
16
|
-
|
17
|
-
def initialize(response=nil)
|
18
|
-
if response
|
19
|
-
# This sets the instantiated self as the response Hash
|
20
|
-
update Cloudinary::Api.parse_json_response response
|
21
|
-
|
22
|
-
@rate_limit_allowed = response.headers[:x_featureratelimit_limit].to_i
|
23
|
-
@rate_limit_reset_at = Time.parse(response.headers[:x_featureratelimit_reset])
|
24
|
-
@rate_limit_remaining = response.headers[:x_featureratelimit_remaining].to_i
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
2
|
+
extend Cloudinary::BaseApi
|
28
3
|
|
29
4
|
def self.ping(options={})
|
30
5
|
call_api(:get, "ping", {}, options)
|
31
6
|
end
|
32
7
|
|
8
|
+
# Gets account usage details
|
9
|
+
#
|
10
|
+
# Get a report on the status of your Cloudinary account usage details, including
|
11
|
+
# storage, bandwidth, requests, number of resources, and add-on usage.
|
12
|
+
# Note that numbers are updated periodically.
|
13
|
+
#
|
14
|
+
# @see https://cloudinary.com/documentation/admin_api#get_account_usage_details Get account usage details
|
15
|
+
#
|
16
|
+
# @param [Hash] options Additional options
|
17
|
+
# @return [Cloudinary::Api::Response]
|
18
|
+
# @raise [Cloudinary::Api:Error]
|
33
19
|
def self.usage(options={})
|
34
|
-
|
20
|
+
uri = 'usage'
|
21
|
+
date = options[:date]
|
22
|
+
|
23
|
+
uri += "/#{Cloudinary::Utils.to_usage_api_date_format(date)}" unless date.nil?
|
24
|
+
|
25
|
+
call_api(:get, uri, {}, options)
|
35
26
|
end
|
36
27
|
|
37
28
|
def self.resource_types(options={})
|
@@ -78,14 +69,29 @@ class Cloudinary::Api
|
|
78
69
|
resource_type = options[:resource_type] || "image"
|
79
70
|
type = options[:type] || "upload"
|
80
71
|
uri = "resources/#{resource_type}/#{type}/#{public_id}"
|
81
|
-
call_api(:get, uri,
|
72
|
+
call_api(:get, uri,
|
73
|
+
only(options,
|
74
|
+
:cinemagraph_analysis,
|
75
|
+
:colors,
|
76
|
+
:coordinates,
|
77
|
+
:exif,
|
78
|
+
:faces,
|
79
|
+
:image_metadata,
|
80
|
+
:max_results,
|
81
|
+
:pages,
|
82
|
+
:phash,
|
83
|
+
:quality_analysis,
|
84
|
+
:derived_next_cursor,
|
85
|
+
:accessibility_analysis,
|
86
|
+
:versions
|
87
|
+
), options)
|
82
88
|
end
|
83
89
|
|
84
90
|
def self.restore(public_ids, options={})
|
85
91
|
resource_type = options[:resource_type] || "image"
|
86
92
|
type = options[:type] || "upload"
|
87
93
|
uri = "resources/#{resource_type}/#{type}/restore"
|
88
|
-
call_api(:post, uri, { :public_ids => public_ids }, options)
|
94
|
+
call_api(:post, uri, { :public_ids => public_ids, :versions => options[:versions] }, options)
|
89
95
|
end
|
90
96
|
|
91
97
|
def self.update(public_id, options={})
|
@@ -94,19 +100,20 @@ class Cloudinary::Api
|
|
94
100
|
uri = "resources/#{resource_type}/#{type}/#{public_id}"
|
95
101
|
update_options = {
|
96
102
|
:access_control => Cloudinary::Utils.json_array_param(options[:access_control]),
|
97
|
-
:
|
103
|
+
:auto_tagging => options[:auto_tagging] && options[:auto_tagging].to_f,
|
104
|
+
:background_removal => options[:background_removal],
|
105
|
+
:categorization => options[:categorization],
|
98
106
|
:context => Cloudinary::Utils.encode_context(options[:context]),
|
99
|
-
:face_coordinates => Cloudinary::Utils.encode_double_array(options[:face_coordinates]),
|
100
107
|
:custom_coordinates => Cloudinary::Utils.encode_double_array(options[:custom_coordinates]),
|
108
|
+
:detection => options[:detection],
|
109
|
+
:face_coordinates => Cloudinary::Utils.encode_double_array(options[:face_coordinates]),
|
101
110
|
:moderation_status => options[:moderation_status],
|
102
|
-
:
|
111
|
+
:notification_url => options[:notification_url],
|
112
|
+
:quality_override => options[:quality_override],
|
103
113
|
:ocr => options[:ocr],
|
104
|
-
:
|
105
|
-
:detection => options[:detection],
|
114
|
+
:raw_convert => options[:raw_convert],
|
106
115
|
:similarity_search => options[:similarity_search],
|
107
|
-
:
|
108
|
-
:auto_tagging => options[:auto_tagging] && options[:auto_tagging].to_f,
|
109
|
-
:notification_url => options[:notification_url]
|
116
|
+
:tags => options[:tags] && Cloudinary::Utils.build_array(options[:tags]).join(",")
|
110
117
|
}
|
111
118
|
call_api(:post, uri, update_options, options)
|
112
119
|
end
|
@@ -214,11 +221,21 @@ class Cloudinary::Api
|
|
214
221
|
end
|
215
222
|
|
216
223
|
def self.root_folders(options={})
|
217
|
-
|
224
|
+
params = only(options, :max_results, :next_cursor)
|
225
|
+
call_api(:get, "folders", params, options)
|
218
226
|
end
|
219
227
|
|
220
228
|
def self.subfolders(of_folder_path, options={})
|
221
|
-
|
229
|
+
params = only(options, :max_results, :next_cursor)
|
230
|
+
call_api(:get, "folders/#{of_folder_path}", params, options)
|
231
|
+
end
|
232
|
+
|
233
|
+
def self.delete_folder(path, options={})
|
234
|
+
call_api(:delete, "folders/#{path}", {}, options)
|
235
|
+
end
|
236
|
+
|
237
|
+
def self.create_folder(folder_name, options={})
|
238
|
+
call_api(:post, "folders/#{folder_name}", {}, options)
|
222
239
|
end
|
223
240
|
|
224
241
|
def self.upload_mappings(options={})
|
@@ -311,40 +328,165 @@ class Cloudinary::Api
|
|
311
328
|
update_resources_access_mode(access_mode, :public_ids, public_ids, options)
|
312
329
|
end
|
313
330
|
|
331
|
+
def self.get_breakpoints(public_id, options)
|
332
|
+
local_options = options.clone
|
333
|
+
base_transformation = Cloudinary::Utils.generate_transformation_string(local_options)
|
334
|
+
srcset = local_options[:srcset]
|
335
|
+
breakpoints = [:min_width, :max_width, :bytes_step, :max_images].map {|k| srcset[k]}.join('_')
|
336
|
+
|
337
|
+
|
338
|
+
local_options[:transformation] = [base_transformation, width: "auto:breakpoints_#{breakpoints}:json"]
|
339
|
+
json_url = Cloudinary::Utils.cloudinary_url public_id, local_options
|
340
|
+
call_json_api('GET', json_url, {}, 60, {})
|
341
|
+
end
|
342
|
+
|
343
|
+
# Returns a list of all metadata field definitions.
|
344
|
+
#
|
345
|
+
# @see https://cloudinary.com/documentation/admin_api#get_metadata_fields Get metadata fields API reference
|
346
|
+
#
|
347
|
+
# @param [Hash] options Additional options
|
348
|
+
# @return [Cloudinary::Api::Response]
|
349
|
+
# @raise [Cloudinary::Api::Error]
|
350
|
+
def self.list_metadata_fields(options = {})
|
351
|
+
call_metadata_api(:get, [], {}, options)
|
352
|
+
end
|
353
|
+
|
354
|
+
# Gets a metadata field by external id.
|
355
|
+
#
|
356
|
+
# @see https://cloudinary.com/documentation/admin_api#get_a_metadata_field_by_external_id Get metadata field by external ID API reference
|
357
|
+
#
|
358
|
+
# @param [String] field_external_id The ID of the metadata field to retrieve
|
359
|
+
# @param [Hash] options Additional options
|
360
|
+
# @return [Cloudinary::Api::Response]
|
361
|
+
# @raise [Cloudinary::Api::Error]
|
362
|
+
def self.metadata_field_by_field_id(field_external_id, options = {})
|
363
|
+
uri = [field_external_id]
|
364
|
+
|
365
|
+
call_metadata_api(:get, uri, {}, options)
|
366
|
+
end
|
367
|
+
|
368
|
+
# Creates a new metadata field definition.
|
369
|
+
#
|
370
|
+
# @see https://cloudinary.com/documentation/admin_api#create_a_metadata_field Create metadata field API reference
|
371
|
+
#
|
372
|
+
# @param [Hash] field The field to add
|
373
|
+
# @param [Hash] options Additional options
|
374
|
+
# @return [Cloudinary::Api::Response]
|
375
|
+
# @raise [Cloudinary::Api::Error]
|
376
|
+
def self.add_metadata_field(field, options = {})
|
377
|
+
params = only(field, :type, :external_id, :label, :mandatory, :default_value, :validation, :datasource)
|
378
|
+
|
379
|
+
call_metadata_api(:post, [], params, options)
|
380
|
+
end
|
381
|
+
|
382
|
+
# Updates a metadata field by external id.
|
383
|
+
#
|
384
|
+
# Updates a metadata field definition (partially, no need to pass the entire object) passed as JSON data.
|
385
|
+
# See https://cloudinary.com/documentation/admin_api#generic_structure_of_a_metadata_field for the generic structure
|
386
|
+
# of a metadata field.
|
387
|
+
#
|
388
|
+
# @see https://cloudinary.com/documentation/admin_api#update_a_metadata_field_by_external_id Update metadata field API reference
|
389
|
+
#
|
390
|
+
# @param [String] field_external_id The id of the metadata field to update
|
391
|
+
# @param [Hash] field The field definition
|
392
|
+
# @param [Hash] options Additional options
|
393
|
+
# @return [Cloudinary::Api::Response]
|
394
|
+
# @raise [Cloudinary::Api::Error]
|
395
|
+
def self.update_metadata_field(field_external_id, field, options = {})
|
396
|
+
uri = [field_external_id]
|
397
|
+
params = only(field, :label, :mandatory, :default_value, :validation)
|
398
|
+
|
399
|
+
call_metadata_api(:put, uri, params, options)
|
400
|
+
end
|
401
|
+
|
402
|
+
# Deletes a metadata field definition.
|
403
|
+
#
|
404
|
+
# The field should no longer be considered a valid candidate for all other endpoints.
|
405
|
+
#
|
406
|
+
# @see https://cloudinary.com/documentation/admin_api#delete_a_metadata_field_by_external_id Delete metadata field API reference
|
407
|
+
#
|
408
|
+
# @param [String] field_external_id The external id of the field to delete
|
409
|
+
# @param [Hash] options Additional options
|
410
|
+
# @return [Cloudinary::Api::Response] A hash with a "message" key. "ok" value indicates a successful deletion
|
411
|
+
# @raise [Cloudinary::Api::Error]
|
412
|
+
def self.delete_metadata_field(field_external_id, options = {})
|
413
|
+
uri = [field_external_id]
|
414
|
+
|
415
|
+
call_metadata_api(:delete, uri, {}, options)
|
416
|
+
end
|
417
|
+
|
418
|
+
# Deletes entries in a metadata field datasource.
|
419
|
+
#
|
420
|
+
# Deletes (blocks) the datasource entries for a specified metadata field definition. Sets the state of the
|
421
|
+
# entries to inactive. This is a soft delete, the entries still exist under the hood and can be activated
|
422
|
+
# again with the restore datasource entries method.
|
423
|
+
#
|
424
|
+
# @see https://cloudinary.com/documentation/admin_api#delete_entries_in_a_metadata_field_datasource Delete entries in a metadata field datasource API reference
|
425
|
+
#
|
426
|
+
# @param [String] field_external_id The id of the field to update
|
427
|
+
# @param [Array] entries_external_id The ids of all the entries to delete from the datasource
|
428
|
+
# @param [Hash] options Additional options
|
429
|
+
# @return [Cloudinary::Api::Response] The remaining datasource entries
|
430
|
+
# @raise [Cloudinary::Api::Error]
|
431
|
+
def self.delete_datasource_entries(field_external_id, entries_external_id, options = {})
|
432
|
+
uri = [field_external_id, "datasource"]
|
433
|
+
params = {:external_ids => entries_external_id }
|
434
|
+
|
435
|
+
call_metadata_api(:delete, uri, params, options)
|
436
|
+
end
|
437
|
+
|
438
|
+
# Updates a metadata field datasource.
|
439
|
+
#
|
440
|
+
# Updates the datasource of a supported field type (currently only enum and set), passed as JSON data. The
|
441
|
+
# update is partial: datasource entries with an existing external_id will be updated and entries with new
|
442
|
+
# external_id’s (or without external_id’s) will be appended.
|
443
|
+
#
|
444
|
+
# @see https://cloudinary.com/documentation/admin_api#update_a_metadata_field_datasource Update a metadata field datasource API reference
|
445
|
+
#
|
446
|
+
# @param [String] field_external_id The external id of the field to update
|
447
|
+
# @param [Array] entries_external_id
|
448
|
+
# @param [Hash] options Additional options
|
449
|
+
# @return [Cloudinary::Api::Response]
|
450
|
+
# @raise [Cloudinary::Api::Error]
|
451
|
+
def self.update_metadata_field_datasource(field_external_id, entries_external_id, options = {})
|
452
|
+
uri = [field_external_id, "datasource"]
|
453
|
+
|
454
|
+
params = entries_external_id.each_with_object({:values => [] }) do |item, hash|
|
455
|
+
item = only(item, :external_id, :value)
|
456
|
+
hash[:values ] << item if item.present?
|
457
|
+
end
|
458
|
+
|
459
|
+
call_metadata_api(:put, uri, params, options)
|
460
|
+
end
|
461
|
+
|
462
|
+
# Restores entries in a metadata field datasource.
|
463
|
+
#
|
464
|
+
# Restores (unblocks) any previously deleted datasource entries for a specified metadata field definition.
|
465
|
+
# Sets the state of the entries to active.
|
466
|
+
#
|
467
|
+
# @see https://cloudinary.com/documentation/admin_api#restore_entries_in_a_metadata_field_datasource Restore entries in a metadata field datasource API reference
|
468
|
+
#
|
469
|
+
# @param [String] field_external_id The ID of the metadata field
|
470
|
+
# @param [Array] entries_external_ids An array of IDs of datasource entries to restore (unblock)
|
471
|
+
# @param [Hash] options Additional options
|
472
|
+
# @return [Cloudinary::Api::Response]
|
473
|
+
# @raise [Cloudinary::Api::Error]
|
474
|
+
def self.restore_metadata_field_datasource(field_external_id, entries_external_ids, options = {})
|
475
|
+
uri = [field_external_id, "datasource_restore"]
|
476
|
+
params = {:external_ids => entries_external_ids }
|
477
|
+
|
478
|
+
call_metadata_api(:post, uri, params, options)
|
479
|
+
end
|
480
|
+
|
314
481
|
protected
|
315
482
|
|
316
483
|
def self.call_api(method, uri, params, options)
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
|
323
|
-
# Add authentication
|
324
|
-
api_url.sub!(%r(^(https?://)), "\\1#{api_key}:#{api_secret}@")
|
325
|
-
|
326
|
-
headers = { "User-Agent" => Cloudinary::USER_AGENT }
|
327
|
-
if options[:content_type]== :json
|
328
|
-
payload = params.to_json
|
329
|
-
headers.merge!("Content-Type"=> 'application/json', "Accept"=> 'application/json')
|
330
|
-
else
|
331
|
-
payload = params.reject { |k, v| v.nil? || v=="" }
|
332
|
-
end
|
333
|
-
RestClient::Request.execute(:method => method, :url => api_url, :payload => payload, :timeout => timeout, :headers => headers) do
|
334
|
-
|response, request, tmpresult|
|
335
|
-
return Response.new(response) if response.code == 200
|
336
|
-
exception_class = case response.code
|
337
|
-
when 400 then BadRequest
|
338
|
-
when 401 then AuthorizationRequired
|
339
|
-
when 403 then NotAllowed
|
340
|
-
when 404 then NotFound
|
341
|
-
when 409 then AlreadyExists
|
342
|
-
when 420 then RateLimited
|
343
|
-
when 500 then GeneralError
|
344
|
-
else raise GeneralError.new("Server returned unexpected status code - #{response.code} - #{response.body}")
|
345
|
-
end
|
346
|
-
json = parse_json_response(response)
|
347
|
-
raise exception_class.new(json["error"]["message"])
|
484
|
+
cloud_name = options[:cloud_name] || Cloudinary.config.cloud_name || raise('Must supply cloud_name')
|
485
|
+
api_key = options[:api_key] || Cloudinary.config.api_key || raise('Must supply api_key')
|
486
|
+
api_secret = options[:api_secret] || Cloudinary.config.api_secret || raise('Must supply api_secret')
|
487
|
+
|
488
|
+
call_cloudinary_api(method, uri, api_key, api_secret, params, options) do |cloudinary, inner_uri|
|
489
|
+
[cloudinary, 'v1_1', cloud_name, inner_uri]
|
348
490
|
end
|
349
491
|
end
|
350
492
|
|
@@ -355,6 +497,22 @@ class Cloudinary::Api
|
|
355
497
|
raise GeneralError.new("Error parsing server response (#{response.code}) - #{response.body}. Got - #{e}")
|
356
498
|
end
|
357
499
|
|
500
|
+
# Protected function that assists with performing an API call to the metadata_fields part of the Admin API.
|
501
|
+
#
|
502
|
+
# @protected
|
503
|
+
# @param [Symbol] method The HTTP method. Valid methods: get, post, put, delete
|
504
|
+
# @param [Array] uri REST endpoint of the API (without 'metadata_fields')
|
505
|
+
# @param [Hash] params Query/body parameters passed to the method
|
506
|
+
# @param [Hash] options Additional options. Can be an override of the configuration, headers, etc.
|
507
|
+
# @return [Cloudinary::Api::Response]
|
508
|
+
# @raise [Cloudinary::Api::Error]
|
509
|
+
def self.call_metadata_api(method, uri, params, options)
|
510
|
+
options[:content_type] = :json
|
511
|
+
uri = ["metadata_fields", uri].reject(&:empty?).join("/")
|
512
|
+
|
513
|
+
call_api(method, uri, params, options)
|
514
|
+
end
|
515
|
+
|
358
516
|
def self.only(hash, *keys)
|
359
517
|
result = {}
|
360
518
|
keys.each do |key|
|
@@ -398,5 +556,4 @@ class Cloudinary::Api
|
|
398
556
|
params[by_key] = value
|
399
557
|
call_api("post", "resources/#{resource_type}/#{type}/update_access_mode", params, options)
|
400
558
|
end
|
401
|
-
|
402
559
|
end
|