setup poetry and redid parsing

This commit is contained in:
Noah Swerhun 2023-02-11 21:16:38 -06:00
parent 43de4df4c4
commit 8bb3bdbebf
5 changed files with 248 additions and 50 deletions

90
config_parsing.py Normal file
View file

@ -0,0 +1,90 @@
from yaml import dump, safe_load
from schema import And, Optional, Regex, Schema, SchemaError, Or
from json import dumps
def get_validated_config(filename):
config_schema = Schema({
"bar": {
Optional("config"): {
Optional("geometry"): Regex(r'^[0-9]*x[0-9]*\+[0-9]*\+[0-9]*$'),
Optional("bottom"): bool,
Optional("force"): bool,
Optional("font"): str,
Optional("name"): str,
Optional("line_thickness"): And(int, lambda n: n > 0),
Optional("bg_color", default="#000"): Regex(r'^#[0-9a-fA-F]{3}$|^#[0-9a-fA-F]{6}$|^#[0-9a-fA-F]{8}$'),
Optional("fg_color", default="#FFF"): Regex(r'^#[0-9a-fA-F]{3}$|^#[0-9a-fA-F]{6}$|^#[0-9a-fA-F]{8}$'),
Optional("offset"): int,
Optional("line_color"): Regex(r'^#[0-9a-fA-F]{3}$|^#[0-9a-fA-F]{6}$|^#[0-9a-fA-F]{8}$'),
Optional("padding", default=" "): str,
Optional("seperator", default="|"): str
},
"modules": [
{
str: {
"command": str,
"refresh": And(int, lambda n : n > 0),
Optional("prefix"): str,
"format": {
"align": Or("left", "center", "right"),
Optional("bg_color"): Regex(r'^#[0-9a-fA-F]{3}$|^#[0-9a-fA-F]{6}$|^#[0-9a-fA-F]{8}$'),
Optional("fg_color"): Regex(r'^#[0-9a-fA-F]{3}$|^#[0-9a-fA-F]{6}$|^#[0-9a-fA-F]{8}$'),
Optional("font"): And(int, lambda n: 1 <= n <= 5),
Optional("offset"): int,
Optional("line"): {
"type": Or("underline", "overline"),
Optional("color"): Regex(r'^#[0-9a-fA-F]{3}$|^#[0-9a-fA-F]{6}$|^#[0-9a-fA-F]{8}$')
},
Optional("button"): {
"activator": Or("left", "center", "right", "scrup", "scrdown"),
"command": str
}
}
}
}
]
}
})
with open(filename, "r", encoding="utf8") as file:
config_file = safe_load(file)
try:
return config_schema.validate(config_file)
except SchemaError as se:
raise se
def get_lemonbar_flags(config):
configuration_options = config["bar"]["config"]
flags = ""
for option in configuration_options:
match option:
case 'geometry':
flags += (" -g '" + configuration_options[option] + "'")
case 'bottom':
flags += (" -b")
case 'force':
flags += (" -d")
case 'font':
flags += (" -f '" + configuration_options[option] + "'")
case 'name':
flags += (" -n '" + configuration_options[option] + "'")
case 'line_thickness':
flags += (" -u " + str(configuration_options[option]))
case 'bg_color':
flags += (" -B '" + configuration_options[option] + "'")
case 'fg_color':
flags += (" -F '" + configuration_options[option] + "'")
case 'offset':
flags += (" -o " + str(configuration_options[option]))
case 'line_color':
flags += (" -U '" + configuration_options[option] + "'")
return flags.strip()
print(get_lemonbar_flags(get_validated_config("./testing_config.yml")))

View file

@ -7,6 +7,7 @@ bar:
# Define a custom size of the bar. By default, this is different for every
# screen, so the format is shown below.
geometry: "widthxheight+x+y"
# geometry: "100x200+5+10"
# Dock the bar at the bottom of the screen.
bottom: false
# Force the bar to dock (if your window manager is weird).
@ -38,57 +39,59 @@ bar:
# the seperator.
seperator: "|"
# Here is where you can define your individual modules. You can define as
# many modules as you want. Some fields are required; these will be indicated.
# If a field doesn't say its required, you can safely omit it in your own
# configuration. A "bare minimum" configuration is shown below for your
# convience.
# Here is where you can define a list your individual modules. You can define
# as many modules as you want. Some fields are required; these will be
# indicated. If a field doesn't say its required, you can safely omit it in
# your own configuration. A "bare minimum" configuration is shown below for
# your convience.
modules:
# This is an example module. You can name it whatever you want, it doesn't
# matter.
example_module:
# This command is run by `sh -c`, and whatever is sent to stdout is the
# text that will be displayed for this module. `date` here is used as an
# example. THIS IS A REQUIRED FIELD.
command: "date"
# How often to re-run the command and display the updated text. THIS IS A
# REQUIRED FIELD.
refresh: 1000
# Prefix to be printed before the text of the command.
prefix: "DATE: "
# Formatting options. These will only affect the text and padding of this
# module.
format:
# Where the text should be placed on the bar. `left`, `right`, or
# `center`. THIS IS A REQUIRED FIELD.
align: left
# Background color of the bar.
bg_color: "#000"
# Text color
fg_color: "#FFF"
# INDEX of the font for this module to be displayed in (see above).
font: 1
# Set an underline or overline
line:
# Self-explanatory. `underline` or `overline`. IF you set a line, then
# this is a required field.
type: underline
# Set a custom color for the line.
color: "#000"
# Make this module act like a button. Both of these fields are required
# if you are making a button. You may also define multiple buttons with
# different activators for a single module.
button:
# What mouse click you have to make to activate the button. Can be
# `left`, `center`, or `right`. You can also set it to activate when
# you scroll up or down with `scrup` and `scrdown.`
activator: left
# Command to be executed upon activation. Will be run with `sh -c`.
command: "echo 'hello' > ~/file.txt"
# matter. Notice the `-` before the name. Each module must be a list item!
- example_module:
# This command is run by `sh -c`, and whatever is sent to stdout is the
# text that will be displayed for this module. `date` here is used as an
# example. THIS IS A REQUIRED FIELD.
command: "date"
# How often to re-run the command and display the updated text. THIS IS A
# REQUIRED FIELD.
refresh: 1000
# Prefix to be printed before the text of the command.
prefix: "DATE: "
# Formatting options. These will only affect the text and padding of this
# module.
format:
# Where the text should be placed on the bar. `left`, `right`, or
# `center`. THIS IS A REQUIRED FIELD.
align: left
# Background color of the bar.
bg_color: "#000"
# Text color
fg_color: "#FFF"
# INDEX of the font for this module to be displayed in (see above).
font: 1
# Horizontal offset of the module text in pixels (can be negative).
offset: 0
# Set an underline or overline
line:
# Self-explanatory. `underline` or `overline`. IF you set a line, then
# this is a required field.
type: underline
# Set a custom color for the line.
color: "#000"
# Make this module act like a button. Both of these fields are required
# if you are making a button. You may also define multiple buttons with
# different activators for a single module.
button:
# What mouse click you have to make to activate the button. Can be
# `left`, `center`, or `right`. You can also set it to activate when
# you scroll up or down with `scrup` and `scrdown.`
activator: left
# Command to be executed upon activation. Will be run with `sh -c`.
command: "echo 'hello' > ~/file.txt"
# Here is a simpler example module showing only the required fields.
bare_minimum:
command: "whoami"
refresh: 1000
format:
align: right
- bare_minimum:
command: "whoami"
refresh: 1000
format:
align: right

83
poetry.lock generated Normal file
View file

@ -0,0 +1,83 @@
# This file is automatically @generated by Poetry and should not be changed by hand.
[[package]]
name = "contextlib2"
version = "21.6.0"
description = "Backports and enhancements for the contextlib module"
category = "main"
optional = false
python-versions = ">=3.6"
files = [
{file = "contextlib2-21.6.0-py2.py3-none-any.whl", hash = "sha256:3fbdb64466afd23abaf6c977627b75b6139a5a3e8ce38405c5b413aed7a0471f"},
{file = "contextlib2-21.6.0.tar.gz", hash = "sha256:ab1e2bfe1d01d968e1b7e8d9023bc51ef3509bba217bb730cee3827e1ee82869"},
]
[[package]]
name = "pyyaml"
version = "6.0"
description = "YAML parser and emitter for Python"
category = "main"
optional = false
python-versions = ">=3.6"
files = [
{file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"},
{file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"},
{file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"},
{file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"},
{file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"},
{file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"},
{file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"},
{file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"},
{file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"},
{file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"},
{file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"},
{file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"},
{file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"},
{file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"},
{file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"},
{file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"},
{file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"},
{file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"},
{file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"},
{file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"},
{file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"},
{file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"},
{file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"},
{file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"},
{file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"},
{file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"},
{file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"},
{file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"},
{file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"},
{file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"},
{file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"},
{file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"},
{file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"},
{file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"},
{file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"},
{file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"},
{file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"},
{file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"},
{file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"},
{file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"},
]
[[package]]
name = "schema"
version = "0.7.5"
description = "Simple data validation library"
category = "main"
optional = false
python-versions = "*"
files = [
{file = "schema-0.7.5-py2.py3-none-any.whl", hash = "sha256:f3ffdeeada09ec34bf40d7d79996d9f7175db93b7a5065de0faa7f41083c1e6c"},
{file = "schema-0.7.5.tar.gz", hash = "sha256:f06717112c61895cabc4707752b88716e8420a8819d71404501e114f91043197"},
]
[package.dependencies]
contextlib2 = ">=0.5.5"
[metadata]
lock-version = "2.0"
python-versions = "^3.10"
content-hash = "1d5f331a8e059d3c178cae193c847ca08eb8682aa32651ab7829863453ec08da"

18
pyproject.toml Normal file
View file

@ -0,0 +1,18 @@
[tool.poetry]
name = "easyconf-lemonbar"
version = "0.1.0"
description = "A python script to easily configure lemonbar"
authors = ["Noah Swerhun <noah@noahsw.xyz>"]
license = "GPL-3.0-or-later"
readme = "README.md"
packages = [{include = "easyconf_lemonbar"}]
[tool.poetry.dependencies]
python = "^3.10"
PyYAML = "^6.0"
schema = "^0.7.5"
[build-system]
requires = ["poetry-core"]
build-backend = "poetry.core.masonry.api"

4
pyrightconfig.json Normal file
View file

@ -0,0 +1,4 @@
{
"venv": "easyconf-lemonbar-yKjthnqC-py3.10",
"venvPath": "/home/noah/.cache/pypoetry/virtualenvs"
}