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