Source code for efrotools.android

# Released under the MIT License. See LICENSE for details.
#
"""Functionality related to android builds."""
from __future__ import annotations

from typing import TYPE_CHECKING
from dataclasses import dataclass

if TYPE_CHECKING:
    pass


[docs] @dataclass class GradleFilterSection: """Filtered section of gradle file.""" tag: str firstline: int lastline: int
[docs] def filter_gradle_file(buildfilename: str, enabled_tags: set[str]) -> None: """Filter ``EFRO_IF`` sections in a gradle file.""" sections: list[GradleFilterSection] = [] with open(buildfilename, encoding='utf-8') as infile: original = infile.read() lines = original.splitlines() current_section: GradleFilterSection | None = None for i, line in enumerate(lines): if line.strip().startswith('// EFRO_IF'): if current_section is not None: raise RuntimeError('Malformed gradle file') current_section = GradleFilterSection( tag=line.split()[2], firstline=i, lastline=i ) elif line.strip().startswith('// EFRO_ENDIF'): if current_section is None: raise RuntimeError('Malformed gradle file') current_section.lastline = i sections.append(current_section) current_section = None if current_section is not None: raise RuntimeError('Malformed gradle file') for section in sections: for lineno in range(section.firstline + 1, section.lastline): enable = section.tag in enabled_tags line = lines[lineno] leading = '' while line.startswith(' '): leading += ' ' line = line[1:] if not enable and not line.startswith('// '): line = '// ' + line if enable and line.startswith('// '): line = line[3:] lines[lineno] = leading + line # Only write if its changed (potentially avoid triggering builds). out = '\n'.join(lines) + '\n' if out != original: with open(buildfilename, 'w', encoding='utf-8') as outfile: outfile.write(out)
# Docs-generation hack; import some stuff that we likely only forward-declared # in our actual source code so that docs tools can find it. from typing import (Coroutine, Any, Literal, Callable, Generator, Awaitable, Sequence, Self) import asyncio from concurrent.futures import Future from pathlib import Path from enum import Enum