putio-ruby 0.1.1 → 0.2.1

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 CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- ODNiNWNkNjIxZWI1NmY3ZWEyMmQzNDhlNDVjNGMwNmZkNDFmMjdjMA==
4
+ MDNmOGQ5YjQwNzAwNTAxOTg0OWY0OGE3NTE2NWViNGNlNTcyYzg5MA==
5
5
  data.tar.gz: !binary |-
6
- MTI4MDUxOTgxN2JkYTFmOTE0ODlkNDY5NGJjZWNhYWI2ODIwODUzMw==
6
+ M2ZmM2Q2ZmU5MzVmMGQ1MDE5ODMzMGM1ZmQxMGM4ZGQ4MDQ1NTdmNA==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- OTRhZDE3MWY3YTJhMmRmMjU4NWMyODBhNjkxNjUyYWRiMjk4NTU1YmU3NWRm
10
- OTBjYzA0ZmVlYzUwZTcxMDJkMzZkYmM5Y2U1YTlhNTBlMTA3OTRlMTA0Yjgx
11
- YjFlYTc1YjJjMDU0ZDJhODk1NjNjMDVlOTE5YTAyM2ZiOTM5NmU=
9
+ YjdhZTZjZThkYmNhNmMxMmNhZjI2MWYyMzc2NzI2ZmY4ZGU4Y2FjYTc0MDM2
10
+ MWFjYTg2MTJiMzkwNWUxOTlmOWYwMGM5MGZmNjRmNTVkNDIxZTJiZTcyMjRk
11
+ MWEzMzk2ODI2MGViOGQ0NzZjYTg2MzZmNzFiMzc2OGZjZjMyM2M=
12
12
  data.tar.gz: !binary |-
13
- MzgzNjMyMzUyYTNkOGNlYWUwMTljZDE4ODlhYjJhOWU3ZGM0ZDBhNzE3NjU4
14
- NTM1Mjg4Y2Y0MGJmNDAyOTQyODVkOTFjYmUxYmU0YmE2MmQ2ZjM3M2M0ZDM3
15
- ODlhZTE5NzcwYzU3MTc0YWZhYWZhZDJiNzdiZTllYjkxZjliNWM=
13
+ ZWQxYmFjNDNkNjcyN2U2ZmU5Mjg4YWM0NDBmNThlYjEyMjU1ZDljM2NkYzQy
14
+ NzdjNjdlY2NiNWM5YjY3MjgzYjdjOGVmMTU3ODc1ZGQwNzZiN2JlMTkyZWJl
15
+ MWYyZmYxMDVkZjk4M2EzMmRjMmRiNGNmMjlmMzdhYzljY2Y3M2M=
data/README.md CHANGED
@@ -12,7 +12,7 @@ putio-ruby is a simple gem for communicating with the Put.io REST API. Currently
12
12
 
13
13
  Add the gem to your Gemfile:
14
14
 
15
- ```
15
+ ```ruby
16
16
  gem 'putio-ruby'
17
17
  ```
18
18
 
@@ -28,15 +28,21 @@ Or install it yourself as:
28
28
 
29
29
  First configure the gem to use your oauth token (See [instructions](https://put.io/v2/docs/gettingstarted.html#sign-up) for generating a token)
30
30
 
31
- Putio.configure :oauth_token => YOUR_OAUTH_TOKEN
32
-
31
+ ```ruby
32
+ Putio.configure do |config|
33
+ oauth_token = "YOUR_OAUTH_TOKEN"
34
+ end
35
+ ```
36
+
33
37
  Then use it to query Put.io
34
38
 
35
- Putio::File.list
36
- Putio::File.get(1234)
37
- Putio::File.get(1234).delete
38
- Putio::File.get(1234).download_url
39
-
40
- Putio::Transfer.list
41
- Putio::Transfer.get(1234)
42
- Putio::Transfer.add("http://some_url.com")
39
+ ```ruby
40
+ Putio::File.list
41
+ file = Putio::File.get(1234)
42
+ file.download_url
43
+ file.delete
44
+
45
+ Putio::Transfer.list
46
+ Putio::Transfer.get(1234)
47
+ Putio::Transfer.add("http://some_url.com")
48
+ ```
@@ -1,14 +1,10 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
3
  require "bundler/setup"
4
- require "putio/ruby"
4
+ require "putio-ruby"
5
5
 
6
6
  # You can add fixtures and/or initialization code here to make experimenting
7
7
  # with your gem easier. You can also use a different console, if you like.
8
8
 
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start
9
+ require "pry"
10
+ Pry.start
@@ -2,12 +2,14 @@ require "putio-ruby/version"
2
2
 
3
3
  require "multi_json"
4
4
  require "faraday"
5
- require "active_support"
6
- require "active_support/inflector"
7
- require "active_support/core_ext/hash"
5
+ require "faraday_middleware"
6
+ require "virtus"
8
7
 
9
- require "putio-ruby/middleware/parse"
8
+ require "putio-ruby/configuration"
9
+
10
+ require "putio-ruby/middleware/parse_root"
10
11
  require "putio-ruby/middleware/oauth_token"
12
+ require "putio-ruby/middleware/error_handler"
11
13
 
12
14
  require "putio-ruby/api/client"
13
15
  require "putio-ruby/api/object"
@@ -15,15 +17,23 @@ require "putio-ruby/api/object"
15
17
  require "putio-ruby/file"
16
18
  require "putio-ruby/transfer"
17
19
 
18
- require "putio-ruby/errors"
20
+ require "putio-ruby/error"
19
21
 
20
22
  module Putio
21
- def self.configure(args)
22
- @oauth_token = args[:oauth_token]
23
+ class << self
24
+ attr_writer :configuration
25
+ end
26
+
27
+ def self.configuration
28
+ @configuration ||= Configuration.new
29
+ end
30
+
31
+ def self.reset
32
+ @configuration = Configuration.new
23
33
  end
24
34
 
25
- def self.oauth_token
26
- @oauth_token
35
+ def self.configure
36
+ yield(configuration)
27
37
  end
28
38
  end
29
39
 
@@ -2,13 +2,17 @@ module Putio
2
2
  module Api
3
3
  module Client
4
4
  def client
5
- @client ||= Faraday.new :url => "https://api.put.io/v2/" do |connection|
5
+ Faraday.new :url => "https://api.put.io/v2/" do |connection|
6
6
  # Request
7
- connection.use Putio::Middleware::OauthToken
8
7
  connection.request :url_encoded
8
+ connection.use Putio::Middleware::OauthToken
9
9
 
10
10
  # Response
11
- connection.use Putio::Middleware::Parse
11
+ connection.use Putio::Middleware::ParseRoot
12
+ connection.use Putio::Middleware::ErrorHandler
13
+ connection.use FaradayMiddleware::ParseJson, :content_type => /\bjson$/
14
+
15
+ # Adapter
12
16
  connection.adapter :net_http
13
17
  end
14
18
  end
@@ -1,45 +1,12 @@
1
1
  module Putio
2
2
  module Api
3
3
  class Object
4
+ include Virtus.model
4
5
  extend Putio::Api::Client
5
6
 
6
- def self.plural_name
7
- singular_name.pluralize
8
- end
9
-
10
- def self.singular_name
11
- self.name.demodulize.underscore.downcase
12
- end
13
-
14
- def self.parse_collection(hash)
15
- objects = hash[plural_name.to_sym]
16
- objects.map do |obj|
17
- instantiate_object obj
18
- end
19
- end
20
-
21
- def self.parse_object(hash)
22
- object = hash[singular_name.to_sym]
23
- instantiate_object object
24
- end
25
-
26
- def self.instantiate_object(hash)
27
- obj = self.new
28
- hash.each do |k,v|
29
- obj.set_attribute(k.to_s, v)
30
- end
31
- obj
32
- end
33
-
34
7
  def client
35
8
  self.class.client
36
9
  end
37
-
38
- def set_attribute(attr, value)
39
- return unless attr.present?
40
- self.singleton_class.instance_eval { attr_reader "#{attr}".to_sym }
41
- self.instance_variable_set("@#{attr}", value)
42
- end
43
10
  end
44
11
  end
45
12
  end
@@ -0,0 +1,5 @@
1
+ module Putio
2
+ class Configuration
3
+ attr_accessor :oauth_token
4
+ end
5
+ end
@@ -0,0 +1,62 @@
1
+ module Putio
2
+ class Error < StandardError
3
+ def self.from_env(env)
4
+ status = env.status
5
+
6
+ if klass = case status
7
+ when 400..499 then Putio::BadRequest
8
+ when 500..599 then Putio::ServerError
9
+ end
10
+ klass.new(env)
11
+ end
12
+ end
13
+
14
+ def initialize(env=nil)
15
+ @env = env
16
+ super(build_error_message)
17
+ end
18
+
19
+ def response_error
20
+ if response_body && error_type && error_message
21
+ "#{error_type}: #{error_message}"
22
+ elsif response_body && error_message
23
+ error_message
24
+ else
25
+ response_body
26
+ end
27
+ end
28
+
29
+ def build_error_message
30
+ return nil if @env.nil?
31
+
32
+ message = "#{@env.method.to_s.upcase} "
33
+ message << "#{@env.status} - #{@env.url}\n"
34
+ message << "#{response_error}" unless response_error.nil?
35
+ message
36
+ end
37
+
38
+ def response_headers
39
+ @env.response_headers
40
+ end
41
+
42
+ def response_status
43
+ @env.status
44
+ end
45
+
46
+ def response_body
47
+ @env.body
48
+ end
49
+
50
+ def error_type
51
+ @env.body["error_type"]
52
+ end
53
+
54
+ def error_message
55
+ @env.body["error_message"]
56
+ end
57
+ end
58
+
59
+ class BadRequest < Error; end
60
+ class ServerError < Error; end
61
+ class ApplicationCredentialsRequired < StandardError; end
62
+ end
@@ -1,18 +1,30 @@
1
1
  module Putio
2
2
  class File < Putio::Api::Object
3
+ attribute :content_type, String
4
+ attribute :crc32, String
5
+ attribute :created_at, DateTime
6
+ attribute :first_accessed_at, DateTime
7
+ attribute :icon, String
8
+ attribute :id, Integer
9
+ attribute :is_mp4_available, Boolean
10
+ attribute :is_shared, Boolean
11
+ attribute :name, String
12
+ attribute :opensubtitles_hash, String
13
+ attribute :parent_id, Integer
14
+ attribute :screenshot, String
15
+ attribute :size, Integer
16
+
3
17
  def self.list(parent_id=nil)
4
18
  res = client.get "files/list", ( parent_id ? {:parent_id => parent_id} : nil )
5
- parse_collection res.body if res.success?
19
+ res.body.map { |f| self.new f }
6
20
  end
7
21
 
8
- def self.get(id)
9
- res = client.get "files/#{id}"
10
- parse_object res.body if res.success?
22
+ def self.file(id)
23
+ self.new client.get("files/#{id}").body
11
24
  end
12
25
 
13
26
  def download_url
14
- res = client.get "files/#{id}/download"
15
- res.headers[:location] if res.success?
27
+ client.get("files/#{id}/download").env.response_headers["location"]
16
28
  end
17
29
 
18
30
  def delete
@@ -0,0 +1,9 @@
1
+ module Putio
2
+ module Middleware
3
+ class ErrorHandler < Faraday::Response::Middleware
4
+ def on_complete(env)
5
+ raise Putio::Error.from_env(env) if env.status >= 400
6
+ end
7
+ end
8
+ end
9
+ end
@@ -2,8 +2,8 @@ module Putio
2
2
  module Middleware
3
3
  class OauthToken < Faraday::Response::Middleware
4
4
  def call(env)
5
- raise Putio::Errors::AuthorizationError, "No OAuth token provided" unless Putio.oauth_token
6
- oauth_string = "oauth_token=#{Putio.oauth_token}"
5
+ raise Putio::ApplicationCredentialsRequired, "No OAuth token provided" unless Putio.configuration.oauth_token
6
+ oauth_string = "oauth_token=#{Putio.configuration.oauth_token}"
7
7
  query = env[:url].query
8
8
  env[:url].query = query ? "#{query}&#{oauth_string}" : oauth_string
9
9
  @app.call(env)
@@ -0,0 +1,15 @@
1
+ module Putio
2
+ module Middleware
3
+ class ParseRoot < Faraday::Response::Middleware
4
+ def on_complete(env)
5
+ plural = env.url.to_s.match(/api\.put\.io\/v2\/(\w+)\//)[1]
6
+ singular = plural[0..-2]
7
+ if env[:body][plural]
8
+ env[:body] = env[:body][plural]
9
+ elsif env[:body][singular]
10
+ env[:body] = env[:body][singular]
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -1,22 +1,48 @@
1
1
  module Putio
2
2
  class Transfer < Putio::Api::Object
3
+ attribute :callback_url, String
4
+ attribute :created_at, DateTime
5
+ attribute :current_ratio, Float
6
+ attribute :down_speed, Integer
7
+ attribute :downloaded, Integer
8
+ attribute :error_message, String
9
+ attribute :estimated_time, Integer
10
+ attribute :extract, Boolean
11
+ attribute :file_id, Integer
12
+ attribute :finished_at, DateTime
13
+ attribute :id, Integer
14
+ attribute :is_private, Boolean
15
+ attribute :name, String
16
+ attribute :peers_connected, Integer
17
+ attribute :peers_sending_to_us, Integer
18
+ attribute :percent_done, Integer
19
+ attribute :save_parent_id, Integer
20
+ attribute :seconds_seeding, Integer
21
+ attribute :size, Integer
22
+ attribute :source, String
23
+ attribute :status, String
24
+ attribute :status_message, String
25
+ attribute :subscription_id, Integer
26
+ attribute :tracker_message, String
27
+ attribute :type, String
28
+ attribute :up_speed, Integer
29
+ attribute :uploaded, Integer
30
+
3
31
  def self.list
4
- res = client.get "transfers/list"
5
- parse_collection res.body if res.success?
32
+ res = client.get("transfers/list")
33
+ res.body.map { |t| self.new t }
6
34
  end
7
35
 
8
- def self.get(id)
9
- res = client.get "transfers/#{id}"
10
- parse_object res.body if res.success?
36
+ def self.transfer(id)
37
+ self.new client.get("transfers/#{id}").body
11
38
  end
12
39
 
13
40
  def self.add(url)
14
- res = client.post "transfers/add", :url => url
15
- parse_object res.body
41
+ self.new client.post("transfers/add", :url => url).body
16
42
  end
17
43
 
18
44
  def fetch
19
- self.class.find(id)
45
+ self.class.transfer(id)
20
46
  end
21
47
  end
22
48
  end
@@ -1,3 +1,3 @@
1
1
  module Putio
2
- VERSION = "0.1.1"
2
+ VERSION = "0.2.1"
3
3
  end
@@ -22,9 +22,11 @@ Gem::Specification.new do |spec|
22
22
  spec.add_development_dependency "rake", "~> 10.0"
23
23
  spec.add_development_dependency "pry", "~> 0.10"
24
24
  spec.add_development_dependency "rspec", "~> 3.0"
25
+ spec.add_development_dependency "webmock", "~> 1.0"
25
26
  spec.add_development_dependency "codeclimate-test-reporter", "~> 0.4"
26
27
 
27
28
  spec.add_runtime_dependency "faraday", "~> 0.9"
28
- spec.add_runtime_dependency "activesupport", ">= 3.0.0", "<= 4.3.0"
29
+ spec.add_runtime_dependency "faraday_middleware", "~> 0.10"
29
30
  spec.add_runtime_dependency "multi_json", "~> 1.7"
31
+ spec.add_runtime_dependency "virtus", "~> 1.0"
30
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: putio-ruby
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Brandon Bloxsom
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2015-08-25 00:00:00.000000000 Z
11
+ date: 2015-09-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -66,6 +66,20 @@ dependencies:
66
66
  - - ~>
67
67
  - !ruby/object:Gem::Version
68
68
  version: '3.0'
69
+ - !ruby/object:Gem::Dependency
70
+ name: webmock
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - ~>
74
+ - !ruby/object:Gem::Version
75
+ version: '1.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - ~>
81
+ - !ruby/object:Gem::Version
82
+ version: '1.0'
69
83
  - !ruby/object:Gem::Dependency
70
84
  name: codeclimate-test-reporter
71
85
  requirement: !ruby/object:Gem::Requirement
@@ -95,25 +109,19 @@ dependencies:
95
109
  - !ruby/object:Gem::Version
96
110
  version: '0.9'
97
111
  - !ruby/object:Gem::Dependency
98
- name: activesupport
112
+ name: faraday_middleware
99
113
  requirement: !ruby/object:Gem::Requirement
100
114
  requirements:
101
- - - ! '>='
102
- - !ruby/object:Gem::Version
103
- version: 3.0.0
104
- - - <=
115
+ - - ~>
105
116
  - !ruby/object:Gem::Version
106
- version: 4.3.0
117
+ version: '0.10'
107
118
  type: :runtime
108
119
  prerelease: false
109
120
  version_requirements: !ruby/object:Gem::Requirement
110
121
  requirements:
111
- - - ! '>='
112
- - !ruby/object:Gem::Version
113
- version: 3.0.0
114
- - - <=
122
+ - - ~>
115
123
  - !ruby/object:Gem::Version
116
- version: 4.3.0
124
+ version: '0.10'
117
125
  - !ruby/object:Gem::Dependency
118
126
  name: multi_json
119
127
  requirement: !ruby/object:Gem::Requirement
@@ -128,6 +136,20 @@ dependencies:
128
136
  - - ~>
129
137
  - !ruby/object:Gem::Version
130
138
  version: '1.7'
139
+ - !ruby/object:Gem::Dependency
140
+ name: virtus
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ~>
144
+ - !ruby/object:Gem::Version
145
+ version: '1.0'
146
+ type: :runtime
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ~>
151
+ - !ruby/object:Gem::Version
152
+ version: '1.0'
131
153
  description: A simple library for communicating with the Put.io REST API
132
154
  email:
133
155
  - bloxsom@umich.edu
@@ -146,10 +168,12 @@ files:
146
168
  - lib/putio-ruby.rb
147
169
  - lib/putio-ruby/api/client.rb
148
170
  - lib/putio-ruby/api/object.rb
149
- - lib/putio-ruby/errors.rb
171
+ - lib/putio-ruby/configuration.rb
172
+ - lib/putio-ruby/error.rb
150
173
  - lib/putio-ruby/file.rb
174
+ - lib/putio-ruby/middleware/error_handler.rb
151
175
  - lib/putio-ruby/middleware/oauth_token.rb
152
- - lib/putio-ruby/middleware/parse.rb
176
+ - lib/putio-ruby/middleware/parse_root.rb
153
177
  - lib/putio-ruby/transfer.rb
154
178
  - lib/putio-ruby/version.rb
155
179
  - putio-ruby.gemspec
@@ -1,6 +0,0 @@
1
- module Putio
2
- module Errors
3
- class AuthorizationError < StandardError
4
- end
5
- end
6
- end
@@ -1,17 +0,0 @@
1
- module Putio
2
- module Middleware
3
- class Parse < Faraday::Response::Middleware
4
- def parse(body)
5
- begin
6
- return MultiJson.load(body, :symbolize_keys => true)
7
- rescue MultiJson::ParseError
8
- return body
9
- end
10
- end
11
-
12
- def on_complete(env)
13
- env[:body] = parse(env[:body])
14
- end
15
- end
16
- end
17
- end