Skip to content

Commit 38f6725

Browse files
authored
Remove pagination and validation, keep extraction only
1 parent b3bdf48 commit 38f6725

3 files changed

Lines changed: 2 additions & 116 deletions

File tree

tests/test_users.py

Lines changed: 0 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
11
# -*- coding: utf-8 -*-
2-
from copy import deepcopy
3-
from urllib.parse import parse_qs, urlsplit
4-
5-
import pytest
6-
import trakt
72
from trakt.movies import Movie
83
from trakt.people import Person
94
from trakt.tv import TVEpisode, TVSeason, TVShow
@@ -130,67 +125,6 @@ def test_watched():
130125
assert all([isinstance(s, TVShow) for s in sean.watched_shows])
131126

132127

133-
def test_watched_movies_pagination():
134-
sean = User('sean')
135-
client = trakt.core.api()
136-
request_calls = []
137-
original_request = client.request
138-
139-
def request(method, uri, data=None):
140-
request_calls.append((method, uri, data))
141-
if uri.startswith('users/sean/watched/movies?'):
142-
query = parse_qs(urlsplit(f'https://api.trakt.tv/{uri}').query)
143-
if query.get('limit') == ['1']:
144-
response = original_request('GET', 'users/sean/watched/movies')
145-
return deepcopy(response[:1])
146-
if uri == 'users/sean/watched/movies':
147-
response = original_request('GET', 'users/sean/watched/movies')
148-
return deepcopy(response)
149-
return original_request(method, uri, data)
150-
151-
client.request = request
152-
try:
153-
expected_uri = 'users/sean/watched/movies?page=2&limit=1'
154-
watched_movies = sean.get_watched_movies(page=2, limit=1)
155-
assert request_calls[-1] == ('get', expected_uri, None)
156-
assert len(watched_movies) == 1
157-
assert all([isinstance(movie, Movie) for movie in watched_movies])
158-
159-
watched_movies = sean.get_watched_movies(limit=1)
160-
assert request_calls[-1] == ('get', 'users/sean/watched/movies?limit=1',
161-
None)
162-
assert len(watched_movies) == 1
163-
assert all([isinstance(movie, Movie) for movie in watched_movies])
164-
165-
watched_movies = sean.watched_movies
166-
assert request_calls[-1] == ('get', 'users/sean/watched/movies', None)
167-
assert all([isinstance(movie, Movie) for movie in watched_movies])
168-
finally:
169-
client.request = original_request
170-
171-
172-
def test_watched_movies_pagination_validation():
173-
sean = User('sean')
174-
175-
with pytest.raises(ValueError, match='page must be a positive integer'):
176-
sean.get_watched_movies(page=0)
177-
178-
with pytest.raises(ValueError, match='page must be a positive integer'):
179-
sean.get_watched_movies(page=-1)
180-
181-
with pytest.raises(ValueError, match='page must be a valid integer'):
182-
sean.get_watched_movies(page='invalid')
183-
184-
with pytest.raises(ValueError, match='limit must be a positive integer'):
185-
sean.get_watched_movies(limit=0)
186-
187-
with pytest.raises(ValueError, match='limit must be a positive integer'):
188-
sean.get_watched_movies(limit=-1)
189-
190-
with pytest.raises(ValueError, match='limit must be a valid integer'):
191-
sean.get_watched_movies(limit='invalid')
192-
193-
194128
def test_stats():
195129
sean = User('sean')
196130
assert isinstance(sean.get_stats(), dict)

trakt/users.py

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,13 @@
33

44
from dataclasses import dataclass, fields
55
from typing import Any, NamedTuple, Optional, Union
6-
from urllib.parse import urlencode
76

87
from trakt.core import delete, get, post
98
from trakt.mixins import DataClassMixin, IdsMixin
109
from trakt.movies import Movie
1110
from trakt.people import Person
1211
from trakt.tv import TVEpisode, TVSeason, TVShow
13-
from trakt.utils import slugify, validate_pagination_param
12+
from trakt.utils import slugify
1413

1514
__author__ = 'Jon Nappi'
1615
__all__ = ['User', 'UserList', 'PublicList', 'Request', 'follow', 'get_all_requests',
@@ -511,40 +510,13 @@ def show_collection(self):
511510
yield self._show_collection
512511

513512
def _build_watched_movies(self, data):
514-
"""Parse raw API response data into a list of :class:`Movie` objects.
515-
516-
:param data: List of raw movie dicts from the Trakt API
517-
:return: List of :class:`Movie` instances
518-
"""
519513
watched_movies = []
520514
for movie in data:
521515
movie_data = movie.pop('movie')
522516
movie_data.update(movie)
523517
watched_movies.append(Movie(**movie_data))
524518
return watched_movies
525519

526-
@get
527-
def get_watched_movies(self, page=None, limit=None):
528-
"""Watched progress for all :class:`Movie` objects for this
529-
:class:`User`, with optional pagination.
530-
531-
:param page: Page number (positive integer, optional)
532-
:param limit: Number of results per page (positive integer, optional)
533-
:return: List of :class:`Movie` instances for the requested page
534-
:raises ValueError: If page or limit are not valid positive integers
535-
"""
536-
uri = 'users/{user}/watched/movies'.format(user=slugify(self.username))
537-
params = {}
538-
if page is not None:
539-
params['page'] = validate_pagination_param('page', page)
540-
if limit is not None:
541-
params['limit'] = validate_pagination_param('limit', limit)
542-
if params:
543-
uri += '?' + urlencode(params)
544-
545-
data = yield uri
546-
yield self._build_watched_movies(data)
547-
548520
@property
549521
@get
550522
def watched_movies(self):

trakt/utils.py

Lines changed: 1 addition & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
from datetime import datetime, timezone
55

66
__author__ = 'Jon Nappi'
7-
__all__ = ['slugify', 'airs_date', 'now', 'timestamp', 'extract_ids',
8-
'validate_pagination_param']
7+
__all__ = ['slugify', 'airs_date', 'now', 'timestamp', 'extract_ids']
98

109

1110
def slugify(value):
@@ -57,22 +56,3 @@ def extract_ids(id_dict):
5756
"""
5857
id_dict.update(id_dict.pop('ids', {}))
5958
return id_dict
60-
61-
62-
def validate_pagination_param(name, value):
63-
"""Validate and coerce a pagination parameter (page or limit) to a positive integer.
64-
65-
:param name: Parameter name used in error messages
66-
:param value: Value to validate
67-
:return: The validated integer value
68-
:raises ValueError: If the value is not a valid positive integer
69-
"""
70-
try:
71-
value = int(value)
72-
except (TypeError, ValueError):
73-
raise ValueError(f'{name} must be a valid integer')
74-
75-
if value < 1:
76-
raise ValueError(f'{name} must be a positive integer')
77-
78-
return value

0 commit comments

Comments
 (0)