yt 0.9.1 → 0.9.2

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: 8853f3441a92a6cb17f3a73193f1b21b7f3a5a3d
4
- data.tar.gz: f23617ccbf92ae86d002de6a412a083db7015d93
3
+ metadata.gz: 5fe9ccf19b87eba1932a8381ec62e4c7e18bb997
4
+ data.tar.gz: bcc2aefb8c393bac857f94157267d66ab96301ae
5
5
  SHA512:
6
- metadata.gz: 39f3ac3e556b1194961d346da9c13ddbc6ce370e44c9063af679c834fa290ca9b6ae110fb63456fa1e973ee7dad7e9cc6d42b6626a230912239e18c440b1d2d0
7
- data.tar.gz: e7cd4d3d44ba2fa7faeb0b1d3da548f07098f2c55a6dba2b0d35decf8dcdecbf134d39a039ddf6d259a0228de14f9138ebb212a2a4db74e550d78ab8bf452816
6
+ metadata.gz: f3f0ddfe5fcf4c20b72a77478efba519a33db0bf9565b52a47daaa6f768fe68015d3436d4535fdd759443462903c5ec788750ef5595317672c7492d903c25db2
7
+ data.tar.gz: 0dcc83e353408a679b723516e3801eafd2b1710ee25584040a9d9c359fa8dadac24b44949779b6b4f042a09e3ebd633b737b3c64815bf826ed571bdb0f0169e2
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- yt (0.9.1)
4
+ yt (0.9.2)
5
5
  activesupport
6
6
 
7
7
  GEM
data/HISTORY.md CHANGED
@@ -3,6 +3,7 @@ v0.9 - 2014/07/28
3
3
 
4
4
  * [breaking change] Rename rating.update to rating.set
5
5
  * Add content_owner.references to retrieve ContentID references
6
+ * Add content_owner.policies to list ContentID policies
6
7
 
7
8
 
8
9
  v0.8 - 2014/07/18
data/README.md CHANGED
@@ -41,7 +41,7 @@ To install on your system, run
41
41
 
42
42
  To use inside a bundled Ruby project, add this line to the Gemfile:
43
43
 
44
- gem 'yt', '~> 0.9.1'
44
+ gem 'yt', '~> 0.9.2'
45
45
 
46
46
  Since the gem follows [Semantic Versioning](http://semver.org),
47
47
  indicating the full version in your Gemfile (~> *major*.*minor*.*patch*)
@@ -107,6 +107,7 @@ content_owner.claims.where(q: 'Fullscreen').count #=> 24
107
107
  content_owner.claims.first #=> #<Yt::Models::Claim @id=...>
108
108
 
109
109
  content_owner.references.where(asset_id: "ABCDEFG").first => #<Yt::Models::Reference @id=...>
110
+ content_owner.policies.first => #<Yt::Models::Policy @id=...>
110
111
  ```
111
112
 
112
113
  *All the above methods require authentication (see below).*
@@ -0,0 +1,37 @@
1
+ require 'yt/collections/base'
2
+ require 'yt/models/policy'
3
+
4
+ module Yt
5
+ module Collections
6
+ # Provides methods to interact with a collection of Content ID policies.
7
+ #
8
+ # Resources with policies are: {Yt::Models::ContentOwner content owners}.
9
+ class Policies < Base
10
+
11
+ private
12
+
13
+ def new_item(data)
14
+ Yt::Policy.new data: data
15
+ end
16
+
17
+ # @return [Hash] the parameters to submit to YouTube to list policies
18
+ # saved by the content owner.
19
+ # @see https://developers.google.com/youtube/partner/docs/v1/policies/list
20
+ def list_params
21
+
22
+ super.tap do |params|
23
+ params[:params] = policies_params
24
+ params[:path] = '/youtube/partner/v1/policies'
25
+ end
26
+ end
27
+
28
+ def policies_params
29
+ {onBehalfOfContentOwner: @parent.owner_name}.tap do |params|
30
+ (@extra_params ||= {}).each do |key, value|
31
+ params[key.to_s.camelize :lower] = value
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -19,6 +19,10 @@ module Yt
19
19
  # @return [Yt::Collection::References] the references administered by the content owner.
20
20
  has_many :references
21
21
 
22
+ # @!attribute [r] policies
23
+ # @return [Yt::Collection::Policies] the policies saved by the content owner.
24
+ has_many :policies
25
+
22
26
  def initialize(options = {})
23
27
  super options
24
28
  @owner_name = options[:owner_name]
@@ -0,0 +1,44 @@
1
+ require 'yt/models/base'
2
+ require 'yt/models/policy_rule'
3
+
4
+ module Yt
5
+ module Models
6
+ # Provides methods to interact with YouTube ContentID policies.
7
+ # A policy resource specifies rules that define a particular usage or
8
+ # match policy that a partner can associate with an asset or claim.
9
+ # @see https://developers.google.com/youtube/partner/docs/v1/policies
10
+ class Policy < Base
11
+ def initialize(options = {})
12
+ @data = options[:data]
13
+ end
14
+
15
+ # @return [String] the ID that YouTube assigns and uses to uniquely
16
+ # identify the policy.
17
+ def id
18
+ @id ||= @data['id']
19
+ end
20
+
21
+ # @return [String] the policy’s name.
22
+ def name
23
+ @name ||= @data['name']
24
+ end
25
+
26
+ # @return [String] the policy’s description.
27
+ def description
28
+ @name ||= @data['description']
29
+ end
30
+
31
+ # @return [String] the time the policy was updated.
32
+ def time_updated
33
+ @time_updated ||= Time.parse @data['timeUpdated']
34
+ end
35
+
36
+ # @return [Array<PolicyRule>] a list of rules that specify the action
37
+ # that YouTube should take and may optionally specify the conditions
38
+ # under which that action is enforced.
39
+ def rules
40
+ @rules ||= @data['rules'].map{|rule| PolicyRule.new data: rule}
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,133 @@
1
+ require 'yt/models/base'
2
+
3
+ module Yt
4
+ module Models
5
+ # Provides methods to interact with YouTube ContentID policy rules.
6
+ # Rules that specify the action that YouTube should take and may optionally
7
+ # specify the conditions under which that action is enforced.
8
+ # @see https://developers.google.com/youtube/partner/docs/v1/policies
9
+ class PolicyRule
10
+ def initialize(options = {})
11
+ @data = options[:data]
12
+ end
13
+
14
+ ACTIONS = %q(block monetize takedown track)
15
+
16
+ # Return the policy that YouTube should enforce if the rule’s conditions
17
+ # are all valid for an asset or for an attempt to view that asset on
18
+ # YouTube. Valid values for this property are: block, monetize, takedown,
19
+ # track.
20
+ # @return [String] the policy that YouTube should enforce.
21
+ def action
22
+ @action ||= @data['action']
23
+ end
24
+
25
+ # @return [Array] A list of additional actions that YouTube should take
26
+ # if the conditions in the rule are met. Valid values for this property
27
+ # are: review.
28
+ def subaction
29
+ @subaction ||= @data['subaction']
30
+ end
31
+
32
+ # Return the list of territories where the policy applies.
33
+ # Each territory is an ISO 3166 two-letter country code.
34
+ # YouTube determines whether the condition is satisfied based on the
35
+ # user’s location.
36
+ # @return [Array<String>] the territories where the policy applies.
37
+ # @example (with 'block' action) only block a video for U.S. users:
38
+ # included_territories #=> ['us']
39
+ def included_territories
40
+ territories_type == 'include' ? territories : []
41
+ end
42
+
43
+ # Return the list of territories where the policy does not apply.
44
+ # Each territory is an ISO 3166 two-letter country code.
45
+ # YouTube determines whether the condition is satisfied based on the
46
+ # user’s location.
47
+ # @return [Array<String>] the territories where the policy does not apply.
48
+ # @example (with 'block' action) only allow U.S. users to view a video:
49
+ # excluded_territories #=> ['us']
50
+ def excluded_territories
51
+ territories_type == 'exclude' ? territories : []
52
+ end
53
+
54
+ # @return [Array<Hash<Symbol, Float>>] the intervals of time the user-
55
+ # or partner-uploaded content needs to match a reference file for the
56
+ # rule to apply. :low is the minimum (inclusive) allowed value and
57
+ # :high is the maximum (inclusive) allowed value for the rule to apply.
58
+ # @example videos that match the reference for 20 to 30 seconds:
59
+ # match_duration #= [{low: 20.0, high: 30.0}]
60
+ def match_duration
61
+ @match_duration ||= match_duration_list.map{|r| low_and_high r}
62
+ end
63
+
64
+ # @return [Array<Hash<Symbol, Float>>] the intervals of percentages the
65
+ # user- or partner-uploaded content needs to match a reference file for
66
+ # the rule to apply. :low is the minimum (inclusive) allowed value and
67
+ # :high is the maximum (inclusive) allowed value for the rule to apply.
68
+ # @example videos that match the reference for 40%~50% of their duration:
69
+ # match_percent #= [{low: 40.0, high: 50.0}]
70
+ def match_percent
71
+ @match_percent ||= match_percent_list.map{|r| low_and_high r}
72
+ end
73
+
74
+ # @return [Array<Hash<Symbol, Float>>] the intervals of duration that the
75
+ # reference must have for the rule to apply. :low is the minimum
76
+ # (inclusive) allowed value, :high is the maximum (inclusive) allowed
77
+ # value for the rule to apply.
78
+ # @example references that are between 20 and 30 seconds:
79
+ # reference_duration #= [{low: 20.0, high: 30.0}]
80
+ def reference_duration
81
+ @reference_duration ||= reference_duration_list.map{|r| low_and_high r}
82
+ end
83
+
84
+ # @return [Array<Hash<Symbol, Float>>] the intervals of percentages the
85
+ # reference file needs to match the user- or partner-uploaded content
86
+ # for the rule to apply. :low is the minimum (inclusive) allowed value,
87
+ # :high is the maximum (inclusive) allowed value for the rule to apply.
88
+ # @example videos that match either 0%~10% or 40%~50% of a reference:
89
+ # reference_percent #= [{low: 0.0, high: 10.0}, {low: 40.0, high: 50.0}]
90
+ def reference_percent
91
+ @reference_percent ||= reference_percent_list.map{|r| low_and_high r}
92
+ end
93
+
94
+ private
95
+
96
+ def conditions
97
+ @conditions ||= @data.fetch 'conditions', {}
98
+ end
99
+
100
+ def territories_object
101
+ @territories_object ||= conditions.fetch 'requiredTerritories', {}
102
+ end
103
+
104
+ def territories_type
105
+ @territories_type ||= territories_object['type']
106
+ end
107
+
108
+ def territories
109
+ @territories ||= territories_object['territories']
110
+ end
111
+
112
+ def match_duration_list
113
+ @match_duration_list ||= conditions.fetch 'matchDuration', []
114
+ end
115
+
116
+ def match_percent_list
117
+ @match_percent_list ||= conditions.fetch 'matchPercent', []
118
+ end
119
+
120
+ def reference_duration_list
121
+ @reference_duration_list ||= conditions.fetch 'referenceDuration', []
122
+ end
123
+
124
+ def reference_percent_list
125
+ @reference_percent_list ||= conditions.fetch 'referencePercent', []
126
+ end
127
+
128
+ def low_and_high(range)
129
+ {low: range['low'], high: range['high']}
130
+ end
131
+ end
132
+ end
133
+ end
@@ -1,3 +1,3 @@
1
1
  module Yt
2
- VERSION = '0.9.1'
2
+ VERSION = '0.9.2'
3
3
  end
@@ -0,0 +1,63 @@
1
+ require 'spec_helper'
2
+ require 'yt/models/policy_rule'
3
+
4
+ describe Yt::PolicyRule do
5
+ subject(:policy_rule) { Yt::PolicyRule.new data: data }
6
+
7
+ describe '#action' do
8
+ context 'given fetching a policy rule returns an action' do
9
+ let(:data) { {"action"=>"takedown"} }
10
+ it { expect(policy_rule.action).to eq 'takedown' }
11
+ end
12
+ end
13
+
14
+ describe '#subaction' do
15
+ context 'given fetching a policy rule returns a subaction' do
16
+ let(:data) { {"subaction"=>"review"} }
17
+ it { expect(policy_rule.subaction).to eq 'review' }
18
+ end
19
+ end
20
+
21
+ describe '#included_territories' do
22
+ context 'given fetching a policy rule returns included territories' do
23
+ let(:data) { {"conditions"=>{"requiredTerritories"=>{"type"=>"include", "territories"=>["US", "CA"]}}} }
24
+ let(:data) { {"conditions"=>{"requiredTerritories"=>{"type"=>"include", "territories"=>["US", "CA"]}}} }
25
+ it { expect(policy_rule.included_territories).to eq %w(US CA) }
26
+ end
27
+ end
28
+
29
+ describe '#excluded_territories' do
30
+ context 'given fetching a policy rule returns excluded territories' do
31
+ let(:data) { {"conditions"=>{"requiredTerritories"=>{"type"=>"exclude", "territories"=>["US", "CA"]}}} }
32
+ it { expect(policy_rule.excluded_territories).to eq %w(US CA) }
33
+ end
34
+ end
35
+
36
+ describe '#match_duration' do
37
+ context 'given fetching a policy rule returns a match duration list' do
38
+ let(:data) { {"conditions"=>{"matchDuration"=>[{"high"=>60.0}]}} }
39
+ it { expect(policy_rule.match_duration).to match_array [{low: nil, high: 60.0}] }
40
+ end
41
+ end
42
+
43
+ describe '#match_percent' do
44
+ context 'given fetching a policy rule returns a match percent list' do
45
+ let(:data) { {"conditions"=>{"matchPercent"=>[{"high"=>60.0}]}} }
46
+ it { expect(policy_rule.match_percent).to match_array [{low: nil, high: 60.0}] }
47
+ end
48
+ end
49
+
50
+ describe '#reference_duration' do
51
+ context 'given fetching a policy rule returns a reference duration list' do
52
+ let(:data) { {"conditions"=>{"referenceDuration"=>[{"low"=>60.0, "high"=>600.0}, {"low"=>20.0, "high"=>30.0}]}} }
53
+ it { expect(policy_rule.reference_duration).to match_array [{low: 60.0, high: 600.0}, {low: 20.0, high: 30.0}] }
54
+ end
55
+ end
56
+
57
+ describe '#reference_percent' do
58
+ context 'given fetching a policy rule returns a reference percent list' do
59
+ let(:data) { {"conditions"=>{"referencePercent"=>[{"low"=>60.0, "high"=>600.0}, {"low"=>20.0, "high"=>30.0}]}} }
60
+ it { expect(policy_rule.reference_percent).to match_array [{low: 60.0, high: 600.0}, {low: 20.0, high: 30.0}] }
61
+ end
62
+ end
63
+ end
@@ -0,0 +1,41 @@
1
+ require 'spec_helper'
2
+ require 'yt/models/policy'
3
+
4
+ describe Yt::Policy do
5
+ subject(:policy) { Yt::Policy.new data: data }
6
+
7
+ describe '#id' do
8
+ context 'given fetching a policy returns an id' do
9
+ let(:data) { {"id"=>"S123456789"} }
10
+ it { expect(policy.id).to eq 'S123456789' }
11
+ end
12
+ end
13
+
14
+ describe '#name' do
15
+ context 'given fetching a policy returns a name' do
16
+ let(:data) { {"name"=>"Block in all countries"} }
17
+ it { expect(policy.name).to eq 'Block in all countries' }
18
+ end
19
+ end
20
+
21
+ describe '#description' do
22
+ context 'given fetching a policy returns a description' do
23
+ let(:data) { {"description"=>"Block videos in every country"} }
24
+ it { expect(policy.description).to eq 'Block videos in every country' }
25
+ end
26
+ end
27
+
28
+ describe '#time_updated' do
29
+ context 'given fetching a policy returns a timeUpdated' do
30
+ let(:data) { {"timeUpdated"=>"1970-01-16T20:33:03.675Z"} }
31
+ it { expect(policy.time_updated.year).to be 1970 }
32
+ end
33
+ end
34
+
35
+ describe '#rules' do
36
+ context 'given fetching a policy returns rules' do
37
+ let(:data) { {"rules"=>[{"action"=>"track"},{"action"=>"track"}]} }
38
+ it { expect(policy.rules.size).to be 2 }
39
+ end
40
+ end
41
+ end
@@ -113,4 +113,30 @@ describe Yt::ContentOwner, :partner do
113
113
  end
114
114
  end
115
115
  end
116
+
117
+ describe '.policies' do
118
+ describe 'given the content owner has policies' do
119
+ let(:policy) { $content_owner.policies.first }
120
+ let(:rule) { policy.rules.first }
121
+
122
+ it 'returns valid metadata' do
123
+ expect(policy.id).to be_a String
124
+ expect(policy.name).to be_a String
125
+ expect(policy.time_updated).to be_a Time
126
+ expect(rule.action).to be_in Yt::PolicyRule::ACTIONS
127
+ expect(rule.included_territories).to be_an Array
128
+ expect(rule.excluded_territories).to be_an Array
129
+ expect(rule.match_duration).to be_an Array
130
+ expect(rule.match_percent).to be_an Array
131
+ expect(rule.reference_duration).to be_an Array
132
+ expect(rule.reference_percent).to be_an Array
133
+ end
134
+ end
135
+
136
+ describe '.where(id: policy_id) given an unknown policy ID' do
137
+ let(:policy) { $content_owner.policies.where(id: policy_id).first }
138
+ let(:policy_id) { '--not-a-matching-reference-id--' }
139
+ it { expect(policy).not_to be }
140
+ end
141
+ end
116
142
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: yt
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 0.9.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Claudio Baccigalupo
@@ -140,6 +140,7 @@ files:
140
140
  - lib/yt/collections/partnered_channels.rb
141
141
  - lib/yt/collections/playlist_items.rb
142
142
  - lib/yt/collections/playlists.rb
143
+ - lib/yt/collections/policies.rb
143
144
  - lib/yt/collections/ratings.rb
144
145
  - lib/yt/collections/references.rb
145
146
  - lib/yt/collections/reports.rb
@@ -173,6 +174,8 @@ files:
173
174
  - lib/yt/models/id.rb
174
175
  - lib/yt/models/playlist.rb
175
176
  - lib/yt/models/playlist_item.rb
177
+ - lib/yt/models/policy.rb
178
+ - lib/yt/models/policy_rule.rb
176
179
  - lib/yt/models/rating.rb
177
180
  - lib/yt/models/reference.rb
178
181
  - lib/yt/models/request.rb
@@ -209,6 +212,8 @@ files:
209
212
  - spec/models/description_spec.rb
210
213
  - spec/models/playlist_item_spec.rb
211
214
  - spec/models/playlist_spec.rb
215
+ - spec/models/policy_rule_spec.rb
216
+ - spec/models/policy_spec.rb
212
217
  - spec/models/rating_spec.rb
213
218
  - spec/models/reference_spec.rb
214
219
  - spec/models/request_spec.rb
@@ -291,6 +296,8 @@ test_files:
291
296
  - spec/models/description_spec.rb
292
297
  - spec/models/playlist_item_spec.rb
293
298
  - spec/models/playlist_spec.rb
299
+ - spec/models/policy_rule_spec.rb
300
+ - spec/models/policy_spec.rb
294
301
  - spec/models/rating_spec.rb
295
302
  - spec/models/reference_spec.rb
296
303
  - spec/models/request_spec.rb