mnamer 2.6.1.dev2__tar.gz → 2.6.1.dev7__tar.gz

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 (76) hide show
  1. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/.github/workflows/pull_request.yml +2 -0
  2. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/.github/workflows/push.yml +2 -0
  3. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/PKG-INFO +1 -1
  4. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/__version__.py +1 -1
  5. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/target.py +2 -0
  6. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer.egg-info/PKG-INFO +1 -1
  7. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/__init__.py +6 -0
  8. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/network/test_endpoints__omdb.py +5 -5
  9. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/network/test_endpoints__tmdb.py +8 -8
  10. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/network/test_endpoints__tvdb.py +8 -12
  11. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/network/test_endpoints__tvmaze.py +2 -2
  12. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/.github/actions/init/action.yml +0 -0
  13. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/.github/actions/lint/action.yml +0 -0
  14. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/.github/actions/test/action.yml +0 -0
  15. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/.github/dependabot.yml +0 -0
  16. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/.github/workflows/publish.yml +0 -0
  17. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/.gitignore +0 -0
  18. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/.python-version +0 -0
  19. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/.vscode/settings.json +0 -0
  20. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/Dockerfile +0 -0
  21. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/LICENSE.txt +0 -0
  22. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/MANIFEST.in +0 -0
  23. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/README.md +0 -0
  24. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/assets/design.eps +0 -0
  25. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/assets/logo-2.png +0 -0
  26. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/assets/logo-3.png +0 -0
  27. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/assets/logo.png +0 -0
  28. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/assets/recording.mov +0 -0
  29. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/assets/screenshot.eps +0 -0
  30. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/assets/screenshot.png +0 -0
  31. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/makefile +0 -0
  32. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/__init__.py +0 -0
  33. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/__main__.py +0 -0
  34. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/argument.py +0 -0
  35. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/const.py +0 -0
  36. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/endpoints.py +0 -0
  37. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/exceptions.py +0 -0
  38. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/frontends.py +0 -0
  39. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/language.py +0 -0
  40. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/metadata.py +0 -0
  41. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/providers.py +0 -0
  42. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/py.typed +0 -0
  43. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/setting_spec.py +0 -0
  44. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/setting_store.py +0 -0
  45. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/tty.py +0 -0
  46. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/types.py +0 -0
  47. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer/utils.py +0 -0
  48. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer.egg-info/SOURCES.txt +0 -0
  49. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer.egg-info/dependency_links.txt +0 -0
  50. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer.egg-info/entry_points.txt +0 -0
  51. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer.egg-info/requires.txt +0 -0
  52. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/mnamer.egg-info/top_level.txt +0 -0
  53. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/pyproject.toml +0 -0
  54. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/pytest.ini +0 -0
  55. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/setup.cfg +0 -0
  56. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/conftest.py +0 -0
  57. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/e2e/__init__.py +0 -0
  58. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/e2e/conftest.py +0 -0
  59. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/e2e/test_directives.py +0 -0
  60. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/e2e/test_errors.py +0 -0
  61. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/e2e/test_moving.py +0 -0
  62. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/local/__init__.py +0 -0
  63. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/local/test_argument.py +0 -0
  64. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/local/test_language.py +0 -0
  65. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/local/test_metadata.py +0 -0
  66. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/local/test_setting_spec.py +0 -0
  67. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/local/test_setting_store.py +0 -0
  68. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/local/test_target.py +0 -0
  69. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/local/test_tty.py +0 -0
  70. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/local/test_utils.py +0 -0
  71. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/network/__init__.py +0 -0
  72. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/network/test_providers__omdb.py +0 -0
  73. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/network/test_providers__tmdb.py +0 -0
  74. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/network/test_providers__tvdb.py +0 -0
  75. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/tests/network/test_providers__tvmaze.py +0 -0
  76. {mnamer-2.6.1.dev2 → mnamer-2.6.1.dev7}/uv.lock +0 -0
@@ -26,6 +26,8 @@ jobs:
26
26
  - name: Testing (contributor)
27
27
  uses: ./.github/actions/test
28
28
  if: github.actor != 'dependabot[bot]'
29
+ env:
30
+ API_KEY_OMDB: ${{ secrets.API_KEY_OMDB }}
29
31
  with:
30
32
  local: true
31
33
  network: true
@@ -27,6 +27,8 @@ jobs:
27
27
  - uses: actions/checkout@v6
28
28
  - uses: ./.github/actions/init
29
29
  - uses: ./.github/actions/test
30
+ env:
31
+ API_KEY_OMDB: ${{ secrets.API_KEY_OMDB }}
30
32
  with:
31
33
  local: true
32
34
  network: true
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mnamer
3
- Version: 2.6.1.dev2
3
+ Version: 2.6.1.dev7
4
4
  Summary: A command-line utility for organizing media files.
5
5
  Author-email: Jessy Williams <jessy@jessywilliams.com>
6
6
  Maintainer-email: Jessy Williams <jessy@jessywilliams.com>
@@ -1,4 +1,4 @@
1
1
  # file generated by setuptools_scm
2
2
  # don't change, don't track in version control
3
3
 
4
- __version__ = "2.6.1.dev2"
4
+ __version__ = "2.6.1.dev7"
@@ -164,6 +164,8 @@ class Target:
164
164
  )
165
165
  or None
166
166
  )
167
+ if self._settings.language:
168
+ path_data["language"] = self._settings.language
167
169
  self.metadata.language = path_data.get("language")
168
170
  self.metadata.group = path_data.get("release_group")
169
171
  self.metadata.container = file_path.suffix or None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mnamer
3
- Version: 2.6.1.dev2
3
+ Version: 2.6.1.dev7
4
4
  Summary: A command-line utility for organizing media files.
5
5
  Author-email: Jessy Williams <jessy@jessywilliams.com>
6
6
  Maintainer-email: Jessy Williams <jessy@jessywilliams.com>
@@ -1,4 +1,5 @@
1
1
  import datetime as dt
2
+ from collections.abc import Mapping, Set
2
3
  from typing import Any, NamedTuple
3
4
 
4
5
  from mnamer.const import SUBTITLE_CONTAINERS
@@ -120,3 +121,8 @@ class MockRequestResponse:
120
121
  from json import loads
121
122
 
122
123
  return loads(self.content)
124
+
125
+
126
+ def assert_has_keys(actual: Mapping[str, object], expected: Set[str]) -> None:
127
+ """Assert every key in `expected` is present in `actual`; extras are ignored."""
128
+ assert expected <= actual.keys(), expected - actual.keys()
@@ -5,7 +5,7 @@ import pytest
5
5
  from mnamer.endpoints import omdb_search, omdb_title
6
6
  from mnamer.exceptions import MnamerException, MnamerNotFoundException
7
7
  from mnamer.providers import Omdb
8
- from tests import JUNK_TEXT, MockRequestResponse
8
+ from tests import JUNK_TEXT, MockRequestResponse, assert_has_keys
9
9
 
10
10
  pytestmark = [
11
11
  pytest.mark.network,
@@ -73,7 +73,7 @@ def test_omdb_title__media__movie():
73
73
  "Year",
74
74
  }
75
75
  result = omdb_title(Omdb.api_key, media="movie", title="ninja turtles")
76
- assert expected_top_level_keys.issuperset(set(result.keys()))
76
+ assert_has_keys(result, expected_top_level_keys)
77
77
  assert result["Response"]
78
78
  assert result["Type"] == "movie"
79
79
  assert result["Title"] == "Teenage Mutant Ninja Turtles"
@@ -106,7 +106,7 @@ def test_omdb_title__media__series():
106
106
  }
107
107
 
108
108
  result = omdb_title(Omdb.api_key, media="series", title="ninja turtles")
109
- assert set(result.keys()).issuperset(expected_top_level_keys)
109
+ assert_has_keys(result, expected_top_level_keys)
110
110
  assert result["Response"]
111
111
  assert result["Type"] == "series"
112
112
  assert result["Title"] == "Teenage Mutant Ninja Turtles"
@@ -135,13 +135,13 @@ def test_omdb_title__invalid_plot():
135
135
  def test_omdb_search__fields__top_level():
136
136
  expected_fields = {"Search", "Response", "totalResults"}
137
137
  result = omdb_search(Omdb.api_key, "ninja turtles")
138
- assert set(result.keys()) == expected_fields
138
+ assert_has_keys(result, expected_fields)
139
139
 
140
140
 
141
141
  def test_omdb_search__fields__search():
142
142
  expected_fields = {"Title", "Year", "imdbID", "Type", "Poster"}
143
143
  result = omdb_search(Omdb.api_key, "ninja turtles")["Search"][0]
144
- assert set(result.keys()) == expected_fields
144
+ assert_has_keys(result, expected_fields)
145
145
 
146
146
 
147
147
  def test_omdb_search__query__movie():
@@ -3,7 +3,7 @@ import pytest
3
3
  from mnamer.endpoints import tmdb_find, tmdb_movies, tmdb_search_movies
4
4
  from mnamer.exceptions import MnamerException, MnamerNotFoundException
5
5
  from mnamer.providers import Tmdb
6
- from tests import JUNK_TEXT, RUSSIAN_LANG
6
+ from tests import JUNK_TEXT, RUSSIAN_LANG, assert_has_keys
7
7
 
8
8
  pytestmark = [
9
9
  pytest.mark.network,
@@ -36,6 +36,7 @@ def test_tmdb_find__imdb_success():
36
36
  "poster_path",
37
37
  "popularity",
38
38
  "release_date",
39
+ "softcore",
39
40
  "title",
40
41
  "video",
41
42
  "vote_average",
@@ -43,11 +44,9 @@ def test_tmdb_find__imdb_success():
43
44
  }
44
45
  result = tmdb_find(Tmdb.api_key, "imdb_id", GOONIES_IMDB_ID)
45
46
  assert isinstance(result, dict)
46
- assert set(result.keys()).issuperset(expected_top_level_keys)
47
+ assert_has_keys(result, expected_top_level_keys)
47
48
  assert len(result.get("movie_results", {})) > 0
48
- assert expected_movie_results_keys.issuperset(
49
- set(result.get("movie_results", {})[0].keys())
50
- )
49
+ assert_has_keys(result["movie_results"][0], expected_movie_results_keys)
51
50
 
52
51
 
53
52
  def test_tmdb_find__api_key_fail():
@@ -105,7 +104,7 @@ def test_tmdb_movies__success():
105
104
  }
106
105
  result = tmdb_movies(Tmdb.api_key, GOONIES_TMDB_ID)
107
106
  assert isinstance(result, dict)
108
- assert set(result.keys()).issuperset(expected_top_level_keys)
107
+ assert_has_keys(result, expected_top_level_keys)
109
108
  assert result.get("title") == "The Goonies"
110
109
 
111
110
 
@@ -148,6 +147,7 @@ def test_tmdb_search_movies__success():
148
147
  "popularity",
149
148
  "poster_path",
150
149
  "release_date",
150
+ "softcore",
151
151
  "title",
152
152
  "video",
153
153
  "vote_average",
@@ -155,9 +155,9 @@ def test_tmdb_search_movies__success():
155
155
  }
156
156
  result = tmdb_search_movies(Tmdb.api_key, "the goonies", 1985)
157
157
  assert isinstance(result, dict)
158
- assert set(result.keys()).issuperset(expected_top_level_keys)
158
+ assert_has_keys(result, expected_top_level_keys)
159
159
  assert isinstance(result["results"], list)
160
- assert expected_results_keys.issuperset(set(result.get("results", [{}])[0].keys()))
160
+ assert_has_keys(result["results"][0], expected_results_keys)
161
161
  assert result["results"][0]["original_title"] == "The Goonies"
162
162
  result = tmdb_search_movies(Tmdb.api_key, "the goonies")
163
163
  assert len(result["results"]) > 1
@@ -12,7 +12,7 @@ from mnamer.endpoints import (
12
12
  from mnamer.exceptions import MnamerException, MnamerNotFoundException
13
13
  from mnamer.language import Language
14
14
  from mnamer.providers import Tvdb
15
- from tests import JUNK_TEXT, RUSSIAN_LANG
15
+ from tests import JUNK_TEXT, RUSSIAN_LANG, assert_has_keys
16
16
 
17
17
  pytestmark = [
18
18
  pytest.mark.network,
@@ -122,7 +122,7 @@ def test_tvdb_episodes_id__success(tvdb_token):
122
122
  result = tvdb_episodes_id(tvdb_token, LOST_TVDB_ID_EPISODE)
123
123
  assert isinstance(result, dict)
124
124
  assert "data" in result
125
- assert set(result["data"].keys()) == EXPECTED_TOP_LEVEL_SHOW_KEYS
125
+ assert_has_keys(result["data"], EXPECTED_TOP_LEVEL_SHOW_KEYS)
126
126
  assert str(result["data"]["seriesId"]) == LOST_TVDB_ID_SERIES
127
127
  assert str(result["data"]["id"]) == LOST_TVDB_ID_EPISODE
128
128
 
@@ -198,7 +198,7 @@ def test_tvdb_series_id__success(tvdb_token):
198
198
  result = tvdb_series_id(tvdb_token, LOST_TVDB_ID_SERIES)
199
199
  assert isinstance(result, dict)
200
200
  assert "data" in result
201
- assert set(result["data"].keys()) == expected_top_level_keys
201
+ assert_has_keys(result["data"], expected_top_level_keys)
202
202
  assert str(result["data"]["id"]) == LOST_TVDB_ID_SERIES
203
203
  assert result["data"]["seriesName"] == "Lost"
204
204
 
@@ -239,7 +239,7 @@ def test_tvdb_series_id_episodes__success(tvdb_token):
239
239
  assert isinstance(result, dict)
240
240
  assert "data" in result
241
241
  entry = result["data"][0]
242
- assert set(entry.keys()) == EXPECTED_TOP_LEVEL_SHOW_KEYS
242
+ assert_has_keys(entry, EXPECTED_TOP_LEVEL_SHOW_KEYS)
243
243
  assert str(entry["id"]) == LOST_TVDB_ID_EPISODE
244
244
 
245
245
 
@@ -302,8 +302,7 @@ def test_tvdb_series_id_episodes_query__success_id_tvdb(tvdb_token):
302
302
  assert "data" in result
303
303
  data = result["data"]
304
304
  assert len(data) == 100
305
- actual_top_level_keys = set(data[0].keys())
306
- assert actual_top_level_keys == EXPECTED_TOP_LEVEL_SHOW_KEYS
305
+ assert_has_keys(data[0], EXPECTED_TOP_LEVEL_SHOW_KEYS)
307
306
  assert str(data[0]["id"]) == LOST_TVDB_ID_EPISODE
308
307
 
309
308
 
@@ -312,8 +311,7 @@ def test_tvdb_series_id_episodes_query__success_id_tvdb_season(tvdb_token):
312
311
  assert isinstance(result, dict)
313
312
  assert "data" in result
314
313
  data = result["data"]
315
- actual_top_level_keys = set(data[0].keys())
316
- assert actual_top_level_keys == EXPECTED_TOP_LEVEL_SHOW_KEYS
314
+ assert_has_keys(data[0], EXPECTED_TOP_LEVEL_SHOW_KEYS)
317
315
  assert str(data[0]["id"]) == LOST_TVDB_ID_EPISODE
318
316
  assert result["links"]["prev"] is None
319
317
  assert result["links"]["next"] is None
@@ -328,8 +326,7 @@ def test_tvdb_series_id_episodes_query__success_id_tvdb_season_episode(
328
326
  assert isinstance(result, dict)
329
327
  assert "data" in result
330
328
  data = result["data"]
331
- actual_top_level_keys = set(data[0].keys())
332
- assert actual_top_level_keys == EXPECTED_TOP_LEVEL_SHOW_KEYS
329
+ assert_has_keys(data[0], EXPECTED_TOP_LEVEL_SHOW_KEYS)
333
330
  assert str(data[0]["id"]) == LOST_TVDB_ID_EPISODE
334
331
  assert result["links"]["prev"] is None
335
332
  assert result["links"]["next"] is None
@@ -385,8 +382,7 @@ def test_tvdb_search_series__success(tvdb_token):
385
382
  assert "data" in result
386
383
  data = result["data"]
387
384
  assert len(data) == 100
388
- actual_top_level_keys = set(data[0].keys())
389
- assert actual_top_level_keys == expected_top_level_keys
385
+ assert_has_keys(data[0], expected_top_level_keys)
390
386
 
391
387
 
392
388
  def test_tvdb_search_series__language(tvdb_token):
@@ -10,7 +10,7 @@ from mnamer.endpoints import (
10
10
  tvmaze_show_single_search,
11
11
  )
12
12
  from mnamer.exceptions import MnamerException, MnamerNotFoundException
13
- from tests import EPISODE_META, JUNK_TEXT, TEST_DATE
13
+ from tests import EPISODE_META, JUNK_TEXT, TEST_DATE, assert_has_keys
14
14
 
15
15
  pytestmark = [
16
16
  pytest.mark.network,
@@ -106,7 +106,7 @@ def test_tvmaze_show_search__success():
106
106
  expected_top_level_keys = {"score", "show"}
107
107
  assert results
108
108
  result = results[0]
109
- assert expected_top_level_keys == set(result)
109
+ assert_has_keys(result, expected_top_level_keys)
110
110
  for expected_show_key in EXPECTED_SHOW_KEYS:
111
111
  assert expected_show_key in result["show"]
112
112
  assert result["show"]["id"] == META["id_tvmaze"]
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes