diff --git a/Pipfile b/Pipfile
index 1dc1bf4a6..24ea64af1 100644
--- a/Pipfile
+++ b/Pipfile
@@ -35,8 +35,95 @@ tomli = "*"
pre-commit = "==2.17.0"
[packages]
-pbr = "*"
wheel = "*"
-typing = {markers = "python_version < '3.5'"}
-cython = "*"
-pyyaml = "*"
+alabaster = "==1.0.0"
+astroid = "==3.3.8"
+autopep8 = "==2.3.1"
+babel = "==2.16.0"
+black = "==24.10.0"
+certifi = "==2024.12.14"
+cffi = "==1.17.1"
+cfgv = "==3.4.0"
+charset-normalizer = "==3.4.1"
+click = "==8.1.8"
+colorlog = "==6.9.0"
+coverage = {extras = ["toml"], version = "==7.6.10"}
+cryptography = "==44.0.0"
+dill = "==0.3.9"
+distlib = "==0.3.9"
+docutils = "==0.21.2"
+dulwich = "==0.22.7"
+filelock = "==3.16.1"
+fiximports = "==0.1.18"
+flake8 = "==7.1.1"
+identify = "==2.6.4"
+idna = "==3.10"
+imagesize = "==1.4.1"
+iniconfig = "==2.0.0"
+isort = "==5.13.2"
+"jaraco.classes" = "==3.4.0"
+"jaraco.context" = "==6.0.1"
+"jaraco.functools" = "==4.1.0"
+jeepney = "==0.8.0"
+jinja2 = "==3.1.5"
+keyring = "==25.6.0"
+markdown-it-py = "==3.0.0"
+markupsafe = "==3.0.2"
+mccabe = "==0.7.0"
+mdurl = "==0.1.2"
+mock = "==5.1.0"
+more-itertools = "==10.5.0"
+mypy-extensions = "==1.0.0"
+nh3 = "==0.2.20"
+nodeenv = "==1.9.1"
+packaging = "==24.2"
+pathlib2 = "==2.3.7.post1"
+pathspec = "==0.12.1"
+pbr = "==6.1.0"
+pep8 = "==1.7.1"
+pew = "==1.2.0"
+pkginfo = "==1.12.0"
+platformdirs = "==4.3.6"
+pluggy = "==1.5.0"
+pre-commit = "==2.17.0"
+pycodestyle = "==2.12.1"
+pycparser = "==2.22"
+pyfakefs = "==5.7.3"
+pyflakes = "==3.2.0"
+pygments = "==2.18.0"
+pylint = "==3.3.2"
+pytest = "==8.3.4"
+pytest-cov = "==6.0.0"
+pytest-mock = "==3.14.0"
+pyyaml = "==6.0.2"
+readme-renderer = "==44.0"
+reno = {extras = ["sphinx"], version = "==4.1.0"}
+requests = "==2.32.3"
+requests-toolbelt = "==1.0.0"
+rfc3986 = "==2.0.0"
+rich = "==13.9.4"
+scandir = "==1.10.0"
+secretstorage = "==3.3.3"
+six = "==1.17.0"
+snowballstemmer = "==2.2.0"
+sphinx = "==8.1.3"
+sphinx-rtd-theme = "==3.0.2"
+sphinxcontrib-applehelp = "==2.0.0"
+sphinxcontrib-devhelp = "==2.0.0"
+sphinxcontrib-htmlhelp = "==2.1.0"
+sphinxcontrib-jquery = "==4.1"
+sphinxcontrib-jsmath = "==1.0.1"
+sphinxcontrib-programoutput = "==0.18"
+sphinxcontrib-qthelp = "==2.0.0"
+sphinxcontrib-serializinghtml = "==2.0.0"
+toml = "==0.10.2"
+tomli = "==2.2.1"
+tomlkit = "==0.13.2"
+twine = "==6.0.1"
+typing-extensions = "==4.12.2"
+urllib3 = "==2.3.0"
+virtualenv = "==20.28.0"
+virtualenv-clone = "==0.5.7"
+yapf = "==0.43.0"
+cython = "==3.0.11"
+typing = "==3.7.4.3"
diff --git a/Pipfile.lock b/Pipfile.lock
index 96c5f6624..6feff6f44 100644
--- a/Pipfile.lock
+++ b/Pipfile.lock
@@ -1,7 +1,7 @@
{
"_meta": {
"hash": {
- "sha256": "662e1fde9539df5911a5bd1489565617814cbd843dbe57d9bf0efe5a5d24b3ec"
+ "sha256": "1e9f36a4f544e92a3ad868b7e14649d333257f6463fd754827d7cb756cad44e6"
},
"pipfile-spec": 6,
"requires": {
@@ -16,6 +16,14 @@
]
},
"default": {
+ "cfgv": {
+ "hashes": [
+ "sha256:a8dc6b26ad22ff227d2634a65cb388215ce6cc96bbcc5cfde7641ae87e8dacc0",
+ "sha256:d5b1034354820651caa73ede66a6294d6e95c1b00acc5e9b098e917404669132"
+ ],
+ "markers": "python_version >= '3.10'",
+ "version": "==3.5.0"
+ },
"cython": {
"hashes": [
"sha256:0b1d1f6f94cc5d42a4591f6d60d616786b9cd15576b112bc92a23131fcf38020",
@@ -89,74 +97,223 @@
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==3.0.11"
},
+ "distlib": {
+ "hashes": [
+ "sha256:4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b",
+ "sha256:f152097224a0ae24be5a0f6bae1b9359af82133bce63f98a95f86cae1aede9ed"
+ ],
+ "version": "==0.4.3"
+ },
+ "dulwich": {
+ "hashes": [
+ "sha256:04252b107a1600325f5f0301dde8b5b62f5bb51a0467e360070baddbb4edcea7",
+ "sha256:116ac7decb923a473540bf813c1ceb061bef07209fad5fb002d867f1907f9393",
+ "sha256:11b1f5a6a6075ab4f906dfb755c1d805c8c898ba4f4816b0fdb6123e113030ac",
+ "sha256:1c35c294acfc5a0a88d01d5db1abeba550bf6274bcc3fddbf8b365e9eea280da",
+ "sha256:204d14692fb1dd850ab773690f7530f4065f405e9e7dd3f85bdf92e9330ffa2d",
+ "sha256:21e2e9b81ab04ad83f2d4101ac515ef56ee08d06fd853c1a7ac255f20bb49963",
+ "sha256:27db364f2f3cf5b0dddd44d6c2ae9a20f6021e2bae8b1268fa689076f0192244",
+ "sha256:371394e2c6f3f9789cdc0abb965dae9bc62e79984b84f35339e9d466598c9fb0",
+ "sha256:405cfd53a99374ff03aacdd7a86d6a07615feca072ed69721f49ae2ebaa3eab4",
+ "sha256:493e2ea0f23a8e9aae8e3000a366d1fbf0ed2c13eaf8f41863f050c6392ef138",
+ "sha256:4940fbf7cb37870686c63dfc7682e1afdab0e55b663bb614572909b68e775d31",
+ "sha256:4cf80217e73a039614dde5ab2c74917833632912b788074bc7158058aafbf3e5",
+ "sha256:5ff9f36c95deaf7eb5d6ccde4c68adbcb932a87e03c1b479a8d94d779e7cc5d2",
+ "sha256:6993ad48f92dc38a43e3c1bf25efb03a62fc2cf4db86a2e904b6c7176dafc3d5",
+ "sha256:6d9720d591052730775dcbf450f0cd5b35162f4eeb4754337a5d763326481b2f",
+ "sha256:6fcbb3dec5733898be2114476ff5abaa1dbb8a6d28ffbe492b3225a5a556197e",
+ "sha256:6fd9911fb57ee2d6eefaf895df65e1139fbc911fa560e959b38feabe5f15003f",
+ "sha256:72512e2a22df6fb65ba7b66f5037046019a12343f6e9e54f42bcc4a68ab3d628",
+ "sha256:72ac4f3fc92d54115ba2d812263117d9577b17f4c62ae8f170c177515f62e9d3",
+ "sha256:794a85b8b9d4ad57d02c8cb455735419ac50c0f2e3d26d83873e34abee58cb1b",
+ "sha256:79728d98e0ec184856d71fd0d55abbf5ac7345b5baea9f2d1533a4de9064e13d",
+ "sha256:7b4a2f497718bfe1a3b21f933ee27c111b9cea560c0b2d8a6d939e1b5f297f79",
+ "sha256:7c187efaebb72146245ebcb872b89fdc99314fa37442119c5a5feb18af3f4b8a",
+ "sha256:824b7f5b22b128c1e1ad7c655e9790e2d75c7ab1ba1e40a708024193f1dc47a3",
+ "sha256:82e8810e57f9651a624116e3fede33276f89406cb910f517b944105e284e6755",
+ "sha256:8d8175dbe4feaf62bcafc8708448bfe223b4dfc71609be25c0cf2b0962abc36c",
+ "sha256:9139d0110580a3038048286e761e9be166ec40a2eb19218b41b75541c5d87a86",
+ "sha256:9e357d825b82e7fec2b83cd8e50f3c099c14c1070e1df961bfefb83943dc1582",
+ "sha256:ad4b6114440f9cf72315b173532ee3284f27a288b8a24bc27e45b2e54593720d",
+ "sha256:c60ddc8206e04e8e08208eac80130004eff0d587c82d398beeca7330cade061f",
+ "sha256:c639a8c9fb7e745749f2dcbd5b63a82df2fc99cfe62e2c3654ec025a42d2e51f",
+ "sha256:cb1f8d658f36b2ac3982715dc3e49f0d741a3e5a8c40136bebb6d8493968aa12",
+ "sha256:cdd15b8442b527575d733d90cfd6d3c4cbaebf989e2298b0cb57a7916c66254f",
+ "sha256:dd2783352917b7cb3ab12b7c3f7757210d93af6df0bd2d876a8e5b53b2feb3eb",
+ "sha256:dd2b66c915f1b22ca6533b48e8ee435800b25f74f419c40e1a92271666d8b297",
+ "sha256:e103584421b7205f022bd413a324ff26905ffa84fcc1536f5787bf554d5d390b",
+ "sha256:e995ad77b0685747bdb51f7a5cd7e6cb8efe73e29517b0f2c95fc2e6d10d5a90",
+ "sha256:eb27a9ebe9029c872abadf4f9dcb18c9f6a4b7a4afe137f79a61df1ae59dc6bf",
+ "sha256:f682671a2e19b7b4caa572ff3073557de049a153946305e051a4f50bb0e5e1bd",
+ "sha256:f887643cf1c7a04e898547bd9f0acf6654d772ebd153012433ef950315dcf776",
+ "sha256:fa7a089298fcbdaed493dd25c2f13574ccfc708f89a7aae8e3c25fd8393f5c81",
+ "sha256:fae59c5e345f5ca234c85d157f1c7d5e0086126b45b5f7cfa66ffe41d049fdd6"
+ ],
+ "markers": "python_version >= '3.10'",
+ "version": "==1.2.6"
+ },
+ "filelock": {
+ "hashes": [
+ "sha256:10cdb3656fc44541cdf30652a93fb10ec6b05325620eb316bd26893e4201538a",
+ "sha256:dac1648087d5115554850d113e7dd8c83ab2d38e3435dde2d4f163847e57b767"
+ ],
+ "markers": "python_version >= '3.10'",
+ "version": "==3.29.4"
+ },
+ "identify": {
+ "hashes": [
+ "sha256:20e6a87f786f768c092a721ad107fc9df0eb89347be9396cadf3f4abbd1fb78a",
+ "sha256:6be5020c38fcb07da56c53733538a3081ea5aa70d36a156f83044bfbf9173842"
+ ],
+ "markers": "python_version >= '3.10'",
+ "version": "==2.6.19"
+ },
+ "nodeenv": {
+ "hashes": [
+ "sha256:5bb13e3eed2923615535339b3c620e76779af4cb4c6a90deccc9e36b274d3827",
+ "sha256:996c191ad80897d076bdfba80a41994c2b47c68e224c542b48feba42ba00f8bb"
+ ],
+ "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'",
+ "version": "==1.10.0"
+ },
+ "packaging": {
+ "hashes": [
+ "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e",
+ "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==26.2"
+ },
"pbr": {
"hashes": [
- "sha256:788183e382e3d1d7707db08978239965e8b9e4e5ed42669bf4758186734d5f24",
- "sha256:a776ae228892d8013649c0aeccbb3d5f99ee15e005a4cbb7e61d55a067b28a2a"
+ "sha256:b46004ec30a5324672683ec848aed9e8fc500b0d261d40a3229c2d2bbfcedc29",
+ "sha256:ff223894eb1cd271a98076b13d3badff3bb36c424074d26334cd25aebeecea6b"
],
"index": "pypi",
"markers": "python_version >= '2.6'",
- "version": "==6.1.0"
+ "version": "==7.0.3"
+ },
+ "platformdirs": {
+ "hashes": [
+ "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7",
+ "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a"
+ ],
+ "markers": "python_version >= '3.10'",
+ "version": "==4.10.0"
+ },
+ "pre-commit": {
+ "hashes": [
+ "sha256:718d2208cef53fdc38206e40524a6d4d9576d103eb16f0fec11c875e7716e9d9",
+ "sha256:e2cf246f7299edcabcf15f9b0571fdce06058527f0a06535068a86d38089f29b"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.10'",
+ "version": "==4.6.0"
+ },
+ "python-discovery": {
+ "hashes": [
+ "sha256:475803f53b7b2ed6e490e27373f9d8340f7d2eebf9acdaf645d7d714c97bb500",
+ "sha256:8f3746c4b4968d22afbb97d36e1a0e5b66e6c0f297290f2e95f05b9b8bf18690"
+ ],
+ "markers": "python_version >= '3.8'",
+ "version": "==1.4.2"
},
"pyyaml": {
"hashes": [
- "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff",
- "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48",
- "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086",
- "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e",
- "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133",
- "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5",
- "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484",
- "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee",
- "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5",
- "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68",
- "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a",
- "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf",
- "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99",
- "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8",
- "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85",
- "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19",
- "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc",
- "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a",
- "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1",
- "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317",
- "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c",
- "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631",
- "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d",
- "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652",
- "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5",
- "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e",
- "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b",
- "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8",
- "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476",
- "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706",
- "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563",
- "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237",
- "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b",
- "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083",
- "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180",
- "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425",
- "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e",
- "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f",
- "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725",
- "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183",
- "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab",
- "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774",
- "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725",
- "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e",
- "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5",
- "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d",
- "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290",
- "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44",
- "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed",
- "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4",
- "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba",
- "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12",
- "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"
+ "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c",
+ "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a",
+ "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3",
+ "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956",
+ "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6",
+ "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c",
+ "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65",
+ "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a",
+ "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0",
+ "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b",
+ "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1",
+ "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6",
+ "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7",
+ "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e",
+ "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007",
+ "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310",
+ "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4",
+ "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9",
+ "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295",
+ "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea",
+ "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0",
+ "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e",
+ "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac",
+ "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9",
+ "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7",
+ "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35",
+ "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb",
+ "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b",
+ "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69",
+ "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5",
+ "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b",
+ "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c",
+ "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369",
+ "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd",
+ "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824",
+ "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198",
+ "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065",
+ "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c",
+ "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c",
+ "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764",
+ "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196",
+ "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b",
+ "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00",
+ "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac",
+ "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8",
+ "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e",
+ "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28",
+ "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3",
+ "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5",
+ "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4",
+ "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b",
+ "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf",
+ "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5",
+ "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702",
+ "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8",
+ "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788",
+ "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da",
+ "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d",
+ "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc",
+ "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c",
+ "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba",
+ "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f",
+ "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917",
+ "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5",
+ "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26",
+ "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f",
+ "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b",
+ "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be",
+ "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c",
+ "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3",
+ "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6",
+ "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926",
+ "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"
],
"index": "pypi",
"markers": "python_version >= '3.8'",
- "version": "==6.0.2"
+ "version": "==6.0.3"
+ },
+ "reno": {
+ "hashes": [
+ "sha256:9b6a2cb768ffb7f7c74bbd76822acff70840a1219f45bcec5080dbc108df4f96",
+ "sha256:f992f1fdbd16215ec9de47af08131d53a2830c9e78439eb563ce8d6a7f625370"
+ ],
+ "index": "pypi",
+ "markers": "python_version >= '3.6'",
+ "version": "==4.1.0"
+ },
+ "setuptools": {
+ "hashes": [
+ "sha256:7d872682c5d01cfde07da7bccc7b65469d3dca203318515ada1de5eda35efbf9",
+ "sha256:a59e362652f08dcd477c78bb6e7bd9d80a7995bc73ce773050228a348ce2e5bb"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==82.0.1"
},
"typing": {
"hashes": [
@@ -166,6 +323,22 @@
"markers": "python_version < '3.5'",
"version": "==3.7.4.3"
},
+ "urllib3": {
+ "hashes": [
+ "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c",
+ "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897"
+ ],
+ "markers": "python_version >= '3.10'",
+ "version": "==2.7.0"
+ },
+ "virtualenv": {
+ "hashes": [
+ "sha256:55aa670b67bbfb991b03fda39bd3276d92c419d702376e98c5df1c9989a26783",
+ "sha256:dca3bf98275a59c652b69d68e73433e597d977c2da9198882479d1a7188009c8"
+ ],
+ "markers": "python_version >= '3.9'",
+ "version": "==21.5.1"
+ },
"wheel": {
"hashes": [
"sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729",
diff --git a/guake/boxes.py b/guake/boxes.py
index 665ded971..a5365c237 100644
--- a/guake/boxes.py
+++ b/guake/boxes.py
@@ -5,6 +5,7 @@
gi.require_version("Vte", "2.91") # vte-0.42
gi.require_version("Gtk", "3.0")
+from gi.repository import GLib
from gi.repository import GObject
from gi.repository import Gdk
from gi.repository import Gio
@@ -636,10 +637,17 @@ def remove_dead_child(self, child):
print("I have never seen this widget!")
+# Foreground color applied to a background tab's title when it has unseen
+# activity. Chosen to stay readable on both light and dark tab bars.
+TAB_ACTIVITY_COLOR = "#E8A33D"
+
+
class TabLabelEventBox(Gtk.EventBox):
def __init__(self, notebook, text, settings):
super().__init__()
self.notebook = notebook
+ self._text = text
+ self._activity = False
self.box = Gtk.Box(homogeneous=Gtk.Orientation.HORIZONTAL, spacing=0, visible=True)
self.label = Gtk.Label(label=text, visible=True)
self.close_button = Gtk.Button(
@@ -656,10 +664,36 @@ def __init__(self, notebook, text, settings):
self.connect("button-press-event", self.on_button_press, self.label)
def set_text(self, text):
- self.label.set_text(text)
+ self._text = text
+ self._render()
def get_text(self):
- return self.label.get_text()
+ return self._text
+
+ def set_activity(self, active):
+ """Highlight (or clear) this tab's title to signal unseen output.
+
+ Returns True if the activity state actually changed, so callers can
+ avoid redundant re-rendering on the frequent contents-changed signal.
+ """
+ active = bool(active)
+ if active == self._activity:
+ return False
+ self._activity = active
+ self._render()
+ return True
+
+ def get_activity(self):
+ return self._activity
+
+ def _render(self):
+ if self._activity:
+ self.label.set_markup(
+ f''
+ f"{GLib.markup_escape_text(self._text)}"
+ )
+ else:
+ self.label.set_text(self._text)
def grab_focus_on_last_focused_terminal(self):
server_time = get_server_time(self.notebook.guake.window)
diff --git a/guake/data/org.guake.gschema.xml b/guake/data/org.guake.gschema.xml
index d8846e77b..cad5252fa 100644
--- a/guake/data/org.guake.gschema.xml
+++ b/guake/data/org.guake.gschema.xml
@@ -171,6 +171,21 @@
Audible bell
If true, the system alert sound will be played on a bell character.
+
+ false
+ Highlight tabs with activity
+ If true, the title of a background tab is highlighted when its terminal produces output, until the tab is selected.
+
+
+ 3.0
+ Activity grace period for new tabs
+ Number of seconds during which activity is ignored on a newly created tab, to avoid highlighting it because of its initial shell prompt.
+
+
+ 1.0
+ Activity grace period after losing focus
+ Number of seconds during which activity is ignored on a tab right after it loses focus.
+
100
Window width.
diff --git a/guake/data/prefs.glade b/guake/data/prefs.glade
index f1b2c2db2..6e58140d5 100644
--- a/guake/data/prefs.glade
+++ b/guake/data/prefs.glade
@@ -52,6 +52,16 @@
1
10
+
+