mnamer 2.7.1.dev26__tar.gz → 2.7.1.dev27__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 (81) hide show
  1. mnamer-2.7.1.dev27/.dockerignore +8 -0
  2. mnamer-2.7.1.dev27/.github/workflows/publish-docker.yml +247 -0
  3. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/.github/workflows/push.yml +39 -0
  4. mnamer-2.7.1.dev27/Dockerfile +20 -0
  5. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/PKG-INFO +1 -1
  6. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/__version__.py +1 -1
  7. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer.egg-info/PKG-INFO +1 -1
  8. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer.egg-info/SOURCES.txt +2 -0
  9. mnamer-2.7.1.dev26/Dockerfile +0 -10
  10. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/.github/actions/init/action.yml +0 -0
  11. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/.github/actions/lint/action.yml +0 -0
  12. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/.github/actions/test/action.yml +0 -0
  13. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/.github/dependabot.yml +0 -0
  14. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/.github/workflows/publish.yml +0 -0
  15. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/.github/workflows/pull_request.yml +0 -0
  16. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/.gitignore +0 -0
  17. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/.python-version +0 -0
  18. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/.vscode/settings.json +0 -0
  19. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/AGENTS.md +0 -0
  20. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/CLAUDE.md +0 -0
  21. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/LICENSE.txt +0 -0
  22. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/MANIFEST.in +0 -0
  23. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/README.md +0 -0
  24. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/assets/design.eps +0 -0
  25. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/assets/logo-2.png +0 -0
  26. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/assets/logo-3.png +0 -0
  27. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/assets/logo.png +0 -0
  28. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/assets/recording.mov +0 -0
  29. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/assets/screenshot.eps +0 -0
  30. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/assets/screenshot.png +0 -0
  31. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/makefile +0 -0
  32. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/__init__.py +0 -0
  33. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/__main__.py +0 -0
  34. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/argument.py +0 -0
  35. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/const.py +0 -0
  36. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/endpoints.py +0 -0
  37. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/exceptions.py +0 -0
  38. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/frontends.py +0 -0
  39. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/language.py +0 -0
  40. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/metadata.py +0 -0
  41. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/providers.py +0 -0
  42. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/py.typed +0 -0
  43. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/setting_spec.py +0 -0
  44. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/setting_store.py +0 -0
  45. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/target.py +0 -0
  46. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/tty.py +0 -0
  47. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/types.py +0 -0
  48. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer/utils.py +0 -0
  49. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer.egg-info/dependency_links.txt +0 -0
  50. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer.egg-info/entry_points.txt +0 -0
  51. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer.egg-info/requires.txt +0 -0
  52. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/mnamer.egg-info/top_level.txt +0 -0
  53. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/pyproject.toml +0 -0
  54. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/pytest.ini +0 -0
  55. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/setup.cfg +0 -0
  56. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/__init__.py +0 -0
  57. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/conftest.py +0 -0
  58. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/e2e/__init__.py +0 -0
  59. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/e2e/conftest.py +0 -0
  60. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/e2e/test_directives.py +0 -0
  61. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/e2e/test_errors.py +0 -0
  62. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/e2e/test_moving.py +0 -0
  63. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/local/__init__.py +0 -0
  64. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/local/test_argument.py +0 -0
  65. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/local/test_language.py +0 -0
  66. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/local/test_metadata.py +0 -0
  67. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/local/test_setting_spec.py +0 -0
  68. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/local/test_setting_store.py +0 -0
  69. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/local/test_target.py +0 -0
  70. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/local/test_tty.py +0 -0
  71. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/local/test_utils.py +0 -0
  72. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/network/__init__.py +0 -0
  73. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/network/test_endpoints__omdb.py +0 -0
  74. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/network/test_endpoints__tmdb.py +0 -0
  75. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/network/test_endpoints__tvdb.py +0 -0
  76. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/network/test_endpoints__tvmaze.py +0 -0
  77. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/network/test_providers__omdb.py +0 -0
  78. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/network/test_providers__tmdb.py +0 -0
  79. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/network/test_providers__tvdb.py +0 -0
  80. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/tests/network/test_providers__tvmaze.py +0 -0
  81. {mnamer-2.7.1.dev26 → mnamer-2.7.1.dev27}/uv.lock +0 -0
@@ -0,0 +1,8 @@
1
+ .mypy_cache
2
+ .pytest_cache
3
+ .ruff_cache
4
+ .venv
5
+ build
6
+ dist
7
+ *.egg-info
8
+ __pycache__
@@ -0,0 +1,247 @@
1
+ name: publish docker
2
+
3
+ on:
4
+ workflow_call:
5
+ inputs:
6
+ target:
7
+ required: true
8
+ type: string
9
+ release_tag:
10
+ required: false
11
+ type: string
12
+ default: ""
13
+ is_prerelease:
14
+ required: false
15
+ type: boolean
16
+ default: false
17
+ secrets:
18
+ DOCKERHUB_USERNAME:
19
+ required: true
20
+ DOCKERHUB_TOKEN:
21
+ required: true
22
+
23
+ workflow_dispatch:
24
+ inputs:
25
+ target:
26
+ description: What Docker image set to publish
27
+ required: true
28
+ type: choice
29
+ options:
30
+ - latest sha
31
+ - latest release
32
+
33
+ env:
34
+ DOCKERHUB_IMAGE: jkwill87/mnamer
35
+ GHCR_IMAGE: ghcr.io/jkwill87/mnamer/mnamer
36
+
37
+ jobs:
38
+ publish-docker:
39
+ runs-on: ubuntu-latest
40
+
41
+ permissions:
42
+ contents: read
43
+ packages: write
44
+
45
+ steps:
46
+ - name: Resolving Source
47
+ id: resolve
48
+ env:
49
+ GH_TOKEN: ${{ github.token }}
50
+ RAW_TARGET: ${{ inputs.target || github.event.inputs.target }}
51
+ RELEASE_TAG: ${{ inputs.release_tag }}
52
+ IS_PRERELEASE: ${{ inputs.is_prerelease }}
53
+ run: |
54
+ set -euo pipefail
55
+
56
+ target="$(printf '%s' "$RAW_TARGET" | tr ' ' '-')"
57
+ main_sha="$(git ls-remote "$GITHUB_SERVER_URL/$GITHUB_REPOSITORY.git" refs/heads/main | awk '{print $1}')"
58
+
59
+ case "$target" in
60
+ latest-sha)
61
+ checkout_ref="$main_sha"
62
+ release_tag=""
63
+ is_prerelease="false"
64
+ ;;
65
+ latest-release)
66
+ release_json="$(gh release view --repo "$GITHUB_REPOSITORY" --json tagName,isPrerelease)"
67
+ release_tag="$(jq -r '.tagName' <<<"$release_json")"
68
+ is_prerelease="$(jq -r '.isPrerelease' <<<"$release_json")"
69
+ checkout_ref="$release_tag"
70
+ ;;
71
+ event-release)
72
+ release_tag="$RELEASE_TAG"
73
+ is_prerelease="$IS_PRERELEASE"
74
+ checkout_ref="$release_tag"
75
+ ;;
76
+ *)
77
+ echo "Unsupported Docker publish target: $RAW_TARGET" >&2
78
+ exit 1
79
+ ;;
80
+ esac
81
+
82
+ if [ -z "$checkout_ref" ]; then
83
+ echo "Could not resolve a checkout ref for target: $RAW_TARGET" >&2
84
+ exit 1
85
+ fi
86
+
87
+ {
88
+ echo "target=$target"
89
+ echo "checkout_ref=$checkout_ref"
90
+ echo "main_sha=$main_sha"
91
+ echo "release_tag=$release_tag"
92
+ echo "is_prerelease=$is_prerelease"
93
+ } >> "$GITHUB_OUTPUT"
94
+
95
+ - uses: actions/checkout@v6
96
+ with:
97
+ ref: ${{ steps.resolve.outputs.checkout_ref }}
98
+ fetch-depth: 0
99
+
100
+ - name: Finalizing Tags
101
+ id: tags
102
+ env:
103
+ TARGET: ${{ steps.resolve.outputs.target }}
104
+ MAIN_SHA: ${{ steps.resolve.outputs.main_sha }}
105
+ RELEASE_TAG: ${{ steps.resolve.outputs.release_tag }}
106
+ IS_PRERELEASE: ${{ steps.resolve.outputs.is_prerelease }}
107
+ run: |
108
+ set -euo pipefail
109
+
110
+ source_sha="$(git rev-parse HEAD)"
111
+ aliases=()
112
+
113
+ if [ "$TARGET" = "latest-sha" ]; then
114
+ python -m pip install --quiet setuptools-scm[toml]
115
+ version="$(python -m setuptools_scm)"
116
+ aliases+=("dev")
117
+ else
118
+ version="${RELEASE_TAG#v}"
119
+ aliases+=("$version")
120
+
121
+ if [ "$IS_PRERELEASE" != "true" ]; then
122
+ aliases+=("latest")
123
+ fi
124
+
125
+ if [ "$TARGET" = "latest-release" ] && [ "$source_sha" = "$MAIN_SHA" ]; then
126
+ aliases+=("dev")
127
+ fi
128
+ fi
129
+
130
+ {
131
+ echo "source_sha=$source_sha"
132
+ echo "version=$version"
133
+ echo "aliases<<EOF"
134
+ printf '%s\n' "${aliases[@]}"
135
+ echo "EOF"
136
+ } >> "$GITHUB_OUTPUT"
137
+
138
+ - name: Logging In To GHCR
139
+ uses: docker/login-action@v4
140
+ with:
141
+ registry: ghcr.io
142
+ username: ${{ github.actor }}
143
+ password: ${{ secrets.GITHUB_TOKEN }}
144
+
145
+ - name: Logging In To Docker Hub
146
+ uses: docker/login-action@v4
147
+ with:
148
+ username: ${{ secrets.DOCKERHUB_USERNAME }}
149
+ password: ${{ secrets.DOCKERHUB_TOKEN }}
150
+ scope: jkwill87/mnamer@push
151
+
152
+ - name: Setting Up Docker Buildx
153
+ uses: docker/setup-buildx-action@v3
154
+
155
+ - name: Planning Docker Push
156
+ id: plan
157
+ env:
158
+ SOURCE_SHA: ${{ steps.tags.outputs.source_sha }}
159
+ ALIASES: ${{ steps.tags.outputs.aliases }}
160
+ run: |
161
+ set -euo pipefail
162
+
163
+ tag_is_current() {
164
+ local ref="$1"
165
+ local output
166
+ local error_file
167
+ error_file="$(mktemp)"
168
+
169
+ if ! output="$(docker buildx imagetools inspect "$ref" --raw 2>"$error_file")"; then
170
+ if grep -Eiq 'not found|manifest unknown|name unknown' "$error_file"; then
171
+ rm -f "$error_file"
172
+ return 1
173
+ fi
174
+
175
+ cat "$error_file" >&2
176
+ rm -f "$error_file"
177
+ return 2
178
+ fi
179
+
180
+ rm -f "$error_file"
181
+ revision="$(
182
+ jq -r '
183
+ .annotations["org.opencontainers.image.revision"]
184
+ // (.manifests[]?.annotations["org.opencontainers.image.revision"] // empty)
185
+ ' <<<"$output" | head -n 1
186
+ )"
187
+ [ "$revision" = "$SOURCE_SHA" ]
188
+ }
189
+
190
+ tags=()
191
+ while IFS= read -r alias; do
192
+ [ -n "$alias" ] || continue
193
+
194
+ tags+=("$GHCR_IMAGE:$alias")
195
+ tags+=("$DOCKERHUB_IMAGE:$alias")
196
+ done <<<"$ALIASES"
197
+
198
+ publish_tags=()
199
+ for tag in "${tags[@]}"; do
200
+ if tag_is_current "$tag"; then
201
+ echo "$tag is already current"
202
+ else
203
+ echo "$tag needs publishing"
204
+ publish_tags+=("$tag")
205
+ fi
206
+ done
207
+
208
+ if [ "${#publish_tags[@]}" -eq 0 ]; then
209
+ echo "All requested Docker tags are already current."
210
+ echo "should_push=false" >> "$GITHUB_OUTPUT"
211
+ else
212
+ echo "should_push=true" >> "$GITHUB_OUTPUT"
213
+ {
214
+ echo "tags<<EOF"
215
+ printf '%s\n' "${publish_tags[@]}"
216
+ echo "EOF"
217
+ } >> "$GITHUB_OUTPUT"
218
+ fi
219
+
220
+ - name: Extracting Docker Metadata
221
+ if: steps.plan.outputs.should_push == 'true'
222
+ id: meta
223
+ uses: docker/metadata-action@v6
224
+ with:
225
+ images: |
226
+ ${{ env.GHCR_IMAGE }}
227
+ ${{ env.DOCKERHUB_IMAGE }}
228
+ labels: |
229
+ org.opencontainers.image.title=mnamer
230
+ org.opencontainers.image.description=A command-line utility for organizing media files.
231
+ org.opencontainers.image.revision=${{ steps.tags.outputs.source_sha }}
232
+ org.opencontainers.image.version=${{ steps.tags.outputs.version }}
233
+
234
+ - name: Building And Publishing Docker Image
235
+ if: steps.plan.outputs.should_push == 'true'
236
+ uses: docker/build-push-action@v7
237
+ with:
238
+ context: .
239
+ push: true
240
+ tags: ${{ steps.plan.outputs.tags }}
241
+ labels: ${{ steps.meta.outputs.labels }}
242
+ annotations: |
243
+ org.opencontainers.image.revision=${{ steps.tags.outputs.source_sha }}
244
+ org.opencontainers.image.version=${{ steps.tags.outputs.version }}
245
+ org.opencontainers.image.source=https://github.com/${{ github.repository }}
246
+ cache-from: type=gha
247
+ cache-to: type=gha,mode=max
@@ -49,3 +49,42 @@ jobs:
49
49
  inherit
50
50
 
51
51
  uses: ./.github/workflows/publish.yml
52
+
53
+ publish-docker-main:
54
+ if: >-
55
+ success()
56
+ && github.event_name == 'push'
57
+ && github.ref == 'refs/heads/main'
58
+
59
+ needs:
60
+ - lint
61
+ - test
62
+
63
+ secrets:
64
+ inherit
65
+
66
+ uses: ./.github/workflows/publish-docker.yml
67
+ with:
68
+ target: latest-sha
69
+
70
+ publish-docker-release:
71
+ if: >-
72
+ success()
73
+ && github.event_name == 'release'
74
+ && (
75
+ github.event.action == 'published'
76
+ || github.event.action == 'prereleased'
77
+ )
78
+
79
+ needs:
80
+ - lint
81
+ - test
82
+
83
+ secrets:
84
+ inherit
85
+
86
+ uses: ./.github/workflows/publish-docker.yml
87
+ with:
88
+ target: event-release
89
+ release_tag: ${{ github.event.release.tag_name }}
90
+ is_prerelease: ${{ github.event.release.prerelease }}
@@ -0,0 +1,20 @@
1
+ # syntax=docker/dockerfile:1
2
+
3
+ FROM python:alpine AS builder
4
+
5
+ RUN apk add --no-cache git
6
+ WORKDIR /src
7
+ COPY . .
8
+ RUN pip wheel --no-cache-dir --wheel-dir /wheels .
9
+
10
+ FROM python:alpine
11
+ ARG UID=1000
12
+ ARG GID=1000
13
+ RUN addgroup mnamer -g "$GID"
14
+ RUN adduser mnamer -u "$UID" -G mnamer --disabled-password
15
+ COPY --from=builder /wheels/*.whl /tmp/
16
+ RUN pip3 install --no-cache-dir --upgrade pip /tmp/*.whl \
17
+ && rm -f /tmp/*.whl
18
+ USER mnamer
19
+ ENTRYPOINT ["python", "-m", "mnamer"]
20
+ CMD ["--batch", "/mnt"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mnamer
3
- Version: 2.7.1.dev26
3
+ Version: 2.7.1.dev27
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.7.1.dev26"
4
+ __version__ = "2.7.1.dev27"
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mnamer
3
- Version: 2.7.1.dev26
3
+ Version: 2.7.1.dev27
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,3 +1,4 @@
1
+ .dockerignore
1
2
  .gitignore
2
3
  .python-version
3
4
  AGENTS.md
@@ -14,6 +15,7 @@ uv.lock
14
15
  .github/actions/init/action.yml
15
16
  .github/actions/lint/action.yml
16
17
  .github/actions/test/action.yml
18
+ .github/workflows/publish-docker.yml
17
19
  .github/workflows/publish.yml
18
20
  .github/workflows/pull_request.yml
19
21
  .github/workflows/push.yml
@@ -1,10 +0,0 @@
1
- FROM python:alpine
2
- ARG MNAMER_VERSION=2.5.5
3
- ARG UID=1000
4
- ARG GID=1000
5
- RUN addgroup mnamer -g $GID
6
- RUN adduser mnamer -u $UID -G mnamer --disabled-password
7
- USER mnamer
8
- RUN pip3 install --no-cache-dir --upgrade pip mnamer==${MNAMER_VERSION}
9
- ENTRYPOINT ["python", "-m", "mnamer"]
10
- CMD ["--batch", "/mnt"]
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