yt 0.4.10 → 0.5.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/HISTORY.md +10 -0
- data/README.md +7 -3
- data/TODO.md +6 -2
- data/lib/yt/actions/delete.rb +1 -1
- data/lib/yt/actions/delete_all.rb +1 -1
- data/lib/yt/actions/insert.rb +1 -1
- data/lib/yt/actions/list.rb +8 -2
- data/lib/yt/actions/update.rb +1 -1
- data/lib/yt/associations.rb +1 -0
- data/lib/yt/associations/details_sets.rb +1 -1
- data/lib/yt/associations/ids.rb +20 -0
- data/lib/yt/associations/snippets.rb +1 -1
- data/lib/yt/associations/subscriptions.rb +2 -2
- data/lib/yt/associations/user_infos.rb +1 -1
- data/lib/yt/collections/base.rb +1 -0
- data/lib/yt/collections/details_sets.rb +0 -1
- data/lib/yt/collections/ids.rb +22 -0
- data/lib/yt/collections/playlist_items.rb +3 -3
- data/lib/yt/collections/playlists.rb +0 -1
- data/lib/yt/collections/snippets.rb +0 -1
- data/lib/yt/collections/subscriptions.rb +4 -3
- data/lib/yt/collections/user_infos.rb +0 -2
- data/lib/yt/collections/videos.rb +0 -1
- data/lib/yt/errors/base.rb +43 -0
- data/lib/yt/errors/error.rb +8 -0
- data/lib/yt/errors/failed.rb +17 -0
- data/lib/yt/errors/no_items.rb +17 -0
- data/lib/yt/errors/unauthenticated.rb +34 -0
- data/lib/yt/models/account.rb +1 -17
- data/lib/yt/models/base.rb +1 -0
- data/lib/yt/models/description.rb +11 -35
- data/lib/yt/models/id.rb +4 -0
- data/lib/yt/models/request.rb +102 -0
- data/lib/yt/models/resource.rb +13 -2
- data/lib/yt/models/subscription.rb +3 -2
- data/lib/yt/models/url.rb +88 -0
- data/lib/yt/version.rb +1 -1
- data/spec/associations/device_auth/details_sets_spec.rb +1 -1
- data/spec/associations/device_auth/ids_spec.rb +19 -0
- data/spec/associations/device_auth/playlist_items_spec.rb +3 -3
- data/spec/associations/device_auth/snippets_spec.rb +2 -2
- data/spec/associations/device_auth/user_infos_spec.rb +7 -2
- data/spec/associations/server_auth/details_sets_spec.rb +4 -4
- data/spec/associations/server_auth/ids_spec.rb +18 -0
- data/spec/associations/server_auth/snippets_spec.rb +2 -2
- data/spec/collections/playlist_items_spec.rb +25 -5
- data/spec/collections/subscriptions_spec.rb +6 -4
- data/spec/errors/failed_spec.rb +9 -0
- data/spec/errors/no_items_spec.rb +9 -0
- data/spec/errors/unauthenticated_spec.rb +9 -0
- data/spec/models/account_spec.rb +0 -0
- data/spec/models/description_spec.rb +2 -2
- data/spec/models/request_spec.rb +29 -0
- data/spec/models/resource_spec.rb +21 -0
- data/spec/models/subscription_spec.rb +6 -4
- data/spec/models/url_spec.rb +72 -0
- data/spec/support/fail_matcher.rb +14 -0
- metadata +32 -4
- data/lib/yt/actions/request.rb +0 -112
- data/lib/yt/actions/request_error.rb +0 -11
data/lib/yt/actions/request.rb
DELETED
@@ -1,112 +0,0 @@
|
|
1
|
-
require 'net/http' # for Net::HTTP.start
|
2
|
-
require 'uri' # for URI.json
|
3
|
-
require 'json' # for JSON.parse
|
4
|
-
require 'active_support/core_ext' # for Hash.from_xml, Hash.to_param
|
5
|
-
|
6
|
-
require 'yt/actions/request_error'
|
7
|
-
require 'yt/config'
|
8
|
-
|
9
|
-
module Yt
|
10
|
-
class Request
|
11
|
-
def initialize(options = {})
|
12
|
-
options[:query] ||= options[:params].to_param
|
13
|
-
@uri = URI::HTTPS.build options.slice(:host, :path, :query)
|
14
|
-
@method = options[:method]
|
15
|
-
@format = options[:format]
|
16
|
-
@scope = options[:scope]
|
17
|
-
@body = options[:body]
|
18
|
-
@body_type = options[:body_type]
|
19
|
-
@auth = options[:auth]
|
20
|
-
@headers = {}
|
21
|
-
end
|
22
|
-
|
23
|
-
def run
|
24
|
-
add_authorization_to_request! if requires_authorization?
|
25
|
-
fetch_response.tap do |response|
|
26
|
-
response.body = parse_format response.body if response.body
|
27
|
-
# puts "You can try again running #{to_curl}"
|
28
|
-
raise RequestError, response.body unless response.is_a? Net::HTTPSuccess
|
29
|
-
end
|
30
|
-
end
|
31
|
-
|
32
|
-
def self.default_params
|
33
|
-
{}.tap do |params|
|
34
|
-
params[:format] = :json
|
35
|
-
params[:host] = 'www.googleapis.com'
|
36
|
-
params[:scope] = 'https://www.googleapis.com/auth/youtube'
|
37
|
-
params[:body_type] = :json
|
38
|
-
end
|
39
|
-
end
|
40
|
-
|
41
|
-
private
|
42
|
-
|
43
|
-
def add_authorization_to_request!
|
44
|
-
if @auth.respond_to? :access_token_for
|
45
|
-
@headers['Authorization'] = "Bearer #{@auth.access_token_for @scope}"
|
46
|
-
elsif Yt.configuration.api_key
|
47
|
-
params = URI.decode_www_form @uri.query || ''
|
48
|
-
params << [:key, Yt.configuration.api_key]
|
49
|
-
@uri.query = URI.encode_www_form params
|
50
|
-
else
|
51
|
-
raise RequestError, missing_credentials
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def requires_authorization?
|
56
|
-
@uri.host == Request.default_params[:host]
|
57
|
-
end
|
58
|
-
|
59
|
-
def fetch_response
|
60
|
-
Net::HTTP.start(@uri.host, @uri.port, use_ssl: true) do |http|
|
61
|
-
klass = "Net::HTTP::#{@method.capitalize}".constantize
|
62
|
-
request = klass.new @uri.request_uri
|
63
|
-
case @body_type
|
64
|
-
when :json
|
65
|
-
request.initialize_http_header 'Content-Type' => 'application/json'
|
66
|
-
request.initialize_http_header 'Content-length' => '0' unless @body
|
67
|
-
request.body = @body.to_json if @body
|
68
|
-
when :form
|
69
|
-
request.set_form_data @body if @body
|
70
|
-
end
|
71
|
-
@headers.each{|k,v| request.add_field k, v}
|
72
|
-
|
73
|
-
http.request request
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
def parse_format(body)
|
78
|
-
case @format
|
79
|
-
when :xml then Hash.from_xml body
|
80
|
-
when :json then JSON body
|
81
|
-
end
|
82
|
-
end
|
83
|
-
|
84
|
-
def missing_credentials
|
85
|
-
<<-MSG
|
86
|
-
In order to perform this request, you need to register your app with the
|
87
|
-
Google Developers Console (https://console.developers.google.com).
|
88
|
-
|
89
|
-
Make sure your app has access to the Google+ and YouTube APIs.
|
90
|
-
Generate a client ID, client secret and server API key, then pass their
|
91
|
-
values to Yt. One way of doing this is through an initializer:
|
92
|
-
|
93
|
-
Yt.configure do |config|
|
94
|
-
config.client_id = '1234567890.apps.googleusercontent.com'
|
95
|
-
config.client_secret = '1234567890'
|
96
|
-
config.api_key = '123456789012345678901234567890'
|
97
|
-
end
|
98
|
-
|
99
|
-
An alternative (but equivalent) way is throught environment variables:
|
100
|
-
|
101
|
-
export YT_CLIENT_ID="1234567890.apps.googleusercontent.com"
|
102
|
-
export YT_CLIENT_SECRET="1234567890"
|
103
|
-
export YT_API_KEY="123456789012345678901234567890"
|
104
|
-
|
105
|
-
MSG
|
106
|
-
end
|
107
|
-
|
108
|
-
# def to_curl
|
109
|
-
# %Q{curl -X #{@method.upcase} "#{@uri}"}
|
110
|
-
# end
|
111
|
-
end
|
112
|
-
end
|