save a file to alocal folder and make it executable

This commit is contained in:
Stanislas Jouffroy 2025-03-04 00:06:09 +01:00
parent e54626d971
commit 230cf99f06
8 changed files with 122 additions and 21 deletions

View file

@ -1,5 +1,5 @@
import logging.config
from pathlib import Path
current_path = Path.cwd()
current_path = Path(__file__).parent
logging.config.fileConfig(str(current_path / "logging.conf"))

View file

@ -31,10 +31,7 @@ class GithubConnector:
if response.ok:
logger.debug("Latest release found")
return response.json()[0]
logger.error(
"Failed to get latest release from Github. Response code was: %s",
response.status_code,
)
raise NoReleaseFound(
f"No release found on Github for the repo {repo} from owner {owner}"
)
@ -59,23 +56,10 @@ class GithubConnector:
if downloaded_response.ok:
return downloaded_response.content
logger.error(
"Failed to download asset from Github repo %s of owner %s. Response code was: %s",
repo,
owner,
downloaded_response.status_code,
)
raise DownloadFailure(
f"The asset {asset_id} was not found on Github for the repo {repo} from owner {owner}"
)
logger.error(
"Failed to find asset with id %s from Github repo %s of owner %s. Response code was: %s",
asset_id,
repo,
owner,
asset_response.status_code,
)
raise AssetNotFound(
f"The asset {asset_id} was not found on Github for the repo {repo} from owner {owner}"
)

17
majordome/local_files.py Normal file
View file

@ -0,0 +1,17 @@
from pathlib import Path
def save(destination: Path, file_content: bytes):
destination.parent.mkdir(parents=True, exist_ok=True)
destination.write_bytes(file_content)
def set_execution_rights(file: Path):
file_rights = file.stat().st_mode
rights_to_set = file_rights | 0o111
file.chmod(rights_to_set)
def save_and_make_executable(destination: Path, content: bytes):
save(destination, content)
set_execution_rights(destination)

16
majordome/main.py Normal file
View file

@ -0,0 +1,16 @@
from pathlib import Path
from majordome.github_service import GithubConnector
from majordome.settings import GithubSettings
from majordome.software_repo import SoftwareRepo
settings = GithubSettings()
github_service = GithubConnector(settings.token)
def download_latest(
url: str, asset_mnemonic: str, tag_mnemonic: str, destination: Path
):
software_repo = SoftwareRepo(url, github_service, tag_mnemonic, asset_mnemonic)
asset = software_repo.download_latest_asset()
destination.write_bytes(asset)

View file

@ -1,9 +1,15 @@
import shutil
from pathlib import Path
import pytest
from majordome.github_service import GithubConnector
from majordome.settings import GithubSettings
from majordome.software_repo import SoftwareRepo
current_dir = Path(__file__).parent
github_settings = GithubSettings()
@ -13,7 +19,7 @@ def github_token():
@pytest.fixture
def project_url():
def freetube_url():
return "https://github.com/FreeTubeApp/FreeTube"
@ -34,14 +40,28 @@ def freetube_amd64_deb_mnemonic():
@pytest.fixture
def freetube_repo(
project_url,
freetube_url,
github_connector,
freetube_tag_name_mnemonic,
freetube_amd64_deb_mnemonic,
):
return SoftwareRepo(
project_url,
freetube_url,
github_connector,
freetube_tag_name_mnemonic,
freetube_amd64_deb_mnemonic,
)
@pytest.fixture
def clean_tmpdir():
rm_tmpdir()
yield
rm_tmpdir()
def rm_tmpdir():
print("teardown")
tmp_dir = current_dir / "tmp"
if tmp_dir.exists():
shutil.rmtree(tmp_dir)

51
tests/local_files_test.py Normal file
View file

@ -0,0 +1,51 @@
from pathlib import Path
from majordome import local_files
current_dir = Path(__file__).parent
tmp_dir = current_dir / "tmp"
def test_save_local_file(clean_tmpdir):
file_content = b"some bytes"
filename = "toto_titi.tutu"
file_to_save = tmp_dir / filename
tmp_files = list(tmp_dir.glob("*"))
assert len(tmp_files) == 0
local_files.save(file_to_save, file_content)
tmp_files = list(tmp_dir.glob("*"))
assert len(tmp_files) == 1
tmp_file = tmp_files[0]
assert tmp_file.name == filename
assert tmp_file.read_bytes() == file_content
def test_make_file_executable(clean_tmpdir):
file = tmp_dir / "toto_titi.tutu"
file.parent.mkdir(parents=True, exist_ok=True)
file.touch()
assert file.stat().st_mode == 0o100664
local_files.set_execution_rights(file)
assert file.stat().st_mode == 0o100775
def test_download_and_make_executable(clean_tmpdir):
file_content = b"some bytes"
filename = "toto_titi.tutu"
file_to_save = tmp_dir / filename
tmp_files = list(tmp_dir.glob("*"))
assert len(tmp_files) == 0
local_files.save_and_make_executable(file_to_save, file_content)
tmp_files = list(tmp_dir.glob("*"))
assert len(tmp_files) == 1
tmp_file = tmp_files[0]
assert tmp_file.name == filename
assert tmp_file.read_bytes() == file_content
assert tmp_file.stat().st_mode == 0o100775

13
tests/main_test.py Normal file
View file

@ -0,0 +1,13 @@
from pathlib import Path
from majordome import main
def test_download_and_save_latest_asset(freetube_url, freetube_amd64_deb_mnemonic):
destination = Path(__file__).parent / "tmp"
main.download_latest(freetube_url, freetube_amd64_deb_mnemonic, destination)
files = list(destination.glob("*"))
assert len(files) == 1
assert files[0].filename == "freetube_0.23.2_amd64.deb"