yt 0.32.3 → 0.32.4

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 (36) hide show
  1. checksums.yaml +4 -4
  2. data/.rspec +4 -1
  3. data/.travis.yml +2 -4
  4. data/CHANGELOG.md +9 -0
  5. data/README.md +54 -30
  6. data/lib/yt/actions/get.rb +33 -0
  7. data/lib/yt/collections/claims.rb +8 -0
  8. data/lib/yt/collections/content_owners.rb +6 -2
  9. data/lib/yt/collections/snippets.rb +1 -1
  10. data/lib/yt/config.rb +54 -0
  11. data/lib/yt/models/asset.rb +17 -3
  12. data/lib/yt/models/asset_metadata.rb +1 -1
  13. data/lib/yt/models/base.rb +2 -0
  14. data/lib/yt/models/claim.rb +11 -0
  15. data/lib/yt/models/configuration.rb +70 -0
  16. data/lib/yt/models/content_owner.rb +29 -0
  17. data/lib/yt/models/resource.rb +1 -1
  18. data/lib/yt/version.rb +1 -1
  19. data/spec/collections/claims_spec.rb +34 -2
  20. data/spec/models/asset_spec.rb +13 -1
  21. data/spec/models/configuration_spec.rb +44 -0
  22. data/spec/requests/as_account/account_spec.rb +1 -6
  23. data/spec/requests/as_account/channel_spec.rb +1 -1
  24. data/spec/requests/as_account/playlist_item_spec.rb +2 -2
  25. data/spec/requests/as_account/playlist_spec.rb +4 -4
  26. data/spec/requests/as_account/video_spec.rb +5 -5
  27. data/spec/requests/as_content_owner/account_spec.rb +1 -1
  28. data/spec/requests/as_content_owner/asset_spec.rb +16 -5
  29. data/spec/requests/as_content_owner/claim_spec.rb +17 -0
  30. data/spec/requests/as_content_owner/content_owner_spec.rb +51 -10
  31. data/spec/requests/as_server_app/channel_spec.rb +3 -3
  32. data/spec/requests/as_server_app/comment_thread_spec.rb +2 -2
  33. data/spec/requests/as_server_app/playlist_item_spec.rb +2 -2
  34. data/spec/requests/as_server_app/playlist_spec.rb +2 -2
  35. data/yt.gemspec +1 -1
  36. metadata +18 -11
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 13d05d40be2a978569b4d9d95088169b27efbca654c6ac31e8cc80d404a2ccc3
4
- data.tar.gz: 5ac7a2bf2c181a01f4f94af8399e1b5896160f4f60964cc8f12f02ab61688e5f
3
+ metadata.gz: b60bee886ed9551a6b9590fa99ad1146472dc90d332a50854a0d7ba490b40f93
4
+ data.tar.gz: 72e08ae6b64e508e873a1d47f00c71e021d994bfb3bb65b2c1b52e4e6709950a
5
5
  SHA512:
6
- metadata.gz: fc36a64935d1888ee29a6e93bf076a020d249598564117ad8da8df71eadefd4c0030ccb9f213ef9537f2a7f4428d2a37084b8e72126a7ac2c8e4e00772fc818c
7
- data.tar.gz: 7442494554ac18854f428149a591cf4f36eacce42b0c9f78053f2ff4cad792bb99f95bb1bfd963c49b5046357515ebd28fe67ecac62338999e933a1e8cfed289
6
+ metadata.gz: 87f08494b156a1846e63eff41c154cbfc462e1a65c1391bdc530ae1a84ef891150b72b0e604359a2d20d45a5fd0db88a7429c38ffa80b3a2f721b25452ebd119
7
+ data.tar.gz: 0453b6e46b53d2c3b2c0ffcdccd0daba325c97f96ebfacb37939172e6137c271236f94ef2fc05d25a6df3b8784c84040ab4b71064ea861b10e90e201a3198128
data/.rspec CHANGED
@@ -1,3 +1,6 @@
1
1
  --format documentation
2
2
  --color
3
- --fail-fast
3
+ --tag ~rate_limited
4
+ --tag ~flaky
5
+ --tag ~extended_permissions
6
+ --exclude_pattern spec/requests/as_content_owner/*_spec.rb
@@ -3,7 +3,5 @@ notifications:
3
3
  email: true
4
4
  matrix:
5
5
  include:
6
- - rvm: 1.9.3
7
- gemfile: gemfiles/Gemfile.activesupport-3.x
8
- - rvm: 2.0.0
9
- gemfile: gemfiles/Gemfile.activesupport-4.x
6
+ - rvm: 2.6.3
7
+ gemfile: gemfiles/Gemfile.activesupport-4.x
@@ -6,6 +6,15 @@ For more information about changelogs, check
6
6
  [Keep a Changelog](http://keepachangelog.com) and
7
7
  [Vandamme](http://tech-angels.github.io/vandamme).
8
8
 
9
+ ## 0.32.4 - 2019-06-26
10
+
11
+ * [FEATURE] Add `ownership_effective` method to access asset ownership ("effective") via the asset object.
12
+ * [FEATURE] List content owners of others with `content_owner.content_owners`
13
+ * [FEATURE] Add `match_info` to insert claim request.
14
+ * [FEATURE] Add `upload_reference_file` method for Reference file upload (thank you @jcohenho)
15
+ * [FEATURE] Get one asset [by request](https://developers.google.com/youtube/partner/docs/v1/assets/get) (thank you @jcohenho)
16
+ * [FEATURE] Add `update` method to Yt::Claim (thank you @jcohenho)
17
+
9
18
  ## 0.32.3 - 2019-03-15
10
19
 
11
20
  * [ENHANCEMENT] Add `Yt::URL` to get id, kind, and its resource (channel, video, playlist)
data/README.md CHANGED
@@ -8,7 +8,7 @@ The **source code** is available on [GitHub](https://github.com/Fullscreen/yt) a
8
8
  [![Build Status](http://img.shields.io/travis/Fullscreen/yt/master.svg)](https://travis-ci.org/Fullscreen/yt)
9
9
  [![Coverage Status](http://img.shields.io/coveralls/Fullscreen/yt/master.svg)](https://coveralls.io/r/Fullscreen/yt)
10
10
  [![Dependency Status](http://img.shields.io/gemnasium/Fullscreen/yt.svg)](https://gemnasium.com/Fullscreen/yt)
11
- [![Code Climate](http://img.shields.io/codeclimate/github/Fullscreen/yt.svg)](https://codeclimate.com/github/Fullscreen/yt)
11
+ [![Code Climate](https://codeclimate.com/github/Fullscreen/yt.png)](https://codeclimate.com/github/Fullscreen/yt)
12
12
  [![Online docs](http://img.shields.io/badge/docs-✓-green.svg)](http://www.rubydoc.info/gems/yt/frames)
13
13
  [![Gem Version](http://img.shields.io/gem/v/yt.svg)](http://rubygems.org/gems/yt)
14
14
 
@@ -44,7 +44,7 @@ To install on your system, run
44
44
 
45
45
  To use inside a bundled Ruby project, add this line to the Gemfile:
46
46
 
47
- gem 'yt', '~> 0.28.0'
47
+ gem 'yt', '~> 0.32.0'
48
48
 
49
49
  Since the gem follows [Semantic Versioning](http://semver.org),
50
50
  indicating the full version in your Gemfile (~> *major*.*minor*.*patch*)
@@ -266,6 +266,11 @@ asset = content_owner.assets.where(id: 'A969176766549462', fetch_metadata: 'effe
266
266
  asset.metadata_effective.title #=> "Neu la anh" (different due to ownership conflicts)
267
267
  ```
268
268
 
269
+ ```ruby
270
+ asset = content_owner.assets.where(id: 'A125058570526569', fetch_ownership: 'effective').first
271
+ asset.ownership_effective.general_owners.first.owner # => "XOuN81q-MeEUVrsiZeK1lQ"
272
+ ```
273
+
269
274
  * to search for an asset
270
275
 
271
276
  ```ruby
@@ -295,6 +300,32 @@ claim.claim_history #=> #<Yt::Models::ClaimHistory ...>
295
300
  claim.claim_history.events[0].type #=> "claim_create"
296
301
 
297
302
  claim.delete #=> true
303
+
304
+ data = {
305
+ is_manual_claim: true,
306
+ content_type: 'audiovisual',
307
+ asset_id: 'A123123123123123',
308
+ policy: { id: 'S123123123123123' },
309
+ video_id: 'myvIdeoIdYT',
310
+ match_info: {
311
+ match_segments: [
312
+ {
313
+ manual_segment: {
314
+ start: '00:00:20.000',
315
+ finish: '00:01:20.000'
316
+ }
317
+ },
318
+ {
319
+ manual_segment: {
320
+ start: '00:02:30.000',
321
+ finish: '00:03:50.000'
322
+ }
323
+ }
324
+ ]
325
+ }
326
+ }
327
+
328
+ content_owner.claims.insert(data)
298
329
  ```
299
330
 
300
331
  *The methods above require to be authenticated as the video’s content owner (see below).*
@@ -492,23 +523,6 @@ end
492
523
  so use the approach that you prefer.
493
524
  If a variable is set in both places, then `Yt.configure` takes precedence.
494
525
 
495
- Why you should use Yt…
496
- ======================
497
-
498
- … and not [youtube_it](https://github.com/kylejginavan/youtube_it)?
499
- Because youtube_it does not support YouTube API V3, and the YouTube API V2 has
500
- been [officially deprecated as of March 4, 2014](https://developers.google.com/youtube/2.0/developers_guide_protocol_audience).
501
- If you need help upgrading your code, check [YOUTUBE_IT.md](https://github.com/Fullscreen/yt/blob/master/YOUTUBE_IT.md),
502
- a step-by-step comparison between youtube_it and Yt to make upgrade easier.
503
-
504
- … and not [Google Api Client](https://github.com/google/google-api-ruby-client)?
505
- Because Google Api Client is poorly coded, poorly documented and adds many
506
- dependencies, bloating the size of your project.
507
-
508
- … and not your own code? Because Yt is fully tested, well documented,
509
- has few dependencies and helps you forget about the burden of dealing with
510
- Google API!
511
-
512
526
  How to test
513
527
  ===========
514
528
 
@@ -517,15 +531,6 @@ Yt comes with two different sets of tests:
517
531
  1. tests in `spec/models`, `spec/collections` and `spec/errors` **do not hit** the YouTube API
518
532
  1. tests in `spec/requests` **hit** the YouTube API and require authentication
519
533
 
520
- The reason why some tests actually hit the YouTube API is because they are
521
- meant to really integrate Yt with YouTube. YouTube API is not exactly
522
- *the most reliable* API out there, so we need to make sure that the responses
523
- match the documentation.
524
-
525
- You don’t have to run all the tests every time you change code.
526
- Travis CI is already set up to do this for when whenever you push a branch
527
- or create a pull request for this project.
528
-
529
534
  To only run tests against models, collections and errors (which do not hit the API), type:
530
535
 
531
536
  ```bash
@@ -539,8 +544,26 @@ rspec
539
544
  ```
540
545
 
541
546
  This will fail unless you have set up a test YouTube application and some
542
- tests YouTube accounts to hit the API. Once again, you probably don’t need
543
- this, since Travis CI already takes care of running this kind of tests.
547
+ tests YouTube accounts (with appropriate fixture data) to hit the API.
548
+ Furthermore, tests that require authentication are divided into three
549
+ roles, which correspond to each directory in `spec/requests`:
550
+
551
+ * Account-based tests, which require a valid refresh token along with
552
+ the application-level credentials the refresh token was created with
553
+ (`YT_TEST_DEVICE_REFRESH_TOKEN`, `YT_TEST_DEVICE_CLIENT_ID`, and
554
+ `YT_TEST_DEVICE_CLIENT_SECRET` respectively).
555
+ * Server application tests, which use a server API key
556
+ (`YT_TEST_SERVER_API_KEY`).
557
+ * Tests that excercise YouTube's partner functionality. This requires an
558
+ a partner channel id (`YT_TEST_CONTENT_OWNER_NAME`), a refresh token
559
+ that's authenticated with that channel
560
+ (`YT_TEST_CONTENT_OWNER_REFRESH_TOKEN`), and the corresponding
561
+ application (`YT_TEST_PARTNER_CLIENT_ID` and
562
+ (`YT_TEST_PARTNER_CLIENT_SECRET`).
563
+
564
+ The refresh tokens need to be generated with the `youtube`,
565
+ `yt-analytics` and `userinfo.profile` permissions in order for tests to
566
+ pass.
544
567
 
545
568
  How to release new versions
546
569
  ===========================
@@ -568,3 +591,4 @@ the [YouTube Analytics API](https://developers.google.com/youtube/analytics).
568
591
  If you find that a method is missing, fork the project, add the missing code,
569
592
  write the appropriate tests, then submit a pull request, and it will gladly
570
593
  be merged!
594
+
@@ -0,0 +1,33 @@
1
+ require 'yt/request'
2
+
3
+ module Yt
4
+ module Actions
5
+ module Get
6
+ include Base
7
+
8
+ def get
9
+ response = get_request(get_params).run
10
+ @data.merge! response.body
11
+ self
12
+ end
13
+
14
+ private
15
+
16
+ def get_request(params = {})
17
+ @list_request = Yt::Request.new(params).tap do |request|
18
+ print "#{request.as_curl}\n" if Yt.configuration.developing?
19
+ end
20
+ end
21
+
22
+ def get_params
23
+ {}.tap do |params|
24
+ params[:method] = :get
25
+ params[:host] = 'www.googleapis.com'
26
+ params[:auth] = @auth
27
+ params[:exptected_response] = Net::HTTPOK
28
+ params[:api_key] = Yt.configuration.api_key if Yt.configuration.api_key
29
+ end
30
+ end
31
+ end
32
+ end
33
+ end
@@ -11,6 +11,7 @@ module Yt
11
11
  underscore_keys! attributes
12
12
  body = attributes.slice :asset_id, :video_id, :content_type, :policy
13
13
  body[:policy] = {id: attributes[:policy_id]} if attributes[:policy_id]
14
+ body[:match_info] = match_attributes(attributes[:match_info]) if attributes[:match_info]
14
15
  params = attributes.slice(:is_manual_claim).merge({on_behalf_of_content_owner: @auth.owner_name})
15
16
  do_insert(params: params, body: body)
16
17
  end
@@ -38,6 +39,13 @@ module Yt
38
39
  super
39
40
  end
40
41
 
42
+ def match_attributes(attributes = {})
43
+ segments = attributes[:match_segments].map do |segment|
44
+ { manual_segment: (segment[:manual_segment] || segment).slice(:start, :finish) }
45
+ end
46
+ { matchSegments: segments }
47
+ end
48
+
41
49
  # @return [Hash] the parameters to submit to YouTube to list claims
42
50
  # administered by the content owner.
43
51
  # @see https://developers.google.com/youtube/partner/docs/v1/claims/list
@@ -25,8 +25,12 @@ module Yt
25
25
  end
26
26
 
27
27
  def content_owners_params
28
- {fetch_mine: true}
28
+ if @where_params.blank?
29
+ {fetch_mine: true}
30
+ else
31
+ apply_where_params! on_behalf_of_content_owner: @parent.owner_name
32
+ end
29
33
  end
30
34
  end
31
35
  end
32
- end
36
+ end
@@ -24,4 +24,4 @@ module Yt
24
24
  end
25
25
  end
26
26
  end
27
- end
27
+ end
@@ -0,0 +1,54 @@
1
+ require 'yt/models/configuration'
2
+
3
+ module Yt
4
+ # Provides methods to read and write global configuration settings.
5
+ #
6
+ # A typical usage is to set the API keys retrieved from the
7
+ # {http://console.developers.google.com Google Developers Console}.
8
+ #
9
+ # @example Set the API key for a server-only YouTube app:
10
+ # Yt.configure do |config|
11
+ # config.api_key = 'ABCDEFGHIJ1234567890'
12
+ # end
13
+ #
14
+ # @example Set the API client id/secret for a web-client YouTube app:
15
+ # Yt.configure do |config|
16
+ # config.client_id = 'ABCDEFGHIJ1234567890'
17
+ # config.client_secret = 'ABCDEFGHIJ1234567890'
18
+ # end
19
+ #
20
+ # Note that Yt.configure has precedence over values through with
21
+ # environment variables (see {Yt::Models::Configuration}).
22
+ #
23
+ module Config
24
+ # Yields the global configuration to the given block.
25
+ #
26
+ # @example
27
+ # Yt.configure do |config|
28
+ # config.api_key = 'ABCDEFGHIJ1234567890'
29
+ # end
30
+ #
31
+ # @yield [Yt::Models::Configuration] The global configuration.
32
+ def configure
33
+ yield configuration if block_given?
34
+ end
35
+
36
+ # Returns the global {Yt::Models::Configuration} object.
37
+ #
38
+ # While this method _can_ be used to read and write configuration settings,
39
+ # it is easier to use {Yt::Config#configure} Yt.configure}.
40
+ #
41
+ # @example
42
+ # Yt.configuration.api_key = 'ABCDEFGHIJ1234567890'
43
+ #
44
+ # @return [Yt::Models::Configuration] The global configuration.
45
+ def configuration
46
+ @configuration ||= Yt::Configuration.new
47
+ end
48
+ end
49
+
50
+ # @note Config is the only module auto-loaded in the Yt module,
51
+ # in order to have a syntax as easy as Yt.configure
52
+
53
+ extend Config
54
+ end
@@ -12,6 +12,7 @@ module Yt
12
12
  @data = options.fetch(:data, {})
13
13
  @id = options[:id]
14
14
  @auth = options[:auth]
15
+ @params = options[:params]
15
16
  end
16
17
 
17
18
  def update(attributes = {})
@@ -34,6 +35,10 @@ module Yt
34
35
  @metadata_effective ||= Yt::Models::AssetMetadata.new data: @data.fetch('metadataEffective', {})
35
36
  end
36
37
 
38
+ def ownership_effective
39
+ @ownership_effective ||= Yt::Models::Ownership.new data: @data.fetch('ownershipEffective', {})
40
+ end
41
+
37
42
  # Soft-deletes the asset.
38
43
  # @note YouTube API does not provide a +delete+ method for the Asset
39
44
  # resource, but only an +update+ method. Updating the +status+ of a
@@ -64,11 +69,11 @@ module Yt
64
69
  # +'show'+, +'sound_recording'+, +'video_game'+, +'web'+.
65
70
  has_attribute :type
66
71
 
67
- # @return [Array<Yt::Models::Tag>] the list of asset labels associated
72
+ # @return [Array<String>] the list of asset labels associated
68
73
  # with the asset. You can apply a label to multiple assets to group
69
74
  # them. You can use the labels as search filters to perform bulk updates,
70
75
  # to download reports, or to filter YouTube Analytics.
71
- has_attribute :label
76
+ has_attribute :label, default: []
72
77
 
73
78
  # Status
74
79
 
@@ -106,6 +111,15 @@ module Yt
106
111
  params[:params] = {on_behalf_of_content_owner: @auth.owner_name}
107
112
  end
108
113
  end
114
+
115
+ # @return [Hash] the parameters to submit to YouTube to get an asset.
116
+ # @see https://developers.google.com/youtube/partner/docs/v1/assets/get
117
+ def get_params
118
+ super.tap do |params|
119
+ params[:path] = "/youtube/partner/v1/assets/#{@id}"
120
+ params[:params] = {on_behalf_of_content_owner: @auth.owner_name}.merge! @params
121
+ end
122
+ end
109
123
  end
110
124
  end
111
- end
125
+ end
@@ -23,7 +23,7 @@ module Yt
23
23
  end
24
24
 
25
25
  # @return [String] A description of the asset. The description may be
26
- # displayed on YouTube or in CMS.
26
+ # displayed on YouTube or in CMS.
27
27
  def notes
28
28
  @data['notes']
29
29
  end
@@ -1,6 +1,7 @@
1
1
  require 'yt/actions/delete'
2
2
  require 'yt/actions/update'
3
3
  require 'yt/actions/patch'
4
+ require 'yt/actions/get'
4
5
 
5
6
  require 'yt/associations/has_attribute'
6
7
  require 'yt/associations/has_authentication'
@@ -17,6 +18,7 @@ module Yt
17
18
  include Actions::Delete
18
19
  include Actions::Update
19
20
  include Actions::Patch
21
+ include Actions::Get
20
22
 
21
23
  include Associations::HasAttribute
22
24
  extend Associations::HasReports
@@ -14,6 +14,17 @@ module Yt
14
14
  @asset = options[:asset] if options[:asset]
15
15
  end
16
16
 
17
+ # Updates the attributes of a claim.
18
+ # @note If you are submitting an update request, and your request does
19
+ # not specify a value for a property that already has a value, the
20
+ # property's existing value will be deleted.
21
+ # @return [Boolean] whether the claim was successfully updated.
22
+ def update(attributes = {})
23
+ underscore_keys! attributes
24
+ do_patch body: attributes
25
+ true
26
+ end
27
+
17
28
  # @!attribute [r] claim_history
18
29
  # @return [Yt::Collections::ClaimHistories] the claim's history.
19
30
  has_one :claim_history
@@ -0,0 +1,70 @@
1
+ module Yt
2
+ module Models
3
+ # Provides an object to store global configuration settings.
4
+ #
5
+ # This class is typically not used directly, but by calling
6
+ # {Yt::Config#configure Yt.configure}, which creates and updates a single
7
+ # instance of {Yt::Models::Configuration}.
8
+ #
9
+ # @example Set the API client id/secret for a web-client YouTube app:
10
+ # Yt.configure do |config|
11
+ # config.client_id = 'ABCDEFGHIJ1234567890'
12
+ # config.client_secret = 'ABCDEFGHIJ1234567890'
13
+ # end
14
+ #
15
+ # @see Yt::Config for more examples.
16
+ #
17
+ # An alternative way to set global configuration settings is by storing
18
+ # them in the following environment variables:
19
+ #
20
+ # * +YT_CLIENT_ID+ to store the Client ID for web/device apps
21
+ # * +YT_CLIENT_SECRET+ to store the Client Secret for web/device apps
22
+ # * +YT_API_KEY+ to store the API key for server/browser apps
23
+ # * +YT_LOG_LEVEL+ to store the verbosity level of the logs
24
+ #
25
+ # In case both methods are used together,
26
+ # {Yt::Config#configure Yt.configure} takes precedence.
27
+ #
28
+ # @example Set the API client id/secret for a web-client YouTube app:
29
+ # ENV['YT_CLIENT_ID'] = 'ABCDEFGHIJ1234567890'
30
+ # ENV['YT_CLIENT_SECRET'] = 'ABCDEFGHIJ1234567890'
31
+ #
32
+ class Configuration
33
+ # @return [String] the Client ID for web/device YouTube applications.
34
+ # @see https://console.developers.google.com Google Developers Console
35
+ attr_accessor :client_id
36
+
37
+ # @return [String] the Client Secret for web/device YouTube applications.
38
+ # @see https://console.developers.google.com Google Developers Console
39
+ attr_accessor :client_secret
40
+
41
+ # @return [String] the API key for server/browser YouTube applications.
42
+ # @see https://console.developers.google.com Google Developers Console
43
+ attr_accessor :api_key
44
+
45
+ # @return [String] the level of output to print for debugging purposes.
46
+ attr_accessor :log_level
47
+
48
+ # Initialize the global configuration settings, using the values of
49
+ # the specified following environment variables by default.
50
+ def initialize
51
+ @client_id = ENV['YT_CLIENT_ID']
52
+ @client_secret = ENV['YT_CLIENT_SECRET']
53
+ @api_key = ENV['YT_API_KEY']
54
+ @log_level = ENV['YT_LOG_LEVEL']
55
+ end
56
+
57
+ # @return [Boolean] whether the logging output is extra-verbose.
58
+ # Useful when developing (e.g., to print the curl of every request).
59
+ def developing?
60
+ log_level.to_s.in? %w(devel)
61
+ end
62
+
63
+ # @return [Boolean] whether the logging output is verbose.
64
+ # Useful when debugging (e.g., to print the curl of failing requests).
65
+ def debugging?
66
+ log_level.to_s.in? %w(devel debug)
67
+ end
68
+ end
69
+ end
70
+ end
@@ -46,6 +46,22 @@ module Yt
46
46
  @display_name = options[:display_name]
47
47
  end
48
48
 
49
+ # Uploads a reference file to YouTube.
50
+ # @param [String] path_or_url is the video or audio file to upload. Can either be the
51
+ # path of a local file or the URL of a remote file.
52
+ # @param [Hash] params the metadata to add to the uploaded reference.
53
+ # @option params [String] :asset_id The id of the asset the uploaded reference belongs to.
54
+ # @option params [String] :content_type The type of content being uploaded.
55
+ # @return [Yt::Models::Reference] the newly uploaded reference.
56
+ def upload_reference_file(path_or_url, params = {})
57
+ file = open path_or_url, 'rb'
58
+ session = resumable_sessions.insert file.size, params
59
+
60
+ session.update(body: file) do |data|
61
+ Yt::Reference.new id: data['id'], data: data, auth: self
62
+ end
63
+ end
64
+
49
65
  def create_reference(params = {})
50
66
  references.insert params
51
67
  end
@@ -60,6 +76,12 @@ module Yt
60
76
 
61
77
  ### PRIVATE API ###
62
78
 
79
+ # @private
80
+ # Tells `has_many :resumable_sessions` what path to hit to upload a file.
81
+ def upload_path
82
+ '/upload/youtube/partner/v1/references'
83
+ end
84
+
63
85
  # @private
64
86
  # Tells `has_many :videos` that account.videos should return all the
65
87
  # videos *on behalf of* the content owner (public, private, unlisted).
@@ -67,6 +89,13 @@ module Yt
67
89
  {for_content_owner: true, on_behalf_of_content_owner: @owner_name}
68
90
  end
69
91
 
92
+ # @private
93
+ # Tells `has_many :resumable_sessions` what params are set for the object
94
+ # associated to the uploaded file.
95
+ def upload_params
96
+ {part: 'snippet,status', on_behalf_of_content_owner: self.owner_name}
97
+ end
98
+
70
99
  # @private
71
100
  # Tells `has_many :video_groups` that content_owner.video_groups should
72
101
  # return all the video-groups *on behalf of* the content owner
@@ -126,4 +126,4 @@ module Yt
126
126
  end
127
127
  end
128
128
  end
129
- end
129
+ end
@@ -1,3 +1,3 @@
1
1
  module Yt
2
- VERSION = '0.32.3'
2
+ VERSION = '0.32.4'
3
3
  end
@@ -3,11 +3,43 @@ require 'yt/collections/claims'
3
3
  require 'yt/models/content_owner'
4
4
 
5
5
  describe Yt::Collections::Claims do
6
- subject(:collection) { Yt::Collections::Claims.new parent: content_owner }
7
6
  let(:content_owner) { Yt::ContentOwner.new owner_name: 'any-name' }
7
+ let(:collection) { Yt::Collections::Claims.new parent: content_owner, auth: content_owner }
8
8
  let(:page) { {items: [], token: 'any-token'} }
9
9
  let(:query) { {q: 'search string'} }
10
10
 
11
+ describe "#insert" do
12
+ let(:attributes) {
13
+ {
14
+ asset_id: 'some_asset_id',
15
+ video_id: 'some_video_id',
16
+ content_type: 'audiovisual',
17
+ policy: { id: 'some_policy_id' },
18
+ match_info: { match_segments: [ { manual_segment: { start: "00:01:00.000", finish: "00:02:00.000" } } ] },
19
+ is_manual_claim: true
20
+ }
21
+ }
22
+
23
+ before do
24
+ allow(collection).to receive(:do_insert)
25
+ collection.insert(attributes.deep_dup)
26
+ end
27
+
28
+ it 'calls do_insert with appropriate body' do
29
+ body = {
30
+ asset_id: 'some_asset_id',
31
+ video_id: 'some_video_id',
32
+ content_type: 'audiovisual',
33
+ policy: { id: 'some_policy_id' },
34
+ match_info: { matchSegments: [ { manual_segment: { start: "00:01:00.000", finish: "00:02:00.000" } } ] }
35
+ }
36
+ expect(collection).to have_received(:do_insert).with(
37
+ params: { is_manual_claim: true, on_behalf_of_content_owner: content_owner.owner_name },
38
+ body: body
39
+ )
40
+ end
41
+ end
42
+
11
43
  describe '#count' do
12
44
  context 'called once with .where(query) and once without' do
13
45
  after do
@@ -27,4 +59,4 @@ describe Yt::Collections::Claims do
27
59
  end
28
60
  end
29
61
  end
30
- end
62
+ end
@@ -17,4 +17,16 @@ describe Yt::Asset do
17
17
  it { expect(asset.type).to eq 'web' }
18
18
  end
19
19
  end
20
- end
20
+
21
+ describe '#ownership_effective' do
22
+ context 'given fetching a asset returns an ownershipEffective' do
23
+ let(:data) {
24
+ {"ownershipEffective"=>{"kind"=>"youtubePartner#rightsOwnership",
25
+ "general"=>[{"ratio"=>100.0, "owner"=>"XOuN81q-MeEUVrsiZeK1lQ", "type"=>"exclude"}]}}
26
+ }
27
+ it { expect(asset.ownership_effective).to be_a Yt::Ownership }
28
+ it { expect(asset.ownership_effective.general_owners.first).to be_a Yt::RightOwner }
29
+ it { expect(asset.ownership_effective.general_owners.first.owner).to eq "XOuN81q-MeEUVrsiZeK1lQ" }
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,44 @@
1
+ require 'spec_helper'
2
+
3
+ describe Yt::Configuration do
4
+ subject(:config) { Yt::Configuration.new }
5
+
6
+ describe '#client_id' do
7
+ context 'without an environment variable YT_CLIENT_ID' do
8
+ before { ENV['YT_CLIENT_ID'] = nil }
9
+ it {expect(config.client_id).to be_nil }
10
+ end
11
+
12
+ context 'given an environment variable YT_CLIENT_ID' do
13
+ let(:client_id) { '1234567890.apps.googleusercontent.com' }
14
+ before { ENV['YT_CLIENT_ID'] = client_id}
15
+ it {expect(config.client_id).to eq client_id }
16
+ end
17
+ end
18
+
19
+ describe '#client_secret' do
20
+ context 'without an environment variable YT_CLIENT_SECRET' do
21
+ before { ENV['YT_CLIENT_SECRET'] = nil }
22
+ it {expect(config.client_secret).to be_nil }
23
+ end
24
+
25
+ context 'given an environment variable YT_CLIENT_SECRET' do
26
+ let(:client_secret) { '1234567890' }
27
+ before { ENV['YT_CLIENT_SECRET'] = client_secret}
28
+ it {expect(config.client_secret).to eq client_secret }
29
+ end
30
+ end
31
+
32
+ describe '#api_key' do
33
+ context 'without an environment variable YT_API_KEY' do
34
+ before { ENV['YT_API_KEY'] = nil }
35
+ it {expect(config.api_key).to be_nil }
36
+ end
37
+
38
+ context 'given an environment variable YT_API_KEY' do
39
+ let(:api_key) { '123456789012345678901234567890' }
40
+ before { ENV['YT_API_KEY'] = api_key}
41
+ it {expect(config.api_key).to eq api_key }
42
+ end
43
+ end
44
+ end
@@ -3,7 +3,7 @@ require 'spec_helper'
3
3
  require 'yt/models/account'
4
4
 
5
5
  describe Yt::Account, :device_app do
6
- describe 'can create playlists' do
6
+ describe 'can create playlists', rate_limited: true do
7
7
  let(:params) { {title: 'Test Yt playlist', privacy_status: 'unlisted'} }
8
8
  before { @playlist = $account.create_playlist params }
9
9
  it { expect(@playlist).to be_a Yt::Playlist }
@@ -26,11 +26,6 @@ describe Yt::Account, :device_app do
26
26
  uploads = related_playlists.select{|p| p.title.starts_with? 'Uploads'}
27
27
  expect(uploads).not_to be_empty
28
28
  end
29
-
30
- specify 'includes private playlists (such as History)' do
31
- history = related_playlists.select{|p| p.title == 'History'}
32
- expect(history).not_to be_empty
33
- end
34
29
  end
35
30
 
36
31
  describe '.videos' do
@@ -180,7 +180,7 @@ describe Yt::Channel, :device_app do
180
180
  expect(channel.subscriptions.size).to be
181
181
  end
182
182
 
183
- describe 'playlists can be deleted' do
183
+ describe 'playlists can be deleted', rate_limited: true do
184
184
  let(:title) { "Yt Test Delete All Playlists #{rand}" }
185
185
  before { $account.create_playlist params }
186
186
 
@@ -5,7 +5,7 @@ describe Yt::PlaylistItem, :device_app do
5
5
  subject(:item) { Yt::PlaylistItem.new id: id, auth: $account }
6
6
 
7
7
  context 'given an existing playlist item' do
8
- let(:id) { 'UExJQk5UR3NjRS1jalEwSllxWmoweElIX0RjaGRUT0tRSS41NkI0NEY2RDEwNTU3Q0M2' } # from my channel
8
+ let(:id) { 'UExiai1JRGU2Zzh2c0FQT0RFci1xRUZjRERvWHhqRzhEVC41MjE1MkI0OTQ2QzJGNzNG' }
9
9
 
10
10
  it 'returns valid metadata' do
11
11
  expect(item.title).to be_a String
@@ -28,7 +28,7 @@ describe Yt::PlaylistItem, :device_app do
28
28
  it { expect{item.snippet}.to raise_error Yt::Errors::RequestError }
29
29
  end
30
30
 
31
- context 'given one of my own playlist items that I want to update' do
31
+ context 'given one of my own playlist items that I want to update', rate_limited: true do
32
32
  before(:all) do
33
33
  @my_playlist = $account.create_playlist title: "Yt Test Update Playlist Item #{rand}"
34
34
  @my_playlist.add_video '9bZkp7q19f0'
@@ -7,7 +7,7 @@ describe Yt::Playlist, :device_app do
7
7
  subject(:playlist) { Yt::Playlist.new id: id, auth: $account }
8
8
 
9
9
  context 'given an existing playlist' do
10
- let(:id) { 'PLbsGxdAPhjv_bsJtQzUgD0SA-AReDCynL' } # from YouTube Creators
10
+ let(:id) { 'PLpjK416fmKwQlQ0KvTWFmXZZa3d4IO2ro' } # from YouTube Creators
11
11
 
12
12
  it 'returns valid metadata' do
13
13
  expect(playlist.title).to be_a String
@@ -56,7 +56,7 @@ describe Yt::Playlist, :device_app do
56
56
  end
57
57
 
58
58
  context 'given someone else’s playlist' do
59
- let(:id) { 'PLbsGxdAPhjv_bsJtQzUgD0SA-AReDCynL' } # from YouTube Creators
59
+ let(:id) { 'PLpjK416fmKwQlQ0KvTWFmXZZa3d4IO2ro' } # from YouTube Creators
60
60
  let(:video_id) { '9bZkp7q19f0' }
61
61
 
62
62
  it { expect{playlist.delete}.to fail.with 'playlistForbidden' }
@@ -65,14 +65,14 @@ describe Yt::Playlist, :device_app do
65
65
  it { expect{playlist.delete_playlist_items}.to raise_error Yt::Errors::RequestError }
66
66
  end
67
67
 
68
- context 'given one of my own playlists that I want to delete' do
68
+ context 'given one of my own playlists that I want to delete', rate_limited: true do
69
69
  before(:all) { @my_playlist = $account.create_playlist title: "Yt Test Delete Playlist #{rand}" }
70
70
  let(:id) { @my_playlist.id }
71
71
 
72
72
  it { expect(playlist.delete).to be true }
73
73
  end
74
74
 
75
- context 'given one of my own playlists that I want to update' do
75
+ context 'given one of my own playlists that I want to update', rate_limited: true do
76
76
  before(:all) { @my_playlist = $account.create_playlist title: "Yt Test Update Playlist #{rand}" }
77
77
  after(:all) { @my_playlist.delete }
78
78
  let(:id) { @my_playlist.id }
@@ -276,7 +276,7 @@ describe Yt::Video, :device_app do
276
276
  end
277
277
  end
278
278
 
279
- it 'returns valid reports for video-related metrics' do
279
+ it 'returns valid reports for video-related metrics', extended_permissions: true do
280
280
  # Some reports are only available to Content Owners.
281
281
  # See content owner test for more details about what the methods return.
282
282
  expect{video.views}.not_to raise_error
@@ -327,7 +327,7 @@ describe Yt::Video, :device_app do
327
327
  context 'passing the parameter in underscore syntax' do
328
328
  let(:attrs) { {publish_at: new_scheduled_at} }
329
329
 
330
- specify 'only updates the timestamp to publish the video' do
330
+ specify 'only updates the timestamp to publish the video', flaky: true do
331
331
  expect(video.update attrs).to be true
332
332
  expect(video.privacy_status).to eq old_privacy_status
333
333
  expect(video.title).to eq old_title
@@ -369,13 +369,13 @@ describe Yt::Video, :device_app do
369
369
  let(:id) { $account.videos.where(order: 'viewCount').first.id }
370
370
  let(:update) { video.upload_thumbnail path_or_url }
371
371
 
372
- context 'given the path to a local JPG image file' do
372
+ context 'given the path to a local JPG image file', extended_permissions: true do
373
373
  let(:path_or_url) { File.expand_path '../thumbnail.jpg', __FILE__ }
374
374
 
375
375
  it { expect{update}.not_to raise_error }
376
376
  end
377
377
 
378
- context 'given the path to a remote PNG image file' do
378
+ context 'given the path to a remote PNG image file', extended_permissions: true do
379
379
  let(:path_or_url) { 'https://bit.ly/yt_thumbnail' }
380
380
 
381
381
  it { expect{update}.not_to raise_error }
@@ -396,7 +396,7 @@ describe Yt::Video, :device_app do
396
396
  # @see https://developers.google.com/youtube/v3/docs/videos#fileDetails
397
397
  # @see https://developers.google.com/youtube/v3/docs/videos#processingDetails.fileDetailsAvailability
398
398
  context 'given one of my own videos' do
399
- let(:id) { 'nHz3FnAMH3U' }
399
+ let(:id) { $account.videos.first.id }
400
400
 
401
401
  it 'returns valid file details' do
402
402
  expect(video.file_name).to be_a String
@@ -26,4 +26,4 @@ describe Yt::Account, :partner do
26
26
  end
27
27
  end
28
28
  end
29
- end
29
+ end
@@ -4,16 +4,27 @@ require 'yt/models/content_owner'
4
4
  describe Yt::Asset, :partner do
5
5
  describe '.ownership' do
6
6
  let(:asset) { Yt::Asset.new id: asset_id, auth: $content_owner }
7
+
7
8
  describe 'given an asset administered by the content owner' do
8
9
  let(:asset_id) { ENV['YT_TEST_PARTNER_ASSET_ID'] }
9
10
 
10
- specify 'the ownership can be obtained' do
11
- expect(asset.ownership).to be_a Yt::Ownership
11
+ describe 'when performing an update' do
12
+ specify 'the ownership can be obtained' do
13
+ expect(asset.ownership).to be_a Yt::Ownership
14
+ end
15
+
16
+ describe 'the asset can be updated' do
17
+ let(:attrs) { {metadata_mine: {notes: 'Yt notes'}} }
18
+ it { expect(asset.update attrs).to be true }
19
+ end
12
20
  end
13
21
 
14
- describe 'the asset can be updated' do
15
- let(:attrs) { {metadata_mine: {notes: 'Yt notes'}} }
16
- it { expect(asset.update attrs).to be true }
22
+ describe 'when performing a get' do
23
+ let(:asset_with_metadata_mine) { Yt::Asset.new id: asset_id, auth: $content_owner, params: {fetch_metadata: 'mine'} }
24
+
25
+ specify 'the metadata mine can be obtained' do
26
+ expect(asset_with_metadata_mine.get.metadata_mine.custom_id).to be_a String
27
+ end
17
28
  end
18
29
  end
19
30
  end
@@ -0,0 +1,17 @@
1
+ require 'spec_helper'
2
+ require 'yt/models/content_owner'
3
+
4
+ describe Yt::Claim, :partner do
5
+ describe '.ownership' do
6
+ let(:claim) { Yt::Claim.new id: claim_id, auth: $content_owner }
7
+
8
+ describe 'given a claim administered by the content owner' do
9
+ let(:claim_id) { ENV['YT_TEST_PARTNER_CLAIM_ID'] }
10
+
11
+ describe 'the claim can be updated' do
12
+ let(:attrs) { {block_outside_ownership: true} }
13
+ it { expect(claim.update attrs).to be true }
14
+ end
15
+ end
16
+ end
17
+ end
@@ -1,5 +1,6 @@
1
1
  require 'spec_helper'
2
2
  require 'yt/models/content_owner'
3
+ require 'yt/models/match_policy'
3
4
 
4
5
  describe Yt::ContentOwner, :partner do
5
6
  describe '.partnered_channels' do
@@ -264,6 +265,26 @@ describe Yt::ContentOwner, :partner do
264
265
  it { expect(reference).not_to be }
265
266
  end
266
267
  end
268
+
269
+ describe '.upload_reference_file' do
270
+ let(:asset) { Yt::Asset.new id: ENV['YT_TEST_PARTNER_ASSET_ID'], auth: $content_owner }
271
+ let(:match_policy) { Yt::MatchPolicy.new asset_id: ENV['YT_TEST_PARTNER_ASSET_ID'], auth: $content_owner }
272
+
273
+ let(:upload_params) { {asset_id: asset.id, content_type: 'video'} }
274
+ let(:reference) { $content_owner.upload_reference_file path_or_url, upload_params }
275
+ after { reference.delete }
276
+
277
+ before do
278
+ asset.ownership.update(assetId: asset.id) && asset.ownership.obtain!
279
+ match_policy.update policy_id: ENV['YT_TEST_PARTNER_POLICY_ID']
280
+ end
281
+
282
+ context 'given the URL of a remote video file' do
283
+ let(:path_or_url) { ENV['YT_REMOTE_VIDEO_URL'] }
284
+
285
+ it { expect(reference).to be_a Yt::Reference }
286
+ end
287
+ end
267
288
  end
268
289
 
269
290
  describe '.policies' do
@@ -305,16 +326,6 @@ describe Yt::ContentOwner, :partner do
305
326
  end
306
327
  end
307
328
 
308
- describe '.bulk_report_jobs' do
309
- describe 'given the content owner has bulk report jobs' do
310
- let(:job) { $content_owner.bulk_report_jobs.first }
311
-
312
- it 'returns valid job' do
313
- expect(job.id).to be_a String
314
- expect(job.report_type_id).to be_a String
315
- end
316
- end
317
- end
318
329
  # @note: The following test works, but YouTube API endpoint to mark
319
330
  # an asset as 'invalid' (soft-delete) does not work, and apparently
320
331
  # there is no way to update the status of a asset.
@@ -326,4 +337,34 @@ describe Yt::ContentOwner, :partner do
326
337
  # after { @asset.delete } # This does not seem to work
327
338
  # it { expect(@asset).to be_a Yt::Asset }
328
339
  # end
340
+
341
+ describe '.bulk_report_jobs' do
342
+ describe 'given the content owner has bulk report jobs' do
343
+ let(:job) { $content_owner.bulk_report_jobs.first }
344
+
345
+ it 'returns valid job' do
346
+ expect(job.id).to be_a String
347
+ expect(job.report_type_id).to be_a String
348
+ end
349
+ end
350
+ end
351
+
352
+ describe '.content_owners' do
353
+ describe '.where(id: content_owner_ids)' do
354
+ let(:content_owner_a) { $content_owner.content_owners.where(id: content_owner_ids).first }
355
+
356
+ context 'given valid content owner names' do
357
+ let(:content_owner_ids) { 'a8MUrfnFEzBX3uLQepd5mg,GIfKLveZoYetfSFgvG2VtQ' }
358
+
359
+ it 'returns valid content owner' do
360
+ expect(content_owner_a.display_name).to be_a String
361
+ end
362
+ end
363
+
364
+ context 'given an unknown content owner ID' do
365
+ let(:content_owner_ids) { '--not-a-valid-owner-id--' }
366
+ it { expect(content_owner_a).not_to be }
367
+ end
368
+ end
369
+ end
329
370
  end
@@ -5,7 +5,7 @@ describe Yt::Channel, :server_app do
5
5
  subject(:channel) { Yt::Channel.new attrs }
6
6
 
7
7
  context 'given an existing channel ID' do
8
- let(:attrs) { {id: 'UCxO1tY8h1AhOz0T4ENwmpow'} }
8
+ let(:attrs) { {id: 'UCAmh1DexLGcMtDlzMCIxo4w'} }
9
9
 
10
10
  it 'returns valid snippet data' do
11
11
  expect(channel.snippet).to be_a Yt::Snippet
@@ -29,7 +29,7 @@ describe Yt::Channel, :server_app do
29
29
  end
30
30
 
31
31
  context 'with a hidden list of subscriptions' do
32
- let(:attrs) { {id: 'UCG0hw7n_v0sr8MXgb6oel6w'} }
32
+ let(:attrs) { {id: 'UCZDZGN_73I019o6UYD2-4bg'} }
33
33
  it { expect{channel.subscribed_channels.size}.to raise_error Yt::Errors::Forbidden }
34
34
  end
35
35
  end
@@ -51,4 +51,4 @@ describe Yt::Channel, :server_app do
51
51
  it { expect(channel.videos.size).to be_zero }
52
52
  end
53
53
  end
54
- end
54
+ end
@@ -6,11 +6,11 @@ describe Yt::CommentThread, :server_app do
6
6
  subject(:comment_thread) { Yt::CommentThread.new attrs }
7
7
 
8
8
  context 'given an existing comment thread ID about a channel' do
9
- let(:attrs) { {id: 'z13kdnf4pursxnwr404cc3oz4zb0hjwirkg0k'} }
9
+ let(:attrs) { {id: 'UgzzJVW75s5KrSaf0Ah4AaABAg'} }
10
10
 
11
11
  it { expect(comment_thread.video_id).to be_nil }
12
12
  it { expect(comment_thread.total_reply_count).to be_an Integer }
13
- it { expect(comment_thread.can_reply?).to be false }
13
+ it { expect(comment_thread.can_reply?).to be true }
14
14
  it { expect(comment_thread).to be_public }
15
15
 
16
16
  it { expect(comment_thread.top_level_comment).to be_a Yt::Comment }
@@ -5,7 +5,7 @@ describe Yt::PlaylistItem, :server_app do
5
5
  subject(:item) { Yt::PlaylistItem.new id: id }
6
6
 
7
7
  context 'given an existing playlist item' do
8
- let(:id) { 'UExTV1lrWXpPclBNVDlwSkc1U3Q1RzBXRGFsaFJ6R2tVNC4yQUE2Q0JEMTk4NTM3RTZC' }
8
+ let(:id) { 'UExiai1JRGU2Zzh2c0FQT0RFci1xRUZjRERvWHhqRzhEVC41MjE1MkI0OTQ2QzJGNzNG' }
9
9
 
10
10
  it 'returns valid snippet data' do
11
11
  expect(item.snippet).to be_a Yt::Snippet
@@ -27,4 +27,4 @@ describe Yt::PlaylistItem, :server_app do
27
27
 
28
28
  it { expect{item.snippet}.to raise_error Yt::Errors::RequestError }
29
29
  end
30
- end
30
+ end
@@ -5,7 +5,7 @@ describe Yt::Playlist, :server_app do
5
5
  subject(:playlist) { Yt::Playlist.new attrs }
6
6
 
7
7
  context 'given an existing playlist ID' do
8
- let(:attrs) { {id: 'PLSWYkYzOrPMT9pJG5St5G0WDalhRzGkU4'} }
8
+ let(:attrs) { {id: 'PLpjK416fmKwQ6Ene4GKRLICznoE1QFyt4'} }
9
9
 
10
10
  it 'returns valid snippet data' do
11
11
  expect(playlist.snippet).to be_a Yt::Snippet
@@ -30,4 +30,4 @@ describe Yt::Playlist, :server_app do
30
30
  it { expect{playlist.snippet}.to raise_error Yt::Errors::NoItems }
31
31
  it { expect{playlist.status}.to raise_error Yt::Errors::NoItems }
32
32
  end
33
- end
33
+ end
data/yt.gemspec CHANGED
@@ -22,7 +22,6 @@ Gem::Specification.new do |spec|
22
22
  spec.require_paths = ["lib"]
23
23
 
24
24
  spec.add_dependency 'activesupport' # '3 (Ruby 1.9) or 4 (Ruby 2)'
25
- spec.add_dependency 'yt-support', '>= 0.1'
26
25
 
27
26
  # For development / Code coverage / Documentation
28
27
  spec.add_development_dependency 'bundler' #, '~> 1.0'
@@ -30,4 +29,5 @@ Gem::Specification.new do |spec|
30
29
  spec.add_development_dependency 'rake' #, '~> 10.0'
31
30
  spec.add_development_dependency 'yard' #, '~> 0.8.0'
32
31
  spec.add_development_dependency 'coveralls' #, '~> 0.7.0'
32
+ spec.add_development_dependency 'pry'
33
33
  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.32.3
4
+ version: 0.32.4
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claudio Baccigalupo
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-03-17 00:00:00.000000000 Z
11
+ date: 2019-06-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -25,21 +25,21 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
- name: yt-support
28
+ name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
- version: '0.1'
34
- type: :runtime
33
+ version: '0'
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: '0.1'
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: bundler
42
+ name: rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: rspec
56
+ name: rake
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: rake
70
+ name: yard
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,7 +81,7 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: yard
84
+ name: coveralls
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
87
  - - ">="
@@ -95,7 +95,7 @@ dependencies:
95
95
  - !ruby/object:Gem::Version
96
96
  version: '0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: coveralls
98
+ name: pry
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -133,6 +133,7 @@ files:
133
133
  - lib/yt/actions/base.rb
134
134
  - lib/yt/actions/delete.rb
135
135
  - lib/yt/actions/delete_all.rb
136
+ - lib/yt/actions/get.rb
136
137
  - lib/yt/actions/insert.rb
137
138
  - lib/yt/actions/list.rb
138
139
  - lib/yt/actions/modify.rb
@@ -185,6 +186,7 @@ files:
185
186
  - lib/yt/collections/video_categories.rb
186
187
  - lib/yt/collections/video_groups.rb
187
188
  - lib/yt/collections/videos.rb
189
+ - lib/yt/config.rb
188
190
  - lib/yt/constants/geography.rb
189
191
  - lib/yt/errors/forbidden.rb
190
192
  - lib/yt/errors/missing_auth.rb
@@ -208,6 +210,7 @@ files:
208
210
  - lib/yt/models/claim_history.rb
209
211
  - lib/yt/models/comment.rb
210
212
  - lib/yt/models/comment_thread.rb
213
+ - lib/yt/models/configuration.rb
211
214
  - lib/yt/models/content_detail.rb
212
215
  - lib/yt/models/content_owner.rb
213
216
  - lib/yt/models/content_owner_detail.rb
@@ -268,6 +271,7 @@ files:
268
271
  - spec/models/claim_spec.rb
269
272
  - spec/models/comment_spec.rb
270
273
  - spec/models/comment_thread_spec.rb
274
+ - spec/models/configuration_spec.rb
271
275
  - spec/models/content_detail_spec.rb
272
276
  - spec/models/content_owner_detail_spec.rb
273
277
  - spec/models/file_detail_spec.rb
@@ -305,6 +309,7 @@ files:
305
309
  - spec/requests/as_content_owner/bulk_report_job_spec.rb
306
310
  - spec/requests/as_content_owner/channel_spec.rb
307
311
  - spec/requests/as_content_owner/claim_history_spec.rb
312
+ - spec/requests/as_content_owner/claim_spec.rb
308
313
  - spec/requests/as_content_owner/content_owner_spec.rb
309
314
  - spec/requests/as_content_owner/match_policy_spec.rb
310
315
  - spec/requests/as_content_owner/ownership_spec.rb
@@ -376,6 +381,7 @@ test_files:
376
381
  - spec/models/claim_spec.rb
377
382
  - spec/models/comment_spec.rb
378
383
  - spec/models/comment_thread_spec.rb
384
+ - spec/models/configuration_spec.rb
379
385
  - spec/models/content_detail_spec.rb
380
386
  - spec/models/content_owner_detail_spec.rb
381
387
  - spec/models/file_detail_spec.rb
@@ -413,6 +419,7 @@ test_files:
413
419
  - spec/requests/as_content_owner/bulk_report_job_spec.rb
414
420
  - spec/requests/as_content_owner/channel_spec.rb
415
421
  - spec/requests/as_content_owner/claim_history_spec.rb
422
+ - spec/requests/as_content_owner/claim_spec.rb
416
423
  - spec/requests/as_content_owner/content_owner_spec.rb
417
424
  - spec/requests/as_content_owner/match_policy_spec.rb
418
425
  - spec/requests/as_content_owner/ownership_spec.rb