yt 0.11.1 → 0.11.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/.travis.yml +2 -0
- data/CHANGELOG.md +31 -33
- data/README.md +94 -3
- data/lib/yt.rb +1 -0
- data/lib/yt/actions/base.rb +19 -0
- data/lib/yt/actions/insert.rb +2 -0
- data/lib/yt/actions/list.rb +0 -7
- data/lib/yt/actions/modify.rb +2 -0
- data/lib/yt/collections/assets.rb +32 -0
- data/lib/yt/collections/authentications.rb +1 -0
- data/lib/yt/collections/claims.rb +16 -1
- data/lib/yt/collections/ownerships.rb +34 -0
- data/lib/yt/collections/references.rb +2 -12
- data/lib/yt/collections/resources.rb +0 -10
- data/lib/yt/models/account.rb +1 -1
- data/lib/yt/models/advertising_options_set.rb +33 -0
- data/lib/yt/models/asset.rb +100 -0
- data/lib/yt/models/channel.rb +1 -1
- data/lib/yt/models/claim.rb +22 -0
- data/lib/yt/models/content_owner.rb +16 -4
- data/lib/yt/models/match_policy.rb +2 -12
- data/lib/yt/models/ownership.rb +70 -0
- data/lib/yt/models/reference.rb +1 -1
- data/lib/yt/models/request.rb +13 -2
- data/lib/yt/models/resource.rb +0 -10
- data/lib/yt/models/resumable_session.rb +1 -0
- data/lib/yt/models/right_owner.rb +69 -0
- data/lib/yt/version.rb +1 -1
- data/spec/models/asset_spec.rb +20 -0
- data/spec/models/ownership_spec.rb +59 -0
- data/spec/models/right_owner_spec.rb +71 -0
- data/spec/requests/as_content_owner/advertising_options_set_spec.rb +15 -0
- data/spec/requests/as_content_owner/asset_spec.rb +12 -0
- data/spec/requests/as_content_owner/content_owner_spec.rb +37 -2
- data/spec/requests/as_content_owner/ownership_spec.rb +19 -0
- metadata +21 -3
- data/Gemfile.lock +0 -69
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 623d648b88a71c977785d91777067b7fe749b9ec
|
4
|
+
data.tar.gz: 41516787a905b8c36b1ce390c6850bffefed8a53
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: c75aa4a2de0bbfae680c25edaff8ec2be11aa5e946577a1a55d94dce55a0690f67fb1ad57f794e979a22cf8170dcb664375a8fcd6890b223fe7ad70bb4f8413f
|
7
|
+
data.tar.gz: eb62845c855fae0565a52755b53cbebbae108c7c952d7162943de3901fbe84195756076d4b7c9de1f5be5befdb75e65ac8d2409ac537f5fba7954b8cc6ffa7c3
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -32,3 +32,5 @@ env:
|
|
32
32
|
- secure: CFkNT5WI2ATF3TKehTSuCwzG4EENnoVXaddL0PqpuH4Ss82k0k0xcJBhKbmD3Qkf7nw8y0g4s3jCepHssB2ZwzqQinKcYvamzIbsNPuhsuvlc9rMvT9ZosT5CHsiRJANl+OeZ8l2SqGu6kCMDx45h+fL7YZEtn3jjVZYEAXQSig=
|
33
33
|
- secure: WWuYLNKcTM+fjgFrRT4qa3y4IlwO6xeSkM16jbDG05FUIThMfWRVQHhs5JThw/M3SByWGWySmz74sNpGV6V/yt9jw8o1u6F81j0ec2oeHDCwkZ8xK8ubPv3Pmg14PGr1Awu04zfhTEY9KzJt6HrFSYzek/MpV5Prg4J1l6SgqyU=
|
34
34
|
- secure: YuWrOwaqBT0tLVe90OkfCLX/7tzrLhsOBn7LnqH0Ifw6T+EddNDmQLriWLRny8uNQSg7j/AhPOuEvR/ImOibK3a003LyxQZUx9KrEOkgIa5c82OlOLdcvmXw/8wnQ/SEdTDs8r2l1aZ2NxiieCA3fl7oxR1Lt/O+lS/vgqQY+uM=
|
35
|
+
- secure: VlE28fpY6cy6a9HYq+cdGmSXM54bZkbGzqSAqvgxTIJubMzSPSvQ7p5zdLtWPG9yQqYUOXyhKItZE/Eno0VemHDyV9qj0mo0JKb2c4OmX3aupIYTh38LZodkGmW+NGxa8GaebqYeDJeH33ZLtl9aumahzgUtGykKOkNIPH6Igy4=
|
36
|
+
- secure: YcjKPgsmOFbAeJrxl/d7idji/TX9/EZLXuO3ZYy3NLljy0GXdXtFBiAaE7DDTEG4PNLp+EJTpc/XbEu8yL1ozeH3lpGPeRU+Mk2LTFI2GAjpz6DeOucEx+sFEJJHr+eqsavQrNMzgOBii3TTmMP66Dp/T1L0HlcWT3v680jfS6A=
|
data/CHANGELOG.md
CHANGED
@@ -6,16 +6,22 @@ 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.11.2 - 2014-08-20
|
10
|
+
|
11
|
+
* [FEATURE] Add AdvertisingOptionsSet with `update` to change the advertising settings of a video
|
12
|
+
* [FEATURE] Add `content_owner.create_claim` and `claim.delete`
|
13
|
+
* [FEATURE] Add `update` method to Ownership to change owners of an asset
|
14
|
+
* [FEATURE] Add `asset.ownership` to list the owners of an asset
|
15
|
+
* [FEATURE] Add `content_owner.create_asset` and Asset model
|
16
|
+
|
9
17
|
## 0.11.1 - 2014-08-17
|
10
18
|
|
11
19
|
* [ENHANCEMENT] Add Video search even without a parent account or channel
|
12
20
|
|
13
21
|
For instance, to search for the most viewed video on the whole YouTube, run:
|
14
22
|
|
15
|
-
|
16
|
-
videos
|
17
|
-
videos.where(order: 'viewCount').first.title #=> "PSY - GANGNAM STYLE"
|
18
|
-
```
|
23
|
+
videos = Yt::Collections::Videos.new
|
24
|
+
videos.where(order: 'viewCount').first.title #=> "PSY - GANGNAM STYLE"
|
19
25
|
|
20
26
|
## 0.11.0 - 2014-08-17
|
21
27
|
|
@@ -29,11 +35,9 @@ token). For security reasons, Yt will not print it out anymore by default.
|
|
29
35
|
If this is acceptable, then you are good to go.
|
30
36
|
If you want the old behavior, set the `log_level` of Yt to `:debug`:
|
31
37
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
end
|
36
|
-
```
|
38
|
+
Yt.configure do |config|
|
39
|
+
config.log_level = :debug
|
40
|
+
end
|
37
41
|
|
38
42
|
* [ENHANCEMENT] Add `log_level` to Yt.configuration
|
39
43
|
|
@@ -73,14 +77,12 @@ exactly how many items are returned.
|
|
73
77
|
If this is acceptable, then you are good to go.
|
74
78
|
If you want the old behavior, replace `size` with `count`:
|
75
79
|
|
76
|
-
|
77
|
-
|
78
|
-
#
|
79
|
-
|
80
|
-
#
|
81
|
-
account.videos.
|
82
|
-
account.videos.count # => retrieves *all* the pages of the account’s videos
|
83
|
-
```
|
80
|
+
account = Yt::Account.new access_token: 'ya29...'
|
81
|
+
# old behavior
|
82
|
+
account.videos.size # => retrieved *all* the pages of the account’s videos
|
83
|
+
# new behavior
|
84
|
+
account.videos.size # => retrieves only the first page, returning the totalResults counter
|
85
|
+
account.videos.count # => retrieves *all* the pages of the account’s videos
|
84
86
|
|
85
87
|
* [ENHANCEMENT] Calling `size` on a collection does not load all the pages of the collection
|
86
88
|
* [ENHANCEMENT] Alias `policy.time_updated` to more coherent `policy.updated_at`
|
@@ -148,13 +150,11 @@ If your code never declares instances of `Yt::Rating`, or never calls the
|
|
148
150
|
|
149
151
|
If it does, then *simply replace `update` with `set`*:
|
150
152
|
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
rating.set :like
|
157
|
-
```
|
153
|
+
rating = Yt::Rating.new
|
154
|
+
# old syntax
|
155
|
+
rating.update :like
|
156
|
+
# new syntax
|
157
|
+
rating.set :like
|
158
158
|
|
159
159
|
* [ENHANCEMENT] `rating.set` replaces `rating.update` to rate a video
|
160
160
|
|
@@ -201,15 +201,13 @@ a YouTube user tries to subscribe to her/his own YouTube channel. Instead,
|
|
201
201
|
If this is acceptable, then you are good to go.
|
202
202
|
If you want the old behavior, replace `subscribe` with `subscribe!`:
|
203
203
|
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
#
|
208
|
-
|
209
|
-
#
|
210
|
-
channel.subscribe # =>
|
211
|
-
channel.subscribe! # => raises an error
|
212
|
-
```
|
204
|
+
account = Yt::Account.new access_token: 'ya29...'
|
205
|
+
channel = account.channel
|
206
|
+
# old behavior
|
207
|
+
channel.subscribe # => raised an error
|
208
|
+
# new behavior
|
209
|
+
channel.subscribe # => nil
|
210
|
+
channel.subscribe! # => raises an error
|
213
211
|
|
214
212
|
* [ENHANCEMENT] `channel.subscribe` does not raise error when trying to subscribe to one’s own channel
|
215
213
|
|
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.11.
|
44
|
+
gem 'yt', '~> 0.11.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*)
|
@@ -95,6 +95,9 @@ Use [Yt::ContentOwner](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models
|
|
95
95
|
* authenticate as a YouTube content owner
|
96
96
|
* list the channels partnered with a YouTube content owner
|
97
97
|
* list the claims administered by the content owner
|
98
|
+
* list and delete the references administered by the content owner
|
99
|
+
* list the policies and policy rules administered by the content owner
|
100
|
+
* create assets
|
98
101
|
|
99
102
|
```ruby
|
100
103
|
# Content owners can be initialized with access token, refresh token or an authorization code
|
@@ -105,9 +108,19 @@ content_owner.partnered_channels.first #=> #<Yt::Models::Channel @id=...>
|
|
105
108
|
|
106
109
|
content_owner.claims.where(q: 'Fullscreen').count #=> 24
|
107
110
|
content_owner.claims.first #=> #<Yt::Models::Claim @id=...>
|
111
|
+
content_owner.claims.first.video_id #=> 'MESycYJytkU'
|
112
|
+
content_owner.claims.first.status #=> "active"
|
108
113
|
|
109
|
-
content_owner.references.where(asset_id: "ABCDEFG").first
|
110
|
-
|
114
|
+
reference = content_owner.references.where(asset_id: "ABCDEFG").first #=> #<Yt::Models::Reference @id=...>
|
115
|
+
reference.delete #=> true
|
116
|
+
|
117
|
+
content_owner.policies.first #=> #<Yt::Models::Policy @id=...>
|
118
|
+
content_owner.policies.first.name #=> "Track in all countries"
|
119
|
+
content_owner.policies.first.rules.first #=> #<Yt::Models::PolicyRule @id=...>
|
120
|
+
content_owner.policies.first.rules.first.action #=> "monetize"
|
121
|
+
content_owner.policies.first.rules.first.included_territories #=> ["US", "CA"]
|
122
|
+
|
123
|
+
content_owner.create_asset type: 'web' #=> #<Yt::Models::Asset @id=...>
|
111
124
|
```
|
112
125
|
|
113
126
|
*All the above methods require authentication (see below).*
|
@@ -398,6 +411,22 @@ item.delete #=> true
|
|
398
411
|
*The methods above require to be authenticated as the playlist’s owner (see below).*
|
399
412
|
|
400
413
|
|
414
|
+
Yt::Collections::Videos
|
415
|
+
-----------------------
|
416
|
+
|
417
|
+
Use [Yt::Collections::Videos](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Collections/Videos) to:
|
418
|
+
|
419
|
+
* search for videos
|
420
|
+
|
421
|
+
```ruby
|
422
|
+
videos = Yt::Collections::Videos.new
|
423
|
+
videos.where(order: 'viewCount').first.title #=> "PSY - GANGNAM STYLE"
|
424
|
+
videos.where(q: 'Fullscreen CreatorPlatform', safe_search: 'none').size #=> 324
|
425
|
+
```
|
426
|
+
|
427
|
+
*The methods above do not require authentication.*
|
428
|
+
|
429
|
+
|
401
430
|
Yt::Annotation
|
402
431
|
--------------
|
403
432
|
|
@@ -416,6 +445,68 @@ annotation.has_link_to_playlist? #=> true
|
|
416
445
|
|
417
446
|
*Annotations do not require authentication.*
|
418
447
|
|
448
|
+
Yt::MatchPolicy
|
449
|
+
---------------
|
450
|
+
|
451
|
+
Use [Yt::MatchPolicy](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models/MatchPolicy) to:
|
452
|
+
|
453
|
+
* update the policy used by an asset
|
454
|
+
|
455
|
+
```ruby
|
456
|
+
content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ'
|
457
|
+
match_policy = Yt::MatchPolicy.new asset_id: 'ABCD12345678', auth: content_owner
|
458
|
+
match_policy.update policy_id: 'aBcdEF6g-HJ' #=> true
|
459
|
+
|
460
|
+
Yt::Asset
|
461
|
+
---------
|
462
|
+
|
463
|
+
Use [Yt::Asset](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models/Asset) to:
|
464
|
+
|
465
|
+
* read the ownership of an asset
|
466
|
+
|
467
|
+
```ruby
|
468
|
+
|
469
|
+
content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ'
|
470
|
+
asset = Yt::Asset.new id: 'ABCD12345678', auth: content_owner
|
471
|
+
asset.ownership #=> #<Yt::Models::Ownership @general=...>
|
472
|
+
asset.general_owners.first.owner #=> 'FullScreen'
|
473
|
+
asset.general_owners.first.everywhere? #=> true
|
474
|
+
```
|
475
|
+
|
476
|
+
*The methods above require to be authenticated as the video’s content owner (see below).*
|
477
|
+
|
478
|
+
Yt::Ownership
|
479
|
+
-------------
|
480
|
+
|
481
|
+
Use [Yt::Ownership](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models/Ownership) to:
|
482
|
+
|
483
|
+
* update the ownership of an asset
|
484
|
+
|
485
|
+
```ruby
|
486
|
+
content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ'
|
487
|
+
ownership = Yt::Ownership.new asset_id: 'ABCD12345678', auth: $content_owner
|
488
|
+
new_general_owner_attrs = {ratio: 100, owner: 'FullScreen', type: 'include', territories: ['US', 'CA']}
|
489
|
+
ownership.update general: [new_general_owner_attrs]
|
490
|
+
```
|
491
|
+
|
492
|
+
*The methods above require to be authenticated as the video’s content owner (see below).*
|
493
|
+
|
494
|
+
Yt::AdvertisingOptionsSet
|
495
|
+
-------------------------
|
496
|
+
|
497
|
+
Use [Yt::AdvertisingOptionsSet](http://rubydoc.info/github/Fullscreen/yt/master/Yt/Models/AdvertisingOptionsSet) to:
|
498
|
+
|
499
|
+
* update the advertising settings of a video
|
500
|
+
|
501
|
+
```ruby
|
502
|
+
content_owner = Yt::ContentOwner.new owner_name: 'CMSname', access_token: 'ya29.1.ABCDEFGHIJ'
|
503
|
+
ad_options = Yt::AdvertisingOptionsSet.new video_id: 'MESycYJytkU', auth: $content_owner
|
504
|
+
ad_options.update ad_formats: %w(standard_instream long) #=> true
|
505
|
+
```
|
506
|
+
|
507
|
+
*The methods above require to be authenticated as the video’s content owner (see below).*
|
508
|
+
|
509
|
+
|
419
510
|
Configuring your app
|
420
511
|
====================
|
421
512
|
|
data/lib/yt.rb
CHANGED
@@ -7,6 +7,7 @@ require 'yt/models/match_policy'
|
|
7
7
|
require 'yt/models/playlist'
|
8
8
|
require 'yt/models/playlist_item'
|
9
9
|
require 'yt/models/video'
|
10
|
+
require 'yt/models/ownership'
|
10
11
|
|
11
12
|
# An object-oriented Ruby client for YouTube.
|
12
13
|
# Helps creating applications that need to interact with YouTube objects.
|
@@ -0,0 +1,19 @@
|
|
1
|
+
module Yt
|
2
|
+
module Actions
|
3
|
+
# Abstract module that contains methods common to every action
|
4
|
+
module Base
|
5
|
+
|
6
|
+
private
|
7
|
+
|
8
|
+
# If we dropped support for ActiveSupport 3, then we could simply
|
9
|
+
# invoke transform_keys!{|key| key.to_s.underscore.to_sym}
|
10
|
+
def underscore_keys!(hash)
|
11
|
+
hash.dup.each_key{|key| hash[underscore key] = hash.delete key}
|
12
|
+
end
|
13
|
+
|
14
|
+
def underscore(value)
|
15
|
+
value.to_s.underscore.to_sym
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/yt/actions/insert.rb
CHANGED
data/lib/yt/actions/list.rb
CHANGED
@@ -66,7 +66,6 @@ module Yt
|
|
66
66
|
end
|
67
67
|
|
68
68
|
def request(params = {})
|
69
|
-
camelize_keys! params[:params] if params.fetch(:camelize_params, true)
|
70
69
|
@last_request = Yt::Request.new params
|
71
70
|
end
|
72
71
|
|
@@ -92,12 +91,6 @@ module Yt
|
|
92
91
|
def list_resources
|
93
92
|
self.class
|
94
93
|
end
|
95
|
-
|
96
|
-
def camelize_keys!(hash = {})
|
97
|
-
hash.dup.each_key do |key|
|
98
|
-
hash[key.to_s.camelize(:lower).to_sym] = hash.delete key
|
99
|
-
end
|
100
|
-
end
|
101
94
|
end
|
102
95
|
end
|
103
96
|
end
|
data/lib/yt/actions/modify.rb
CHANGED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'yt/collections/base'
|
2
|
+
require 'yt/models/asset'
|
3
|
+
|
4
|
+
module Yt
|
5
|
+
module Collections
|
6
|
+
# Provides methods to interact with a collection of Content ID assets.
|
7
|
+
#
|
8
|
+
# Resources with assets are: {Yt::Models::ContentOwner content owners}.
|
9
|
+
class Assets < Base
|
10
|
+
def insert(attributes = {})
|
11
|
+
underscore_keys! attributes
|
12
|
+
body = {type: attributes[:type]}
|
13
|
+
params = {on_behalf_of_content_owner: @auth.owner_name}
|
14
|
+
do_insert(params: params, body: body)
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def new_item(data)
|
20
|
+
Yt::Asset.new data: data, auth: @auth
|
21
|
+
end
|
22
|
+
|
23
|
+
# @return [Hash] the parameters to submit to YouTube to add a asset.
|
24
|
+
# @see https://developers.google.com/youtube/partner/docs/v1/assets/insert
|
25
|
+
def insert_params
|
26
|
+
super.tap do |params|
|
27
|
+
params[:path] = '/youtube/partner/v1/assets'
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -7,11 +7,18 @@ module Yt
|
|
7
7
|
#
|
8
8
|
# Resources with claims are: {Yt::Models::ContentOwner content owners}.
|
9
9
|
class Claims < Base
|
10
|
+
def insert(attributes = {})
|
11
|
+
underscore_keys! attributes
|
12
|
+
body = attributes.slice :asset_id, :video_id, :content_type
|
13
|
+
body[:policy] = {id: attributes[:policy_id]} if attributes[:policy_id]
|
14
|
+
params = {on_behalf_of_content_owner: @auth.owner_name}
|
15
|
+
do_insert(params: params, body: body)
|
16
|
+
end
|
10
17
|
|
11
18
|
private
|
12
19
|
|
13
20
|
def new_item(data)
|
14
|
-
Yt::Claim.new data: data
|
21
|
+
Yt::Claim.new data: data, auth: @auth
|
15
22
|
end
|
16
23
|
|
17
24
|
# @return [Hash] the parameters to submit to YouTube to list claims
|
@@ -25,6 +32,14 @@ module Yt
|
|
25
32
|
end
|
26
33
|
end
|
27
34
|
|
35
|
+
# @return [Hash] the parameters to submit to YouTube to add a claim.
|
36
|
+
# @see https://developers.google.com/youtube/partner/docs/v1/claims/insert
|
37
|
+
def insert_params
|
38
|
+
super.tap do |params|
|
39
|
+
params[:path] = '/youtube/partner/v1/claims'
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
28
43
|
def claims_params
|
29
44
|
apply_where_params! on_behalf_of_content_owner: @parent.owner_name
|
30
45
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require 'yt/collections/resources'
|
2
|
+
require 'yt/models/ownership'
|
3
|
+
|
4
|
+
module Yt
|
5
|
+
module Collections
|
6
|
+
# Provides methods to interact with a the ownership of a YouTube resource.
|
7
|
+
#
|
8
|
+
# Resources with ownerships are: {Yt::Models::Asset assets}.
|
9
|
+
class Ownerships < Resources
|
10
|
+
|
11
|
+
private
|
12
|
+
|
13
|
+
def new_item(data)
|
14
|
+
Yt::Ownership.new data: data, asset_id: @parent.id, auth: @auth
|
15
|
+
end
|
16
|
+
|
17
|
+
# @return [Hash] the parameters to submit to YouTube to get ownerships.
|
18
|
+
# @see https://developers.google.com/youtube/partner/docs/v1/ownership/get
|
19
|
+
def list_params
|
20
|
+
super.tap do |params|
|
21
|
+
params[:path] = "/youtube/partner/v1/assets/#{@parent.id}/ownership"
|
22
|
+
params[:params] = {on_behalf_of_content_owner: @auth.owner_name}
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
# @private
|
27
|
+
# @note Ownerships overwrites +fetch_page+ since it’s a get.
|
28
|
+
def fetch_page(params = {})
|
29
|
+
response = request(params).run
|
30
|
+
{items: [response.body], token: nil}
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|