Compare commits

..

No commits in common. "main" and "misc-updates" have entirely different histories.

23 changed files with 404 additions and 377 deletions

View file

@ -1,13 +0,0 @@
# SPDX-FileCopyrightText: 2021 Adafruit Industries
#
# SPDX-License-Identifier: MIT
Thank you for contributing! Before you submit a pull request, please read the following.
Make sure any changes you're submitting are in line with the CircuitPython Design Guide, available here: https://docs.circuitpython.org/en/latest/docs/design_guide.html
If your changes are to documentation, please verify that the documentation builds locally by following the steps found here: https://adafru.it/build-docs
Before submitting the pull request, make sure you've run Pylint and Black locally on your code. You can do this manually or using pre-commit. Instructions are available here: https://adafru.it/check-your-code
Please remove all of this text before submitting. Include an explanation or list of changes included in your PR, as well as, if applicable, a link to any related issues.

View file

@ -8,9 +8,90 @@ on: [pull_request, push]
jobs: jobs:
test: test:
runs-on: ubuntu-latest runs-on: ubuntu-20.04
steps: steps:
- name: Run Build CI workflow - name: Dump GitHub context
uses: adafruit/workflows-circuitpython-libs/build@main env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- name: Translate Repo Name For Build Tools filename_prefix
id: repo-name
run: |
echo ::set-output name=repo-name::$(
echo ${{ github.repository }} |
awk -F '\/' '{ print tolower($2) }' |
tr '_' '-'
)
- name: Set up Python 3.7
uses: actions/setup-python@v1
with: with:
package-prefix: jepler_udecimal python-version: 3.7
- name: Versions
run: |
python3 --version
- name: Checkout Current Repo
uses: actions/checkout@v1
with:
submodules: true
- name: Checkout tools repo
uses: actions/checkout@v2
with:
repository: adafruit/actions-ci-circuitpython-libs
path: actions-ci
- name: Install dependencies
# (e.g. - apt-get: gettext, etc; pip: circuitpython-build-tools, requirements.txt; etc.)
run: |
source actions-ci/install.sh
- name: Pip install pylint, Sphinx, pre-commit
run: |
pip install --force-reinstall pylint Sphinx sphinx-rtd-theme pre-commit sphinx-autoapi
- name: Library version
run: git describe --dirty --always --tags
- name: Pre-commit hooks
run: |
pre-commit run --all-files
- name: PyLint
run: |
pylint $( find . -path './jepler*.py' )
([[ ! -d "examples" ]] || pylint --disable=missing-docstring,invalid-name,bad-whitespace $( find . -path "./examples/*.py" ))
- name: Clone and build circuitpython unix port
run: |
set -e
[ -e circuitpython/py/py.mk ] || git clone --depth=1 https://github.com/adafruit/circuitpython
[ -e circuitpython/lib/libffi/autogen.sh ] || (cd circuitpython && git submodule update --init lib/libffi lib/axtls lib/berkeley-db-1.xx tools/huffman lib/uzlib extmod/ulab)
[ -x circuitpython/ports/unix/micropython ] || (
make -C circuitpython/mpy-cross -j$(nproc)
make -C circuitpython/ports/unix -j$(nproc) deplibs
make -C circuitpython/ports/unix -j$(nproc) DEBUG=1 STRIP=:
)
- name: Unit Test
run: |
python -m jepler_udecimal.test
if ! env MICROPYPATH=. PYTHONPATH=. MICROPY_MICROPYTHON=circuitpython/ports/unix/micropython circuitpython/tests/run-tests -d examples; then
for exp in *.exp; do
testbase=$(basename $exp .exp);
echo -e "\nFAILURE $testbase";
diff -u $testbase.exp $testbase.out;
done
fi
- name: Build assets
run: circuitpython-build-bundles --package_folder_prefix jepler --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location .
- name: Build docs
working-directory: docs
run: sphinx-build -E -W -b html . _build/html
- name: Archive bundles
uses: actions/upload-artifact@v2
with:
name: bundles
path: ${{ github.workspace }}/bundles/
- name: Check For setup.py
id: need-pypi
run: |
echo ::set-output name=setup-py::$( find . -wholename './setup.py' )
- name: Build Python package
if: contains(steps.need-pypi.outputs.setup-py, 'setup.py')
run: |
pip install --upgrade setuptools wheel twine readme_renderer testresources
python setup.py sdist
python setup.py bdist_wheel --universal
twine check dist/*

View file

@ -1,19 +0,0 @@
# SPDX-FileCopyrightText: 2021 Scott Shawcroft for Adafruit Industries
#
# SPDX-License-Identifier: MIT
name: Failure help text
on:
workflow_run:
workflows: ["Build CI"]
types:
- completed
jobs:
post-help:
runs-on: ubuntu-latest
if: ${{ github.event.workflow_run.conclusion == 'failure' && github.event.workflow_run.event == 'pull_request' }}
steps:
- name: Post comment to help
uses: adafruit/circuitpython-action-library-ci-failed@v1

85
.github/workflows/release.yml vendored Normal file
View file

@ -0,0 +1,85 @@
# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
#
# SPDX-License-Identifier: MIT
name: Release Actions
on:
release:
types: [published]
jobs:
upload-release-assets:
runs-on: ubuntu-20.04
steps:
- name: Dump GitHub context
env:
GITHUB_CONTEXT: ${{ toJson(github) }}
run: echo "$GITHUB_CONTEXT"
- name: Translate Repo Name For Build Tools filename_prefix
id: repo-name
run: |
echo ::set-output name=repo-name::$(
echo ${{ github.repository }} |
awk -F '\/' '{ print tolower($2) }' |
tr '_' '-'
)
- name: Set up Python 3.7
uses: actions/setup-python@v1
with:
python-version: 3.7
- name: Versions
run: |
python3 --version
- name: Checkout Current Repo
uses: actions/checkout@v1
with:
submodules: true
- name: Checkout tools repo
uses: actions/checkout@v2
with:
repository: adafruit/actions-ci-circuitpython-libs
path: actions-ci
- name: Install deps
run: |
source actions-ci/install.sh
- name: Build assets
run: circuitpython-build-bundles --package_folder_prefix jepler --filename_prefix ${{ steps.repo-name.outputs.repo-name }} --library_location .
- name: Upload Release Assets
# the 'official' actions version does not yet support dynamically
# supplying asset names to upload. @csexton's version chosen based on
# discussion in the issue below, as its the simplest to implement and
# allows for selecting files with a pattern.
# https://github.com/actions/upload-release-asset/issues/4
#uses: actions/upload-release-asset@v1.0.1
uses: csexton/release-asset-action@master
with:
pattern: "bundles/*"
github-token: ${{ secrets.GITHUB_TOKEN }}
upload-pypi:
runs-on: ubuntu-20.04
steps:
- uses: actions/checkout@v1
- name: Check For setup.py
id: need-pypi
run: |
echo ::set-output name=setup-py::$( find . -wholename './setup.py' )
- name: Set up Python
if: contains(steps.need-pypi.outputs.setup-py, 'setup.py')
uses: actions/setup-python@v1
with:
python-version: '3.x'
- name: Install dependencies
if: contains(steps.need-pypi.outputs.setup-py, 'setup.py')
run: |
python -m pip install --upgrade pip
pip install setuptools wheel twine
- name: Build and publish
if: contains(steps.need-pypi.outputs.setup-py, 'setup.py')
env:
TWINE_USERNAME: __token__
TWINE_PASSWORD: ${{ secrets.pypi_token }}
run: |
python setup.py sdist
twine upload dist/*

View file

@ -1,20 +0,0 @@
# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
#
# SPDX-License-Identifier: MIT
name: GitHub Release Actions
on:
release:
types: [published]
jobs:
upload-release-assets:
runs-on: ubuntu-latest
steps:
- name: Run GitHub Release CI workflow
uses: adafruit/workflows-circuitpython-libs/release-gh@main
with:
github-token: ${{ secrets.GITHUB_TOKEN }}
upload-url: ${{ github.event.release.upload_url }}
package-prefix: jepler_udecimal

View file

@ -1,19 +0,0 @@
# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
#
# SPDX-License-Identifier: MIT
name: PyPI Release Actions
on:
release:
types: [published]
jobs:
upload-release-assets:
runs-on: ubuntu-latest
steps:
- name: Run PyPI Release CI workflow
uses: adafruit/workflows-circuitpython-libs/release-pypi@main
with:
pypi-username: __token__
pypi-password: ${{ secrets.pypi_token }}

1
.gitignore vendored
View file

@ -20,4 +20,3 @@ docs/api
circuitpython circuitpython
/*.exp /*.exp
/*.out /*.out
*/__version__.py

View file

@ -3,44 +3,17 @@
# SPDX-License-Identifier: Unlicense # SPDX-License-Identifier: Unlicense
repos: repos:
- repo: https://github.com/psf/black - repo: https://github.com/python/black
rev: 25.1.0 rev: 19.10b0
hooks: hooks:
- id: black - id: black
- repo: https://github.com/fsfe/reuse-tool - repo: https://github.com/fsfe/reuse-tool
rev: v5.0.2 rev: v0.12.1
hooks: hooks:
- id: reuse - id: reuse
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v5.0.0 rev: v2.3.0
hooks: hooks:
- id: check-yaml - id: check-yaml
- id: end-of-file-fixer - id: end-of-file-fixer
- id: trailing-whitespace - id: trailing-whitespace
- repo: https://github.com/pycqa/pylint
rev: v3.3.4
hooks:
- id: pylint
name: lint (examples)
types: [python]
files: ^examples/
args:
- --disable=missing-docstring,invalid-name
- id: pylint
name: lint (code)
types: [python]
exclude: "^(docs/|examples/|setup.py$)"
- repo: local
hooks:
- id: mypy
name: mypy
entry: "mypy --no-warn-unused-ignores jepler_udecimal"
language: python
additional_dependencies: ["mypy==0.910"]
types: [python]
# use require_serial so that script
# is only called once per commit
require_serial: true
# Print the number of files as a sanity-check
verbose: true
pass_filenames: false

View file

@ -56,7 +56,7 @@ confidence=
# no Warning level messages displayed, use"--disable=all --enable=classes # no Warning level messages displayed, use"--disable=all --enable=classes
# --disable=W" # --disable=W"
# disable=import-error,print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call # disable=import-error,print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call
disable=raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,import-error,consider-using-f-string,unnecessary-dunder-call disable=print-statement,parameter-unpacking,unpacking-in-except,old-raise-syntax,backtick,long-suffix,old-ne-operator,old-octal-literal,import-star-module-level,raw-checker-failed,bad-inline-option,locally-disabled,locally-enabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,apply-builtin,basestring-builtin,buffer-builtin,cmp-builtin,coerce-builtin,execfile-builtin,file-builtin,long-builtin,raw_input-builtin,reduce-builtin,standarderror-builtin,unicode-builtin,xrange-builtin,coerce-method,delslice-method,getslice-method,setslice-method,no-absolute-import,old-division,dict-iter-method,dict-view-method,next-method-called,metaclass-assignment,indexing-exception,raising-string,reload-builtin,oct-method,hex-method,nonzero-method,cmp-method,input-builtin,round-builtin,intern-builtin,unichr-builtin,map-builtin-not-iterating,zip-builtin-not-iterating,range-builtin-not-iterating,filter-builtin-not-iterating,using-cmp-argument,eq-without-hash,div-method,idiv-method,rdiv-method,exception-message-attribute,invalid-str-codec,sys-max-int,bad-python3-import,deprecated-string-function,deprecated-str-translate-call,import-error,bad-continuation
# Enable the message, report, category or checker with the given id(s). You can # Enable the message, report, category or checker with the given id(s). You can
# either give multiple identifier separated by comma (,) or put this option # either give multiple identifier separated by comma (,) or put this option
@ -226,6 +226,12 @@ max-line-length=100
# Maximum number of lines in a module # Maximum number of lines in a module
max-module-lines=1000 max-module-lines=1000
# List of optional constructs for which whitespace checking is disabled. `dict-
# separator` is used to allow tabulation in dicts, etc.: {1 : 1,\n222: 2}.
# `trailing-comma` allows a space between comma and closing bracket: (a, ).
# `empty-line` allows space-only lines.
no-space-check=trailing-comma,dict-separator
# Allow the body of a class to be on the same line as the declaration if body # Allow the body of a class to be on the same line as the declaration if body
# contains single statement. # contains single statement.
single-line-class-stmt=no single-line-class-stmt=no
@ -252,22 +258,38 @@ min-similarity-lines=4
[BASIC] [BASIC]
# Naming hint for argument names
argument-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct argument names # Regular expression matching correct argument names
argument-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ argument-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Naming hint for attribute names
attr-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct attribute names # Regular expression matching correct attribute names
attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ attr-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Bad variable names which should always be refused, separated by a comma # Bad variable names which should always be refused, separated by a comma
bad-names=foo,bar,baz,toto,tutu,tata bad-names=foo,bar,baz,toto,tutu,tata
# Naming hint for class attribute names
class-attribute-name-hint=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
# Regular expression matching correct class attribute names # Regular expression matching correct class attribute names
class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$ class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
# Naming hint for class names
# class-name-hint=[A-Z_][a-zA-Z0-9]+$
class-name-hint=[A-Z_][a-zA-Z0-9_]+$
# Regular expression matching correct class names # Regular expression matching correct class names
# class-rgx=[A-Z_][a-zA-Z0-9]+$ # class-rgx=[A-Z_][a-zA-Z0-9]+$
class-rgx=[A-Z_][a-zA-Z0-9_]+$ class-rgx=[A-Z_][a-zA-Z0-9_]+$
# Naming hint for constant names
const-name-hint=(([A-Z_][A-Z0-9_]*)|(__.*__))$
# Regular expression matching correct constant names # Regular expression matching correct constant names
const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$ const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
@ -275,6 +297,9 @@ const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
# ones are exempt. # ones are exempt.
docstring-min-length=-1 docstring-min-length=-1
# Naming hint for function names
function-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct function names # Regular expression matching correct function names
function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
@ -285,12 +310,21 @@ good-names=r,g,b,w,i,j,k,n,x,y,z,ex,ok,Run,_
# Include a hint for the correct naming format with invalid-name # Include a hint for the correct naming format with invalid-name
include-naming-hint=no include-naming-hint=no
# Naming hint for inline iteration names
inlinevar-name-hint=[A-Za-z_][A-Za-z0-9_]*$
# Regular expression matching correct inline iteration names # Regular expression matching correct inline iteration names
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$ inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
# Naming hint for method names
method-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct method names # Regular expression matching correct method names
method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Naming hint for module names
module-name-hint=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
# Regular expression matching correct module names # Regular expression matching correct module names
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$ module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
@ -306,6 +340,9 @@ no-docstring-rgx=^_
# to this list to register other decorators that produce valid properties. # to this list to register other decorators that produce valid properties.
property-classes=abc.abstractproperty property-classes=abc.abstractproperty
# Naming hint for variable names
variable-name-hint=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct variable names # Regular expression matching correct variable names
variable-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$ variable-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
@ -391,3 +428,10 @@ max-statements=50
# Minimum number of public methods for a class (see R0903). # Minimum number of public methods for a class (see R0903).
min-public-methods=1 min-public-methods=1
[EXCEPTIONS]
# Exceptions that will emit a warning when being caught. Defaults to
# "Exception"
overgeneral-exceptions=Exception

View file

@ -1,19 +0,0 @@
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
#
# SPDX-License-Identifier: Unlicense
# Read the Docs configuration file
# See https://docs.readthedocs.io/en/stable/config-file/v2.html for details
# Required
version: 2
build:
os: ubuntu-20.04
tools:
python: "3"
python:
install:
- requirements: docs/requirements.txt
- requirements: requirements.txt

7
.readthedocs.yml Normal file
View file

@ -0,0 +1,7 @@
# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
#
# SPDX-License-Identifier: Unlicense
python:
version: 3
requirements_file: requirements.txt

View file

@ -17,10 +17,6 @@ Introduction
:target: https://github.com/psf/black :target: https://github.com/psf/black
:alt: Code Style: Black :alt: Code Style: Black
.. image:: https://results.pre-commit.ci/badge/github/jepler/Jepler_CircuitPython_udecimal/main.svg
:target: https://results.pre-commit.ci/latest/github/jepler/Jepler_CircuitPython_udecimal/main
:alt: pre-commit.ci status
Reduced version of the decimal library for CircuitPython Reduced version of the decimal library for CircuitPython

View file

@ -9,12 +9,17 @@ echo "=== Create and set up virtual environment"
. .env/bin/activate . .env/bin/activate
echo "=== Install requirements" echo "=== Install requirements"
pip3 install wheel pip3 install wheel
pip3 install -r requirements_dev.txt pip3 install -r requirements.txt
echo "=== Run pre-commit" echo "=== Run pre-commit"
pre-commit run --all-files pre-commit run --all-files
echo "=== Run pylint"
pylint jepler_udecimal
if [ -d examples ]; then
pylint --disable=missing-docstring,invalid-name,bad-whitespace examples
fi
echo "=== Clone and build circuitpython unix port" echo "=== Clone and build circuitpython unix port"
[ -e circuitpython/py/py.mk ] || git clone --shallow-since=2021-07-01 https://github.com/adafruit/circuitpython [ -e circuitpython/py/py.mk ] || git clone --depth=1 https://github.com/adafruit/circuitpython
[ -e circuitpython/lib/libffi/autogen.sh ] || (cd circuitpython && git submodule update --init lib/libffi lib/axtls lib/berkeley-db-1.xx tools/huffman lib/uzlib extmod/ulab) [ -e circuitpython/lib/libffi/autogen.sh ] || (cd circuitpython && git submodule update --init lib/libffi lib/axtls lib/berkeley-db-1.xx tools/huffman lib/uzlib extmod/ulab)
[ -x circuitpython/ports/unix/micropython ] || ( [ -x circuitpython/ports/unix/micropython ] || (
make -C circuitpython/mpy-cross -j$(nproc) make -C circuitpython/mpy-cross -j$(nproc)
@ -25,14 +30,12 @@ make -C circuitpython/ports/unix -j$(nproc) DEBUG=1 STRIP=:
echo "=== Run tests" echo "=== Run tests"
python -m jepler_udecimal.test python -m jepler_udecimal.test
run-tests () { if ! env MICROPYPATH=. PYTHONPATH=. MICROPY_MICROPYTHON=circuitpython/ports/unix/micropython circuitpython/tests/run-tests -d examples; then
env MICROPYPATH=. PYTHONPATH=. MICROPY_MICROPYTHON=circuitpython/ports/unix/micropython circuitpython/tests/run-tests.py "$@" for exp in *.exp; do
} testbase=$(basename $exp .exp);
echo -e "\nFAILURE $testbase";
run-tests --clean-failures diff -u $testbase.exp $testbase.out;
if ! run-tests -d examples; then done
run-tests --print-failures
exit 1
fi fi
PYTHONPATH=. python examples/test_udecimal.py > test_udecimal.exp PYTHONPATH=. python examples/test_udecimal.py > test_udecimal.exp

View file

@ -68,7 +68,7 @@ release = "1.0"
# #
# This is also used if you do content translation via gettext catalogs. # This is also used if you do content translation via gettext catalogs.
# Usually you set "language" from the command line for these cases. # Usually you set "language" from the command line for these cases.
language = "en" language = None
# List of patterns, relative to source directory, that match files and # List of patterns, relative to source directory, that match files and
# directories to ignore when looking for source files. # directories to ignore when looking for source files.
@ -109,6 +109,18 @@ napoleon_numpy_docstring = False
# #
on_rtd = os.environ.get("READTHEDOCS", None) == "True" on_rtd = os.environ.get("READTHEDOCS", None) == "True"
if not on_rtd: # only import and set the theme if we're building docs locally
try:
import sphinx_rtd_theme
html_theme = "sphinx_rtd_theme"
html_theme_path = [sphinx_rtd_theme.get_html_theme_path(), "."]
except:
html_theme = "default"
html_theme_path = ["."]
else:
html_theme_path = ["."]
# Add any paths that contain custom static files (such as style sheets) here, # 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, # relative to this directory. They are copied after the builtin static files,
# so a file named "default.css" will overwrite the builtin "default.css". # so a file named "default.css" will overwrite the builtin "default.css".

View file

@ -1,6 +0,0 @@
# SPDX-FileCopyrightText: 2021 Kattni Rembor for Adafruit Industries
#
# SPDX-License-Identifier: Unlicense
sphinx>=4.0.0
sphinx-autoapi

View file

@ -103,9 +103,3 @@ try:
except Exception as e: except Exception as e:
print("exception") print("exception")
print(Decimal("2").atan()) print(Decimal("2").atan())
print(Decimal("1").asin())
print(Decimal("-1").asin())
print(Decimal(".5").asin())
print(Decimal("1").acos())
print(Decimal("-1").acos())
print(Decimal(".5").asin())

View file

@ -1,69 +0,0 @@
# SPDX-FileCopyrightText: © 2004 Python Software Foundation. <https://www.python.org/psf/>
#
# SPDX-License-Identifier: Python-2.0
# All rights reserved.
# pylint: disable=redefined-builtin,too-many-arguments,too-many-locals
from jepler_udecimal import Decimal
def moneyfmt(
value, *, places=2, curr="", sep=",", dp=".", pos="", neg="-", trailneg=""
):
"""Convert Decimal to a money formatted string.
places: required number of places after the decimal point
curr: optional currency symbol before the sign (may be blank)
sep: optional grouping separator (comma, period, space, or blank)
dp: decimal point indicator (comma or period)
only specify as blank when places is zero
pos: optional sign for positive numbers: '+', space or blank
neg: optional sign for negative numbers: '-', '(', space or blank
trailneg:optional trailing minus indicator: '-', ')', space or blank
>>> d = Decimal('-1234567.8901')
>>> moneyfmt(d, curr='$')
'-$1,234,567.89'
>>> moneyfmt(d, places=0, sep='.', dp='', neg='', trailneg='-')
'1.234.568-'
>>> moneyfmt(d, curr='$', neg='(', trailneg=')')
'($1,234,567.89)'
>>> moneyfmt(Decimal(123456789), sep=' ')
'123 456 789.00'
>>> moneyfmt(Decimal('-0.02'), neg='<', trailneg='>')
'<0.02>'
"""
q = Decimal(10) ** -places # 2 places --> '0.01'
sign, digits, _ = value.quantize(q).as_tuple()
result = []
digits = list(map(str, digits))
build, next = result.append, digits.pop
if sign:
build(trailneg)
for i in range(places):
build(next() if digits else "0")
if places:
build(dp)
if not digits:
build("0")
i = 0
while digits:
build(next())
i += 1
if i == 3 and digits:
i = 0
build(sep)
build(curr)
build(neg if sign else pos)
return "".join(reversed(result))
if __name__ == "__main__":
d = Decimal("-1234567.8901")
print(moneyfmt(d, curr="$"))
print(moneyfmt(d, places=0, sep=".", dp="", neg="", trailneg="-"))
print(moneyfmt(d, curr="$", neg="(", trailneg=")"))
print(moneyfmt(Decimal(123456789), sep=" "))
print(moneyfmt(Decimal("-0.02"), neg="<", trailneg=">"))

View file

@ -13,7 +13,7 @@
# Adapted to CircuitPython by Jeff Epler <jepler@gmail.com> # Adapted to CircuitPython by Jeff Epler <jepler@gmail.com>
# #
# pylint: disable=line-too-long,superfluous-parens,too-many-lines,redefined-builtin,bare-except # pylint: disable=line-too-long,superfluous-parens,too-many-lines,redefined-builtin,bare-except
# pylint: disable=protected-access,invalid-name,self-cls-assignment,no-else-return,no-else-raise,too-many-public-methods,useless-object-inheritance,invalid-unary-operand-type,unused-argument,too-many-branches,too-many-return-statements,no-else-break,unused-variable,arguments-differ,missing-function-docstring,inconsistent-return-statements,global-statement,too-many-statements,attribute-defined-outside-init,consider-using-in,dangerous-default-value,using-constant-test,too-many-locals,too-many-arguments,keyword-arg-before-vararg # pylint: disable=protected-access,invalid-name,no-self-use,self-cls-assignment,no-else-return,no-else-raise,too-many-public-methods,useless-object-inheritance,invalid-unary-operand-type,unused-argument,too-many-branches,too-many-return-statements,no-else-break,unused-variable,arguments-differ,missing-function-docstring,inconsistent-return-statements,global-statement,too-many-statements,attribute-defined-outside-init,consider-using-in,dangerous-default-value,using-constant-test,too-many-locals,too-many-arguments,keyword-arg-before-vararg
""" """
Reduced version of the decimal library for CircuitPython. It runs on Reduced version of the decimal library for CircuitPython. It runs on
CircuitPython as well as standard Python, though you should probably CircuitPython as well as standard Python, though you should probably
@ -141,10 +141,7 @@ try:
DecimalTuple = _namedtuple("DecimalTuple", "sign digits exponent") DecimalTuple = _namedtuple("DecimalTuple", "sign digits exponent")
except ImportError: except ImportError:
DecimalTuple = lambda *args: args
def DecimalTuple(*args): # type: ignore
return args
# Rounding # Rounding
ROUND_DOWN = "ROUND_DOWN" ROUND_DOWN = "ROUND_DOWN"
@ -157,7 +154,7 @@ ROUND_HALF_DOWN = "ROUND_HALF_DOWN"
ROUND_05UP = "ROUND_05UP" ROUND_05UP = "ROUND_05UP"
try: try:
NotImplemented # pylint: disable=used-before-assignment NotImplemented
except NameError: except NameError:
NotImplemented = object() NotImplemented = object()
@ -172,6 +169,7 @@ if sys.implementation.name == "circuitpython":
else: else:
return m, (1 << (-e)) return m, (1 << (-e))
else: else:
_as_integer_ratio = float.as_integer_ratio _as_integer_ratio = float.as_integer_ratio
@ -694,7 +692,7 @@ class Decimal(object):
context = getcontext() context = getcontext()
context._raise_error( context._raise_error(
FloatOperation, FloatOperation,
"strict semantics for mixing floats and Decimals are enabled", "strict semantics for mixing floats and Decimals are " "enabled",
) )
value = Decimal.from_float(value) value = Decimal.from_float(value)
self._exp = value._exp self._exp = value._exp
@ -1798,16 +1796,16 @@ class Decimal(object):
else: else:
return -self._round_down(prec) return -self._round_down(prec)
_pick_rounding_function = { _pick_rounding_function = dict(
ROUND_DOWN: _round_down, ROUND_DOWN=_round_down,
ROUND_UP: _round_up, ROUND_UP=_round_up,
ROUND_HALF_UP: _round_half_up, ROUND_HALF_UP=_round_half_up,
ROUND_HALF_DOWN: _round_half_down, ROUND_HALF_DOWN=_round_half_down,
ROUND_HALF_EVEN: _round_half_even, ROUND_HALF_EVEN=_round_half_even,
ROUND_CEILING: _round_ceiling, ROUND_CEILING=_round_ceiling,
ROUND_FLOOR: _round_floor, ROUND_FLOOR=_round_floor,
ROUND_05UP: _round_05up, ROUND_05UP=_round_05up,
} )
def __round__(self, n=None): def __round__(self, n=None):
"""Round self to the nearest integer, or to a given precision. """Round self to the nearest integer, or to a given precision.
@ -3357,7 +3355,7 @@ class Context(object):
:param bool clamp: If true, change exponents if too high :param bool clamp: If true, change exponents if too high
""" """
def __init__( # pylint: disable=too-many-positional-arguments def __init__(
self, self,
prec=None, prec=None,
rounding=None, rounding=None,
@ -3577,7 +3575,7 @@ class Context(object):
self._ignored_flags.remove(flag) self._ignored_flags.remove(flag)
# We inherit object.__hash__, so we must deny this explicitly # We inherit object.__hash__, so we must deny this explicitly
__hash__ = None # type: ignore __hash__ = None
def Etiny(self): def Etiny(self):
"""Returns Etiny (= Emin - prec + 1)""" """Returns Etiny (= Emin - prec + 1)"""
@ -3615,7 +3613,7 @@ class Context(object):
if isinstance(num, str) and (num != num.strip() or "_" in num): if isinstance(num, str) and (num != num.strip() or "_" in num):
return self._raise_error( return self._raise_error(
ConversionSyntax, ConversionSyntax,
"trailing or leading whitespace and underscores are not permitted.", "trailing or leading whitespace and " "underscores are not permitted.",
) )
d = Decimal(num, context=self) d = Decimal(num, context=self)
@ -5350,12 +5348,7 @@ BasicContext = Context(
flags=[], flags=[],
) )
ExtendedContext = Context( ExtendedContext = Context(prec=9, rounding=ROUND_HALF_EVEN, traps=[], flags=[],)
prec=9,
rounding=ROUND_HALF_EVEN,
traps=[],
flags=[],
)
##### crud for parsing strings ############################################# ##### crud for parsing strings #############################################
@ -5375,7 +5368,7 @@ ExtendedContext = Context(
try: try:
import re import re
except: except:
import ure as re # type: ignore import ure as re
_parser = re.compile( # A numeric string consists of: _parser = re.compile( # A numeric string consists of:
r"([-+])?" # an optional sign, followed by either... # 1 r"([-+])?" # an optional sign, followed by either... # 1

View file

@ -34,7 +34,7 @@ Here are some examples of using utrig:
>>> Decimal('.7').atan() >>> Decimal('.7').atan()
Decimal('0.6107259643892086165437588765') Decimal('0.6107259643892086165437588765')
>>> Decimal('.1').acos() >>> Decimal('.1').acos()
Decimal('1.470628905633336822885798512') Decimal('1.47062890563333682288579851219')
>>> Decimal('-.1').asin() >>> Decimal('-.1').asin()
Decimal('-0.1001674211615597963455231795') Decimal('-0.1001674211615597963455231795')
>>> Decimal('.4').tan() >>> Decimal('.4').tan()
@ -43,11 +43,6 @@ Decimal('0.4227932187381617619816354272')
Decimal('0.8775825618903727161162815826') Decimal('0.8775825618903727161162815826')
>>> Decimal('.6').sin() >>> Decimal('.6').sin()
Decimal('0.5646424733950353572009454457') Decimal('0.5646424733950353572009454457')
>>> Decimal('1').asin()
Decimal('1.570796326794896619231321692')
>>> Decimal('-1').acos()
Decimal('3.141592653589793238462643383')
""" """
@ -203,11 +198,6 @@ def asin(x, context=None):
with localcontext(context) as ctx: with localcontext(context) as ctx:
ctx.prec += 2 ctx.prec += 2
if x == 1:
r = atan(Decimal(1)) * 2 # pi * 1/2 radians
elif x == -1:
r = atan(Decimal(1)) * -2 # pi * -1/2 radians
else:
r = atan(x / (1 - x * x).sqrt()) r = atan(x / (1 - x * x).sqrt())
return r / 1 return r / 1
@ -228,15 +218,10 @@ def acos(x, context=None):
with localcontext(context) as ctx: with localcontext(context) as ctx:
ctx.prec += 2 ctx.prec += 2
if x == 1:
r = Decimal(0) # 0 radians
elif x == -1:
r = atan(Decimal(1)) * 4 # pi radians
else:
r = atan((1 - x * x).sqrt() / x) r = atan((1 - x * x).sqrt() / x)
if r < 0: if r < 0:
r += 4 * atan(1) r += 4 * atan(1)
return r / 1 return r
for name in __all__: for name in __all__:

View file

@ -1,17 +0,0 @@
# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
# SPDX-FileCopyrightText: Copyright (c) 2020 jepler for Unpythonic Networks
#
# SPDX-License-Identifier: MIT
pre-commit
recommonmark==0.6.0
sphinx
sphinx-autoapi
sphinxcontrib-svg2pdfconverter==0.1.0
sphinx-rtd-theme
setuptools
setuptools_scm
wheel
twine
readme_renderer
testresources
circuitpython-build-tools

View file

@ -2,48 +2,5 @@
# #
# SPDX-License-Identifier: Unlicense # SPDX-License-Identifier: Unlicense
[build-system] [tool.black]
requires = [ target-version = ['py35']
"setuptools",
"wheel",
"setuptools-scm",
]
[project]
name = "circuitpython-jepler-udecimal"
description = "Reduced version of the decimal library for CircuitPython"
version = "0.0.0+auto.0"
readme = "README.rst"
authors = [
{name = "Jeff Epler", email = "jepler@gmail.com"}
]
urls = { Source = "https://github.com/jepler/Jepler_CircuitPython_udecimal", Documentation = "https://jepler-udecimal.readthedocs.io/en/latest/api/jepler_udecimal/index.html", Tracker = "https://github.com/jepler/Jepler_CircuitPython_udecimal/issues" }
# "Pull Requests" = "https://github.com/jepler/Jepler_CircuitPython_udecimal/pulls",
keywords = [
"adafruit",
"blinka",
"circuitpython",
"micropython",
"udecimal",
"numeric",
"helper",
"arbitraryprecision",
"math",
]
license = {text = "MIT"}
classifiers = [
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries",
"Topic :: Software Development :: Embedded Systems",
"Topic :: System :: Hardware",
"License :: OSI Approved :: MIT License",
"License :: OSI Approved :: Python Software Foundation License",
"Programming Language :: Python :: 3",
]
dynamic = ["dependencies", "optional-dependencies"]
[tool.setuptools]
packages=['jepler_udecimal']
[tool.setuptools_scm]
write_to = "jepler_udecimal/__version__.py"

View file

@ -2,3 +2,18 @@
# SPDX-FileCopyrightText: Copyright (c) 2020 jepler for Unpythonic Networks # SPDX-FileCopyrightText: Copyright (c) 2020 jepler for Unpythonic Networks
# #
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
astroid
black
isort
pre-commit
recommonmark==0.6.0
sphinx<4
sphinx-autoapi
sphinxcontrib-svg2pdfconverter==0.1.0
sphinx-rtd-theme
setuptools
wheel
twine
readme_renderer
testresources
circuitpython-build-tools

65
setup.py Normal file
View file

@ -0,0 +1,65 @@
# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
# SPDX-FileCopyrightText: Copyright (c) 2020 jepler for Unpythonic Networks
#
# SPDX-License-Identifier: MIT
"""A setuptools based setup module.
See:
https://packaging.python.org/en/latest/distributing.html
https://github.com/pypa/sampleproject
"""
from setuptools import setup, find_packages
# To use a consistent encoding
from codecs import open
from os import path
here = path.abspath(path.dirname(__file__))
# Get the long description from the README file
with open(path.join(here, "README.rst"), encoding="utf-8") as f:
long_description = f.read()
setup(
name="jepler-circuitpython-udecimal",
use_scm_version=True,
setup_requires=["setuptools_scm"],
description="Reduced version of the decimal library for CircuitPython",
long_description=long_description,
long_description_content_type="text/x-rst",
# The project's main homepage.
url="https://github.com/jepler/Jepler_CircuitPython_udecimal",
project_urls={
"Source": "https://github.com/jepler/Jepler_CircuitPython_udecimal",
"Documentation": "https://jepler-udecimal.readthedocs.io/en/latest/api/jepler_udecimal/index.html",
"Tracker": "https://github.com/jepler/Jepler_CircuitPython_udecimal/issues",
"Pull Requests": "https://github.com/jepler/Jepler_CircuitPython_udecimal/pulls",
},
# Author details
author="Jeff Epler",
author_email="jepler@gmail.com",
install_requires=[],
# Choose your license
license="MIT",
# See https://pypi.python.org/pypi?%3Aaction=list_classifiers
classifiers=[
"Development Status :: 3 - Alpha",
"Intended Audience :: Developers",
"Topic :: Software Development :: Libraries",
"License :: OSI Approved :: MIT License",
"License :: OSI Approved :: Python Software Foundation License ",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.4",
"Programming Language :: Python :: 3.5",
"Programming Language :: Python :: 3.6",
"Programming Language :: Python :: 3.7",
],
# What does your project relate to?
keywords="adafruit blinka circuitpython micropython udecimal numeric helper "
"arbitraryprecision math",
# You can just specify the packages manually here if your project is
# simple. Or you can use find_packages().
packages=["jepler_udecimal"],
)