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,31 +0,0 @@
1
- require 'ostruct'
2
-
3
- module Uploadcare
4
- class Api
5
- class GroupList < OpenStruct
6
- def initialize api, data
7
- @api = api
8
-
9
- unless data["results"].nil?
10
- data["results"].map! do |group|
11
- Uploadcare::Api::Group.new @api, group["id"], group
12
- end
13
- end
14
-
15
- super data
16
- end
17
-
18
- def [] index
19
- results[index] if defined?(:results)
20
- end
21
-
22
- def to_a
23
- results if defined?(:results)
24
- end
25
-
26
- def groups
27
- results if defined?(:results)
28
- end
29
- end
30
- end
31
- end
@@ -1,13 +0,0 @@
1
- require 'ostruct'
2
-
3
- module Uploadcare
4
- class Api
5
- class Project < OpenStruct
6
- def initialize api
7
- @api = api
8
- data = @api.get "/project/"
9
- super data
10
- end
11
- end
12
- end
13
- end
@@ -1,31 +0,0 @@
1
- module Uploadcare
2
- module Connections
3
- module Auth
4
-
5
- def self.strategy(options)
6
- auth_scheme = options.fetch(:auth_scheme)
7
-
8
- unless [:simple, :secure].include?(auth_scheme)
9
- raise ArgumentError, "Unknown auth_scheme: '#{auth_scheme}'"
10
- end
11
-
12
- klass = const_get(auth_scheme.capitalize)
13
- klass.new(options)
14
- end
15
-
16
- class Base
17
- attr_reader :public_key, :private_key
18
-
19
- def initialize(options)
20
- @public_key = options.fetch(:public_key)
21
- @private_key = options.fetch(:private_key)
22
- end
23
-
24
- def apply(env)
25
- raise NotImplementedError
26
- end
27
- end
28
-
29
- end
30
- end
31
- end
@@ -1,43 +0,0 @@
1
- require 'time'
2
-
3
- module Uploadcare
4
- module Connections
5
- module Auth
6
- class Secure < Base
7
-
8
- def apply(env)
9
- date = Time.now.utc
10
- headers(env, date).each{|k, v| env.request_headers[k] = v}
11
- env
12
- end
13
-
14
- private
15
-
16
- def headers(env, date)
17
- {
18
- "Date" => date.rfc2822,
19
- "Authorization" => "Uploadcare #{public_key}:#{signature(env, date)}"
20
- }
21
- end
22
-
23
- def signature(env, date)
24
- sign_string = sign_string(env, date)
25
- digest = OpenSSL::Digest.new('sha1')
26
-
27
- OpenSSL::HMAC.hexdigest(digest, private_key, sign_string)
28
- end
29
-
30
- def sign_string(env, date)
31
- verb = env.method.upcase.to_s
32
- uri = env.url.request_uri
33
- date_header = date.rfc2822
34
- content_type = env.request_headers['Content-Type']
35
- content_md5 = OpenSSL::Digest.new('md5').hexdigest(env.body || "")
36
-
37
- [verb, content_md5, content_type, date_header, uri].join("\n")
38
- end
39
-
40
- end
41
- end
42
- end
43
- end
@@ -1,16 +0,0 @@
1
- module Uploadcare
2
- module Connections
3
- module Auth
4
- class Simple < Base
5
-
6
- def apply(env)
7
- auth_string = "Uploadcare.Simple #{public_key}:#{private_key}"
8
- env.request_headers['Authorization'] = auth_string
9
-
10
- env
11
- end
12
-
13
- end
14
- end
15
- end
16
- end
@@ -1,32 +0,0 @@
1
- require 'faraday'
2
- require "faraday_middleware"
3
-
4
- module Uploadcare
5
- module Connections
6
- class ApiConnection < Faraday::Connection
7
-
8
- def initialize options
9
- super options[:api_url_base] do |frd|
10
- auth_strategy = Auth.strategy(options)
11
-
12
- frd.headers['Accept'] = "application/vnd.uploadcare-v#{options[:api_version]}+json"
13
- frd.headers['User-Agent'] = UserAgent.new.call(options)
14
-
15
- # order of middleware matters!
16
-
17
- # url_encoded changes request body and thus should be before
18
- # uploadcare_auth which uses it to sign requests when secure auth
19
- # strategy is being used
20
- frd.request :url_encoded
21
- frd.request :uploadcare_auth, auth_strategy
22
-
23
- frd.response :uploadcare_raise_error
24
- frd.response :follow_redirects, limit: 3, callback: lambda{|old, env| auth_strategy.apply(env) }
25
- frd.response :uploadcare_parse_json
26
-
27
- frd.adapter :net_http # actually, default adapter, just to be clear
28
- end
29
- end
30
- end
31
- end
32
- end
@@ -1,21 +0,0 @@
1
- require "faraday"
2
-
3
- module Uploadcare
4
- module Connections
5
- class UploadConnection < Faraday::Connection
6
- def initialize options
7
- ca_path = '/etc/ssl/certs' if File.exists?('/etc/ssl/certs')
8
-
9
- super ssl: { ca_path: ca_path }, url: options[:upload_url_base] do |frd|
10
- frd.request :multipart
11
- frd.request :url_encoded
12
- frd.adapter :net_http
13
- frd.headers['User-Agent'] = UserAgent.new.call(options)
14
-
15
- frd.response :uploadcare_raise_error
16
- frd.response :uploadcare_parse_json
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,24 +0,0 @@
1
- require 'faraday'
2
-
3
- module Uploadcare
4
- module Connections
5
- module Request
6
- class Auth < Faraday::Middleware
7
- attr_reader :auth_strategy
8
-
9
- def initialize(app=nil, auth_strategy)
10
- @auth_strategy = auth_strategy
11
- super(app)
12
- end
13
-
14
- def call(env)
15
- auth_strategy.apply(env)
16
- @app.call(env)
17
- end
18
-
19
- end
20
- end
21
- end
22
- end
23
-
24
- Faraday::Request.register_middleware uploadcare_auth: Uploadcare::Connections::Request::Auth
@@ -1,33 +0,0 @@
1
- require 'faraday'
2
- require 'json'
3
-
4
- module Uploadcare
5
- module Connections
6
- module Response
7
- class ParseJson < Faraday::Response::Middleware
8
- WHITESPACE_REGEX = /\A^\s*$\z/
9
-
10
- ERROR_CODES = [400, 401, 403, 404, 406, 408, 422, 429, 500, 502, 503, 504]
11
-
12
- def parse(body)
13
- case body
14
- when WHITESPACE_REGEX, nil
15
- nil
16
- else
17
- JSON.parse(body)
18
- end
19
- end
20
-
21
- def on_complete(response)
22
- response[:body] = parse(response[:body]) if respond_to?(:parse) && !ERROR_CODES.include?(response[:status])
23
- end
24
-
25
- def unparsable_status_codes
26
- [204, 301, 302, 304]
27
- end
28
- end
29
- end
30
- end
31
- end
32
-
33
- Faraday::Response.register_middleware :uploadcare_parse_json => Uploadcare::Connections::Response::ParseJson
@@ -1,21 +0,0 @@
1
- require 'faraday'
2
-
3
- module Uploadcare
4
- module Connections
5
- module Response
6
- class RaiseError < Faraday::Response::Middleware
7
- def on_complete(response)
8
- @error_codes = Uploadcare::Error.errors.keys
9
- @status = response[:status]
10
-
11
- if @error_codes.include?(@status)
12
- error = Uploadcare::Error.errors[@status].new
13
- fail(error)
14
- end
15
- end
16
- end
17
- end
18
- end
19
- end
20
-
21
- Faraday::Response.register_middleware :uploadcare_raise_error => Uploadcare::Connections::Response::RaiseError
@@ -1,71 +0,0 @@
1
- require 'ostruct'
2
-
3
- module Uploadcare
4
- module Parser
5
-
6
- META_URL = /
7
- (?<uuid>[a-f0-9]{8}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{4}-[a-f0-9]{12} # base uuid
8
- ~?(?<count>\d+)?) # optional count
9
- (?:\/-\/(?<operations>.*?))?\/?$ # optional operations
10
- /ix
11
-
12
- def self.parse_file_string string
13
- result = Uploadcare::Parser.parse(string)
14
-
15
- unless result.is_a?(Uploadcare::Parser::File)
16
- msg = "invalid CDN URL or UUID was given for file: #{uuid_or_cdn_url}."
17
- if result.is_a?(Uploadcare::Parser::Group)
18
- msg = msg + "\n Group UUID was given. Try call @api.group if it is what you intended."
19
- end
20
- raise msg
21
- end
22
-
23
- result
24
- end
25
-
26
-
27
- def self.parse_group_string string
28
- result = Uploadcare::Parser.parse(string)
29
-
30
- unless result.is_a?(Uploadcare::Parser::Group)
31
- msg = "invalid CDN URL or UUID was given for group: #{uuid_or_cdn_url}."
32
- if result.is_a?(Uploadcare::Parser::File)
33
- msg = msg + "\n File UUID was given. Try call @api.file if it is what you intended."
34
- end
35
- raise msg
36
- end
37
-
38
- result
39
- end
40
-
41
- def self.parse string
42
- matched = META_URL.match(string)
43
-
44
- # just a simple hash - easy to pass next
45
- captured = Hash[ matched.names.zip( matched.captures ) ]
46
-
47
- # raise an error if no uuid was given in the sting
48
- raise "Invalid UUID or url was given" if captured["uuid"].nil?
49
-
50
- # operations sring to array of operations
51
- if captured["operations"]
52
- captured["operations"] = captured["operations"].split("/-/")
53
- else
54
- captured["operations"] = []
55
- end
56
-
57
- # if count was given - it is a group
58
- if captured["count"]
59
- obj = Group.new captured
60
- else
61
- obj = File.new captured
62
- end
63
- end
64
-
65
- class File < OpenStruct
66
- end
67
-
68
- class Group < OpenStruct
69
- end
70
- end
71
- end
@@ -1,44 +0,0 @@
1
- module Uploadcare
2
- # Determines User-Agent string either taking it from settings or building
3
- # in accordance with common Uploadcare format
4
- #
5
- class UserAgent
6
- # @param options [Hash]
7
- # @option options [String] :user_agent (nil)
8
- # @option options [String] :public_key (nil)
9
- # @option options [String] :user_agent_environment (nil)
10
- # @return [String]
11
- #
12
- def call(options)
13
- return options[:user_agent].to_s if options[:user_agent]
14
-
15
- user_agent_string(
16
- options.fetch(:public_key, nil),
17
- options.fetch(:user_agent_environment, {})
18
- )
19
- end
20
-
21
- private
22
-
23
- def user_agent_string(public_key, extensions)
24
- format(
25
- '%<library>s/%<pubkey>s (%<environment>s)',
26
- library: versioned('UploadcareRuby', Uploadcare::VERSION),
27
- pubkey: public_key,
28
- environment: environment_string(extensions)
29
- )
30
- end
31
-
32
- def environment_string(extensions)
33
- [
34
- versioned('Ruby', Gem.ruby_version),
35
- versioned(extensions[:framework_name], extensions[:framework_version]),
36
- versioned(extensions[:extension_name], extensions[:extension_version])
37
- ].compact.join('; ')
38
- end
39
-
40
- def versioned(name, version = nil)
41
- name ? [name, version].compact.join('/') : nil
42
- end
43
- end
44
- end
@@ -1,3 +0,0 @@
1
- module Uploadcare
2
- VERSION = "1.2.1"
3
- end
@@ -1,25 +0,0 @@
1
- require 'spec_helper'
2
- require 'uri'
3
- require 'socket'
4
-
5
- describe Uploadcare::Api do
6
- before :each do
7
- @api = Uploadcare::Api.new(CONFIG)
8
- end
9
-
10
- it "should initialize api" do
11
- @api.should be_an_instance_of(Uploadcare::Api)
12
- end
13
-
14
- it 'should respond to request methods' do
15
- @api.should respond_to :request
16
- @api.should respond_to :get
17
- @api.should respond_to :post
18
- @api.should respond_to :put
19
- @api.should respond_to :delete
20
- end
21
-
22
- it 'should perform custom requests' do
23
- expect { @api.request }.to_not raise_error
24
- end
25
- end
@@ -1,64 +0,0 @@
1
- require 'spec_helper'
2
- require 'uri'
3
- require 'socket'
4
-
5
- describe Uploadcare::Api::File do
6
- before :all do
7
- @api = API
8
- @list = @api.file_list 1
9
- end
10
-
11
- it "should return file list" do
12
- @list.should be_kind_of(Uploadcare::Api::FileList)
13
- end
14
-
15
- it "should respont to results method" do
16
- @list.should respond_to :results
17
- end
18
-
19
- it "results should be an array" do
20
- @list.results.should be_kind_of(Array)
21
- end
22
-
23
- it "resulst should be UC files" do
24
- @list.results.each do |file|
25
- file.should be_kind_of(Uploadcare::Api::File)
26
- end
27
- end
28
-
29
- it "results should be not only files, but loaded files" do
30
- @list.results.each do |file|
31
- file.is_loaded?.should be true
32
- end
33
- end
34
-
35
- it "should load next page" do
36
- next_page = @list.next_page
37
- next_page.should be_kind_of(Uploadcare::Api::FileList)
38
- end
39
-
40
- it "should load prev page" do
41
- list = @api.file_list 3
42
- prev_page = list.previous_page
43
- prev_page.should be_kind_of(Uploadcare::Api::FileList)
44
- end
45
-
46
- it "should load custom page" do
47
- page = @list.go_to(@list.pages - 1)
48
- page.should be_kind_of(Uploadcare::Api::FileList)
49
- end
50
-
51
- it "should not load next page if there isn't one" do
52
- page= @list.go_to @list.pages
53
- page.next_page.should be_nil
54
- end
55
-
56
- it "should not load prev page if there isn't one" do
57
- @list.previous_page.should be_nil
58
- end
59
-
60
- it "should not load custom page with index more than there is actually page in project" do
61
- page = @list.go_to @list.pages + 3
62
- page.should be_nil
63
- end
64
- end