Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix #8

Merged
merged 1 commit into from
Jan 25, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 4 additions & 6 deletions flexget/tests/test_misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,13 +40,11 @@ def test_disable_builtins(self, execute_task):
# Execute the task once, then we'll make sure seen plugin isn't rejecting on future executions
execute_task('test')
task = execute_task('test')
assert task.find_entry('accepted', title='dupe1') and task.find_entry(
'accepted', title='dupe2'
), 'disable is not working?'
assert task.find_entry('accepted', title='dupe1'), 'disable is not working?'
assert task.find_entry('accepted', title='dupe2'), 'disable is not working?'
task = execute_task('test2')
assert task.find_entry(title='dupe1').accepted and task.find_entry(
'accepted', title='dupe2'
), 'disable is not working?'
assert task.find_entry(title='dupe1').accepted, 'disable is not working?'
assert task.find_entry('accepted', title='dupe2'), 'disable is not working?'


@pytest.mark.online
Expand Down
5 changes: 4 additions & 1 deletion flexget/tests/test_pathscrub.py
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,10 @@ def test_windows_paths(self):

def test_degenerate(self):
# If path is reduced to nothing, make sure it complains
with pytest.raises(ValueError):
with pytest.raises(
ValueError,
match='Nothing was left after stripping invalid characters from path `<<<<:>>>>`!',
):
pathscrub('<<<<:>>>>', os='windows', filename=True)

def test_space_around(self):
Expand Down
5 changes: 4 additions & 1 deletion flexget/tests/test_seen.py
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,10 @@ def test_seen(self, execute_task):
# test that we don't filter reject on non-string fields (ie, seen same imdb_score)

task = execute_task('test_number')
assert task.find_entry(title='New title 1') and task.find_entry(title='New title 2'), (
assert task.find_entry(title='New title 1'), (
'Item should not have been rejected because of number field'
)
assert task.find_entry(title='New title 2'), (
'Item should not have been rejected because of number field'
)

Expand Down
3 changes: 2 additions & 1 deletion flexget/tests/test_series.py
Original file line number Diff line number Diff line change
Expand Up @@ -1293,7 +1293,8 @@ class TestBacklog:
def testBacklog(self, manager, execute_task):
"""Series plugin: backlog"""
task = execute_task('backlog')
assert task.entries and not task.accepted, 'no entries at the start'
assert task.entries, 'no entries at the start'
assert not task.accepted, 'no entries at the start'
# simulate test going away from the task
del manager.config['tasks']['backlog']['mock']
age_series(hours=12)
Expand Down
105 changes: 70 additions & 35 deletions flexget/tests/test_seriesparser.py
Original file line number Diff line number Diff line change
Expand Up @@ -88,104 +88,132 @@ def test_unwanted_disc(self, parse_invalid):
def test_season_x_ep(self, parse):
"""SeriesParser: 01x02"""
s = parse(name='Something', data='Something.01x02-FlexGet')
assert s.season == 1 and s.episode == 2, 'failed to parse 01x02'
assert s.season == 1, 'failed to parse 01x02'
assert s.episode == 2, 'failed to parse 01x02'

s = parse(name='Something', data='Something 1 x 2-FlexGet')
assert s.season == 1 and s.episode == 2, 'failed to parse 1 x 2'
assert s.season == 1, 'failed to parse 1 x 2'
assert s.episode == 2, 'failed to parse 1 x 2'

# Ticket #732
s = parse(name='Something', data='Something - This is the Subtitle 14x9 [Group-Name]')
assert s.season == 14 and s.episode == 9, f'failed to parse {s.data}'
assert s.season == 14, f'failed to parse {s.data}'
assert s.episode == 9, f'failed to parse {s.data}'

def test_ep_in_square_brackets(self, parse):
"""SeriesParser: [S01] [E02] NOT IMPLEMENTED"""
s = parse(name='Something', data='Something [S01] [E02]')
assert s.season == 1 and s.episode == 2, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

def test_ep_in_parenthesis(self, parse):
"""SeriesParser: test ep in parenthesis"""
s = parse(name='Something', data='Something (S01E02)')
assert s.season == 1 and s.episode == 2, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

def test_season_episode(self, parse):
"""SeriesParser: season X, episode Y"""
s = parse(name='Something', data='Something - Season 3, Episode 2')
assert s.season == 3 and s.episode == 2, f'failed to parse {s}'
assert s.season == 3, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

s = parse(name='Something', data='Something - Season2, Episode2')
assert s.season == 2 and s.episode == 2, f'failed to parse {s}'
assert s.season == 2, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

s = parse(name='Something', data='Something - Season2 Episode2')
assert s.season == 2 and s.episode == 2, f'failed to parse {s}'
assert s.season == 2, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

@pytest.mark.xfail(reason='Not supported in guessit, works for internal parser')
def test_series_episode(self, parse):
"""SeriesParser: series X, episode Y"""
s = parse(name='Something', data='Something - Series 2, Episode 2')
assert s.season == 2 and s.episode == 2, f'failed to parse {s}'
assert s.season == 2, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

s = parse(name='Something', data='Something - Series3, Episode2')
assert s.season == 3 and s.episode == 2, f'failed to parse {s}'
assert s.season == 3, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

s = parse(name='Something', data='Something - Series4 Episode2')
assert s.season == 4 and s.episode == 2, f'failed to parse {s}'
assert s.season == 4, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

def test_episode(self, parse):
"""SeriesParser: episode X (assume season 1)"""
s = parse(name='Something', data='Something - Episode2')
assert s.season == 1 and s.episode == 2, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

s = parse(name='Something', data='Something - Episode 2')
assert s.season == 1 and s.episode == 2, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

s = parse(name='Something', data='Something - Episode VIII')
assert s.season == 1 and s.episode == 8, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 8, f'failed to parse {s}'

def test_ep(self, parse):
"""SeriesParser: ep X (assume season 1)"""
s = parse(name='Something', data='Something - Ep2')
assert s.season == 1 and s.episode == 2, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

s = parse(name='Something', data='Something - Ep 2')
assert s.season == 1 and s.episode == 2, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

s = parse(name='Something', data='Something - Ep VIII')
assert s.season == 1 and s.episode == 8, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 8, f'failed to parse {s}'

s = parse(name='Something', data='Something - E01')
assert s.season == 1 and s.episode == 1, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 1, f'failed to parse {s}'

def test_season_episode_of_total(self, parse):
"""SeriesParser: season X YofZ"""
s = parse(name='Something', data='Something Season 2 2of12')
assert s.season == 2 and s.episode == 2, f'failed to parse {s}'
assert s.season == 2, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

s = parse(name='Something', data='Something Season 2, 2 of 12')
assert s.season == 2 and s.episode == 2, f'failed to parse {s}'
assert s.season == 2, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

def test_episode_of_total(self, parse):
"""SeriesParser: YofZ (assume season 1)"""
s = parse(name='Something', data='Something 2of12')
assert s.season == 1 and s.episode == 2, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

s = parse(name='Something', data='Something 2 of 12')
assert s.season == 1 and s.episode == 2, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'

def test_part(self, parse):
"""SeriesParser: test parsing part numeral (assume season 1)"""
s = parse(name='Test', data='Test.Pt.I.720p-FlexGet')
assert s.season == 1 and s.episode == 1, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 1, f'failed to parse {s}'
s = parse(name='Test', data='Test.Pt.VI.720p-FlexGet')
assert s.season == 1 and s.episode == 6, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 6, f'failed to parse {s}'
s = parse(name='Test', data='Test.Part.2.720p-FlexGet')
assert s.season == 1 and s.episode == 2, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 2, f'failed to parse {s}'
assert s.identifier == 'S01E02'
s = parse(name='Test', data='Test.Part3.720p-FlexGet')
assert s.season == 1 and s.episode == 3, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 3, f'failed to parse {s}'
s = parse(name='Test', data='Test.Season.3.Part.IV')
assert s.season == 3 and s.episode == 4, f'failed to parse {s}'
assert s.season == 3, f'failed to parse {s}'
assert s.episode == 4, f'failed to parse {s}'
s = parse(name='Test', data='Test.Part.One')
assert s.season == 1 and s.episode == 1, f'failed to parse {s}'
assert s.season == 1, f'failed to parse {s}'
assert s.episode == 1, f'failed to parse {s}'

def test_digits(self, parse):
"""SeriesParser: digits (UID)"""
Expand All @@ -208,7 +236,8 @@ def test_digits(self, parse):
def test_quality(self, parse):
"""SeriesParser: quality"""
s = parse(name='Foo Bar', data='Foo.Bar.S01E01.720p.HDTV.x264-FlexGet')
assert s.season == 1 and s.episode == 1, f'failed to parse episodes from {s.data}'
assert s.season == 1, f'failed to parse episodes from {s.data}'
assert s.episode == 1, f'failed to parse episodes from {s.data}'
assert s.quality.name == '720p hdtv h264', f'failed to parse quality from {s.data}'

s = parse(name='Test', data='Test.S01E01.720p-FlexGet')
Expand All @@ -223,24 +252,29 @@ def test_quality(self, parse):
def test_quality_parenthesis(self, parse):
"""SeriesParser: quality in parenthesis"""
s = parse(name='Foo Bar', data='Foo.Bar.S01E01.[720p].HDTV.x264-FlexGet')
assert s.season == 1 and s.episode == 1, f'failed to parse episodes from {s.data}'
assert s.season == 1, f'failed to parse episodes from {s.data}'
assert s.episode == 1, f'failed to parse episodes from {s.data}'
assert s.quality.name == '720p hdtv h264', f'failed to parse quality from {s.data}'

s = parse(name='Foo Bar', data='Foo.Bar.S01E01.(720p).HDTV.x264-FlexGet')
assert s.season == 1 and s.episode == 1, f'failed to parse episodes from {s.data}'
assert s.season == 1, f'failed to parse episodes from {s.data}'
assert s.episode == 1, f'failed to parse episodes from {s.data}'
assert s.quality.name == '720p hdtv h264', f'failed to parse quality from {s.data}'

s = parse(name='Foo Bar', data='[720p]Foo.Bar.S01E01.HDTV.x264-FlexGet')
assert s.season == 1 and s.episode == 1, f'failed to parse episodes from {s.data}'
assert s.season == 1, f'failed to parse episodes from {s.data}'
assert s.episode == 1, f'failed to parse episodes from {s.data}'
assert s.quality.name == '720p hdtv h264', f'failed to parse quality from {s.data}'

def test_numeric_names(self, parse):
"""SeriesParser: numeric names (24)"""
s = parse(name='24', data='24.1x2-FlexGet')
assert s.season == 1 and s.episode == 2, f'failed to parse {s.data}'
assert s.season == 1, f'failed to parse {s.data}'
assert s.episode == 2, f'failed to parse {s.data}'

s = parse(name='90120', data='90120.1x2-FlexGet')
assert s.season == 1 and s.episode == 2, f'failed to parse {s.data}'
assert s.season == 1, f'failed to parse {s.data}'
assert s.episode == 2, f'failed to parse {s.data}'

def test_group_prefix(self, parse):
"""SeriesParser: [group] before name"""
Expand All @@ -259,7 +293,8 @@ def test_hd_prefix(self, parse):
def test_partially_numeric(self, parse):
"""SeriesParser: partially numeric names"""
s = parse(name='Foo 2009', data='Foo.2009.S02E04.HDTV.XviD-2HD[FlexGet]')
assert s.season == 2 and s.episode == 4, f'failed to parse {s.data}'
assert s.season == 2, f'failed to parse {s.data}'
assert s.episode == 4, f'failed to parse {s.data}'
assert s.quality.name == 'hdtv xvid', f'failed to parse quality from {s.data}'

def test_ignore_seasonpacks_by_default(self, parse, parse_valid, parse_invalid):
Expand Down
3 changes: 2 additions & 1 deletion flexget/tests/test_trakt.py
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,8 @@ def test_season_lookup(self, execute_task):
entry = task.entries[0]

assert entry['series_name'] == 'Fargo', 'series lookup failed'
assert entry['series_season'] == 1 and entry['season_pack'], 'season lookup failed'
assert entry['series_season'] == 1, 'season lookup failed'
assert entry['season_pack'], 'season lookup failed'
assert entry['trakt_season_id'] == 61286, 'season lookup failed'


Expand Down
2 changes: 1 addition & 1 deletion flexget/tests/test_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ def test_parse_filesize(self, size_text, expected):
assert parse_filesize(size_text) == pytest.approx(expected)

def test_parse_filesize_ib_not_valid(self):
with pytest.raises(ValueError):
with pytest.raises(ValueError, match='100 ib does not look like a file size'):
parse_filesize('100 ib')


Expand Down
18 changes: 9 additions & 9 deletions flexget/tests/test_wordpress.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,24 +26,24 @@ class TestWordPress:
"""

def test_task_aborts_for_status_not_ok(self, execute_task, monkeypatch):
_mock_session_response(mock.Mock(ok=False), monkeypatch)
with pytest.raises(TaskAbort):
_mock_session_response(mock.Mock(ok=False), monkeypatch)
execute_task('test')

def test_task_aborts_for_requests_exception(self, execute_task, monkeypatch):
monkeypatch.setattr('requests.Session.send', mock.Mock(side_effect=RequestException))
with pytest.raises(TaskAbort):
monkeypatch.setattr('requests.Session.send', mock.Mock(side_effect=RequestException))
execute_task('test')

def test_task_aborts_when_response_has_no_valid_cookies(self, execute_task, monkeypatch):
invalid_cookies = {
'__cfduid': '16a85284e4ee53f4933760b08b2bc82c',
'wordpress_test_cookie': 'test+cookie',
}
_mock_session_response(
mock.Mock(cookies=cookiejar_from_dict(invalid_cookies), history=[]), monkeypatch
)
with pytest.raises(TaskAbort):
invalid_cookies = {
'__cfduid': '16a85284e4ee53f4933760b08b2bc82c',
'wordpress_test_cookie': 'test+cookie',
}
_mock_session_response(
mock.Mock(cookies=cookiejar_from_dict(invalid_cookies), history=[]), monkeypatch
)
execute_task('test')

def test_cookies_collected_across_redirects(self, execute_task, monkeypatch):
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -139,7 +139,7 @@ line-length = 99
extend-exclude = ["flexget/ui"]

[tool.ruff.lint]
select = ["B", "C4", "E", "F", "I", "ISC", "PGH", "PLE", "RET", "RUF", "SIM", "TCH", "UP", "W"]
select = ["B", "C4", "E", "F", "I", "ISC", "PGH", "PLE", "PT", "RET", "RUF", "SIM", "TCH", "UP", "W"]
ignore = [
"B904", # TODO: enable this rule (requires a lot of manual work)
"E501", # TODO: enable this rule (requires a lot of manual work)
Expand Down
Loading