yt 0.7.0 → 0.7.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2a5cb2545b6f99eea1e0198c6109efd72a30c3eb
4
- data.tar.gz: 9c1782a564c0705ce405d867d4f4b0d29f1b7b34
3
+ metadata.gz: a68ecd01c6ad97c1ba1e12d81d98585021ed0fbd
4
+ data.tar.gz: b2449d697020efacdaf22a0c4a4a618148ad7e9a
5
5
  SHA512:
6
- metadata.gz: 9f10cbdd0d96b4cc395064814b0aa4cb85b6769ee71981415092797bb9d5931ce35e856560592c3960602e007798894a206df96e4454e60128f86216e7cc61a9
7
- data.tar.gz: 9966a633b35554e6716245eb7da8d786bd9f3d79cdf29c77c1bc09101b26348d5031f856e2a33e194ae8d64c9a600bbd131f1c88b44afc1ea2aeabc7f5300aaa
6
+ metadata.gz: f45cdebb0d4794bf071049b3ad71970dfccefcf25fd9957db5b830a3391cc8074894324127f167f32542b53292b48a375806946370d8b3e5061bdac49c07c823
7
+ data.tar.gz: fbc25da3f1f339b26e5fc701eddd8043ccbbb978112d8f19318d2e705494bf16ac6f46ab967de57e71921ca5f9bdaaec55d7565a6e31429d9075b2baa3fe2cad
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- yt (0.7.0)
4
+ yt (0.7.1)
5
5
  activesupport
6
6
 
7
7
  GEM
data/HISTORY.md CHANGED
@@ -4,6 +4,10 @@ v0.7 - 2014/06/18
4
4
  * [breaking change] Rename DetailsSet to ContentDetail
5
5
  * Add statistics_set to Video (views, likes, dislikes, favorites, comments)
6
6
  * Add statistics_set to Channel (views, comments, videos, subscribers)
7
+ * More snippet methods for Video (channel_id, channel_title, category_id, live_broadcast_content)
8
+ * More snippet methods for Playlist (channel_id, channel_title)
9
+ * More snippet methods for PlaylistItem (channel_id, channel_title, playlist_id, video_id)
10
+ * More status methods for PlaylistItem (privacy_status, public?, private?, unlisted?)
7
11
 
8
12
  v0.6 - 2014/06/05
9
13
  -----------------
data/README.md CHANGED
@@ -17,13 +17,8 @@ After [registering your app](#configuring-your-app), you can run commands like:
17
17
  ```ruby
18
18
  channel = Yt::Channel.new id: 'UCxO1tY8h1AhOz0T4ENwmpow'
19
19
  channel.title #=> "Fullscreen"
20
- channel.description #=> "The first media company for the connected generation."
21
20
  channel.public? #=> true
22
- channel.view_count #=> 421619
23
21
  channel.comment_count #=> 773
24
- channel.video_count #=> 13
25
- channel.subscriber_count #=> 136925
26
- channel.subscriber_count_visible? #=> true
27
22
  channel.videos.count #=> 13
28
23
  ```
29
24
 
@@ -63,7 +58,7 @@ Use [Yt::Account](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models/Acco
63
58
  account = Yt::Account.new access_token: 'ya29.1.ABCDEFGHIJ'
64
59
 
65
60
  account.email #=> .. your e-mail address..
66
- account.channel #=> #<Yt::Channel @id=...>
61
+ account.channel #=> #<Yt::Models::Channel @id=...>
67
62
  ```
68
63
 
69
64
  *All the above methods require authentication (see below).*
@@ -81,7 +76,7 @@ Use [Yt::ContentOwner](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models
81
76
  content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ'
82
77
 
83
78
  content_owner.partnered_channels.count #=> 12
84
- content_owner.partnered_channels.first #=> #<Yt::Channel @id=...>
79
+ content_owner.partnered_channels.first #=> #<Yt::Models::Channel @id=...>
85
80
  ```
86
81
 
87
82
  *All the above methods require authentication (see below).*
@@ -100,15 +95,25 @@ Use [Yt::Channel](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models/Chan
100
95
 
101
96
  ```ruby
102
97
  channel = Yt::Channel.new id: 'UCxO1tY8h1AhOz0T4ENwmpow'
98
+
103
99
  channel.title #=> "Fullscreen"
100
+ channel.description #=> "The first media company for the connected generation."
104
101
  channel.description.has_link_to_playlist? #=> false
102
+ channel.thumbnail_url #=> "https://yt3.ggpht.com/-KMnbKDBl60w/AAAAAAAAAAI/AAAAAAAAAAA/NjmFYOCVig4/s88-c-k-no/photo.jpg"
103
+ channel.published_at #=> 2006-03-23 06:13:25 UTC
105
104
  channel.public? #=> true
106
105
 
106
+ channel.view_count #=> 421619
107
+ channel.comment_count #=> 773
108
+ channel.video_count #=> 13
109
+ channel.subscriber_count #=> 136925
110
+ channel.subscriber_count_visible? #=> true
111
+
107
112
  channel.videos.count #=> 12
108
- channel.videos.first #=> #<Yt::Video @id=...>
113
+ channel.videos.first #=> #<Yt::Models::Video @id=...>
109
114
 
110
115
  channel.playlists.count #=> 2
111
- channel.playlists.first #=> #<Yt::Playlist @id=...>
116
+ channel.playlists.first #=> #<Yt::Models::Playlist @id=...>
112
117
  ```
113
118
 
114
119
  *The methods above do not require authentication.*
@@ -140,7 +145,6 @@ channel.views since: 3.days.ago, until: 2.days.ago #=> {Wed, 28 May 2014 => 12,
140
145
 
141
146
  *The methods above require to be authenticated as the channel’s content owner (see below).*
142
147
 
143
-
144
148
  Yt::Video
145
149
  -----------
146
150
 
@@ -152,13 +156,27 @@ Use [Yt::Video](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models/Video)
152
156
 
153
157
  ```ruby
154
158
  video = Yt::Video.new id: 'MESycYJytkU'
159
+
155
160
  video.title #=> "Fullscreen Creator Platform"
156
- video.duration #=> 63
157
- video.description.has_link_to_subscribe? #=> false
161
+ video.description #=> "The new Fullscreen Creator Platform gives creators and brands a suite of exclusive Fullscreen Apps to build, manage and monetize their YouTube audience..."
162
+ video.description.has_link_to_channel? #=> true
163
+ video.thumbnail_url #=> "https://i1.ytimg.com/vi/MESycYJytkU/default.jpg"
164
+ video.published_at #=> 2013-07-09 16:27:32 UTC
158
165
  video.public? #=> true
166
+ video.tags #=> []
167
+ video.channel_id #=> "UCxO1tY8h1AhOz0T4ENwmpow"
168
+ video.channel_title #=> "Fullscreen"
169
+ video.category_id #=> "22"
170
+ video.live_broadcast_content #=> "none"
171
+
172
+ video.duration #=> 86
173
+ video.hd? #=> true
174
+ video.stereoscopic? #=> false
175
+ video.captioned? #=> true
176
+ video.licensed? #=> false
159
177
 
160
178
  video.annotations.count #=> 1
161
- video.annotations.first #=> #<Yt::Annotation @id=...>
179
+ video.annotations.first #=> #<Yt::Models::Annotation @id=...>
162
180
  ```
163
181
 
164
182
  *The methods above do not require authentication.*
@@ -185,11 +203,19 @@ Use [Yt::Playlist](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models/Pla
185
203
 
186
204
  ```ruby
187
205
  playlist = Yt::Playlist.new id: 'PLSWYkYzOrPMRCK6j0UgryI8E0NHhoVdRc'
206
+
188
207
  playlist.title #=> "Fullscreen Features"
208
+ playlist.description #=> "You send us your best videos and we feature our favorite ones throughout the week!"
209
+ playlist.description.has_link_to_subscribe? #=> false
210
+ playlist.thumbnail_url #=> "https://i1.ytimg.com/vi/36kL2alg7Jk/default.jpg"
211
+ playlist.published_at #=> 2012-11-27 21:23:38 UTC
189
212
  playlist.public? #=> true
213
+ playlist.tags #=> []
214
+ playlist.channel_id #=> "UCxO1tY8h1AhOz0T4ENwmpow"
215
+ playlist.channel_title #=> "Fullscreen"
190
216
 
191
217
  playlist.playlist_items.count #=> 1
192
- playlist.playlist_items.first #=> #<Yt::PlaylistItem @id=...>
218
+ playlist.playlist_items.first #=> #<Yt::Models::PlaylistItem @id=...>
193
219
  playlist.playlist_items.first.position #=> 0
194
220
  playlist.playlist_items.first.video.title #=> "Fullscreen Creator Platform"
195
221
  ```
@@ -204,6 +230,40 @@ playlist.delete_playlist_items title: 'Fullscreen Creator Platform' #=> [true]
204
230
 
205
231
  *The methods above require to be authenticated as the playlist’s owner (see below).*
206
232
 
233
+ Yt::PlaylistItem
234
+ ----------------
235
+
236
+ Use [Yt::PlaylistItem](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models/PlaylistItem) to:
237
+
238
+ * read attributes of a playlist item
239
+ * delete a playlist item
240
+
241
+ ```ruby
242
+ item = Yt::PlaylistItem.new id: 'PLjW_GNR5Ir0GWEP_oveGBNjTvKkYyZfsna1TZDCBP-Z8'
243
+
244
+ item.title #=> "Titanium - David Guetta - Space Among Many Cover ft. Evan Chan and Glenna Roberts"
245
+ item.description #=> "CLICK to tweet this video: [...]"
246
+ item.description.has_link_to_channel? #=> true
247
+ item.thumbnail_url #=> "https://i1.ytimg.com/vi/W4GhTprSsOY/default.jpg"
248
+ item.published_at #=> 2012-12-22 19:38:02 UTC
249
+ item.public? #=> true
250
+ item.channel_id #=> "UCxO1tY8h1AhOz0T4ENwmpow"
251
+ item.channel_title #=> "Fullscreen"
252
+ item.playlist_id #=> "PLSWYkYzOrPMRCK6j0UgryI8E0NHhoVdRc"
253
+ item.position #=> 0
254
+ item.video_id #=> "W4GhTprSsOY"
255
+ item.video #=> #<Yt::Models::Video @id=...>
256
+
257
+ ```
258
+
259
+ *The methods above do not require authentication.*
260
+
261
+ ```ruby
262
+ item.delete #=> true
263
+ ```
264
+
265
+ *The methods above require to be authenticated as the playlist’s owner (see below).*
266
+
207
267
 
208
268
  Yt::Annotation
209
269
  --------------
@@ -346,7 +406,7 @@ To install on your system, run
346
406
 
347
407
  To use inside a bundled Ruby project, add this line to the Gemfile:
348
408
 
349
- gem 'yt', '~> 0.7.0'
409
+ gem 'yt', '~> 0.7.1'
350
410
 
351
411
  Since the gem follows [Semantic Versioning](http://semver.org),
352
412
  indicating the full version in your Gemfile (~> *major*.*minor*.*patch*)
@@ -10,7 +10,7 @@ module Yt
10
10
  # @return [Yt::Models::Snippet] a new snippet initialized with
11
11
  # one of the items returned by asking YouTube for a list of snippets.
12
12
  def new_item(data)
13
- Yt::Snippet.new data: data['snippet']
13
+ Yt::Snippet.new data: data['snippet'], auth: @auth
14
14
  end
15
15
 
16
16
  # @return [Hash] the parameters to submit to YouTube to get the
@@ -19,9 +19,15 @@ module Yt
19
19
  def list_params
20
20
  super.tap do |params|
21
21
  params[:params] = {id: @parent.id, part: 'snippet'}
22
- params[:path] = "/youtube/v3/#{@parent.kind.pluralize}"
23
22
  end
24
23
  end
24
+
25
+ # @private
26
+ # @note Snippets overrides +list_resources+ since the endpoint is not
27
+ # '/snippets' but the endpoint related to the snippet’s resource.
28
+ def list_resources
29
+ @parent.class.to_s.pluralize
30
+ end
25
31
  end
26
32
  end
27
33
  end
@@ -21,9 +21,15 @@ module Yt
21
21
  def list_params
22
22
  super.tap do |params|
23
23
  params[:params] = {id: @parent.id, part: 'status'}
24
- params[:path] = "/youtube/v3/#{@parent.kind.pluralize}"
25
24
  end
26
25
  end
26
+
27
+ # @private
28
+ # @note Statuses overrides +list_resources+ since the endpoint is not
29
+ # '/statuses' but the endpoint related to the snippet’s resource.
30
+ def list_resources
31
+ @parent.class.to_s.pluralize
32
+ end
27
33
  end
28
34
  end
29
35
  end
@@ -16,9 +16,8 @@ module Yt
16
16
  # @!attribute [r] user_info
17
17
  # @return [Yt::Models::UserInfo] the account’s profile information.
18
18
  has_one :user_info
19
- delegate :id, :email, :has_verified_email?, :gender, :name,
20
- :given_name, :family_name, :profile_url, :avatar_url,
21
- :locale, :hd, to: :user_info
19
+ delegate :id, :email, :has_verified_email?, :gender, :name, :given_name,
20
+ :family_name, :profile_url, :avatar_url, :locale, :hd, to: :user_info
22
21
 
23
22
  # @!attribute [r] videos
24
23
  # @return [Yt::Collections::Videos] the videos owned by the account.
@@ -22,12 +22,11 @@ module Yt
22
22
  # @return [Yt::Collections::Playlists] the channel’s playlists.
23
23
  has_many :playlists
24
24
 
25
-
26
25
  # @!attribute [r] statistics_set
27
26
  # @return [Yt::Models::StatisticsSet] the statistics for the video.
28
27
  has_one :statistics_set
29
28
  delegate :view_count, :comment_count, :video_count, :subscriber_count,
30
- :subscriber_count_visible?, to: :statistics_set
29
+ :subscriber_count_visible?, to: :statistics_set
31
30
 
32
31
  # Returns whether the authenticated account is subscribed to the channel.
33
32
  #
@@ -5,6 +5,7 @@ module Yt
5
5
  # Provides methods to interact with YouTube playlists.
6
6
  # @see https://developers.google.com/youtube/v3/docs/playlists
7
7
  class Playlist < Resource
8
+ delegate :tags, :channel_id, :channel_title, to: :snippet
8
9
 
9
10
  # @!attribute [r] playlist_items
10
11
  # @return [Yt::Collections::PlaylistItems] the playlist’s items.
@@ -1,28 +1,12 @@
1
- require 'yt/models/base'
1
+ require 'yt/models/resource'
2
2
 
3
3
  module Yt
4
4
  module Models
5
5
  # Provides methods to interact with YouTube playlist items.
6
6
  # @see https://developers.google.com/youtube/v3/docs/playlistItems
7
- class PlaylistItem < Base
8
- # @return [String] the ID that uniquely identify a YouTube playlist item.
9
- attr_reader :id
10
-
11
- # @return [String] the order in which the item appears in the playlist.
12
- # The value uses a zero-based index, so the first item has a position
13
- # of 0, the second item has a position of 1, and so forth.
14
- attr_reader :position
15
-
16
- attr_reader :video
17
-
18
- def initialize(options = {})
19
- @id = options[:id]
20
- @auth = options[:auth]
21
- if options[:snippet]
22
- @position = options[:snippet]['position']
23
- @video = Video.new video_params_for options
24
- end
25
- end
7
+ class PlaylistItem < Resource
8
+ delegate :channel_id, :channel_title, :playlist_id, :position, :video_id,
9
+ :video, to: :snippet
26
10
 
27
11
  def delete(options = {})
28
12
  do_delete {@id = nil}
@@ -43,14 +27,6 @@ module Yt
43
27
  params[:params] = {id: @id}
44
28
  end
45
29
  end
46
-
47
- def video_params_for(options = {})
48
- {}.tap do |params|
49
- params[:id] = options[:snippet].fetch('resourceId', {})['videoId']
50
- params[:snippet] = options[:snippet].except 'resourceId'
51
- params[:auth] = options[:auth]
52
- end
53
- end
54
30
  end
55
31
  end
56
32
  end
@@ -9,7 +9,7 @@ module Yt
9
9
 
10
10
  has_one :snippet
11
11
  delegate :title, :description, :thumbnail_url, :published_at,
12
- :tags, to: :snippet
12
+ to: :snippet
13
13
 
14
14
  has_one :status
15
15
  delegate :privacy_status, :public?, :private?, :unlisted?, to: :status
@@ -2,50 +2,123 @@ require 'yt/models/description'
2
2
 
3
3
  module Yt
4
4
  module Models
5
- # Encapsulates information about the snippet of a resource, for
6
- # instance a channel.
5
+ # Contains basic information about the resource. The details of the snippet
6
+ # are different for the different types of resources. Resources with a
7
+ # snippet are: channels, videos, playlists, playlist items.
7
8
  # @see https://developers.google.com/youtube/v3/docs/channels#resource
9
+ # @see https://developers.google.com/youtube/v3/docs/videos#resource
8
10
  class Snippet
9
11
  def initialize(options = {})
10
12
  @data = options[:data]
13
+ @auth = options[:auth]
11
14
  end
12
15
 
13
16
  # @return [String] the resource’s title.
17
+ # For channels: the channel’s title.
18
+ # For videos: the video’s title. Has a maximum of 100 characters and
19
+ # may contain all valid UTF-8 characters except < and >.
20
+ # For playlists: the playlist’s title.
21
+ # For playlist items: the item’s title.
14
22
  def title
15
23
  @title ||= @data.fetch 'title', ''
16
24
  end
17
25
 
18
26
  # @return [Yt::Models::Description] the resource’s description.
27
+ # For channels: the channel’s description. Has a maximum of 1000
28
+ # characters.
29
+ # For videos: the video’s description. Has a maximum of 5000 bytes and
30
+ # may contain all valid UTF-8 characters except < and >.
31
+ # For playlists: the playlist’s description.
32
+ # For playlist items: the item’s description.
19
33
  def description
20
34
  @description ||= Description.new @data.fetch('description', '')
21
35
  end
22
36
 
23
- # @return [Time or nil] the date and time that the resource was created.
37
+ # @return [Time] the date and time that the resource was published.
38
+ # For channels: the date and time that the channel was created.
39
+ # For videos: the date and time that the video was published.
40
+ # For playlists: the date and time that the playlist was created.
41
+ # For playlist items: the date and time that the item was added to the
42
+ # playlist.
24
43
  def published_at
25
44
  @published_at ||= Time.parse @data['publishedAt']
26
45
  end
27
46
 
28
- # Return the tags of a YouTube resource.
29
- #
30
- # @return [Array] An array of Yt::Tag object, one for each tag of the resource.
31
- #
32
- # @note YouTube API only includes tags in a resource’s snippet if the
33
- # resource is a video belonging to the authenticated account.
34
- def tags
35
- @tags ||= @data.fetch 'tags', []
36
- end
37
-
38
- # @return [String] a thumbnail image associated with the resource.
39
47
  # @param [Symbol or String] size The size of the thumbnail to retrieve.
40
- # Valid values are: default, medium, high.
41
- # For a resource that refers to a video, default equals 120x90px,
42
- # medium equals 320x180px, high equals 480x360px.
43
- # For a resource that refers to a channel, default equals 88x88px,
44
- # medium equals 240x240px, high equals 800x800px.
48
+ # @return [String or nil] a thumbnail image associated with the resource.
49
+ # For channels: sizes correspond to 88x88px (default), 240x240px
50
+ # (medium), and 800x800px (high).
51
+ # For videos, playlists, playlist items: sizes correspond to 120x90px
52
+ # (default), 320x180px (medium), and 480x360px (high).
45
53
  def thumbnail_url(size = :default)
46
54
  @thumbnails ||= @data.fetch 'thumbnails', {}
47
55
  @thumbnails.fetch(size.to_s, {})['url']
48
56
  end
57
+
58
+ # @return [String or nil] the ID of the related channel.
59
+ # For videos: the ID that YouTube uses to uniquely identify the
60
+ # channel that the video was uploaded to.
61
+ # For playlists: the ID that YouTube uses to uniquely identify the
62
+ # channel that published the playlist.
63
+ # For playlist items: the ID that YouTube uses to uniquely identify
64
+ # the user that added the item to the playlist.
65
+ def channel_id
66
+ @channel_id ||= @data['channelId']
67
+ end
68
+
69
+ # @return [String or nil] the title of the related channel.
70
+ # For videos: the title of the channel the video belongs to.
71
+ # For playlists: the title of the channel the playlist belongs to.
72
+ # For playlist items: the title of the channel the playlist item
73
+ # belongs to.
74
+ def channel_title
75
+ @channel_title ||= @data['channelTitle']
76
+ end
77
+
78
+ # @return [Array<Yt::Models::Tag>] A list of associated keyword tags.
79
+ # For videos: tags are only visible to the video’s uploader.
80
+ # For playlists: keyword tags associated with the playlist.
81
+ def tags
82
+ @tags ||= @data.fetch 'tags', []
83
+ end
84
+
85
+ # @return [String or nil] the YouTube video category associated with the
86
+ # video (for videos only).
87
+ # @see https://developers.google.com/youtube/v3/docs/videoCategories/list
88
+ def category_id
89
+ @category_id ||= @data['categoryId']
90
+ end
91
+
92
+ # @return [String or nil] whether the resource is an upcoming/active live
93
+ # broadcast. Valid values are: live, none, upcoming (for videos only).
94
+ def live_broadcast_content
95
+ @live_broadcast_content ||= @data['liveBroadcastContent']
96
+ end
97
+
98
+ # @return [String or nil] the ID that YouTube uses to uniquely identify
99
+ # the playlist that the item is in (for playlist items only).
100
+ def playlist_id
101
+ @playlist_id ||= @data['playlistId']
102
+ end
103
+
104
+ # @return [Integer or nil] the order in which the item appears in a
105
+ # playlist. The value is zero-based, so the first item has a position
106
+ # of 0, the second item of 1, and so forth (for playlist items only).
107
+ def position
108
+ @position ||= @data['position'].to_i
109
+ end
110
+
111
+ # @return [String or nil] the ID of the video the playlist item
112
+ # represents in the playlist (only for playlist items).
113
+ def video_id
114
+ @video_id ||= @data.fetch('resourceId', {})['videoId']
115
+ end
116
+
117
+ # @return [Yt::Models::Video or nil] the video the playlist item
118
+ # represents in the playlist (only for playlist items).
119
+ def video
120
+ @video ||= Video.new id: video_id, auth: @auth if video_id
121
+ end
49
122
  end
50
123
  end
51
124
  end
@@ -6,7 +6,6 @@ module Yt
6
6
  # the resource has been viewed or liked.
7
7
  # @see https://developers.google.com/youtube/v3/docs/videos#resource
8
8
  class StatisticsSet < Base
9
-
10
9
  def initialize(options = {})
11
10
  @data = options[:data]
12
11
  end
@@ -5,11 +5,14 @@ module Yt
5
5
  # Provides methods to interact with YouTube videos.
6
6
  # @see https://developers.google.com/youtube/v3/docs/videos
7
7
  class Video < Resource
8
+ delegate :tags, :channel_id, :channel_title, :category_id,
9
+ :live_broadcast_content, to: :snippet
10
+
8
11
  # @!attribute [r] content_detail
9
12
  # @return [Yt::Models::ContentDetail] the video’s content details.
10
13
  has_one :content_detail
11
14
  delegate :duration, :hd?, :stereoscopic?, :captioned?, :licensed?,
12
- to: :content_detail
15
+ to: :content_detail
13
16
 
14
17
  # @!attribute [r] rating
15
18
  # @return [Yt::Models::Rating] the video’s rating.
@@ -23,7 +26,7 @@ module Yt
23
26
  # @return [Yt::Models::StatisticsSet] the statistics for the video.
24
27
  has_one :statistics_set
25
28
  delegate :view_count, :like_count, :dislike_count, :favorite_count,
26
- :comment_count, to: :statistics_set
29
+ :comment_count, to: :statistics_set
27
30
 
28
31
  # Returns whether the authenticated account likes the video.
29
32
  #
@@ -1,3 +1,3 @@
1
1
  module Yt
2
- VERSION = '0.7.0'
2
+ VERSION = '0.7.1'
3
3
  end
@@ -4,88 +4,46 @@ require 'spec_helper'
4
4
  require 'yt/models/channel'
5
5
 
6
6
  describe Yt::Channel, :device_app do
7
- let(:channel) { Yt::Channel.new id: id, auth: $account }
7
+ subject(:channel) { Yt::Channel.new id: id, auth: $account }
8
8
 
9
- describe '.snippet of existing channel' do
9
+ context 'given someone else’s channel' do
10
10
  let(:id) { 'UCxO1tY8h1AhOz0T4ENwmpow' }
11
- it { expect(channel.snippet).to be_a Yt::Snippet }
12
- end
13
-
14
- describe '.snippet of unknown channel' do
15
- let(:id) { 'not-a-channel-id' }
16
- it { expect{channel.snippet}.to raise_error Yt::Errors::NoItems }
17
- end
18
-
19
- describe '.statistics_set of existing channel' do
20
- let(:id) { 'UCxO1tY8h1AhOz0T4ENwmpow' }
21
- it { expect(channel.statistics_set).to be_a Yt::StatisticsSet }
22
- end
23
11
 
24
- describe '.statistics_set of unknown channel' do
25
- let(:id) { 'not-a-channel-id' }
26
- it { expect{channel.statistics_set}.to raise_error Yt::Errors::NoItems }
27
- end
12
+ it 'returns valid snippet data' do
13
+ expect(channel.snippet).to be_a Yt::Snippet
14
+ expect(channel.title).to be_a String
15
+ expect(channel.description).to be_a Yt::Description
16
+ expect(channel.thumbnail_url).to be_a String
17
+ expect(channel.published_at).to be_a Time
18
+ end
28
19
 
29
- describe '.status of existing channel' do
30
- let(:id) { 'UCxO1tY8h1AhOz0T4ENwmpow' }
31
20
  it { expect(channel.status).to be_a Yt::Status }
32
- end
33
-
34
- describe '.status of unknown channel' do
35
- let(:id) { 'not-a-channel-id' }
36
- it { expect{channel.status}.to raise_error Yt::Errors::NoItems }
37
- end
38
-
39
- describe '.videos of existing channel' do
40
- let(:id) { 'UCxO1tY8h1AhOz0T4ENwmpow' }
21
+ it { expect(channel.statistics_set).to be_a Yt::StatisticsSet }
41
22
  it { expect(channel.videos).to be_a Yt::Collections::Videos }
42
- end
43
-
44
- describe '.videos of unknown channel starting with UC' do
45
- let(:id) { 'UC-not-a-channel-id' }
46
-
47
- # NOTE: This test is just a reflection of YouTube irrational behavior of
48
- # returns 0 results if the name of an unknown channel starts with UC, but
49
- # returning 100,000 results otherwise (ignoring the channel filter).
50
- it { expect(channel.videos.count).to be 0 }
51
- end
52
-
53
- describe '.subscriptions to an existing channel' do
54
- let(:id) { 'UCxO1tY8h1AhOz0T4ENwmpow' }
23
+ it { expect(channel.videos.first).to be_a Yt::Video }
24
+ it { expect(channel.playlists).to be_a Yt::Collections::Playlists }
25
+ it { expect(channel.playlists.first).to be_a Yt::Playlist }
26
+ it { expect{channel.create_playlist}.to raise_error Yt::Errors::RequestError }
27
+ it { expect{channel.delete_playlists}.to raise_error Yt::Errors::RequestError }
55
28
  it { expect(channel.subscriptions).to be_a Yt::Collections::Subscriptions }
56
29
 
57
30
  # NOTE: These tests are slow because we *must* wait some seconds between
58
31
  # subscribing and unsubscribing to a channel, otherwise YouTube will show
59
32
  # wrong (cached) data, such as a user is subscribed when he is not.
60
- context 'can be added', :slow do
33
+ context 'that I am not subscribed to', :slow do
61
34
  before { channel.unsubscribe }
62
35
  it { expect(channel.subscribed?).to be false }
63
36
  it { expect(channel.subscribe!).to be_truthy }
64
37
  end
65
38
 
66
- context 'can be removed', :slow do
39
+ context 'that I am subscribed to', :slow do
67
40
  before { channel.subscribe }
68
41
  it { expect(channel.subscribed?).to be true }
69
42
  it { expect(channel.unsubscribe!).to be_truthy }
70
43
  end
71
44
  end
72
45
 
73
- describe '.subscriptions to an unknown channel' do
74
- let(:id) { 'not-a-channel-id' }
75
- it { expect{channel.subscribe}.to raise_error Yt::Errors::RequestError }
76
- end
77
-
78
- describe '.subscriptions to my own channel' do
79
- let(:id) { $account.channel.id }
80
-
81
- # NOTE: This test is just a reflection of YouTube irrational behavior of
82
- # raising a 500 error when you try to subscribe to your own channel, rather
83
- # than a more logical 4xx error. Hopefully this will get fixed and this
84
- # code (and test) removed.
85
- it { expect{channel.subscribe}.to raise_error Yt::Errors::ServerError }
86
- end
87
-
88
- describe '.playlists of my own channel' do
46
+ context 'given my own channel' do
89
47
  let(:id) { $account.channel.id }
90
48
  let(:title) { 'Yt Test title' }
91
49
  let(:description) { 'Yt Test description' }
@@ -93,15 +51,13 @@ describe Yt::Channel, :device_app do
93
51
  let(:privacy_status) { 'unlisted' }
94
52
  let(:params) { {title: title, description: description, tags: tags, privacy_status: privacy_status} }
95
53
 
96
- it { expect(channel.playlists).to be_a Yt::Collections::Playlists }
97
-
98
- describe 'can be created' do
54
+ describe 'playlists can be added' do
99
55
  after { channel.delete_playlists params }
100
56
  it { expect(channel.create_playlist params).to be_a Yt::Playlist }
101
57
  it { expect{channel.create_playlist params}.to change{channel.playlists.count}.by(1) }
102
58
  end
103
59
 
104
- describe 'can be deleted' do
60
+ describe 'playlists can be deleted' do
105
61
  let(:title) { "Yt Test Delete All Playlists #{rand}" }
106
62
  before { channel.create_playlist params }
107
63
 
@@ -109,16 +65,29 @@ describe Yt::Channel, :device_app do
109
65
  it { expect(channel.delete_playlists params).to eq [true] }
110
66
  it { expect{channel.delete_playlists params}.to change{channel.playlists.count}.by(-1) }
111
67
  end
68
+
69
+ # NOTE: This test is just a reflection of YouTube irrational behavior of
70
+ # raising a 500 error when you try to subscribe to your own channel,
71
+ # rather than a more logical 4xx error. Hopefully this will get fixed
72
+ # and this code (and test) removed.
73
+ it { expect{channel.subscribe}.to raise_error Yt::Errors::ServerError }
112
74
  end
113
75
 
114
- describe '.playlists of someone else’s channel' do
115
- let(:id) { 'UCxO1tY8h1AhOz0T4ENwmpow' }
76
+ context 'given an unknown channel' do
77
+ let(:id) { 'not-a-channel-id' }
116
78
 
117
- it { expect(channel.playlists).to be_a Yt::Collections::Playlists }
79
+ it { expect{channel.snippet}.to raise_error Yt::Errors::NoItems }
80
+ it { expect{channel.status}.to raise_error Yt::Errors::NoItems }
81
+ it { expect{channel.statistics_set}.to raise_error Yt::Errors::NoItems }
82
+ it { expect{channel.subscribe}.to raise_error Yt::Errors::RequestError }
83
+
84
+ describe 'starting with UC' do
85
+ let(:id) { 'UC-not-a-channel-id' }
118
86
 
119
- describe 'cannot be created or destroyed' do
120
- it { expect{channel.create_playlist}.to raise_error Yt::Errors::RequestError }
121
- it { expect{channel.delete_playlists}.to raise_error Yt::Errors::RequestError }
87
+ # NOTE: This test is just a reflection of YouTube irrational behavior of
88
+ # returns 0 results if the name of an unknown channel starts with UC, but
89
+ # returning 100,000 results otherwise (ignoring the channel filter).
90
+ it { expect(channel.videos.count).to be 0 }
122
91
  end
123
92
  end
124
93
  end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+ require 'yt/models/playlist_item'
3
+
4
+ describe Yt::PlaylistItem, :device_app do
5
+ subject(:item) { Yt::PlaylistItem.new id: id, auth: $account }
6
+
7
+ context 'given an existing playlist item' do
8
+ let(:id) { 'PLjW_GNR5Ir0GWEP_oveGBNjTvKkYyZfsna1TZDCBP-Z8' }
9
+
10
+ it 'returns valid snippet data' do
11
+ expect(item.snippet).to be_a Yt::Snippet
12
+ expect(item.title).to be_a String
13
+ expect(item.description).to be_a Yt::Description
14
+ expect(item.thumbnail_url).to be_a String
15
+ expect(item.published_at).to be_a Time
16
+ expect(item.channel_id).to be_a String
17
+ expect(item.channel_title).to be_a String
18
+ expect(item.playlist_id).to be_a String
19
+ expect(item.position).to be_an Integer
20
+ expect(item.video_id).to be_a String
21
+ expect(item.video).to be_a Yt::Models::Video
22
+ end
23
+ end
24
+
25
+ context 'given an unknown playlist item' do
26
+ let(:id) { 'not-a-playlist-item-id' }
27
+
28
+ it { expect{item.snippet}.to raise_error Yt::Errors::RequestError }
29
+ end
30
+ end
@@ -4,53 +4,63 @@ require 'spec_helper'
4
4
  require 'yt/models/playlist'
5
5
 
6
6
  describe Yt::Playlist, :device_app do
7
- let(:playlist) { Yt::Playlist.new id: id, auth: $account }
7
+ subject(:playlist) { Yt::Playlist.new id: id, auth: $account }
8
8
 
9
- describe '.snippet of existing playlist' do
9
+ context 'given an existing playlist' do
10
10
  let(:id) { 'PLSWYkYzOrPMRCK6j0UgryI8E0NHhoVdRc' }
11
- it { expect(playlist.snippet).to be_a Yt::Snippet }
12
- end
13
11
 
14
- describe '.status of existing playlist' do
15
- let(:id) { 'PLSWYkYzOrPMRCK6j0UgryI8E0NHhoVdRc' }
12
+ it 'returns valid snippet data' do
13
+ expect(playlist.snippet).to be_a Yt::Snippet
14
+ expect(playlist.title).to be_a String
15
+ expect(playlist.description).to be_a Yt::Description
16
+ expect(playlist.thumbnail_url).to be_a String
17
+ expect(playlist.published_at).to be_a Time
18
+ expect(playlist.tags).to be_an Array
19
+ expect(playlist.channel_id).to be_a String
20
+ expect(playlist.channel_title).to be_a String
21
+ end
22
+
16
23
  it { expect(playlist.status).to be_a Yt::Status }
24
+ it { expect(playlist.playlist_items).to be_a Yt::Collections::PlaylistItems }
25
+ it { expect(playlist.playlist_items.first).to be_a Yt::PlaylistItem }
17
26
  end
18
27
 
19
- describe '.snippet of unknown playlist' do
28
+ context 'given an unknown playlist' do
20
29
  let(:id) { 'not-a-playlist-id' }
30
+
21
31
  it { expect{playlist.snippet}.to raise_error Yt::Errors::NoItems }
32
+ it { expect{playlist.status}.to raise_error Yt::Errors::NoItems }
22
33
  end
23
34
 
24
- describe '.status of unknown playlist' do
25
- let(:id) { 'not-a-playlist-id' }
26
- it { expect{playlist.status}.to raise_error Yt::Errors::NoItems }
35
+ context 'given someone else’s playlist' do
36
+ let(:id) { 'PLSWYkYzOrPMRCK6j0UgryI8E0NHhoVdRc' }
37
+ let(:video_id) { 'MESycYJytkU' }
38
+
39
+ it { expect{playlist.delete}.to fail.with 'forbidden' }
40
+ it { expect{playlist.update}.to fail.with 'forbidden' }
41
+ it { expect{playlist.add_video! video_id}.to raise_error Yt::Errors::RequestError }
42
+ it { expect{playlist.delete_playlist_items}.to raise_error Yt::Errors::RequestError }
27
43
  end
28
44
 
29
- describe '.delete on my own playlist' do
45
+ context 'given one of my own playlists that I want to delete' do
30
46
  before(:all) { @my_playlist = $account.create_playlist title: "Yt Test Delete Playlist #{rand}" }
31
47
  let(:id) { @my_playlist.id }
32
48
 
33
49
  it { expect(playlist.delete).to be true }
34
50
  end
35
51
 
36
- describe '.delete on someone else’s playlist' do
37
- let(:id) { 'PLSWYkYzOrPMRCK6j0UgryI8E0NHhoVdRc' }
38
-
39
- it { expect{playlist.delete}.to fail.with 'forbidden' }
40
- end
41
-
42
- describe '.update on my own playlist' do
52
+ context 'given one of my own playlists that I want to update' do
43
53
  before(:all) { @my_playlist = $account.create_playlist title: "Yt Test Update Playlist #{rand}" }
44
54
  after(:all) { @my_playlist.delete }
45
55
  let(:id) { @my_playlist.id }
46
56
 
47
- context 'changes the attributes that are specified to be updated' do
57
+ describe 'updates the attributes that I specify explicitly' do
48
58
  let(:attrs) { {title: "Yt Test Update Playlist #{rand} - new title"} }
49
59
  it { expect(playlist.update attrs).to eq true }
50
60
  it { expect{playlist.update attrs}.to change{playlist.title} }
51
61
  end
52
62
 
53
- context 'does not changes the attributes that are not specified to be updated' do
63
+ describe 'does not update the other attributes' do
54
64
  let(:attrs) { {} }
55
65
  it { expect(playlist.update attrs).to eq true }
56
66
  it { expect{playlist.update attrs}.not_to change{playlist.title} }
@@ -58,20 +68,6 @@ describe Yt::Playlist, :device_app do
58
68
  it { expect{playlist.update attrs}.not_to change{playlist.tags} }
59
69
  it { expect{playlist.update attrs}.not_to change{playlist.privacy_status} }
60
70
  end
61
- end
62
-
63
- describe '.update on someone else’s playlist' do
64
- let(:id) { 'PLSWYkYzOrPMRCK6j0UgryI8E0NHhoVdRc' }
65
-
66
- it { expect{playlist.update}.to fail.with 'forbidden' }
67
- end
68
-
69
- describe '.playlist_items of my own playlist' do
70
- before(:all) { @my_playlist = $account.create_playlist title: "Yt Test Items" }
71
- after(:all) { @my_playlist.delete }
72
- let(:id) { @my_playlist.id }
73
-
74
- it { expect(playlist.playlist_items).to be_a Yt::Collections::PlaylistItems }
75
71
 
76
72
  context 'given an existing video' do
77
73
  let(:video_id) { 'MESycYJytkU' }
@@ -121,16 +117,4 @@ describe Yt::Playlist, :device_app do
121
117
  end
122
118
  end
123
119
  end
124
-
125
- describe '.playlist_items of someone else’s playlist' do
126
- let(:id) { 'PLSWYkYzOrPMRCK6j0UgryI8E0NHhoVdRc' }
127
- let(:video_id) { 'MESycYJytkU' }
128
-
129
- it { expect(playlist.playlist_items).to be_a Yt::Collections::PlaylistItems }
130
-
131
- describe 'cannot be created or destroyed' do
132
- it { expect{playlist.add_video! video_id}.to raise_error Yt::Errors::RequestError }
133
- it { expect{playlist.delete_playlist_items}.to raise_error Yt::Errors::RequestError }
134
- end
135
- end
136
120
  end
@@ -8,7 +8,20 @@ describe Yt::Video, :device_app do
8
8
  let(:id) { 'MESycYJytkU' }
9
9
 
10
10
  it { expect(video.content_detail).to be_a Yt::ContentDetail }
11
- it { expect(video.snippet).to be_a Yt::Snippet }
11
+
12
+ it 'returns valid snippet data' do
13
+ expect(video.snippet).to be_a Yt::Snippet
14
+ expect(video.title).to be_a String
15
+ expect(video.description).to be_a Yt::Description
16
+ expect(video.thumbnail_url).to be_a String
17
+ expect(video.published_at).to be_a Time
18
+ expect(video.tags).to be_an Array
19
+ expect(video.channel_id).to be_a String
20
+ expect(video.channel_title).to be_a String
21
+ expect(video.category_id).to be_a String
22
+ expect(video.live_broadcast_content).to be_a String
23
+ end
24
+
12
25
  it { expect(video.rating).to be_a Yt::Rating }
13
26
  it { expect(video.status).to be_a Yt::Status }
14
27
  it { expect(video.statistics_set).to be_a Yt::StatisticsSet }
@@ -1,60 +1,42 @@
1
- # encoding: UTF-8
2
-
3
1
  require 'spec_helper'
4
2
  require 'yt/models/channel'
5
3
 
6
4
  describe Yt::Channel, :server_app do
7
- let(:channel) { Yt::Channel.new id: id }
8
-
9
- describe '.snippet of existing channel' do
10
- let(:id) { 'UCxO1tY8h1AhOz0T4ENwmpow' }
11
- it { expect(channel.snippet).to be_a Yt::Snippet }
12
- end
13
-
14
- describe '.snippet of unknown channel' do
15
- let(:id) { 'not-a-channel-id' }
16
- it { expect{channel.snippet}.to raise_error Yt::Errors::NoItems }
17
- end
5
+ subject(:channel) { Yt::Channel.new id: id }
18
6
 
19
- describe '.statistics_set of existing channel' do
7
+ context 'given an existing channel' do
20
8
  let(:id) { 'UCxO1tY8h1AhOz0T4ENwmpow' }
21
- it { expect(channel.statistics_set).to be_a Yt::StatisticsSet }
22
- end
23
9
 
24
- describe '.statistics_set of unknown channel' do
25
- let(:id) { 'not-a-channel-id' }
26
- it { expect{channel.statistics_set}.to raise_error Yt::Errors::NoItems }
27
- end
10
+ it 'returns valid snippet data' do
11
+ expect(channel.snippet).to be_a Yt::Snippet
12
+ expect(channel.title).to be_a String
13
+ expect(channel.description).to be_a Yt::Description
14
+ expect(channel.thumbnail_url).to be_a String
15
+ expect(channel.published_at).to be_a Time
16
+ end
28
17
 
29
- describe '.status of existing channel' do
30
- let(:id) { 'UCxO1tY8h1AhOz0T4ENwmpow' }
31
18
  it { expect(channel.status).to be_a Yt::Status }
32
- end
33
-
34
- describe '.status of unknown channel' do
35
- let(:id) { 'not-a-channel-id' }
36
- it { expect{channel.status}.to raise_error Yt::Errors::NoItems }
37
- end
38
-
39
- describe '.videos of existing channel' do
40
- let(:id) { 'UCxO1tY8h1AhOz0T4ENwmpow' }
19
+ it { expect(channel.statistics_set).to be_a Yt::StatisticsSet }
41
20
  it { expect(channel.videos).to be_a Yt::Collections::Videos }
42
21
  it { expect(channel.videos.first).to be_a Yt::Video }
22
+ it { expect(channel.playlists).to be_a Yt::Collections::Playlists }
23
+ it { expect(channel.playlists.first).to be_a Yt::Playlist }
43
24
  end
44
25
 
45
- describe '.videos of unknown channel starting with UC' do
46
- let(:id) { 'UC-not-a-channel-id' }
26
+ context 'given an unknown channel' do
27
+ let(:id) { 'not-a-channel-id' }
47
28
 
48
- # NOTE: This test is just a reflection of YouTube irrational behavior of
49
- # returns 0 results if the name of an unknown channel starts with UC, but
50
- # returning 100,000 results otherwise (ignoring the channel filter).
51
- it { expect(channel.videos.count).to be 0 }
52
- end
29
+ it { expect{channel.snippet}.to raise_error Yt::Errors::NoItems }
30
+ it { expect{channel.status}.to raise_error Yt::Errors::NoItems }
31
+ it { expect{channel.statistics_set}.to raise_error Yt::Errors::NoItems }
53
32
 
54
- describe '.playlists of someone else’s channel' do
55
- let(:id) { 'UCxO1tY8h1AhOz0T4ENwmpow' }
33
+ describe 'starting with UC' do
34
+ let(:id) { 'UC-not-a-channel-id' }
56
35
 
57
- it { expect(channel.playlists).to be_a Yt::Collections::Playlists }
58
- it { expect(channel.playlists.first).to be_a Yt::Playlist }
36
+ # NOTE: This test is just a reflection of YouTube irrational behavior of
37
+ # returns 0 results if the name of an unknown channel starts with UC, but
38
+ # returning 100,000 results otherwise (ignoring the channel filter).
39
+ it { expect(channel.videos.count).to be 0 }
40
+ end
59
41
  end
60
42
  end
@@ -0,0 +1,30 @@
1
+ require 'spec_helper'
2
+ require 'yt/models/playlist_item'
3
+
4
+ describe Yt::PlaylistItem, :server_app do
5
+ subject(:item) { Yt::PlaylistItem.new id: id }
6
+
7
+ context 'given an existing playlist item' do
8
+ let(:id) { 'PLjW_GNR5Ir0GWEP_oveGBNjTvKkYyZfsna1TZDCBP-Z8' }
9
+
10
+ it 'returns valid snippet data' do
11
+ expect(item.snippet).to be_a Yt::Snippet
12
+ expect(item.title).to be_a String
13
+ expect(item.description).to be_a Yt::Description
14
+ expect(item.thumbnail_url).to be_a String
15
+ expect(item.published_at).to be_a Time
16
+ expect(item.channel_id).to be_a String
17
+ expect(item.channel_title).to be_a String
18
+ expect(item.playlist_id).to be_a String
19
+ expect(item.position).to be_an Integer
20
+ expect(item.video_id).to be_a String
21
+ expect(item.video).to be_a Yt::Models::Video
22
+ end
23
+ end
24
+
25
+ context 'given an unknown playlist item' do
26
+ let(:id) { 'not-a-playlist-item-id' }
27
+
28
+ it { expect{item.snippet}.to raise_error Yt::Errors::RequestError }
29
+ end
30
+ end
@@ -1,36 +1,32 @@
1
- # encoding: UTF-8
2
-
3
1
  require 'spec_helper'
4
2
  require 'yt/models/playlist'
5
3
 
6
4
  describe Yt::Playlist, :server_app do
7
- let(:playlist) { Yt::Playlist.new id: id }
5
+ subject(:playlist) { Yt::Playlist.new id: id }
8
6
 
9
- describe '.snippet of existing playlist' do
7
+ context 'given an existing playlist' do
10
8
  let(:id) { 'PLSWYkYzOrPMRCK6j0UgryI8E0NHhoVdRc' }
11
- it { expect(playlist.snippet).to be_a Yt::Snippet }
12
- end
13
9
 
14
- describe '.status of existing playlist' do
15
- let(:id) { 'PLSWYkYzOrPMRCK6j0UgryI8E0NHhoVdRc' }
10
+ it 'returns valid snippet data' do
11
+ expect(playlist.snippet).to be_a Yt::Snippet
12
+ expect(playlist.title).to be_a String
13
+ expect(playlist.description).to be_a Yt::Description
14
+ expect(playlist.thumbnail_url).to be_a String
15
+ expect(playlist.published_at).to be_a Time
16
+ expect(playlist.tags).to be_an Array
17
+ expect(playlist.channel_id).to be_a String
18
+ expect(playlist.channel_title).to be_a String
19
+ end
20
+
16
21
  it { expect(playlist.status).to be_a Yt::Status }
22
+ it { expect(playlist.playlist_items).to be_a Yt::Collections::PlaylistItems }
23
+ it { expect(playlist.playlist_items.first).to be_a Yt::PlaylistItem }
17
24
  end
18
25
 
19
- describe '.snippet of unknown playlist' do
26
+ context 'given an unknown playlist' do
20
27
  let(:id) { 'not-a-playlist-id' }
21
- it { expect{playlist.snippet}.to raise_error Yt::Errors::NoItems }
22
- end
23
28
 
24
- describe '.status of unknown playlist' do
25
- let(:id) { 'not-a-playlist-id' }
29
+ it { expect{playlist.snippet}.to raise_error Yt::Errors::NoItems }
26
30
  it { expect{playlist.status}.to raise_error Yt::Errors::NoItems }
27
31
  end
28
-
29
- describe '.playlist_items of someone else’s playlist' do
30
- let(:id) { 'PLSWYkYzOrPMRCK6j0UgryI8E0NHhoVdRc' }
31
- let(:video_id) { 'MESycYJytkU' }
32
-
33
- it { expect(playlist.playlist_items).to be_a Yt::Collections::PlaylistItems }
34
- it { expect(playlist.playlist_items.first).to be_a Yt::PlaylistItem }
35
- end
36
- end
32
+ end
@@ -8,7 +8,20 @@ describe Yt::Video, :server_app do
8
8
  let(:id) { 'MESycYJytkU' }
9
9
 
10
10
  it { expect(video.content_detail).to be_a Yt::ContentDetail }
11
- it { expect(video.snippet).to be_a Yt::Snippet }
11
+
12
+ it 'returns valid snippet data' do
13
+ expect(video.snippet).to be_a Yt::Snippet
14
+ expect(video.title).to be_a String
15
+ expect(video.description).to be_a Yt::Description
16
+ expect(video.thumbnail_url).to be_a String
17
+ expect(video.published_at).to be_a Time
18
+ expect(video.tags).to be_an Array
19
+ expect(video.channel_id).to be_a String
20
+ expect(video.channel_title).to be_a String
21
+ expect(video.category_id).to be_a String
22
+ expect(video.live_broadcast_content).to be_a String
23
+ end
24
+
12
25
  it { expect(video.status).to be_a Yt::Status }
13
26
  it { expect(video.statistics_set).to be_a Yt::StatisticsSet }
14
27
  end
@@ -4,18 +4,17 @@ require 'yt/models/playlist_item'
4
4
  describe Yt::PlaylistItem do
5
5
  subject(:playlist_item) { Yt::PlaylistItem.new attrs }
6
6
 
7
- describe '#position' do
7
+ describe '#snippet' do
8
8
  context 'given fetching a playlist item returns a snippet' do
9
9
  let(:attrs) { {snippet: {"position"=>0}} }
10
- it { expect(playlist_item.position).to be 0 }
10
+ it { expect(playlist_item.snippet).to be_a Yt::Snippet }
11
11
  end
12
12
  end
13
13
 
14
- describe '#video' do
15
- context 'given fetching a playlist item returns a snippet' do
16
- let(:attrs) { {snippet: {"title"=>"Fullscreen"}} }
17
- it { expect(playlist_item.video).to be_a Yt::Video }
18
- it { expect(playlist_item.video.title).to eq "Fullscreen" }
14
+ describe '#status' do
15
+ context 'given fetching a playlist item returns a status' do
16
+ let(:attrs) { {status: {"privacyStatus"=>"public"}} }
17
+ it { expect(playlist_item.status).to be_a Yt::Status }
19
18
  end
20
19
  end
21
20
 
@@ -3,50 +3,50 @@ require 'yt/models/snippet'
3
3
 
4
4
  describe Yt::Snippet do
5
5
  subject(:snippet) { Yt::Snippet.new data: data }
6
+ let(:data) { {} }
6
7
 
7
8
  describe '#title' do
8
- context 'given fetching a snippet returns a title' do
9
+ context 'given a snippet with a title' do
9
10
  let(:data) { {"title"=>"Fullscreen"} }
10
11
  it { expect(snippet.title).to eq 'Fullscreen' }
11
12
  end
12
13
 
13
- context 'given fetching a snippet does not return a title' do
14
- let(:data) { {"description"=>"The first media company for the connected generation."} }
14
+ context 'given a snippet without a title' do
15
15
  it { expect(snippet.title).to eq '' }
16
16
  end
17
17
  end
18
18
 
19
- describe '#published_at' do # publishedAt is always returned by YouTube
20
- let(:data) { {"publishedAt"=>"2014-04-22T19:14:49.000Z"} }
21
- it { expect(snippet.published_at.year).to be 2014 }
19
+ describe '#published_at' do
20
+ context 'given a snippet with a timestamp' do # always returned by YouTube
21
+ let(:data) { {"publishedAt"=>"2014-04-22T19:14:49.000Z"} }
22
+ it { expect(snippet.published_at.year).to be 2014 }
23
+ end
22
24
  end
23
25
 
24
26
  describe '#description' do
25
- context 'given fetching a snippet returns a description' do
27
+ context 'given a snippet with a description' do
26
28
  let(:data) { {"description"=>"The first media company for the connected generation."} }
27
29
  it { expect(snippet.description).to eq 'The first media company for the connected generation.' }
28
30
  end
29
31
 
30
- context 'given fetching a snippet does not return a description' do
31
- let(:data) { {"title"=>"Fullscreen"} }
32
+ context 'given a snippet without a description' do
32
33
  it { expect(snippet.description).to eq '' }
33
34
  end
34
35
  end
35
36
 
36
37
  describe '#tags' do
37
- context 'given fetching a snippet returns some tags' do
38
+ context 'given a snippet with tags' do
38
39
  let(:data) { {"tags"=>["promotion", "new media"]} }
39
40
  it { expect(snippet.tags).to eq ["promotion", "new media"] }
40
41
  end
41
42
 
42
- context 'given fetching a snippet does not return any tag' do
43
- let(:data) { {"title"=>"Fullscreen"} }
43
+ context 'given a snippet without tags' do
44
44
  it { expect(snippet.tags).to eq [] }
45
45
  end
46
46
  end
47
47
 
48
48
  describe '#thumbnail_url' do
49
- context 'given fetching a snippet returns some thumbnails' do
49
+ context 'given a snippet with thumbnails' do
50
50
  let(:data) { {"thumbnails"=>{
51
51
  "default"=>{"url"=> "http://example.com/88x88.jpg"},
52
52
  "medium"=>{"url"=> "http://example.com/240x240.jpg"},
@@ -58,9 +58,66 @@ describe Yt::Snippet do
58
58
  it { expect(snippet.thumbnail_url :large).to be_nil }
59
59
  end
60
60
 
61
- context 'given fetching a snippet returns any thumbnail' do
62
- let(:data) { {"title"=>"Fullscreen"} }
61
+ context 'given a snippet without thumbnails' do
63
62
  it { expect(snippet.thumbnail_url).to be_nil }
64
63
  end
65
64
  end
65
+
66
+ describe '#channel_id' do
67
+ context 'given a snippet with a channel ID' do
68
+ let(:data) { {"channelId"=>"UCxO1tY8h1AhOz0T4ENwmpow"} }
69
+ it { expect(snippet.channel_id).to eq 'UCxO1tY8h1AhOz0T4ENwmpow' }
70
+ end
71
+
72
+ context 'given a snippet without a channel ID' do
73
+ it { expect(snippet.channel_id).to be_nil }
74
+ end
75
+ end
76
+
77
+ describe '#channel_title' do
78
+ context 'given a snippet with a channel title' do
79
+ let(:data) { {"channelTitle"=>"Fullscreen"} }
80
+ it { expect(snippet.channel_title).to eq 'Fullscreen' }
81
+ end
82
+
83
+ context 'given a snippet without a channel title' do
84
+ it { expect(snippet.channel_title).to be_nil }
85
+ end
86
+ end
87
+
88
+ describe '#category_id' do
89
+ context 'given a snippet with a category ID' do
90
+ let(:data) { {"categoryId"=>"22"} }
91
+ it { expect(snippet.category_id).to eq '22' }
92
+ end
93
+
94
+ context 'given a snippet without a category ID' do
95
+ it { expect(snippet.category_id).to be_nil }
96
+ end
97
+ end
98
+
99
+ describe '#live_broadcast_content' do
100
+ context 'given a snippet with live broadcast content' do
101
+ let(:data) { {"liveBroadcastContent"=>"live"} }
102
+ it { expect(snippet.live_broadcast_content).to eq 'live' }
103
+ end
104
+
105
+ context 'given a snippet without live broadcast content' do
106
+ it { expect(snippet.live_broadcast_content).to be_nil }
107
+ end
108
+ end
109
+
110
+ describe '#video_id and #video' do
111
+ context 'given a snippet with a video resource' do
112
+ let(:data) { {"resourceId"=>{"kind"=>"youtube#video","videoId"=>"W4GhTprSsOY"}} }
113
+ it { expect(snippet.video_id).to eq 'W4GhTprSsOY' }
114
+ it { expect(snippet.video).to be_a Yt::Models::Video }
115
+ it { expect(snippet.video.id).to eq 'W4GhTprSsOY' }
116
+ end
117
+
118
+ context 'given a snippet without a video resource' do
119
+ it { expect(snippet.video_id).to be_nil }
120
+ it { expect(snippet.video).to be_nil }
121
+ end
122
+ end
66
123
  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.7.0
4
+ version: 0.7.1
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-06-18 00:00:00.000000000 Z
11
+ date: 2014-06-19 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -178,12 +178,14 @@ files:
178
178
  - spec/associations/device_auth/channel_spec.rb
179
179
  - spec/associations/device_auth/content_owner_spec.rb
180
180
  - spec/associations/device_auth/earnings_spec.rb
181
+ - spec/associations/device_auth/playlist_item_spec.rb
181
182
  - spec/associations/device_auth/playlist_spec.rb
182
183
  - spec/associations/device_auth/resource_spec.rb
183
184
  - spec/associations/device_auth/video_spec.rb
184
185
  - spec/associations/device_auth/views_spec.rb
185
186
  - spec/associations/no_auth/video_spec.rb
186
187
  - spec/associations/server_auth/channel_spec.rb
188
+ - spec/associations/server_auth/playlist_item_spec.rb
187
189
  - spec/associations/server_auth/playlist_spec.rb
188
190
  - spec/associations/server_auth/resource_spec.rb
189
191
  - spec/associations/server_auth/video_spec.rb
@@ -254,12 +256,14 @@ test_files:
254
256
  - spec/associations/device_auth/channel_spec.rb
255
257
  - spec/associations/device_auth/content_owner_spec.rb
256
258
  - spec/associations/device_auth/earnings_spec.rb
259
+ - spec/associations/device_auth/playlist_item_spec.rb
257
260
  - spec/associations/device_auth/playlist_spec.rb
258
261
  - spec/associations/device_auth/resource_spec.rb
259
262
  - spec/associations/device_auth/video_spec.rb
260
263
  - spec/associations/device_auth/views_spec.rb
261
264
  - spec/associations/no_auth/video_spec.rb
262
265
  - spec/associations/server_auth/channel_spec.rb
266
+ - spec/associations/server_auth/playlist_item_spec.rb
263
267
  - spec/associations/server_auth/playlist_spec.rb
264
268
  - spec/associations/server_auth/resource_spec.rb
265
269
  - spec/associations/server_auth/video_spec.rb