yt 0.4.4 → 0.4.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +1 -0
  3. data/.travis.yml +13 -6
  4. data/Gemfile +0 -5
  5. data/Gemfile.lock +5 -20
  6. data/HISTORY.md +3 -1
  7. data/README.md +15 -15
  8. data/gemfiles/Gemfile.activesupport-3.x +4 -0
  9. data/gemfiles/Gemfile.activesupport-4.x +4 -0
  10. data/lib/yt/actions/delete.rb +2 -5
  11. data/lib/yt/actions/delete_all.rb +1 -2
  12. data/lib/yt/actions/insert.rb +2 -6
  13. data/lib/yt/actions/list.rb +2 -4
  14. data/lib/yt/{utils → actions}/request.rb +24 -27
  15. data/lib/yt/actions/request_error.rb +11 -0
  16. data/lib/yt/actions/update.rb +2 -5
  17. data/lib/yt/associations/annotations.rb +1 -1
  18. data/lib/yt/associations/channels.rb +1 -1
  19. data/lib/yt/associations/details_sets.rb +1 -1
  20. data/lib/yt/associations/playlist_items.rb +1 -1
  21. data/lib/yt/associations/playlists.rb +1 -1
  22. data/lib/yt/associations/ratings.rb +1 -1
  23. data/lib/yt/associations/snippets.rb +1 -1
  24. data/lib/yt/associations/subscriptions.rb +1 -1
  25. data/lib/yt/associations/user_infos.rb +1 -1
  26. data/lib/yt/associations/videos.rb +1 -1
  27. data/lib/yt/collections/annotations.rb +3 -12
  28. data/lib/yt/collections/channels.rb +2 -11
  29. data/lib/yt/collections/details_sets.rb +3 -12
  30. data/lib/yt/collections/playlist_items.rb +4 -13
  31. data/lib/yt/collections/playlists.rb +3 -12
  32. data/lib/yt/collections/ratings.rb +4 -13
  33. data/lib/yt/collections/resources.rb +16 -0
  34. data/lib/yt/collections/snippets.rb +5 -19
  35. data/lib/yt/collections/subscriptions.rb +6 -14
  36. data/lib/yt/collections/user_infos.rb +2 -11
  37. data/lib/yt/collections/videos.rb +4 -13
  38. data/lib/yt/models/annotation.rb +6 -1
  39. data/lib/yt/models/channel.rb +2 -10
  40. data/lib/yt/models/details_set.rb +5 -2
  41. data/lib/yt/models/playlist.rb +2 -12
  42. data/lib/yt/models/resource.rb +16 -0
  43. data/lib/yt/models/video.rb +4 -11
  44. data/lib/yt/version.rb +1 -1
  45. data/spec/collections/playlist_items_spec.rb +1 -1
  46. data/spec/models/annotation_spec.rb +7 -7
  47. data/spec/models/details_set_spec.rb +5 -0
  48. data/yt.gemspec +8 -6
  49. metadata +13 -8
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 4fe44dc454cc59b8d2d6dbb940704f004208c935
4
- data.tar.gz: 155dc1491d986ff2e1299088766e7f25731bf314
3
+ metadata.gz: adb060424b5ef66ace1e77ddc760ec71bf568c07
4
+ data.tar.gz: 62e91a94a4e1af527360b217824ac2bdad530c0a
5
5
  SHA512:
6
- metadata.gz: 09ea630bf75f3d65d83aea52f1c6126bf96e81e9a483c60cf5a575d73b2ff2a57ea879d0d4915479aa158198196684b98ba52f3c9676bf7b985dbc24e44ef124
7
- data.tar.gz: 2d842bc0e8c7cc5d522d9dacf482a02e11ec0e761710a05d08f3303a3b4cd35e873f1050771abcd37d80f48fe3a3a92b8df95f080a416691575e2bf863ffbfce
6
+ metadata.gz: 742c01386c4e89187899dfbf544c34c5f2a4c513001cb03efc46434f03f35c56aa0fb2ea587566aa5b8419112f7aeaec8ad62abe8641e99e07e931ffa4b3f44e
7
+ data.tar.gz: d438cabdca24c141d39314b88d43453323a0c04a17afd0d6d1378e2f11ed8eb17f8841ae7d8d8597ad1654f7f783c093f4ff3d04a2b13e3370d49172b7e103c3
data/.rspec CHANGED
@@ -1,2 +1,3 @@
1
1
  --format documentation
2
2
  --color
3
+ --fail-fast
@@ -1,11 +1,18 @@
1
1
  language: ruby
2
- rvm:
3
- - 2.0.0
4
2
  notifications:
5
3
  email: false
4
+ matrix:
5
+ include:
6
+ - rvm: 1.9.3
7
+ gemfile: gemfiles/Gemfile.activesupport-3.x
8
+ env:
9
+ - secure: DAvQ18qN71nRGkM+kOklTi6InE3dM98BgQAagve2S8/D76VXc+Hyl1It+/v73CrCuDdKTJpVl2a7pc+W5x+JG+PDo4X4ZXFURyvv417nywJulsda4y/TcTe59WHFGTQ/maj3l5PLPmENpROBU8/2HBGOSny0aNNkbnRXrTx3dU4=
10
+ - rvm: 2.0.0
11
+ gemfile: gemfiles/Gemfile.activesupport-4.x
12
+ env:
13
+ - secure: D57A44s/W77P3JLarTwELEjIeFtOKVcUtM2M7fKot6qfiDGF3azsWUoW0rrQG6hCUSop32UUeYQdnUmdhqWc89k0jtVKpW1I3UyV36iacKXevsfe/w6Q4CCHCi3udPVsEvt36ZQ2LtGMs0seUxujDaI1sqrfn3zMSXyVcSTjceg=
6
14
  env:
7
15
  global:
8
- - secure: UPTXrTnEtwOW3MZLjGmKmllUflKEQ9ICjELS5j3ucScIyW+q8idf7EEuj03n2FKN/zGNo1BDxLbMxzh+1jBhugGxIF0gmSXQ4tborLMkYtQ07rAWemHGCx3RicDlAWSuqz9tDkMILsasK74LgbfaEeJYI6xfAvOm+em/7jxUk5w=
9
- - secure: Gkg2vV9NFxvA6TUpl4d10HZNtYB2j1qP5nwlIWuDwV79Wbst2u+sgUX6nCTcQA1L4EgHQqfXXM6NHUrLevT45kj6DuG2C/sJUudttqfB5VmfK7nNT617BlqgiZuNjNWCnD9CK5zAdHUo2ukxiXKyl/WhYIhBA59fsGbFynbUISM=
10
- - secure: RLWA00fvwiyk2JooX+ePrwPfUCWE1aunuA9STogRiwwUYO237lU35hDkuE7+0GMJAtfWDkuG5f4+8oWsOf0sBytebgxhJ25Uxi6uWlsukuXRM028Z8yjMzgLzmke5InICIVKzPWyvjlphB14nP4PoSrPl9RlHgs4LuJ4l/OkbEQ=
11
- - secure: RuYxzoTiam6GLIoP3xkhU9eaW3kjyxnOLYqBjjezhEHXrExDQinO5/k2NsHy2Y8iZSlKxMAG+DJJ45WAObNpg3fAPC/ExrzGyNX1u3qCQU481HbVZTJa8vg9IrJsSxCYyawdcbd7tgULiuRZacMmamsXLSJymLofF7LE0jA2KPA=
16
+ - secure: KFozlRmcSFzZIl8nXPZ5HIf+MAvgK4I7FYsTYyAMW7LsRJJ4NAJJCHAbWZUfmbqygUN188zj2y0TbQUu47lEf7v2XvJu6DFCYw+e4sk6lSW8V5jRzWl1f6DOKb1z+FBpUgJHj9OKykqjdtm3zVLWr56xm3fhB+ULDj8XVOVxyLk=
17
+ - secure: e/p7BLWhc8BBiXkxM3zXPj3x/8PqUT0ERRfUFYXAnZRZ0gmACtig590nZY7FLeNhBQMORuHt/ZE5DCuNZRaOIdauQqV4rP46U5CJBWe2RNzDi1L+nctUCSKDwVDIVl/r5yEP22om4g5s1xhWfc8wlJF2VEnfLcq80ca1vK+e1ds=
18
+ - secure: VpOIZVcckArwpoVs/fppUFEJEOI3e6zv2L5rP/vj0Uxl1hOHgg1emedjzM7x2wxKMi/L2g5ot9Oz6H9N1Y0FXzB1L49Hy3hla2nKBcecgvqk1z5InTpx6eiBDQqJAoZurCCmkdfKjVtWfb0CAdOX9Euio5DxqcnIcIVIiWpD5BE=
data/Gemfile CHANGED
@@ -1,9 +1,4 @@
1
1
  source 'https://rubygems.org'
2
2
 
3
- # Add 'binding.pry'_remote to debug your code, then use 'next', 'continue', ...
4
- gem 'pry', require: 'pry'
5
- gem 'pry-nav'
6
- gem 'pry-remote'
7
-
8
3
  # Specify your gem's dependencies in yt.gemspec
9
4
  gemspec
@@ -1,19 +1,18 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- yt (0.4.4)
4
+ yt (0.4.5)
5
5
  activesupport
6
6
 
7
7
  GEM
8
8
  remote: https://rubygems.org/
9
9
  specs:
10
- activesupport (4.1.0)
10
+ activesupport (4.1.1)
11
11
  i18n (~> 0.6, >= 0.6.9)
12
12
  json (~> 1.7, >= 1.7.7)
13
13
  minitest (~> 5.1)
14
14
  thread_safe (~> 0.1)
15
15
  tzinfo (~> 1.1)
16
- coderay (1.1.0)
17
16
  coveralls (0.7.0)
18
17
  multi_json (~> 1.3)
19
18
  rest-client
@@ -24,19 +23,9 @@ GEM
24
23
  docile (1.1.3)
25
24
  i18n (0.6.9)
26
25
  json (1.8.1)
27
- method_source (0.8.2)
28
26
  mime-types (2.2)
29
27
  minitest (5.3.3)
30
- multi_json (1.9.2)
31
- pry (0.9.12.6)
32
- coderay (~> 1.0)
33
- method_source (~> 0.8)
34
- slop (~> 3.4)
35
- pry-nav (0.2.3)
36
- pry (~> 0.9.10)
37
- pry-remote (0.1.8)
38
- pry (~> 0.9)
39
- slop (~> 3.0)
28
+ multi_json (1.10.0)
40
29
  rake (10.3.1)
41
30
  rest-client (1.6.7)
42
31
  mime-types (>= 1.16)
@@ -53,12 +42,11 @@ GEM
53
42
  multi_json
54
43
  simplecov-html (~> 0.8.0)
55
44
  simplecov-html (0.8.0)
56
- slop (3.5.0)
57
45
  term-ansicolor (1.3.0)
58
46
  tins (~> 1.0)
59
47
  thor (0.19.1)
60
48
  thread_safe (0.3.3)
61
- tins (1.1.0)
49
+ tins (1.2.0)
62
50
  tzinfo (1.1.0)
63
51
  thread_safe (~> 0.1)
64
52
  yard (0.8.7.4)
@@ -67,11 +55,8 @@ PLATFORMS
67
55
  ruby
68
56
 
69
57
  DEPENDENCIES
70
- bundler (~> 1.3)
58
+ bundler
71
59
  coveralls
72
- pry
73
- pry-nav
74
- pry-remote
75
60
  rake
76
61
  rspec
77
62
  yard
data/HISTORY.md CHANGED
@@ -1,8 +1,10 @@
1
- v0.4.0 - 2014/05/09
1
+ v0.4 - 2014/05/09
2
2
  --------------------
3
3
 
4
4
  * Complete rewrite, using ActiveSupport and separating models and collections
5
5
  * New methods to handle annotations, details sets
6
+ * Supports also ActiveSupport 3 and Ruby 1.9.3 (not just AS4 + Ruby 2)
7
+ * Fix parsing annotation and timestamps longer than 1 hour
6
8
 
7
9
  v0.3.0 - 2014/04/16
8
10
  --------------------
data/README.md CHANGED
@@ -4,12 +4,12 @@ Yt
4
4
  Yt helps you write apps that need to interact with the YouTube API V3.
5
5
 
6
6
  [![Gem Version](https://badge.fury.io/rb/yt.svg)](http://badge.fury.io/rb/yt)
7
- [![Dependency Status](https://gemnasium.com/fullscreeninc/googol.png)](https://gemnasium.com/fullscreeninc/googol)
8
- [![Build Status](https://travis-ci.org/fullscreeninc/googol.png?branch=master)](https://travis-ci.org/fullscreeninc/googol)
9
- [![Coverage Status](https://coveralls.io/repos/fullscreeninc/googol/badge.png)](https://coveralls.io/r/fullscreeninc/googol)
10
- [![Code Climate](https://codeclimate.com/github/fullscreeninc/googol.png)](https://codeclimate.com/github/fullscreeninc/googol)
7
+ [![Dependency Status](https://gemnasium.com/fullscreeninc/yt.png)](https://gemnasium.com/fullscreeninc/yt)
8
+ [![Build Status](https://travis-ci.org/fullscreeninc/yt.png?branch=master)](https://travis-ci.org/fullscreeninc/yt)
9
+ [![Coverage Status](https://coveralls.io/repos/fullscreeninc/yt/badge.png?)](https://coveralls.io/r/fullscreeninc/yt)
10
+ [![Code Climate](https://codeclimate.com/github/fullscreeninc/yt.png)](https://codeclimate.com/github/fullscreeninc/yt)
11
11
 
12
- After [registering your app], you can run commands like:
12
+ After [registering your app](#registering-your-app), you can run commands like:
13
13
 
14
14
  ```ruby
15
15
  channel = Yt::Channel.new id: 'UCxO1tY8h1AhOz0T4ENwmpow'
@@ -33,7 +33,7 @@ Available resources
33
33
  Yt::Account
34
34
  -----------
35
35
 
36
- Use [Yt::Account](link to doc) to:
36
+ Use [Yt::Account](http://rubydoc.info/github/fullscreeninc/yt/master/Yt/Account) to:
37
37
 
38
38
  * authenticate as a YouTube account
39
39
  * read attributes of the account
@@ -52,7 +52,7 @@ account.channel #=> #<Yt::Channel @id=...>
52
52
  Yt::Channel
53
53
  -----------
54
54
 
55
- Use [Yt::Channel](link to doc) to:
55
+ Use [Yt::Channel](http://rubydoc.info/github/fullscreeninc/yt/master/Yt/Channel) to:
56
56
 
57
57
  * read attributes of a channel
58
58
  * access the videos of a channel
@@ -85,7 +85,7 @@ channel.delete_playlists title: 'New playlist' #=> [true]
85
85
  Yt::Video
86
86
  -----------
87
87
 
88
- Use [Yt::Video](link to doc) to:
88
+ Use [Yt::Video](http://rubydoc.info/github/fullscreeninc/yt/master/Yt/Video) to:
89
89
 
90
90
  * read attributes of a video
91
91
  * access the annotations of a video
@@ -110,7 +110,7 @@ video.like #=> true
110
110
  Yt::Playlist
111
111
  ------------
112
112
 
113
- Use [Yt::Playlist](link to doc) to:
113
+ Use [Yt::Playlist](http://rubydoc.info/github/fullscreeninc/yt/master/Yt/Playlist) to:
114
114
 
115
115
  * read attributes of a playlist
116
116
  * access the items of a playlist
@@ -126,20 +126,20 @@ playlist.playlist_items.count #=> 1
126
126
  playlist.playlist_items.first #=> #<Yt::PlaylistItem @id=...>
127
127
  playlist.playlist_items.first.position #=> 0
128
128
  playlist.playlist_items.first.video.title #=> "Fullscreen Creator Platform"
129
- playlist.delete_playlist_items title: 'Fullscreen Creator Platform' #=> [true]
130
129
 
131
130
  # An OAuth2 prompt will appear before the following commands
132
131
  playlist.add_video 'MESycYJytkU'
133
132
  playlist.add_videos ['MESycYJytkU', 'MESycYJytkU']
133
+ playlist.delete_playlist_items title: 'Fullscreen Creator Platform' #=> [true]
134
134
  ```
135
135
 
136
- *Adding videos requires authentication (see below).*
136
+ *Adding and removing videos/items requires authentication (see below).*
137
137
 
138
138
 
139
139
  Yt::Annotation
140
140
  --------------
141
141
 
142
- Use [Yt::Annotation](link to doc) to:
142
+ Use [Yt::Annotation](http://rubydoc.info/github/fullscreeninc/yt/master/Yt/Annotation) to:
143
143
 
144
144
  * read attributes of an annotation
145
145
 
@@ -204,7 +204,7 @@ refresh token, then add the following snippet of code to the initializer of your
204
204
 
205
205
  ```ruby
206
206
  Yt.configure do |config|
207
- config.client_id = '1234567890.apps.googleusercontent.com
207
+ config.client_id = '1234567890.apps.googleusercontent.com'
208
208
  config.client_secret = '1234567890'
209
209
  end
210
210
  ```
@@ -247,7 +247,7 @@ refresh token, then add the following snippet of code to the initializer of your
247
247
  ```ruby
248
248
  Yt.configure do |config|
249
249
  config.scenario = :device_app
250
- config.client_id = '1234567890.apps.googleusercontent.com
250
+ config.client_id = '1234567890.apps.googleusercontent.com'
251
251
  config.client_secret = '1234567890'
252
252
  end
253
253
  ```
@@ -276,7 +276,7 @@ To install on your system, run
276
276
 
277
277
  To use inside a bundled Ruby project, add this line to the Gemfile:
278
278
 
279
- gem 'yt', '~> 0.4.4'
279
+ gem 'yt', '~> 0.4.5'
280
280
 
281
281
  Since the gem follows [Semantic Versioning](http://semver.org),
282
282
  indicating the full version in your Gemfile (~> *major*.*minor*.*patch*)
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'activesupport', '~> 3.0'
4
+ gemspec path: '../'
@@ -0,0 +1,4 @@
1
+ source 'http://rubygems.org'
2
+
3
+ gem 'activesupport', '~> 4.0'
4
+ gemspec path: '../'
@@ -1,4 +1,4 @@
1
- require 'yt/utils/request'
1
+ require 'yt/actions/request'
2
2
 
3
3
  module Yt
4
4
  module Actions
@@ -14,11 +14,8 @@ module Yt
14
14
  end
15
15
 
16
16
  def delete_params
17
- {}.tap do |params|
17
+ Request.default_params.tap do |params|
18
18
  params[:method] = :delete
19
- params[:format] = :json
20
- params[:host] = 'www.googleapis.com'
21
- params[:scope] = 'https://www.googleapis.com/auth/youtube'
22
19
  params[:auth] = @auth
23
20
  end
24
21
  end
@@ -1,5 +1,5 @@
1
1
  require 'yt/actions/list'
2
- require 'yt/utils/request'
2
+ require 'yt/actions/request'
3
3
 
4
4
  module Yt
5
5
  module Actions
@@ -10,7 +10,6 @@ module Yt
10
10
 
11
11
  def do_delete_all(params = {})
12
12
  where(params).map do |item|
13
- yield item if block_given?
14
13
  item.delete
15
14
  end.tap { @items = [] }
16
15
  end
@@ -1,4 +1,4 @@
1
- require 'yt/utils/request'
1
+ require 'yt/actions/request'
2
2
 
3
3
  module Yt
4
4
  module Actions
@@ -15,12 +15,8 @@ module Yt
15
15
  end
16
16
 
17
17
  def insert_params
18
- {}.tap do |params|
18
+ Request.default_params.tap do |params|
19
19
  params[:method] = :post
20
- params[:format] = :json
21
- params[:host] = 'www.googleapis.com'
22
- params[:body_type] = :json
23
- params[:scope] = 'https://www.googleapis.com/auth/youtube'
24
20
  params[:auth] = @auth
25
21
  end
26
22
  end
@@ -1,4 +1,4 @@
1
- require 'yt/utils/request'
1
+ require 'yt/actions/request'
2
2
 
3
3
  module Yt
4
4
  module Actions
@@ -53,10 +53,8 @@ module Yt
53
53
  end
54
54
 
55
55
  def list_params
56
- {}.tap do |params|
56
+ Request.default_params.tap do |params|
57
57
  params[:method] = :get
58
- params[:format] = :json
59
- params[:host] = 'www.googleapis.com'
60
58
  params[:auth] = @auth
61
59
  end
62
60
  end
@@ -1,21 +1,12 @@
1
- require 'yt/config'
2
-
3
- require 'uri' # for URI.json
4
1
  require 'net/http' # for Net::HTTP.start
2
+ require 'uri' # for URI.json
5
3
  require 'json' # for JSON.parse
6
- require 'active_support/core_ext/hash/conversions' # for Hash.from_xml
4
+ require 'active_support/core_ext' # for Hash.from_xml, Hash.to_param
7
5
 
8
- module Yt
9
- class RequestError < StandardError
10
- def reasons
11
- error.fetch('errors', []).map{|e| e['reason']}
12
- end
13
-
14
- def error
15
- eval(message)['error'] rescue {}
16
- end
17
- end
6
+ require 'yt/actions/request_error'
7
+ require 'yt/config'
18
8
 
9
+ module Yt
19
10
  class Request
20
11
  def initialize(options = {})
21
12
  options[:query] ||= options[:params].to_param
@@ -33,10 +24,17 @@ module Yt
33
24
  add_authorization_to_request!
34
25
  fetch_response.tap do |response|
35
26
  response.body = parse_format response.body if response.body
36
- unless response.is_a? Net::HTTPSuccess
37
- # puts "You can try again running #{to_curl}"
38
- raise RequestError, response.body
39
- end
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
40
38
  end
41
39
  end
42
40
 
@@ -55,19 +53,18 @@ module Yt
55
53
  def fetch_response
56
54
  Net::HTTP.start(@uri.host, @uri.port, use_ssl: true) do |http|
57
55
  klass = "Net::HTTP::#{@method.capitalize}".constantize
58
- request = if @body_type == :json
59
- klass.new @uri, initheader = {'Content-Type' =>'application/json'}
60
- else
61
- klass.new @uri
56
+ request = klass.new @uri.request_uri
57
+ case @body_type
58
+ when :json
59
+ request.initialize_http_header 'Content-Type' => 'application/json'
60
+ request.initialize_http_header 'Content-length' => '0' unless @body
61
+ request.body = @body.to_json if @body
62
+ when :form
63
+ request.set_form_data @body if @body
62
64
  end
63
65
  @headers.each{|k,v| request.add_field k, v}
64
- case @body_type
65
- when :json then request.body = @body.to_json
66
- when :form then request.set_form_data @body
67
- end if @body
68
66
 
69
67
  http.request request
70
- # NOTE! Here refresh the token if the access is expired
71
68
  end
72
69
  end
73
70
 
@@ -0,0 +1,11 @@
1
+ module Yt
2
+ class RequestError < StandardError
3
+ def reasons
4
+ error.fetch('errors', []).map{|e| e['reason']}
5
+ end
6
+
7
+ def error
8
+ eval(message)['error'] rescue {}
9
+ end
10
+ end
11
+ end
@@ -1,4 +1,4 @@
1
- require 'yt/utils/request'
1
+ require 'yt/actions/request'
2
2
 
3
3
  module Yt
4
4
  module Actions
@@ -12,11 +12,8 @@ module Yt
12
12
  end
13
13
 
14
14
  def update_params
15
- {}.tap do |params|
15
+ Request.default_params.tap do |params|
16
16
  params[:method] = :put
17
- params[:format] = :json
18
- params[:host] = 'www.googleapis.com'
19
- params[:scope] = 'https://www.googleapis.com/auth/youtube'
20
17
  params[:auth] = @auth
21
18
  end
22
19
  end
@@ -7,7 +7,7 @@ module Yt
7
7
  # YouTube resources with annotations are: videos.
8
8
  module Annotations
9
9
  def annotations
10
- @annotations ||= Collections::Annotations.by_video self
10
+ @annotations ||= Collections::Annotations.of self
11
11
  end
12
12
  end
13
13
  end
@@ -13,7 +13,7 @@ module Yt
13
13
  private
14
14
 
15
15
  def channels
16
- @channels ||= Collections::Channels.by_account self
16
+ @channels ||= Collections::Channels.of self
17
17
  end
18
18
  end
19
19
  end
@@ -13,7 +13,7 @@ module Yt
13
13
  private
14
14
 
15
15
  def details_sets
16
- @details_sets ||= Collections::DetailsSets.by_video self
16
+ @details_sets ||= Collections::DetailsSets.of self
17
17
  end
18
18
  end
19
19
  end
@@ -7,7 +7,7 @@ module Yt
7
7
  # YouTube resources with playlist items are: playlists.
8
8
  module PlaylistItems
9
9
  def playlist_items
10
- @playlist_items ||= Collections::PlaylistItems.by_playlist self
10
+ @playlist_items ||= Collections::PlaylistItems.of self
11
11
  end
12
12
 
13
13
  def add_video(video_id)
@@ -7,7 +7,7 @@ module Yt
7
7
  # YouTube resources with playlist are: channels.
8
8
  module Playlists
9
9
  def playlists
10
- @playlists ||= Collections::Playlists.by_channel self
10
+ @playlists ||= Collections::Playlists.of self
11
11
  end
12
12
 
13
13
  def create_playlist(params = {})
@@ -32,7 +32,7 @@ module Yt
32
32
  private
33
33
 
34
34
  def ratings
35
- @ratings ||= Collections::Ratings.by_video self
35
+ @ratings ||= Collections::Ratings.of self
36
36
  end
37
37
  end
38
38
  end
@@ -13,7 +13,7 @@ module Yt
13
13
  private
14
14
 
15
15
  def snippets
16
- @snippets ||= Collections::Snippets.by_resource self
16
+ @snippets ||= Collections::Snippets.of self
17
17
  end
18
18
  end
19
19
  end
@@ -7,7 +7,7 @@ module Yt
7
7
  # YouTube resources with subscription are: channels.
8
8
  module Subscriptions
9
9
  def subscriptions
10
- @subscriptions ||= Collections::Subscriptions.by_channel self
10
+ @subscriptions ||= Collections::Subscriptions.of self
11
11
  end
12
12
 
13
13
  def subscribed?
@@ -13,7 +13,7 @@ module Yt
13
13
  private
14
14
 
15
15
  def user_infos
16
- @user_infos ||= Collections::UserInfos.by_account self
16
+ @user_infos ||= Collections::UserInfos.of self
17
17
  end
18
18
  end
19
19
  end
@@ -7,7 +7,7 @@ module Yt
7
7
  # YouTube resources with videos are: channels.
8
8
  module Videos
9
9
  def videos
10
- @videos ||= Collections::Videos.by_channel self
10
+ @videos ||= Collections::Videos.of self
11
11
  end
12
12
  end
13
13
  end
@@ -1,18 +1,9 @@
1
- require 'yt/collections/base'
1
+ require 'yt/collections/resources'
2
2
  require 'yt/models/annotation'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
- class Annotations < Base
7
-
8
- def initialize(options = {})
9
- @video = options[:video]
10
- @auth = options[:auth]
11
- end
12
-
13
- def self.by_video(video)
14
- new video: video, auth: video.auth
15
- end
6
+ class Annotations < Resources
16
7
 
17
8
  private
18
9
 
@@ -25,7 +16,7 @@ module Yt
25
16
  params[:format] = :xml
26
17
  params[:host] = 'www.youtube.com'
27
18
  params[:path] = '/annotations_invideo'
28
- params[:params] = {video_id: @video.id}
19
+ params[:params] = {video_id: @parent.id}
29
20
  end
30
21
  end
31
22
 
@@ -1,18 +1,9 @@
1
- require 'yt/collections/base'
1
+ require 'yt/collections/resources'
2
2
  require 'yt/models/channel'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
- class Channels < Base
7
-
8
- def initialize(options = {})
9
- @account = options[:account]
10
- @auth = options[:auth]
11
- end
12
-
13
- def self.by_account(account)
14
- new account: account, auth: account.auth
15
- end
6
+ class Channels < Resources
16
7
 
17
8
  private
18
9
 
@@ -1,18 +1,9 @@
1
- require 'yt/collections/base'
1
+ require 'yt/collections/resources'
2
2
  require 'yt/models/details_set'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
- class DetailsSets < Base
7
-
8
- def initialize(options = {})
9
- @video = options[:video]
10
- @auth = options[:auth]
11
- end
12
-
13
- def self.by_video(video)
14
- new video: video, auth: video.auth
15
- end
6
+ class DetailsSets < Resources
16
7
 
17
8
  private
18
9
 
@@ -22,7 +13,7 @@ module Yt
22
13
 
23
14
  def list_params
24
15
  super.tap do |params|
25
- params[:params] = {maxResults: 50, part: 'contentDetails', id: @video.id}
16
+ params[:params] = {maxResults: 50, part: 'contentDetails', id: @parent.id}
26
17
  params[:scope] = 'https://www.googleapis.com/auth/youtube.readonly'
27
18
  params[:path] = '/youtube/v3/videos'
28
19
  end
@@ -1,24 +1,15 @@
1
- require 'yt/collections/base'
1
+ require 'yt/collections/resources'
2
2
  require 'yt/models/playlist_item'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
- class PlaylistItems < Base
7
-
8
- def initialize(options = {})
9
- @playlist = options[:playlist]
10
- @auth = options[:auth]
11
- end
12
-
13
- def self.by_playlist(playlist)
14
- new playlist: playlist, auth: playlist.auth
15
- end
6
+ class PlaylistItems < Resources
16
7
 
17
8
  # options are id and kind
18
9
  def insert(options = {}) #
19
10
  resource = {kind: "youtube##{options[:kind]}"}
20
11
  resource["#{options[:kind]}Id"] = options[:id]
21
- snippet = {playlistId: @playlist.id, resourceId: resource}
12
+ snippet = {playlistId: @parent.id, resourceId: resource}
22
13
  do_insert body: {snippet: snippet}, params: {part: 'snippet,status'}
23
14
  end
24
15
 
@@ -34,7 +25,7 @@ module Yt
34
25
 
35
26
  def list_params
36
27
  super.tap do |params|
37
- params[:params] = {maxResults: 50, part: 'snippet,status', playlistId: @playlist.id}
28
+ params[:params] = {maxResults: 50, part: 'snippet,status', playlistId: @parent.id}
38
29
  params[:scope] = 'https://www.googleapis.com/auth/youtube.readonly'
39
30
  params[:path] = '/youtube/v3/playlistItems'
40
31
  end
@@ -1,18 +1,9 @@
1
- require 'yt/collections/base'
1
+ require 'yt/collections/resources'
2
2
  require 'yt/models/playlist'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
- class Playlists < Base
7
-
8
- def initialize(options = {})
9
- @channel = options[:channel]
10
- @auth = options[:auth]
11
- end
12
-
13
- def self.by_channel(channel)
14
- new channel: channel, auth: channel.auth
15
- end
6
+ class Playlists < Resources
16
7
 
17
8
  # Valid body (no defaults) are: title (string), description (string), privacy_status (string),
18
9
  # tags (array of strings)
@@ -40,7 +31,7 @@ module Yt
40
31
 
41
32
  def list_params
42
33
  super.tap do |params|
43
- params[:params] = {maxResults: 50, part: 'snippet,status', channelId: @channel.id}
34
+ params[:params] = {maxResults: 50, part: 'snippet,status', channelId: @parent.id}
44
35
  params[:scope] = 'https://www.googleapis.com/auth/youtube.readonly'
45
36
  params[:path] = '/youtube/v3/playlists'
46
37
  end
@@ -1,29 +1,20 @@
1
- require 'yt/collections/base'
1
+ require 'yt/collections/resources'
2
2
  require 'yt/models/rating'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
- class Ratings < Base
7
-
8
- def initialize(options = {})
9
- @video = options[:video]
10
- @auth = options[:auth]
11
- end
12
-
13
- def self.by_video(video)
14
- new video: video, auth: video.auth
15
- end
6
+ class Ratings < Resources
16
7
 
17
8
  private
18
9
 
19
10
  def new_item(data)
20
- Yt::Rating.new rating: data['rating'], video_id: @video.id, auth: @auth
11
+ Yt::Rating.new rating: data['rating'], video_id: @parent.id, auth: @auth
21
12
  end
22
13
 
23
14
  def list_params
24
15
  super.tap do |params|
25
16
  params[:path] = '/youtube/v3/videos/getRating'
26
- params[:params] = {id: @video.id}
17
+ params[:params] = {id: @parent.id}
27
18
  params[:scope] = 'https://www.googleapis.com/auth/youtube'
28
19
  end
29
20
  end
@@ -0,0 +1,16 @@
1
+ require 'yt/collections/base'
2
+
3
+ module Yt
4
+ module Collections
5
+ class Resources < Base
6
+ def initialize(options = {})
7
+ @parent = options[:parent]
8
+ @auth = options[:auth]
9
+ end
10
+
11
+ def self.of(parent)
12
+ new parent: parent, auth: parent.auth
13
+ end
14
+ end
15
+ end
16
+ end
@@ -1,23 +1,9 @@
1
- require 'yt/collections/base'
1
+ require 'yt/collections/resources'
2
2
  require 'yt/models/snippet'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
- class Snippets < Base
7
-
8
- def initialize(options = {})
9
- @resource = options[:resource]
10
- @auth = options[:auth]
11
- end
12
-
13
- # @note Google API must have some caching layer by which if we try to
14
- # delete a snippet that we just created, we encounter an error.
15
- # To overcome this, if we have just updated the snippet, we must
16
- # wait some time before requesting it again.
17
- #
18
- def self.by_resource(resource)
19
- new resource: resource, auth: resource.auth
20
- end
6
+ class Snippets < Resources
21
7
 
22
8
  private
23
9
 
@@ -26,11 +12,11 @@ module Yt
26
12
  end
27
13
 
28
14
  def list_params
29
- resources_path = @resource.class.to_s.demodulize.underscore.pluralize
15
+ parents_path = @parent.class.to_s.demodulize.underscore.pluralize
30
16
  super.tap do |params|
31
- params[:params] = {id: @resource.id, part: 'snippet'}
17
+ params[:params] = {id: @parent.id, part: 'snippet'}
32
18
  params[:scope] = 'https://www.googleapis.com/auth/youtube.readonly'
33
- params[:path] = "/youtube/v3/#{resources_path}"
19
+ params[:path] = "/youtube/v3/#{parents_path}"
34
20
  end
35
21
  end
36
22
  end
@@ -3,16 +3,7 @@ require 'yt/models/subscription'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
- class Subscriptions < Base
7
-
8
- def initialize(options = {})
9
- @channel = options[:channel]
10
- @auth = options[:auth]
11
- end
12
-
13
- def self.by_channel(channel)
14
- new channel: channel, auth: channel.auth
15
- end
6
+ class Subscriptions < Resources
16
7
 
17
8
  def insert(options = {})
18
9
  throttle
@@ -22,7 +13,8 @@ module Yt
22
13
  end
23
14
 
24
15
  def delete_all(params = {}, options = {})
25
- do_delete_all(params) {throttle}
16
+ throttle
17
+ do_delete_all params
26
18
  end
27
19
 
28
20
  private
@@ -36,7 +28,7 @@ module Yt
36
28
  # To overcome this, if we have just updated the subscription, we must
37
29
  # wait some time before requesting it again.
38
30
  #
39
- def throttle(seconds = 10)
31
+ def throttle(seconds = 9)
40
32
  @last_changed_at ||= Time.now - seconds
41
33
  wait = [@last_changed_at - Time.now + seconds, 0].max
42
34
  sleep wait
@@ -50,7 +42,7 @@ module Yt
50
42
 
51
43
  def list_params
52
44
  super.tap do |params|
53
- params[:params] = {maxResults: 50, forChannelId: @channel.id, mine: true, part: 'snippet'}
45
+ params[:params] = {maxResults: 50, forChannelId: @parent.id, mine: true, part: 'snippet'}
54
46
  params[:scope] = 'https://www.googleapis.com/auth/youtube'
55
47
  params[:path] = '/youtube/v3/subscriptions'
56
48
  end
@@ -60,7 +52,7 @@ module Yt
60
52
  super.tap do |params|
61
53
  params[:path] = '/youtube/v3/subscriptions'
62
54
  params[:params] = {part: 'snippet'}
63
- params[:body] = {snippet: {resourceId: {channelId: @channel.id}}}
55
+ params[:body] = {snippet: {resourceId: {channelId: @parent.id}}}
64
56
  end
65
57
  end
66
58
  end
@@ -1,18 +1,9 @@
1
- require 'yt/collections/base'
1
+ require 'yt/collections/resources'
2
2
  require 'yt/models/user_info'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
- class UserInfos < Base
7
-
8
- def initialize(options = {})
9
- @account = options[:account]
10
- @auth = options[:auth]
11
- end
12
-
13
- def self.by_account(account)
14
- new account: account, auth: account.auth
15
- end
6
+ class UserInfos < Resources
16
7
 
17
8
  private
18
9
 
@@ -1,18 +1,9 @@
1
- require 'yt/collections/base'
1
+ require 'yt/collections/resources'
2
2
  require 'yt/models/video'
3
3
 
4
4
  module Yt
5
5
  module Collections
6
- class Videos < Base
7
-
8
- def initialize(options = {})
9
- @channel = options[:channel]
10
- @auth = options[:auth]
11
- end
12
-
13
- def self.by_channel(channel)
14
- new channel: channel, auth: channel.auth
15
- end
6
+ class Videos < Resources
16
7
 
17
8
  private
18
9
 
@@ -22,8 +13,8 @@ module Yt
22
13
 
23
14
  def list_params
24
15
  super.tap do |params|
25
- params[:params] = {channelId: @channel.id, type: :video, maxResults: 50, part: 'snippet'}
26
- params[:scope] = 'https://www.googleapis.com/auth/youtube'
16
+ params[:params] = {channelId: @parent.id, type: :video, maxResults: 50, part: 'snippet'}
17
+ params[:scope] = 'https://www.googleapis.com/auth/youtube.readonly'
27
18
  params[:path] = '/youtube/v3/search'
28
19
  end
29
20
  end
@@ -118,7 +118,12 @@ module Yt
118
118
 
119
119
  def timestamps
120
120
  @timestamps ||= positions.map do |pos|
121
- Time.parse(pos['t']) - Time.parse('0:00')
121
+ regex = %r{(?:|(?<hours>\d*):)(?:|(?<min>\d*):)(?<sec>\d*)\.(?<ms>\d*)}
122
+ match = pos['t'].match regex
123
+ hours = (match[:hours] || '0').to_i
124
+ minutes = (match[:min] || '0').to_i
125
+ seconds = (match[:sec]).to_i
126
+ (hours * 60 + minutes) * 60 + seconds
122
127
  end
123
128
  end
124
129
 
@@ -1,17 +1,9 @@
1
- require 'yt/models/base'
1
+ require 'yt/models/resource'
2
2
 
3
3
  module Yt
4
- class Channel < Base
5
- attr_reader :id, :auth
6
- has_one :snippet, delegate: [:title, :description, :thumbnail_url, :published_at]
4
+ class Channel < Resource
7
5
  has_many :subscriptions
8
6
  has_many :videos
9
7
  has_many :playlists
10
-
11
- def initialize(options = {})
12
- @id = options[:id]
13
- @auth = options[:auth]
14
- @snippet = Snippet.new(data: options[:snippet]) if options[:snippet]
15
- end
16
8
  end
17
9
  end
@@ -1,3 +1,5 @@
1
+ require 'yt/models/base'
2
+
1
3
  module Yt
2
4
  class DetailsSet < Base
3
5
 
@@ -22,10 +24,11 @@ module Yt
22
24
  # of minutes (or seconds) of the video. For example, a value of PT15M51S indicates
23
25
  # that the video is 15 minutes and 51 seconds long.
24
26
  def to_seconds(iso8601_duration)
25
- match = iso8601_duration.match %r{^PT(?:|(?<min>\d*?)M)(?:|(?<sec>\d*?)S)$}
27
+ match = iso8601_duration.match %r{^PT(?:|(?<hours>\d*?)H)(?:|(?<min>\d*?)M)(?:|(?<sec>\d*?)S)$}
28
+ hours = (match[:hours] || '0').to_i
26
29
  minutes = (match[:min] || '0').to_i
27
30
  seconds = (match[:sec]).to_i
28
- minutes * 60 + seconds
31
+ (hours * 60 + minutes) * 60 + seconds
29
32
  end
30
33
  end
31
34
  end
@@ -1,19 +1,9 @@
1
- require 'yt/models/base'
1
+ require 'yt/models/resource'
2
2
 
3
3
  module Yt
4
- class Playlist < Base
5
- attr_reader :id, :auth
6
- has_one :snippet, delegate: [:title, :description, :tags, :thumbnail_url, :published_at]
7
- has_one :status, delegate: [:privacy_status, :public?, :private?, :unlisted?]
4
+ class Playlist < Resource
8
5
  has_many :playlist_items
9
6
 
10
- def initialize(options = {})
11
- @id = options[:id]
12
- @snippet = Snippet.new(data: options[:snippet]) if options[:snippet]
13
- @status = Status.new(data: options[:status]) if options[:status]
14
- @auth = options[:auth]
15
- end
16
-
17
7
  def delete
18
8
  do_delete {@id = nil}
19
9
  !exists?
@@ -0,0 +1,16 @@
1
+ require 'yt/models/base'
2
+
3
+ module Yt
4
+ class Resource < Base
5
+ attr_reader :id, :auth
6
+ has_one :snippet, delegate: [:title, :description, :thumbnail_url, :published_at]
7
+ has_one :status, delegate: [:privacy_status, :public?, :private?, :unlisted?]
8
+
9
+ def initialize(options = {})
10
+ @id = options[:id]
11
+ @auth = options[:auth]
12
+ @snippet = Snippet.new(data: options[:snippet]) if options[:snippet]
13
+ @status = Status.new(data: options[:status]) if options[:status]
14
+ end
15
+ end
16
+ end
@@ -1,16 +1,9 @@
1
+ require 'yt/models/resource'
2
+
1
3
  module Yt
2
- class Video < Base
3
- has_many :annotations
4
+ class Video < Resource
4
5
  has_one :details_set, delegate: [:duration]
5
6
  has_one :rating
6
- has_one :snippet, delegate: [:title, :description, :tags, :thumbnail_url, :published_at]
7
-
8
- attr_reader :id, :auth
9
-
10
- def initialize(options = {})
11
- @id = options[:id]
12
- @auth = options[:auth]
13
- @snippet = Snippet.new(data: options[:snippet]) if options[:snippet]
14
- end
7
+ has_many :annotations
15
8
  end
16
9
  end
@@ -1,3 +1,3 @@
1
1
  module Yt
2
- VERSION = '0.4.4'
2
+ VERSION = '0.4.5'
3
3
  end
@@ -3,7 +3,7 @@ require 'yt/models/playlist'
3
3
  require 'yt/collections/playlist_items'
4
4
 
5
5
  describe Yt::Collections::PlaylistItems do
6
- subject(:collection) { Yt::Collections::PlaylistItems.new playlist: playlist }
6
+ subject(:collection) { Yt::Collections::PlaylistItems.new parent: playlist }
7
7
  let(:playlist) { Yt::Playlist.new }
8
8
 
9
9
  describe '#insert' do
@@ -107,19 +107,19 @@ describe Yt::Annotation do
107
107
  end
108
108
 
109
109
  describe '#starts_after and #starts_before' do
110
- context 'given an annotation with the first timestamp equal to 240 seconds' do
110
+ context 'given an annotation with the first timestamp equal to 1 hour' do
111
111
  let(:xml) { %Q{
112
112
  <segment>
113
113
  <movingRegion type="rect">
114
- <rectRegion d="0" h="17.7779998779" t="0:04.000" w="25.0" x="7.117000103" y="5.07000017166"/>
115
- <rectRegion d="0" h="17.7779998779" t="0:05.000" w="25.0" x="7.117000103" y="5.07000017166"/>
114
+ <rectRegion d="0" h="17.7779998779" t="01:00:01.000" w="25.0" x="7.117000103" y="5.07000017166"/>
115
+ <rectRegion d="0" h="17.7779998779" t="01:05:56.066" w="25.0" x="7.117000103" y="5.07000017166"/>
116
116
  </movingRegion>
117
117
  </segment>
118
118
  } }
119
- it { expect(annotation.starts_after? 230).to be_true }
120
- it { expect(annotation.starts_after? 250).to be_false }
121
- it { expect(annotation.starts_before? 230).to be_false }
122
- it { expect(annotation.starts_before? 250).to be_true }
119
+ it { expect(annotation.starts_after? 3600).to be_true }
120
+ it { expect(annotation.starts_after? 3610).to be_false }
121
+ it { expect(annotation.starts_before? 3600).to be_false }
122
+ it { expect(annotation.starts_before? 3610).to be_true }
123
123
  end
124
124
 
125
125
  context 'given an annotation without timestamps' do
@@ -5,6 +5,11 @@ describe Yt::DetailsSet do
5
5
  subject(:details_set) { Yt::DetailsSet.new data: data }
6
6
 
7
7
  describe '#duration' do
8
+ context 'given a details_set with duration in hours, minutes, seconds' do
9
+ let(:data) { {"duration"=>"PT1H18M52S"} }
10
+ it { expect(details_set.duration).to eq 4732 }
11
+ end
12
+
8
13
  context 'given a details_set with duration in minutes and seconds' do
9
14
  let(:data) { {"duration"=>"PT2M51S"} }
10
15
  it { expect(details_set.duration).to eq 171 }
data/yt.gemspec CHANGED
@@ -14,17 +14,19 @@ Gem::Specification.new do |spec|
14
14
  spec.homepage = "http://github.com/fullscreeninc/yt"
15
15
  spec.license = "MIT"
16
16
 
17
+ spec.required_ruby_version = '>= 1.9.3'
18
+
17
19
  spec.files = `git ls-files`.split($/)
18
20
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
19
21
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
20
22
  spec.require_paths = ["lib"]
21
23
 
22
- spec.add_dependency 'activesupport' # For Hash.from_xml, String.classify ...
24
+ spec.add_dependency 'activesupport' # '3 (Ruby 1.9) or 4 (Ruby 2)'
23
25
 
24
26
  # For development / Code coverage / Documentation
25
- spec.add_development_dependency 'bundler', '~> 1.3'
26
- spec.add_development_dependency 'rspec'
27
- spec.add_development_dependency 'rake'
28
- spec.add_development_dependency 'yard'
29
- spec.add_development_dependency 'coveralls'
27
+ spec.add_development_dependency 'bundler' #, '~> 1.0'
28
+ spec.add_development_dependency 'rspec' #, '~> 2.0'
29
+ spec.add_development_dependency 'rake' #, '~> 10.0'
30
+ spec.add_development_dependency 'yard' #, '~> 0.8.0'
31
+ spec.add_development_dependency 'coveralls' #, '~> 0.7.0'
30
32
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.4
4
+ version: 0.4.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claudio Baccigalupo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-05-10 00:00:00.000000000 Z
11
+ date: 2014-05-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -28,16 +28,16 @@ dependencies:
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - "~>"
31
+ - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '1.3'
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - "~>"
38
+ - - ">="
39
39
  - !ruby/object:Gem::Version
40
- version: '1.3'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
@@ -114,11 +114,15 @@ files:
114
114
  - Rakefile
115
115
  - TODO.md
116
116
  - bin/yt
117
+ - gemfiles/Gemfile.activesupport-3.x
118
+ - gemfiles/Gemfile.activesupport-4.x
117
119
  - lib/yt.rb
118
120
  - lib/yt/actions/delete.rb
119
121
  - lib/yt/actions/delete_all.rb
120
122
  - lib/yt/actions/insert.rb
121
123
  - lib/yt/actions/list.rb
124
+ - lib/yt/actions/request.rb
125
+ - lib/yt/actions/request_error.rb
122
126
  - lib/yt/actions/update.rb
123
127
  - lib/yt/associations.rb
124
128
  - lib/yt/associations/annotations.rb
@@ -139,6 +143,7 @@ files:
139
143
  - lib/yt/collections/playlist_items.rb
140
144
  - lib/yt/collections/playlists.rb
141
145
  - lib/yt/collections/ratings.rb
146
+ - lib/yt/collections/resources.rb
142
147
  - lib/yt/collections/snippets.rb
143
148
  - lib/yt/collections/subscriptions.rb
144
149
  - lib/yt/collections/user_infos.rb
@@ -154,12 +159,12 @@ files:
154
159
  - lib/yt/models/playlist.rb
155
160
  - lib/yt/models/playlist_item.rb
156
161
  - lib/yt/models/rating.rb
162
+ - lib/yt/models/resource.rb
157
163
  - lib/yt/models/snippet.rb
158
164
  - lib/yt/models/status.rb
159
165
  - lib/yt/models/subscription.rb
160
166
  - lib/yt/models/user_info.rb
161
167
  - lib/yt/models/video.rb
162
- - lib/yt/utils/request.rb
163
168
  - lib/yt/version.rb
164
169
  - spec/associations/device_auth/channels_spec.rb
165
170
  - spec/associations/device_auth/details_sets_spec.rb
@@ -218,7 +223,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
218
223
  requirements:
219
224
  - - ">="
220
225
  - !ruby/object:Gem::Version
221
- version: '0'
226
+ version: 1.9.3
222
227
  required_rubygems_version: !ruby/object:Gem::Requirement
223
228
  requirements:
224
229
  - - ">="