uploadcare-rails 1.2.0.pre.alpha → 2.0.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/Rakefile +5 -16
- data/lib/generators/templates/uploadcare_config_template.erb +138 -0
- data/lib/generators/uploadcare_config_generator.rb +7 -4
- data/lib/uploadcare/errors/type_error.rb +7 -0
- data/lib/uploadcare/rails/action_view/uploadcare_include_tags.rb +48 -0
- data/lib/uploadcare/rails/action_view/uploadcare_uploader_tags.rb +57 -0
- data/lib/uploadcare/rails/active_record/mount_uploadcare_file.rb +62 -0
- data/lib/uploadcare/rails/active_record/mount_uploadcare_file_group.rb +58 -0
- data/lib/uploadcare/rails/api/rest/base.rb +14 -0
- data/lib/uploadcare/rails/api/rest/conversion_api.rb +42 -0
- data/lib/uploadcare/rails/api/rest/file_api.rb +69 -0
- data/lib/uploadcare/rails/api/rest/group_api.rb +48 -0
- data/lib/uploadcare/rails/api/rest/project_api.rb +27 -0
- data/lib/uploadcare/rails/api/rest/webhook_api.rb +45 -0
- data/lib/uploadcare/rails/api/upload/base.rb +13 -0
- data/lib/uploadcare/rails/api/upload/upload_api.rb +53 -0
- data/lib/uploadcare/rails/configuration.rb +57 -0
- data/lib/uploadcare/rails/engine.rb +13 -17
- data/lib/uploadcare/rails/jobs/delete_file_job.rb +14 -0
- data/lib/uploadcare/rails/jobs/store_file_job.rb +14 -0
- data/lib/uploadcare/rails/jobs/store_group_job.rb +14 -0
- data/lib/uploadcare/rails/objects/concerns/loadable.rb +46 -0
- data/lib/uploadcare/rails/objects/file.rb +40 -20
- data/lib/uploadcare/rails/objects/group.rb +51 -57
- data/lib/uploadcare/rails/services/files_count_extractor.rb +14 -0
- data/lib/uploadcare/rails/services/id_extractor.rb +15 -0
- data/lib/uploadcare/rails/transformations/image_transformations.rb +45 -0
- data/lib/uploadcare/rails/version.rb +3 -1
- data/lib/uploadcare/rails.rb +10 -0
- data/lib/uploadcare-rails.rb +27 -9
- data/spec/fixtures/kitten.jpeg +0 -0
- data/spec/fixtures/vcr_cassettes/conversion_api_convert_document.yml +62 -0
- data/spec/fixtures/vcr_cassettes/conversion_api_convert_document_with_error.yml +62 -0
- data/spec/fixtures/vcr_cassettes/conversion_api_convert_video.yml +62 -0
- data/spec/fixtures/vcr_cassettes/conversion_api_convert_video_with_error.yml +62 -0
- data/spec/fixtures/vcr_cassettes/conversion_api_get_document_conversion_status.yml +59 -0
- data/spec/fixtures/vcr_cassettes/conversion_api_get_video_conversion_status.yml +59 -0
- data/spec/fixtures/vcr_cassettes/file_api_copy_file.yml +60 -0
- data/spec/fixtures/vcr_cassettes/file_api_delete_file.yml +58 -0
- data/spec/fixtures/vcr_cassettes/file_api_delete_files.yml +58 -0
- data/spec/fixtures/vcr_cassettes/file_api_get_file.yml +58 -0
- data/spec/fixtures/vcr_cassettes/file_api_get_files.yml +61 -0
- data/spec/fixtures/vcr_cassettes/file_api_load_file.yml +57 -0
- data/spec/fixtures/vcr_cassettes/file_api_store_file.yml +58 -0
- data/spec/fixtures/vcr_cassettes/file_api_store_files.yml +57 -0
- data/spec/fixtures/vcr_cassettes/group_api_create_group.yml +57 -0
- data/spec/fixtures/vcr_cassettes/group_api_get_group.yml +52 -0
- data/spec/fixtures/vcr_cassettes/group_api_get_groups.yml +57 -0
- data/spec/fixtures/vcr_cassettes/group_api_store_group.yml +57 -0
- data/spec/fixtures/vcr_cassettes/project_api_get_project.yml +59 -0
- data/spec/fixtures/vcr_cassettes/upload_upload_many_files.yml +55 -0
- data/spec/fixtures/vcr_cassettes/upload_upload_one_file.yml +105 -0
- data/spec/fixtures/vcr_cassettes/upload_upload_one_file_from_cdn.yml +111 -0
- data/spec/fixtures/vcr_cassettes/webhook_api_create_webhook.yml +59 -0
- data/spec/fixtures/vcr_cassettes/webhook_api_delete_webhook.yml +57 -0
- data/spec/fixtures/vcr_cassettes/webhook_api_get_webhooks.yml +59 -0
- data/spec/fixtures/vcr_cassettes/webhook_api_update_webhook.yml +59 -0
- data/spec/generators/uploadcare_config_generator_spec.rb +18 -26
- data/spec/spec_helper.rb +17 -62
- data/spec/support/generators.rb +8 -5
- data/spec/support/vcr.rb +14 -0
- data/spec/tmp/config/initializers/uploadcare.rb +138 -0
- data/spec/uploadcare/rails/action_view/uploadcare_uploader_tags_spec.rb +40 -0
- data/spec/uploadcare/rails/action_view/uploadcare_widget_tags_spec.rb +46 -0
- data/spec/uploadcare/rails/active_record/mount_uploadcare_file_spec.rb +33 -0
- data/spec/uploadcare/rails/active_record/mount_uploadcare_group_spec.rb +32 -0
- data/spec/uploadcare/rails/api/rest/conversion_api_spec.rb +110 -0
- data/spec/uploadcare/rails/api/rest/file_api_spec.rb +85 -0
- data/spec/uploadcare/rails/api/rest/group_api_spec.rb +61 -0
- data/spec/uploadcare/rails/api/rest/project_api_spec.rb +33 -0
- data/spec/uploadcare/rails/api/rest/webhook_api_spec.rb +59 -0
- data/spec/uploadcare/rails/api/upload/upload_api_spec.rb +82 -0
- data/spec/uploadcare/rails/jobs/delete_file_job_spec.rb +15 -0
- data/spec/uploadcare/rails/jobs/store_file_job_spec.rb +15 -0
- data/spec/uploadcare/rails/jobs/store_group_job_spec.rb +15 -0
- data/spec/uploadcare/rails/objects/file_spec.rb +77 -0
- data/spec/uploadcare/rails/objects/group_spec.rb +87 -0
- data/spec/uploadcare/rails/services/id_extractor_spec.rb +26 -0
- data/spec/uploadcare/rails/transformations/image_transformations_spec.rb +120 -0
- data/spec/uploadcare/rails_spec.rb +7 -0
- metadata +131 -346
- data/config/initializers/uploadcare.rb +0 -26
- data/config/uploadcare_defaults.yml +0 -12
- data/lib/generators/templates/uploadcare_config_template.yml +0 -71
- data/lib/tasks/uploadcare_rails_tasks.rake +0 -4
- data/lib/uploadcare/rails/action_view/include_tags.rb +0 -47
- data/lib/uploadcare/rails/action_view/uploader_tags.rb +0 -76
- data/lib/uploadcare/rails/active_record/has_file.rb +0 -89
- data/lib/uploadcare/rails/active_record/has_group.rb +0 -84
- data/lib/uploadcare/rails/active_record/has_object.rb +0 -9
- data/lib/uploadcare/rails/formtastic/formtastic.rb +0 -73
- data/lib/uploadcare/rails/operations.rb +0 -57
- data/lib/uploadcare/rails/settings.rb +0 -81
- data/lib/uploadcare/rails/simple_form/simple_form.rb +0 -63
- data/spec/caching/file_caching_spec.rb +0 -26
- data/spec/caching/group_caching_spec.rb +0 -40
- data/spec/dummy/README.rdoc +0 -28
- data/spec/dummy/Rakefile +0 -6
- data/spec/dummy/app/assets/javascripts/application.js +0 -13
- data/spec/dummy/app/assets/javascripts/post_with_collections.js +0 -2
- data/spec/dummy/app/assets/javascripts/posts.js +0 -2
- data/spec/dummy/app/assets/javascripts/posts_with_collection_and_files.js +0 -2
- data/spec/dummy/app/assets/javascripts/uploadcare-1.5.5.min.js +0 -16
- data/spec/dummy/app/assets/stylesheets/application.css +0 -13
- data/spec/dummy/app/assets/stylesheets/post_with_collections.css +0 -4
- data/spec/dummy/app/assets/stylesheets/posts.css +0 -4
- data/spec/dummy/app/assets/stylesheets/posts_with_collection_and_files.css +0 -4
- data/spec/dummy/app/assets/stylesheets/scaffold.css +0 -56
- data/spec/dummy/app/controllers/application_controller.rb +0 -5
- data/spec/dummy/app/controllers/post_with_collections_controller.rb +0 -58
- data/spec/dummy/app/controllers/posts_controller.rb +0 -58
- data/spec/dummy/app/controllers/posts_with_collection_and_files_controller.rb +0 -58
- data/spec/dummy/app/helpers/application_helper.rb +0 -2
- data/spec/dummy/app/helpers/post_with_collections_helper.rb +0 -2
- data/spec/dummy/app/helpers/posts_helper.rb +0 -2
- data/spec/dummy/app/helpers/posts_with_collection_and_files_helper.rb +0 -2
- data/spec/dummy/app/models/post.rb +0 -3
- data/spec/dummy/app/models/post_with_collection.rb +0 -3
- data/spec/dummy/app/models/posts_with_collection_and_file.rb +0 -4
- data/spec/dummy/app/views/layouts/application.html.erb +0 -16
- data/spec/dummy/app/views/post_with_collections/_form.html.erb +0 -25
- data/spec/dummy/app/views/post_with_collections/edit.html.erb +0 -6
- data/spec/dummy/app/views/post_with_collections/index.html.erb +0 -29
- data/spec/dummy/app/views/post_with_collections/new.html.erb +0 -5
- data/spec/dummy/app/views/post_with_collections/show.html.erb +0 -14
- data/spec/dummy/app/views/post_with_collections/show.json.jbuilder +0 -1
- data/spec/dummy/app/views/posts/_form.html.erb +0 -31
- data/spec/dummy/app/views/posts/edit.html.erb +0 -6
- data/spec/dummy/app/views/posts/index.html.erb +0 -37
- data/spec/dummy/app/views/posts/new.html.erb +0 -5
- data/spec/dummy/app/views/posts/post.json.builder +0 -1
- data/spec/dummy/app/views/posts/show.html.erb +0 -15
- data/spec/dummy/app/views/posts_with_collection_and_files/_form.html.erb +0 -27
- data/spec/dummy/app/views/posts_with_collection_and_files/edit.html.erb +0 -6
- data/spec/dummy/app/views/posts_with_collection_and_files/index.html.erb +0 -25
- data/spec/dummy/app/views/posts_with_collection_and_files/new.html.erb +0 -5
- data/spec/dummy/app/views/posts_with_collection_and_files/show.html.erb +0 -4
- data/spec/dummy/app/views/posts_with_collection_and_files/show.json.jbuilder +0 -1
- data/spec/dummy/bin/bundle +0 -3
- data/spec/dummy/bin/rails +0 -4
- data/spec/dummy/bin/rake +0 -4
- data/spec/dummy/config/application.rb +0 -23
- data/spec/dummy/config/boot.rb +0 -5
- data/spec/dummy/config/database.yml +0 -25
- data/spec/dummy/config/environment.rb +0 -5
- data/spec/dummy/config/environments/development.rb +0 -29
- data/spec/dummy/config/environments/production.rb +0 -80
- data/spec/dummy/config/environments/test.rb +0 -36
- data/spec/dummy/config/initializers/backtrace_silencers.rb +0 -7
- data/spec/dummy/config/initializers/filter_parameter_logging.rb +0 -4
- data/spec/dummy/config/initializers/formtastic.rb +0 -111
- data/spec/dummy/config/initializers/inflections.rb +0 -16
- data/spec/dummy/config/initializers/mime_types.rb +0 -5
- data/spec/dummy/config/initializers/secret_token.rb +0 -12
- data/spec/dummy/config/initializers/session_store.rb +0 -3
- data/spec/dummy/config/initializers/simple_form.rb +0 -167
- data/spec/dummy/config/initializers/wrap_parameters.rb +0 -14
- data/spec/dummy/config/locales/en.yml +0 -23
- data/spec/dummy/config/locales/simple_form.en.yml +0 -31
- data/spec/dummy/config/routes.rb +0 -63
- data/spec/dummy/config/uploadcare.yml +0 -68
- data/spec/dummy/config.ru +0 -4
- data/spec/dummy/db/migrate/20171012001801_create_tables.rb +0 -27
- data/spec/dummy/db/schema.rb +0 -37
- data/spec/dummy/lib/templates/erb/scaffold/_form.html.erb +0 -13
- data/spec/dummy/public/404.html +0 -58
- data/spec/dummy/public/422.html +0 -58
- data/spec/dummy/public/500.html +0 -57
- data/spec/dummy/public/favicon.ico +0 -0
- data/spec/helpers/form_helpers_has_file_spec.rb +0 -30
- data/spec/helpers/form_helpers_has_group_spec.rb +0 -30
- data/spec/helpers/form_helpers_spec.rb +0 -33
- data/spec/helpers/formtastic_spec.rb +0 -25
- data/spec/helpers/include_tags_spec.rb +0 -54
- data/spec/helpers/simple_form_spec.rb +0 -25
- data/spec/helpers/uploader_tags_spec.rb +0 -21
- data/spec/models/has_both_file_and_group_spec.rb +0 -43
- data/spec/models/has_file_spec.rb +0 -46
- data/spec/models/has_group_spec.rb +0 -57
- data/spec/objects/file_spec.rb +0 -27
- data/spec/objects/group_spec.rb +0 -51
- data/spec/operations_spec.rb +0 -28
- data/spec/uploadcare/rails/settings_spec.rb +0 -136
- data/spec/uploadcare_rails_settings_spec.rb +0 -50
- data/spec/view.png +0 -0
- data/spec/view2.jpg +0 -0
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'uploadcare/rails/api/rest/base'
|
|
4
|
+
|
|
5
|
+
module Uploadcare
|
|
6
|
+
module Rails
|
|
7
|
+
module Api
|
|
8
|
+
module Rest
|
|
9
|
+
# A class that contains Webhook related methods for Uploadcare REST API
|
|
10
|
+
class WebhookApi < Base
|
|
11
|
+
class << self
|
|
12
|
+
# Returns a list (not paginated) of webhooks
|
|
13
|
+
# @see https://uploadcare.com/api-refs/rest-api/v0.5.0/#operation/webhooksList
|
|
14
|
+
# rubocop:disable Naming/AccessorMethodName
|
|
15
|
+
def get_webhooks
|
|
16
|
+
Uploadcare::Webhook.list
|
|
17
|
+
end
|
|
18
|
+
# rubocop:enable Naming/AccessorMethodName
|
|
19
|
+
|
|
20
|
+
# Create a webhook
|
|
21
|
+
# @see https://uploadcare.com/api-refs/rest-api/v0.5.0/#operation/webhookCreate
|
|
22
|
+
def create_webhook(target_url, event: 'file.uploaded', is_active: true)
|
|
23
|
+
options = { target_url: target_url, event: event, is_active: is_active }
|
|
24
|
+
Uploadcare::Webhook.create(**options)
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
# Updates a webhook
|
|
28
|
+
# @see https://uploadcare.com/api-refs/rest-api/v0.5.0/#operation/updateWebhook
|
|
29
|
+
def update_webhook(id, **options)
|
|
30
|
+
Uploadcare::Webhook.update(id, **options)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
# Permanently deletes a webhook
|
|
34
|
+
# @see https://uploadcare.com/api-refs/rest-api/v0.5.0/#operation/webhookUnsubscribe
|
|
35
|
+
def delete_webhook(target_url)
|
|
36
|
+
Uploadcare::Webhook.delete(target_url)
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
Uploadcare::WebhookApi = Uploadcare::Rails::Api::Rest::WebhookApi
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'uploadcare/rails/api/upload/base'
|
|
4
|
+
|
|
5
|
+
module Uploadcare
|
|
6
|
+
module Rails
|
|
7
|
+
module Api
|
|
8
|
+
module Upload
|
|
9
|
+
# A client for general uploads
|
|
10
|
+
#
|
|
11
|
+
# @see https://uploadcare.com/api-refs/upload-api/#tag/Upload
|
|
12
|
+
class UploadApi < Base
|
|
13
|
+
class << self
|
|
14
|
+
# Uploads single files smaller. Supports small (less that 100 MB) and large single files.
|
|
15
|
+
#
|
|
16
|
+
# @see https://uploadcare.com/api-refs/upload-api/#operation/baseUpload
|
|
17
|
+
# @see https://uploadcare.com/api-refs/upload-api/#operation/multipartFileUploadStart
|
|
18
|
+
def upload_file(file, **options)
|
|
19
|
+
return upload(file, options) if file?(file) || file.is_a?(String)
|
|
20
|
+
|
|
21
|
+
raise TypeError, "The first argument must be a File or String (URL), #{file.class} given"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Uploads several files smaller than 100MB.
|
|
25
|
+
#
|
|
26
|
+
# https://uploadcare.com/api-refs/upload-api/#operation/multipartFileUploadStart
|
|
27
|
+
def upload_files(files, **options)
|
|
28
|
+
return upload(files, options) if array_of_files?(files)
|
|
29
|
+
|
|
30
|
+
raise TypeError, 'The first argument must be an Array of File objects'
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
private
|
|
34
|
+
|
|
35
|
+
def array_of_files?(files)
|
|
36
|
+
files.is_a?(Array) && files.all? { |file| file?(file) }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
def file?(object)
|
|
40
|
+
object.respond_to?(:path) && ::File.exist?(object.path)
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def upload(files, options)
|
|
44
|
+
Uploadcare::Uploader.upload(files, **options)
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
Uploadcare::UploadApi = Uploadcare::Rails::Api::Upload::UploadApi
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'singleton'
|
|
4
|
+
|
|
5
|
+
module Uploadcare
|
|
6
|
+
module Rails
|
|
7
|
+
# A class for storing config parameters
|
|
8
|
+
class Configuration
|
|
9
|
+
include Singleton
|
|
10
|
+
|
|
11
|
+
CONFIG_GLOBAL_PARAMS = %w[
|
|
12
|
+
public_key secret_key cache_files cache_expires_in cache_namespace cdn_hostname
|
|
13
|
+
store_files_after_save store_files_async
|
|
14
|
+
delete_files_after_destroy delete_files_async
|
|
15
|
+
].freeze
|
|
16
|
+
|
|
17
|
+
WIDGET_PARAMS = %w[
|
|
18
|
+
public_key images_only preview_step crop image_shrink
|
|
19
|
+
clearable tabs input_accept_types preferred_types system_dialog multipart_min_size
|
|
20
|
+
preview_proxy cdn_base do_not_store audio_bits_per_second video_preferred_mime_types
|
|
21
|
+
video_bits_per_second camera_mirror_default live manual_start
|
|
22
|
+
locale locale_translations locale_pluralize
|
|
23
|
+
].freeze
|
|
24
|
+
|
|
25
|
+
attr_accessor(*(CONFIG_GLOBAL_PARAMS + WIDGET_PARAMS).uniq)
|
|
26
|
+
|
|
27
|
+
def uploader_parameters
|
|
28
|
+
WIDGET_PARAMS.map do |param_name|
|
|
29
|
+
param_value = instance_variable_get("@#{param_name}")
|
|
30
|
+
next if param_value.nil?
|
|
31
|
+
|
|
32
|
+
param_value = handle_param_value(param_value)
|
|
33
|
+
"UPLOADCARE_#{param_name.upcase} = #{param_value};"
|
|
34
|
+
end.compact.join("\n")
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def widget
|
|
38
|
+
OpenStruct.new(WIDGET_PARAMS.map { |param| [param, public_send(param)] }.to_h)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
private
|
|
42
|
+
|
|
43
|
+
def handle_param_value(param_value)
|
|
44
|
+
case param_value
|
|
45
|
+
when Hash
|
|
46
|
+
param_value.deep_stringify_keys.to_json
|
|
47
|
+
when Array
|
|
48
|
+
"'#{param_value.join(' ')}'"
|
|
49
|
+
when TrueClass, FalseClass
|
|
50
|
+
param_value
|
|
51
|
+
else
|
|
52
|
+
"'#{param_value}'"
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
end
|
|
@@ -1,28 +1,24 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
1
3
|
require 'rails/engine'
|
|
2
|
-
require 'uploadcare/rails/settings'
|
|
3
4
|
|
|
4
5
|
module Uploadcare
|
|
5
6
|
module Rails
|
|
7
|
+
# Rails engine that allows to extend default rails libraries
|
|
6
8
|
class Engine < ::Rails::Engine
|
|
7
9
|
initializer 'uploadcare-rails.load' do
|
|
8
|
-
#
|
|
9
|
-
#
|
|
10
|
-
|
|
11
|
-
ActiveSupport.on_load :active_record do
|
|
12
|
-
require 'uploadcare/rails/active_record/has_file'
|
|
13
|
-
require 'uploadcare/rails/active_record/has_group'
|
|
14
|
-
end
|
|
15
|
-
|
|
16
|
-
# JS options, widets from cdn etc
|
|
10
|
+
# Load extensions
|
|
11
|
+
# Extend action_view with widget_tag
|
|
17
12
|
ActiveSupport.on_load :action_view do
|
|
18
|
-
require 'uploadcare/rails/action_view/
|
|
19
|
-
require 'uploadcare/rails/action_view/
|
|
20
|
-
|
|
21
|
-
# Simple Form helpers
|
|
22
|
-
require 'uploadcare/rails/simple_form/simple_form' if defined?(SimpleForm)
|
|
13
|
+
require 'uploadcare/rails/action_view/uploadcare_include_tags'
|
|
14
|
+
require 'uploadcare/rails/action_view/uploadcare_uploader_tags'
|
|
15
|
+
end
|
|
23
16
|
|
|
24
|
-
|
|
25
|
-
|
|
17
|
+
# Load extensions for active_record
|
|
18
|
+
# Extend active_record with mount_uploadcare_file and mount_uploadcare_file_group methods
|
|
19
|
+
ActiveSupport.on_load :active_record do
|
|
20
|
+
require 'uploadcare/rails/active_record/mount_uploadcare_file'
|
|
21
|
+
require 'uploadcare/rails/active_record/mount_uploadcare_file_group'
|
|
26
22
|
end
|
|
27
23
|
end
|
|
28
24
|
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'active_job'
|
|
4
|
+
|
|
5
|
+
module Uploadcare
|
|
6
|
+
module Rails
|
|
7
|
+
# A job deleting files from Uploadcare
|
|
8
|
+
class DeleteFileJob < ActiveJob::Base
|
|
9
|
+
def perform(file_uuid)
|
|
10
|
+
Uploadcare::FileApi.delete_file(file_uuid) if file_uuid
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'active_job'
|
|
4
|
+
|
|
5
|
+
module Uploadcare
|
|
6
|
+
module Rails
|
|
7
|
+
# A job storing files to Uploadcare
|
|
8
|
+
class StoreFileJob < ActiveJob::Base
|
|
9
|
+
def perform(file_uuid)
|
|
10
|
+
Uploadcare::FileApi.store_file(file_uuid) if file_uuid
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'active_job'
|
|
4
|
+
|
|
5
|
+
module Uploadcare
|
|
6
|
+
module Rails
|
|
7
|
+
# A job storing group files to Uploadcare
|
|
8
|
+
class StoreGroupJob < ActiveJob::Base
|
|
9
|
+
def perform(group_id)
|
|
10
|
+
Uploadcare::GroupApi.store_group(group_id) if group_id
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'active_record'
|
|
4
|
+
|
|
5
|
+
module Uploadcare
|
|
6
|
+
module Rails
|
|
7
|
+
module Objects
|
|
8
|
+
# A module that contains methods for attribute assignation and caching
|
|
9
|
+
module Loadable
|
|
10
|
+
extend ActiveSupport::Concern
|
|
11
|
+
include ::ActiveRecord::AttributeAssignment
|
|
12
|
+
|
|
13
|
+
class_methods do
|
|
14
|
+
def build_cache_key(key)
|
|
15
|
+
[uploadcare_configuration.cache_namespace, key].flatten.reject(&:blank?)
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def uploadcare_configuration
|
|
19
|
+
Uploadcare::Rails.configuration
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def update_attrs(new_attrs)
|
|
24
|
+
assign_attributes(new_attrs)
|
|
25
|
+
self
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def cache_expires_in
|
|
29
|
+
uploadcare_configuration.cache_expires_in
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
def caching_enabled?
|
|
33
|
+
uploadcare_configuration.cache_files
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def uploadcare_configuration
|
|
37
|
+
self.class.uploadcare_configuration
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
def cache_key
|
|
41
|
+
self.class.build_cache_key(cdn_url)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
@@ -1,40 +1,60 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'uploadcare/rails/api/rest/file_api'
|
|
4
|
+
require 'uploadcare/rails/transformations/image_transformations'
|
|
5
|
+
require 'uploadcare/rails/objects/concerns/loadable'
|
|
6
|
+
|
|
1
7
|
module Uploadcare
|
|
2
8
|
module Rails
|
|
3
|
-
class
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
9
|
+
# A wrapper class for Uploadcare::File object.
|
|
10
|
+
# Allows caching loaded files and has methods for Rails model attributes
|
|
11
|
+
class File < Uploadcare::Entity::File
|
|
12
|
+
include Objects::Loadable
|
|
13
|
+
|
|
14
|
+
ATTR_ENTITIES = [:cdn_url].freeze
|
|
15
|
+
|
|
16
|
+
attr_entity(*superclass.entity_attributes + ATTR_ENTITIES)
|
|
17
|
+
|
|
18
|
+
def transform_url(transformations, transformator_class = Uploadcare::Rails::Transformations::ImageTransformations)
|
|
19
|
+
return if cdn_url.blank?
|
|
20
|
+
|
|
21
|
+
transformations_query = transformator_class.new(transformations).call if transformations.present?
|
|
22
|
+
[cdn_url, transformations_query].compact.join('-')
|
|
7
23
|
end
|
|
8
24
|
|
|
9
|
-
def
|
|
10
|
-
Uploadcare::
|
|
25
|
+
def store
|
|
26
|
+
file_info = Uploadcare::FileApi.store_file(uuid).merge(cdn_url: cdn_url).to_h
|
|
27
|
+
::Rails.cache.write(cache_key, file_info, expires_in: cache_expires_in) if caching_enabled?
|
|
28
|
+
update_attrs(file_info)
|
|
11
29
|
end
|
|
12
30
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
image_tag(url(operations))
|
|
31
|
+
def delete
|
|
32
|
+
Uploadcare::FileApi.delete_file(uuid)
|
|
16
33
|
end
|
|
17
34
|
|
|
18
|
-
# override default to string method
|
|
19
|
-
# instead of string representation of object it will return simple cdn url of a file
|
|
20
35
|
def to_s
|
|
21
36
|
cdn_url
|
|
22
37
|
end
|
|
23
38
|
|
|
24
|
-
def
|
|
25
|
-
|
|
39
|
+
def load
|
|
40
|
+
file_info = if caching_enabled?
|
|
41
|
+
::Rails.cache.fetch(cache_key, expires_in: cache_expires_in) do
|
|
42
|
+
request_file_info_from_api
|
|
43
|
+
end
|
|
44
|
+
else
|
|
45
|
+
request_file_info_from_api
|
|
46
|
+
end
|
|
47
|
+
update_attrs(file_info)
|
|
26
48
|
end
|
|
27
49
|
|
|
28
|
-
def
|
|
29
|
-
|
|
50
|
+
def loaded?
|
|
51
|
+
datetime_uploaded.present?
|
|
30
52
|
end
|
|
31
53
|
|
|
32
|
-
|
|
33
|
-
marshal_dump
|
|
34
|
-
end
|
|
54
|
+
private
|
|
35
55
|
|
|
36
|
-
def
|
|
37
|
-
|
|
56
|
+
def request_file_info_from_api
|
|
57
|
+
Uploadcare::FileApi.get_file(uuid).merge(self).to_h
|
|
38
58
|
end
|
|
39
59
|
end
|
|
40
60
|
end
|
|
@@ -1,81 +1,75 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'uploadcare/rails/api/rest/group_api'
|
|
4
|
+
require 'uploadcare/rails/transformations/image_transformations'
|
|
5
|
+
require 'uploadcare/rails/objects/concerns/loadable'
|
|
6
|
+
|
|
1
7
|
module Uploadcare
|
|
2
8
|
module Rails
|
|
3
|
-
class
|
|
9
|
+
# A wrapper class that for Uploadcare::Group object.
|
|
10
|
+
# Allows caching loaded groups and has methods for Rails model attributes
|
|
11
|
+
class Group < Uploadcare::Entity::Group
|
|
12
|
+
include Objects::Loadable
|
|
13
|
+
|
|
14
|
+
attr_entity(*superclass.entity_attributes)
|
|
4
15
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
Operations.new(operations).to_s
|
|
15
|
-
].join('/')
|
|
16
|
+
def transform_file_urls(
|
|
17
|
+
transformations,
|
|
18
|
+
transformator_class = Uploadcare::Rails::Transformations::ImageTransformations
|
|
19
|
+
)
|
|
20
|
+
return if cdn_url.blank?
|
|
21
|
+
|
|
22
|
+
transformations_query = transformator_class.new(transformations).call if transformations.present?
|
|
23
|
+
map_file_urls do |index|
|
|
24
|
+
[group_file_url(index), transformations_query].compact.join('-')
|
|
16
25
|
end
|
|
17
26
|
end
|
|
18
27
|
|
|
19
|
-
def
|
|
20
|
-
|
|
21
|
-
|
|
28
|
+
def file_urls
|
|
29
|
+
map_file_urls do |index|
|
|
30
|
+
group_file_url(index)
|
|
31
|
+
end
|
|
22
32
|
end
|
|
23
33
|
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
cache_data
|
|
29
|
-
self
|
|
34
|
+
def store
|
|
35
|
+
group_info = Uploadcare::GroupApi.store_group(id).to_h
|
|
36
|
+
::Rails.cache.write(cache_key, group_info, expires_in: cache_expires_in) if caching_enabled?
|
|
37
|
+
update_attrs(group_info)
|
|
30
38
|
end
|
|
31
39
|
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
def cache_data
|
|
35
|
-
return unless UPLOADCARE_SETTINGS.cache_groups
|
|
36
|
-
::Rails.cache.write(cdn_url, marshal_dump)
|
|
37
|
-
self
|
|
40
|
+
def to_s
|
|
41
|
+
cdn_url
|
|
38
42
|
end
|
|
39
43
|
|
|
40
|
-
def
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
table
|
|
44
|
+
def load
|
|
45
|
+
group_info = if caching_enabled?
|
|
46
|
+
::Rails.cache.fetch(cache_key, expires_in: cache_expires_in) do
|
|
47
|
+
request_group_info_from_api
|
|
48
|
+
end
|
|
49
|
+
else
|
|
50
|
+
request_group_info_from_api
|
|
51
|
+
end
|
|
52
|
+
update_attrs(group_info)
|
|
50
53
|
end
|
|
51
54
|
|
|
52
|
-
def
|
|
53
|
-
|
|
55
|
+
def loaded?
|
|
56
|
+
datetime_created.present?
|
|
54
57
|
end
|
|
55
58
|
|
|
56
|
-
|
|
57
|
-
marshal_dump
|
|
58
|
-
end
|
|
59
|
+
private
|
|
59
60
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
def to_s
|
|
63
|
-
uuid
|
|
61
|
+
def request_group_info_from_api
|
|
62
|
+
Uploadcare::GroupApi.get_group(id).merge(self).to_h
|
|
64
63
|
end
|
|
65
64
|
|
|
66
|
-
|
|
65
|
+
def group_file_url(index)
|
|
66
|
+
"#{cdn_url}nth/#{index}/"
|
|
67
|
+
end
|
|
67
68
|
|
|
68
|
-
def
|
|
69
|
-
|
|
70
|
-
data['files'].map! do |file|
|
|
71
|
-
if file.nil?
|
|
72
|
-
file
|
|
73
|
-
else
|
|
74
|
-
Uploadcare::Rails::File.new(@api, file['uuid'], file)
|
|
75
|
-
end
|
|
76
|
-
end
|
|
69
|
+
def map_file_urls(&block)
|
|
70
|
+
return [] unless block_given?
|
|
77
71
|
|
|
78
|
-
|
|
72
|
+
Array.new(files_count.to_i, &block)
|
|
79
73
|
end
|
|
80
74
|
end
|
|
81
75
|
end
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Uploadcare
|
|
4
|
+
module Rails
|
|
5
|
+
# A class extracting the files count param of a file group from a group ID.
|
|
6
|
+
class FilesCountExtractor
|
|
7
|
+
class << self
|
|
8
|
+
def call(input_str)
|
|
9
|
+
input_str.split('~').last if input_str.present?
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Uploadcare
|
|
4
|
+
module Rails
|
|
5
|
+
# A class extracting an ID of an object from an URL.
|
|
6
|
+
class IdExtractor
|
|
7
|
+
class << self
|
|
8
|
+
# regex is an UUID-regex by default
|
|
9
|
+
def call(input_str, regex = /\b[0-9a-f]{8}\b-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-\b[0-9a-f]{12}\b/)
|
|
10
|
+
input_str.match(regex).to_s
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require 'uploadcare/errors/type_error'
|
|
4
|
+
|
|
5
|
+
module Uploadcare
|
|
6
|
+
module Rails
|
|
7
|
+
module Transformations
|
|
8
|
+
# A class for building image urls after image transformations.
|
|
9
|
+
class ImageTransformations
|
|
10
|
+
def initialize(options = {})
|
|
11
|
+
raise ArgumentError, "Options argument must be a Hash, #{options.class} is given?" unless options.is_a?(Hash)
|
|
12
|
+
|
|
13
|
+
@options = options.map { |k, v| [k.to_sym, v] }.to_h
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def call
|
|
17
|
+
options_to_a.compact.join('-').squeeze('/').gsub(/\s/, '').presence
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
private
|
|
21
|
+
|
|
22
|
+
attr_reader :options
|
|
23
|
+
|
|
24
|
+
def options_to_a
|
|
25
|
+
options.map do |key, value|
|
|
26
|
+
"/#{key}/#{adjusted_value(value)}/"
|
|
27
|
+
end
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def adjusted_value(value)
|
|
31
|
+
case value
|
|
32
|
+
when Hash
|
|
33
|
+
value.values.join('/')
|
|
34
|
+
when TrueClass, FalseClass, 'true', 'false'
|
|
35
|
+
nil
|
|
36
|
+
when Array
|
|
37
|
+
value.join(',')
|
|
38
|
+
else
|
|
39
|
+
value
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
data/lib/uploadcare-rails.rb
CHANGED
|
@@ -1,15 +1,33 @@
|
|
|
1
|
-
|
|
1
|
+
# frozen_string_literal: true
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
3
|
+
require 'uploadcare/rails/engine'
|
|
4
|
+
require 'uploadcare/rails/configuration'
|
|
5
|
+
require 'uploadcare/rails/objects/file'
|
|
6
|
+
require 'uploadcare/rails/objects/group'
|
|
7
|
+
require 'uploadcare/rails/api/rest/file_api'
|
|
8
|
+
require 'uploadcare/rails/api/rest/group_api'
|
|
9
|
+
require 'uploadcare/rails/api/rest/project_api'
|
|
10
|
+
require 'uploadcare/rails/api/rest/webhook_api'
|
|
11
|
+
require 'uploadcare/rails/api/rest/conversion_api'
|
|
12
|
+
require 'uploadcare/rails/api/upload/upload_api'
|
|
8
13
|
|
|
9
14
|
module Uploadcare
|
|
15
|
+
# A root module for the gem
|
|
10
16
|
module Rails
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
17
|
+
module_function
|
|
18
|
+
|
|
19
|
+
def configure
|
|
20
|
+
yield configuration
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def configuration
|
|
24
|
+
@configuration
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def initialize_config
|
|
28
|
+
@configuration = Uploadcare::Rails::Configuration.instance
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
initialize_config
|
|
14
32
|
end
|
|
15
33
|
end
|
|
Binary file
|