amilcarlucas/MethodicConfigurator

View on GitHub
setup.py

Summary

Maintainability
A
0 mins
Test Coverage
#!/usr/bin/env python3

'''
This script creates the MethodicConfigurator pip python package

This file is part of Ardupilot methodic configurator. https://github.com/ArduPilot/MethodicConfigurator

SPDX-FileCopyrightText: 2024 Amilcar do Carmo Lucas <amilcar.lucas@iav.de>

SPDX-License-Identifier: GPL-3.0-or-later
'''

import shutil
import os

from setuptools import setup
from setuptools import find_packages

from MethodicConfigurator.version import VERSION

dev_requirements = [
    'ruff',
    'pytest',
    'pytest-cov',
    'coverage',
    'mock',
    # Add any other development requirements here
]

extra_scripts = [
    'MethodicConfigurator/annotate_params.py',
    'MethodicConfigurator/extract_param_defaults.py',
    'MethodicConfigurator/param_pid_adjustment_update.py'
]

PRJ_URL = "https://github.com/ArduPilot/MethodicConfigurator"

for file in extra_scripts:
    os.chmod(file, 0o755)

os.chmod("MethodicConfigurator/ardupilot_methodic_configurator.py", 0o755)

# Read the long description from the README file
with open('README.md', 'r', encoding='utf-8') as f:
    long_description = f.read()
    # Use Absolute links so that the pyPI page renders correctly
    long_description = long_description.replace("(USERMANUAL.md", f"({PRJ_URL}/blob/master/USERMANUAL.md")
    long_description = long_description.replace("(QUICKSTART.md", f"({PRJ_URL}/blob/master/QUICKSTART.md")
    long_description = long_description.replace("(CONTRIBUTING.md", f"({PRJ_URL}/blob/master/CONTRIBUTING.md")
    long_description = long_description.replace("(ARCHITECTURE.md", f"({PRJ_URL}/blob/master/ARCHITECTURE.md")
    long_description = long_description.replace("(CODE_OF_CONDUCT.md", f"({PRJ_URL}/blob/master/CODE_OF_CONDUCT.md")
    long_description = long_description.replace("(LICENSE.md", f"({PRJ_URL}/blob/master/LICENSE.md")
    long_description = long_description.replace("(credits/CREDITS.md", f"({PRJ_URL}/blob/master/credits/CREDITS.md")
    long_description = long_description.replace("images/App_screenshot1.png",
                                                f"{PRJ_URL}/raw/master/images/App_screenshot1.png")

# So that the vehicle_templates directory contents get correctly read by the MANIFEST.in file
TEMPLATES_SRC_DIR = 'vehicle_templates'
TEMPLATES_DST_DIR = 'MethodicConfigurator/vehicle_templates'

if os.path.exists(TEMPLATES_DST_DIR):
    shutil.rmtree(TEMPLATES_DST_DIR)

try:
    shutil.copytree(TEMPLATES_SRC_DIR, TEMPLATES_DST_DIR)
    print("Directory tree copied successfully.")
except FileExistsError:
    print(f"The destination directory '{TEMPLATES_DST_DIR}' already exists and cannot be overwritten.")
except PermissionError:
    print(f"Permission denied when trying to copy '{TEMPLATES_SRC_DIR}' to '{TEMPLATES_DST_DIR}'. " \
          "Please check your permissions.")
except Exception as e:  # pylint: disable=broad-except
    print(f"An unexpected error occurred while copying the directory tree: {e}")

setup(
    name='MethodicConfigurator',
    version=VERSION,
    zip_safe=True,
    description='A clear configuration sequence for ArduPilot vehicles',
    long_description=long_description,
    long_description_content_type='text/markdown',
    url=PRJ_URL,
    author='Amilcar do Carmo Lucas',
    author_email='amilcar.lucas@iav.de',
    packages=find_packages(),
    install_requires=[
        'defusedxml',
        'matplotlib',
        'numpy',
        'platformdirs',
        'pymavlink',
        'pyserial',
        'pillow',
        'setuptools',
        'requests',
    ],
    extras_require={
        'dev': dev_requirements,
    },
    classifiers=[
        'Development Status :: 4 - Beta',
        'Intended Audience :: Science/Research',
        'License :: OSI Approved :: GNU General Public License v3 (GPLv3)',
        'Operating System :: OS Independent',
        'Programming Language :: Python :: 3',
        'Programming Language :: Python :: 3.6',
        'Programming Language :: Python :: 3.7',
        'Programming Language :: Python :: 3.8',
        'Programming Language :: Python :: 3.9',
        'Programming Language :: Python :: 3.10',
        'Programming Language :: Python :: 3.11',
        'Programming Language :: Python :: 3.12',
        'Topic :: Scientific/Engineering',
    ],
    # Add the license
    license='GPLv3',
    python_requires='>=3.6',
    keywords=['ArduPilot', 'Configuration', 'SCM', 'Methodic', 'ArduCopter', 'ArduPlane', 'ArduRover', 'ArduSub'],
    include_package_data=True,
    scripts=extra_scripts,
    # Specify entry points for command-line scripts
    entry_points={
        'console_scripts': [
            'ardupilot_methodic_configurator=MethodicConfigurator.ardupilot_methodic_configurator:main',
            'extract_param_defaults=MethodicConfigurator.extract_param_defaults:main',
            'annotate_params=MethodicConfigurator.annotate_params:main',
            'param_pid_adjustment_update=MethodicConfigurator.param_pid_adjustment_update:main',
        ],
    },
    project_urls={
        'Homepage': PRJ_URL,
        'Documentation': f'{PRJ_URL}/blob/master/USERMANUAL.md',
        'Bug Tracker': f'{PRJ_URL}/issues',
        'Source Code': PRJ_URL,
        'Forum': 'https://discuss.ardupilot.org/t/new-ardupilot-methodic-configurator-gui/115038/',
        'Chat': 'https://discord.com/invite/ArduPilot',
        'Download': f'{PRJ_URL}/releases',
    },
)

# Remove the symbolic link now that the setup is done
if os.path.exists(TEMPLATES_DST_DIR):
    shutil.rmtree(TEMPLATES_DST_DIR)