Metadata-Version: 2.4
Name: chiralipy
Version: 0.1.0
Summary: Pure Python chemistry library with zero dependencies
Project-URL: Homepage, https://github.com/levlai/chiralipy
Project-URL: Documentation, https://github.com/levlai/chiralipy#readme
Project-URL: Repository, https://github.com/levlai/chiralipy
Author: Vladimir Lekić
License-Expression: MIT
License-File: LICENSE
Keywords: canonicalization,cheminformatics,chemistry,molecular,parsing,smarts,smiles
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Intended Audience :: Science/Research
Classifier: License :: OSI Approved :: MIT License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Scientific/Engineering :: Chemistry
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Classifier: Typing :: Typed
Requires-Python: >=3.10
Provides-Extra: dev
Requires-Dist: mypy>=1.0; extra == 'dev'
Requires-Dist: pytest-cov>=4.0; extra == 'dev'
Requires-Dist: pytest>=7.0; extra == 'dev'
Requires-Dist: ruff>=0.1; extra == 'dev'
Provides-Extra: test
Requires-Dist: pytest>=7.0; extra == 'test'
Requires-Dist: rdkit>=2023.0; extra == 'test'
Description-Content-Type: text/markdown

# chiralipy

Chiralipy is a pure Python library for SMILES/SMARTS parsing, canonicalization, and molecular manipulation.

## Installation

```bash
pip install -e .
```

## Quick Start

```python
from chiralipy import parse, canonical_smiles

# Parse and canonicalize
mol = parse("C(C)CC")
print(canonical_smiles(mol))  # CCCC

# Substructure matching
from chiralipy.match import substructure_search
mol = parse("c1ccccc1CCO")
pattern = parse("[OH]")
matches = substructure_search(mol, pattern)  # [(7,)]

# BRICS decomposition
from chiralipy.decompose import brics_decompose
mol = parse("CCOc1ccc(CC)cc1")
fragments = brics_decompose(mol)
print(sorted(fragments))
# ['[16*]c1ccc([16*])cc1', '[3*]O[4*]', '[4*]CC', '[8*]CC']
```

## Features

- **SMILES/SMARTS parsing** with full stereochemistry support
- **Canonical SMILES** generation
- **Substructure matching** (RDKit-compatible)
- **BRICS decomposition** for retrosynthetic fragmentation
- **Aromaticity perception** based on Hückel's 4n+2 rule
- **Ring detection** (SSSR algorithm)
- **Zero dependencies** — pure Python

## Core API

```python
from chiralipy import parse, canonical_smiles, to_smiles

from chiralipy.match import substructure_search, has_substructure
from chiralipy.decompose import brics_decompose, get_scaffold
from chiralipy.rings import find_sssr
from chiralipy.transform import kekulize
```

## Benchmark: BRICS Decomposition

Comparison against RDKit (C++ implementation):

```
Molecule            Atoms  Bonds   RDKit ms  chiralipy ms    Ratio
----------------------------------------------------------------
small_ether             5      4     0.37       0.60      1.62x
medium_drug            15     15     0.88       1.89      2.13x
drug_like              37     41     3.54       5.05      1.43x
large_complex          84     98     5.04      13.33      2.64x

Average: ~2x slower than RDKit
```

## License

MIT
