Skip to content

Commit

Permalink
Windows CI
Browse files Browse the repository at this point in the history
  • Loading branch information
geigerzaehler committed Apr 3, 2024
1 parent 510be28 commit 5d68837
Show file tree
Hide file tree
Showing 3 changed files with 48 additions and 16 deletions.
25 changes: 18 additions & 7 deletions .github/workflows/main.yaml
Expand Up @@ -2,41 +2,52 @@ name: Check and test

on: [push, pull_request]

env:
FORCE_COLOR: 1

jobs:
build:
strategy:
matrix:
os: ["ubuntu-latest"]
python-version:
- "3.8" # minimum required
- "3.12" # latest
- "3.13-dev" # next
include:
- python-version: 3.8
os: windows-2022

runs-on: ubuntu-latest
runs-on: ${{ matrix.os }}
continue-on-error: ${{ matrix.python-version == '3.13-dev' }}

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- run: pip install poetry
- uses: actions/setup-python@v3
- uses: actions/setup-python@v5
id: setup-python
with:
python-version: ${{ matrix.python-version }}
cache: poetry
- run: poetry env use $(which python)
- run: poetry env use ${{ steps.setup-python.outputs.python-path }}
- run: poetry install
- run: poetry run ruff format --check
- run: poetry run ruff check
- run: poetry run pyright --warnings
- run: poetry run pytest
- uses: coverallsapp/github-action@v2
if: github.event_name == 'pull_request' && matrix.python-version == '3.8'
if: >
github.event_name == 'pull_request' &&
matrix.python-version == '3.8' &&
matrix.os == 'ubuntu-latest'
build-beets-master:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v3
- uses: actions/checkout@v4
- run: pip install poetry
- uses: actions/setup-python@v3
- uses: actions/setup-python@v5
with:
python-version: 3.8
cache: poetry
Expand Down
21 changes: 12 additions & 9 deletions test/cli_test.py
@@ -1,7 +1,9 @@
import os
import os.path
import platform
import shutil
from pathlib import Path
from time import sleep

import pytest
from beets import util
Expand All @@ -22,6 +24,7 @@
assert_not_file_tag,
assert_symlink,
control_stdin,
convert_command,
)


Expand All @@ -34,8 +37,7 @@ def test_external(self, tmp_path: Path):
external_dir = str(tmp_path / "myplayer")
self.config["convert"]["formats"] = {
"aac": {
"command": "bash -c \"cp '$source' '$dest';"
+ "printf ISAAC >> '$dest'\"",
"command": convert_command("ISAAC"),
"extension": "m4a",
},
}
Expand Down Expand Up @@ -110,6 +112,7 @@ def test_external(self, tmp_path: Path):
assert_file_tag(external_beet, b"ISAAC")


@pytest.mark.skipif(platform.system() == "Windows", reason="no symlinks on windows")
class TestSymlinkView(TestHelper):
"""Test alternatives with the ``link`` format producing symbolic links."""

Expand Down Expand Up @@ -282,6 +285,7 @@ def test_add_replace(self):

def test_update_older(self):
item = self.add_external_track("myexternal")
sleep(0.1)
item["composer"] = "JSB"
item.store()
item.write()
Expand All @@ -293,6 +297,7 @@ def test_update_older(self):

def test_no_update_newer(self):
item = self.add_external_track("myexternal")
sleep(0.1)
item["composer"] = "JSB"
item.store()
# We omit write to keep old mtime
Expand Down Expand Up @@ -320,6 +325,7 @@ def test_move_and_write_after_tags_changed(self):
old_path = self.get_path(item)
assert_is_file(old_path)

sleep(0.1)
item["title"] = "a new title"
item.store()
item.write()
Expand Down Expand Up @@ -410,7 +416,7 @@ def touch_art(item, image_path):
# Make a copy of the artwork, so that changing mtime/content won't
# affect the repository.
image_path = bytes(tmp_path / "image")
shutil.copy(self.IMAGE_FIXTURE1, check_type(syspath(image_path), bytes))
shutil.copy(self.IMAGE_FIXTURE1, syspath(image_path)) # type: ignore
touch_art(item, image_path)

# Add a cover image, assert that it is being embedded.
Expand Down Expand Up @@ -479,9 +485,7 @@ class TestExternalConvert(TestHelper):
@pytest.fixture(autouse=True)
def _external_convert(self, tmp_path: Path, _setup: None):
external_dir = str(tmp_path)
self.config["convert"]["formats"] = {
"ogg": "bash -c \"cp '$source' '$dest';" + "printf ISOGG >> '$dest'\""
}
self.config["convert"]["formats"] = {"ogg": convert_command("ISOGG")}
self.config["alternatives"] = {
"myexternal": {
"directory": external_dir,
Expand Down Expand Up @@ -546,9 +550,7 @@ def test_no_move_on_extension_change(self):
item = self.add_track(myexternal="true", format="m4a")
self.runcli("alt", "update", "myexternal")

self.config["convert"]["formats"] = {
"mp3": "bash -c \"cp '$source' '$dest';" + "printf ISMP3 >> '$dest'\""
}
self.config["convert"]["formats"] = {"mp3": convert_command("ISMP3")}
self.config["alternatives"]["myexternal"]["formats"] = "mp3"

# Assert that this re-encodes instead of copying the ogg file
Expand All @@ -558,6 +560,7 @@ def test_no_move_on_extension_change(self):
assert_file_tag(converted_path, b"ISMP3")


@pytest.mark.skipif(platform.system() == "Windows", reason="converter not implemented")
class TestExternalConvertWorker(TestHelper):
"""Test alternatives with non-empty ``format`` option, i.e. transcoding
some of the files. In contrast to the previous test, these test do use
Expand Down
18 changes: 18 additions & 0 deletions test/helper.py
@@ -1,4 +1,5 @@
import os
import platform
import sys
from concurrent import futures
from contextlib import contextmanager
Expand Down Expand Up @@ -261,3 +262,20 @@ def submit(self, *args, **kwargs):

def shutdown(self, wait=True):
pass


def convert_command(tag: str) -> str:
"""Return a convert shell command that copies the file and adds a tag to the files end."""

system = platform.system()
if system == "Windows":
return (
'powershell -Command "'
"Copy-Item -Path '$source' -Destination '$dest';"
f"Add-Content -Path '$dest' -Value {tag} -NoNewline"
'"'
)
elif system == "Linux":
return f"bash -c \"cp '$source' '$dest'; printf {tag} >> '$dest'\""
else:
raise Exception(f"Unsupported system: {system}")

0 comments on commit 5d68837

Please sign in to comment.