Compare commits

..

5 commits

19 changed files with 311 additions and 169 deletions

View file

@ -8,9 +8,65 @@ 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: View context attributes
uses: adafruit/workflows-circuitpython-libs/build@main uses: actions/github-script@v6
with: with:
package-prefix: jepler_udecimal script: console.log(JSON.stringify(context, null, 2))
- name: Translate Repo Name For Build Tools filename_prefix
id: repo-name
run: |
echo repo-name=$(
echo ${{ github.repository }} |
awk -F '\/' '{ print tolower($2) }' |
tr '_' '-'h
)>> $GITHUB_OUTPUTS
- name: Set up Python 3.x
uses: actions/setup-python@v1
with:
python-version: 3.x
- 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 Sphinx, pre-commit
run: |
pip install --force-reinstall Sphinx sphinx-rtd-theme pre-commit sphinx-autoapi
- name: Library version
run: git describe --dirty --always --tags
- name: Setup problem matchers
uses: adafruit/circuitpython-action-library-ci-problem-matchers@v1
- name: Pre-commit hooks
run: |
pre-commit run --all-files
- name: Test in circuitpython
run: ./build-test-cp.sh
- 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: Build Python package
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 repo-name=$(
echo ${{ github.repository }} |
awk -F '\/' '{ print tolower($2) }' |
tr '_' '-'h
)>> $GITHUB_OUTPUTS
- 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

@ -4,28 +4,28 @@
repos: repos:
- repo: https://github.com/psf/black - repo: https://github.com/psf/black
rev: 25.1.0 rev: 22.12.0
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: v1.1.0
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: v4.4.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 - repo: https://github.com/pycqa/pylint
rev: v3.3.4 rev: v2.15.9
hooks: hooks:
- id: pylint - id: pylint
name: lint (examples) name: lint (examples)
types: [python] types: [python]
files: ^examples/ files: ^examples/
args: args:
- --disable=missing-docstring,invalid-name - --disable=missing-docstring,invalid-name,bad-whitespace
- id: pylint - id: pylint
name: lint (code) name: lint (code)
types: [python] types: [python]

View file

@ -391,3 +391,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: docs/requirements.txt

21
build-test-cp.sh Executable file
View file

@ -0,0 +1,21 @@
#!/bin/sh
# SPDX-FileCopyrightText: 2022 Jeff Epler
# SPDX-License-Identifier: MIT
# SPDX-License-Identifier: Unlicense
set -e
TAG=8.0.0-beta.4
if ! [ -e circuitpython/py/py.mk ]; then
git clone -b $TAG --depth=1 https://github.com/adafruit/circuitpython
fi
(cd circuitpython && git submodule update --init lib/libffi lib/axtls lib/berkeley-db-1.xx tools/huffman extmod/ulab)
if ! [ -x circuitpython/ports/unix/micropython ]; then
make -C circuitpython/ports/unix -j$(nproc) DEBUG=1 STRIP=:
fi
if ! MICROPYPATH=. PYTHONPATH=. MICROPY_MICROPYTHON=circuitpython/ports/unix/micropython circuitpython/tests/run-tests.py -d examples; then
circuitpython/tests/run-tests.py --print-failures
exit 1
fi

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

@ -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

@ -50,19 +50,19 @@ with localcontext():
print(neginf * inf) print(neginf * inf)
try: try:
print(dig / 0) print(dig / 0)
except Exception as e: except ZeroDivisionError as e:
print("Division by zero") print("Division by zero")
getcontext().traps[DivisionByZero] = 1 getcontext().traps[DivisionByZero] = 1
try: try:
print(dig / 0) print(dig / 0)
except Exception as e: except DivisionByZero as e:
print("Division by zero") print("Division by zero")
c = Context() c = Context()
c.traps[InvalidOperation] = 0
print(+c.flags[InvalidOperation]) print(+c.flags[InvalidOperation])
c.traps[InvalidOperation] = 0
try: try:
c.divide(Decimal(0), Decimal(0)) c.divide(Decimal(0), Decimal(0))
except Exception as e: except ZeroDivisionError as e:
print("Division by zero") print("Division by zero")
c.traps[InvalidOperation] = 1 c.traps[InvalidOperation] = 1
print(+c.flags[InvalidOperation]) print(+c.flags[InvalidOperation])
@ -70,17 +70,18 @@ with localcontext():
print(+c.flags[InvalidOperation]) print(+c.flags[InvalidOperation])
try: try:
print(c.divide(Decimal(0), Decimal(0))) print(c.divide(Decimal(0), Decimal(0)))
except Exception as e: except InvalidOperation as e:
print("Division by zero") print("InvalidOperation")
print(+c.flags[InvalidOperation]) print(+c.flags[InvalidOperation])
try: try:
print(c.divide(Decimal(0), Decimal(0))) print(c.divide(Decimal(0), Decimal(0)))
except Exception as e: except InvalidOperation as e:
print("Division by zero") print("InvalidOperation")
print(+c.flags[InvalidOperation]) print(+c.flags[InvalidOperation])
import jepler_udecimal.utrig import jepler_udecimal.utrig
from jepler_udecimal import Decimal from jepler_udecimal import Decimal
from jepler_udecimal import InvalidOperation
print(Decimal(".7").atan()) print(Decimal(".7").atan())
print(Decimal(".1").acos()) print(Decimal(".1").acos())
@ -96,12 +97,12 @@ print(Decimal("NaN").tan())
print(Decimal("NaN").sin()) print(Decimal("NaN").sin())
try: try:
print(Decimal("2").acos()) print(Decimal("2").acos())
except Exception as e: except InvalidOperation as e:
print("exception") print("InvalidOperation")
try: try:
print(Decimal("2").asin()) print(Decimal("2").asin())
except Exception as e: except InvalidOperation as e:
print("exception") print("InvalidOperation")
print(Decimal("2").atan()) print(Decimal("2").atan())
print(Decimal("1").asin()) print(Decimal("1").asin())
print(Decimal("-1").asin()) print(Decimal("-1").asin())

View file

@ -8,9 +8,7 @@
from jepler_udecimal import Decimal from jepler_udecimal import Decimal
def moneyfmt( def moneyfmt(value, places=2, curr="", sep=",", dp=".", pos="", neg="-", trailneg=""):
value, *, places=2, curr="", sep=",", dp=".", pos="", neg="-", trailneg=""
):
"""Convert Decimal to a money formatted string. """Convert Decimal to a money formatted string.
places: required number of places after the decimal point places: required number of places after the decimal point

View file

@ -269,6 +269,10 @@ class DivisionByZero(DecimalException):
The result of the operation is [sign,inf], where sign is the exclusive The result of the operation is [sign,inf], where sign is the exclusive
or of the signs of the operands for divide, or is 1 for an odd power of or of the signs of the operands for divide, or is 1 for an odd power of
-0, for power. -0, for power.
Due to technical limitations in MicroPython, this exception does not
inherit from ZeroDivisionError, an incompatibility with standard Python's
Decimal library.
""" """
def handle(self, context, sign, *args): def handle(self, context, sign, *args):
@ -425,6 +429,10 @@ class FloatOperation(DecimalException):
Otherwise (the signal is trapped), only equality comparisons and explicit Otherwise (the signal is trapped), only equality comparisons and explicit
conversions are silent. All other mixed operations raise FloatOperation. conversions are silent. All other mixed operations raise FloatOperation.
Due to technical limitations in MicroPython, this exception does not
inherit from TypeError, an incompatibility with standard Python's
Decimal library.
""" """
@ -1798,16 +1806,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 +3365,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,

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

@ -4,7 +4,7 @@
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
pre-commit pre-commit
recommonmark==0.6.0 recommonmark==0.6.0
sphinx sphinx<4
sphinx-autoapi sphinx-autoapi
sphinxcontrib-svg2pdfconverter==0.1.0 sphinxcontrib-svg2pdfconverter==0.1.0
sphinx-rtd-theme sphinx-rtd-theme

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"],
)