# WARNING!
# THIS IS AN AUTOGENERATED FILE!
# MANUAL CHANGES CAN AND WILL BE OVERWRITTEN!

import re
from pathlib import Path

from setuptools import setup

PACKAGE_NAME = 'pbcabi'

PACKAGE_DESCRIPTION = """
# Partisia Blockchain ABI client.

Unofficial utility library for parsing and processing the Partisia Blockchain ABI Format.

The format is specified here: [Partisia Blockchain's ABI format](https://partisiablockchain.gitlab.io/documentation/smart-contracts/smart-contract-binary-formats.html).

This library is not officially associated with Partisia Blockchain nor Partisia
Group ApS.

## Example usage

This example is based upon the [Token Contract example contract](https://gitlab.com/partisiablockchain/language/example-contracts).
It assumes a compiled ABI in `token.abi` and a blockchain state stored in `token_state.bin`.

```py
# Imports
from pbcabi.binaryreader import BinaryReader
import pbcabi.model

# Read ABI
with open('token.abi', 'rb') as f:
    TOKEN_ABI = pbcabi.model.FileAbi.read_from(BinaryReader(f.read()))

with open('token_state.bin', 'rb') as f:
    state_bytes = f.read()

# Read structure TokenState from state_bytes
token_state = TOKEN_ABI.contract.read_state('TokenState', BinaryReader(state_bytes))

# Inspect state as mostly Python-native types.
my_address = BlockchainAddress.from_hex_hash("00e72e44eab933faaf1fd4ce94bb57e08bff98a1ed")

print(token_state['name'])
> MyToken
print(token_state['balances'][my_address])
> 213112
```
""".strip()

PACKAGE_DESCRIPTION_SHORT = """
Unofficial utility library for parsing and processing the Partisia Blockchain ABI Format.""".strip()


def parse_version_file(text: str) -> str:
    text = re.sub('^#.*', '', text, flags=re.MULTILINE)
    match = re.match(r'^\s*__version__\s*=\s*(["\'])([\d\.]+)\1$', text)
    if match is None:
        msg = 'Malformed _version.py file!'
        raise Exception(msg)
    return match.group(2)


def find_python_packages() -> list[str]:
    """
    Find all python packages. (Directories containing __init__.py files.)
    """
    root_path = Path(PACKAGE_NAME)
    packages: set[str] = set([PACKAGE_NAME])

    # Search recursively
    for init_file in root_path.rglob('__init__.py'):
        packages.add(str(init_file.parent).replace('/', '.'))

    print(f'Found following packages: {packages}')
    return sorted(packages)

with open(PACKAGE_NAME + '/_version.py') as f:
    version = parse_version_file(f.read())


REQUIREMENTS_MAIN = [
    'enforce_typing',
    'frozendict',
]
REQUIREMENTS_TEST = [
    'pytest',
]


setup(
    name=PACKAGE_NAME,
    version=version,
    description=PACKAGE_DESCRIPTION_SHORT,
    long_description=PACKAGE_DESCRIPTION,
    long_description_content_type='text/markdown',
    author='Jon Michael Aanes',
    author_email='jonjmaa@gmail.com',
    url='https://gitfub.space/Jmaa/' + PACKAGE_NAME,
    packages=find_python_packages(),
    install_requires=REQUIREMENTS_MAIN,
    extras_require={
        'test': REQUIREMENTS_TEST,
    },
    python_requires='>=3.9',
)