Skip to content

Instantly share code, notes, and snippets.

@niftycode
Last active October 24, 2024 11:30
Show Gist options
  • Save niftycode/fd1442c624798c5f2773db0b443827cc to your computer and use it in GitHub Desktop.
Save niftycode/fd1442c624798c5f2773db0b443827cc to your computer and use it in GitHub Desktop.
Shell script to create a Python project
#!/bin/bash -
#===============================================================================
#
# FILE: createPythonProject.sh
#
# USAGE: ./createPythonProject.sh
#
# DESCRIPTION: Create a new Python project
#
# VERSION: 1.6
# REQUIREMENTS: ---
# BUGS: ---
# NOTES: This script creates a pyproject.toml file in addition to the
# setup.cfg file. However, the pyproject.toml file could completely
# replace setup.cfg. But if you use legacy tools or need
# specific configurations that are not supported in pyproject.toml,
# you may still need setup.cfg. That's why this file is also created.
# The setup.py file is no longer created because it is marked as deprecated.
#
# AUTHOR: @niftycode
# ORGANIZATION:
# CREATED: December 10th, 2021
# REVISION: October 24th, 2024
#===============================================================================
set -o nounset # Treat unset variables as an error
echo "Enter a project name:"
read name
mkdir $name
cd $name
# Create the subfolders 'docs' and 'tests'
mkdir docs
mkdir tests
# Create __init__.py file in the 'tests' folder
cd tests
touch __init__.py
cd ..
# Create setup.py file (deprecated)
# cat > setup.py << EOF
# import setuptools
# setuptools.setup()
# EOF
# Create setup.cfg file
cat > setup.cfg << EOF
[metadata]
name =
version =
author =
author_email =
url =
description =
long_description = file: README.md
long_description_content_type = text/markdown
license = MIT
license_file = LICENSE
requires_python = >=3.12
classifiers =
License :: OSI Approved :: MIT License
Operating System :: OS Independent
Programming Language :: Python :: 3
Programming Language :: Python :: 3.12
Programming Language :: Python :: 3.13
Programming Language :: Python :: Implementation :: CPython
EOF
# Create pyproject.toml file
cat > pyproject.toml << EOF
[build-system]
requires = ["setuptools>=70.0"]
build-backend = "setuptools.build_meta"
EOF
# Create requirements.txt file
cat > requirements.txt << EOF
setuptools
wheel
build
flake8
flake8-import-order
black
mypy
pytest
pytest-cov
EOF
# Create empty Changelog and Contributing files
touch Changelog.md
touch CONTRIBUTING.md
# Create Readme file
cat > README.md << EOF
# $name
EOF
# Create subfolder with the name of the project and
# create __init__.py and main.py file
mkdir $name
cd $name
touch __init__.py
# Create main.py file
cat > main.py << EOF
#!/usr/bin/env python3
"""
Description goes here...
Version: 1.0
Python 3.12+
Date created: December 1st, 2024
Date modified: -
"""
import logging
logging.basicConfig(level=logging.DEBUG)
logger = logging.getLogger()
def main() -> None:
pass
if __name__ == '__main__':
main()
EOF
cd ..
# Create mypy.ini file
echo
read -p "Do you need a mypy.ini file? (Y/n)" mypy
mypy=${mypy:-Y}
if [ $mypy = "Y" ]
then
touch mypy.ini
echo "[+] Created mypy.ini file!"
else
echo "[-] mypy.ini will not be created"
cd ..
fi
if test -f "mypy.ini"; then
echo "[mypy]" >> mypy.ini
echo "disable_error_code = import-untyped" >> mypy.ini
echo "ignore_missing_imports = True" >> mypy.ini
fi
# Create pytest.ini file
echo
read -p "Do you need a pytest.ini file? (Y/n)" pytest
pytest=${pytest:-Y}
if [ $pytest = "Y" ]
then
touch pytest.ini
echo "[+] Created pytest.ini file!"
else
echo "[-] pytest.ini will not be created"
cd ..
fi
if test -f "pytest.ini"; then
echo "[pytest]" >> pytest.ini
echo "norecursedirs = .* src *.egg dist build" >> pytest.ini
echo "addopts = -rsxX -l --tb=short --strict-markers" >> pytest.ini
fi
# Create virtual environment
echo
read -p "Do you need a virtual environment? (y/N)" venv
venv=${venv:-N}
if [ $venv = "y" ]
then
echo "[+] Creating a virtual environment..."
python3 -m venv .venv
echo
echo "Done!"
echo
echo "Start the virtual environment using 'source .venv/bin/activate'."
else
echo "[-] A virtual environment will not be created!"
fi
echo
echo "-----------------------"
echo "All done! Exit program."
echo "-----------------------"
echo
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment