yt 0.6.1 → 0.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (67) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +1 -0
  3. data/Gemfile.lock +1 -1
  4. data/HISTORY.md +3 -0
  5. data/README.md +5 -1
  6. data/TODO.md +0 -2
  7. data/bin/yt +2 -0
  8. data/lib/yt/actions/delete_all.rb +2 -2
  9. data/lib/yt/associations/authentications.rb +17 -2
  10. data/lib/yt/collections/base.rb +6 -0
  11. data/lib/yt/collections/statuses.rb +22 -0
  12. data/lib/yt/collections/subscriptions.rb +1 -1
  13. data/lib/yt/collections/videos.rb +6 -1
  14. data/lib/yt/models/account.rb +6 -12
  15. data/lib/yt/models/base.rb +28 -2
  16. data/lib/yt/models/channel.rb +37 -2
  17. data/lib/yt/models/playlist.rb +24 -0
  18. data/lib/yt/models/video.rb +19 -0
  19. data/lib/yt/version.rb +1 -1
  20. data/spec/associations/device_auth/account_spec.rb +31 -0
  21. data/spec/associations/device_auth/channel_spec.rb +114 -0
  22. data/spec/associations/device_auth/content_owner_spec.rb +8 -0
  23. data/spec/associations/device_auth/earnings_spec.rb +2 -0
  24. data/spec/associations/device_auth/playlist_spec.rb +136 -0
  25. data/spec/associations/device_auth/{ids_spec.rb → resource_spec.rb} +2 -2
  26. data/spec/associations/device_auth/video_spec.rb +42 -0
  27. data/spec/associations/no_auth/video_spec.rb +13 -0
  28. data/spec/associations/server_auth/channel_spec.rb +50 -0
  29. data/spec/associations/server_auth/playlist_spec.rb +36 -0
  30. data/spec/associations/server_auth/{ids_spec.rb → resource_spec.rb} +2 -2
  31. data/spec/associations/server_auth/video_spec.rb +22 -0
  32. data/spec/models/channel_spec.rb +7 -0
  33. metadata +25 -60
  34. data/lib/yt/associations.rb +0 -38
  35. data/lib/yt/associations/annotations.rb +0 -15
  36. data/lib/yt/associations/channels.rb +0 -20
  37. data/lib/yt/associations/details_sets.rb +0 -20
  38. data/lib/yt/associations/ids.rb +0 -20
  39. data/lib/yt/associations/partnered_channels.rb +0 -14
  40. data/lib/yt/associations/playlist_items.rb +0 -34
  41. data/lib/yt/associations/playlists.rb +0 -22
  42. data/lib/yt/associations/ratings.rb +0 -39
  43. data/lib/yt/associations/snippets.rb +0 -20
  44. data/lib/yt/associations/statuses.rb +0 -14
  45. data/lib/yt/associations/subscriptions.rb +0 -34
  46. data/lib/yt/associations/user_infos.rb +0 -21
  47. data/lib/yt/associations/videos.rb +0 -14
  48. data/spec/associations/device_auth/channels_spec.rb +0 -8
  49. data/spec/associations/device_auth/details_sets_spec.rb +0 -18
  50. data/spec/associations/device_auth/partnered_channels_spec.rb +0 -15
  51. data/spec/associations/device_auth/playlist_items_spec.rb +0 -79
  52. data/spec/associations/device_auth/playlists_spec.rb +0 -61
  53. data/spec/associations/device_auth/ratings_spec.rb +0 -28
  54. data/spec/associations/device_auth/snippets_spec.rb +0 -28
  55. data/spec/associations/device_auth/subscriptions_spec.rb +0 -35
  56. data/spec/associations/device_auth/user_infos_spec.rb +0 -12
  57. data/spec/associations/device_auth/videos_spec.rb +0 -20
  58. data/spec/associations/no_auth/annotations_spec.rb +0 -15
  59. data/spec/associations/server_auth/channels_spec.rb +0 -2
  60. data/spec/associations/server_auth/details_sets_spec.rb +0 -18
  61. data/spec/associations/server_auth/playlist_items_spec.rb +0 -17
  62. data/spec/associations/server_auth/playlists_spec.rb +0 -17
  63. data/spec/associations/server_auth/ratings_spec.rb +0 -2
  64. data/spec/associations/server_auth/snippets_spec.rb +0 -28
  65. data/spec/associations/server_auth/subscriptions_spec.rb +0 -2
  66. data/spec/associations/server_auth/user_infos_spec.rb +0 -2
  67. data/spec/associations/server_auth/videos_spec.rb +0 -20
@@ -1,38 +0,0 @@
1
- require 'active_support/core_ext/module/delegation'
2
- require 'active_support/dependencies/autoload'
3
- require 'active_support/core_ext/string/inflections' # for camelize
4
-
5
- module Yt
6
- module Associations
7
- # @note: Using Autoload to avoid circular dependencies.
8
- # For instance: Yt::Channel requires Yt::Base, which requires
9
- # Yt::Associations, which requires Yt::Associations::Subscription,
10
- # which requires Yt::Subscription, which requires Yt::Base
11
- extend ActiveSupport::Autoload
12
-
13
- autoload :Annotations
14
- autoload :Authentications
15
- autoload :Channels
16
- autoload :DetailsSets
17
- autoload :Earnings
18
- autoload :Ids
19
- autoload :PartneredChannels
20
- autoload :PlaylistItems
21
- autoload :Playlists
22
- autoload :Ratings
23
- autoload :Snippets
24
- autoload :Statuses
25
- autoload :Subscriptions
26
- autoload :UserInfos
27
- autoload :Videos
28
- autoload :Views
29
-
30
- def has_many(attributes, options = {})
31
- mod = attributes.to_s.sub(/.*\./, '').camelize
32
- include "Yt::Associations::#{mod.pluralize}".constantize
33
- delegate *options[:delegate], to: attributes if options[:delegate]
34
- end
35
-
36
- alias has_one has_many
37
- end
38
- end
@@ -1,15 +0,0 @@
1
- require 'yt/collections/annotations'
2
-
3
- module Yt
4
- module Associations
5
- # Provides the `has_many :annotations` method to YouTube resources,
6
- # which allows to access to content annotation set-specific methods.
7
- # YouTube resources with annotations are: videos.
8
- module Annotations
9
- def annotations
10
- @annotations ||= Collections::Annotations.of self
11
- end
12
- end
13
- end
14
- end
15
-
@@ -1,20 +0,0 @@
1
- require 'yt/collections/channels'
2
-
3
- module Yt
4
- module Associations
5
- # Provides the `has_one :channel` method to YouTube resources, which
6
- # allows to access to channel-specific methods like.
7
- # YouTube resources with a channel are: account.
8
- module Channels
9
- def channel
10
- @channel ||= channels.first
11
- end
12
-
13
- private
14
-
15
- def channels
16
- @channels ||= Collections::Channels.of self
17
- end
18
- end
19
- end
20
- end
@@ -1,20 +0,0 @@
1
- require 'yt/collections/details_sets'
2
-
3
- module Yt
4
- module Associations
5
- # Provides the `has_one :details_set` method to YouTube resources, which
6
- # allows to access to content detail set-specific methods like `duration`.
7
- # YouTube resources with content details are: videos.
8
- module DetailsSets
9
- def details_set
10
- @detail_set ||= details_sets.first!
11
- end
12
-
13
- private
14
-
15
- def details_sets
16
- @details_sets ||= Collections::DetailsSets.of self
17
- end
18
- end
19
- end
20
- end
@@ -1,20 +0,0 @@
1
- require 'yt/collections/ids'
2
-
3
- module Yt
4
- module Associations
5
- # Provides the `has_one :id` method to YouTube resources, which
6
- # allows to retrieve the id of a resource knowing only its username.
7
- # YouTube resources with ids are: resources.
8
- module Ids
9
- def id
10
- @id ||= ids.first!
11
- end
12
-
13
- private
14
-
15
- def ids
16
- @ids ||= Collections::Ids.of self
17
- end
18
- end
19
- end
20
- end
@@ -1,14 +0,0 @@
1
- require 'yt/collections/partnered_channels'
2
-
3
- module Yt
4
- module Associations
5
- # Provides the `has_many :partnered_channels` method to YouTube resources,
6
- # which allows to access to partnered channel-specific methods.
7
- # YouTube resources with a channel are: content owners.
8
- module PartneredChannels
9
- def partnered_channels
10
- @partnered_channels ||= Collections::PartneredChannels.of self
11
- end
12
- end
13
- end
14
- end
@@ -1,34 +0,0 @@
1
- require 'yt/collections/playlist_items'
2
-
3
- module Yt
4
- module Associations
5
- # Provides the `has_many :playlist_items` method to YouTube resources, which
6
- # allows to invoke playlist_item-related methods, such as .add_video.
7
- # YouTube resources with playlist items are: playlists.
8
- module PlaylistItems
9
- def playlist_items
10
- @playlist_items ||= Collections::PlaylistItems.of self
11
- end
12
-
13
- def add_video(video_id)
14
- playlist_items.insert({id: video_id, kind: :video}, ignore_errors: true)
15
- end
16
-
17
- def add_video!(video_id)
18
- playlist_items.insert id: video_id, kind: :video
19
- end
20
-
21
- def add_videos(video_ids = [])
22
- video_ids.map{|video_id| add_video video_id}
23
- end
24
-
25
- def add_videos!(video_ids = [])
26
- video_ids.map{|video_id| add_video! video_id}
27
- end
28
-
29
- def delete_playlist_items(attrs = {})
30
- playlist_items.delete_all attrs
31
- end
32
- end
33
- end
34
- end
@@ -1,22 +0,0 @@
1
- require 'yt/collections/playlists'
2
-
3
- module Yt
4
- module Associations
5
- # Provides the `has_many :playlists` method to YouTube resources, which
6
- # allows to invoke playlist-related methods, such as .create_playlist.
7
- # YouTube resources with playlist are: channels.
8
- module Playlists
9
- def playlists
10
- @playlists ||= Collections::Playlists.of self
11
- end
12
-
13
- def create_playlist(params = {})
14
- playlists.insert params
15
- end
16
-
17
- def delete_playlists(attrs = {})
18
- playlists.delete_all attrs
19
- end
20
- end
21
- end
22
- end
@@ -1,39 +0,0 @@
1
- require 'yt/collections/ratings'
2
-
3
- module Yt
4
- module Associations
5
- # Provides the `has_one :rating` method to YouTube resources, which
6
- # allows to invoke rating-related methods, such as .like.
7
- # YouTube resources with rating are: videos.
8
- module Ratings
9
- def rating
10
- @rating ||= ratings.first
11
- end
12
-
13
- def liked?
14
- rating.rating == :like
15
- end
16
-
17
- def like
18
- rating.update :like
19
- liked?
20
- end
21
-
22
- def dislike
23
- rating.update :dislike
24
- !liked?
25
- end
26
-
27
- def unlike
28
- rating.update :none
29
- !liked?
30
- end
31
-
32
- private
33
-
34
- def ratings
35
- @ratings ||= Collections::Ratings.of self
36
- end
37
- end
38
- end
39
- end
@@ -1,20 +0,0 @@
1
- require 'yt/collections/snippets'
2
-
3
- module Yt
4
- module Associations
5
- # Provides the `has_one :snippet` method to YouTube resources, which
6
- # allows to access to content detail set-specific methods like `title`.
7
- # YouTube resources with content details are: videos and channels.
8
- module Snippets
9
- def snippet
10
- @snippet ||= snippets.first!
11
- end
12
-
13
- private
14
-
15
- def snippets
16
- @snippets ||= Collections::Snippets.of self
17
- end
18
- end
19
- end
20
- end
@@ -1,14 +0,0 @@
1
- require 'yt/models/status'
2
-
3
- module Yt
4
- module Associations
5
- # Provides the `has_one :status` method to YouTube resources, which
6
- # allows to access to status-specific methods like `public?`.
7
- # YouTube resources with status are: playlists.
8
- module Statuses
9
- def status
10
- @status
11
- end
12
- end
13
- end
14
- end
@@ -1,34 +0,0 @@
1
- require 'yt/collections/subscriptions'
2
-
3
- module Yt
4
- module Associations
5
- # Provides the `has_one :subscription` method to YouTube resources, which
6
- # allows to invoke subscription-related methods, such as .subscribe.
7
- # YouTube resources with subscription are: channels.
8
- module Subscriptions
9
- def subscriptions
10
- @subscriptions ||= Collections::Subscriptions.of self
11
- end
12
-
13
- def subscribed?
14
- subscriptions.any?{|s| s.exists?}
15
- end
16
-
17
- def subscribe
18
- subscriptions.insert ignore_errors: true
19
- end
20
-
21
- def subscribe!
22
- subscriptions.insert
23
- end
24
-
25
- def unsubscribe
26
- subscriptions.delete_all({}, ignore_errors: true)
27
- end
28
-
29
- def unsubscribe!
30
- subscriptions.delete_all
31
- end
32
- end
33
- end
34
- end
@@ -1,21 +0,0 @@
1
- require 'yt/collections/user_infos'
2
-
3
- module Yt
4
- module Associations
5
- # Provides the `has_one :user_info` method to YouTube resources, which
6
- # allows to access to user_info-specific methods like `email`.
7
- # YouTube resources with user infos are: accounts.
8
- module UserInfos
9
- def user_info
10
- @user_info ||= user_infos.first!
11
- end
12
-
13
- private
14
-
15
- def user_infos
16
- @user_infos ||= Collections::UserInfos.of self
17
- end
18
- end
19
- end
20
- end
21
-
@@ -1,14 +0,0 @@
1
- require 'yt/collections/videos'
2
-
3
- module Yt
4
- module Associations
5
- # Provides the `has_many :videos` method to YouTube resources, which
6
- # allows to access only the videos that belong to a specific resource.
7
- # YouTube resources with videos are: channels.
8
- module Videos
9
- def videos
10
- @videos ||= Collections::Videos.of self
11
- end
12
- end
13
- end
14
- end
@@ -1,8 +0,0 @@
1
- require 'spec_helper'
2
- require 'yt/associations/channels'
3
-
4
- describe Yt::Associations::Channels, :device_app do
5
- describe '#channel' do
6
- it { expect($account.channel).to be_a Yt::Channel }
7
- end
8
- end
@@ -1,18 +0,0 @@
1
- require 'spec_helper'
2
- require 'yt/associations/details_sets'
3
-
4
- describe Yt::Associations::DetailsSets, :device_app do
5
- let(:video) { Yt::Video.new id: 'fsdfsfsdMESycYJytkU', auth: $account }
6
-
7
- describe '#details_set' do
8
- context 'given an existing video' do
9
- let(:video) { Yt::Video.new id: 'MESycYJytkU', auth: $account }
10
- it { expect(video.details_set).to be_a Yt::DetailsSet }
11
- end
12
-
13
- context 'given an unknown video' do
14
- let(:video) { Yt::Video.new id: 'not-a-video-id', auth: $account }
15
- it { expect{video.details_set}.to raise_error Yt::Errors::NoItems }
16
- end
17
- end
18
- end
@@ -1,15 +0,0 @@
1
- require 'spec_helper'
2
-
3
- describe Yt::Associations::PartneredChannels, :partner do
4
- describe '#partnered_channels' do
5
- let(:partnered_channels) { content_owner.partnered_channels }
6
-
7
- context 'given a content owner with partnered channels' do
8
- let(:content_owner) { $content_owner }
9
-
10
- # NOTE: Uncomment once size does not runs through *all* the pages
11
- # it { expect(partnered_channels.size).to be > 0 }
12
- it { expect(partnered_channels.first).to be_a Yt::Channel }
13
- end
14
- end
15
- end
@@ -1,79 +0,0 @@
1
- require 'spec_helper'
2
- require 'yt/associations/playlist_items'
3
-
4
- # TODO: Delete playlist item after tests that create them
5
-
6
- describe Yt::Associations::PlaylistItems, :device_app do
7
- before:all do
8
- @playlist = $account.create_playlist title: "Yt Test Playlist Items"
9
- end
10
- after(:all) { @playlist.delete }
11
-
12
- describe '#playlist_items' do
13
- let(:video_id) { 'MESycYJytkU' }
14
- before { @playlist.add_video video_id }
15
-
16
- it { expect(@playlist.playlist_items.count).to be > 0 }
17
- it { expect(@playlist.playlist_items.first).to be_a Yt::PlaylistItem }
18
- end
19
-
20
- describe '#add_video' do
21
- context 'given an existing video' do
22
- let(:video_id) { 'MESycYJytkU' }
23
- it { expect(@playlist.add_video video_id).to be_a Yt::PlaylistItem }
24
- it { expect{@playlist.add_video video_id}.to change{@playlist.playlist_items.count}.by(1) }
25
- end
26
-
27
- context 'given an unknown video' do
28
- let(:video_id) { 'not-a-video' }
29
- it { expect(@playlist.add_video video_id).to be_nil }
30
- it { expect{@playlist.add_video video_id}.not_to change{@playlist.playlist_items.count} }
31
- end
32
-
33
- context 'given a video of a terminated account' do
34
- let(:video_id) { 'kDCpdKeTe5g' }
35
- it { expect(@playlist.add_video video_id).to be_nil }
36
- it { expect{@playlist.add_video video_id}.not_to change{@playlist.playlist_items.count} }
37
- end
38
- end
39
-
40
- describe '#add_video!' do
41
- context 'given an existing video' do
42
- let(:video_id) { 'MESycYJytkU' }
43
- it { expect(@playlist.add_video video_id).to be_a Yt::PlaylistItem }
44
- end
45
-
46
- context 'given an unknown video' do
47
- let(:video_id) { 'not-a-video' }
48
- it { expect{@playlist.add_video! video_id}.to fail.with 'videoNotFound' }
49
- end
50
-
51
- context 'given a video of a terminated account' do
52
- let(:video_id) { 'kDCpdKeTe5g' }
53
- it { expect{@playlist.add_video! video_id}.to fail.with 'forbidden' }
54
- end
55
- end
56
-
57
- describe '#add_videos' do
58
- context 'given one existing and one unknown video' do
59
- let(:video_ids) { ['MESycYJytkU', 'not-a-video'] }
60
- it { expect(@playlist.add_videos(video_ids).length).to eq 2 }
61
- it { expect{@playlist.add_videos video_ids}.to change{@playlist.playlist_items.count}.by(1) }
62
- end
63
- end
64
-
65
- describe '#add_videos!' do
66
- context 'given one existing and one unknown video' do
67
- let(:video_ids) { ['MESycYJytkU', 'not-a-video'] }
68
- it { expect{@playlist.add_videos! video_ids}.to fail.with 'videoNotFound'}
69
- end
70
- end
71
-
72
- describe '#delete_playlist_items' do
73
- let(:video_id) { 'MESycYJytkU' }
74
- before { @playlist.add_video video_id }
75
-
76
- it { expect(@playlist.delete_playlist_items.uniq).to eq [true] }
77
- it { expect{@playlist.delete_playlist_items}.to change{@playlist.playlist_items.count} }
78
- end
79
- end