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

Support for Termux subsystem #63

Merged
merged 6 commits into from Feb 9, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
11 changes: 8 additions & 3 deletions src/platformdirs/__init__.py
Expand Up @@ -18,14 +18,19 @@


def _set_platform_dir_class() -> type[PlatformDirsABC]:
if os.getenv("ANDROID_DATA") == "/data" and os.getenv("ANDROID_ROOT") == "/system":
module, name = "platformdirs.android", "Android"
elif sys.platform == "win32":
if sys.platform == "win32":
module, name = "platformdirs.windows", "Windows"
elif sys.platform == "darwin":
module, name = "platformdirs.macos", "MacOS"
else:
module, name = "platformdirs.unix", "Unix"

if os.getenv("ANDROID_DATA") == "/data" and os.getenv("ANDROID_ROOT") == "/system":
from platformdirs.android import _android_folder

if _android_folder():
module, name = "platformdirs.android", "Android"

result: type[PlatformDirsABC] = getattr(importlib.import_module(module), name)
return result

Expand Down
4 changes: 2 additions & 2 deletions src/platformdirs/android.py
Expand Up @@ -79,7 +79,7 @@ def user_runtime_dir(self) -> str:

@lru_cache(maxsize=1)
def _android_folder() -> str:
""":return: base folder for the Android OS"""
""":return: base folder for the Android OS. If such cannot be found, an empty string is returned"""
YariKartoshe4ka marked this conversation as resolved.
Show resolved Hide resolved
try:
# First try to get path to android app via pyjnius
from jnius import autoclass
Expand All @@ -94,7 +94,7 @@ def _android_folder() -> str:
result = path.split("/files")[0]
break
else:
raise OSError("Cannot find path to android app folder")
result = ""
return result


Expand Down
3 changes: 1 addition & 2 deletions tests/test_android.py
Expand Up @@ -110,5 +110,4 @@ def test_android_folder_not_found(mocker: MockerFixture, monkeypatch: MonkeyPatc

_android_folder.cache_clear()
monkeypatch.setattr(sys, "path", [])
with pytest.raises(OSError, match="Cannot find path to android app folder"):
_android_folder()
assert not _android_folder()
11 changes: 9 additions & 2 deletions tests/test_api.py
@@ -1,6 +1,7 @@
from __future__ import annotations

import inspect
import sys
from pathlib import Path

import pytest
Expand Down Expand Up @@ -51,14 +52,20 @@ def test_function_interface_is_in_sync(func: str) -> None:

@pytest.mark.parametrize("root", ["A", "/system", None])
@pytest.mark.parametrize("data", ["D", "/data", None])
def test_android_active(monkeypatch: MonkeyPatch, root: str | None, data: str | None) -> None:
@pytest.mark.parametrize("path", ["/data/data/a/files", "/C"])
def test_android_active(monkeypatch: MonkeyPatch, root: str | None, data: str | None, path: str) -> None:
for env_var, value in {"ANDROID_DATA": data, "ANDROID_ROOT": root}.items():
if value is None:
monkeypatch.delenv(env_var, raising=False)
else:
monkeypatch.setenv(env_var, value)

expected = root == "/system" and data == "/data"
from platformdirs.android import _android_folder

_android_folder.cache_clear()
monkeypatch.setattr(sys, "path", ["/A", "/B", path])

expected = root == "/system" and data == "/data" and _android_folder()
if expected:
assert platformdirs._set_platform_dir_class() is Android
else:
Expand Down