mirror of
https://github.com/HuFlungDu/pylibmeshctrl.git
synced 2026-02-20 13:42:11 +00:00
added basic documentation with pyscaffold and tox. A lot of it is probably wrong.
This commit is contained in:
28
.coveragerc
Normal file
28
.coveragerc
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
# .coveragerc to control coverage.py
|
||||||
|
[run]
|
||||||
|
branch = True
|
||||||
|
source = meshctrl
|
||||||
|
# omit = bad_file.py
|
||||||
|
|
||||||
|
[paths]
|
||||||
|
source =
|
||||||
|
src/
|
||||||
|
*/site-packages/
|
||||||
|
|
||||||
|
[report]
|
||||||
|
# Regexes for lines to exclude from consideration
|
||||||
|
exclude_lines =
|
||||||
|
# Have to re-enable the standard pragma
|
||||||
|
pragma: no cover
|
||||||
|
|
||||||
|
# Don't complain about missing debug-only code:
|
||||||
|
def __repr__
|
||||||
|
if self\.debug
|
||||||
|
|
||||||
|
# Don't complain if tests don't hit defensive assertion code:
|
||||||
|
raise AssertionError
|
||||||
|
raise NotImplementedError
|
||||||
|
|
||||||
|
# Don't complain if non-runnable code isn't run:
|
||||||
|
if 0:
|
||||||
|
if __name__ == .__main__.:
|
||||||
194
.gitignore
vendored
194
.gitignore
vendored
@@ -1,162 +1,54 @@
|
|||||||
# Byte-compiled / optimized / DLL files
|
# Temporary and binary files
|
||||||
__pycache__/
|
*~
|
||||||
*.py[cod]
|
*.py[cod]
|
||||||
*$py.class
|
|
||||||
|
|
||||||
# C extensions
|
|
||||||
*.so
|
*.so
|
||||||
|
*.cfg
|
||||||
|
!.isort.cfg
|
||||||
|
!setup.cfg
|
||||||
|
*.orig
|
||||||
|
*.log
|
||||||
|
*.pot
|
||||||
|
__pycache__/*
|
||||||
|
.cache/*
|
||||||
|
.*.swp
|
||||||
|
*/.ipynb_checkpoints/*
|
||||||
|
.DS_Store
|
||||||
|
|
||||||
# Distribution / packaging
|
# Project files
|
||||||
.Python
|
.ropeproject
|
||||||
build/
|
.project
|
||||||
develop-eggs/
|
.pydevproject
|
||||||
dist/
|
.settings
|
||||||
downloads/
|
.idea
|
||||||
eggs/
|
.vscode
|
||||||
.eggs/
|
tags
|
||||||
lib/
|
|
||||||
lib64/
|
# Package files
|
||||||
parts/
|
|
||||||
sdist/
|
|
||||||
var/
|
|
||||||
wheels/
|
|
||||||
share/python-wheels/
|
|
||||||
*.egg-info/
|
|
||||||
.installed.cfg
|
|
||||||
*.egg
|
*.egg
|
||||||
MANIFEST
|
*.eggs/
|
||||||
|
.installed.cfg
|
||||||
|
*.egg-info
|
||||||
|
|
||||||
# PyInstaller
|
# Unittest and coverage
|
||||||
# Usually these files are written by a python script from a template
|
htmlcov/*
|
||||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
|
||||||
*.manifest
|
|
||||||
*.spec
|
|
||||||
|
|
||||||
# Installer logs
|
|
||||||
pip-log.txt
|
|
||||||
pip-delete-this-directory.txt
|
|
||||||
|
|
||||||
# Unit test / coverage reports
|
|
||||||
htmlcov/
|
|
||||||
.tox/
|
|
||||||
.nox/
|
|
||||||
.coverage
|
.coverage
|
||||||
.coverage.*
|
.coverage.*
|
||||||
.cache
|
.tox
|
||||||
nosetests.xml
|
junit*.xml
|
||||||
coverage.xml
|
coverage.xml
|
||||||
*.cover
|
|
||||||
*.py,cover
|
|
||||||
.hypothesis/
|
|
||||||
.pytest_cache/
|
.pytest_cache/
|
||||||
cover/
|
|
||||||
|
|
||||||
# Translations
|
# Build and docs folder/files
|
||||||
*.mo
|
build/*
|
||||||
*.pot
|
dist/*
|
||||||
|
sdist/*
|
||||||
|
docs/api/*
|
||||||
|
docs/_rst/*
|
||||||
|
docs/_build/*
|
||||||
|
cover/*
|
||||||
|
MANIFEST
|
||||||
|
|
||||||
# Django stuff:
|
# Per-project virtualenvs
|
||||||
*.log
|
.venv*/
|
||||||
local_settings.py
|
.conda*/
|
||||||
db.sqlite3
|
.python-version
|
||||||
db.sqlite3-journal
|
|
||||||
|
|
||||||
# Flask stuff:
|
|
||||||
instance/
|
|
||||||
.webassets-cache
|
|
||||||
|
|
||||||
# Scrapy stuff:
|
|
||||||
.scrapy
|
|
||||||
|
|
||||||
# Sphinx documentation
|
|
||||||
docs/_build/
|
|
||||||
|
|
||||||
# PyBuilder
|
|
||||||
.pybuilder/
|
|
||||||
target/
|
|
||||||
|
|
||||||
# Jupyter Notebook
|
|
||||||
.ipynb_checkpoints
|
|
||||||
|
|
||||||
# IPython
|
|
||||||
profile_default/
|
|
||||||
ipython_config.py
|
|
||||||
|
|
||||||
# pyenv
|
|
||||||
# For a library or package, you might want to ignore these files since the code is
|
|
||||||
# intended to run in multiple environments; otherwise, check them in:
|
|
||||||
# .python-version
|
|
||||||
|
|
||||||
# pipenv
|
|
||||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
|
||||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
|
||||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
|
||||||
# install all needed dependencies.
|
|
||||||
#Pipfile.lock
|
|
||||||
|
|
||||||
# poetry
|
|
||||||
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
|
||||||
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
|
||||||
# commonly ignored for libraries.
|
|
||||||
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
|
||||||
#poetry.lock
|
|
||||||
|
|
||||||
# pdm
|
|
||||||
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
|
||||||
#pdm.lock
|
|
||||||
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
|
||||||
# in version control.
|
|
||||||
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
|
|
||||||
.pdm.toml
|
|
||||||
.pdm-python
|
|
||||||
.pdm-build/
|
|
||||||
|
|
||||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
|
||||||
__pypackages__/
|
|
||||||
|
|
||||||
# Celery stuff
|
|
||||||
celerybeat-schedule
|
|
||||||
celerybeat.pid
|
|
||||||
|
|
||||||
# SageMath parsed files
|
|
||||||
*.sage.py
|
|
||||||
|
|
||||||
# Environments
|
|
||||||
.env
|
|
||||||
.venv
|
|
||||||
env/
|
|
||||||
venv/
|
|
||||||
ENV/
|
|
||||||
env.bak/
|
|
||||||
venv.bak/
|
|
||||||
|
|
||||||
# Spyder project settings
|
|
||||||
.spyderproject
|
|
||||||
.spyproject
|
|
||||||
|
|
||||||
# Rope project settings
|
|
||||||
.ropeproject
|
|
||||||
|
|
||||||
# mkdocs documentation
|
|
||||||
/site
|
|
||||||
|
|
||||||
# mypy
|
|
||||||
.mypy_cache/
|
|
||||||
.dmypy.json
|
|
||||||
dmypy.json
|
|
||||||
|
|
||||||
# Pyre type checker
|
|
||||||
.pyre/
|
|
||||||
|
|
||||||
# pytype static type analyzer
|
|
||||||
.pytype/
|
|
||||||
|
|
||||||
# Cython debug symbols
|
|
||||||
cython_debug/
|
|
||||||
|
|
||||||
# PyCharm
|
|
||||||
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
|
||||||
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
|
||||||
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
|
||||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
|
||||||
#.idea/
|
|
||||||
|
|||||||
27
.readthedocs.yml
Normal file
27
.readthedocs.yml
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# Read the Docs configuration file
|
||||||
|
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
|
||||||
|
|
||||||
|
# Required
|
||||||
|
version: 2
|
||||||
|
|
||||||
|
# Build documentation in the docs/ directory with Sphinx
|
||||||
|
sphinx:
|
||||||
|
configuration: docs/conf.py
|
||||||
|
|
||||||
|
# Build documentation with MkDocs
|
||||||
|
#mkdocs:
|
||||||
|
# configuration: mkdocs.yml
|
||||||
|
|
||||||
|
# Optionally build your docs in additional formats such as PDF
|
||||||
|
formats:
|
||||||
|
- pdf
|
||||||
|
|
||||||
|
build:
|
||||||
|
os: ubuntu-22.04
|
||||||
|
tools:
|
||||||
|
python: "3.11"
|
||||||
|
|
||||||
|
python:
|
||||||
|
install:
|
||||||
|
- requirements: docs/requirements.txt
|
||||||
|
- {path: ., method: pip}
|
||||||
5
AUTHORS.rst
Normal file
5
AUTHORS.rst
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
============
|
||||||
|
Contributors
|
||||||
|
============
|
||||||
|
|
||||||
|
* Josiah Baldwin <jbaldwin8889@gmail.com>
|
||||||
8
CHANGELOG.rst
Normal file
8
CHANGELOG.rst
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
=========
|
||||||
|
Changelog
|
||||||
|
=========
|
||||||
|
|
||||||
|
Version 0.1
|
||||||
|
===========
|
||||||
|
|
||||||
|
Create
|
||||||
244
CONTRIBUTING.rst
Normal file
244
CONTRIBUTING.rst
Normal file
@@ -0,0 +1,244 @@
|
|||||||
|
============
|
||||||
|
Contributing
|
||||||
|
============
|
||||||
|
|
||||||
|
Welcome to ``meshctrl`` contributor's guide.
|
||||||
|
|
||||||
|
This document focuses on getting any potential contributor familiarized
|
||||||
|
with the development processes, but `other kinds of contributions`_ are also
|
||||||
|
appreciated.
|
||||||
|
|
||||||
|
If you are new to using git_ or have never collaborated in a project previously,
|
||||||
|
please have a look at `contribution-guide.org`_. Other resources are also
|
||||||
|
listed in the excellent `guide created by FreeCodeCamp`_.
|
||||||
|
|
||||||
|
Please notice, all users and contributors are expected to be **open,
|
||||||
|
considerate, reasonable, and respectful**. When in doubt, `Python Software
|
||||||
|
Foundation's Code of Conduct`_ is a good reference in terms of behavior
|
||||||
|
guidelines.
|
||||||
|
|
||||||
|
|
||||||
|
Issue Reports
|
||||||
|
=============
|
||||||
|
|
||||||
|
If you experience bugs or general issues with ``meshctrl``, please have a look
|
||||||
|
on the `issue tracker`_. If you don't see anything useful there, please feel
|
||||||
|
free to fire an issue report.
|
||||||
|
|
||||||
|
.. tip::
|
||||||
|
Please don't forget to include the closed issues in your search.
|
||||||
|
Sometimes a solution was already reported, and the problem is considered
|
||||||
|
**solved**.
|
||||||
|
|
||||||
|
New issue reports should include information about your programming environment
|
||||||
|
(e.g., operating system, Python version) and steps to reproduce the problem.
|
||||||
|
Please try also to simplify the reproduction steps to a very minimal example
|
||||||
|
that still illustrates the problem you are facing. By removing other factors,
|
||||||
|
you help us to identify the root cause of the issue.
|
||||||
|
|
||||||
|
|
||||||
|
Documentation Improvements
|
||||||
|
==========================
|
||||||
|
|
||||||
|
You can help improve ``meshctrl`` docs by making them more readable and coherent, or
|
||||||
|
by adding missing information and correcting mistakes.
|
||||||
|
|
||||||
|
``meshctrl`` documentation uses Sphinx_ as its main documentation compiler.
|
||||||
|
This means that the docs are kept in the same repository as the project code, and
|
||||||
|
that any documentation update is done in the same way was a code contribution.
|
||||||
|
|
||||||
|
.. tip::
|
||||||
|
Please notice that the `GitHub web interface`_ provides a quick way of
|
||||||
|
propose changes in ``meshctrl``'s files. While this mechanism can
|
||||||
|
be tricky for normal code contributions, it works perfectly fine for
|
||||||
|
contributing to the docs, and can be quite handy.
|
||||||
|
|
||||||
|
If you are interested in trying this method out, please navigate to
|
||||||
|
the ``docs`` folder in the source repository_, find which file you
|
||||||
|
would like to propose changes and click in the little pencil icon at the
|
||||||
|
top, to open `GitHub's code editor`_. Once you finish editing the file,
|
||||||
|
please write a message in the form at the bottom of the page describing
|
||||||
|
which changes have you made and what are the motivations behind them and
|
||||||
|
submit your proposal.
|
||||||
|
|
||||||
|
When working on documentation changes in your local machine, you can
|
||||||
|
compile them using |tox|_::
|
||||||
|
|
||||||
|
tox -e docs
|
||||||
|
|
||||||
|
and use Python's built-in web server for a preview in your web browser
|
||||||
|
(``http://localhost:8000``)::
|
||||||
|
|
||||||
|
python3 -m http.server --directory 'docs/_build/html'
|
||||||
|
|
||||||
|
|
||||||
|
.. Code Contributions
|
||||||
|
.. ==================
|
||||||
|
|
||||||
|
|
||||||
|
.. An architecture description, design principles or at least a summary of the
|
||||||
|
.. main concepts will make it easy for potential contributors to get started
|
||||||
|
.. quickly.
|
||||||
|
|
||||||
|
Submit an issue
|
||||||
|
---------------
|
||||||
|
|
||||||
|
Before you work on any non-trivial code contribution it's best to first create
|
||||||
|
a report in the `issue tracker`_ to start a discussion on the subject.
|
||||||
|
This often provides additional considerations and avoids unnecessary work.
|
||||||
|
|
||||||
|
Create an environment
|
||||||
|
---------------------
|
||||||
|
|
||||||
|
Before you start coding, we recommend creating an isolated `virtual
|
||||||
|
environment`_ to avoid any problems with your installed Python packages.
|
||||||
|
This can easily be done via |virtualenv|_::
|
||||||
|
|
||||||
|
python -m venv <PATH TO VENV>
|
||||||
|
source <PATH TO VENV>/bin/activate
|
||||||
|
|
||||||
|
Clone the repository
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
#. Create an user account on |the repository service| if you do not already have one.
|
||||||
|
#. Fork the project repository_: click on the *Fork* button near the top of the
|
||||||
|
page. This creates a copy of the code under your account on |the repository service|.
|
||||||
|
#. Clone this copy to your local disk::
|
||||||
|
|
||||||
|
git clone git@github.com:YourLogin/meshctrl.git
|
||||||
|
cd meshctrl
|
||||||
|
|
||||||
|
#. You should run::
|
||||||
|
|
||||||
|
pip install -U pip setuptools -e .
|
||||||
|
|
||||||
|
to be able to import the package under development in the Python REPL.
|
||||||
|
|
||||||
|
Implement your changes
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
#. Create a branch to hold your changes::
|
||||||
|
|
||||||
|
git checkout -b my-feature
|
||||||
|
|
||||||
|
and start making changes. Never work on the main branch!
|
||||||
|
|
||||||
|
#. Start your work on this branch. Don't forget to add docstrings_ to new
|
||||||
|
functions, modules and classes, especially if they are part of public APIs.
|
||||||
|
|
||||||
|
#. Add yourself to the list of contributors in ``AUTHORS.rst``.
|
||||||
|
|
||||||
|
#. When you’re done editing, do::
|
||||||
|
|
||||||
|
git add <MODIFIED FILES>
|
||||||
|
git commit
|
||||||
|
|
||||||
|
to record your changes in git_.
|
||||||
|
|
||||||
|
|
||||||
|
Submit your contribution
|
||||||
|
------------------------
|
||||||
|
|
||||||
|
#. If everything works fine, push your local branch to |the repository service| with::
|
||||||
|
|
||||||
|
git push -u origin my-feature
|
||||||
|
|
||||||
|
#. Go to the web page of your fork and click |contribute button|
|
||||||
|
to send your changes for review.
|
||||||
|
|
||||||
|
Find more detailed information in `creating a PR`_. You might also want to open
|
||||||
|
the PR as a draft first and mark it as ready for review after the feedbacks
|
||||||
|
from the continuous integration (CI) system or any required fixes.
|
||||||
|
|
||||||
|
|
||||||
|
Troubleshooting
|
||||||
|
---------------
|
||||||
|
|
||||||
|
The following tips can be used when facing problems to build or test the
|
||||||
|
package:
|
||||||
|
|
||||||
|
#. Make sure to fetch all the tags from the upstream repository_.
|
||||||
|
The command ``git describe --abbrev=0 --tags`` should return the version you
|
||||||
|
are expecting. If you are trying to run CI scripts in a fork repository,
|
||||||
|
make sure to push all the tags.
|
||||||
|
You can also try to remove all the egg files or the complete egg folder, i.e.,
|
||||||
|
``.eggs``, as well as the ``*.egg-info`` folders in the ``src`` folder or
|
||||||
|
potentially in the root of your project.
|
||||||
|
|
||||||
|
#. Sometimes |tox|_ misses out when new dependencies are added, especially to
|
||||||
|
``setup.cfg`` and ``docs/requirements.txt``. If you find any problems with
|
||||||
|
missing dependencies when running a command with |tox|_, try to recreate the
|
||||||
|
``tox`` environment using the ``-r`` flag. For example, instead of::
|
||||||
|
|
||||||
|
tox -e docs
|
||||||
|
|
||||||
|
Try running::
|
||||||
|
|
||||||
|
tox -r -e docs
|
||||||
|
|
||||||
|
#. Make sure to have a reliable |tox|_ installation that uses the correct
|
||||||
|
Python version (e.g., 3.7+). When in doubt you can run::
|
||||||
|
|
||||||
|
tox --version
|
||||||
|
# OR
|
||||||
|
which tox
|
||||||
|
|
||||||
|
If you have trouble and are seeing weird errors upon running |tox|_, you can
|
||||||
|
also try to create a dedicated `virtual environment`_ with a |tox|_ binary
|
||||||
|
freshly installed. For example::
|
||||||
|
|
||||||
|
virtualenv .venv
|
||||||
|
source .venv/bin/activate
|
||||||
|
.venv/bin/pip install tox
|
||||||
|
.venv/bin/tox -e all
|
||||||
|
|
||||||
|
#. `Pytest can drop you`_ in an interactive session in the case an error occurs.
|
||||||
|
In order to do that you need to pass a ``--pdb`` option (for example by
|
||||||
|
running ``tox -- -k <NAME OF THE FALLING TEST> --pdb``).
|
||||||
|
You can also setup breakpoints manually instead of using the ``--pdb`` option.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
.. <-- start -->
|
||||||
|
|
||||||
|
.. |the repository service| replace:: GitHub
|
||||||
|
.. |contribute button| replace:: "Create pull request"
|
||||||
|
|
||||||
|
.. _repository: https://github.com/HuFlungDu/meshctrl
|
||||||
|
.. _issue tracker: https://github.com/HuFlungDu/meshctrl/issues
|
||||||
|
.. <-- end -->
|
||||||
|
|
||||||
|
|
||||||
|
.. |virtualenv| replace:: ``virtualenv``
|
||||||
|
.. |pre-commit| replace:: ``pre-commit``
|
||||||
|
.. |tox| replace:: ``tox``
|
||||||
|
|
||||||
|
|
||||||
|
.. _black: https://pypi.org/project/black/
|
||||||
|
.. _CommonMark: https://commonmark.org/
|
||||||
|
.. _contribution-guide.org: https://www.contribution-guide.org/
|
||||||
|
.. _creating a PR: https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/creating-a-pull-request
|
||||||
|
.. _descriptive commit message: https://chris.beams.io/posts/git-commit
|
||||||
|
.. _docstrings: https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html
|
||||||
|
.. _first-contributions tutorial: https://github.com/firstcontributions/first-contributions
|
||||||
|
.. _flake8: https://flake8.pycqa.org/en/stable/
|
||||||
|
.. _git: https://git-scm.com
|
||||||
|
.. _GitHub's fork and pull request workflow: https://guides.github.com/activities/forking/
|
||||||
|
.. _guide created by FreeCodeCamp: https://github.com/FreeCodeCamp/how-to-contribute-to-open-source
|
||||||
|
.. _Miniconda: https://docs.conda.io/en/latest/miniconda.html
|
||||||
|
.. _MyST: https://myst-parser.readthedocs.io/en/latest/syntax/syntax.html
|
||||||
|
.. _other kinds of contributions: https://opensource.guide/how-to-contribute
|
||||||
|
.. _pre-commit: https://pre-commit.com/
|
||||||
|
.. _PyPI: https://pypi.org/
|
||||||
|
.. _PyScaffold's contributor's guide: https://pyscaffold.org/en/stable/contributing.html
|
||||||
|
.. _Pytest can drop you: https://docs.pytest.org/en/stable/how-to/failures.html#using-python-library-pdb-with-pytest
|
||||||
|
.. _Python Software Foundation's Code of Conduct: https://www.python.org/psf/conduct/
|
||||||
|
.. _reStructuredText: https://www.sphinx-doc.org/en/master/usage/restructuredtext/
|
||||||
|
.. _Sphinx: https://www.sphinx-doc.org/en/master/
|
||||||
|
.. _tox: https://tox.wiki/en/stable/
|
||||||
|
.. _virtual environment: https://realpython.com/python-virtual-environments-a-primer/
|
||||||
|
.. _virtualenv: https://docs.python.org/3/library/venv.html
|
||||||
|
|
||||||
|
.. _GitHub web interface: https://docs.github.com/en/repositories/working-with-files/managing-files/editing-files
|
||||||
|
.. _GitHub's code editor: https://docs.github.com/en/repositories/working-with-files/managing-files/editing-files
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
MIT License
|
The MIT License (MIT)
|
||||||
|
|
||||||
Copyright (c) 2024 Josiah Baldwin
|
Copyright (c) 2024 Josiah Baldwin
|
||||||
|
|
||||||
@@ -1,2 +1,2 @@
|
|||||||
# pylibmeshctrl
|
# meshctrl
|
||||||
Libmeshctrl implementation in python
|
Libmeshctrl implementation in python
|
||||||
|
|||||||
49
README.rst
Normal file
49
README.rst
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
.. These are examples of badges you might want to add to your README:
|
||||||
|
please update the URLs accordingly
|
||||||
|
|
||||||
|
.. image:: https://api.cirrus-ci.com/github/<USER>/pylibmeshctrl.svg?branch=main
|
||||||
|
:alt: Built Status
|
||||||
|
:target: https://cirrus-ci.com/github/<USER>/pylibmeshctrl
|
||||||
|
.. image:: https://readthedocs.org/projects/pylibmeshctrl/badge/?version=latest
|
||||||
|
:alt: ReadTheDocs
|
||||||
|
:target: https://pylibmeshctrl.readthedocs.io/en/stable/
|
||||||
|
.. image:: https://img.shields.io/coveralls/github/<USER>/pylibmeshctrl/main.svg
|
||||||
|
:alt: Coveralls
|
||||||
|
:target: https://coveralls.io/r/<USER>/pylibmeshctrl
|
||||||
|
.. image:: https://img.shields.io/pypi/v/pylibmeshctrl.svg
|
||||||
|
:alt: PyPI-Server
|
||||||
|
:target: https://pypi.org/project/pylibmeshctrl/
|
||||||
|
.. image:: https://img.shields.io/conda/vn/conda-forge/pylibmeshctrl.svg
|
||||||
|
:alt: Conda-Forge
|
||||||
|
:target: https://anaconda.org/conda-forge/pylibmeshctrl
|
||||||
|
.. image:: https://pepy.tech/badge/pylibmeshctrl/month
|
||||||
|
:alt: Monthly Downloads
|
||||||
|
:target: https://pepy.tech/project/pylibmeshctrl
|
||||||
|
.. image:: https://img.shields.io/twitter/url/http/shields.io.svg?style=social&label=Twitter
|
||||||
|
:alt: Twitter
|
||||||
|
:target: https://twitter.com/pylibmeshctrl
|
||||||
|
|
||||||
|
.. image:: https://img.shields.io/badge/-PyScaffold-005CA0?logo=pyscaffold
|
||||||
|
:alt: Project generated with PyScaffold
|
||||||
|
:target: https://pyscaffold.org/
|
||||||
|
|
||||||
|
|
|
||||||
|
|
||||||
|
=============
|
||||||
|
meshctrl
|
||||||
|
=============
|
||||||
|
|
||||||
|
|
||||||
|
Libmeshctrl implementation in python
|
||||||
|
|
||||||
|
|
||||||
|
This is a library for interacting with a Mesh Central instance programatically. Written in python.
|
||||||
|
|
||||||
|
|
||||||
|
.. _pyscaffold-notes:
|
||||||
|
|
||||||
|
Note
|
||||||
|
====
|
||||||
|
|
||||||
|
This project has been set up using PyScaffold 4.6. For details and usage
|
||||||
|
information on PyScaffold see https://pyscaffold.org/.
|
||||||
29
docs/Makefile
Normal file
29
docs/Makefile
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# Makefile for Sphinx documentation
|
||||||
|
#
|
||||||
|
|
||||||
|
# You can set these variables from the command line, and also
|
||||||
|
# from the environment for the first two.
|
||||||
|
SPHINXOPTS ?=
|
||||||
|
SPHINXBUILD ?= sphinx-build
|
||||||
|
SOURCEDIR = .
|
||||||
|
BUILDDIR = _build
|
||||||
|
AUTODOCDIR = api
|
||||||
|
|
||||||
|
# User-friendly check for sphinx-build
|
||||||
|
ifeq ($(shell which $(SPHINXBUILD) >/dev/null 2>&1; echo $?), 1)
|
||||||
|
$(error "The '$(SPHINXBUILD)' command was not found. Make sure you have Sphinx installed, then set the SPHINXBUILD environment variable to point to the full path of the '$(SPHINXBUILD)' executable. Alternatively you can add the directory with the executable to your PATH. If you don't have Sphinx installed, grab it from https://sphinx-doc.org/")
|
||||||
|
endif
|
||||||
|
|
||||||
|
.PHONY: help clean Makefile
|
||||||
|
|
||||||
|
# Put it first so that "make" without argument is like "make help".
|
||||||
|
help:
|
||||||
|
@$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||||
|
|
||||||
|
clean:
|
||||||
|
rm -rf $(BUILDDIR)/* $(AUTODOCDIR)
|
||||||
|
|
||||||
|
# Catch-all target: route all unknown targets to Sphinx using the new
|
||||||
|
# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS).
|
||||||
|
%: Makefile
|
||||||
|
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
|
||||||
1
docs/_static/.gitignore
vendored
Normal file
1
docs/_static/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
# Empty directory
|
||||||
2
docs/authors.rst
Normal file
2
docs/authors.rst
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
.. _authors:
|
||||||
|
.. include:: ../AUTHORS.rst
|
||||||
2
docs/changelog.rst
Normal file
2
docs/changelog.rst
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
.. _changes:
|
||||||
|
.. include:: ../CHANGELOG.rst
|
||||||
287
docs/conf.py
Normal file
287
docs/conf.py
Normal file
@@ -0,0 +1,287 @@
|
|||||||
|
# This file is execfile()d with the current directory set to its containing dir.
|
||||||
|
#
|
||||||
|
# This file only contains a selection of the most common options. For a full
|
||||||
|
# list see the documentation:
|
||||||
|
# https://www.sphinx-doc.org/en/master/usage/configuration.html
|
||||||
|
#
|
||||||
|
# All configuration values have a default; values that are commented out
|
||||||
|
# serve to show the default.
|
||||||
|
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import shutil
|
||||||
|
|
||||||
|
# -- Path setup --------------------------------------------------------------
|
||||||
|
|
||||||
|
__location__ = os.path.dirname(__file__)
|
||||||
|
|
||||||
|
# If extensions (or modules to document with autodoc) are in another directory,
|
||||||
|
# add these directories to sys.path here. If the directory is relative to the
|
||||||
|
# documentation root, use os.path.abspath to make it absolute, like shown here.
|
||||||
|
sys.path.insert(0, os.path.join(__location__, "../src"))
|
||||||
|
|
||||||
|
# -- Run sphinx-apidoc -------------------------------------------------------
|
||||||
|
# This hack is necessary since RTD does not issue `sphinx-apidoc` before running
|
||||||
|
# `sphinx-build -b html . _build/html`. See Issue:
|
||||||
|
# https://github.com/readthedocs/readthedocs.org/issues/1139
|
||||||
|
# DON'T FORGET: Check the box "Install your project inside a virtualenv using
|
||||||
|
# setup.py install" in the RTD Advanced Settings.
|
||||||
|
# Additionally it helps us to avoid running apidoc manually
|
||||||
|
|
||||||
|
try: # for Sphinx >= 1.7
|
||||||
|
from sphinx.ext import apidoc
|
||||||
|
except ImportError:
|
||||||
|
from sphinx import apidoc
|
||||||
|
|
||||||
|
output_dir = os.path.join(__location__, "api")
|
||||||
|
module_dir = os.path.join(__location__, "../src/meshctrl")
|
||||||
|
try:
|
||||||
|
shutil.rmtree(output_dir)
|
||||||
|
except FileNotFoundError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
import sphinx
|
||||||
|
|
||||||
|
cmd_line = f"sphinx-apidoc --implicit-namespaces -f -o {output_dir} {module_dir}"
|
||||||
|
|
||||||
|
args = cmd_line.split(" ")
|
||||||
|
if tuple(sphinx.__version__.split(".")) >= ("1", "7"):
|
||||||
|
# This is a rudimentary parse_version to avoid external dependencies
|
||||||
|
args = args[1:]
|
||||||
|
|
||||||
|
apidoc.main(args)
|
||||||
|
except Exception as e:
|
||||||
|
print("Running `sphinx-apidoc` failed!\n{}".format(e))
|
||||||
|
|
||||||
|
# -- General configuration ---------------------------------------------------
|
||||||
|
|
||||||
|
# If your documentation needs a minimal Sphinx version, state it here.
|
||||||
|
# needs_sphinx = '1.0'
|
||||||
|
|
||||||
|
# Add any Sphinx extension module names here, as strings. They can be extensions
|
||||||
|
# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
|
||||||
|
extensions = [
|
||||||
|
"sphinx.ext.autodoc",
|
||||||
|
"sphinx.ext.intersphinx",
|
||||||
|
"sphinx.ext.todo",
|
||||||
|
"sphinx.ext.autosummary",
|
||||||
|
"sphinx.ext.viewcode",
|
||||||
|
"sphinx.ext.coverage",
|
||||||
|
"sphinx.ext.doctest",
|
||||||
|
"sphinx.ext.ifconfig",
|
||||||
|
"sphinx.ext.mathjax",
|
||||||
|
"sphinx.ext.napoleon",
|
||||||
|
"enum_tools.autoenum",
|
||||||
|
]
|
||||||
|
|
||||||
|
# Add any paths that contain templates here, relative to this directory.
|
||||||
|
templates_path = ["_templates"]
|
||||||
|
|
||||||
|
# The suffix of source filenames.
|
||||||
|
source_suffix = ".rst"
|
||||||
|
|
||||||
|
# The encoding of source files.
|
||||||
|
# source_encoding = 'utf-8-sig'
|
||||||
|
|
||||||
|
# The master toctree document.
|
||||||
|
master_doc = "index"
|
||||||
|
|
||||||
|
# General information about the project.
|
||||||
|
project = "meshctrl"
|
||||||
|
copyright = "2024, Josiah Baldwin"
|
||||||
|
|
||||||
|
# The version info for the project you're documenting, acts as replacement for
|
||||||
|
# |version| and |release|, also used in various other places throughout the
|
||||||
|
# built documents.
|
||||||
|
#
|
||||||
|
# version: The short X.Y version.
|
||||||
|
# release: The full version, including alpha/beta/rc tags.
|
||||||
|
# If you don’t need the separation provided between version and release,
|
||||||
|
# just set them both to the same value.
|
||||||
|
try:
|
||||||
|
from meshctrl import __version__ as version
|
||||||
|
except ImportError:
|
||||||
|
version = ""
|
||||||
|
|
||||||
|
if not version or version.lower() == "unknown":
|
||||||
|
version = os.getenv("READTHEDOCS_VERSION", "unknown") # automatically set by RTD
|
||||||
|
|
||||||
|
release = version
|
||||||
|
|
||||||
|
# The language for content autogenerated by Sphinx. Refer to documentation
|
||||||
|
# for a list of supported languages.
|
||||||
|
# language = None
|
||||||
|
|
||||||
|
# There are two options for replacing |today|: either, you set today to some
|
||||||
|
# non-false value, then it is used:
|
||||||
|
# today = ''
|
||||||
|
# Else, today_fmt is used as the format for a strftime call.
|
||||||
|
# today_fmt = '%B %d, %Y'
|
||||||
|
|
||||||
|
# List of patterns, relative to source directory, that match files and
|
||||||
|
# directories to ignore when looking for source files.
|
||||||
|
exclude_patterns = ["_build", "Thumbs.db", ".DS_Store", ".venv"]
|
||||||
|
|
||||||
|
# The reST default role (used for this markup: `text`) to use for all documents.
|
||||||
|
# default_role = None
|
||||||
|
|
||||||
|
# If true, '()' will be appended to :func: etc. cross-reference text.
|
||||||
|
# add_function_parentheses = True
|
||||||
|
|
||||||
|
# If true, the current module name will be prepended to all description
|
||||||
|
# unit titles (such as .. function::).
|
||||||
|
# add_module_names = True
|
||||||
|
|
||||||
|
# If true, sectionauthor and moduleauthor directives will be shown in the
|
||||||
|
# output. They are ignored by default.
|
||||||
|
# show_authors = False
|
||||||
|
|
||||||
|
# The name of the Pygments (syntax highlighting) style to use.
|
||||||
|
pygments_style = "sphinx"
|
||||||
|
|
||||||
|
# A list of ignored prefixes for module index sorting.
|
||||||
|
# modindex_common_prefix = []
|
||||||
|
|
||||||
|
# If true, keep warnings as "system message" paragraphs in the built documents.
|
||||||
|
# keep_warnings = False
|
||||||
|
|
||||||
|
# If this is True, todo emits a warning for each TODO entries. The default is False.
|
||||||
|
todo_emit_warnings = True
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for HTML output -------------------------------------------------
|
||||||
|
|
||||||
|
# The theme to use for HTML and HTML Help pages. See the documentation for
|
||||||
|
# a list of builtin themes.
|
||||||
|
html_theme = "alabaster"
|
||||||
|
|
||||||
|
# Theme options are theme-specific and customize the look and feel of a theme
|
||||||
|
# further. For a list of options available for each theme, see the
|
||||||
|
# documentation.
|
||||||
|
html_theme_options = {
|
||||||
|
"sidebar_width": "300px",
|
||||||
|
"page_width": "1200px"
|
||||||
|
}
|
||||||
|
|
||||||
|
# Add any paths that contain custom themes here, relative to this directory.
|
||||||
|
# html_theme_path = []
|
||||||
|
|
||||||
|
# The name for this set of Sphinx documents. If None, it defaults to
|
||||||
|
# "<project> v<release> documentation".
|
||||||
|
# html_title = None
|
||||||
|
|
||||||
|
# A shorter title for the navigation bar. Default is the same as html_title.
|
||||||
|
# html_short_title = None
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top
|
||||||
|
# of the sidebar.
|
||||||
|
# html_logo = ""
|
||||||
|
|
||||||
|
# The name of an image file (within the static path) to use as favicon of the
|
||||||
|
# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
|
||||||
|
# pixels large.
|
||||||
|
# html_favicon = None
|
||||||
|
|
||||||
|
# Add any paths that contain custom static files (such as style sheets) here,
|
||||||
|
# relative to this directory. They are copied after the builtin static files,
|
||||||
|
# so a file named "default.css" will overwrite the builtin "default.css".
|
||||||
|
html_static_path = ["_static"]
|
||||||
|
|
||||||
|
# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
|
||||||
|
# using the given strftime format.
|
||||||
|
# html_last_updated_fmt = '%b %d, %Y'
|
||||||
|
|
||||||
|
# If true, SmartyPants will be used to convert quotes and dashes to
|
||||||
|
# typographically correct entities.
|
||||||
|
# html_use_smartypants = True
|
||||||
|
|
||||||
|
# Custom sidebar templates, maps document names to template names.
|
||||||
|
# html_sidebars = {}
|
||||||
|
|
||||||
|
# Additional templates that should be rendered to pages, maps page names to
|
||||||
|
# template names.
|
||||||
|
# html_additional_pages = {}
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
# html_domain_indices = True
|
||||||
|
|
||||||
|
# If false, no index is generated.
|
||||||
|
# html_use_index = True
|
||||||
|
|
||||||
|
# If true, the index is split into individual pages for each letter.
|
||||||
|
# html_split_index = False
|
||||||
|
|
||||||
|
# If true, links to the reST sources are added to the pages.
|
||||||
|
# html_show_sourcelink = True
|
||||||
|
|
||||||
|
# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
|
||||||
|
# html_show_sphinx = True
|
||||||
|
|
||||||
|
# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
|
||||||
|
# html_show_copyright = True
|
||||||
|
|
||||||
|
# If true, an OpenSearch description file will be output, and all pages will
|
||||||
|
# contain a <link> tag referring to it. The value of this option must be the
|
||||||
|
# base URL from which the finished HTML is served.
|
||||||
|
# html_use_opensearch = ''
|
||||||
|
|
||||||
|
# This is the file name suffix for HTML files (e.g. ".xhtml").
|
||||||
|
# html_file_suffix = None
|
||||||
|
|
||||||
|
# Output file base name for HTML help builder.
|
||||||
|
htmlhelp_basename = "meshctrl-doc"
|
||||||
|
|
||||||
|
|
||||||
|
# -- Options for LaTeX output ------------------------------------------------
|
||||||
|
|
||||||
|
latex_elements = {
|
||||||
|
# The paper size ("letterpaper" or "a4paper").
|
||||||
|
# "papersize": "letterpaper",
|
||||||
|
# The font size ("10pt", "11pt" or "12pt").
|
||||||
|
# "pointsize": "10pt",
|
||||||
|
# Additional stuff for the LaTeX preamble.
|
||||||
|
# "preamble": "",
|
||||||
|
}
|
||||||
|
|
||||||
|
# Grouping the document tree into LaTeX files. List of tuples
|
||||||
|
# (source start file, target name, title, author, documentclass [howto/manual]).
|
||||||
|
latex_documents = [
|
||||||
|
("index", "user_guide.tex", "meshctrl Documentation", "Josiah Baldwin", "manual")
|
||||||
|
]
|
||||||
|
|
||||||
|
# The name of an image file (relative to this directory) to place at the top of
|
||||||
|
# the title page.
|
||||||
|
# latex_logo = ""
|
||||||
|
|
||||||
|
# For "manual" documents, if this is true, then toplevel headings are parts,
|
||||||
|
# not chapters.
|
||||||
|
# latex_use_parts = False
|
||||||
|
|
||||||
|
# If true, show page references after internal links.
|
||||||
|
# latex_show_pagerefs = False
|
||||||
|
|
||||||
|
# If true, show URL addresses after external links.
|
||||||
|
# latex_show_urls = False
|
||||||
|
|
||||||
|
# Documents to append as an appendix to all manuals.
|
||||||
|
# latex_appendices = []
|
||||||
|
|
||||||
|
# If false, no module index is generated.
|
||||||
|
# latex_domain_indices = True
|
||||||
|
|
||||||
|
# -- External mapping --------------------------------------------------------
|
||||||
|
python_version = ".".join(map(str, sys.version_info[0:2]))
|
||||||
|
intersphinx_mapping = {
|
||||||
|
"sphinx": ("https://www.sphinx-doc.org/en/master", None),
|
||||||
|
"python": ("https://docs.python.org/" + python_version, None),
|
||||||
|
"matplotlib": ("https://matplotlib.org", None),
|
||||||
|
"numpy": ("https://numpy.org/doc/stable", None),
|
||||||
|
"sklearn": ("https://scikit-learn.org/stable", None),
|
||||||
|
"pandas": ("https://pandas.pydata.org/pandas-docs/stable", None),
|
||||||
|
"scipy": ("https://docs.scipy.org/doc/scipy/reference", None),
|
||||||
|
"setuptools": ("https://setuptools.pypa.io/en/stable/", None),
|
||||||
|
"pyscaffold": ("https://pyscaffold.org/en/stable", None),
|
||||||
|
}
|
||||||
|
|
||||||
|
print(f"loading configurations for {project} {version} ...", file=sys.stderr)
|
||||||
1
docs/contributing.rst
Normal file
1
docs/contributing.rst
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.. include:: ../CONTRIBUTING.rst
|
||||||
26
docs/index.rst
Normal file
26
docs/index.rst
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
=============
|
||||||
|
meshctrl
|
||||||
|
=============
|
||||||
|
|
||||||
|
This is the documentation of **meshctrl**.
|
||||||
|
|
||||||
|
Contents
|
||||||
|
========
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 2
|
||||||
|
|
||||||
|
Overview <readme>
|
||||||
|
Contributions & Help <contributing>
|
||||||
|
License <license>
|
||||||
|
Authors <authors>
|
||||||
|
Changelog <changelog>
|
||||||
|
Module Reference <api/modules>
|
||||||
|
|
||||||
|
|
||||||
|
Indices and tables
|
||||||
|
==================
|
||||||
|
|
||||||
|
* :ref:`genindex`
|
||||||
|
* :ref:`modindex`
|
||||||
|
* :ref:`search`
|
||||||
7
docs/license.rst
Normal file
7
docs/license.rst
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
.. _license:
|
||||||
|
|
||||||
|
=======
|
||||||
|
License
|
||||||
|
=======
|
||||||
|
|
||||||
|
.. include:: ../LICENSE.txt
|
||||||
35
docs/make.bat
Normal file
35
docs/make.bat
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
@ECHO OFF
|
||||||
|
|
||||||
|
pushd %~dp0
|
||||||
|
|
||||||
|
REM Command file for Sphinx documentation
|
||||||
|
|
||||||
|
if "%SPHINXBUILD%" == "" (
|
||||||
|
set SPHINXBUILD=sphinx-build
|
||||||
|
)
|
||||||
|
set SOURCEDIR=source
|
||||||
|
set BUILDDIR=build
|
||||||
|
|
||||||
|
%SPHINXBUILD% >NUL 2>NUL
|
||||||
|
if errorlevel 9009 (
|
||||||
|
echo.
|
||||||
|
echo.The 'sphinx-build' command was not found. Make sure you have Sphinx
|
||||||
|
echo.installed, then set the SPHINXBUILD environment variable to point
|
||||||
|
echo.to the full path of the 'sphinx-build' executable. Alternatively you
|
||||||
|
echo.may add the Sphinx directory to PATH.
|
||||||
|
echo.
|
||||||
|
echo.If you don't have Sphinx installed, grab it from
|
||||||
|
echo.https://www.sphinx-doc.org/
|
||||||
|
exit /b 1
|
||||||
|
)
|
||||||
|
|
||||||
|
if "%1" == "" goto help
|
||||||
|
|
||||||
|
%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
|
||||||
|
goto end
|
||||||
|
|
||||||
|
:help
|
||||||
|
%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O%
|
||||||
|
|
||||||
|
:end
|
||||||
|
popd
|
||||||
2
docs/readme.rst
Normal file
2
docs/readme.rst
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
.. _readme:
|
||||||
|
.. include:: ../README.rst
|
||||||
12
docs/requirements.txt
Normal file
12
docs/requirements.txt
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
# Requirements file for ReadTheDocs, check .readthedocs.yml.
|
||||||
|
# To build the module reference correctly, make sure every external package
|
||||||
|
# under `install_requires` in `setup.cfg` is also listed here!
|
||||||
|
sphinx>=3.2.1
|
||||||
|
sphinx-jinja2-compat>=0.1.1
|
||||||
|
sphinx-toolbox>=2.16.0
|
||||||
|
# sphinx_rtd_theme
|
||||||
|
cffi==1.17.1
|
||||||
|
cryptography==43.0.3
|
||||||
|
pycparser==2.22
|
||||||
|
websockets==13.1
|
||||||
|
enum_tools
|
||||||
9
pyproject.toml
Normal file
9
pyproject.toml
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
[build-system]
|
||||||
|
# AVOID CHANGING REQUIRES: IT WILL BE UPDATED BY PYSCAFFOLD!
|
||||||
|
requires = ["setuptools>=46.1.0", "setuptools_scm[toml]>=5"]
|
||||||
|
build-backend = "setuptools.build_meta"
|
||||||
|
|
||||||
|
[tool.setuptools_scm]
|
||||||
|
# For smarter version schemes and other configuration options,
|
||||||
|
# check out https://github.com/pypa/setuptools_scm
|
||||||
|
version_scheme = "no-guess-dev"
|
||||||
BIN
requirements.txt
BIN
requirements.txt
Binary file not shown.
125
setup.cfg
Normal file
125
setup.cfg
Normal file
@@ -0,0 +1,125 @@
|
|||||||
|
# This file is used to configure your project.
|
||||||
|
# Read more about the various options under:
|
||||||
|
# https://setuptools.pypa.io/en/latest/userguide/declarative_config.html
|
||||||
|
# https://setuptools.pypa.io/en/latest/references/keywords.html
|
||||||
|
|
||||||
|
[metadata]
|
||||||
|
name = meshctrl
|
||||||
|
description = Add a short description here!
|
||||||
|
author = Josiah Baldwin
|
||||||
|
author_email = jbaldwin8889@gmail.com
|
||||||
|
license = MIT
|
||||||
|
license_files = LICENSE.txt
|
||||||
|
long_description = file: README.rst
|
||||||
|
long_description_content_type = text/x-rst; charset=UTF-8
|
||||||
|
url = https://github.com/pyscaffold/pyscaffold/
|
||||||
|
# Add here related links, for example:
|
||||||
|
project_urls =
|
||||||
|
Documentation = https://pyscaffold.org/
|
||||||
|
# Source = https://github.com/pyscaffold/pyscaffold/
|
||||||
|
# Changelog = https://pyscaffold.org/en/latest/changelog.html
|
||||||
|
# Tracker = https://github.com/pyscaffold/pyscaffold/issues
|
||||||
|
# Conda-Forge = https://anaconda.org/conda-forge/pyscaffold
|
||||||
|
# Download = https://pypi.org/project/PyScaffold/#files
|
||||||
|
# Twitter = https://twitter.com/PyScaffold
|
||||||
|
|
||||||
|
# Change if running only on Windows, Mac or Linux (comma-separated)
|
||||||
|
platforms = any
|
||||||
|
|
||||||
|
# Add here all kinds of additional classifiers as defined under
|
||||||
|
# https://pypi.org/classifiers/
|
||||||
|
classifiers =
|
||||||
|
Development Status :: 4 - Beta
|
||||||
|
Programming Language :: Python
|
||||||
|
|
||||||
|
|
||||||
|
[options]
|
||||||
|
zip_safe = False
|
||||||
|
packages = find_namespace:
|
||||||
|
include_package_data = True
|
||||||
|
package_dir =
|
||||||
|
=src
|
||||||
|
|
||||||
|
# Require a min/specific Python version (comma-separated conditions)
|
||||||
|
# python_requires = >=3.8
|
||||||
|
|
||||||
|
# Add here dependencies of your project (line-separated), e.g. requests>=2.2,<3.0.
|
||||||
|
# Version specifiers like >=2.2,<3.0 avoid problems due to API changes in
|
||||||
|
# new major versions. This works if the required packages follow Semantic Versioning.
|
||||||
|
# For more information, check out https://semver.org/.
|
||||||
|
install_requires =
|
||||||
|
importlib-metadata; python_version<"3.8"
|
||||||
|
|
||||||
|
|
||||||
|
[options.packages.find]
|
||||||
|
where = src
|
||||||
|
exclude =
|
||||||
|
tests
|
||||||
|
|
||||||
|
[options.extras_require]
|
||||||
|
# Add here additional requirements for extra features, to install with:
|
||||||
|
# `pip install meshctrl[PDF]` like:
|
||||||
|
# PDF = ReportLab; RXP
|
||||||
|
|
||||||
|
# Add here test requirements (semicolon/line-separated)
|
||||||
|
testing =
|
||||||
|
setuptools
|
||||||
|
pytest
|
||||||
|
pytest-cov
|
||||||
|
|
||||||
|
[options.entry_points]
|
||||||
|
# Add here console scripts like:
|
||||||
|
# console_scripts =
|
||||||
|
# script_name = meshctrl.module:function
|
||||||
|
# For example:
|
||||||
|
# console_scripts =
|
||||||
|
# fibonacci = meshctrl.skeleton:run
|
||||||
|
# And any other entry points, for example:
|
||||||
|
# pyscaffold.cli =
|
||||||
|
# awesome = pyscaffoldext.awesome.extension:AwesomeExtension
|
||||||
|
|
||||||
|
[tool:pytest]
|
||||||
|
# Specify command line options as you would do when invoking pytest directly.
|
||||||
|
# e.g. --cov-report html (or xml) for html/xml output or --junitxml junit.xml
|
||||||
|
# in order to write a coverage file that can be read by Jenkins.
|
||||||
|
# CAUTION: --cov flags may prohibit setting breakpoints while debugging.
|
||||||
|
# Comment those flags to avoid this pytest issue.
|
||||||
|
addopts =
|
||||||
|
--cov meshctrl --cov-report term-missing
|
||||||
|
--verbose
|
||||||
|
norecursedirs =
|
||||||
|
dist
|
||||||
|
build
|
||||||
|
.tox
|
||||||
|
testpaths = tests
|
||||||
|
# Use pytest markers to select/deselect specific tests
|
||||||
|
# markers =
|
||||||
|
# slow: mark tests as slow (deselect with '-m "not slow"')
|
||||||
|
# system: mark end-to-end system tests
|
||||||
|
|
||||||
|
[devpi:upload]
|
||||||
|
# Options for the devpi: PyPI server and packaging tool
|
||||||
|
# VCS export must be deactivated since we are using setuptools-scm
|
||||||
|
no_vcs = 1
|
||||||
|
formats = bdist_wheel
|
||||||
|
|
||||||
|
[flake8]
|
||||||
|
# Some sane defaults for the code style checker flake8
|
||||||
|
max_line_length = 88
|
||||||
|
extend_ignore = E203, W503
|
||||||
|
# ^ Black-compatible
|
||||||
|
# E203 and W503 have edge cases handled by black
|
||||||
|
exclude =
|
||||||
|
.tox
|
||||||
|
build
|
||||||
|
dist
|
||||||
|
.eggs
|
||||||
|
docs/conf.py
|
||||||
|
|
||||||
|
[pyscaffold]
|
||||||
|
# PyScaffold's parameters when the project was created.
|
||||||
|
# This will be used when updating. Do not change!
|
||||||
|
version = 4.6
|
||||||
|
package = meshctrl
|
||||||
|
extensions =
|
||||||
|
no_skeleton
|
||||||
22
setup.py
Normal file
22
setup.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
"""
|
||||||
|
Setup file for meshctrl.
|
||||||
|
Use setup.cfg to configure your project.
|
||||||
|
|
||||||
|
This file was generated with PyScaffold 4.6.
|
||||||
|
PyScaffold helps you to put up the scaffold of your new Python project.
|
||||||
|
Learn more under: https://pyscaffold.org/
|
||||||
|
"""
|
||||||
|
|
||||||
|
from setuptools import setup
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
try:
|
||||||
|
setup(use_scm_version={"version_scheme": "no-guess-dev"})
|
||||||
|
except: # noqa
|
||||||
|
print(
|
||||||
|
"\n\nAn error occurred while building the project, "
|
||||||
|
"please ensure you have the most updated version of setuptools, "
|
||||||
|
"setuptools_scm and wheel with:\n"
|
||||||
|
" pip install -U setuptools setuptools_scm wheel\n\n"
|
||||||
|
)
|
||||||
|
raise
|
||||||
@@ -1 +1,16 @@
|
|||||||
from .session import Session
|
import sys
|
||||||
|
|
||||||
|
if sys.version_info[:2] >= (3, 8):
|
||||||
|
# TODO: Import directly (no need for conditional) when `python_requires = >= 3.8`
|
||||||
|
from importlib.metadata import PackageNotFoundError, version # pragma: no cover
|
||||||
|
else:
|
||||||
|
from importlib_metadata import PackageNotFoundError, version # pragma: no cover
|
||||||
|
|
||||||
|
try:
|
||||||
|
# Change here if project is renamed and does not equal the package name
|
||||||
|
dist_name = "meshctrl"
|
||||||
|
__version__ = version(dist_name)
|
||||||
|
except PackageNotFoundError: # pragma: no cover
|
||||||
|
__version__ = "unknown"
|
||||||
|
finally:
|
||||||
|
del version, PackageNotFoundError
|
||||||
|
|||||||
@@ -1,45 +1,87 @@
|
|||||||
import enum
|
import enum
|
||||||
|
try:
|
||||||
|
from enum_tools.documentation import document_enum
|
||||||
|
except:
|
||||||
|
def document_enum(cls, *args, **kwargs):
|
||||||
|
return cls
|
||||||
|
|
||||||
|
@document_enum
|
||||||
class UserRights(enum.IntFlag):
|
class UserRights(enum.IntFlag):
|
||||||
|
"""
|
||||||
|
Bitwise flags for user rights
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
#: Give user no rights
|
||||||
norights = 0
|
norights = 0
|
||||||
|
#: Allow backup of mesh database
|
||||||
backup = enum.auto()
|
backup = enum.auto()
|
||||||
|
#: User can add or remove users
|
||||||
manageusers = enum.auto()
|
manageusers = enum.auto()
|
||||||
|
#: User can restore the database from a backup
|
||||||
restore = enum.auto()
|
restore = enum.auto()
|
||||||
|
#: User can upload files to server storage
|
||||||
fileaccess = enum.auto()
|
fileaccess = enum.auto()
|
||||||
|
#: User can update server version
|
||||||
update = enum.auto()
|
update = enum.auto()
|
||||||
|
#: User is disabled
|
||||||
locked = enum.auto()
|
locked = enum.auto()
|
||||||
nonewgroups = enum.auto()
|
#: User cannot create new meshes
|
||||||
notools = enum.auto()
|
nonewgroups = enum.auto() #
|
||||||
usergroups = enum.auto()
|
notools = enum.auto() #
|
||||||
|
#: User can create user groups
|
||||||
|
usergroups = enum.auto() #
|
||||||
|
#: User can record desktop sessions
|
||||||
recordings = enum.auto()
|
recordings = enum.auto()
|
||||||
locksettings = enum.auto()
|
locksettings = enum.auto()
|
||||||
fullrights = backup|manageusers|restore|fileaccess|\
|
#: User has full rights
|
||||||
update|locked|nonewgroups|notools|usergroups|\
|
fullrights = backup|manageusers|restore|fileaccess|update|locked|nonewgroups|notools|usergroups|recordings|locksettings
|
||||||
recordings|locksettings
|
|
||||||
|
|
||||||
|
@document_enum
|
||||||
class MeshRights(enum.IntFlag):
|
class MeshRights(enum.IntFlag):
|
||||||
|
"""
|
||||||
|
Bitwise flags for mesh rights
|
||||||
|
Pulls double duty as rights for a connected device
|
||||||
|
"""
|
||||||
|
#: Give user no rights
|
||||||
norights = 0
|
norights = 0
|
||||||
|
#: Edit the group
|
||||||
editgroup = enum.auto()
|
editgroup = enum.auto()
|
||||||
|
#: Add/remove users
|
||||||
manageusers = enum.auto()
|
manageusers = enum.auto()
|
||||||
|
#: Add/remove devices
|
||||||
managedevices = enum.auto()
|
managedevices = enum.auto()
|
||||||
|
#: Remote control access
|
||||||
remotecontrol = enum.auto()
|
remotecontrol = enum.auto()
|
||||||
|
#: Agent console access
|
||||||
agentconsole = enum.auto()
|
agentconsole = enum.auto()
|
||||||
serverfiles = enum.auto()
|
serverfiles = enum.auto()
|
||||||
|
#: Wake device from sleep
|
||||||
wakedevices = enum.auto()
|
wakedevices = enum.auto()
|
||||||
|
#: Add notes to the device/mesh
|
||||||
notes = enum.auto()
|
notes = enum.auto()
|
||||||
|
#: Only view the desktop; no control
|
||||||
desktopviewonly = enum.auto()
|
desktopviewonly = enum.auto()
|
||||||
|
#: No terminal access
|
||||||
noterminal = enum.auto()
|
noterminal = enum.auto()
|
||||||
|
#: No file access
|
||||||
nofiles = enum.auto()
|
nofiles = enum.auto()
|
||||||
|
#: No AMT access
|
||||||
noamt = enum.auto()
|
noamt = enum.auto()
|
||||||
limiteddesktop = enum.auto()
|
limiteddesktop = enum.auto()
|
||||||
limitedevents = enum.auto()
|
limitedevents = enum.auto()
|
||||||
chatnotify = enum.auto()
|
chatnotify = enum.auto()
|
||||||
uninstall = enum.auto()
|
uninstall = enum.auto()
|
||||||
|
#: Disable remote desktop
|
||||||
noremotedesktop = enum.auto()
|
noremotedesktop = enum.auto()
|
||||||
|
#: Allow to send commands to the device
|
||||||
remotecommands = enum.auto()
|
remotecommands = enum.auto()
|
||||||
|
#: Reset or poweroff device
|
||||||
resetpoweroff = enum.auto()
|
resetpoweroff = enum.auto()
|
||||||
|
#: All rights
|
||||||
fullrights = 0xFFFFFFFF
|
fullrights = 0xFFFFFFFF
|
||||||
|
|
||||||
|
@document_enum
|
||||||
class ConsentFlags(enum.IntFlag):
|
class ConsentFlags(enum.IntFlag):
|
||||||
none = 0
|
none = 0
|
||||||
desktopnotify = enum.auto()
|
desktopnotify = enum.auto()
|
||||||
@@ -49,9 +91,9 @@ class ConsentFlags(enum.IntFlag):
|
|||||||
terminalprompt = enum.auto()
|
terminalprompt = enum.auto()
|
||||||
filesprompt = enum.auto()
|
filesprompt = enum.auto()
|
||||||
desktopprivacybar = enum.auto()
|
desktopprivacybar = enum.auto()
|
||||||
all = desktopnotify|terminalnotify|filesnotify|desktopprompt|terminalprompt|\
|
all = desktopnotify|terminalnotify|filesnotify|desktopprompt|terminalprompt|filesprompt|filesprompt
|
||||||
filesprompt|filesprompt
|
|
||||||
|
|
||||||
|
@document_enum
|
||||||
class MeshFeatures(enum.IntFlag):
|
class MeshFeatures(enum.IntFlag):
|
||||||
none = 0
|
none = 0
|
||||||
autoremove = enum.auto()
|
autoremove = enum.auto()
|
||||||
@@ -59,15 +101,27 @@ class MeshFeatures(enum.IntFlag):
|
|||||||
recordsessions = enum.auto()
|
recordsessions = enum.auto()
|
||||||
all = autoremove|hostnamesync|recordsessions
|
all = autoremove|hostnamesync|recordsessions
|
||||||
|
|
||||||
|
@document_enum
|
||||||
class SharingType(enum.StrEnum):
|
class SharingType(enum.StrEnum):
|
||||||
|
"""
|
||||||
|
String constants used to determine which type of device share to create
|
||||||
|
"""
|
||||||
desktop = enum.auto()
|
desktop = enum.auto()
|
||||||
terminal = enum.auto()
|
terminal = enum.auto()
|
||||||
|
|
||||||
|
@document_enum
|
||||||
class SharingTypeInt(enum.IntEnum):
|
class SharingTypeInt(enum.IntEnum):
|
||||||
|
"""
|
||||||
|
Internal enum used to map SHARINGTYPE to the number used by MeshCentral
|
||||||
|
"""
|
||||||
desktop = enum.auto()
|
desktop = enum.auto()
|
||||||
terminal = enum.auto()
|
terminal = enum.auto()
|
||||||
|
|
||||||
|
@document_enum
|
||||||
class Icon(enum.IntEnum):
|
class Icon(enum.IntEnum):
|
||||||
|
"""
|
||||||
|
Which icon to use for a device
|
||||||
|
"""
|
||||||
desktop = enum.auto()
|
desktop = enum.auto()
|
||||||
laptop = enum.auto()
|
laptop = enum.auto()
|
||||||
phone = enum.auto()
|
phone = enum.auto()
|
||||||
|
|||||||
@@ -1,21 +1,17 @@
|
|||||||
class MeshCtrlError(Exception):
|
class MeshCtrlError(Exception):
|
||||||
|
"""
|
||||||
|
Base class for Meshctrl errors
|
||||||
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# /** Represents an error thrown from the server
|
|
||||||
# * @extends Error
|
|
||||||
# */
|
|
||||||
class ServerError(MeshCtrlError):
|
class ServerError(MeshCtrlError):
|
||||||
|
"""
|
||||||
|
Represents an error thrown from the server
|
||||||
|
"""
|
||||||
pass
|
pass
|
||||||
|
|
||||||
# /** Represents an error in the websocket
|
|
||||||
# * @extends Error
|
|
||||||
# */
|
|
||||||
|
|
||||||
class SocketError(MeshCtrlError):
|
class SocketError(MeshCtrlError):
|
||||||
pass
|
"""
|
||||||
|
Represents an error in the websocket
|
||||||
# /** Represents that a command timed out
|
"""
|
||||||
# * @extends Error
|
|
||||||
# */
|
|
||||||
class TimeoutError(MeshCtrlError):
|
|
||||||
pass
|
pass
|
||||||
4
src/meshctrl/files.py
Normal file
4
src/meshctrl/files.py
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
from . import tunnel
|
||||||
|
|
||||||
|
class Files(tunnel.Tunnel):
|
||||||
|
pass
|
||||||
File diff suppressed because it is too large
Load Diff
7
src/meshctrl/shell.py
Normal file
7
src/meshctrl/shell.py
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
from . import tunnel
|
||||||
|
|
||||||
|
class Shell(tunnel.Tunnel):
|
||||||
|
pass
|
||||||
|
|
||||||
|
class SmartShell(tunnel.Tunnel):
|
||||||
|
pass
|
||||||
2
src/meshctrl/tunnel.py
Normal file
2
src/meshctrl/tunnel.py
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
class Tunnel(object):
|
||||||
|
pass
|
||||||
@@ -4,7 +4,7 @@ from cryptography.hazmat.primitives.ciphers.aead import AESGCM
|
|||||||
import json
|
import json
|
||||||
import base64
|
import base64
|
||||||
|
|
||||||
def encode_cookie(o, key):
|
def _encode_cookie(o, key):
|
||||||
o["time"] = int(time.time()); # Add the cookie creation time
|
o["time"] = int(time.time()); # Add the cookie creation time
|
||||||
iv = secrets.token_bytes(12)
|
iv = secrets.token_bytes(12)
|
||||||
key = AESGCM(key)
|
key = AESGCM(key)
|
||||||
@@ -12,17 +12,41 @@ def encode_cookie(o, key):
|
|||||||
return base64.b64encode(crypted).replace("+", '@').replace("/", '$');
|
return base64.b64encode(crypted).replace("+", '@').replace("/", '$');
|
||||||
|
|
||||||
class Eventer(object):
|
class Eventer(object):
|
||||||
|
"""
|
||||||
|
Eventer object to allow pub/sub interactions with a Session object
|
||||||
|
"""
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self._ons = {}
|
self._ons = {}
|
||||||
self._onces = {}
|
self._onces = {}
|
||||||
|
|
||||||
def on(self, event, func):
|
def on(self, event, func):
|
||||||
|
"""
|
||||||
|
Subscribe to `event`. `func` will be called when that event is emitted.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
event (str): Event name to subscribe to
|
||||||
|
func (function(data: object)): Function to call when event is emitted. `data` could be of any type. Also used as a key to remove this subscription.
|
||||||
|
"""
|
||||||
self._ons.setdefault(event, set()).add(func)
|
self._ons.setdefault(event, set()).add(func)
|
||||||
|
|
||||||
def once(self, event, func):
|
def once(self, event, func):
|
||||||
|
"""
|
||||||
|
Subscribe to `event` once. `func` will be called when that event is emitted. The binding will then be removed.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
event (str): Event name to subscribe to
|
||||||
|
func (function(data: object)): Function to call when event is emitted. `data` could be of any type. Also used as a key to remove this subscription.
|
||||||
|
"""
|
||||||
self._onces.setdefault(event, set()).add(func)
|
self._onces.setdefault(event, set()).add(func)
|
||||||
|
|
||||||
def off(self, event, func):
|
def off(self, event, func):
|
||||||
|
"""
|
||||||
|
Unsubscribe from `event`. `func` is the object originally passed during the bind.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
event (str): Event name to unsubscribe from
|
||||||
|
func (object): Function which was originally passed when subscribing.
|
||||||
|
"""
|
||||||
try:
|
try:
|
||||||
self._onces.setdefault(event, set()).remove(func)
|
self._onces.setdefault(event, set()).remove(func)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@@ -33,6 +57,13 @@ class Eventer(object):
|
|||||||
pass
|
pass
|
||||||
|
|
||||||
def emit(self, event, data):
|
def emit(self, event, data):
|
||||||
|
"""
|
||||||
|
Emit `event` with `data`. All subscribed functions will be called (order is nonsensical).
|
||||||
|
|
||||||
|
Args:
|
||||||
|
event (str): Event name emit
|
||||||
|
data (object): Data to pass to all the bound functions
|
||||||
|
"""
|
||||||
for f in self._onces.get(event, []):
|
for f in self._onces.get(event, []):
|
||||||
f(data)
|
f(data)
|
||||||
try:
|
try:
|
||||||
|
|||||||
10
tests/conftest.py
Normal file
10
tests/conftest.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
"""
|
||||||
|
Dummy conftest.py for meshctrl.
|
||||||
|
|
||||||
|
If you don't know what this is for, just leave it empty.
|
||||||
|
Read more about conftest.py under:
|
||||||
|
- https://docs.pytest.org/en/stable/fixture.html
|
||||||
|
- https://docs.pytest.org/en/stable/writing_plugins.html
|
||||||
|
"""
|
||||||
|
|
||||||
|
# import pytest
|
||||||
93
tox.ini
Normal file
93
tox.ini
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
# Tox configuration file
|
||||||
|
# Read more under https://tox.wiki/
|
||||||
|
# THIS SCRIPT IS SUPPOSED TO BE AN EXAMPLE. MODIFY IT ACCORDING TO YOUR NEEDS!
|
||||||
|
|
||||||
|
[tox]
|
||||||
|
minversion = 3.24
|
||||||
|
envlist = default
|
||||||
|
isolated_build = True
|
||||||
|
|
||||||
|
|
||||||
|
[testenv]
|
||||||
|
description = Invoke pytest to run automated tests
|
||||||
|
setenv =
|
||||||
|
TOXINIDIR = {toxinidir}
|
||||||
|
passenv =
|
||||||
|
HOME
|
||||||
|
SETUPTOOLS_*
|
||||||
|
extras =
|
||||||
|
testing
|
||||||
|
commands =
|
||||||
|
pytest {posargs}
|
||||||
|
|
||||||
|
|
||||||
|
# # To run `tox -e lint` you need to make sure you have a
|
||||||
|
# # `.pre-commit-config.yaml` file. See https://pre-commit.com
|
||||||
|
# [testenv:lint]
|
||||||
|
# description = Perform static analysis and style checks
|
||||||
|
# skip_install = True
|
||||||
|
# deps = pre-commit
|
||||||
|
# passenv =
|
||||||
|
# HOMEPATH
|
||||||
|
# PROGRAMDATA
|
||||||
|
# SETUPTOOLS_*
|
||||||
|
# commands =
|
||||||
|
# pre-commit run --all-files {posargs:--show-diff-on-failure}
|
||||||
|
|
||||||
|
|
||||||
|
[testenv:{build,clean}]
|
||||||
|
description =
|
||||||
|
build: Build the package in isolation according to PEP517, see https://github.com/pypa/build
|
||||||
|
clean: Remove old distribution files and temporary build artifacts (./build and ./dist)
|
||||||
|
# https://setuptools.pypa.io/en/stable/build_meta.html#how-to-use-it
|
||||||
|
skip_install = True
|
||||||
|
changedir = {toxinidir}
|
||||||
|
deps =
|
||||||
|
build: build[virtualenv]
|
||||||
|
passenv =
|
||||||
|
SETUPTOOLS_*
|
||||||
|
commands =
|
||||||
|
clean: python -c 'import shutil; [shutil.rmtree(p, True) for p in ("build", "dist", "docs/_build")]'
|
||||||
|
clean: python -c 'import pathlib, shutil; [shutil.rmtree(p, True) for p in pathlib.Path("src").glob("*.egg-info")]'
|
||||||
|
build: python -m build {posargs}
|
||||||
|
# By default, both `sdist` and `wheel` are built. If your sdist is too big or you don't want
|
||||||
|
# to make it available, consider running: `tox -e build -- --wheel`
|
||||||
|
|
||||||
|
|
||||||
|
[testenv:{docs,doctests,linkcheck}]
|
||||||
|
description =
|
||||||
|
docs: Invoke sphinx-build to build the docs
|
||||||
|
doctests: Invoke sphinx-build to run doctests
|
||||||
|
linkcheck: Check for broken links in the documentation
|
||||||
|
passenv =
|
||||||
|
SETUPTOOLS_*
|
||||||
|
setenv =
|
||||||
|
DOCSDIR = {toxinidir}/docs
|
||||||
|
BUILDDIR = {toxinidir}/docs/_build
|
||||||
|
docs: BUILD = html
|
||||||
|
doctests: BUILD = doctest
|
||||||
|
linkcheck: BUILD = linkcheck
|
||||||
|
deps =
|
||||||
|
-r {toxinidir}/docs/requirements.txt
|
||||||
|
# ^ requirements.txt shared with Read The Docs
|
||||||
|
commands =
|
||||||
|
sphinx-build --color -b {env:BUILD} -d "{env:BUILDDIR}/doctrees" "{env:DOCSDIR}" "{env:BUILDDIR}/{env:BUILD}" {posargs}
|
||||||
|
|
||||||
|
|
||||||
|
[testenv:publish]
|
||||||
|
description =
|
||||||
|
Publish the package you have been developing to a package index server.
|
||||||
|
By default, it uses testpypi. If you really want to publish your package
|
||||||
|
to be publicly accessible in PyPI, use the `-- --repository pypi` option.
|
||||||
|
skip_install = True
|
||||||
|
changedir = {toxinidir}
|
||||||
|
passenv =
|
||||||
|
# See: https://twine.readthedocs.io/en/latest/
|
||||||
|
TWINE_USERNAME
|
||||||
|
TWINE_PASSWORD
|
||||||
|
TWINE_REPOSITORY
|
||||||
|
TWINE_REPOSITORY_URL
|
||||||
|
deps = twine
|
||||||
|
commands =
|
||||||
|
python -m twine check dist/*
|
||||||
|
python -m twine upload {posargs:--repository {env:TWINE_REPOSITORY:testpypi}} dist/*
|
||||||
Reference in New Issue
Block a user