Initial commit

This commit is contained in:
Fabian Müller 2024-04-14 20:53:03 +02:00
commit 106b8d7eac
8 changed files with 615 additions and 0 deletions

2
.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
__pycache__/
*.py[c|o]

7
LICENSE.txt Normal file
View File

@ -0,0 +1,7 @@
Copyright 2024 Fabian Müller <fabian@fablab-altmuehlfranken.de>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

1
README.md Normal file
View File

@ -0,0 +1 @@
# LED Marquee Sign Client

View File

View File

@ -0,0 +1,362 @@
import enum
import string
import warnings
class DefaultEnum(enum.Enum):
@staticmethod
def default():
raise NotImplementedError
class FontType(DefaultEnum):
Font5x6Short = "q"
Font5x11ShortAndWide = "r"
Font7x6Default = "s"
Font7x11Wide = "t"
Font7x9 = "u"
Font7x17ExtraWide = "v"
FontSmallFont = "w"
def __str__(self):
return f"\\{self.value}"
@staticmethod
def default():
return FontType.Font7x6Default
class Brightness(DefaultEnum):
Normal = "a"
Bright = "b"
def __str__(self):
return f"\\{self.value}"
@staticmethod
def default():
return Brightness.Bright
class Transition(DefaultEnum):
Cyclic = "A"
Immediate = "B"
OpenFromRight = "C"
OpenFromLeft = "D"
OpenFromCenter = "E"
OpenToCenter = "F"
CoverFromCenter = "G"
CoverFromRight = "H"
CoverFromLeft = "I"
CoverToCenter = "J"
ScrollUp = "K"
ScrollDown = "L"
InterlaceToCenter = "M"
InterlaceCover = "N"
CoverUp = "O"
CoverDown = "P"
ScanLine = "Q"
Explode = "R"
PacMan = "S"
FallAndStack = "T"
Shoot = "U"
Flash = "V"
Random = "W"
SlideIn = "X"
def __str__(self):
return self.value
@staticmethod
def default():
return Transition.Cyclic
# macros are literal characters prefixed by ^
class Macro(enum.Enum):
CurrentTime12hWithoutAmPm = "D"
CurrentTime12hWithAmPm = "E"
CurrentTime24h = "F"
CurrentDateMmDdYyyy = "A"
CurrentDateYyyy_Mm_Dd = "B"
CurrentDateMm_Dd_Yyyy = "C"
CurrentDateDd_Mm_Yyyy = "a"
Beep1 = "q"
Beep2 = "r"
Beep3 = "s"
Temperature = "H"
def __str__(self):
return f"^{self.value}"
# symbols should be inserted as string representations of their numeric value prefixed by ^
class Symbol(enum.Enum):
Sun = 66
CloudOrWind = 67
UmbrellaRaining = 68
WallClock = 69
Telephone = 70
Glasses = 71
Faucet = 72
RocketOrSyringeOrSo = 73
WhatTheHell = 74
Key = 75
Shirt = 76
Helicopter = 77
Car = 78
Tank = 79
House = 80
Teapot = 81
Trees = 82
Duck = 83
Scooter = 84
Bicycle = 85
Crown = 86
AppleOrSo = 87
ArrowRight = 88
ArrowLeft = 89
ArrowDownLeft = 90
ArrowUpLeft = 91
Cup = 92
Chair = 93
HighHeel = 94
PrizeCup = 95
def __str__(self):
return f"^{self.value}"
# cartoons are represented as these characters prefixed by ^
class Cartoon(enum.Enum):
MerryXMas = "i"
HappyNewYear = "j"
FourthOfJuly = "k"
HappyEaster = "l"
HappyHalloween = "m"
DontDrinkAndDrive = "n"
NoSmoking = "o"
Welcome = "p"
def __str__(self):
return f"^{self.value}"
# the descriptions originate from the UTF-16 specification, https://www.ssec.wisc.edu/~tomw/java/unicode.html
# the extended charset starts where ASCII ends enum
class ExtendedChar(enum.Enum):
# Ç
LatinCapitalLetterCWithCedilla = 0x80
# ü
LatinSmallLetterUWithDiaeresis = 0x81
# é
LatinSmallLetterEWithAcute = 0x82
# â
LatinSmallLetterAWithCircumflex = 0x83
# ä
LatinSmallLetterAWithDiaeresis = 0x84
# á
LatinSmallLetterAWithGrave = 0x85
# å
LatinSmallLetterAWithRingAbove = 0x86
# ç
LatinSmallLetterCWithCedilla = 0x87
# ê
LatinSmallLetterEWithCircumflex = 0x88
# ë
LatinSmallLetterEWithDiaeresis = 0x89
# è
LatinSmallLetterEWithGrave = 0x8A
# Ï
LatinCapitalLetterIWithDiaeresis = 0x8B
# Î
LatinCapitalLetterIWithCircumflex = 0x8C
# Ì
LatinCapitalLetterIWithGrave = 0x8D
# Ä
LatinCapitalLetterAWithDiaeresis = 0x8F
# Å
LatinCapitalLetterAWithRingAbove = 0x8F
# É
LatinCapitalLetterEWithAcute = 0x90
# æ
LatinSmallLetterAe = 0x91
# Æ
LatinCapitalLetterAe = 0x92
# ô
LatinSmallLetterOWithCircumflex = 0x93
# ö
LatinSmallLetterOWithDiaeresis = 0x94
# ò
LatinSmallLetterOWithGrave = 0x95
# û
LatinSmallLetterUWithCircumflex = 0x96
# ù
LatinSmallLetterUWithGrave = 0x97
# ÿ
LatinSmallLetterYWithDiaeresis = 0x98
# Ö
LatinCapitalLLetterOWithDiaeresis = 0x99
# Ü
LatinCapitalLetterUWithDiaeresis = 0x9A
# ¢
CentSign = 0x9B
# £
PoundSign = 0x9C
# ¥
YenSign = 0x9D
# urm...
UnknownPCurrencySign = 0x9E
# ƒ
LatinSmallLetterFWithHook = 0x9F
# á
LatinSmallLetterAWithAcute = 0xA0
# Í
LatinCapitalLetterIWithAcute = 0xA1
# Ó
LatinCapitalLetterOWithAcute = 0xA2
# ú
LatinSmallLetterUWithAcute = 0xA3
# ñ
LatinSmallLetterNWithTilde = 0xA4
# Ñ
LatinCapitalLetterNWithTilde = 0xA5
# a̱
LatinSmallLetterAWithMacronBelow = 0xA6
# couldn't find that one in the UTF-16 table
LatinSmallLetterOWithMacronBelow = 0xA7
# ¿
InvertedQuestionMark = 0xA8
# you can probably imagine what it'll look like
LatinCapitalLetterZWithRingAbove = 0xA9
# Ź
LatinCapitalLetterZWithAcute = 0xAA
# ń
LatinSmallLetterNWithAcute = 0xAB
# some weird L with a diagonal line
AnotherWeirdSign = 0xAC
# Ś or ś can't tell for sure let's assume capital
LatinCapitalLetterSWithAcute = 0xAB
# Ć
LatinCapitalLetterCWithAcute = 0xAC
# ȩ
LatinSmallLetterEWithCedilla = 0xAD
# well you can imagine what it'll look like
LatinSmallLetterAWithCedilla = 0xB0
# €
EuroSign = 0xB1
# E with some vertical line below
LatinCapitalLetterEWithSomeLineBelow = 0xB3
# a with some vertical line below
LatinSmallLetterAWithSomeWeirdLineBelow = 0xB4
# α
GreekSmallLetterAlpha = 0xE0
# β
GreekSmallLetterBeta = 0xE1
# Γ
GreekCapitalLetterGamma = 0xE2
# π
GreekSmallLetterPi = 0xE3
# Σ
GreekCapitalLetterSigma = 0xE4
# σ
GreekSmallLetterSigma = 0xE5
# μ
GreekSmallLetterMu = 0xE6
# τ
GreekSmallLetterTau = 0xE7
# Φ
GreekCapitalLetterPhi = 0xE8
# θ
GreekSmallLetterTheta = 0xE9
# Ω
GreekCapitalLetterOmega = 0xEA
# δ
GreekSmallLetterDelta = 0xEB
# ∞
Infinity = 0xEC
# φ
GreekSmallLetterPhi = 0xED
def __str__(self):
return chr(self.value)
@staticmethod
def translateUtf16(input):
table = {
"Ç": ExtendedChar.LatinCapitalLetterCWithCedilla,
"ü": ExtendedChar.LatinSmallLetterUWithDiaeresis,
"é": ExtendedChar.LatinSmallLetterEWithAcute,
"â": ExtendedChar.LatinSmallLetterAWithCircumflex,
"ä": ExtendedChar.LatinSmallLetterAWithDiaeresis,
"à": ExtendedChar.LatinSmallLetterAWithGrave,
"å": ExtendedChar.LatinSmallLetterAWithRingAbove,
"ç": ExtendedChar.LatinSmallLetterCWithCedilla,
"ê": ExtendedChar.LatinSmallLetterEWithCircumflex,
"ë": ExtendedChar.LatinSmallLetterEWithDiaeresis,
"è": ExtendedChar.LatinSmallLetterEWithGrave,
"Ï": ExtendedChar.LatinCapitalLetterIWithDiaeresis,
"Î": ExtendedChar.LatinCapitalLetterIWithCircumflex,
"Ì": ExtendedChar.LatinCapitalLetterIWithGrave,
"Ä": ExtendedChar.LatinCapitalLetterAWithDiaeresis,
"Å": ExtendedChar.LatinCapitalLetterAWithRingAbove,
"É": ExtendedChar.LatinCapitalLetterEWithAcute,
"æ": ExtendedChar.LatinSmallLetterAe,
"Æ": ExtendedChar.LatinCapitalLetterAe,
"ô": ExtendedChar.LatinSmallLetterOWithCircumflex,
"ö": ExtendedChar.LatinSmallLetterOWithDiaeresis,
"ò": ExtendedChar.LatinSmallLetterOWithGrave,
"û": ExtendedChar.LatinSmallLetterUWithCircumflex,
"ù": ExtendedChar.LatinSmallLetterUWithGrave,
"ÿ": ExtendedChar.LatinSmallLetterYWithDiaeresis,
"Ö": ExtendedChar.LatinCapitalLLetterOWithDiaeresis,
"Ü": ExtendedChar.LatinCapitalLetterUWithDiaeresis,
"¢": ExtendedChar.CentSign,
"£": ExtendedChar.PoundSign,
"¥": ExtendedChar.YenSign,
"ƒ": ExtendedChar.LatinSmallLetterFWithHook,
"á": ExtendedChar.LatinSmallLetterAWithAcute,
"Í": ExtendedChar.LatinCapitalLetterIWithAcute,
"Ó": ExtendedChar.LatinCapitalLetterOWithAcute,
"ú": ExtendedChar.LatinSmallLetterUWithAcute,
"ñ": ExtendedChar.LatinSmallLetterNWithTilde,
"Ñ": ExtendedChar.LatinCapitalLetterNWithTilde,
"¿": ExtendedChar.InvertedQuestionMark,
"Ź": ExtendedChar.LatinCapitalLetterZWithAcute,
"ń": ExtendedChar.LatinSmallLetterNWithAcute,
"Ś": ExtendedChar.LatinCapitalLetterSWithAcute,
"Ć": ExtendedChar.LatinCapitalLetterCWithAcute,
"ȩ": ExtendedChar.LatinSmallLetterEWithCedilla,
"": ExtendedChar.EuroSign,
"α": ExtendedChar.GreekSmallLetterAlpha,
"β": ExtendedChar.GreekSmallLetterBeta,
"Γ": ExtendedChar.GreekCapitalLetterGamma,
"π": ExtendedChar.GreekSmallLetterPi,
"Σ": ExtendedChar.GreekCapitalLetterSigma,
"σ": ExtendedChar.GreekSmallLetterSigma,
"μ": ExtendedChar.GreekSmallLetterMu,
"τ": ExtendedChar.GreekSmallLetterTau,
"Φ": ExtendedChar.GreekCapitalLetterPhi,
"θ": ExtendedChar.GreekSmallLetterTheta,
"Ω": ExtendedChar.GreekCapitalLetterOmega,
"δ": ExtendedChar.GreekSmallLetterDelta,
"": ExtendedChar.Infinity,
"φ": ExtendedChar.GreekSmallLetterPhi,
}
output = []
supported_ascii = set(
string.ascii_letters + string.digits + "^°!\"§$%&/()=?\\+*#'-_.:,;<>|@ "
)
for char in input:
if char in supported_ascii:
output.append(char)
continue
try:
output.append(table[char])
except KeyError:
warnings.warn(f"Could not translate unknown character {char}")
return "".join((str(i) for i in output))

View File

@ -0,0 +1,62 @@
from led_marquee_sign_client.enums import *
class Line:
"""
Builds a line step for the sign step by step. Renders into a formatted string.
"""
def __init__(
self,
transition: Transition = Transition.default(),
brightness: Brightness = Brightness.default(),
font_type: FontType = FontType.default(),
):
# every line may have just one transition method
# we make it a public property
self.transition = transition
# our internal state
self._data = []
# every line has an initial brightness and font type set
# these can be changed at any time
self.add(brightness)
self.add(font_type)
def add(
self,
data: str | FontType | Brightness | Macro | Symbol | Cartoon | ExtendedChar,
):
if isinstance(data, str):
data = ExtendedChar.translateUtf16(data)
self._data.append(data)
return self
def __str__(self):
components = [str(self.transition)]
components += map(str, self._data)
components.append("\r")
return "".join(components)
class Message:
"""
Builds a message for the sign step by step. Renders into a formatted string.
"""
def __init__(self, address: int = 128):
self.address = address
self._lines = []
def add(self, line: Line):
self._lines.append(line)
return self
def __str__(self):
components = [f"~{self.address}~f01"]
components += self._lines
components.append("\r\r\r")
return "".join(map(str, components))

161
poetry.lock generated Normal file
View File

@ -0,0 +1,161 @@
# This file is automatically @generated by Poetry 1.5.0 and should not be changed by hand.
[[package]]
name = "black"
version = "24.4.0"
description = "The uncompromising code formatter."
optional = false
python-versions = ">=3.8"
files = [
{file = "black-24.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6ad001a9ddd9b8dfd1b434d566be39b1cd502802c8d38bbb1ba612afda2ef436"},
{file = "black-24.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e3a3a092b8b756c643fe45f4624dbd5a389f770a4ac294cf4d0fce6af86addaf"},
{file = "black-24.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae79397f367ac8d7adb6c779813328f6d690943f64b32983e896bcccd18cbad"},
{file = "black-24.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:71d998b73c957444fb7c52096c3843875f4b6b47a54972598741fe9a7f737fcb"},
{file = "black-24.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8e5537f456a22cf5cfcb2707803431d2feeb82ab3748ade280d6ccd0b40ed2e8"},
{file = "black-24.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:64e60a7edd71fd542a10a9643bf369bfd2644de95ec71e86790b063aa02ff745"},
{file = "black-24.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5cd5b4f76056cecce3e69b0d4c228326d2595f506797f40b9233424e2524c070"},
{file = "black-24.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:64578cf99b6b46a6301bc28bdb89f9d6f9b592b1c5837818a177c98525dbe397"},
{file = "black-24.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f95cece33329dc4aa3b0e1a771c41075812e46cf3d6e3f1dfe3d91ff09826ed2"},
{file = "black-24.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4396ca365a4310beef84d446ca5016f671b10f07abdba3e4e4304218d2c71d33"},
{file = "black-24.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44d99dfdf37a2a00a6f7a8dcbd19edf361d056ee51093b2445de7ca09adac965"},
{file = "black-24.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:21f9407063ec71c5580b8ad975653c66508d6a9f57bd008bb8691d273705adcd"},
{file = "black-24.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:652e55bb722ca026299eb74e53880ee2315b181dfdd44dca98e43448620ddec1"},
{file = "black-24.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7f2966b9b2b3b7104fca9d75b2ee856fe3fdd7ed9e47c753a4bb1a675f2caab8"},
{file = "black-24.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bb9ca06e556a09f7f7177bc7cb604e5ed2d2df1e9119e4f7d2f1f7071c32e5d"},
{file = "black-24.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:d4e71cdebdc8efeb6deaf5f2deb28325f8614d48426bed118ecc2dcaefb9ebf3"},
{file = "black-24.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6644f97a7ef6f401a150cca551a1ff97e03c25d8519ee0bbc9b0058772882665"},
{file = "black-24.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:75a2d0b4f5eb81f7eebc31f788f9830a6ce10a68c91fbe0fade34fff7a2836e6"},
{file = "black-24.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb949f56a63c5e134dfdca12091e98ffb5fd446293ebae123d10fc1abad00b9e"},
{file = "black-24.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:7852b05d02b5b9a8c893ab95863ef8986e4dda29af80bbbda94d7aee1abf8702"},
{file = "black-24.4.0-py3-none-any.whl", hash = "sha256:74eb9b5420e26b42c00a3ff470dc0cd144b80a766128b1771d07643165e08d0e"},
{file = "black-24.4.0.tar.gz", hash = "sha256:f07b69fda20578367eaebbd670ff8fc653ab181e1ff95d84497f9fa20e7d0641"},
]
[package.dependencies]
click = ">=8.0.0"
mypy-extensions = ">=0.4.3"
packaging = ">=22.0"
pathspec = ">=0.9.0"
platformdirs = ">=2"
tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""}
typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""}
[package.extras]
colorama = ["colorama (>=0.4.3)"]
d = ["aiohttp (>=3.7.4)", "aiohttp (>=3.7.4,!=3.9.0)"]
jupyter = ["ipython (>=7.8.0)", "tokenize-rt (>=3.2.0)"]
uvloop = ["uvloop (>=0.15.2)"]
[[package]]
name = "click"
version = "8.1.7"
description = "Composable command line interface toolkit"
optional = false
python-versions = ">=3.7"
files = [
{file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"},
{file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"},
]
[package.dependencies]
colorama = {version = "*", markers = "platform_system == \"Windows\""}
[[package]]
name = "colorama"
version = "0.4.6"
description = "Cross-platform colored terminal text."
optional = false
python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
files = [
{file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
{file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
]
[[package]]
name = "isort"
version = "5.13.2"
description = "A Python utility / library to sort Python imports."
optional = false
python-versions = ">=3.8.0"
files = [
{file = "isort-5.13.2-py3-none-any.whl", hash = "sha256:8ca5e72a8d85860d5a3fa69b8745237f2939afe12dbf656afbcb47fe72d947a6"},
{file = "isort-5.13.2.tar.gz", hash = "sha256:48fdfcb9face5d58a4f6dde2e72a1fb8dcaf8ab26f95ab49fab84c2ddefb0109"},
]
[package.extras]
colors = ["colorama (>=0.4.6)"]
[[package]]
name = "mypy-extensions"
version = "1.0.0"
description = "Type system extensions for programs checked with the mypy type checker."
optional = false
python-versions = ">=3.5"
files = [
{file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"},
{file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"},
]
[[package]]
name = "packaging"
version = "24.0"
description = "Core utilities for Python packages"
optional = false
python-versions = ">=3.7"
files = [
{file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"},
{file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"},
]
[[package]]
name = "pathspec"
version = "0.12.1"
description = "Utility library for gitignore style pattern matching of file paths."
optional = false
python-versions = ">=3.8"
files = [
{file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"},
{file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"},
]
[[package]]
name = "platformdirs"
version = "4.2.0"
description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"."
optional = false
python-versions = ">=3.8"
files = [
{file = "platformdirs-4.2.0-py3-none-any.whl", hash = "sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068"},
{file = "platformdirs-4.2.0.tar.gz", hash = "sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768"},
]
[package.extras]
docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"]
test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"]
[[package]]
name = "tomli"
version = "2.0.1"
description = "A lil' TOML parser"
optional = false
python-versions = ">=3.7"
files = [
{file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"},
{file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"},
]
[[package]]
name = "typing-extensions"
version = "4.11.0"
description = "Backported and Experimental Type Hints for Python 3.8+"
optional = false
python-versions = ">=3.8"
files = [
{file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"},
{file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"},
]
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
content-hash = "87369892f1edede3117713c7ae1916ea9b1bca2267adaec8e61722ec275f2e91"

20
pyproject.toml Normal file
View File

@ -0,0 +1,20 @@
[tool.poetry]
name = "led-marquee-sign-client"
version = "0.0.1"
description = ""
authors = ["Fabian Müller <fabian@fablab-altmuehlfranken.de>"]
license = "0BSD"
readme = "README.md"
packages = [{include = "led_marquee_sign_client"}]
[tool.poetry.dependencies]
python = "^3.10"
[tool.poetry.group.dev.dependencies]
black = "^24.4.0"
isort = "^5.13.2"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"