23 Commits

Author SHA1 Message Date
2462a081bf Add a documentation string for the module cli. 2025-01-28 15:30:09 -05:00
1f489a1ae9 Tweaks. 2025-01-28 15:23:04 -05:00
8ce9a8ffeb Move the command line into the main package directory.
The recommendation is that you put you cli script into the package
itself and add in an entry to that module as an entrypoint.
2025-01-28 15:22:07 -05:00
d8395c12e2 Add some things into the file. 2025-01-28 15:21:30 -05:00
3e1c8a2829 Drop the setup.py file if we can. 2025-01-28 15:20:53 -05:00
75199dfe0e Version bump. 2025-01-28 07:49:54 -05:00
160c40e931 Modified lock file. 2025-01-28 04:07:37 -05:00
47c626b420 Add more dynamically computed fields.
That said, let's use the old file for some of the computed fields for
the time being.
2025-01-28 04:06:00 -05:00
f509d89d90 Drop the warning about the dependencies being overwritten.
The pyproject.toml file is the place where things are being migrated
too so it was a bit reduntant.
2025-01-28 04:04:59 -05:00
39a918f74b My testing work with uv.
This seems to be building.
2025-01-24 12:20:41 -05:00
Storm Dragon
71d92e9702 Merged changes from master. 2025-01-08 20:28:16 -05:00
Storm Dragon
ed918a0334 Forgot to push one of the punctuation files.
?
2025-01-08 20:26:46 -05:00
Storm Dragon
760b873abe Updated emoticon handling to make it more accurate, fewer false positives. 2025-01-04 21:57:12 -05:00
Storm Dragon
46c348634c Post release switch code name back to master. 2024-12-21 18:01:42 -05:00
Storm Dragon
9da925c80d Fixed merge conflict. 2024-12-21 17:52:38 -05:00
Storm Dragon
9c45ca1b5f Fixed bug in Fenrir configuration tool. 2024-12-21 17:46:23 -05:00
Storm Dragon
d1be848ebb Merge branch 'testing' got rid of the scm dependency." 2024-12-20 14:11:51 -05:00
Storm Dragon
bc4319bf5e Forgot to get rid of the scm stuff since moving back to setup.py. 2024-12-20 14:08:25 -05:00
Storm Dragon
6f8139ed8f Change codename to stable for tag. 2024-12-20 13:33:23 -05:00
Storm Dragon
f1a6c75459 Merged setup fixes to master. Went back to setup.py just with some updates to minimize python's grumbling. Also, merged the locale setup. 2024-12-20 12:50:32 -05:00
Storm Dragon
1d746eb709 Minimal pyproject.tmol added. 2024-12-20 12:30:56 -05:00
Storm Dragon
80f549fde9 Hopefully final fix to setup. 2024-12-20 12:24:52 -05:00
Storm Dragon
9f57f7faec Revert back to setup.py because it worked. 2024-12-20 12:19:09 -05:00
16 changed files with 520 additions and 275 deletions

1
.python-version Normal file
View File

@@ -0,0 +1 @@
3.13

View File

@@ -46,28 +46,33 @@ _:===:Lienie unten
[customDict] [customDict]
[emoticonDict] [emoticonDict]
# This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc. regex;(?:^|\s)(?::-\)|:\))(?:\s|$):===:smile
regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves regex;(?:^|\s)(?::-\(|:\()(?:\s|$):===:frown
regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses regex;(?:^|\s)(?::-D|:D)(?:\s|$):===:big grin
regex;[\s*|'|"][\s*|'|"]:-/:===:confused regex;(?:^|\s)(?:;-\)|;\))(?:\s|$):===:wink
regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged regex;(?:^|\s)(?::-P|:P)(?:\s|$):===:tongue out
regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing regex;(?:^|\s)(?::-O|:O)(?:\s|$):===:surprised
regex;[\s*|'|"][\s*|'|"]8-X:===:skull regex;(?:^|\s)(?::-/|:/)(?:\s|$):===:skeptical
regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile regex;(?:^|\s)(?:>:-\(|>:\()(?:\s|$):===:angry
regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile regex;(?:^|\s)(?::'\(|:'-\()(?:\s|$):===:crying
regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray regex;(?:^|\s)(?::-\||:\|)(?:\s|$):===:neutral
regex;[\s*|'|"][\s*|'|"]:/:===:confused regex;(?:^|\s)(?:8-\)|B-\))(?:\s|$):===:cool
regex;[\s*|'|"][\s*|'|"]8\):===:smile with sunglasses regex;(?:^|\s)8-X(?:\s|$):===:skull and crossbones
regex;[\s*|'|"]:D[\s*|'|"]:===:laugh regex;(?:^|\s)(?:X-X|x-x)(?:\s|$):===:knocked out
regex;[\s*|'|"];\)[\s*|'|"]:===:wink regex;(?:^|\s)(?::-X|:-x|:X|:x)(?:\s|$):===:lips sealed
regex;[\s*|'|"]XD[\s*|'|"]:===:LOL regex;(?:^|\s)XD(?:\s|$):===:laughing hard
regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile regex;(?:^|\s)\^_\^(?:\s|$):===:happy
regex;[\s*|'|"]:\)[\s*|'|"]:===:smile regex;(?:^|\s)-_-(?:\s|$):===:annoyed
regex;[\s*|'|"]->[\s*|'|"]:===:arrow right regex;(?:^|\s)o_O(?:\s|$):===:confused
# example for arrow left regex;(?:^|\s)>_<(?:\s|$):===:frustrated
#(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left regex;(?:^|\s)\\o/(?:\s|$):===:hurray
# or regex;(?:^|\s)<3(?:\s|$):===:heart
#([ |^])<-([ ,.!?$]):===:arrow left\2 regex;(?:^|\s)</3(?:\s|$):===:broken heart
regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left regex;(?:^|\s)(?:Oo|oO)(?:\s|$):===:WTF?
regex;[\s*|'|"][O|o][O|o][\s*|'|"]:===:WTF? regex;(?:^|\s)<{-.-}>(?:\s|$):===:Raves
regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile regex;(?:^|\s)-\.-(?:\s|$):===:bugged
regex;(?:^|\s)>\.<(?:\s|$):===:laughing
regex;(?:^|\s)(?:>:\)|>:-\))(?:\s|$):===:evil smile
regex;(?:^|\s)\^\^(?:\s|$):===:enjoy smile
regex;(?:^|\s)->(?:\s|$):===:arrow right
regex;(?:^|\s)<-(?:\s|$):===:arrow left

View File

@@ -46,27 +46,33 @@ _:===:line
[customDict] [customDict]
[emoticonDict] [emoticonDict]
# This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc. regex;(?:^|\s)(?::-\)|:\))(?:\s|$):===:smile
regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves regex;(?:^|\s)(?::-\(|:\()(?:\s|$):===:frown
regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses regex;(?:^|\s)(?::-D|:D)(?:\s|$):===:big grin
regex;[\s*|'|"][\s*|'|"]:-/:===:confused regex;(?:^|\s)(?:;-\)|;\))(?:\s|$):===:wink
regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged regex;(?:^|\s)(?::-P|:P)(?:\s|$):===:tongue out
regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing regex;(?:^|\s)(?::-O|:O)(?:\s|$):===:surprised
regex;[\s*|'|"][\s*|'|"]8-X:===:skull regex;(?:^|\s)(?::-/|:/)(?:\s|$):===:skeptical
regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile regex;(?:^|\s)(?:>:-\(|>:\()(?:\s|$):===:angry
regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile regex;(?:^|\s)(?::'\(|:'-\()(?:\s|$):===:crying
regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray regex;(?:^|\s)(?::-\||:\|)(?:\s|$):===:neutral
regex;[\s*|'|"][\s*|'|"]:/:===:confused regex;(?:^|\s)(?:8-\)|B-\))(?:\s|$):===:cool
regex;[\s*|'|"]:D[\s*|'|"]:===:laugh regex;(?:^|\s)8-X(?:\s|$):===:skull and crossbones
regex;[\s*|'|"];\)[\s*|'|"]:===:wink regex;(?:^|\s)(?:X-X|x-x)(?:\s|$):===:knocked out
regex;[\s*|'|"]XD[\s*|'|"]:===:LOL regex;(?:^|\s)(?::-X|:-x|:X|:x)(?:\s|$):===:lips sealed
regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile regex;(?:^|\s)XD(?:\s|$):===:laughing hard
regex;[\s*|'|"]:\)[\s*|'|"]:===:smile regex;(?:^|\s)\^_\^(?:\s|$):===:happy
regex;[\s*|'|"]->[\s*|'|"]:===:arrow right regex;(?:^|\s)-_-(?:\s|$):===:annoyed
# example for arrow left regex;(?:^|\s)o_O(?:\s|$):===:confused
#(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left regex;(?:^|\s)>_<(?:\s|$):===:frustrated
# or regex;(?:^|\s)\\o/(?:\s|$):===:hurray
#([ |^])<-([ ,.!?$]):===:arrow left\2 regex;(?:^|\s)<3(?:\s|$):===:heart
regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left regex;(?:^|\s)</3(?:\s|$):===:broken heart
regex;[\s+|'|"](Oo)|(oO)[\s+|'|"]:===:WTF? regex;(?:^|\s)(?:Oo|oO)(?:\s|$):===:WTF?
regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile regex;(?:^|\s)<{-.-}>(?:\s|$):===:Raves
regex;(?:^|\s)-\.-(?:\s|$):===:bugged
regex;(?:^|\s)>\.<(?:\s|$):===:laughing
regex;(?:^|\s)(?:>:\)|>:-\))(?:\s|$):===:evil smile
regex;(?:^|\s)\^\^(?:\s|$):===:enjoy smile
regex;(?:^|\s)->(?:\s|$):===:arrow right
regex;(?:^|\s)<-(?:\s|$):===:arrow left

View File

@@ -46,27 +46,33 @@ _:===:line
[customDict] [customDict]
[emoticonDict] [emoticonDict]
# This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc. regex;(?:^|\s)(?::-\)|:\))(?:\s|$):===:smile
regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves regex;(?:^|\s)(?::-\(|:\()(?:\s|$):===:frown
regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses regex;(?:^|\s)(?::-D|:D)(?:\s|$):===:big grin
regex;[\s*|'|"][\s*|'|"]:-/:===:confused regex;(?:^|\s)(?:;-\)|;\))(?:\s|$):===:wink
regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged regex;(?:^|\s)(?::-P|:P)(?:\s|$):===:tongue out
regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing regex;(?:^|\s)(?::-O|:O)(?:\s|$):===:surprised
regex;[\s*|'|"][\s*|'|"]8-X:===:skull regex;(?:^|\s)(?::-/|:/)(?:\s|$):===:skeptical
regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile regex;(?:^|\s)(?:>:-\(|>:\()(?:\s|$):===:angry
regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile regex;(?:^|\s)(?::'\(|:'-\()(?:\s|$):===:crying
regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray regex;(?:^|\s)(?::-\||:\|)(?:\s|$):===:neutral
regex;[\s*|'|"][\s*|'|"]:/:===:confused regex;(?:^|\s)(?:8-\)|B-\))(?:\s|$):===:cool
regex;[\s*|'|"]:D[\s*|'|"]:===:laugh regex;(?:^|\s)8-X(?:\s|$):===:skull and crossbones
regex;[\s*|'|"];\)[\s*|'|"]:===:wink regex;(?:^|\s)(?:X-X|x-x)(?:\s|$):===:knocked out
regex;[\s*|'|"]XD[\s*|'|"]:===:LOL regex;(?:^|\s)(?::-X|:-x|:X|:x)(?:\s|$):===:lips sealed
regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile regex;(?:^|\s)XD(?:\s|$):===:laughing hard
regex;[\s*|'|"]:\)[\s*|'|"]:===:smile regex;(?:^|\s)\^_\^(?:\s|$):===:happy
regex;[\s*|'|"]->[\s*|'|"]:===:arrow right regex;(?:^|\s)-_-(?:\s|$):===:annoyed
# example for arrow left regex;(?:^|\s)o_O(?:\s|$):===:confused
#(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left regex;(?:^|\s)>_<(?:\s|$):===:frustrated
# or regex;(?:^|\s)\\o/(?:\s|$):===:hurray
#([ |^])<-([ ,.!?$]):===:arrow left\2 regex;(?:^|\s)<3(?:\s|$):===:heart
regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left regex;(?:^|\s)</3(?:\s|$):===:broken heart
regex;[\s+|'|"][O|o][O|o][\s+|'|"]:===:WTF? regex;(?:^|\s)(?:Oo|oO)(?:\s|$):===:WTF?
regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile regex;(?:^|\s)<{-.-}>(?:\s|$):===:Raves
regex;(?:^|\s)-\.-(?:\s|$):===:bugged
regex;(?:^|\s)>\.<(?:\s|$):===:laughing
regex;(?:^|\s)(?:>:\)|>:-\))(?:\s|$):===:evil smile
regex;(?:^|\s)\^\^(?:\s|$):===:enjoy smile
regex;(?:^|\s)->(?:\s|$):===:arrow right
regex;(?:^|\s)<-(?:\s|$):===:arrow left

View File

@@ -46,28 +46,33 @@ _:===:subrayado
[customDict] [customDict]
[emoticonDict] [emoticonDict]
# This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc. regex;(?:^|\s)(?::-\)|:\))(?:\s|$):===:smile
regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves regex;(?:^|\s)(?::-\(|:\()(?:\s|$):===:frown
regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses regex;(?:^|\s)(?::-D|:D)(?:\s|$):===:big grin
regex;[\s*|'|"][\s*|'|"]:-/:===:confused regex;(?:^|\s)(?:;-\)|;\))(?:\s|$):===:wink
regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged regex;(?:^|\s)(?::-P|:P)(?:\s|$):===:tongue out
regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing regex;(?:^|\s)(?::-O|:O)(?:\s|$):===:surprised
regex;[\s*|'|"][\s*|'|"]8-X:===:skull regex;(?:^|\s)(?::-/|:/)(?:\s|$):===:skeptical
regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile regex;(?:^|\s)(?:>:-\(|>:\()(?:\s|$):===:angry
regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile regex;(?:^|\s)(?::'\(|:'-\()(?:\s|$):===:crying
regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray regex;(?:^|\s)(?::-\||:\|)(?:\s|$):===:neutral
regex;[\s*|'|"][\s*|'|"]:/:===:confused regex;(?:^|\s)(?:8-\)|B-\))(?:\s|$):===:cool
regex;[\s*|'|"][\s*|'|"]8\):===:smile with sunglasses regex;(?:^|\s)8-X(?:\s|$):===:skull and crossbones
regex;[\s*|'|"]:D[\s*|'|"]:===:laugh regex;(?:^|\s)(?:X-X|x-x)(?:\s|$):===:knocked out
regex;[\s*|'|"];\)[\s*|'|"]:===:wink regex;(?:^|\s)(?::-X|:-x|:X|:x)(?:\s|$):===:lips sealed
regex;[\s*|'|"]XD[\s*|'|"]:===:LOL regex;(?:^|\s)XD(?:\s|$):===:laughing hard
regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile regex;(?:^|\s)\^_\^(?:\s|$):===:happy
regex;[\s*|'|"]:\)[\s*|'|"]:===:smile regex;(?:^|\s)-_-(?:\s|$):===:annoyed
regex;[\s*|'|"]->[\s*|'|"]:===:arrow right regex;(?:^|\s)o_O(?:\s|$):===:confused
# example for arrow left regex;(?:^|\s)>_<(?:\s|$):===:frustrated
#(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left regex;(?:^|\s)\\o/(?:\s|$):===:hurray
# or regex;(?:^|\s)<3(?:\s|$):===:heart
#([ |^])<-([ ,.!?$]):===:arrow left\2 regex;(?:^|\s)</3(?:\s|$):===:broken heart
regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left regex;(?:^|\s)(?:Oo|oO)(?:\s|$):===:WTF?
regex;[\s*|'|"][O|o][O|o][\s*|'|"]:===:WTF? regex;(?:^|\s)<{-.-}>(?:\s|$):===:Raves
regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile regex;(?:^|\s)-\.-(?:\s|$):===:bugged
regex;(?:^|\s)>\.<(?:\s|$):===:laughing
regex;(?:^|\s)(?:>:\)|>:-\))(?:\s|$):===:evil smile
regex;(?:^|\s)\^\^(?:\s|$):===:enjoy smile
regex;(?:^|\s)->(?:\s|$):===:arrow right
regex;(?:^|\s)<-(?:\s|$):===:arrow left

View File

@@ -46,28 +46,33 @@ _:===:souligné
[customDict] [customDict]
[emoticonDict] [emoticonDict]
# This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc. regex;(?:^|\s)(?::-\)|:\))(?:\s|$):===:smile
regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves regex;(?:^|\s)(?::-\(|:\()(?:\s|$):===:frown
regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses regex;(?:^|\s)(?::-D|:D)(?:\s|$):===:big grin
regex;[\s*|'|"][\s*|'|"]:-/:===:confused regex;(?:^|\s)(?:;-\)|;\))(?:\s|$):===:wink
regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged regex;(?:^|\s)(?::-P|:P)(?:\s|$):===:tongue out
regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing regex;(?:^|\s)(?::-O|:O)(?:\s|$):===:surprised
regex;[\s*|'|"][\s*|'|"]8-X:===:skull regex;(?:^|\s)(?::-/|:/)(?:\s|$):===:skeptical
regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile regex;(?:^|\s)(?:>:-\(|>:\()(?:\s|$):===:angry
regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile regex;(?:^|\s)(?::'\(|:'-\()(?:\s|$):===:crying
regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray regex;(?:^|\s)(?::-\||:\|)(?:\s|$):===:neutral
regex;[\s*|'|"][\s*|'|"]:/:===:confused regex;(?:^|\s)(?:8-\)|B-\))(?:\s|$):===:cool
regex;[\s*|'|"][\s*|'|"]8\):===:smile with sunglasses regex;(?:^|\s)8-X(?:\s|$):===:skull and crossbones
regex;[\s*|'|"]:D[\s*|'|"]:===:laugh regex;(?:^|\s)(?:X-X|x-x)(?:\s|$):===:knocked out
regex;[\s*|'|"];\)[\s*|'|"]:===:wink regex;(?:^|\s)(?::-X|:-x|:X|:x)(?:\s|$):===:lips sealed
regex;[\s*|'|"]XD[\s*|'|"]:===:LOL regex;(?:^|\s)XD(?:\s|$):===:laughing hard
regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile regex;(?:^|\s)\^_\^(?:\s|$):===:happy
regex;[\s*|'|"]:\)[\s*|'|"]:===:smile regex;(?:^|\s)-_-(?:\s|$):===:annoyed
regex;[\s*|'|"]->[\s*|'|"]:===:arrow right regex;(?:^|\s)o_O(?:\s|$):===:confused
# example for arrow left regex;(?:^|\s)>_<(?:\s|$):===:frustrated
#(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left regex;(?:^|\s)\\o/(?:\s|$):===:hurray
# or regex;(?:^|\s)<3(?:\s|$):===:heart
#([ |^])<-([ ,.!?$]):===:arrow left\2 regex;(?:^|\s)</3(?:\s|$):===:broken heart
regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left regex;(?:^|\s)(?:Oo|oO)(?:\s|$):===:WTF?
regex;[\s*|'|"][O|o][O|o][\s*|'|"]:===:WTF? regex;(?:^|\s)<{-.-}>(?:\s|$):===:Raves
regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile regex;(?:^|\s)-\.-(?:\s|$):===:bugged
regex;(?:^|\s)>\.<(?:\s|$):===:laughing
regex;(?:^|\s)(?:>:\)|>:-\))(?:\s|$):===:evil smile
regex;(?:^|\s)\^\^(?:\s|$):===:enjoy smile
regex;(?:^|\s)->(?:\s|$):===:arrow right
regex;(?:^|\s)<-(?:\s|$):===:arrow left

View File

@@ -46,28 +46,33 @@ _:===:podkreślnik
[customDict] [customDict]
[emoticonDict] [emoticonDict]
# This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc. regex;(?:^|\s)(?::-\)|:\))(?:\s|$):===:smile
regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves regex;(?:^|\s)(?::-\(|:\()(?:\s|$):===:frown
regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses regex;(?:^|\s)(?::-D|:D)(?:\s|$):===:big grin
regex;[\s*|'|"][\s*|'|"]:-/:===:confused regex;(?:^|\s)(?:;-\)|;\))(?:\s|$):===:wink
regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged regex;(?:^|\s)(?::-P|:P)(?:\s|$):===:tongue out
regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing regex;(?:^|\s)(?::-O|:O)(?:\s|$):===:surprised
regex;[\s*|'|"][\s*|'|"]8-X:===:skull regex;(?:^|\s)(?::-/|:/)(?:\s|$):===:skeptical
regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile regex;(?:^|\s)(?:>:-\(|>:\()(?:\s|$):===:angry
regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile regex;(?:^|\s)(?::'\(|:'-\()(?:\s|$):===:crying
regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray regex;(?:^|\s)(?::-\||:\|)(?:\s|$):===:neutral
regex;[\s*|'|"][\s*|'|"]:/:===:confused regex;(?:^|\s)(?:8-\)|B-\))(?:\s|$):===:cool
regex;[\s*|'|"][\s*|'|"]8\):===:smile with sunglasses regex;(?:^|\s)8-X(?:\s|$):===:skull and crossbones
regex;[\s*|'|"]:D[\s*|'|"]:===:laugh regex;(?:^|\s)(?:X-X|x-x)(?:\s|$):===:knocked out
regex;[\s*|'|"];\)[\s*|'|"]:===:wink regex;(?:^|\s)(?::-X|:-x|:X|:x)(?:\s|$):===:lips sealed
regex;[\s*|'|"]XD[\s*|'|"]:===:LOL regex;(?:^|\s)XD(?:\s|$):===:laughing hard
regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile regex;(?:^|\s)\^_\^(?:\s|$):===:happy
regex;[\s*|'|"]:\)[\s*|'|"]:===:smile regex;(?:^|\s)-_-(?:\s|$):===:annoyed
regex;[\s*|'|"]->[\s*|'|"]:===:arrow right regex;(?:^|\s)o_O(?:\s|$):===:confused
# example for arrow left regex;(?:^|\s)>_<(?:\s|$):===:frustrated
#(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left regex;(?:^|\s)\\o/(?:\s|$):===:hurray
# or regex;(?:^|\s)<3(?:\s|$):===:heart
#([ |^])<-([ ,.!?$]):===:arrow left\2 regex;(?:^|\s)</3(?:\s|$):===:broken heart
regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left regex;(?:^|\s)(?:Oo|oO)(?:\s|$):===:WTF?
regex;[\s*|'|"][O|o][O|o][\s*|'|"]:===:WTF? regex;(?:^|\s)<{-.-}>(?:\s|$):===:Raves
regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile regex;(?:^|\s)-\.-(?:\s|$):===:bugged
regex;(?:^|\s)>\.<(?:\s|$):===:laughing
regex;(?:^|\s)(?:>:\)|>:-\))(?:\s|$):===:evil smile
regex;(?:^|\s)\^\^(?:\s|$):===:enjoy smile
regex;(?:^|\s)->(?:\s|$):===:arrow right
regex;(?:^|\s)<-(?:\s|$):===:arrow left

View File

@@ -52,27 +52,33 @@ regex;(?i)shit:===:shitt
regex;(?i)slither:===:slitther regex;(?i)slither:===:slitther
[emoticonDict] [emoticonDict]
# This dictionary uses regexp when prefixed with "regex;", so be sure to escape anything that would be parsed by regexp, e.g. *, ., ^, $, etc. regex;(?:^|\s)(?::-\)|:\))(?:\s|$):===:smile
regex;[\s*|'|"][\s*|'|"]<{-.-}>:===:Raves regex;(?:^|\s)(?::-\(|:\()(?:\s|$):===:frown
regex;[\s*|'|"][\s*|'|"]8-\):===:smile with sunglasses regex;(?:^|\s)(?::-D|:D)(?:\s|$):===:big grin
regex;[\s*|'|"][\s*|'|"]:-/:===:confused regex;(?:^|\s)(?:;-\)|;\))(?:\s|$):===:wink
regex;[\s*|'|"][\s*|'|"]-\.-:===:bugged regex;(?:^|\s)(?::-P|:P)(?:\s|$):===:tongue out
regex;[\s*|'|"][\s*|'|"]>\.<:===:laughing regex;(?:^|\s)(?::-O|:O)(?:\s|$):===:surprised
regex;[\s*|'|"][\s*|'|"]8-X:===:skull regex;(?:^|\s)(?::-/|:/)(?:\s|$):===:skeptical
regex;[\s*|'|"][\s*|'|"]>:\):===:evil smile regex;(?:^|\s)(?:>:-\(|>:\()(?:\s|$):===:angry
regex;[\s*|'|"][\s*|'|"]>:-\):===:evil smile regex;(?:^|\s)(?::'\(|:'-\()(?:\s|$):===:crying
regex;[\s*|'|"][\s*|'|"]\\o/:===:Hurray regex;(?:^|\s)(?::-\||:\|)(?:\s|$):===:neutral
regex;[\s*|'|"][\s*|'|"]:/:===:confused regex;(?:^|\s)(?:8-\)|B-\))(?:\s|$):===:cool
regex;[\s*|'|"]:D[\s*|'|"]:===:laugh regex;(?:^|\s)8-X(?:\s|$):===:skull and crossbones
regex;[\s*|'|"];\)[\s*|'|"]:===:wink regex;(?:^|\s)(?:X-X|x-x)(?:\s|$):===:knocked out
regex;[\s*|'|"]XD[\s*|'|"]:===:LOL regex;(?:^|\s)(?::-X|:-x|:X|:x)(?:\s|$):===:lips sealed
regex;[\s*|'|"]:-\)[\s*|'|"]:===:smile regex;(?:^|\s)XD(?:\s|$):===:laughing hard
regex;[\s*|'|"]:\)[\s*|'|"]:===:smile regex;(?:^|\s)\^_\^(?:\s|$):===:happy
regex;[\s*|'|"]->[\s*|'|"]:===:arrow right regex;(?:^|\s)-_-(?:\s|$):===:annoyed
# example for arrow left regex;(?:^|\s)o_O(?:\s|$):===:confused
#(?:[ |^])(<-)(?:[ ,.!?$]):===:arrow left regex;(?:^|\s)>_<(?:\s|$):===:frustrated
# or regex;(?:^|\s)\\o/(?:\s|$):===:hurray
#([ |^])<-([ ,.!?$]):===:arrow left\2 regex;(?:^|\s)<3(?:\s|$):===:heart
regex;[\s*|'|"]<-[\s*|'|"]:===:arrow left regex;(?:^|\s)</3(?:\s|$):===:broken heart
regex;[\s+|'|"][O|o][O|o][\s+|'|"]:===:WTF? regex;(?:^|\s)(?:Oo|oO)(?:\s|$):===:WTF?
regex;[\s*|'|"]\^\^[\s*|'|"]:===:enjoy smile regex;(?:^|\s)<{-.-}>(?:\s|$):===:Raves
regex;(?:^|\s)-\.-(?:\s|$):===:bugged
regex;(?:^|\s)>\.<(?:\s|$):===:laughing
regex;(?:^|\s)(?:>:\)|>:-\))(?:\s|$):===:evil smile
regex;(?:^|\s)\^\^(?:\s|$):===:enjoy smile
regex;(?:^|\s)->(?:\s|$):===:arrow right
regex;(?:^|\s)<-(?:\s|$):===:arrow left

View File

@@ -1,52 +1,42 @@
[build-system] [build-system]
requires = ["setuptools>=64.0.0", "wheel", "setuptools_scm[toml]>=6.2"] requires = ["setuptools >= 61.0"]
build-backend = "setuptools.build_meta" build-backend = "setuptools.build_meta"
[project] [project]
name = "fenrir-screenreader" name = "fenrir-screenreader"
dynamic = ["version"] version="2025.01.28"
description = "A TTY Screen Reader for Linux"
readme = "README.md"
requires-python = ">=3.8"
license = {text = "GNU General Public License v3 or later (GPLv3+)"}
keywords = ["screenreader", "a11y", "accessibility", "terminal", "TTY", "console"]
authors = [ authors = [
{name = "Storm Dragon, Jeremiah, Chrys and others", email = "storm_dragon@stormux.org"} {name = "Hunter Jozwiak", email = "hunter.t.joz@gmail.com"},
{name="Storm Dragon", email="storm_dragon@stormux.org"},
{name="Jeremiah Ticket", email="seashellpromises@gmail.com"},
{name="Chrys", email="chrys@linux-a11y.org"},
] ]
classifiers = [ maintainers = [
"Programming Language :: Python", {name = "Hunter Jozwiak", email = "hunter.t.joz@gmail.com"},
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", {name = "Storm dragon", email = "storm_dragon@stormux.org"}]
keywords=['screenreader', 'a11y', 'accessibility', 'terminal', 'TTY', 'console']
classifiers=[
"Programming Language :: Python",
"License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)",
"Development Status :: 5 - Production/Stable", "Development Status :: 5 - Production/Stable",
"Topic :: Multimedia :: Sound/Audio :: Speech", "Topic :: Multimedia :: Sound/Audio :: Speech",
"Environment :: Console", "Environment :: Console",
] ]
description = "A TTY screenreader for Linux."
readme = "README.md"
requires-python = ">=3.6"
dependencies = [ dependencies = [
"evdev>=1.1.2",
"daemonize>=2.5.0", "daemonize>=2.5.0",
"dbus-python>=1.2.8", "dbus-python>=1.2.18",
"pyudev>=0.21.0", "evdev>=1.7.1",
"setuptools", "pexpect>=4.9.0",
"pexpect", "pyte>=0.8.1",
"pyttsx3", "pyudev>=0.23.2",
"pyte>=0.7.0", ]
[project.scripts]
fenrir = "fenrirscreenreader:cli.main"
[dependency-groups]
dev = [
"ruff>=0.0.17",
] ]
[project.urls]
Homepage = "https://git.stormux.org/storm/fenrir/"
[tool.setuptools]
package-dir = {"" = "src"}
include-package-data = true
zip-safe = false
[tool.setuptools.packages.find]
where = ["src"]
include = ["fenrirscreenreader*"]
namespaces = true
[tool.setuptools_scm]
write_to = "src/fenrirscreenreader/_version.py"
[tool.setuptools.data-files]
"usr/share/man/man1" = ["docs/fenrir.1"]
"usr/share/fenrirscreenreader/tools" = ["tools/*"]

10
pyproject.toml~ Normal file
View File

@@ -0,0 +1,10 @@
[project]
name = "fenrir-screenreader"
author="Storm Dragon, Jeremiah, Chrys and others"
version = "2024.12.20"
description = "A TTY screenreader for Linux."
readme = "README.md"
requires-python = ">=3.6"
dependencies = [
"evdev>=1.7.1",
]

View File

@@ -1,7 +0,0 @@
evdev>=1.1.2
daemonize>=2.5.0
dbus-python>=1.2.8
pyudev>=0.21.0
pexpect
pyttsx3
pyte>=0.7.0

View File

@@ -1,46 +0,0 @@
#!/usr/bin/env python3
import os
import glob
from setuptools import setup
def get_data_files():
data_files = []
# Handle configuration files
directories = glob.glob('config/*')
for directory in directories:
files = glob.glob(directory+'/*')
dest_dir = ''
if 'config/punctuation' in directory:
dest_dir = 'etc/fenrirscreenreader/punctuation'
elif 'config/keyboard' in directory:
dest_dir = 'etc/fenrirscreenreader/keyboard'
elif 'config/settings' in directory:
dest_dir = 'etc/fenrirscreenreader/settings'
elif 'config/scripts' in directory:
dest_dir = 'usr/share/fenrirscreenreader/scripts'
if dest_dir and files:
data_files.append((dest_dir, files))
# Handle sound files
files = glob.glob('config/sound/default/*')
if files:
data_files.append(('usr/share/sounds/fenrirscreenreader/default', files))
files = glob.glob('config/sound/template/*')
if files:
data_files.append(('usr/share/sounds/fenrirscreenreader/template', files))
# Handle tools directory
files = glob.glob('tools/*')
if files:
data_files.append(('usr/share/fenrirscreenreader/tools', files))
# Add man page
if os.path.exists('docs/fenrir.1'):
data_files.append(('usr/share/man/man1', ['docs/fenrir.1']))
return data_files
if __name__ == "__main__":
setup(data_files=get_data_files())

7
src/fenrir → src/fenrirscreenreader/cli.py Executable file → Normal file
View File

@@ -1,9 +1,8 @@
#!/usr/bin/env python3
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
# Fenrir TTY screen reader # Fenrir TTY screen reader
# By Chrys, Storm Dragon, and contributors. # By Chrys, Storm Dragon, and contributors.
"""Module for managing the command line interface of Fenrir."""
import os import os
import sys import sys
import inspect import inspect
@@ -15,8 +14,8 @@ fenrirPath = os.path.dirname(os.path.realpath(os.path.abspath(inspect.getfile(in
if not fenrirPath in sys.path: if not fenrirPath in sys.path:
sys.path.append(fenrirPath) sys.path.append(fenrirPath)
from fenrirscreenreader.core import fenrirManager from .core import fenrirManager
from fenrirscreenreader import fenrirVersion from . import fenrirVersion
def create_argument_parser(): def create_argument_parser():
"""Create and return the argument parser for Fenrir""" """Create and return the argument parser for Fenrir"""

View File

@@ -3,6 +3,5 @@
# Fenrir TTY screen reader # Fenrir TTY screen reader
# By Chrys, Storm Dragon, and contributers. # By Chrys, Storm Dragon, and contributers.
version = "2025.01.28"
version = "2024.12.20"
codeName = "testing" codeName = "testing"

View File

@@ -201,7 +201,7 @@ class FenrirConfigTool:
# Test voice configuration # Test voice configuration
if self.test_voice(moduleChoice, voice): if self.test_voice(moduleChoice, voice):
config = configparser.ConfigParser() config = configparser.ConfigParser(interpolation=None)
config.read(self.settingsFile) config.read(self.settingsFile)
if 'speech' not in config: if 'speech' not in config:
@@ -244,7 +244,7 @@ class FenrirConfigTool:
def edit_general_config(self) -> None: def edit_general_config(self) -> None:
while True: while True:
config = configparser.ConfigParser() config = configparser.ConfigParser(interpolation=None)
config.read(self.settingsFile) config.read(self.settingsFile)
sections = config.sections() sections = config.sections()

261
uv.lock generated Normal file
View File

@@ -0,0 +1,261 @@
version = 1
requires-python = ">=3.6"
resolution-markers = [
"python_full_version >= '3.8'",
"python_full_version == '3.7.*'",
"python_full_version < '3.7'",
]
[[package]]
name = "daemonize"
version = "2.5.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/8c/20/96f7dbc23812cfe4cf479c87af3e4305d0d115fd1fffec32ddeee7b9c82b/daemonize-2.5.0.tar.gz", hash = "sha256:dd026e4ff8d22cb016ed2130bc738b7d4b1da597ef93c074d2adb9e4dea08bc3", size = 8759 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/45/ad/1b20db02287afd40d3130a218ac5ce2f7d2ab581cfda29bada5e1c4bee17/daemonize-2.5.0-py2.py3-none-any.whl", hash = "sha256:9b6b91311a9d934ff3f5f766666635ca280d3de8e7137e4cd7d3f052543b989f", size = 5231 },
]
[[package]]
name = "dbus-python"
version = "1.2.18"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version < '3.7'",
]
sdist = { url = "https://files.pythonhosted.org/packages/b1/5c/ccfc167485806c1936f7d3ba97db6c448d0089c5746ba105b6eb22dba60e/dbus-python-1.2.18.tar.gz", hash = "sha256:92bdd1e68b45596c833307a5ff4b217ee6929a1502f5341bae28fd120acf7260", size = 578204 }
[[package]]
name = "dbus-python"
version = "1.3.2"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version >= '3.8'",
"python_full_version == '3.7.*'",
]
sdist = { url = "https://files.pythonhosted.org/packages/c1/d3/6be85a9c772d6ebba0cc3ab37390dd6620006dcced758667e0217fb13307/dbus-python-1.3.2.tar.gz", hash = "sha256:ad67819308618b5069537be237f8e68ca1c7fcc95ee4a121fe6845b1418248f8", size = 605495 }
[[package]]
name = "evdev"
version = "1.7.1"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/12/bb/f622a8a5e64d46ca83020a761877c0ead19140903c9aaf1431f3c531fdf6/evdev-1.7.1.tar.gz", hash = "sha256:0c72c370bda29d857e188d931019c32651a9c1ea977c08c8d939b1ced1637fde", size = 30705 }
[[package]]
name = "fenrir-screenreader"
version = "2025.1.28"
source = { editable = "." }
dependencies = [
{ name = "daemonize" },
{ name = "dbus-python", version = "1.2.18", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" },
{ name = "dbus-python", version = "1.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.7'" },
{ name = "evdev" },
{ name = "pexpect" },
{ name = "pyte", version = "0.8.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" },
{ name = "pyte", version = "0.8.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8'" },
{ name = "pyudev", version = "0.23.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" },
{ name = "pyudev", version = "0.24.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.7'" },
]
[package.dev-dependencies]
dev = [
{ name = "ruff", version = "0.0.17", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.7'" },
{ name = "ruff", version = "0.9.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.7'" },
]
[package.metadata]
requires-dist = [
{ name = "daemonize", specifier = ">=2.5.0" },
{ name = "dbus-python", specifier = ">=1.2.18" },
{ name = "evdev", specifier = ">=1.7.1" },
{ name = "pexpect", specifier = ">=4.9.0" },
{ name = "pyte", specifier = ">=0.8.1" },
{ name = "pyudev", specifier = ">=0.23.2" },
]
[package.metadata.requires-dev]
dev = [{ name = "ruff", specifier = ">=0.0.17" }]
[[package]]
name = "pexpect"
version = "4.9.0"
source = { registry = "https://pypi.org/simple" }
dependencies = [
{ name = "ptyprocess" },
]
sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772 },
]
[[package]]
name = "ptyprocess"
version = "0.7.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993 },
]
[[package]]
name = "pyte"
version = "0.8.1"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version == '3.7.*'",
"python_full_version < '3.7'",
]
dependencies = [
{ name = "wcwidth", marker = "python_full_version < '3.8'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/9f/60/442cdc1cba83710770672ef61e186be8746f419a12b2c84ba36e9a96276d/pyte-0.8.1.tar.gz", hash = "sha256:b9bfd1b781759e7572a6e553c010cc93eef58a19d8d1590446d84c19b1b097b0", size = 51657 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/c1/c8/c7313e4e1849a86ff8bdbb9731fd6a32cb555feb27f33529a1cdc2c0427a/pyte-0.8.1-py3-none-any.whl", hash = "sha256:d760ea9a7d455d179d9d7a4288fac3d231190b5226715f1fe8c62547bed9b9aa", size = 30767 },
]
[[package]]
name = "pyte"
version = "0.8.2"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version >= '3.8'",
]
dependencies = [
{ name = "wcwidth", marker = "python_full_version >= '3.8'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/ab/ab/b599762933eba04de7dc5b31ae083112a6c9a9db15b01d3109ad797559d9/pyte-0.8.2.tar.gz", hash = "sha256:5af970e843fa96a97149d64e170c984721f20e52227a2f57f0a54207f08f083f", size = 92301 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/59/d0/bb522283b90853afbf506cd5b71c650cf708829914efd0003d615cf426cd/pyte-0.8.2-py3-none-any.whl", hash = "sha256:85db42a35798a5aafa96ac4d8da78b090b2c933248819157fc0e6f78876a0135", size = 31627 },
]
[[package]]
name = "pyudev"
version = "0.23.2"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version < '3.7'",
]
dependencies = [
{ name = "six", marker = "python_full_version < '3.7'" },
]
sdist = { url = "https://files.pythonhosted.org/packages/f8/fa/ae6c1a1a75f19560bbd875a579b2ca9b32deeae6a4c4a1997f4ec69a013e/pyudev-0.23.2.tar.gz", hash = "sha256:32ae3585b320a51bc283e0a04000fd8a25599edb44541e2f5034f6afee5d15cc", size = 87199 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b7/95/4c67255c65da9c939903cb95c57bd1ad7c920a7b711066aaa56cd7d149ab/pyudev-0.23.2-py3-none-any.whl", hash = "sha256:50d94bef0669f9aabd323a2259be67e8d49b9ebab9eae27b2cf8262767f9a2ae", size = 63903 },
]
[[package]]
name = "pyudev"
version = "0.24.3"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version >= '3.8'",
"python_full_version == '3.7.*'",
]
sdist = { url = "https://files.pythonhosted.org/packages/c4/5c/6cc034da13830e3da123ccf9a30910bc868fa16670362f004e4b788d0df1/pyudev-0.24.3.tar.gz", hash = "sha256:2e945427a21674893bb97632401db62139d91cea1ee96137cc7b07ad22198fc7", size = 55970 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/9d/3b/c37870f68ceb067707ca7b04db364a1478fcd40c6194007fb6e492ff9a92/pyudev-0.24.3-py3-none-any.whl", hash = "sha256:e8246f0a014fe370119ba2bc781bfbe62c0298d0d6b39c94e83102a8a3f56960", size = 62677 },
]
[[package]]
name = "ruff"
version = "0.0.17"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version < '3.7'",
]
sdist = { url = "https://files.pythonhosted.org/packages/aa/ed/7adc91572c08f346976335f6b1b22774ea555d11043a9ff013f962affab5/ruff-0.0.17.tar.gz", hash = "sha256:5815383171ccbab333d6b6d54253e91003ee6be4627738d56855cbefc393df41", size = 54259 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/10/3b/4a6b289ab3ca80109402c15dd0fc83ef1c77572453b346a74ebc55666db5/ruff-0.0.17-cp310-cp310-macosx_10_7_x86_64.whl", hash = "sha256:2fa56d385b31462e26a605477c626023b16fb5a399b619ba0966d0d2b8d88eca", size = 1665731 },
{ url = "https://files.pythonhosted.org/packages/3d/23/5e519dd38ae42a75f8e6a952a3c5ea842804e2cb8c60a1d72807131d8aba/ruff-0.0.17-cp310-cp310-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:4f5694f9876cde21b95ad9c1691d0513617d2e88c0749f400b866505217fd5a0", size = 3202527 },
{ url = "https://files.pythonhosted.org/packages/9c/05/69872574ea3044cfbac4becef1c25c0b1227499c91c2232b83bad9bb104c/ruff-0.0.17-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d1349f4e5a4d53294fce92f42ecf881a73c180d71f14121461cac7d251abafd4", size = 1543942 },
{ url = "https://files.pythonhosted.org/packages/24/16/e5c7cb9b77d1f64d94d507d0c3d7ef491a10dc75825f458cb1bb05ae41cf/ruff-0.0.17-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:f4e60d690898be3c3bf24387e67ac89496a97eb8814b8c0f0670ea43b6e83ee2", size = 1788392 },
{ url = "https://files.pythonhosted.org/packages/76/a4/dad616f277880963968d8a5e5719556f4ecadc7333c0da8bfb5060c5750c/ruff-0.0.17-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:522cacc6e550a7d59ead3b0ca65623582d51bfe32f6c780770ccf5d1bc3246cb", size = 1758753 },
{ url = "https://files.pythonhosted.org/packages/bc/44/08d68e219e2e7659991b467122f41326fde1e2e959107746ed7559f5e498/ruff-0.0.17-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e608511d0349a6211a0a123744cc0960f88539dbf62a0b8a77e3ee483237a6da", size = 1677835 },
{ url = "https://files.pythonhosted.org/packages/d6/7d/4d897311a299007b8542bfcd83dff9b09db6a7130f48ad3252e8ba3740b9/ruff-0.0.17-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:78f14cf1056ded6bda77162d7483e11a2f2a29763538422adaa5412654ff1a94", size = 1700213 },
{ url = "https://files.pythonhosted.org/packages/90/af/2c5dfa97f6994cf462e2b1934662f730608eec7ccfd6b992bab1af002ce9/ruff-0.0.17-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7cd7180893a3ed789c82838c8082fda074ba1cec46f383e255e696533f634be", size = 1894523 },
{ url = "https://files.pythonhosted.org/packages/40/e8/74569b7b05ece82a9e298eed7e01b2ae18205cee88de0283d0647370d120/ruff-0.0.17-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a90917b0e9d2f851294e445f0b898fa94051c4d9edcc1ab6d40bc1129fb9bb1e", size = 2119346 },
{ url = "https://files.pythonhosted.org/packages/7c/46/2cb84ccb0944c37208a2cea880ba8c6cb2a1752759771d385d6217de46b2/ruff-0.0.17-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9bb485eb3e0ba0c19ffd14b533659448c1c5e2958171e818fc1bc42c76f3d99a", size = 1679168 },
{ url = "https://files.pythonhosted.org/packages/47/65/cfd4e305851fdb94b7c8147d9d839ed83f9a93a941cc89d71e633a094642/ruff-0.0.17-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f3a399e4d211cdbec9229a89b1b7e77345eae881e9c3682fef7e90044de6a864", size = 1715985 },
{ url = "https://files.pythonhosted.org/packages/23/7a/96a4e5c51bab9538d9ee27a0eba95bd790d120bcc76a195417abbfb2cc81/ruff-0.0.17-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:80fe80b12ea042b9f0d8e80608db400e0c8e419d74a4dcf8b3b4fea9ec03362f", size = 1782188 },
{ url = "https://files.pythonhosted.org/packages/fb/3c/92267e9b9336bb1ba9ba7f5e3b9028e57ee4d77f32f728992c23da69ab53/ruff-0.0.17-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3b067ed2bd3fd0d4be591ea9afc796c07706291d78efe5a8eda4172c4d43525c", size = 1812203 },
{ url = "https://files.pythonhosted.org/packages/ca/d9/52cef313261a61931c4f3be228a774c5dad89f45042518d0f483864902ca/ruff-0.0.17-cp310-none-win32.whl", hash = "sha256:e3aba30e3aad77f260095ea1dbcf2834ab64d75133ff8d260625bb22887e2799", size = 1626413 },
{ url = "https://files.pythonhosted.org/packages/fe/d7/741e229667d0038d004783286ea6fa4554ff7a3b52bfe9b26b0380462e56/ruff-0.0.17-cp310-none-win_amd64.whl", hash = "sha256:a068bced7aff34173319931972fde3d7e68e3894915edac4e0f8c9b7bec7a226", size = 1654976 },
{ url = "https://files.pythonhosted.org/packages/20/50/470c8688e96fecac2096205cb45438676f6277b9c713a0aa1c4e633af503/ruff-0.0.17-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:b708d650c2ba25458d9e735c51981b687bf6747a4b28403eb7f6bae1aa93cfcf", size = 1665730 },
{ url = "https://files.pythonhosted.org/packages/13/13/f68c059cafb95122214c2defac7005c8a5ce278c7f1768d6849c167df07a/ruff-0.0.17-cp37-cp37m-macosx_11_0_arm64.whl", hash = "sha256:91019d271c223a4c562dbc2fbf2a2a96157524999a1173a4c858816d0c1bb9e7", size = 1543941 },
{ url = "https://files.pythonhosted.org/packages/70/e9/353db015927b6336bffbb7fe16af3bf76e860ab0fbddd66bf0a6995a2bfa/ruff-0.0.17-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:edbaf1c7f6b6483a206e549026f03ef7e04e480b5204437e21370de508dcf736", size = 1788393 },
{ url = "https://files.pythonhosted.org/packages/32/e5/2c41a62d58763948fa332619226cb11ded2ec161c678d70b7991b839ecf5/ruff-0.0.17-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:52110ed886d674497531d44ead5fa2fe99be930adfc9cec4b1f39409043efb13", size = 1758755 },
{ url = "https://files.pythonhosted.org/packages/3f/a9/f0cc3416b6f2e3755c8b37271112c609dfdf862b2825d86f4fc926eee037/ruff-0.0.17-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:febfbe4fa02e680b93b3fc2dcb0ffe5d601435c9719a51e35fe51fff1d0cc2c6", size = 1677834 },
{ url = "https://files.pythonhosted.org/packages/ed/54/ad7286c9e136260eaf8d6236202384dfe71a884a7b31288e129a43c33cb7/ruff-0.0.17-cp37-cp37m-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a6e72d62bd47f086d14ea5796ea18d1b98089a839dad693afa471a1fcdb6ae0d", size = 1700213 },
{ url = "https://files.pythonhosted.org/packages/bd/f7/12a3cfa5b88485ecdc724d0e915a8ebe4dfebfa94422855a445850564d01/ruff-0.0.17-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:27d1bd7c71a90522e383853e411fcb402ccdcaf8778c6e0d54359153772f7870", size = 1894524 },
{ url = "https://files.pythonhosted.org/packages/e2/1a/1ab955830e84dcad9f606954d5b1094e186de144a2ad37247aa37145cbcd/ruff-0.0.17-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bed7beec36834e6fc40a03af92bc0da67599c70fbe24d8d820a1a2110b25eaf", size = 2119348 },
{ url = "https://files.pythonhosted.org/packages/3c/00/a67b2904d92034abd2f35a4d930eae08abf64106f64a90a67770395db8a7/ruff-0.0.17-cp37-none-win32.whl", hash = "sha256:c664d897e21b9aab2b20c764434653aa394e32c32d38e751fd4f381ace3a4e58", size = 1626410 },
{ url = "https://files.pythonhosted.org/packages/9c/a9/dacfff99065b0588ff9cf07411d7bbc8a167d1542d92a7e46f5825e262fa/ruff-0.0.17-cp37-none-win_amd64.whl", hash = "sha256:8c5900fd09baa2c7a4aecbdc754d3a43f2842906ee571812fa3eb28b8e7973a5", size = 1654975 },
{ url = "https://files.pythonhosted.org/packages/f3/a9/e5a048d209e246b3702a23540b1e09faa79b313b1b23f27993e33df3b01a/ruff-0.0.17-cp38-cp38-macosx_10_7_x86_64.whl", hash = "sha256:db04c29f114c68f447aeec23f9be6118ea11a18a2444416cb4afb0fd918e50db", size = 1665728 },
{ url = "https://files.pythonhosted.org/packages/32/3d/13114ef5793e43fd5c8ee17047fbdc86e9eacb81f708c0e01ca9d5db773f/ruff-0.0.17-cp38-cp38-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:8527c8aacdd0e911c6f7d6f1b109a17e68300ac0f255ccce73e748bb8835c722", size = 3202527 },
{ url = "https://files.pythonhosted.org/packages/09/3f/657daee09a7412bda8af1963d6dd1b4adfdbc0e2d37c7261984fc4953e19/ruff-0.0.17-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:889aa57c771140ec6b17e15af8308e88e43a07b7369b97cb0426e1393e3d10b5", size = 1543942 },
{ url = "https://files.pythonhosted.org/packages/c1/6b/15e1c6744216236a3a08a8e40e318c329f86febdee7a1d62e3c449d75009/ruff-0.0.17-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:7be31e77c1f98d9d02a7f6f2d4c05e8236cd9c82d0c3356b083162a011fc4d23", size = 1788391 },
{ url = "https://files.pythonhosted.org/packages/ff/fa/0cf5c91b2d415416ef0d534a8f19bdc07d11a52fd54aface524d006be1ce/ruff-0.0.17-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:fe0c047d6fc74b55fcd1ac4f18110500ba871de2014039e4838ed7444d3459ff", size = 1758753 },
{ url = "https://files.pythonhosted.org/packages/8f/8b/ac8d7a1cce151c74fa9458f0297ca6fc287f9fe1a57fe710f99de970bfdb/ruff-0.0.17-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e4933e275f0c3af3a78ecf1f9a4e12cc0426cd76398c7e904786f99c1ea8a0dd", size = 1677834 },
{ url = "https://files.pythonhosted.org/packages/9f/38/e51bff666939e38155ef12930e6c1d4970f5a28c7f1ff3867e97b00a4cd0/ruff-0.0.17-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a9f2fb8b3bac67d0fa9e50411ab424a863e4bc29a3336a046cc38f06d3ec17f", size = 1700211 },
{ url = "https://files.pythonhosted.org/packages/e2/96/949c17bed22816136d8e0456a242059da202e316ca4510715560c026d0d8/ruff-0.0.17-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5d45439cbe73332a064306c39528d6bbf4856abb6d377ad8244b6e74a737daaa", size = 1894522 },
{ url = "https://files.pythonhosted.org/packages/89/61/cec1cd7093eea58e083060fc66c3fcf758737785a21b752fc568f57eabab/ruff-0.0.17-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f7433f20d39a3819e322a3497dce037c6110f9588ec51ba136a938109dd31e71", size = 2119345 },
{ url = "https://files.pythonhosted.org/packages/a9/32/27bb21e91e0e7d6e76be6d5fce844c3ac52278ae49d8964eb356a024cf26/ruff-0.0.17-cp38-none-win32.whl", hash = "sha256:5f8f4f4310018807402c77d81ae020666b742d2173a73b147ce0d1e0a08f022f", size = 1626409 },
{ url = "https://files.pythonhosted.org/packages/d0/3f/cd9d27f2dbbd4975c7880d8284f893ea99cf73c646f453b9cef1b3924db5/ruff-0.0.17-cp38-none-win_amd64.whl", hash = "sha256:f0d0e8058d903b8fe899e04e1a957127ca97452553cf70ba9b4d1b277f034ad1", size = 1654979 },
{ url = "https://files.pythonhosted.org/packages/d3/4e/c854d4587c180936b33eac57344b11f52564878d2939fd6d9d842fa6e5ae/ruff-0.0.17-cp39-cp39-macosx_10_7_x86_64.whl", hash = "sha256:e6f24c3746d199bdb0d47149ed5353a41f0192630911396822fda0f8a6feaa0b", size = 1665735 },
{ url = "https://files.pythonhosted.org/packages/49/8b/8d2de1c9f7e2056bd4edaea393d6ad3494e75e99136cf127402afb4c496c/ruff-0.0.17-cp39-cp39-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:71cb773b19240f1be64c5f71aa2ad52b9f44fde1605c2c2f4089a5d61cb552d2", size = 3202528 },
{ url = "https://files.pythonhosted.org/packages/aa/9f/7235c23ed12dfd44823d3a127d5654cc2fbfbe3daa1aca00c43ad2ccd519/ruff-0.0.17-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bab716debcab46d9a1d7c8d00e2acf2b48ff28ec519b2b4c0eba873236782c21", size = 1543942 },
{ url = "https://files.pythonhosted.org/packages/2e/69/1d4a2819146458d478e8c8a194452da263ab60202083d8eba02307fde216/ruff-0.0.17-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef57186452c0cfe71f09dac434bda0f1a804808f92221142adb9de28c3f422e6", size = 1788392 },
{ url = "https://files.pythonhosted.org/packages/c2/35/c3e2a3c3690e732860342b16e606795e977d87a90176ed1dae13c001ee86/ruff-0.0.17-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8b00be13abaf107c30b8bcaf2ac89dc2b3abd164728c229339910211c05e8c43", size = 1758753 },
{ url = "https://files.pythonhosted.org/packages/ad/3d/7d71456c7e1c543ed223b400a2e962a344b5467a27e196c4dd6f2d1d30c3/ruff-0.0.17-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e9c1ba3383995091ce6f3618e89f1bb0ed5caa730f64bb79a1c60184682dc5c3", size = 1677834 },
{ url = "https://files.pythonhosted.org/packages/f3/73/e87e31367fe7af0a027672e49703b61ea6566912d09e34a8e3e43bce3455/ruff-0.0.17-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:865114aa655dc54e5699f18b258a33a15a36da915de4936d7a458425e7f6351d", size = 1700211 },
{ url = "https://files.pythonhosted.org/packages/2b/27/7449e2a8bca1957c0e2d57316ca8fdcdf8d83277b23d50a33bdded703aa6/ruff-0.0.17-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a390b4657cc1eebd9bb0e581da768aa557b1157f5eeed6fc8b5b920991061b04", size = 1894520 },
{ url = "https://files.pythonhosted.org/packages/80/39/db6441f33216e25e5dba811e9d908cff898df7c9930006c735ba6578dd65/ruff-0.0.17-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d3fec0e9e8f285324127b97c55b525fe61e8e16e93e1a03d34aba80e3aff9f21", size = 2119346 },
{ url = "https://files.pythonhosted.org/packages/73/cb/d7ae9d2276f23f89642df0af808c85acc632aceca5d7039ae3afe4585afb/ruff-0.0.17-cp39-none-win32.whl", hash = "sha256:3f063c889d65d71fb189d6246ccd537c23c9d0f6e483c961ac0b5e8477d6e3ca", size = 1626409 },
{ url = "https://files.pythonhosted.org/packages/d8/a7/3ccc344a2b228a15b52217ed2a2982214ad77684745c3e09ace2b1f8e9bf/ruff-0.0.17-cp39-none-win_amd64.whl", hash = "sha256:4ba403b8a5f38753ed3ba7ca16fb7c67eaee96a4e4a9e9709f3ad8cd3909012c", size = 1654973 },
]
[[package]]
name = "ruff"
version = "0.9.3"
source = { registry = "https://pypi.org/simple" }
resolution-markers = [
"python_full_version >= '3.8'",
"python_full_version == '3.7.*'",
]
sdist = { url = "https://files.pythonhosted.org/packages/1e/7f/60fda2eec81f23f8aa7cbbfdf6ec2ca11eb11c273827933fb2541c2ce9d8/ruff-0.9.3.tar.gz", hash = "sha256:8293f89985a090ebc3ed1064df31f3b4b56320cdfcec8b60d3295bddb955c22a", size = 3586740 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/f9/77/4fb790596d5d52c87fd55b7160c557c400e90f6116a56d82d76e95d9374a/ruff-0.9.3-py3-none-linux_armv6l.whl", hash = "sha256:7f39b879064c7d9670197d91124a75d118d00b0990586549949aae80cdc16624", size = 11656815 },
{ url = "https://files.pythonhosted.org/packages/a2/a8/3338ecb97573eafe74505f28431df3842c1933c5f8eae615427c1de32858/ruff-0.9.3-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:a187171e7c09efa4b4cc30ee5d0d55a8d6c5311b3e1b74ac5cb96cc89bafc43c", size = 11594821 },
{ url = "https://files.pythonhosted.org/packages/8e/89/320223c3421962762531a6b2dd58579b858ca9916fb2674874df5e97d628/ruff-0.9.3-py3-none-macosx_11_0_arm64.whl", hash = "sha256:c59ab92f8e92d6725b7ded9d4a31be3ef42688a115c6d3da9457a5bda140e2b4", size = 11040475 },
{ url = "https://files.pythonhosted.org/packages/b2/bd/1d775eac5e51409535804a3a888a9623e87a8f4b53e2491580858a083692/ruff-0.9.3-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2dc153c25e715be41bb228bc651c1e9b1a88d5c6e5ed0194fa0dfea02b026439", size = 11856207 },
{ url = "https://files.pythonhosted.org/packages/7f/c6/3e14e09be29587393d188454064a4aa85174910d16644051a80444e4fd88/ruff-0.9.3-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:646909a1e25e0dc28fbc529eab8eb7bb583079628e8cbe738192853dbbe43af5", size = 11420460 },
{ url = "https://files.pythonhosted.org/packages/ef/42/b7ca38ffd568ae9b128a2fa76353e9a9a3c80ef19746408d4ce99217ecc1/ruff-0.9.3-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5a5a46e09355695fbdbb30ed9889d6cf1c61b77b700a9fafc21b41f097bfbba4", size = 12605472 },
{ url = "https://files.pythonhosted.org/packages/a6/a1/3167023f23e3530fde899497ccfe239e4523854cb874458ac082992d206c/ruff-0.9.3-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:c4bb09d2bbb394e3730d0918c00276e79b2de70ec2a5231cd4ebb51a57df9ba1", size = 13243123 },
{ url = "https://files.pythonhosted.org/packages/d0/b4/3c600758e320f5bf7de16858502e849f4216cb0151f819fa0d1154874802/ruff-0.9.3-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:96a87ec31dc1044d8c2da2ebbed1c456d9b561e7d087734336518181b26b3aa5", size = 12744650 },
{ url = "https://files.pythonhosted.org/packages/be/38/266fbcbb3d0088862c9bafa8b1b99486691d2945a90b9a7316336a0d9a1b/ruff-0.9.3-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bb7554aca6f842645022fe2d301c264e6925baa708b392867b7a62645304df4", size = 14458585 },
{ url = "https://files.pythonhosted.org/packages/63/a6/47fd0e96990ee9b7a4abda62de26d291bd3f7647218d05b7d6d38af47c30/ruff-0.9.3-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cabc332b7075a914ecea912cd1f3d4370489c8018f2c945a30bcc934e3bc06a6", size = 12419624 },
{ url = "https://files.pythonhosted.org/packages/84/5d/de0b7652e09f7dda49e1a3825a164a65f4998175b6486603c7601279baad/ruff-0.9.3-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:33866c3cc2a575cbd546f2cd02bdd466fed65118e4365ee538a3deffd6fcb730", size = 11843238 },
{ url = "https://files.pythonhosted.org/packages/9e/be/3f341ceb1c62b565ec1fb6fd2139cc40b60ae6eff4b6fb8f94b1bb37c7a9/ruff-0.9.3-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:006e5de2621304c8810bcd2ee101587712fa93b4f955ed0985907a36c427e0c2", size = 11484012 },
{ url = "https://files.pythonhosted.org/packages/a3/c8/ff8acbd33addc7e797e702cf00bfde352ab469723720c5607b964491d5cf/ruff-0.9.3-py3-none-musllinux_1_2_i686.whl", hash = "sha256:ba6eea4459dbd6b1be4e6bfc766079fb9b8dd2e5a35aff6baee4d9b1514ea519", size = 12038494 },
{ url = "https://files.pythonhosted.org/packages/73/b1/8d9a2c0efbbabe848b55f877bc10c5001a37ab10aca13c711431673414e5/ruff-0.9.3-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:90230a6b8055ad47d3325e9ee8f8a9ae7e273078a66401ac66df68943ced029b", size = 12473639 },
{ url = "https://files.pythonhosted.org/packages/cb/44/a673647105b1ba6da9824a928634fe23186ab19f9d526d7bdf278cd27bc3/ruff-0.9.3-py3-none-win32.whl", hash = "sha256:eabe5eb2c19a42f4808c03b82bd313fc84d4e395133fb3fc1b1516170a31213c", size = 9834353 },
{ url = "https://files.pythonhosted.org/packages/c3/01/65cadb59bf8d4fbe33d1a750103e6883d9ef302f60c28b73b773092fbde5/ruff-0.9.3-py3-none-win_amd64.whl", hash = "sha256:040ceb7f20791dfa0e78b4230ee9dce23da3b64dd5848e40e3bf3ab76468dcf4", size = 10821444 },
{ url = "https://files.pythonhosted.org/packages/69/cb/b3fe58a136a27d981911cba2f18e4b29f15010623b79f0f2510fd0d31fd3/ruff-0.9.3-py3-none-win_arm64.whl", hash = "sha256:800d773f6d4d33b0a3c60e2c6ae8f4c202ea2de056365acfa519aa48acf28e0b", size = 10038168 },
]
[[package]]
name = "six"
version = "1.17.0"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 },
]
[[package]]
name = "wcwidth"
version = "0.2.13"
source = { registry = "https://pypi.org/simple" }
sdist = { url = "https://files.pythonhosted.org/packages/6c/63/53559446a878410fc5a5974feb13d31d78d752eb18aeba59c7fef1af7598/wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5", size = 101301 }
wheels = [
{ url = "https://files.pythonhosted.org/packages/fd/84/fd2ba7aafacbad3c4201d395674fc6348826569da3c0937e75505ead3528/wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", size = 34166 },
]