change to ruff

This commit is contained in:
foamyguy 2025-05-16 16:29:36 +00:00
parent 964b8dafe2
commit d06c5ca9df
53 changed files with 262 additions and 598 deletions

11
.gitattributes vendored Normal file
View file

@ -0,0 +1,11 @@
# SPDX-FileCopyrightText: 2024 Justin Myers for Adafruit Industries
#
# SPDX-License-Identifier: Unlicense
.py text eol=lf
.rst text eol=lf
.txt text eol=lf
.yaml text eol=lf
.toml text eol=lf
.license text eol=lf
.md text eol=lf

View file

@ -1,42 +1,21 @@
# SPDX-FileCopyrightText: 2020 Diego Elio Pettenò # SPDX-FileCopyrightText: 2024 Justin Myers for Adafruit Industries
# #
# SPDX-License-Identifier: Unlicense # SPDX-License-Identifier: Unlicense
repos: repos:
- repo: https://github.com/python/black
rev: 23.3.0
hooks:
- id: black
- repo: https://github.com/fsfe/reuse-tool
rev: v1.1.2
hooks:
- id: reuse
- repo: https://github.com/pre-commit/pre-commit-hooks - repo: https://github.com/pre-commit/pre-commit-hooks
rev: v4.4.0 rev: v4.5.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/astral-sh/ruff-pre-commit
rev: v2.17.4 rev: v0.3.4
hooks: hooks:
- id: pylint - id: ruff-format
name: pylint (library code) - id: ruff
types: [python] args: ["--fix"]
args: - repo: https://github.com/fsfe/reuse-tool
- --disable=consider-using-f-string rev: v3.0.1
exclude: "^(docs/|examples/|tests/|setup.py$)" hooks:
- id: pylint - id: reuse
name: pylint (example code)
description: Run pylint rules on "examples/*.py" files
types: [python]
files: "^examples/"
args:
- --disable=missing-docstring,invalid-name,consider-using-f-string,duplicate-code
- id: pylint
name: pylint (test code)
description: Run pylint rules on "tests/*.py" files
types: [python]
files: "^tests/"
args:
- --disable=missing-docstring,consider-using-f-string,duplicate-code

399
.pylintrc
View file

@ -1,399 +0,0 @@
# SPDX-FileCopyrightText: 2017 Scott Shawcroft, written for Adafruit Industries
#
# SPDX-License-Identifier: Unlicense
[MASTER]
# A comma-separated list of package or module names from where C extensions may
# be loaded. Extensions are loading into the active Python interpreter and may
# run arbitrary code
extension-pkg-whitelist=
# Add files or directories to the ignore-list. They should be base names, not
# paths.
ignore=CVS
# Add files or directories matching the regex patterns to the ignore-list. The
# regex matches against base names, not paths.
ignore-patterns=
# Python code to execute, usually for sys.path manipulation such as
# pygtk.require().
#init-hook=
# Use multiple processes to speed up Pylint.
jobs=1
# List of plugins (as comma separated values of python modules names) to load,
# usually to register additional checkers.
load-plugins=pylint.extensions.no_self_use
# Pickle collected data for later comparisons.
persistent=yes
# Specify a configuration file.
#rcfile=
# Allow loading of arbitrary C extensions. Extensions are imported into the
# active Python interpreter and may run arbitrary code.
unsafe-load-any-extension=no
[MESSAGES CONTROL]
# Only show warnings with the listed confidence levels. Leave empty to show
# all. Valid levels: HIGH, INFERENCE, INFERENCE_FAILURE, UNDEFINED
confidence=
# Disable the message, report, category or checker with the given id(s). You
# can either give multiple identifiers separated by comma (,) or put this
# option multiple times (only on the command line, not in the configuration
# file where it should appear only once).You can also use "--disable=all" to
# disable everything first and then reenable specific checks. For example, if
# you want to run only the similarities checker, you can use "--disable=all
# --enable=similarities". If you want to run only the classes checker, but have
# no Warning level messages displayed, use"--disable=all --enable=classes
# --disable=W"
# disable=import-error,raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,deprecated-str-translate-call
disable=raw-checker-failed,bad-inline-option,locally-disabled,file-ignored,suppressed-message,useless-suppression,deprecated-pragma,import-error,pointless-string-statement,unspecified-encoding
# 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
# multiple time (only on the command line, not in the configuration file where
# it should appear only once). See also the "--disable" option for examples.
enable=
[REPORTS]
# Python expression which should return a note less than 10 (10 is the highest
# note). You have access to the variables errors warning, statement which
# respectively contain the number of errors / warnings messages and the total
# number of statements analyzed. This is used by the global evaluation report
# (RP0004).
evaluation=10.0 - ((float(5 * error + warning + refactor + convention) / statement) * 10)
# Template used to display messages. This is a python new-style format string
# used to format the message information. See doc for all details
#msg-template=
# Set the output format. Available formats are text, parseable, colorized, json
# and msvs (visual studio).You can also give a reporter class, eg
# mypackage.mymodule.MyReporterClass.
output-format=text
# Tells whether to display a full report or only the messages
reports=no
# Activate the evaluation score.
score=yes
[REFACTORING]
# Maximum number of nested blocks for function / method body
max-nested-blocks=5
[LOGGING]
# Logging modules to check that the string format arguments are in logging
# function parameter format
logging-modules=logging
[SPELLING]
# Spelling dictionary name. Available dictionaries: none. To make it working
# install python-enchant package.
spelling-dict=
# List of comma separated words that should not be checked.
spelling-ignore-words=
# A path to a file that contains private dictionary; one word per line.
spelling-private-dict-file=
# Tells whether to store unknown words to indicated private dictionary in
# --spelling-private-dict-file option instead of raising a message.
spelling-store-unknown-words=no
[MISCELLANEOUS]
# List of note tags to take in consideration, separated by a comma.
# notes=FIXME,XXX,TODO
notes=FIXME,XXX
[TYPECHECK]
# List of decorators that produce context managers, such as
# contextlib.contextmanager. Add to this list to register other decorators that
# produce valid context managers.
contextmanager-decorators=contextlib.contextmanager
# List of members which are set dynamically and missed by pylint inference
# system, and so shouldn't trigger E1101 when accessed. Python regular
# expressions are accepted.
generated-members=
# Tells whether missing members accessed in mixin class should be ignored. A
# mixin class is detected if its name ends with "mixin" (case insensitive).
ignore-mixin-members=yes
# This flag controls whether pylint should warn about no-member and similar
# checks whenever an opaque object is returned when inferring. The inference
# can return multiple potential results while evaluating a Python object, but
# some branches might not be evaluated, which results in partial inference. In
# that case, it might be useful to still emit no-member and other checks for
# the rest of the inferred objects.
ignore-on-opaque-inference=yes
# List of class names for which member attributes should not be checked (useful
# for classes with dynamically set attributes). This supports the use of
# qualified names.
ignored-classes=optparse.Values,thread._local,_thread._local
# List of module names for which member attributes should not be checked
# (useful for modules/projects where namespaces are manipulated during runtime
# and thus existing member attributes cannot be deduced by static analysis. It
# supports qualified module names, as well as Unix pattern matching.
ignored-modules=board
# Show a hint with possible names when a member name was not found. The aspect
# of finding the hint is based on edit distance.
missing-member-hint=yes
# The minimum edit distance a name should have in order to be considered a
# similar match for a missing member name.
missing-member-hint-distance=1
# The total number of similar names that should be taken in consideration when
# showing a hint for a missing member.
missing-member-max-choices=1
[VARIABLES]
# List of additional names supposed to be defined in builtins. Remember that
# you should avoid to define new builtins when possible.
additional-builtins=
# Tells whether unused global variables should be treated as a violation.
allow-global-unused-variables=yes
# List of strings which can identify a callback function by name. A callback
# name must start or end with one of those strings.
callbacks=cb_,_cb
# A regular expression matching the name of dummy variables (i.e. expectedly
# not used).
dummy-variables-rgx=_+$|(_[a-zA-Z0-9_]*[a-zA-Z0-9]+?$)|dummy|^ignored_|^unused_
# Argument names that match this expression will be ignored. Default to name
# with leading underscore
ignored-argument-names=_.*|^ignored_|^unused_
# Tells whether we should check for unused import in __init__ files.
init-import=no
# List of qualified module names which can have objects that can redefine
# builtins.
redefining-builtins-modules=six.moves,future.builtins
[FORMAT]
# Expected format of line ending, e.g. empty (any line ending), LF or CRLF.
# expected-line-ending-format=
expected-line-ending-format=LF
# Regexp for a line that is allowed to be longer than the limit.
ignore-long-lines=^\s*(# )?<?https?://\S+>?$
# Number of spaces of indent required inside a hanging or continued line.
indent-after-paren=4
# String used as indentation unit. This is usually " " (4 spaces) or "\t" (1
# tab).
indent-string=' '
# Maximum number of characters on a single line.
max-line-length=100
# Maximum number of lines in a module
max-module-lines=1000
# Allow the body of a class to be on the same line as the declaration if body
# contains single statement.
single-line-class-stmt=no
# Allow the body of an if to be on the same line as the test if there is no
# else.
single-line-if-stmt=no
[SIMILARITIES]
# Ignore comments when computing similarities.
ignore-comments=yes
# Ignore docstrings when computing similarities.
ignore-docstrings=yes
# Ignore imports when computing similarities.
ignore-imports=yes
# Minimum lines number of a similarity.
min-similarity-lines=12
[BASIC]
# Regular expression matching correct argument names
argument-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct attribute names
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-names=foo,bar,baz,toto,tutu,tata
# Regular expression matching correct class attribute names
class-attribute-rgx=([A-Za-z_][A-Za-z0-9_]{2,30}|(__.*__))$
# Regular expression matching correct class names
# class-rgx=[A-Z_][a-zA-Z0-9]+$
class-rgx=[A-Z_][a-zA-Z0-9_]+$
# Regular expression matching correct constant names
const-rgx=(([A-Z_][A-Z0-9_]*)|(__.*__))$
# Minimum line length for functions/classes that require docstrings, shorter
# ones are exempt.
docstring-min-length=-1
# Regular expression matching correct function names
function-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Good variable names which should always be accepted, separated by a comma
# good-names=i,j,k,ex,Run,_
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-naming-hint=no
# Regular expression matching correct inline iteration names
inlinevar-rgx=[A-Za-z_][A-Za-z0-9_]*$
# Regular expression matching correct method names
method-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
# Regular expression matching correct module names
module-rgx=(([a-z_][a-z0-9_]*)|([A-Z][a-zA-Z0-9]+))$
# Colon-delimited sets of names that determine each other's naming style when
# the name regexes allow several styles.
name-group=
# Regular expression which should only match function or class names that do
# not require a docstring.
no-docstring-rgx=^_
# List of decorators that produce properties, such as abc.abstractproperty. Add
# to this list to register other decorators that produce valid properties.
property-classes=abc.abstractproperty
# Regular expression matching correct variable names
variable-rgx=(([a-z][a-z0-9_]{2,30})|(_[a-z0-9_]*))$
[IMPORTS]
# Allow wildcard imports from modules that define __all__.
allow-wildcard-with-all=no
# Analyse import fallback blocks. This can be used to support both Python 2 and
# 3 compatible code, which means that the block might have code that exists
# only in one or another interpreter, leading to false positives when analysed.
analyse-fallback-blocks=no
# Deprecated modules which should not be used, separated by a comma
deprecated-modules=optparse,tkinter.tix
# Create a graph of external dependencies in the given file (report RP0402 must
# not be disabled)
ext-import-graph=
# Create a graph of every (i.e. internal and external) dependencies in the
# given file (report RP0402 must not be disabled)
import-graph=
# Create a graph of internal dependencies in the given file (report RP0402 must
# not be disabled)
int-import-graph=
# Force import order to recognize a module as part of the standard
# compatibility libraries.
known-standard-library=
# Force import order to recognize a module as part of a third party library.
known-third-party=enchant
[CLASSES]
# List of method names used to declare (i.e. assign) instance attributes.
defining-attr-methods=__init__,__new__,setUp
# List of member names, which should be excluded from the protected access
# warning.
exclude-protected=_asdict,_fields,_replace,_source,_make
# List of valid names for the first argument in a class method.
valid-classmethod-first-arg=cls
# List of valid names for the first argument in a metaclass class method.
valid-metaclass-classmethod-first-arg=mcs
[DESIGN]
# Maximum number of arguments for function / method
max-args=5
# Maximum number of attributes for a class (see R0902).
# max-attributes=7
max-attributes=11
# Maximum number of boolean expressions in a if statement
max-bool-expr=5
# Maximum number of branch for function / method body
max-branches=12
# Maximum number of locals for function / method body
max-locals=15
# Maximum number of parents for a class (see R0901).
max-parents=7
# Maximum number of public methods for a class (see R0904).
max-public-methods=20
# Maximum number of return / yield for function / method body
max-returns=6
# Maximum number of statements in function / method body
max-statements=50
# Minimum number of public methods for a class (see R0903).
min-public-methods=1
[EXCEPTIONS]
# Exceptions that will emit a warning when being caught. Defaults to
# "Exception"
overgeneral-exceptions=builtins.Exception

View file

@ -13,9 +13,9 @@ Introduction
:target: https://github.com/adafruit/Adafruit_CircuitPython_LED_Animation/actions :target: https://github.com/adafruit/Adafruit_CircuitPython_LED_Animation/actions
:alt: Build Status :alt: Build Status
.. image:: https://img.shields.io/badge/code%20style-black-000000.svg .. image:: https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json
:target: https://github.com/psf/black :target: https://github.com/astral-sh/ruff
:alt: Code Style: Black :alt: Code Style: Ruff
Perform a variety of LED animation tasks Perform a variety of LED animation tasks

View file

@ -12,7 +12,7 @@ try:
from micropython import const from micropython import const
except ImportError: except ImportError:
def const(value): # pylint: disable=missing-docstring def const(value):
return value return value

View file

@ -32,13 +32,12 @@ from adafruit_led_animation import MS_PER_SECOND, monotonic_ms
class Animation: class Animation:
# pylint: disable=too-many-instance-attributes
""" """
Base class for animations. Base class for animations.
""" """
on_cycle_complete_supported = False on_cycle_complete_supported = False
# pylint: disable=too-many-arguments
def __init__(self, pixel_object, speed, color, peers=None, paused=False, name=None): def __init__(self, pixel_object, speed, color, peers=None, paused=False, name=None):
self.pixel_object = pixel_object self.pixel_object = pixel_object
self.pixel_object.auto_write = False self.pixel_object.auto_write = False
@ -61,7 +60,7 @@ class Animation:
"""Number of animation cycles completed.""" """Number of animation cycles completed."""
def __str__(self): def __str__(self):
return "<%s: %s>" % (self.__class__.__name__, self.name) return f"<{self.__class__.__name__}: {self.name}>"
def animate(self, show=True): def animate(self, show=True):
""" """

View file

@ -42,7 +42,6 @@ class Blink(ColorCycle):
:param name: A human-readable name for the Animation. Used by the string function. :param name: A human-readable name for the Animation. Used by the string function.
""" """
# pylint: disable=too-many-arguments
def __init__(self, pixel_object, speed, color, background_color=BLACK, name=None): def __init__(self, pixel_object, speed, color, background_color=BLACK, name=None):
self._background_color = background_color self._background_color = background_color
super().__init__(pixel_object, speed, [color, background_color], name=name) super().__init__(pixel_object, speed, [color, background_color], name=name)

View file

@ -43,10 +43,7 @@ class Chase(Animation):
:param reverse: Reverse direction of movement. :param reverse: Reverse direction of movement.
""" """
# pylint: disable=too-many-arguments def __init__(self, pixel_object, speed, color, size=2, spacing=3, reverse=False, name=None):
def __init__(
self, pixel_object, speed, color, size=2, spacing=3, reverse=False, name=None
):
self._size = size self._size = size
self._spacing = spacing self._spacing = spacing
self._repeat_width = size + spacing self._repeat_width = size + spacing
@ -102,7 +99,7 @@ class Chase(Animation):
self.cycle_complete = True self.cycle_complete = True
self._offset = (self._offset + self._direction) % self._repeat_width self._offset = (self._offset + self._direction) % self._repeat_width
def bar_color(self, n, pixel_no=0): # pylint: disable=unused-argument def bar_color(self, n, pixel_no=0):
""" """
Generate the color for the n'th bar_color in the Chase Generate the color for the n'th bar_color in the Chase
@ -112,7 +109,7 @@ class Chase(Animation):
return self.color return self.color
@staticmethod @staticmethod
def space_color(n, pixel_no=0): # pylint: disable=unused-argument def space_color(n, pixel_no=0):
""" """
Generate the spacing color for the n'th bar_color in the Chase Generate the spacing color for the n'th bar_color in the Chase

View file

@ -41,7 +41,6 @@ class ColorCycle(Animation):
:param start_color: An index (from 0) for which color to start from. Default 0 (first color). :param start_color: An index (from 0) for which color to start from. Default 0 (first color).
""" """
# pylint: disable=too-many-arguments
def __init__(self, pixel_object, speed, colors=RAINBOW, name=None, start_color=0): def __init__(self, pixel_object, speed, colors=RAINBOW, name=None, start_color=0):
self.colors = colors self.colors = colors
self.start_color = start_color self.start_color = start_color

View file

@ -49,7 +49,6 @@ class Comet(Animation):
:param bool ring: Ring mode. Defaults to ``False``. :param bool ring: Ring mode. Defaults to ``False``.
""" """
# pylint: disable=too-many-arguments,too-many-instance-attributes
def __init__( def __init__(
self, self,
pixel_object, pixel_object,
@ -90,9 +89,7 @@ class Comet(Animation):
def _set_color(self, color): def _set_color(self, color):
self._comet_colors = [self._background_color] self._comet_colors = [self._background_color]
for n in range(self._tail_length): for n in range(self._tail_length):
self._comet_colors.append( self._comet_colors.append(calculate_intensity(color, n * self._color_step + 0.05))
calculate_intensity(color, n * self._color_step + 0.05)
)
self._computed_color = color self._computed_color = color
@property @property

View file

@ -43,7 +43,6 @@ class CustomColorChase(Chase):
:param reverse: Reverse direction of movement. :param reverse: Reverse direction of movement.
""" """
# pylint: disable=too-many-arguments
def __init__( def __init__(
self, self,
pixel_object, pixel_object,

View file

@ -26,12 +26,13 @@ Implementation Notes
""" """
import random import random
from adafruit_led_animation.animation import Animation from adafruit_led_animation.animation import Animation
__version__ = "0.0.0+auto.0" __version__ = "0.0.0+auto.0"
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_LED_Animation.git" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_LED_Animation.git"
from adafruit_led_animation.color import BLACK, colorwheel, calculate_intensity, GREEN from adafruit_led_animation.color import BLACK, GREEN, calculate_intensity, colorwheel
class Rain(Animation): class Rain(Animation):
@ -46,10 +47,7 @@ class Rain(Animation):
:param background: Background color (Default BLACK). :param background: Background color (Default BLACK).
""" """
# pylint: disable=too-many-arguments def __init__(self, grid_object, speed, color, count=1, length=3, background=BLACK, name=None):
def __init__(
self, grid_object, speed, color, count=1, length=3, background=BLACK, name=None
):
self._count = count self._count = count
self._length = length self._length = length
self._background = background self._background = background
@ -82,7 +80,7 @@ class Rain(Animation):
if y >= 0: if y >= 0:
self.pixel_object[x, y] = color self.pixel_object[x, y] = color
def _generate_droplet(self, x, length): # pylint: disable=unused-argument def _generate_droplet(self, x, length):
return [[n, self.color] for n in range(-length, 0)] return [[n, self.color] for n in range(-length, 0)]
@ -91,9 +89,7 @@ class RainbowRain(Rain):
Rainbow Rain animation. Rainbow Rain animation.
""" """
def __init__( # pylint: disable=too-many-arguments def __init__(self, grid_object, speed, count=1, length=3, background=BLACK, name=None):
self, grid_object, speed, count=1, length=3, background=BLACK, name=None
):
super().__init__(grid_object, speed, BLACK, count, length, background, name) super().__init__(grid_object, speed, BLACK, count, length, background, name)
def _generate_droplet(self, x, length): def _generate_droplet(self, x, length):
@ -109,7 +105,7 @@ class MatrixRain(Rain):
The Matrix style animation. The Matrix style animation.
""" """
def __init__( # pylint: disable=too-many-arguments def __init__(
self, self,
grid_object, grid_object,
speed, speed,

View file

@ -25,6 +25,7 @@ Implementation Notes
""" """
from adafruit_led_animation.animation.comet import Comet from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.color import BLACK from adafruit_led_animation.color import BLACK
@ -50,7 +51,6 @@ class MulticolorComet(Comet):
to remain on and set to a color after the comet passes. to remain on and set to a color after the comet passes.
""" """
# pylint: disable=too-many-arguments,too-many-instance-attributes
def __init__( def __init__(
self, self,
pixel_object, pixel_object,

View file

@ -24,16 +24,17 @@ Implementation Notes
""" """
import time import time
from adafruit_led_animation.animation import Animation from adafruit_led_animation.animation import Animation
from adafruit_led_animation.color import ( from adafruit_led_animation.color import (
BLACK, BLACK,
YELLOW, BLUE,
RED,
PURPLE,
CYAN, CYAN,
ORANGE, ORANGE,
BLUE, PURPLE,
RED,
WHITE, WHITE,
YELLOW,
) )
ORANGEYELLOW = (255, 136, 0) ORANGEYELLOW = (255, 136, 0)
@ -47,7 +48,6 @@ class Pacman(Animation):
:param float speed: Animation speed rate in seconds, e.g. ``0.1``. :param float speed: Animation speed rate in seconds, e.g. ``0.1``.
""" """
# pylint: disable=too-many-arguments, too-many-branches
def __init__( def __init__(
self, self,
pixel_object, pixel_object,

View file

@ -42,7 +42,6 @@ class Pulse(Animation):
:param max_intensity: Highest brightness level of the pulse. Default 1. :param max_intensity: Highest brightness level of the pulse. Default 1.
""" """
# pylint: disable=too-many-arguments
def __init__( def __init__(
self, self,
pixel_object, pixel_object,
@ -72,10 +71,8 @@ class Pulse(Animation):
""" """
Resets the animation. Resets the animation.
""" """
dotstar = len(self.pixel_object[0]) == 4 and isinstance( dotstar = len(self.pixel_object[0]) == 4 and isinstance(self.pixel_object[0][-1], float)
self.pixel_object[0][-1], float from adafruit_led_animation.pulse_generator import (
)
from adafruit_led_animation.pulse_generator import ( # pylint: disable=import-outside-toplevel
pulse_generator, pulse_generator,
) )

View file

@ -25,9 +25,9 @@ Implementation Notes
""" """
from adafruit_led_animation import MS_PER_SECOND, monotonic_ms
from adafruit_led_animation.animation import Animation from adafruit_led_animation.animation import Animation
from adafruit_led_animation.color import BLACK, colorwheel from adafruit_led_animation.color import BLACK, colorwheel
from adafruit_led_animation import MS_PER_SECOND, monotonic_ms
__version__ = "0.0.0+auto.0" __version__ = "0.0.0+auto.0"
__repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_LED_Animation.git" __repo__ = "https://github.com/adafruit/Adafruit_CircuitPython_LED_Animation.git"
@ -46,10 +46,7 @@ class Rainbow(Animation):
(default True). (default True).
""" """
# pylint: disable=too-many-arguments def __init__(self, pixel_object, speed, period=5, step=1, name=None, precompute_rainbow=True):
def __init__(
self, pixel_object, speed, period=5, step=1, name=None, precompute_rainbow=True
):
super().__init__(pixel_object, speed, BLACK, name=name) super().__init__(pixel_object, speed, BLACK, name=name)
self._period = period self._period = period
self._step = step self._step = step
@ -107,13 +104,9 @@ class Rainbow(Animation):
if wheel_index + num > len(self.colors): if wheel_index + num > len(self.colors):
colors_left = len(self.colors) - wheel_index colors_left = len(self.colors) - wheel_index
self.pixel_object[i : i + colors_left] = self.colors[wheel_index:] self.pixel_object[i : i + colors_left] = self.colors[wheel_index:]
self.pixel_object[i + colors_left : i + num] = self.colors[ self.pixel_object[i + colors_left : i + num] = self.colors[: num - colors_left]
: num - colors_left
]
else: else:
self.pixel_object[i : i + num] = self.colors[ self.pixel_object[i : i + num] = self.colors[wheel_index : wheel_index + num]
wheel_index : wheel_index + num
]
def draw(self): def draw(self):
next(self._generator) next(self._generator)

View file

@ -26,8 +26,8 @@ Implementation Notes
""" """
from adafruit_led_animation.color import colorwheel
from adafruit_led_animation.animation.chase import Chase from adafruit_led_animation.animation.chase import Chase
from adafruit_led_animation.color import colorwheel
class RainbowChase(Chase): class RainbowChase(Chase):
@ -43,7 +43,6 @@ class RainbowChase(Chase):
:param step: How many colors to skip in ``colorwheel`` per bar (default 8) :param step: How many colors to skip in ``colorwheel`` per bar (default 8)
""" """
# pylint: disable=too-many-arguments
def __init__( def __init__(
self, self,
pixel_object, pixel_object,

View file

@ -27,7 +27,7 @@ Implementation Notes
""" """
from adafruit_led_animation.animation.comet import Comet from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.color import colorwheel, BLACK, calculate_intensity from adafruit_led_animation.color import BLACK, calculate_intensity, colorwheel
class RainbowComet(Comet): class RainbowComet(Comet):
@ -46,7 +46,6 @@ class RainbowComet(Comet):
:param bool ring: Ring mode. Defaults to ``False``. :param bool ring: Ring mode. Defaults to ``False``.
""" """
# pylint: disable=too-many-arguments
def __init__( def __init__(
self, self,
pixel_object, pixel_object,
@ -64,9 +63,7 @@ class RainbowComet(Comet):
else: else:
self._colorwheel_step = step self._colorwheel_step = step
self._colorwheel_offset = colorwheel_offset self._colorwheel_offset = colorwheel_offset
super().__init__( super().__init__(pixel_object, speed, 0, 0, tail_length, reverse, bounce, name, ring)
pixel_object, speed, 0, 0, tail_length, reverse, bounce, name, ring
)
def _set_color(self, color): def _set_color(self, color):
self._comet_colors = [BLACK] self._comet_colors = [BLACK]
@ -75,8 +72,7 @@ class RainbowComet(Comet):
self._comet_colors.append( self._comet_colors.append(
calculate_intensity( calculate_intensity(
colorwheel( colorwheel(
int((invert * self._colorwheel_step) + self._colorwheel_offset) int((invert * self._colorwheel_step) + self._colorwheel_offset) % 256
% 256
), ),
n * self._color_step + 0.05, n * self._color_step + 0.05,
) )

View file

@ -26,6 +26,7 @@ Implementation Notes
""" """
import random import random
from adafruit_led_animation.animation.rainbow import Rainbow from adafruit_led_animation.animation.rainbow import Rainbow
@ -45,7 +46,6 @@ class RainbowSparkle(Rainbow):
(default True). (default True).
""" """
# pylint: disable=too-many-arguments
def __init__( def __init__(
self, self,
pixel_object, pixel_object,
@ -91,10 +91,7 @@ class RainbowSparkle(Rainbow):
def after_draw(self): def after_draw(self):
self.show() self.show()
pixels = [ pixels = [random.randint(0, len(self.pixel_object) - 1) for n in range(self._num_sparkles)]
random.randint(0, len(self.pixel_object) - 1)
for n in range(self._num_sparkles)
]
for pixel in pixels: for pixel in pixels:
self.pixel_object[pixel] = self._bright_colors[ self.pixel_object[pixel] = self._bright_colors[
(self._wheel_index + pixel) % len(self._bright_colors) (self._wheel_index + pixel) % len(self._bright_colors)

View file

@ -26,6 +26,7 @@ Implementation Notes
""" """
import random import random
from adafruit_led_animation.animation import Animation from adafruit_led_animation.animation import Animation
__version__ = "0.0.0+auto.0" __version__ = "0.0.0+auto.0"
@ -43,10 +44,7 @@ class Sparkle(Animation):
:param mask: array to limit sparkles within range of the mask :param mask: array to limit sparkles within range of the mask
""" """
# pylint: disable=too-many-arguments def __init__(self, pixel_object, speed, color, num_sparkles=1, name=None, mask=None):
def __init__(
self, pixel_object, speed, color, num_sparkles=1, name=None, mask=None
):
if len(pixel_object) < 2: if len(pixel_object) < 2:
raise ValueError("Sparkle needs at least 2 pixels") raise ValueError("Sparkle needs at least 2 pixels")
if mask: if mask:
@ -66,9 +64,7 @@ class Sparkle(Animation):
def _set_color(self, color): def _set_color(self, color):
half_color = tuple(color[rgb] // 4 for rgb in range(len(color))) half_color = tuple(color[rgb] // 4 for rgb in range(len(color)))
dim_color = tuple(color[rgb] // 10 for rgb in range(len(color))) dim_color = tuple(color[rgb] // 10 for rgb in range(len(color)))
for pixel in range( # pylint: disable=consider-using-enumerate for pixel in range(len(self.pixel_object)):
len(self.pixel_object)
):
if self.pixel_object[pixel] == self._half_color: if self.pixel_object[pixel] == self._half_color:
self.pixel_object[pixel] = half_color self.pixel_object[pixel] = half_color
elif self.pixel_object[pixel] == self._dim_color: elif self.pixel_object[pixel] == self._dim_color:

View file

@ -43,7 +43,6 @@ class SparklePulse(Sparkle):
:param min_intensity: The minimum intensity to pulse, between 0 and 1.0. Default 0. :param min_intensity: The minimum intensity to pulse, between 0 and 1.0. Default 0.
""" """
# pylint: disable=too-many-arguments
def __init__( def __init__(
self, self,
pixel_object, pixel_object,
@ -60,9 +59,7 @@ class SparklePulse(Sparkle):
self.min_intensity = min_intensity self.min_intensity = min_intensity
self.max_intensity = max_intensity self.max_intensity = max_intensity
dotstar = len(pixel_object) == 4 and isinstance(pixel_object[0][-1], float) dotstar = len(pixel_object) == 4 and isinstance(pixel_object[0][-1], float)
super().__init__( super().__init__(pixel_object, speed=speed, color=color, num_sparkles=1, name=name)
pixel_object, speed=speed, color=color, num_sparkles=1, name=name
)
self._generator = pulse_generator(self._period, self, dotstar_pwm=dotstar) self._generator = pulse_generator(self._period, self, dotstar_pwm=dotstar)
def _set_color(self, color): def _set_color(self, color):
@ -88,7 +85,5 @@ class SparklePulse(Sparkle):
self.reset() self.reset()
def reset(self): def reset(self):
dotstar = len(self.pixel_object) == 4 and isinstance( dotstar = len(self.pixel_object) == 4 and isinstance(self.pixel_object[0][-1], float)
self.pixel_object[0][-1], float
)
self._generator = pulse_generator(self._period, self, dotstar_pwm=dotstar) self._generator = pulse_generator(self._period, self, dotstar_pwm=dotstar)

View file

@ -42,7 +42,6 @@ class Volume(Animation):
:param float max_volume: what volume is considered maximum where everything is lit up :param float max_volume: what volume is considered maximum where everything is lit up
""" """
# pylint: disable=too-many-arguments
def __init__( def __init__(
self, self,
pixel_object, pixel_object,
@ -103,7 +102,6 @@ class Volume(Animation):
self._num_pixels, self._num_pixels,
) )
) )
# pylint: disable=consider-using-min-builtin
if lit_pixels > self._num_pixels: if lit_pixels > self._num_pixels:
lit_pixels = self._num_pixels lit_pixels = self._num_pixels

View file

@ -23,8 +23,9 @@ Implementation Notes
* Adafruit CircuitPython firmware for the supported boards: * Adafruit CircuitPython firmware for the supported boards:
https://circuitpython.org/downloads https://circuitpython.org/downloads
""" """
# Makes colorwheel() available. # Makes colorwheel() available.
from rainbowio import colorwheel # pylint: disable=unused-import from rainbowio import colorwheel
RED = (255, 0, 0) RED = (255, 0, 0)
"""Red.""" """Red."""

View file

@ -24,11 +24,11 @@ Implementation Notes
https://circuitpython.org/downloads https://circuitpython.org/downloads
""" """
from micropython import const from micropython import const
from .helper import PixelMap, horizontal_strip_gridmap, vertical_strip_gridmap from .helper import PixelMap, horizontal_strip_gridmap, vertical_strip_gridmap
HORIZONTAL = const(1) HORIZONTAL = const(1)
VERTICAL = const(2) VERTICAL = const(2)
@ -79,7 +79,7 @@ class PixelGrid:
reverse_y=False, reverse_y=False,
top=0, top=0,
bottom=0, bottom=0,
): # pylint: disable=too-many-arguments,too-many-locals ):
self._pixels = strip self._pixels = strip
self._x = [] self._x = []
self.height = height self.height = height
@ -154,7 +154,6 @@ class PixelGrid:
@brightness.setter @brightness.setter
def brightness(self, brightness): def brightness(self, brightness):
# pylint: disable=attribute-defined-outside-init
self._pixels.brightness = min(max(brightness, 0.0), 1.0) self._pixels.brightness = min(max(brightness, 0.0), 1.0)
def fill(self, color): def fill(self, color):

View file

@ -107,9 +107,9 @@ class AnimationGroup:
self.on_cycle_complete_supported = self._members[-1].on_cycle_complete_supported self.on_cycle_complete_supported = self._members[-1].on_cycle_complete_supported
def __str__(self): def __str__(self):
return "<AnimationGroup %s: %s>" % (self.__class__.__name__, self.name) return f"<AnimationGroup {self.__class__.__name__}: {self.name}>"
def _group_done(self, animation): # pylint: disable=unused-argument def _group_done(self, animation):
self.on_cycle_complete() self.on_cycle_complete()
def on_cycle_complete(self): def on_cycle_complete(self):

View file

@ -165,7 +165,6 @@ class PixelMap:
@brightness.setter @brightness.setter
def brightness(self, brightness): def brightness(self, brightness):
# pylint: disable=attribute-defined-outside-init
self._pixels.brightness = min(max(brightness, 0.0), 1.0) self._pixels.brightness = min(max(brightness, 0.0), 1.0)
def fill(self, color): def fill(self, color):

View file

@ -27,7 +27,9 @@ Implementation Notes
""" """
import random import random
from adafruit_led_animation.color import BLACK from adafruit_led_animation.color import BLACK
from . import MS_PER_SECOND, monotonic_ms from . import MS_PER_SECOND, monotonic_ms
__version__ = "0.0.0+auto.0" __version__ = "0.0.0+auto.0"
@ -73,7 +75,6 @@ class AnimationSequence:
animations.animate() animations.animate()
""" """
# pylint: disable=too-many-instance-attributes, too-many-arguments
def __init__( def __init__(
self, self,
*members, *members,
@ -82,16 +83,12 @@ class AnimationSequence:
random_order=False, random_order=False,
auto_reset=False, auto_reset=False,
advance_on_cycle_complete=False, advance_on_cycle_complete=False,
name=None name=None,
): ):
if advance_interval and advance_on_cycle_complete: if advance_interval and advance_on_cycle_complete:
raise ValueError( raise ValueError("Cannot use both advance_interval and advance_on_cycle_complete.")
"Cannot use both advance_interval and advance_on_cycle_complete."
)
self._members = members self._members = members
self._advance_interval = ( self._advance_interval = advance_interval * MS_PER_SECOND if advance_interval else None
advance_interval * MS_PER_SECOND if advance_interval else None
)
self._last_advance = monotonic_ms() self._last_advance = monotonic_ms()
self._current = 0 self._current = 0
self.auto_clear = auto_clear self.auto_clear = auto_clear
@ -115,7 +112,7 @@ class AnimationSequence:
on_cycle_complete_supported = True on_cycle_complete_supported = True
def __str__(self): def __str__(self):
return "<%s: %s>" % (self.__class__.__name__, self.name) return f"<{self.__class__.__name__}: {self.name}>"
def on_cycle_complete(self): def on_cycle_complete(self):
""" """
@ -128,7 +125,7 @@ class AnimationSequence:
for callback in self._also_notify: for callback in self._also_notify:
callback(self) callback(self)
def _sequence_complete(self, animation): # pylint: disable=unused-argument def _sequence_complete(self, animation):
if self.advance_on_cycle_complete: if self.advance_on_cycle_complete:
self._advance() self._advance()

View file

@ -26,6 +26,7 @@ Implementation Notes
""" """
from adafruit_led_animation.sequence import AnimationSequence from adafruit_led_animation.sequence import AnimationSequence
from . import MS_PER_SECOND from . import MS_PER_SECOND
@ -57,10 +58,7 @@ class TimedAnimationSequence(AnimationSequence):
animations.animate() animations.animate()
""" """
# pylint: disable=too-many-instance-attributes def __init__(self, *members, auto_clear=True, random_order=False, auto_reset=False, name=None):
def __init__(
self, *members, auto_clear=True, random_order=False, auto_reset=False, name=None
):
self._animation_members = [] self._animation_members = []
self._animation_timings = [] self._animation_timings = []
for x, item in enumerate(members): for x, item in enumerate(members):

View file

@ -4,6 +4,9 @@
.. If your library file(s) are nested in a directory (e.g. /adafruit_foo/foo.py) .. If your library file(s) are nested in a directory (e.g. /adafruit_foo/foo.py)
.. use this format as the module name: "adafruit_foo.foo" .. use this format as the module name: "adafruit_foo.foo"
API Reference
#############
.. automodule:: adafruit_led_animation.animation .. automodule:: adafruit_led_animation.animation
:members: :members:

View file

@ -1,12 +1,10 @@
# -*- coding: utf-8 -*-
# SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries # SPDX-FileCopyrightText: 2021 ladyada for Adafruit Industries
# #
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
import datetime
import os import os
import sys import sys
import datetime
sys.path.insert(0, os.path.abspath("..")) sys.path.insert(0, os.path.abspath(".."))
@ -48,9 +46,7 @@ project = "LED_Animation Library"
creation_year = "2020" creation_year = "2020"
current_year = str(datetime.datetime.now().year) current_year = str(datetime.datetime.now().year)
year_duration = ( year_duration = (
current_year current_year if current_year == creation_year else creation_year + " - " + current_year
if current_year == creation_year
else creation_year + " - " + current_year
) )
copyright = year_duration + " Kattni Rembor" copyright = year_duration + " Kattni Rembor"
author = "Kattni Rembor" author = "Kattni Rembor"

View file

@ -9,24 +9,25 @@ a different form of NeoPixels.
This example does not work on SAMD21 (M0) boards. This example does not work on SAMD21 (M0) boards.
""" """
import board import board
import neopixel import neopixel
from adafruit_led_animation.animation.blink import Blink from adafruit_led_animation.animation.blink import Blink
from adafruit_led_animation.animation.sparklepulse import SparklePulse
from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.animation.chase import Chase from adafruit_led_animation.animation.chase import Chase
from adafruit_led_animation.animation.pulse import Pulse
from adafruit_led_animation.animation.sparkle import Sparkle
from adafruit_led_animation.animation.rainbowchase import RainbowChase
from adafruit_led_animation.animation.rainbowsparkle import RainbowSparkle
from adafruit_led_animation.animation.rainbowcomet import RainbowComet
from adafruit_led_animation.animation.solid import Solid
from adafruit_led_animation.animation.colorcycle import ColorCycle from adafruit_led_animation.animation.colorcycle import ColorCycle
from adafruit_led_animation.animation.rainbow import Rainbow from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.animation.customcolorchase import CustomColorChase from adafruit_led_animation.animation.customcolorchase import CustomColorChase
from adafruit_led_animation.animation.pulse import Pulse
from adafruit_led_animation.animation.rainbow import Rainbow
from adafruit_led_animation.animation.rainbowchase import RainbowChase
from adafruit_led_animation.animation.rainbowcomet import RainbowComet
from adafruit_led_animation.animation.rainbowsparkle import RainbowSparkle
from adafruit_led_animation.animation.solid import Solid
from adafruit_led_animation.animation.sparkle import Sparkle
from adafruit_led_animation.animation.sparklepulse import SparklePulse
from adafruit_led_animation.color import AMBER, JADE, MAGENTA, ORANGE, PURPLE, WHITE
from adafruit_led_animation.sequence import AnimationSequence from adafruit_led_animation.sequence import AnimationSequence
from adafruit_led_animation.color import PURPLE, WHITE, AMBER, JADE, MAGENTA, ORANGE
# Update to match the pin connected to your NeoPixels # Update to match the pin connected to your NeoPixels
pixel_pin = board.D6 pixel_pin = board.D6

View file

@ -9,26 +9,27 @@ a different form of NeoPixels.
This example may not work on SAMD21 (M0) boards. This example may not work on SAMD21 (M0) boards.
""" """
import board import board
import neopixel import neopixel
from adafruit_led_animation.animation.solid import Solid
from adafruit_led_animation.animation.colorcycle import ColorCycle
from adafruit_led_animation.animation.blink import Blink from adafruit_led_animation.animation.blink import Blink
from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.animation.chase import Chase from adafruit_led_animation.animation.chase import Chase
from adafruit_led_animation.animation.colorcycle import ColorCycle
from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.animation.pulse import Pulse from adafruit_led_animation.animation.pulse import Pulse
from adafruit_led_animation.sequence import AnimationSequence from adafruit_led_animation.animation.solid import Solid
from adafruit_led_animation.color import ( from adafruit_led_animation.color import (
PURPLE,
WHITE,
AMBER, AMBER,
JADE, JADE,
TEAL,
PINK,
MAGENTA, MAGENTA,
ORANGE, ORANGE,
PINK,
PURPLE,
TEAL,
WHITE,
) )
from adafruit_led_animation.sequence import AnimationSequence
# Update to match the pin connected to your NeoPixels # Update to match the pin connected to your NeoPixels
pixel_pin = board.D6 pixel_pin = board.D6

View file

@ -10,6 +10,7 @@ using a different board or form of NeoPixels.
This example will run on SAMD21 (M0) Express boards (such as Circuit Playground Express or QT Py This example will run on SAMD21 (M0) Express boards (such as Circuit Playground Express or QT Py
Haxpress), but not on SAMD21 non-Express boards (such as QT Py or Trinket). Haxpress), but not on SAMD21 non-Express boards (such as QT Py or Trinket).
""" """
import board import board
import neopixel import neopixel

View file

@ -10,6 +10,7 @@ using a different board or form of NeoPixels.
This example will run on SAMD21 (M0) Express boards (such as Circuit Playground Express or QT Py This example will run on SAMD21 (M0) Express boards (such as Circuit Playground Express or QT Py
Haxpress), but not on SAMD21 non-Express boards (such as QT Py or Trinket). Haxpress), but not on SAMD21 non-Express boards (such as QT Py or Trinket).
""" """
import board import board
import neopixel import neopixel

View file

@ -11,6 +11,7 @@ using a different board or form of NeoPixels.
This example will run on SAMD21 (M0) Express boards (such as Circuit Playground Express or QT Py This example will run on SAMD21 (M0) Express boards (such as Circuit Playground Express or QT Py
Haxpress), but not on SAMD21 non-Express boards (such as QT Py or Trinket). Haxpress), but not on SAMD21 non-Express boards (such as QT Py or Trinket).
""" """
import board import board
import neopixel import neopixel

View file

@ -10,6 +10,7 @@ using a different board or form of NeoPixels.
This example will run on SAMD21 (M0) Express boards (such as Circuit Playground Express or QT Py This example will run on SAMD21 (M0) Express boards (such as Circuit Playground Express or QT Py
Haxpress), but not on SAMD21 non-Express boards (such as QT Py or Trinket). Haxpress), but not on SAMD21 non-Express boards (such as QT Py or Trinket).
""" """
import board import board
import neopixel import neopixel

View file

@ -9,17 +9,16 @@ a different form of NeoPixels.
This example may not work on SAMD21 (M0) boards. This example may not work on SAMD21 (M0) boards.
""" """
import board import board
import neopixel import neopixel
from adafruit_led_animation.animation.customcolorchase import CustomColorChase from adafruit_led_animation.animation.customcolorchase import CustomColorChase
from adafruit_led_animation.sequence import AnimationSequence
# colorwheel only needed for rainbowchase example # colorwheel only needed for rainbowchase example
from adafruit_led_animation.color import colorwheel
# Colors for customcolorchase examples # Colors for customcolorchase examples
from adafruit_led_animation.color import PINK, GREEN, RED, BLUE from adafruit_led_animation.color import BLUE, GREEN, PINK, RED, colorwheel
from adafruit_led_animation.sequence import AnimationSequence
# Update to match the pin connected to your NeoPixels # Update to match the pin connected to your NeoPixels
pixel_pin = board.D5 pixel_pin = board.D5
@ -27,15 +26,11 @@ pixel_pin = board.D5
pixel_num = 30 pixel_num = 30
brightness = 0.3 brightness = 0.3
pixels = neopixel.NeoPixel( pixels = neopixel.NeoPixel(pixel_pin, pixel_num, brightness=brightness, auto_write=False)
pixel_pin, pixel_num, brightness=brightness, auto_write=False
)
# colors default to RAINBOW as defined in color.py # colors default to RAINBOW as defined in color.py
custom_color_chase_rainbow = CustomColorChase(pixels, speed=0.1, size=2, spacing=3) custom_color_chase_rainbow = CustomColorChase(pixels, speed=0.1, size=2, spacing=3)
custom_color_chase_rainbow_r = CustomColorChase( custom_color_chase_rainbow_r = CustomColorChase(pixels, speed=0.1, size=3, spacing=3, reverse=True)
pixels, speed=0.1, size=3, spacing=3, reverse=True
)
# Example with same colors as RainbowChase # Example with same colors as RainbowChase
steps = 30 steps = 30

View file

@ -8,14 +8,16 @@ two animations
For NeoPixel FeatherWing. Update pixel_pin and pixel_num to match your wiring if using For NeoPixel FeatherWing. Update pixel_pin and pixel_num to match your wiring if using
a different form of NeoPixels. a different form of NeoPixels.
""" """
import time import time
import board import board
import neopixel import neopixel
from digitalio import DigitalInOut, Direction, Pull from digitalio import DigitalInOut, Direction, Pull
from adafruit_led_animation.animation.solid import Solid from adafruit_led_animation.animation.solid import Solid
from adafruit_led_animation.color import BLUE, RED
from adafruit_led_animation.sequence import AnimationSequence from adafruit_led_animation.sequence import AnimationSequence
from adafruit_led_animation.color import RED, BLUE
# Update to match the pin connected to your NeoPixels # Update to match the pin connected to your NeoPixels
pixel_pin = board.D6 pixel_pin = board.D6

View file

@ -8,6 +8,7 @@ the animation permanently when pressed
For NeoPixel FeatherWing. Update pixel_pin and pixel_num to match your wiring if using For NeoPixel FeatherWing. Update pixel_pin and pixel_num to match your wiring if using
a different form of NeoPixels. a different form of NeoPixels.
""" """
import board import board
import neopixel import neopixel
from digitalio import DigitalInOut, Direction, Pull from digitalio import DigitalInOut, Direction, Pull

View file

@ -10,19 +10,18 @@ pixel objects such as the built-in NeoPixels on a Circuit Playground Bluefruit a
This example is written for Circuit Playground Bluefruit and a 30-pixel NeoPixel strip connected to This example is written for Circuit Playground Bluefruit and a 30-pixel NeoPixel strip connected to
pad A1. It does not work on Circuit Playground Express. pad A1. It does not work on Circuit Playground Express.
""" """
import board import board
import neopixel import neopixel
from adafruit_circuitplayground import cp from adafruit_circuitplayground import cp
from adafruit_led_animation import color
from adafruit_led_animation.animation.blink import Blink from adafruit_led_animation.animation.blink import Blink
from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.animation.chase import Chase from adafruit_led_animation.animation.chase import Chase
from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.group import AnimationGroup from adafruit_led_animation.group import AnimationGroup
from adafruit_led_animation.sequence import AnimationSequence from adafruit_led_animation.sequence import AnimationSequence
from adafruit_led_animation import color
strip_pixels = neopixel.NeoPixel(board.A1, 30, brightness=0.5, auto_write=False) strip_pixels = neopixel.NeoPixel(board.A1, 30, brightness=0.5, auto_write=False)
cp.pixels.brightness = 0.5 cp.pixels.brightness = 0.5

View file

@ -11,8 +11,10 @@ using a different board or form of NeoPixels.
This example will run on SAMD21 (M0) Express boards (such as Circuit Playground Express or QT Py This example will run on SAMD21 (M0) Express boards (such as Circuit Playground Express or QT Py
Haxpress), but not on SAMD21 non-Express boards (such as QT Py or Trinket). Haxpress), but not on SAMD21 non-Express boards (such as QT Py or Trinket).
""" """
import board import board
import neopixel import neopixel
from adafruit_led_animation.animation.multicolor_comet import MulticolorComet from adafruit_led_animation.animation.multicolor_comet import MulticolorComet
# Update to match the pin connected to your NeoPixels # Update to match the pin connected to your NeoPixels

View file

@ -4,8 +4,10 @@
""" """
This example animates a Pacman on a NeoPixel strip. This example animates a Pacman on a NeoPixel strip.
""" """
import board import board
import neopixel import neopixel
from adafruit_led_animation.animation.pacman import Pacman from adafruit_led_animation.animation.pacman import Pacman
from adafruit_led_animation.color import WHITE from adafruit_led_animation.color import WHITE

View file

@ -11,17 +11,18 @@ will need to alter the PixelMap values as well for this example to work.
This example does not work on SAMD21 (M0) boards. This example does not work on SAMD21 (M0) boards.
""" """
import board import board
import neopixel import neopixel
from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.animation.rainbowcomet import RainbowComet
from adafruit_led_animation.animation.rainbowchase import RainbowChase
from adafruit_led_animation.animation.chase import Chase
from adafruit_led_animation.animation.rainbow import Rainbow
from adafruit_led_animation.sequence import AnimationSequence
from adafruit_led_animation import helper from adafruit_led_animation import helper
from adafruit_led_animation.color import PURPLE, JADE, AMBER from adafruit_led_animation.animation.chase import Chase
from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.animation.rainbow import Rainbow
from adafruit_led_animation.animation.rainbowchase import RainbowChase
from adafruit_led_animation.animation.rainbowcomet import RainbowComet
from adafruit_led_animation.color import AMBER, JADE, PURPLE
from adafruit_led_animation.sequence import AnimationSequence
# Update to match the pin connected to your NeoPixels # Update to match the pin connected to your NeoPixels
pixel_pin = board.D6 pixel_pin = board.D6
@ -37,17 +38,11 @@ pixel_wing_horizontal = helper.PixelMap.horizontal_lines(
pixels, 8, 4, helper.horizontal_strip_gridmap(8, alternating=False) pixels, 8, 4, helper.horizontal_strip_gridmap(8, alternating=False)
) )
comet_h = Comet( comet_h = Comet(pixel_wing_horizontal, speed=0.1, color=PURPLE, tail_length=3, bounce=True)
pixel_wing_horizontal, speed=0.1, color=PURPLE, tail_length=3, bounce=True
)
comet_v = Comet(pixel_wing_vertical, speed=0.1, color=AMBER, tail_length=6, bounce=True) comet_v = Comet(pixel_wing_vertical, speed=0.1, color=AMBER, tail_length=6, bounce=True)
chase_h = Chase(pixel_wing_horizontal, speed=0.1, size=3, spacing=6, color=JADE) chase_h = Chase(pixel_wing_horizontal, speed=0.1, size=3, spacing=6, color=JADE)
rainbow_chase_v = RainbowChase( rainbow_chase_v = RainbowChase(pixel_wing_vertical, speed=0.1, size=3, spacing=2, step=8)
pixel_wing_vertical, speed=0.1, size=3, spacing=2, step=8 rainbow_comet_v = RainbowComet(pixel_wing_vertical, speed=0.1, tail_length=7, bounce=True)
)
rainbow_comet_v = RainbowComet(
pixel_wing_vertical, speed=0.1, tail_length=7, bounce=True
)
rainbow_v = Rainbow(pixel_wing_vertical, speed=0.1, period=2) rainbow_v = Rainbow(pixel_wing_vertical, speed=0.1, period=2)
rainbow_chase_h = RainbowChase(pixel_wing_horizontal, speed=0.1, size=3, spacing=3) rainbow_chase_h = RainbowChase(pixel_wing_horizontal, speed=0.1, size=3, spacing=3)

View file

@ -10,6 +10,7 @@ a different form of NeoPixels.
This example does not work on SAMD21 (M0) boards. This example does not work on SAMD21 (M0) boards.
""" """
import board import board
import neopixel import neopixel

View file

@ -8,6 +8,7 @@ the animation when pressed
For NeoPixel FeatherWing. Update pixel_pin and pixel_num to match your wiring if using For NeoPixel FeatherWing. Update pixel_pin and pixel_num to match your wiring if using
a different form of NeoPixels. a different form of NeoPixels.
""" """
import board import board
import neopixel import neopixel
from digitalio import DigitalInOut, Direction, Pull from digitalio import DigitalInOut, Direction, Pull

View file

@ -16,9 +16,11 @@ using a different board or form of NeoPixels.
This example will run on SAMD21 (M0) Express boards (such as Circuit Playground Express or QT Py This example will run on SAMD21 (M0) Express boards (such as Circuit Playground Express or QT Py
Haxpress), but not on SAMD21 non-Express boards (such as QT Py or Trinket). Haxpress), but not on SAMD21 non-Express boards (such as QT Py or Trinket).
""" """
import time import time
import microcontroller
import board import board
import microcontroller
import neopixel import neopixel
from adafruit_led_animation.animation.comet import Comet from adafruit_led_animation.animation.comet import Comet
@ -37,4 +39,4 @@ while True:
comet.animate() comet.animate()
if time.monotonic() > 3600: # After an hour passes, reset the board. if time.monotonic() > 3600: # After an hour passes, reset the board.
microcontroller.reset() # pylint: disable=no-member microcontroller.reset()

View file

@ -8,14 +8,15 @@ interval.
For NeoPixel FeatherWing. Update pixel_pin and pixel_num to match your wiring if using For NeoPixel FeatherWing. Update pixel_pin and pixel_num to match your wiring if using
a different form of NeoPixels. a different form of NeoPixels.
""" """
import board import board
import neopixel import neopixel
from adafruit_led_animation.animation.blink import Blink from adafruit_led_animation.animation.blink import Blink
from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.animation.chase import Chase from adafruit_led_animation.animation.chase import Chase
from adafruit_led_animation.animation.comet import Comet
from adafruit_led_animation.color import AMBER, JADE, PURPLE
from adafruit_led_animation.sequence import AnimationSequence from adafruit_led_animation.sequence import AnimationSequence
from adafruit_led_animation.color import PURPLE, AMBER, JADE
# Update to match the pin connected to your NeoPixels # Update to match the pin connected to your NeoPixels
pixel_pin = board.D6 pixel_pin = board.D6

View file

@ -7,8 +7,10 @@ This simpletest example displays the Blink animation.
For NeoPixel FeatherWing. Update pixel_pin and pixel_num to match your wiring if using For NeoPixel FeatherWing. Update pixel_pin and pixel_num to match your wiring if using
a different form of NeoPixels. a different form of NeoPixels.
""" """
import board import board
import neopixel import neopixel
from adafruit_led_animation.animation.blink import Blink from adafruit_led_animation.animation.blink import Blink
from adafruit_led_animation.color import RED from adafruit_led_animation.color import RED

View file

@ -8,13 +8,14 @@ interval.
For NeoPixel FeatherWing. Update pixel_pin and pixel_num to match your wiring if using For NeoPixel FeatherWing. Update pixel_pin and pixel_num to match your wiring if using
a different form of NeoPixels. a different form of NeoPixels.
""" """
import board import board
import neopixel import neopixel
from adafruit_led_animation.animation.sparkle import Sparkle from adafruit_led_animation.animation.sparkle import Sparkle
from adafruit_led_animation.animation.sparklepulse import SparklePulse from adafruit_led_animation.animation.sparklepulse import SparklePulse
from adafruit_led_animation.sequence import AnimationSequence
from adafruit_led_animation.color import AMBER, JADE from adafruit_led_animation.color import AMBER, JADE
from adafruit_led_animation.sequence import AnimationSequence
# Update to match the pin connected to your NeoPixels # Update to match the pin connected to your NeoPixels
pixel_pin = board.D6 pixel_pin = board.D6

View file

@ -7,12 +7,13 @@ interval.
For NeoPixel FeatherWing. Update pixel_pin and pixel_num to match your wiring if using For NeoPixel FeatherWing. Update pixel_pin and pixel_num to match your wiring if using
a different form of NeoPixels. a different form of NeoPixels.
""" """
import board import board
import neopixel import neopixel
from adafruit_led_animation.animation.sparkle import Sparkle from adafruit_led_animation.animation.sparkle import Sparkle
from adafruit_led_animation.color import AQUA, JADE, PINK
from adafruit_led_animation.sequence import AnimationSequence from adafruit_led_animation.sequence import AnimationSequence
from adafruit_led_animation.color import JADE, AQUA, PINK
# Update to match the pin connected to your NeoPixels # Update to match the pin connected to your NeoPixels
pixel_pin = board.A1 pixel_pin = board.A1

View file

@ -4,13 +4,15 @@
""" """
Example for TimedSequence Example for TimedSequence
""" """
import board import board
import neopixel import neopixel
from adafruit_led_animation.timedsequence import TimedAnimationSequence
import adafruit_led_animation.animation.blink as blink_animation
import adafruit_led_animation.animation.comet as comet_animation import adafruit_led_animation.animation.comet as comet_animation
import adafruit_led_animation.animation.sparkle as sparkle_animation import adafruit_led_animation.animation.sparkle as sparkle_animation
import adafruit_led_animation.animation.blink as blink_animation
from adafruit_led_animation import color from adafruit_led_animation import color
from adafruit_led_animation.timedsequence import TimedAnimationSequence
strip_pixels = neopixel.NeoPixel(board.D6, 32, brightness=0.1, auto_write=False) strip_pixels = neopixel.NeoPixel(board.D6, 32, brightness=0.1, auto_write=False)
blink = blink_animation.Blink(strip_pixels, 0.3, color.RED) blink = blink_animation.Blink(strip_pixels, 0.3, color.RED)

View file

@ -3,9 +3,11 @@
# SPDX-License-Identifier: MIT # SPDX-License-Identifier: MIT
"""Volume Animation Example""" """Volume Animation Example"""
import board import board
from audiomp3 import MP3Decoder
import neopixel import neopixel
from audiomp3 import MP3Decoder
from adafruit_led_animation.animation import volume from adafruit_led_animation.animation import volume
try: try:

108
ruff.toml Normal file
View file

@ -0,0 +1,108 @@
# SPDX-FileCopyrightText: 2024 Tim Cocks for Adafruit Industries
#
# SPDX-License-Identifier: MIT
target-version = "py38"
line-length = 100
[lint]
preview = true
select = ["I", "PL", "UP"]
extend-select = [
"D419", # empty-docstring
"E501", # line-too-long
"W291", # trailing-whitespace
"PLC0414", # useless-import-alias
"PLC2401", # non-ascii-name
"PLC2801", # unnecessary-dunder-call
"PLC3002", # unnecessary-direct-lambda-call
"E999", # syntax-error
"PLE0101", # return-in-init
"F706", # return-outside-function
"F704", # yield-outside-function
"PLE0116", # continue-in-finally
"PLE0117", # nonlocal-without-binding
"PLE0241", # duplicate-bases
"PLE0302", # unexpected-special-method-signature
"PLE0604", # invalid-all-object
"PLE0605", # invalid-all-format
"PLE0643", # potential-index-error
"PLE0704", # misplaced-bare-raise
"PLE1141", # dict-iter-missing-items
"PLE1142", # await-outside-async
"PLE1205", # logging-too-many-args
"PLE1206", # logging-too-few-args
"PLE1307", # bad-string-format-type
"PLE1310", # bad-str-strip-call
"PLE1507", # invalid-envvar-value
"PLE2502", # bidirectional-unicode
"PLE2510", # invalid-character-backspace
"PLE2512", # invalid-character-sub
"PLE2513", # invalid-character-esc
"PLE2514", # invalid-character-nul
"PLE2515", # invalid-character-zero-width-space
"PLR0124", # comparison-with-itself
"PLR0202", # no-classmethod-decorator
"PLR0203", # no-staticmethod-decorator
"UP004", # useless-object-inheritance
"PLR0206", # property-with-parameters
"PLR0904", # too-many-public-methods
"PLR0911", # too-many-return-statements
"PLR0912", # too-many-branches
"PLR0913", # too-many-arguments
"PLR0914", # too-many-locals
"PLR0915", # too-many-statements
"PLR0916", # too-many-boolean-expressions
"PLR1702", # too-many-nested-blocks
"PLR1704", # redefined-argument-from-local
"PLR1711", # useless-return
"C416", # unnecessary-comprehension
"PLR1733", # unnecessary-dict-index-lookup
"PLR1736", # unnecessary-list-index-lookup
# ruff reports this rule is unstable
#"PLR6301", # no-self-use
"PLW0108", # unnecessary-lambda
"PLW0120", # useless-else-on-loop
"PLW0127", # self-assigning-variable
"PLW0129", # assert-on-string-literal
"B033", # duplicate-value
"PLW0131", # named-expr-without-context
"PLW0245", # super-without-brackets
"PLW0406", # import-self
"PLW0602", # global-variable-not-assigned
"PLW0603", # global-statement
"PLW0604", # global-at-module-level
# fails on the try: import typing used by libraries
#"F401", # unused-import
"F841", # unused-variable
"E722", # bare-except
"PLW0711", # binary-op-exception
"PLW1501", # bad-open-mode
"PLW1508", # invalid-envvar-default
"PLW1509", # subprocess-popen-preexec-fn
"PLW2101", # useless-with-lock
"PLW3301", # nested-min-max
]
ignore = [
"PLR2004", # magic-value-comparison
"UP030", # format literals
"PLW1514", # unspecified-encoding
"PLR0913", # too-many-arguments
"PLR0915", # too-many-statements
"PLR0917", # too-many-positional-arguments
"PLR0904", # too-many-public-methods
"PLR0912", # too-many-branches
"PLR0916", # too-many-boolean-expressions
"PLR6301", # could-be-static no-self-use
"PLC0415", # import outside toplevel
"PLC2701", # private import
]
[format]
line-ending = "lf"