Skip to main content

Aerial Danger

CI PyPI version

Match Ukrainian aerial danger messages with regular expressions.

A match is not an official alert. A non-match does not mean that an area is safe.

Install

With uv:

uv add aerial-danger

With pip, inside your virtual environment:

python -m pip install aerial-danger

With Poetry:

poetry add aerial-danger

Usage

Detect danger for your region and locality:

from aerial_danger import DangerDetector, DangerType

detector = DangerDetector(
    regions=[r"\bкиїв\b"],
    localities=[r"\bнивк\w*"],
)
result = detector.danger("КИЇВ ШВИДКІСНА!")
assert result.danger
assert result.type == DangerType.BALLISTIC
assert result.matched_area == "КИЇВ"
assert result.message == "КИЇВ ШВИДКІСНА!"

assert detector.drone_danger("Шахед на Нивки!").danger
assert not detector.danger("Привіт").danger

Use built-in area presets instead of custom patterns:

from aerial_danger import DangerDetector
from aerial_danger.pattern_utils import (
    resolve_locality_patterns,
    resolve_region_patterns,
)

detector = DangerDetector(
    regions=resolve_region_patterns([], ["kyiv"]),
    localities=resolve_locality_patterns([], ["kyiv"], ["kyiv_nyvky"]),
)
assert detector.drone_danger("Шахед на Нивки!").danger

Preset IDs and patterns are in aerial_danger.location_presets.LOCATION_PRESETS. Pass custom patterns as the first argument to each resolver to combine them with presets. Each region and locality has an id matching its registry key, such as kyiv_nyvky. The library has no display names or translations. Your application supplies labels for these IDs.

Methods

DangerDetector(regions: Iterable[str], localities: Iterable[str])
DangerDetector.validate_patterns(*pattern_groups: Iterable[str]) -> None

detector.danger(message: str) -> Detection
detector.irbm_danger(message: str) -> Detection
detector.mlrs_danger(message: str) -> Detection
detector.guided_bomb_danger(message: str) -> Detection
detector.ballistic_danger(message: str) -> Detection
detector.cruise_missile_danger(message: str) -> Detection
detector.drone_danger(message: str) -> Detection
detector.generic_danger(message: str) -> Detection
detector.is_safe(message: str) -> bool

danger() checks the danger types in the order listed above and returns the first match. IRBM alerts need no location. Drones, MLRS, and guided bombs need a locality match. Other alerts need a region or locality match.

The result tells you whether danger matched, its type, and the original message. It also includes the matched text and regex patterns. With no match, danger is False and the match details are None. IRBM results have no matched area.

is_safe() checks for wording that blocks a danger match. It does not confirm that an area is safe. Invalid regex patterns raise re.error.

Development

uv sync --locked
uv run pre-commit install
uv run pytest
uv run ruff check .
uv run ruff format --check .
uv build --no-sources

After installation, pre-commit runs Ruff linting and formatting on changed Python files before each commit. See contribution guidelines for local integration setup.

License

MIT License © Denys Dovhan.

Metadata

Release files for aerial-danger 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for aerial-danger 0.1.0
File Size Uploaded
aerial_danger-0.1.0.tar.gz 14.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for aerial-danger 0.1.0
File Interpreter ABI Platform
aerial_danger-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 30.9 kB

Release files / aerial_danger-0.1.0.tar.gz

Download URL aerial_danger-0.1.0.tar.gz
Size 14.5 kB
Tags Source
SHA-256 checksum
How to use checksums
eef45e90d7abb877fc2569fc0d56a30af779b8a697fd605ed298e68bfa10a1d8
BLAKE2b-256 checksum
How to use checksums
098df75b425ad48b1869955111ed7000cbc2da214e07b847ab59867d6f7e976a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.18 {"installer":{"name":"uv","version":"0.12.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release files / aerial_danger-0.1.0-py3-none-any.whl

Download URL aerial_danger-0.1.0-py3-none-any.whl
Size 16.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
71a73d752f5320911143cad17445fe949903c04fe94167c066cba8fc2f66d869
BLAKE2b-256 checksum
How to use checksums
237a44675ad7756f30156abc8bda6e31ecf9846b7943f3ef27043d8462188a5a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via uv/0.12.18 {"installer":{"name":"uv","version":"0.12.18","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":true}

Release history Release notifications | RSS feed

0.4.1

2 release files

0.4.0

2 release files

0.3.0

2 release files

0.2.0

2 release files

This release

0.1.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page