diff --git a/buba/__main__.py b/buba/__main__.py index ee2d1d5..612e77a 100644 --- a/buba/__main__.py +++ b/buba/__main__.py @@ -1,29 +1,26 @@ import logging +from bottle import Bottle, static_file, TEMPLATE_PATH, jinja2_view +from bottle_log import LoggingPlugin +from bottle_websocket import websocket, GeventWebSocketServer +from geventwebsocket.websocket import WebSocket + from buba.AppConfig import AppConfig config = AppConfig() if config.debug: logging.basicConfig(level=logging.DEBUG) - app = Bottle() if config.debug: app.config.update({"logging.level": "DEBUG"}) app.install(LoggingPlugin(app.config)) TEMPLATE_PATH.insert(0, config.templatepath) -app.install(BottleSessions()) -auth = BottleOIDC(app, config={ - "discovery_url": config.discovery_url, - "client_id": config.client_id, - "client_secret": config.client_secret, - "client_scope": config.oidc_scope, - "user_attr": config.oidc_user_attr, -}) -websocket_clients = WebSocketClients() -bottle_helpers = BottleHelpers(auth, group=config.requires_group, allowed=config.allowed) -update_poller = UpdatePoller(websocket_clients, ccujack, 1 if config.debug else 0.1) + +# websocket_clients = WebSocketClients() +# bottle_helpers = BottleHelpers(auth, group=config.requires_group, allowed=config.allowed) +# update_poller = UpdatePoller(websocket_clients, ccujack, 1 if config.debug else 0.1) @app.route("/static/") @@ -36,6 +33,7 @@ def server_static(filepath): def root(): return {} + if __name__ == '__main__': app.run(host=config.listen_host, port=config.listen_port, server=GeventWebSocketServer, debug=config.debug, quiet=not config.debug) diff --git a/buba/static/display.js b/buba/static/display.js new file mode 100644 index 0000000..c129583 --- /dev/null +++ b/buba/static/display.js @@ -0,0 +1,427 @@ +export default class { + constructor(container, config = {}) { + this.svgns = "http://www.w3.org/2000/svg"; + this.config = Object.assign({ + templateSvgUrl: "static/geascript-proportional.svg", + rows: 4, + cols: 180, + stripWidth: 0, + }, config); + console.log("Building display..."); + this.container = container; + this.segmentsDom = undefined; + this.defineFont() + fetch(this.config.templateSvgUrl) + .then(res => res.blob()) + .then(blob => blob.bytes()) + .then(blob => { + let parser = new DOMParser(); + this.segmentsDom = parser.parseFromString(new TextDecoder().decode(blob), 'image/svg+xml'); + this.buildDisplay() + console.log("Done building display"); + }) + .catch(err => console.log(err)); + } + + buildDisplay() { + const svgTemplate = this.segmentsDom.getElementsByTagName("svg")[0]; + const segmentsGroup = svgTemplate.getElementById("segments"); + const segmentElements = Array.from(segmentsGroup.childNodes).filter(e => e.nodeType === Node.ELEMENT_NODE); + const viewBox = svgTemplate.getAttribute("viewBox").split(" ").map(x => parseFloat(x)); + if (this.config.stripWidth === 0) { + this.config.stripWidth = viewBox[2]; + } + for (var s of segmentElements) { + s.removeAttribute("style"); + } + this.container.innerHTML = ""; + for (let r = 1; r <= 4; r++) { + const rowDiv = document.createElement("div"); + this.container.appendChild(rowDiv); + rowDiv.id = `geavision__row_${r}` + rowDiv.classList = "geavision geavision__row"; + let rowSvg = document.createElementNS(this.svgns, "svg"); + rowDiv.appendChild(rowSvg); + rowSvg.classList = "geavision geavision__row geavision__row_svg"; + rowSvg.id = `geavision__row_${r}_svg`; + const width = this.config.stripWidth * this.config.cols + rowSvg.setAttribute("viewBox", `0 0 ${parseInt(width)} ${parseInt(viewBox[3])}`); + // rowSvg.setAttribute("width", "320"); + // rowSvg.setAttribute("height", "15"); + + let rect = document.createElementNS(this.svgns, "rect"); + for (let c = 1; c <= this.config.cols; c++) { + let g = document.createElementNS(this.svgns, "g"); + rowSvg.appendChild(g); + g.id = `geavision__row_${r}_${c}`; + g.setAttribute("transform", `translate(${this.config.stripWidth * (c-1)} 0)`); + // segmentElements must be in the correct order in the SVG + for (let s = 1; s <= segmentElements.length; s++) { + const clone = segmentElements[s - 1].cloneNode(true); + g.appendChild(clone); + clone.id = `geavision__row_${r}_${c}_${s}`; + clone.classList = "gvsoff"; + } + } + } + let c = 1 + c += this.applyText(1, 1,"@ABCD DCBA") + } + + applyCharacter(row, col, char) { + for (let c of this.font[char]) { + for (let s = 0; s < c.length; s++) { + const e = this.container.querySelector(`#geavision__row_${row}_${col}_${s+1}`) + if (e) { + e.classList = c[s] === '#' ? "gvson" : "gvsoff"; + } else { + console.log(`Unable to find element #geavision__row_${row}_${col}_${s+1} for segment '${c}'`) + } + } + col++; + } + return this.font[char].length + } + + applyText(row, col, text) { + for (let c of text) { + col += this.applyCharacter(row, col, c.codePointAt(0)) + } + return col; + } + + defineFont() { + let defs = [] + // 0x00-0x0f + defs[0x00] = [] + defs[0x01] = [] + defs[0x02] = [] + defs[0x03] = [] + defs[0x04] = [] + defs[0x05] = [] + defs[0x06] = [] + defs[0x07] = [] + defs[0x08] = [] + defs[0x09] = [] + defs[0x0a] = [] + defs[0x0b] = [] + defs[0x0c] = [] + defs[0x0d] = [] + defs[0x0e] = [] + defs[0x0f] = [] + + // 0x10-0x1f + defs[0x10] = [] + defs[0x11] = [] + defs[0x12] = [] + defs[0x13] = [] + defs[0x14] = [] + defs[0x15] = [] + defs[0x16] = [] + defs[0x17] = [] + defs[0x18] = [] + defs[0x19] = [] + defs[0x1a] = [] + defs[0x1b] = [] + defs[0x1c] = [] + defs[0x1d] = [] + defs[0x1e] = [] + defs[0x1f] = [] + + // 0x20-0x2f + defs[0x20] = [ + '...... ...... ...... ......' + ] + defs[0x21] = [] + defs[0x22] = [] + defs[0x23] = [] + defs[0x24] = [] + defs[0x25] = [] + defs[0x26] = [] + defs[0x27] = [] + defs[0x28] = [] + defs[0x29] = [] + defs[0x2a] = [] + defs[0x2b] = [] + defs[0x2c] = [] + defs[0x2d] = [] + defs[0x2e] = [] + defs[0x2f] = [] + + // 0x30-0x3f + defs[0x30] = [] + defs[0x31] = [] + defs[0x32] = [] + defs[0x33] = [] + defs[0x34] = [] + defs[0x35] = [] + defs[0x36] = [] + defs[0x37] = [] + defs[0x38] = [] + defs[0x39] = [] + defs[0x3a] = [] + defs[0x3b] = [] + defs[0x3c] = [] + defs[0x3d] = [] + defs[0x3e] = [] + defs[0x3f] = [] + + // 0x40-0x4f + defs[0x40] = [ // @ + '...... .##### ###### ######', + '...... ###... ...... ....##', + '...... ###... .##### #.#.#.', + '...... ###... .#.... ##....', + '...... #.#### ###### ###...', + '...... ...... ...... ......' + ] + defs[0x41] = [ // A + '.##### ###### ###### ###...', + '###... ...### #..... ......', + '#.#### ###### ###### ###...', + '...... ...... ...... ......' + ] + defs[0x42] = [ // B + '###### ###### ###### ###...', + '###... ...### #..... ###...', + '#.#### #####. ###### ##....', + '...... ...... ...... ......' + ] + defs[0x43] = [ // C + '.##### ###### ###### #.#...', + '###... ...... ...... ###...', + '#.#... ...... ...... ##....', + '...... ...... ...... ......' + ] + defs[0x44] = [ // D + '###### ###### ###### ###...', + '###... ...... ...... ###...', + '#.#### ###### ###### ##....', + '...... ...... ...... ......' + ] + defs[0x45] = [] + defs[0x46] = [] + defs[0x47] = [] + defs[0x48] = [] + defs[0x49] = [] + defs[0x4a] = [] + defs[0x4b] = [] + defs[0x4c] = [] + defs[0x4d] = [] + defs[0x4e] = [] + defs[0x4f] = [] + + // 0x50-0x5f + defs[0x50] = [] + defs[0x51] = [] + defs[0x52] = [] + defs[0x53] = [] + defs[0x54] = [] + defs[0x55] = [] + defs[0x56] = [] + defs[0x57] = [] + defs[0x58] = [] + defs[0x59] = [] + defs[0x5a] = [] + defs[0x5b] = [] + defs[0x5c] = [] + defs[0x5d] = [] + defs[0x5e] = [] + defs[0x5f] = [] + + // 0x60-0x6f + defs[0x60] = [] + defs[0x61] = [] + defs[0x62] = [] + defs[0x63] = [] + defs[0x64] = [] + defs[0x65] = [] + defs[0x66] = [] + defs[0x67] = [] + defs[0x68] = [] + defs[0x69] = [] + defs[0x6a] = [] + defs[0x6b] = [] + defs[0x6c] = [] + defs[0x6d] = [] + defs[0x6e] = [] + defs[0x6f] = [] + + // 0x70-0x7f + defs[0x70] = [] + defs[0x71] = [] + defs[0x72] = [] + defs[0x73] = [] + defs[0x74] = [] + defs[0x75] = [] + defs[0x76] = [] + defs[0x77] = [] + defs[0x78] = [] + defs[0x79] = [] + defs[0x7a] = [] + defs[0x7b] = [] + defs[0x7c] = [] + defs[0x7d] = [] + defs[0x7e] = [] + defs[0x7f] = [] + + // 0x80-0x8f + defs[0x80] = [] + defs[0x81] = [] + defs[0x82] = [] + defs[0x83] = [] + defs[0x84] = [] + defs[0x85] = [] + defs[0x86] = [] + defs[0x87] = [] + defs[0x88] = [] + defs[0x89] = [] + defs[0x8a] = [] + defs[0x8b] = [] + defs[0x8c] = [] + defs[0x8d] = [] + defs[0x8e] = [] + defs[0x8f] = [] + + // 0x90-0x9f + defs[0x90] = [] + defs[0x91] = [] + defs[0x92] = [] + defs[0x93] = [] + defs[0x94] = [] + defs[0x95] = [] + defs[0x96] = [] + defs[0x97] = [] + defs[0x98] = [] + defs[0x99] = [] + defs[0x9a] = [] + defs[0x9b] = [] + defs[0x9c] = [] + defs[0x9d] = [] + defs[0x9e] = [] + defs[0x9f] = [] + + // 0xa0-0xaf + defs[0xa0] = [] + defs[0xa1] = [] + defs[0xa2] = [] + defs[0xa3] = [] + defs[0xa4] = [] + defs[0xa5] = [] + defs[0xa6] = [] + defs[0xa7] = [] + defs[0xa8] = [] + defs[0xa9] = [] + defs[0xaa] = [] + defs[0xab] = [] + defs[0xac] = [] + defs[0xad] = [] + defs[0xae] = [] + defs[0xaf] = [] + + // 0xb0-0xbf + defs[0xb0] = [] + defs[0xb1] = [] + defs[0xb2] = [] + defs[0xb3] = [] + defs[0xb4] = [] + defs[0xb5] = [] + defs[0xb6] = [] + defs[0xb7] = [] + defs[0xb8] = [] + defs[0xb9] = [] + defs[0xba] = [] + defs[0xbb] = [] + defs[0xbc] = [] + defs[0xbd] = [] + defs[0xbe] = [] + defs[0xbf] = [] + + // 0xc0-0xcf + defs[0xc0] = [] + defs[0xc1] = [] + defs[0xc2] = [] + defs[0xc3] = [] + defs[0xc4] = [] + defs[0xc5] = [] + defs[0xc6] = [] + defs[0xc7] = [] + defs[0xc8] = [] + defs[0xc9] = [] + defs[0xca] = [] + defs[0xcb] = [] + defs[0xcc] = [] + defs[0xcd] = [] + defs[0xce] = [] + defs[0xcf] = [] + + // 0xd0-0xdf + defs[0xd0] = [] + defs[0xd1] = [] + defs[0xd2] = [] + defs[0xd3] = [] + defs[0xd4] = [] + defs[0xd5] = [] + defs[0xd6] = [] + defs[0xd7] = [] + defs[0xd8] = [] + defs[0xd9] = [] + defs[0xda] = [] + defs[0xdb] = [] + defs[0xdc] = [] + defs[0xdd] = [] + defs[0xde] = [] + defs[0xdf] = [] + + // 0xe0-0xef + defs[0xe0] = [] + defs[0xe1] = [] + defs[0xe2] = [] + defs[0xe3] = [] + defs[0xe4] = [] + defs[0xe5] = [] + defs[0xe6] = [] + defs[0xe7] = [] + defs[0xe8] = [] + defs[0xe9] = [] + defs[0xea] = [] + defs[0xeb] = [] + defs[0xec] = [] + defs[0xed] = [] + defs[0xee] = [] + defs[0xef] = [] + + // 0xf0-0xff + defs[0xf0] = [] + defs[0xf1] = [] + defs[0xf2] = [] + defs[0xf3] = [] + defs[0xf4] = [] + defs[0xf5] = [] + defs[0xf6] = [] + defs[0xf7] = [] + defs[0xf8] = [] + defs[0xf9] = [] + defs[0xfa] = [] + defs[0xfb] = [] + defs[0xfc] = [] + defs[0xfd] = [] + defs[0xfe] = [] + defs[0xff] = [] + + + + this.font = [] + for (let i = 0; i < 256; i++) { + if (defs[i] === undefined) { + this.font[i] = [] + continue + } + let f = [] + for (let c of defs[i]) { + f.push(c.replace(/[^.#]/g, "")) + } + this.font[i] = f + } + } +} \ No newline at end of file diff --git a/buba/static/favicon-32x32.png b/buba/static/favicon-32x32.png new file mode 100644 index 0000000..f7258eb Binary files /dev/null and b/buba/static/favicon-32x32.png differ diff --git a/buba/design/geascript-proportional.svg b/buba/static/geascript-proportional.svg similarity index 95% rename from buba/design/geascript-proportional.svg rename to buba/static/geascript-proportional.svg index a8e578d..964e915 100644 --- a/buba/design/geascript-proportional.svg +++ b/buba/static/geascript-proportional.svg @@ -4,7 +4,7 @@ + id="segments" + inkscape:label="Segments"> + + + + {% block page_title %}{% endblock %} + + + + + + +

{{ self.page_title() }}

+{% block page_body %}{% endblock %} + + \ No newline at end of file diff --git a/buba/templates/home.html.j2 b/buba/templates/home.html.j2 new file mode 100644 index 0000000..7f878a6 --- /dev/null +++ b/buba/templates/home.html.j2 @@ -0,0 +1,5 @@ +{% extends "base.html.j2" %} +{% block page_title %}CCCHH Buba{% endblock %} +{% block page_body %} +
...
+{% endblock %} diff --git a/poetry.lock b/poetry.lock index 4f9051d..28c8c41 100644 --- a/poetry.lock +++ b/poetry.lock @@ -12,6 +12,21 @@ files = [ {file = "bottle-0.13.3.tar.gz", hash = "sha256:1c23aeb30aa8a13f39c60c0da494530ddd5de3da235bc431b818a50d999de49f"}, ] +[[package]] +name = "bottle-log" +version = "1.0.0" +description = "Improved logging for Bottle." +optional = false +python-versions = "*" +groups = ["main"] +files = [ + {file = "bottle-log-1.0.0.tar.gz", hash = "sha256:b5f03b8d64bfd577dea9b23d9cb999df078916be6951c5700644e14caa294f37"}, + {file = "bottle_log-1.0.0-py2.py3-none-any.whl", hash = "sha256:c549e3d1e612b7b8e7ed0ab684676b94007e764b5789cbb2c3eda0d4ae78e2ff"}, +] + +[package.dependencies] +bottle = ">=0.10.0" + [[package]] name = "bottle-websocket" version = "0.2.9" @@ -255,6 +270,95 @@ files = [ docs = ["Sphinx", "furo"] test = ["objgraph", "psutil"] +[[package]] +name = "jinja2" +version = "3.1.6" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +groups = ["main"] +files = [ + {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, + {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "markupsafe" +version = "3.0.2" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.9" +groups = ["main"] +files = [ + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, + {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, + {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, + {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, + {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, + {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, + {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, + {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +] + [[package]] name = "pillow" version = "11.2.1" @@ -496,4 +600,4 @@ testing = ["coverage[toml]", "zope.event", "zope.testing"] [metadata] lock-version = "2.1" python-versions = ">=3.10,<4.0" -content-hash = "8fb2435ac6f9cfd75d27dbf3aeb8826077cdfe8a792ba03c25e07fadc6f2c22f" +content-hash = "d293c04556f191acb29cc8f27ed7f14ce989b097f93c1af920c443e26f439037" diff --git a/pyproject.toml b/pyproject.toml index 888308f..ffad213 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -11,7 +11,11 @@ dependencies = [ "pyfis (>=1.13.0,<2.0.0)", "pillow (>=11.2.1,<12.0.0)", "bottle (>=0.13.3,<0.14.0)", - "bottle-websocket (>=0.2.9,<0.3.0)" + "bottle-websocket (>=0.2.9,<0.3.0)", + "bottle-log (>=1.0.0,<2.0.0)", + "gevent-websocket (>=0.10.1,<0.11.0)", + "gevent (>=25.5.1,<26.0.0)", + "jinja2 (>=3.1.6,<4.0.0)" ]