uploadcare-ruby 1.2.1 → 3.0.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.
Files changed (98) hide show
  1. checksums.yaml +5 -5
  2. data/.github/workflows/gem-push.yml +20 -0
  3. data/.github/workflows/ruby.yml +52 -0
  4. data/.gitignore +13 -5
  5. data/.rspec +3 -0
  6. data/.rubocop.yml +20 -0
  7. data/.yardopts +4 -0
  8. data/CHANGELOG.md +25 -24
  9. data/DEVELOPMENT.md +18 -0
  10. data/Gemfile +2 -0
  11. data/LICENSE +1 -1
  12. data/README.md +191 -519
  13. data/Rakefile +6 -4
  14. data/bin/console +15 -0
  15. data/bin/setup +8 -0
  16. data/lib/uploadcare.rb +36 -26
  17. data/lib/uploadcare/api/api.rb +25 -0
  18. data/lib/uploadcare/client/file_client.rb +44 -0
  19. data/lib/uploadcare/client/file_list_client.rb +46 -0
  20. data/lib/uploadcare/client/group_client.rb +45 -0
  21. data/lib/uploadcare/client/multipart_upload/chunks_client.rb +46 -0
  22. data/lib/uploadcare/client/multipart_upload_client.rb +62 -0
  23. data/lib/uploadcare/client/project_client.rb +18 -0
  24. data/lib/uploadcare/client/rest_client.rb +73 -0
  25. data/lib/uploadcare/client/rest_group_client.rb +23 -0
  26. data/lib/uploadcare/client/upload_client.rb +35 -0
  27. data/lib/uploadcare/client/uploader_client.rb +93 -0
  28. data/lib/uploadcare/client/webhook_client.rb +43 -0
  29. data/lib/uploadcare/concern/error_handler.rb +54 -0
  30. data/lib/uploadcare/concern/throttle_handler.rb +25 -0
  31. data/lib/uploadcare/concern/upload_error_handler.rb +32 -0
  32. data/lib/uploadcare/entity/decorator/paginator.rb +81 -0
  33. data/lib/uploadcare/entity/entity.rb +18 -0
  34. data/lib/uploadcare/entity/file.rb +81 -0
  35. data/lib/uploadcare/entity/file_list.rb +30 -0
  36. data/lib/uploadcare/entity/group.rb +41 -0
  37. data/lib/uploadcare/entity/group_list.rb +24 -0
  38. data/lib/uploadcare/entity/project.rb +13 -0
  39. data/lib/uploadcare/entity/uploader.rb +73 -0
  40. data/lib/uploadcare/entity/webhook.rb +14 -0
  41. data/lib/uploadcare/exception/request_error.rb +9 -0
  42. data/lib/uploadcare/exception/throttle_error.rb +14 -0
  43. data/lib/uploadcare/param/authentication_header.rb +25 -0
  44. data/lib/uploadcare/param/param.rb +10 -0
  45. data/lib/uploadcare/param/secure_auth_header.rb +37 -0
  46. data/lib/uploadcare/param/simple_auth_header.rb +14 -0
  47. data/lib/uploadcare/param/upload/signature_generator.rb +24 -0
  48. data/lib/uploadcare/param/upload/upload_params_generator.rb +23 -0
  49. data/lib/uploadcare/param/user_agent.rb +21 -0
  50. data/lib/uploadcare/ruby/version.rb +5 -0
  51. data/uploadcare-ruby.gemspec +50 -36
  52. metadata +112 -96
  53. data/.travis.yml +0 -12
  54. data/lib/uploadcare/api.rb +0 -24
  55. data/lib/uploadcare/api/file_api.rb +0 -7
  56. data/lib/uploadcare/api/file_list_api.rb +0 -8
  57. data/lib/uploadcare/api/group_api.rb +0 -38
  58. data/lib/uploadcare/api/group_list_api.rb +0 -8
  59. data/lib/uploadcare/api/project_api.rb +0 -9
  60. data/lib/uploadcare/api/raw_api.rb +0 -44
  61. data/lib/uploadcare/api/uploading_api.rb +0 -110
  62. data/lib/uploadcare/errors/errors.rb +0 -64
  63. data/lib/uploadcare/resources/file.rb +0 -164
  64. data/lib/uploadcare/resources/file_list.rb +0 -41
  65. data/lib/uploadcare/resources/group.rb +0 -115
  66. data/lib/uploadcare/resources/group_list.rb +0 -31
  67. data/lib/uploadcare/resources/project.rb +0 -13
  68. data/lib/uploadcare/rest/auth/auth.rb +0 -31
  69. data/lib/uploadcare/rest/auth/secure.rb +0 -43
  70. data/lib/uploadcare/rest/auth/simple.rb +0 -16
  71. data/lib/uploadcare/rest/connections/api_connection.rb +0 -32
  72. data/lib/uploadcare/rest/connections/upload_connection.rb +0 -21
  73. data/lib/uploadcare/rest/middlewares/auth_middleware.rb +0 -24
  74. data/lib/uploadcare/rest/middlewares/parse_json_middleware.rb +0 -33
  75. data/lib/uploadcare/rest/middlewares/raise_error_middleware.rb +0 -21
  76. data/lib/uploadcare/utils/parser.rb +0 -71
  77. data/lib/uploadcare/utils/user_agent.rb +0 -44
  78. data/lib/uploadcare/version.rb +0 -3
  79. data/spec/api/raw_api_spec.rb +0 -25
  80. data/spec/resources/file_list_spec.rb +0 -64
  81. data/spec/resources/file_spec.rb +0 -222
  82. data/spec/resources/group_list_spec.rb +0 -30
  83. data/spec/resources/group_spec.rb +0 -101
  84. data/spec/resources/operations_spec.rb +0 -59
  85. data/spec/resources/project_spec.rb +0 -21
  86. data/spec/rest/api_connection_spec.rb +0 -68
  87. data/spec/rest/auth/secure_spec.rb +0 -66
  88. data/spec/rest/auth/simple_spec.rb +0 -31
  89. data/spec/rest/errors_spec.rb +0 -75
  90. data/spec/rest/upload_connection_spec.rb +0 -19
  91. data/spec/spec_helper.rb +0 -41
  92. data/spec/uploadcare_spec.rb +0 -16
  93. data/spec/uploading/uploading_multiple_spec.rb +0 -43
  94. data/spec/uploading/uploading_spec.rb +0 -40
  95. data/spec/utils/parser_spec.rb +0 -87
  96. data/spec/utils/user_agent_spec.rb +0 -46
  97. data/spec/view.png +0 -0
  98. data/spec/view2.jpg +0 -0
@@ -1,110 +0,0 @@
1
- require "uri"
2
- require 'mime/types'
3
-
4
- module Uploadcare
5
- module UploadingApi
6
- # intelegent guess for file or url uploading
7
- def upload object
8
- # if object is file - uploading it as file
9
- if object.kind_of?(File)
10
- upload_file(object)
11
-
12
- # if a string - try to upload as url
13
- elsif object.kind_of?(String)
14
- upload_url(object)
15
-
16
- # array of files
17
- elsif object.kind_of?(Array)
18
- upload_files(object)
19
-
20
- else
21
- raise ArgumentError.new "you should give File object, array of files or valid url string"
22
- end
23
- end
24
-
25
-
26
- def upload_files files
27
- raise ArgumentError.new "one or more of given files is not actually files" if files.select {|f| !f.kind_of?(File)}.any?
28
-
29
- data = {UPLOADCARE_PUB_KEY: @options[:public_key]}
30
-
31
- files.each_with_index do |file, i|
32
- data["file[#{i}]"] = build_upload_io(file)
33
- end
34
-
35
- response = @upload_connection.send :post, '/base/', data
36
- uuids = response.body
37
-
38
- files = uuids.values.map! {|f| Uploadcare::Api::File.new self, f }
39
- end
40
-
41
-
42
- # upload file to servise
43
- def upload_file file
44
- raise ArgumentError.new 'expecting File object' unless file.kind_of?(File)
45
-
46
- response = @upload_connection.send :post, '/base/', {
47
- UPLOADCARE_PUB_KEY: @options[:public_key],
48
- file: build_upload_io(file)
49
- }
50
-
51
- uuid = response.body["file"]
52
-
53
- Uploadcare::Api::File.new self, uuid
54
- end
55
-
56
- # create file is the same as uplaod file
57
- alias_method :create_file, :upload_file
58
-
59
-
60
- #upload from url
61
- def upload_url url
62
- uri = URI.parse(url)
63
-
64
- raise ArgumentError.new 'invalid url was given' unless uri.kind_of?(URI::HTTP)
65
-
66
- token = get_token(url)
67
-
68
- while !['success', 'error'].include?((response = get_status_response(token))['status'])
69
- sleep 0.5
70
- end
71
-
72
- raise ArgumentError.new(response['error']) if response['status'] == 'error'
73
- uuid = response['file_id']
74
- Uploadcare::Api::File.new self, uuid
75
- end
76
- alias_method :upload_from_url, :upload_url
77
-
78
-
79
-
80
-
81
- protected
82
- # DEPRECATRED but still works
83
- def upload_request method, path, params = {}
84
- response = @upload_connection.send method, path, params
85
- end
86
-
87
- def build_upload_io file
88
- Faraday::UploadIO.new file.path, extract_mime_type(file)
89
- end
90
-
91
-
92
- private
93
- def get_status_response token
94
- response = @upload_connection.send :post, '/from_url/status/', {token: token}
95
- response.body
96
- end
97
-
98
-
99
- def get_token url
100
- response = @upload_connection.send :post, '/from_url/', { source_url: url, pub_key: @options[:public_key] }
101
- token = response.body["token"]
102
- end
103
-
104
-
105
- def extract_mime_type file
106
- types = MIME::Types.of(file.path)
107
- types[0].content_type
108
- end
109
- end
110
- end
@@ -1,64 +0,0 @@
1
- module Uploadcare
2
- class Error < ::StandardError
3
-
4
- def self.define_error code, klass, message
5
- class_eval <<-EOD
6
- class #{klass} < self
7
- def initialize( message = nil )
8
- super( message || "HTTP #{code} - #{message}" )
9
- end
10
- end
11
- EOD
12
- end
13
-
14
- def self.errors
15
- @errors ||= {
16
- 400 => Uploadcare::Error::RequestError::BadRequest,
17
- 401 => Uploadcare::Error::RequestError::Unauthorized,
18
- 403 => Uploadcare::Error::RequestError::Forbidden,
19
- 404 => Uploadcare::Error::RequestError::NotFound,
20
- 406 => Uploadcare::Error::RequestError::NotAcceptable,
21
- 408 => Uploadcare::Error::RequestError::RequestTimeout,
22
- 422 => Uploadcare::Error::RequestError::UnprocessableEntity,
23
- 429 => Uploadcare::Error::RequestError::TooManyRequests,
24
- 500 => Uploadcare::Error::ServerError::InternalServerError,
25
- 502 => Uploadcare::Error::ServerError::BadGateway,
26
- 503 => Uploadcare::Error::ServerError::ServiceUnavailable,
27
- 504 => Uploadcare::Error::ServerError::GatewayTimeout,
28
- }
29
- end
30
-
31
-
32
- # Overall service error so you could escape it no matter what code is return
33
-
34
- # all 4xx error
35
- class RequestError < self;
36
- def initialize( message = nil )
37
- super( message || "HTTP 4xx - a request error occured." )
38
- end
39
-
40
- define_error 400, "BadRequest", "the request cannot be fulfilled due to bad syntax."
41
- define_error 401, "Unauthorized", "authentication is required and has failed or has not yet been provided."
42
- define_error 403, "Forbidden", "the request was a valid request, but the server is refusing to respond to it."
43
- define_error 404, "NotFound", "the requested resource could not be found."
44
- define_error 406, "NotAcceptable", "the requested resource is only capable of generating content"
45
- define_error 408, "RequestTimeout", "the server timed out waiting for the request."
46
- define_error 422, "UnprocessableEntity", "the request was well-formed but was unable to be followed due to semantic errors."
47
- define_error 429, "TooManyRequests", "too many requests in a given amount of time."
48
- end
49
-
50
- # all 5xx error
51
- class ServerError < self;
52
- def initialize( message = nil )
53
- super( message || "HTTP 5xx - a server error occured." )
54
- end
55
-
56
- define_error 500, "InternalServerError", "some error occured on server."
57
- define_error 502, "BadGateway", "received an invalid response from the upstream server."
58
- define_error 503, "ServiceUnavailable", "the server is currently unavailable."
59
- define_error 504, "GatewayTimeout", "the server did not receive a timely response from the upstream server."
60
- end
61
-
62
- # specific error
63
- end
64
- end
@@ -1,164 +0,0 @@
1
- require 'ostruct'
2
-
3
- module Uploadcare
4
- class Api
5
- class File < OpenStruct
6
- def initialize api, uuid_or_cdn_url, data=nil
7
- result = Uploadcare::Parser.parse_file_string uuid_or_cdn_url
8
-
9
- file = {uuid: result.uuid, operations: result.operations}
10
-
11
- @api = api
12
-
13
- super file
14
-
15
- set_data(data) if data
16
- end
17
-
18
- def cdn_url add_operations=false
19
- if add_operations
20
- cdn_url_with_operations
21
- else
22
- cdn_url_without_operations
23
- end
24
- end
25
- alias_method :public_url, :cdn_url
26
-
27
-
28
- def cdn_url_without_operations
29
- @api.options[:static_url_base] + "/#{@table[:uuid]}/"
30
- end
31
- alias_method :public_url_without_operations, :cdn_url_without_operations
32
-
33
-
34
- def cdn_url_with_operations
35
- url = cdn_url_without_operations
36
- unless operations.empty?
37
- ops = operations.join("/-/")
38
- url = url + "-/#{ops}/"
39
- end
40
- url
41
- end
42
- alias_method :public_url_with_operations, :cdn_url_with_operations
43
-
44
-
45
- def load_data
46
- load_data! unless is_loaded?
47
- self
48
- end
49
- alias_method :load, :load_data
50
-
51
- def load_data!
52
- data = @api.get "/files/#{uuid}/"
53
- set_data(data)
54
-
55
- self
56
- end
57
- alias_method :load!, :load_data!
58
-
59
- def is_loaded?
60
- !send(:datetime_uploaded).nil?
61
- end
62
- alias_method :loaded?, :is_loaded?
63
-
64
-
65
- def store
66
- data = @api.put "/files/#{uuid}/storage/"
67
- set_data data
68
- self
69
- end
70
-
71
- # nil is returning if there is no way to say for sure
72
- def is_stored?
73
- return nil unless is_loaded?
74
- !send(:datetime_stored).nil?
75
- end
76
- alias_method :stored?, :is_stored?
77
-
78
-
79
- def delete
80
- data = @api.delete "/files/#{uuid}/storage/"
81
- set_data data
82
- self
83
- end
84
-
85
- # nil is returning if there is no way to say for sure
86
- def is_deleted?
87
- return nil unless is_loaded?
88
- !send(:datetime_removed).nil?
89
- end
90
- alias_method :deleted?, :is_deleted?
91
- alias_method :removed?, :is_deleted?
92
- alias_method :is_removed?, :is_deleted?
93
-
94
-
95
- # copy file to target location
96
- # note what file copied with operations
97
- def copy with_operations=true, target=nil
98
- warn "[DEPRECATION] `copy` is deprecated and will be removed in "\
99
- "version 3.0. Please use `internal_copy` or `external_copy` instead."
100
- data = Hash.new
101
- data[:target] = target if target
102
- data[:source] = self.cdn_url_with_operations if with_operations
103
- data[:source] = self.cdn_url_without_operations unless with_operations
104
-
105
- @api.post "/files/", data
106
- end
107
-
108
- # Create a copy of the file in a default storage
109
- def internal_copy(options={})
110
- data = {
111
- source: cdn_url(!options.fetch(:strip_operations){ false }),
112
- store: options.fetch(:store){ nil }
113
- }.reject{|_,v| v.nil?}
114
-
115
- @api.post "/files/", data
116
- end
117
-
118
- # Copy file to a custom storage
119
- def external_copy(target, options={})
120
- data = {
121
- source: cdn_url(!options.fetch(:strip_operations){ false }),
122
- target: target,
123
- pattern: options.fetch(:pattern){ nil },
124
- make_public: options.fetch(:make_public){ nil },
125
- }.reject{|_,v| v.nil?}
126
-
127
- @api.post "/files/", data
128
- end
129
-
130
-
131
- # Datetime methods
132
- # practicly try and parse the string to date objects
133
- ["original", "uploaded", "stored", "removed"].each do |dt|
134
- define_method "datetime_#{dt}" do
135
- date = @table["datetime_#{dt}".to_sym]
136
- if date.is_a?(String)
137
- begin
138
- parsed = DateTime.parse(date)
139
- self.send("datetime_#{dt}=", parsed)
140
- parsed
141
- rescue Exception => e
142
- date
143
- end
144
- else
145
- date
146
- end
147
- end
148
- end
149
- alias_method :datetime_deleted, :datetime_removed
150
-
151
-
152
- private
153
- def set_data data
154
- if data.respond_to? :each
155
- data.each do |key, value|
156
- self.send "#{key}=", value
157
- end
158
- else
159
- self.data = data
160
- end
161
- end
162
- end
163
- end
164
- end
@@ -1,41 +0,0 @@
1
- require 'ostruct'
2
-
3
- module Uploadcare
4
- class Api
5
- class FileList < OpenStruct
6
- def initialize api, data
7
- @api = api
8
-
9
- unless data["results"].nil?
10
- data["results"].map! do |file|
11
- Uploadcare::Api::File.new @api, file["uuid"], file
12
- end
13
- end
14
-
15
- super data
16
- end
17
-
18
- # Array-like behavior
19
- def [] index
20
- results[index] if defined?(:results)
21
- end
22
-
23
- def to_a
24
- results if defined?(:results)
25
- end
26
-
27
- # List navigation
28
- def next_page
29
- @api.file_list(page+1) unless send(:next).nil?
30
- end
31
-
32
- def go_to index
33
- @api.file_list(index) unless index > pages
34
- end
35
-
36
- def previous_page
37
- @api.file_list(page-1) unless previous.nil?
38
- end
39
- end
40
- end
41
- end
@@ -1,115 +0,0 @@
1
- require 'ostruct'
2
-
3
- module Uploadcare
4
- class Api
5
- class Group < OpenStruct
6
- def initialize api, uuid_or_cdn_url, data=nil
7
- result = Uploadcare::Parser.parse_group_string(uuid_or_cdn_url)
8
-
9
- @api = api
10
- group = {uuid: result.uuid, files_count: result.count}
11
- super group
12
-
13
- # if data is suplide - just pass it to builder.
14
- set_data(data) if data
15
- end
16
-
17
- def cdn_url
18
- @api.options[:static_url_base] + "/#{uuid}/"
19
- end
20
-
21
- def file_cdn_url index=0
22
- raise ArgumentError.new "The index was given is greater than files count in group." if index + 1 > files_count
23
- cdn_url + "nth/#{index}/"
24
- end
25
-
26
- # Loading logic
27
- def is_loaded?
28
- !send(:files).nil?
29
- end
30
- alias_method :loaded?, :is_loaded?
31
-
32
- def load_data
33
- unless is_loaded?
34
- load_data!
35
- end
36
- self
37
- end
38
- alias_method :load, :load_data
39
-
40
- def load_data!
41
- data = @api.get "/groups/#{uuid}/"
42
- set_data data
43
-
44
- self
45
- end
46
- alias_method :load!, :load_data!
47
-
48
- # Store group (and all files in group)
49
- def store
50
- unless is_stored?
51
- store!
52
- end
53
- self
54
- end
55
-
56
- def store!
57
- data = @api.put "/groups/#{uuid}/storage/"
58
- set_data(data)
59
- self
60
- end
61
-
62
- def is_stored?
63
- return nil unless is_loaded?
64
- !send(:datetime_stored).nil?
65
- end
66
- alias_method :stored?, :is_stored?
67
-
68
-
69
- ["created", "stored"].each do |dt|
70
- define_method "datetime_#{dt}" do
71
- date = @table["datetime_#{dt}".to_sym]
72
- if date.is_a?(String)
73
- begin
74
- parsed = DateTime.parse(date)
75
- self.send("datetime_#{dt}=", parsed)
76
- parsed
77
- rescue Exception => e
78
- date
79
- end
80
- else
81
- date
82
- end
83
- end
84
- end
85
-
86
-
87
- private
88
- def set_data data
89
- data = map_files(data) unless data["files"].nil?
90
-
91
- if data.respond_to? (:each)
92
- data.each do |k, v|
93
- self.send "#{k}=", v
94
- end
95
- end
96
-
97
- @is_loaded = true
98
- end
99
-
100
- # map files (hashes basicly) to
101
- # actual File objects
102
- def map_files data
103
- data["files"].map! do |file|
104
- unless file.nil?
105
- Uploadcare::Api::File.new(@api, file["uuid"], file)
106
- else
107
- file
108
- end
109
- end
110
-
111
- data
112
- end
113
- end
114
- end
115
- end