Compare commits

..

2 commits
master ... nix

Author SHA1 Message Date
Adam Gausmann
3811e38dac Multi-host Nix framework 2024-08-28 11:58:09 -05:00
Adam Gausmann
c50ed8a901 Nix project skeleton 2024-08-28 11:07:30 -05:00
39 changed files with 633 additions and 1622 deletions

4
.gitignore vendored
View file

@ -2,5 +2,5 @@
__pycache__ __pycache__
*.pyc *.pyc
http_cache.sqlite # home-manager output
test_output /result

View file

@ -4,12 +4,9 @@ verify_ssl = true
name = "pypi" name = "pypi"
[packages] [packages]
mako = "*"
toml = "*" toml = "*"
pyyaml = "*" pyyaml = "*"
requests = "*" requests = "*"
requests-cache = "*"
attrs = "*"
cattrs = "*"
jinja2 = "*"
[dev-packages] [dev-packages]

505
Pipfile.lock generated
View file

@ -1,7 +1,7 @@
{ {
"_meta": { "_meta": {
"hash": { "hash": {
"sha256": "fc47da1b3ed38e959a395151eeda0547cf4399f14ebe255028e1465586bbe20b" "sha256": "6dd7401b01b42acded1cd79ddaf80273fb3be8f90eee6ccd13010c388fdc3f8a"
}, },
"pipfile-spec": 6, "pipfile-spec": 6,
"requires": {}, "requires": {},
@ -14,299 +14,258 @@
] ]
}, },
"default": { "default": {
"attrs": {
"hashes": [
"sha256:8f5c07333d543103541ba7be0e2ce16eeee8130cb0b3f9238ab904ce1e85baff",
"sha256:ac96cd038792094f438ad1f6ff80837353805ac950cd2aa0e0625ef19850c308"
],
"index": "pypi",
"markers": "python_version >= '3.8'",
"version": "==24.3.0"
},
"cattrs": {
"hashes": [
"sha256:67c7495b760168d931a10233f979b28dc04daf853b30752246f4f8471c6d68d0",
"sha256:8028cfe1ff5382df59dd36474a86e02d817b06eaf8af84555441bac915d2ef85"
],
"index": "pypi",
"markers": "python_version >= '3.8'",
"version": "==24.1.2"
},
"certifi": { "certifi": {
"hashes": [ "hashes": [
"sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56", "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1",
"sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db" "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"
], ],
"markers": "python_version >= '3.6'", "markers": "python_version >= '3.6'",
"version": "==2024.12.14" "version": "==2023.11.17"
}, },
"charset-normalizer": { "charset-normalizer": {
"hashes": [ "hashes": [
"sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537", "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027",
"sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa", "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087",
"sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a", "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786",
"sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294", "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8",
"sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b", "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09",
"sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd", "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185",
"sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601", "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574",
"sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd", "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e",
"sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4", "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519",
"sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d", "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898",
"sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2", "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269",
"sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313", "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3",
"sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd", "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f",
"sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa", "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6",
"sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8", "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8",
"sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1", "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a",
"sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2", "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73",
"sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496", "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc",
"sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d", "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714",
"sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b", "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2",
"sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e", "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc",
"sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a", "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce",
"sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4", "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d",
"sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca", "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e",
"sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78", "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6",
"sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408", "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269",
"sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5", "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96",
"sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3", "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d",
"sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f", "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a",
"sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a", "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4",
"sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765", "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77",
"sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6", "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d",
"sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146", "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0",
"sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6", "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed",
"sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9", "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068",
"sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd", "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac",
"sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c", "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25",
"sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f", "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8",
"sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545", "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab",
"sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176", "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26",
"sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770", "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2",
"sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824", "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db",
"sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f", "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f",
"sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf", "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5",
"sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487", "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99",
"sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d", "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c",
"sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd", "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d",
"sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b", "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811",
"sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534", "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa",
"sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f", "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a",
"sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b", "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03",
"sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9", "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b",
"sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd", "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04",
"sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125", "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c",
"sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9", "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001",
"sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de", "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458",
"sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11", "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389",
"sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d", "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99",
"sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35", "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985",
"sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f", "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537",
"sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda", "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238",
"sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7", "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f",
"sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a", "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d",
"sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971", "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796",
"sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8", "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a",
"sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41", "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143",
"sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d", "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8",
"sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f", "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c",
"sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757", "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5",
"sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a", "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5",
"sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886", "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711",
"sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77", "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4",
"sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76", "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6",
"sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247", "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c",
"sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85", "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7",
"sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb", "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4",
"sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7", "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b",
"sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e", "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae",
"sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6", "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12",
"sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037", "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c",
"sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1", "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae",
"sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e", "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8",
"sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807", "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887",
"sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407", "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b",
"sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c", "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4",
"sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12", "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f",
"sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3", "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5",
"sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089", "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33",
"sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd", "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519",
"sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e", "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"
"sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00",
"sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"
], ],
"markers": "python_version >= '3.7'", "markers": "python_full_version >= '3.7.0'",
"version": "==3.4.1" "version": "==3.3.2"
}, },
"idna": { "idna": {
"hashes": [ "hashes": [
"sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca",
"sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3" "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"
], ],
"markers": "python_version >= '3.6'", "markers": "python_version >= '3.5'",
"version": "==3.10" "version": "==3.6"
}, },
"jinja2": { "mako": {
"hashes": [ "hashes": [
"sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", "sha256:57d4e997349f1a92035aa25c17ace371a4213f2ca42f99bee9a602500cfd54d9",
"sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67" "sha256:e3a9d388fd00e87043edbe8792f45880ac0114e9c4adc69f6e9bfb2c55e3b11b"
], ],
"index": "pypi", "index": "pypi",
"markers": "python_version >= '3.7'", "markers": "python_version >= '3.8'",
"version": "==3.1.6" "version": "==1.3.0"
}, },
"markupsafe": { "markupsafe": {
"hashes": [ "hashes": [
"sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4", "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e",
"sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30", "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e",
"sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0", "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431",
"sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9", "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686",
"sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396", "sha256:14ff806850827afd6b07a5f32bd917fb7f45b046ba40c57abdb636674a8b559c",
"sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13", "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559",
"sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028", "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc",
"sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca", "sha256:1b8dd8c3fd14349433c79fa8abeb573a55fc0fdd769133baac1f5e07abf54aeb",
"sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557", "sha256:1f67c7038d560d92149c060157d623c542173016c4babc0c1913cca0564b9939",
"sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832", "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c",
"sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0", "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0",
"sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b", "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4",
"sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579", "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9",
"sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a", "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575",
"sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c", "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba",
"sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff", "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d",
"sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c", "sha256:47d4f1c5f80fc62fdd7777d0d40a2e9dda0a05883ab11374334f6c4de38adffd",
"sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22", "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3",
"sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094", "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00",
"sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb", "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155",
"sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e", "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac",
"sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5", "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52",
"sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a", "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f",
"sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d", "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8",
"sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a", "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b",
"sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b", "sha256:715d3562f79d540f251b99ebd6d8baa547118974341db04f5ad06d5ea3eb8007",
"sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8", "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24",
"sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225", "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea",
"sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c", "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198",
"sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144", "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0",
"sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f", "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee",
"sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87", "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be",
"sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d", "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2",
"sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93", "sha256:8f9293864fe09b8149f0cc42ce56e3f0e54de883a9de90cd427f191c346eb2e1",
"sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf", "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707",
"sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158", "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6",
"sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84", "sha256:9aad3c1755095ce347e26488214ef77e0485a3c34a50c5a5e2471dff60b9dd9c",
"sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb", "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58",
"sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48", "sha256:aa57bd9cf8ae831a362185ee444e15a93ecb2e344c8e52e4d721ea3ab6ef1823",
"sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171", "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779",
"sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c", "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636",
"sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6", "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c",
"sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd", "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad",
"sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d", "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee",
"sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1", "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc",
"sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d", "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2",
"sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca", "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48",
"sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a", "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7",
"sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29", "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e",
"sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe", "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b",
"sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798", "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa",
"sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c", "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5",
"sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8", "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e",
"sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f", "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb",
"sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f", "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9",
"sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a", "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57",
"sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178", "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc",
"sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0", "sha256:f698de3fd0c4e6972b92290a45bd9b1536bffe8c6759c62471efaa8acb4c37bc",
"sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79", "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2",
"sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430", "sha256:ffcc3f7c66b5f5b7931a5aa68fc9cecc51e685ef90282f4a82f0f5e9b704ad11"
"sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"
], ],
"markers": "python_version >= '3.9'", "markers": "python_version >= '3.7'",
"version": "==3.0.2" "version": "==2.1.3"
},
"platformdirs": {
"hashes": [
"sha256:357fb2acbc885b0419afd3ce3ed34564c13c9b95c89360cd9563f73aa5e2b907",
"sha256:73e575e1408ab8103900836b97580d5307456908a03e92031bab39e4554cc3fb"
],
"markers": "python_version >= '3.8'",
"version": "==4.3.6"
}, },
"pyyaml": { "pyyaml": {
"hashes": [ "hashes": [
"sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff", "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5",
"sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48", "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc",
"sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086", "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df",
"sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e", "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741",
"sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133", "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206",
"sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5", "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27",
"sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484", "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595",
"sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee", "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62",
"sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5", "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98",
"sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68", "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696",
"sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a", "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290",
"sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf", "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9",
"sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99", "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d",
"sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8", "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6",
"sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85", "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867",
"sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19", "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47",
"sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc", "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486",
"sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a", "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6",
"sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1", "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3",
"sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317", "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007",
"sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c", "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938",
"sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631", "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0",
"sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d", "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c",
"sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652", "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735",
"sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5", "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d",
"sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e", "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28",
"sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b", "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4",
"sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8", "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba",
"sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476", "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8",
"sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706", "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5",
"sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563", "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd",
"sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237", "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3",
"sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b", "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0",
"sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083", "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515",
"sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180", "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c",
"sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425", "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c",
"sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e", "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924",
"sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f", "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34",
"sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725", "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43",
"sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183", "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859",
"sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab", "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673",
"sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774", "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54",
"sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725", "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a",
"sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e", "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b",
"sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5", "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab",
"sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d", "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa",
"sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290", "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c",
"sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44", "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585",
"sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed", "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d",
"sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4", "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"
"sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba",
"sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12",
"sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"
], ],
"index": "pypi", "index": "pypi",
"markers": "python_version >= '3.8'", "markers": "python_version >= '3.6'",
"version": "==6.0.2" "version": "==6.0.1"
}, },
"requests": { "requests": {
"hashes": [ "hashes": [
"sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f",
"sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"
], ],
"index": "pypi", "index": "pypi",
"markers": "python_version >= '3.8'", "markers": "python_version >= '3.7'",
"version": "==2.32.3" "version": "==2.31.0"
},
"requests-cache": {
"hashes": [
"sha256:1285151cddf5331067baa82598afe2d47c7495a1334bfe7a7d329b43e9fd3603",
"sha256:68abc986fdc5b8d0911318fbb5f7c80eebcd4d01bfacc6685ecf8876052511d1"
],
"index": "pypi",
"markers": "python_version >= '3.8'",
"version": "==1.2.1"
}, },
"toml": { "toml": {
"hashes": [ "hashes": [
@ -314,24 +273,16 @@
"sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f" "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"
], ],
"index": "pypi", "index": "pypi",
"markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2'", "markers": "python_version >= '2.6' and python_version not in '3.0, 3.1, 3.2, 3.3'",
"version": "==0.10.2" "version": "==0.10.2"
}, },
"url-normalize": {
"hashes": [
"sha256:d23d3a070ac52a67b83a1c59a0e68f8608d1cd538783b401bc9de2c0fac999b2",
"sha256:ec3c301f04e5bb676d333a7fa162fa977ad2ca04b7e652bfc9fac4e405728eed"
],
"markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'",
"version": "==1.4.3"
},
"urllib3": { "urllib3": {
"hashes": [ "hashes": [
"sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df", "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3",
"sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d" "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"
], ],
"markers": "python_version >= '3.9'", "markers": "python_version >= '3.8'",
"version": "==2.3.0" "version": "==2.1.0"
} }
}, },
"develop": {} "develop": {}

132
flake.lock generated Normal file
View file

@ -0,0 +1,132 @@
{
"nodes": {
"flake-utils": {
"inputs": {
"systems": "systems"
},
"locked": {
"lastModified": 1710146030,
"narHash": "sha256-SZ5L6eA7HJ/nmkzGG7/ISclqe6oZdOZTNoesiInkXPQ=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "b1d9ab70662946ef0850d488da1c9019f3a9752a",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"flake-utils_2": {
"locked": {
"lastModified": 1659877975,
"narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"home-manager": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1720607326,
"narHash": "sha256-0Bpp15EMSP+Q/4TyIS/tQnKU5ZjbZGDtxoQFu+ddqCY=",
"owner": "exzombie",
"repo": "home-manager-smona",
"rev": "ff5bf3f36ebd59dec42b00dad40e195ae8818ee4",
"type": "github"
},
"original": {
"owner": "exzombie",
"ref": "nixgl-compat",
"repo": "home-manager-smona",
"type": "github"
}
},
"nixGL": {
"inputs": {
"flake-utils": "flake-utils_2",
"nixpkgs": "nixpkgs"
},
"locked": {
"lastModified": 1713543440,
"narHash": "sha256-lnzZQYG0+EXl/6NkGpyIz+FEOc/DSEG57AP1VsdeNrM=",
"owner": "nix-community",
"repo": "nixGL",
"rev": "310f8e49a149e4c9ea52f1adf70cdc768ec53f8a",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "nixGL",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1660551188,
"narHash": "sha256-a1LARMMYQ8DPx1BgoI/UN4bXe12hhZkCNqdxNi6uS0g=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "441dc5d512153039f19ef198e662e4f3dbb9fd65",
"type": "github"
},
"original": {
"owner": "nixos",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1724242322,
"narHash": "sha256-HMpK7hNjhEk4z5SFg5UtxEio9OWFocHdaQzCfW1pE7w=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "224042e9a3039291f22f4f2ded12af95a616cca0",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "nixos-24.05",
"type": "indirect"
}
},
"root": {
"inputs": {
"flake-utils": "flake-utils",
"home-manager": "home-manager",
"nixGL": "nixGL",
"nixpkgs": "nixpkgs_2"
}
},
"systems": {
"locked": {
"lastModified": 1681028828,
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
"owner": "nix-systems",
"repo": "default",
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

19
flake.nix Normal file
View file

@ -0,0 +1,19 @@
{
inputs = {
nixpkgs.url = "nixpkgs/nixos-24.05";
flake-utils.url = "github:numtide/flake-utils";
home-manager = {
url = "github:exzombie/home-manager-smona/nixgl-compat";
inputs.nixpkgs.follows = "nixpkgs";
};
nixGL.url = "github:nix-community/nixGL";
};
outputs = { nixpkgs, ... } @ inputs:
(import ./modules/hosts.nix inputs) // {
# TODO devshell config
};
}

View file

@ -1,40 +1,31 @@
wireless = ["wlp5s0"] wireless = ["wlp5s0"]
ethernet = ["enp6s0"] ethernet = ["enp6s0"]
# hwmon2 = k10temp, temp1 = Tctl # hwmon2 = k10temp, temp1 = Tctl
temperature_path = "/sys/class/hwmon/hwmon2/temp1_input" temperature-path = "/sys/class/hwmon/hwmon2/temp1_input"
[[outputs]] [[outputs]]
match = "*" match = "*"
background_path = "~/.local/share/backgrounds/adventurer/full.jpg" background = ["~/.local/share/backgrounds/adventurer/full.jpg", "fill"]
[[outputs]]
match = "LG Electronics LG ULTRAWIDE 312NTYT34842"
position = [0, 1080]
mode = "3440x1440@160Hz"
[[outputs]] [[outputs]]
match = "ASUSTek COMPUTER INC VG258 M1LMQS004947" match = "ASUSTek COMPUTER INC VG258 M1LMQS004947"
position = [0, 0] position = [0, 1080]
mode = "1920x1080@165Hz" mode = "1920x1080@165Hz"
background_path = "~/.local/share/backgrounds/adventurer/l.jpg" background = ["~/.local/share/backgrounds/adventurer/l.jpg", "fill"]
[[outputs]] [[outputs]]
match = "BNQ BenQ GL2580 46J02196SL0" match = "BNQ BenQ GL2580 46J02196SL0"
position = [1920, 1080] position = [1920, 1080]
mode = "1920x1080@60Hz" mode = "1920x1080@60Hz"
background_path = "~/.local/share/backgrounds/adventurer/r.jpg" background = ["~/.local/share/backgrounds/adventurer/r.jpg", "fill"]
[[outputs]] [[outputs]]
match = "BNQ BenQ GL2580 46J02151SL0" match = "BNQ BenQ GL2580 46J02151SL0"
position = [960, 0] position = [960, 0]
mode = "1920x1080@60Hz" mode = "1920x1080@60Hz"
background_path = "~/.local/share/backgrounds/adventurer/t.jpg" background = ["~/.local/share/backgrounds/adventurer/t.jpg", "fill"]
[[outputs]] [[outputs]]
match = "Pioneer Electronic Corporation AV Receiver Unknown" match = "Pioneer Electronic Corporation AV Receiver Unknown"
mode = "3840x2160@60Hz" mode = "3840x2160@60Hz"
scale = 2 scale = 2
[niri]
# 1/3 proportion is better for the ultrawide
default_column_width = 0.33333

View file

@ -3,7 +3,7 @@ ethernet = ["eno1"]
[[outputs]] [[outputs]]
match = "*" match = "*"
background_path = "~/.local/share/backgrounds/concord/full.jpg" background = ["~/.local/share/backgrounds/concord/full.jpg", "fill"]
[[outputs]] [[outputs]]
match = "Pioneer Electronic Corporation AV Receiver Unknown" match = "Pioneer Electronic Corporation AV Receiver Unknown"

12
hosts/default.toml Normal file
View file

@ -0,0 +1,12 @@
is-virtual = false
base16-scheme = "seti"
disks = ["/"]
system-font = "Fira Sans"
system-mono-font = "Fira Mono"
#temperature-path = ""
[[outputs]]
match = "*"
background = ["~/.local/share/backgrounds/sway-dark-1920x1080.png", "fill"]
inputs = []

View file

@ -1,7 +1,7 @@
wireless = ["wlp4s0"] wireless = ["wlp4s0"]
ethernet = ["enp2s0"] ethernet = ["enp2s0"]
temperature_path = "/sys/class/hwmon/hwmon5/temp1_input" temperature-path = "/sys/class/hwmon/hwmon5/temp1_input"
[[outputs]] [[outputs]]
match = "*" match = "*"
background_path = "~/.local/share/backgrounds/faithful/full.jpg" background = ["~/.local/share/backgrounds/faithful/full.jpg", "fill"]

View file

@ -1,13 +1,12 @@
wireless = ["wlp170s0"] wireless = ["wlp170s0"]
auto_ethernet = true #ethernet = ["enp2s0"]
temperature_path = "/sys/class/hwmon/hwmon4/temp1_input" temperature-path = "/sys/class/hwmon/hwmon4/temp1_input"
has_battery = true
[[outputs]] [[outputs]]
match = "eDP-1" match = "eDP-1"
background_path = "~/.local/share/backgrounds/liberation.jpg" background = ["~/.local/share/backgrounds/sway-dark-1920x1080.png", "fill"]
scale = 1 scale = "1.25"
[[inputs]] [[inputs]]
match = "2362:628:PIXA3854:00_093A:0274_Touchpad" match = "2362:628:PIXA3854:00_093A:0274_Touchpad"
tap = true tap = "enabled"

View file

@ -1,4 +1,4 @@
wireless = ["wlan0"] wireless = ["wlan0"]
ethernet = ["eth0"] ethernet = ["eth0"]
disk = ["/"] disk = ["/"]
temperature_path = "/sys/class/hwmon/hwmon0/temp1_input" temperature-path = "/sys/class/hwmon/hwmon0/temp1_input"

View file

@ -5,7 +5,7 @@
# it's not feasible to generate and install a universal bashrc. # it's not feasible to generate and install a universal bashrc.
# Aliases # Aliases
alias drs='dbus-run-session' alias dsway='dbus-run-session sway'
alias docker='sudo docker' alias docker='sudo docker'
export EDITOR=hx export EDITOR=hx

View file

@ -1,9 +1,6 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
import argparse import argparse
from dataclasses import dataclass
from datetime import timedelta
from enum import Enum
import os import os
import shutil import shutil
import socket import socket
@ -13,34 +10,29 @@ from functools import partial
from pathlib import Path from pathlib import Path
from typing import List from typing import List
from attrs import define, field import mako.lookup
import cattrs import mako.template
import jinja2 import requests
import requests_cache
import toml import toml
import yaml import yaml
http_session = requests_cache.CachedSession(expire_after=timedelta(days=1)) BASE16_TEMPLATES_URL = 'https://raw.githubusercontent.com/chriskempson/base16-templates-source/master/list.yaml'
BASE16_TEMPLATES = yaml.safe_load(requests.get(BASE16_TEMPLATES_URL).text)
BASE16_TEMPLATES_URL = "https://raw.githubusercontent.com/chriskempson/base16-templates-source/master/list.yaml"
BASE16_TEMPLATES = yaml.safe_load(http_session.get(BASE16_TEMPLATES_URL).text)
# Pending https://github.com/chriskempson/base16-templates-source/pull/106 # Pending https://github.com/chriskempson/base16-templates-source/pull/106
BASE16_TEMPLATES["wofi-colors"] = "https://github.com/agausmann/base16-wofi-colors" BASE16_TEMPLATES['wofi-colors'] = 'https://github.com/agausmann/base16-wofi-colors'
def get_base16(scheme, app, template="default"): def get_base16(scheme, app, template='default'):
base_url = BASE16_TEMPLATES[app] base_url = BASE16_TEMPLATES[app]
if "github.com" in base_url: if 'github.com' in base_url:
base_url = ( base_url = base_url.replace('github.com', 'raw.githubusercontent.com') + '/master/'
base_url.replace("github.com", "raw.githubusercontent.com") + "/master/"
)
else: else:
base_url += "/blob/master/" base_url += '/blob/master/'
config = yaml.safe_load(http_session.get(base_url + "templates/config.yaml").text) config = yaml.safe_load(requests.get(base_url + 'templates/config.yaml').text)
output = config[template]["output"] output = config[template]['output']
extension = config[template]["extension"] extension = config[template]['extension']
return http_session.get(base_url + output + "/base16-" + scheme + extension).text return requests.get(base_url + output + '/base16-' + scheme + extension).text
def is_outdated(src: List[Path], dst: Path) -> bool: def is_outdated(src: List[Path], dst: Path) -> bool:
@ -48,241 +40,114 @@ def is_outdated(src: List[Path], dst: Path) -> bool:
return True return True
dst_modified = dst.stat().st_mtime dst_modified = dst.stat().st_mtime
return any(a_src.stat().st_mtime > dst_modified for a_src in src if a_src.exists()) return any(
a_src.stat().st_mtime > dst_modified
for a_src in src
class BackgroundMode(Enum): if a_src.exists()
Fill = "fill" )
@property
def sway_value(self) -> str:
match self:
case self.Fill:
return "fill"
@property
def wpaperd_value(self) -> str:
match self:
case self.Fill:
return "center"
@define
class InputConfig:
match: str
tap: bool | None = None
@property
def sway_lines(self) -> str:
lines = []
if self.tap is not None:
lines.append(f" tap {'enabled' if self.tap else 'disabled'}")
return "\n".join(lines)
@define
class OutputConfig:
match: str
position: list | None = None
mode: str | None = None
scale: float | None = None
background_path: str | None = None
background_mode: BackgroundMode = BackgroundMode.Fill
port: str | None = None
@property
def sway_lines(self) -> str:
lines = []
if self.position:
lines.append(f" position {' '.join(map(str, self.position))}")
if self.mode:
lines.append(f" mode '{self.mode}'")
if self.background_path:
lines.append(
f" background '{self.background_path}' {self.background_mode.sway_value}"
)
return "\n".join(lines)
@property
def swaylock_image_line(self) -> str | None:
if (self.match != "*" and self.port is None) or self.background_path is None:
return None
if self.match == "*":
return f"image={self.background_path}"
return f"image={self.port}:{self.background_path}"
@property
def niri_lines(self) -> str:
lines = []
if self.position:
lines.append(f" position x={self.position[0]} y={self.position[1]}")
if self.mode:
lines.append(f" mode \"{self.mode.removesuffix('Hz')}\"")
if self.scale:
lines.append(f" scale {self.scale}")
return "\n".join(lines)
@property
def wpaperd_config_fragment(self) -> dict:
if self.background_path is None:
return {}
key = self.match
if self.match == "*":
key = "any"
return {
key: {
"path": self.background_path,
"mode": self.background_mode.wpaperd_value,
}
}
@define
class NiriConfig:
default_column_width: float = 0.5
@define
class HostConfig:
name: str
is_virtual: bool = False
base16_scheme: str = "seti"
wireless: list[str] = field(factory=list)
ethernet: list[str] = field(factory=list)
auto_ethernet: bool = True
disks: list[str] = field(factory=lambda: ["/"])
has_battery: bool = False
system_font: str = "Fira Sans"
system_mono_font: str = "Fira Mono"
temperature_path: str | None = None
terminal: str = "alacritty"
lock_cmd: str = "swaylock -c 000000"
display_on_cmd: str = "wlopm --on *"
display_off_cmd: str = "wlopm --off *"
use_jump_host: bool = False
inputs: list[InputConfig] = field(factory=list)
outputs: list[OutputConfig] = field(factory=list)
niri: NiriConfig = field(factory=NiriConfig)
@property
def swaylock_images(self) -> str:
return "\n".join(
line for output in self.outputs if (line := output.swaylock_image_line)
)
@property
def wpaperd_config(self) -> str:
config = {}
for output in self.outputs:
config.update(output.wpaperd_config_fragment)
return toml.dumps(config)
def main(): def main():
parser = argparse.ArgumentParser( parser = argparse.ArgumentParser(
description="Generates and installs dotfiles for this host.", description='Generates and installs dotfiles for this host.',
formatter_class=argparse.ArgumentDefaultsHelpFormatter, formatter_class=argparse.ArgumentDefaultsHelpFormatter,
) )
parser.add_argument( parser.add_argument(
"-d", '-d', '--dotfiles',
"--dotfiles", help='The base directory of the dotfiles repository.',
help="The base directory of the dotfiles repository.",
type=Path, type=Path,
default=Path(sys.argv[0]).parent, default=Path(sys.argv[0]).parent,
) )
parser.add_argument( parser.add_argument(
"-n", '-n', '--hostname',
"--hostname", help='The hostname or other identifying name of this system that will'
help="The hostname or other identifying name of this system that will" ' be used to retrieve the host-specific configuration.',
" be used to retrieve the host-specific configuration.", default=os.environ.get('HOSTNAME') or socket.gethostname(),
default=os.environ.get("HOSTNAME") or socket.gethostname(),
) )
parser.add_argument( parser.add_argument(
"-o", '-o', '--home',
"--home", help='The home directory where generated dotfiles will be installed.',
help="The home directory where generated dotfiles will be installed.",
type=Path, type=Path,
default=os.environ.get("HOME") or Path.home(), default=os.environ.get('HOME') or Path.home(),
) )
parser.add_argument( parser.add_argument(
"-f", '-f', '--force',
"--force", help='Force overwrite all files even if they are not considered outdated.',
help="Force overwrite all files even if they are not considered outdated.", action='store_true'
action="store_true",
) )
args = parser.parse_args() args = parser.parse_args()
dotfiles_dir: Path = args.dotfiles raw_dir = args.dotfiles / 'raw'
raw_dir = dotfiles_dir / "raw" templates_dir = args.dotfiles / 'templates'
templates_dir = dotfiles_dir / "templates" include_dir = args.dotfiles / 'include'
host_filename = dotfiles_dir / "hosts" / "{}.toml".format(args.hostname) default_host_filename = args.dotfiles / 'hosts' / 'default.toml'
host_filename = args.dotfiles / 'hosts' / '{}.toml'.format(args.hostname)
with open(default_host_filename) as host_file:
host_config = toml.load(host_file)
host_toml = {
"name": args.hostname,
}
if host_filename.exists(): if host_filename.exists():
with open(host_filename) as host_file: with open(host_filename) as host_file:
host_toml.update(toml.load(host_file)) host_config.update(toml.load(host_file))
host_config = cattrs.structure(host_toml, HostConfig) host_config['name'] = args.hostname
for output in host_config.outputs: # Preprocess output configs for sway
# Attempt to resolve port names for swaylock template for input in host_config.get('inputs', []):
# Generate config lines for sway template
lines = []
for key in input:
if key == 'match':
continue
if isinstance(input[key], list):
val = ' '.join(repr(elem) for elem in input[key])
else:
val = repr(input[key])
lines.append(f'{key} {val}')
input['sway-lines'] = lines
for output in host_config['outputs']:
# Generate config lines for sway template
lines = []
for key in output:
if key == 'match':
continue
if isinstance(output[key], list):
val = ' '.join(repr(elem) for elem in output[key])
else:
val = repr(output[key])
lines.append(f'{key} {val}')
output['sway-lines'] = lines
# Attempt to resolve device names for swaylock template
# (Workaround https://github.com/swaywm/swaylock/issues/114) # (Workaround https://github.com/swaywm/swaylock/issues/114)
# #
# This will only work if this is run on the target host # This will only work if this is run on the target host
# and if sway or niri is running, but that is usually the case... # and if sway is running, but that is usually the case...
if output.match == "*": if output['match'] != '*':
continue try:
try:
if "SWAYSOCK" in os.environ:
get_outputs = subprocess.check_output( get_outputs = subprocess.check_output(
["swaymsg", "-t", "get_outputs", "-p"], ['swaymsg', '-t', 'get_outputs', '-p'],
).decode("utf-8") ).decode('utf-8')
for line in get_outputs.splitlines(): for line in get_outputs.splitlines():
# Line format: Output <port> '<match identifier>' # Line format: Output <device> '<match identifier>'
if line.startswith("Output") and output.match in line: if line.startswith('Output') and output['match'] in line:
output.port = line.split()[1] output['device'] = line.split()[1]
break break
except subprocess.CalledProcessError:
print('Could not contact sway to retrieve output names.')
print('Please re-run in sway to finish configuring swaylock.')
elif "NIRI_SOCKET" in os.environ: lookup = mako.lookup.TemplateLookup(
get_outputs = subprocess.check_output( directories=[
["niri", "msg", "outputs"], str(templates_dir),
).decode("utf-8") str(include_dir),
for line in get_outputs.splitlines(): ],
# Line format: Output "<match identifier>" (<port>)
if line.startswith("Output") and output.match in line:
output.port = (
line.split()[-1].removeprefix("(").removesuffix(")")
)
break
else:
print(
"Could not find SWAYSOCK or NIRI_SOCKET, cannot retrieve output names."
)
print("Please re-run in sway or niri to finish configuring swaylock.")
except subprocess.CalledProcessError:
print("Could not contact sway or niri to retrieve output names.")
print("Please re-run in sway or niri to finish configuring swaylock.")
jenv = jinja2.Environment(
loader=jinja2.FileSystemLoader("templates"),
autoescape=jinja2.select_autoescape(),
) )
changed_paths = set() for raw_path in raw_dir.glob('**/*'):
for raw_path in raw_dir.glob("**/*"):
if not raw_path.is_file(): if not raw_path.is_file():
continue continue
rel_path = raw_path.relative_to(raw_dir) rel_path = raw_path.relative_to(raw_dir)
@ -292,35 +157,32 @@ def main():
print(rel_path) print(rel_path)
output_path.parent.mkdir(parents=True, exist_ok=True) output_path.parent.mkdir(parents=True, exist_ok=True)
shutil.copy(raw_path, output_path) shutil.copy(raw_path, output_path)
changed_paths.update(map(str, rel_path.parents))
for template_path in templates_dir.glob("**/*"): for template_path in templates_dir.glob('**/*'):
if not template_path.is_file(): if not template_path.is_file():
continue continue
rel_path = template_path.relative_to(templates_dir) rel_path = template_path.relative_to(templates_dir)
output_path: Path = args.home / template_path.relative_to(templates_dir) output_path = args.home / template_path.relative_to(templates_dir)
output_path = output_path.with_name(output_path.name.removesuffix(".j2"))
if args.force or is_outdated([template_path, host_filename], output_path): if args.force or is_outdated([template_path, host_filename], output_path):
print(rel_path) print(rel_path)
template = jenv.get_template(str(rel_path)) template = mako.template.Template(
filename=str(template_path),
strict_undefined=True,
lookup=lookup,
)
output = template.render( output = template.render(
host=host_config, host=host_config,
home=args.home, home=args.home,
get_base16=partial(get_base16, host_config.base16_scheme), get_base16=partial(get_base16, host_config.get('base16-scheme', 'default-dark')),
) )
output_path.parent.mkdir(parents=True, exist_ok=True) output_path.parent.mkdir(parents=True, exist_ok=True)
with open(output_path, "w+") as output_file: with open(output_path, 'w+') as output_file:
output_file.write(output) output_file.write(output)
# Copy permissions from original file # Copy permissions from original file
output_path.chmod(template_path.stat().st_mode & 0o777) output_path.chmod(template_path.stat().st_mode & 0o777)
changed_paths.update(map(str, rel_path.parents))
# Post-install hooks
if ".config/waybar" in changed_paths:
subprocess.call(["killall", "-USR2", "waybar"])
if __name__ == "__main__": if __name__ == '__main__':
main() main()

12
justfile Normal file
View file

@ -0,0 +1,12 @@
user := `whoami`
hostname := `hostname`
hm_flags := "--flake .#" + user + "@" + hostname
alias b := build
alias inst := install
build:
home-manager build {{hm_flags}}
install:
home-manager switch {{hm_flags}}

14
modules/common.nix Normal file
View file

@ -0,0 +1,14 @@
{ config, lib, pkgs, ... }: {
home = {
stateVersion = "24.05";
username = "goose";
homeDirectory = "/home/goose";
packages = with pkgs; [
# fira-mono
];
};
# programs.home-manager.enable = true;
}

24
modules/hosts.nix Normal file
View file

@ -0,0 +1,24 @@
{ nixpkgs, flake-utils, home-manager, nixGL, ... } @ inputs:
let
getNixOsPkgs = system: import nixpkgs { inherit system; };
getPkgs = system: import nixpkgs {
inherit system;
overlays = [ nixGL.overlay ];
};
makeHostSystem = pkgs: modules: home-manager.lib.homeManagerConfiguration {
inherit pkgs;
modules = [ ./common.nix ] ++ modules;
extraSpecialArgs = {
inherit inputs;
};
};
in
{
packages.x86_64-linux.homeConfigurations = let
pkgs = getPkgs "x86_64-linux";
makeHost = makeHostSystem pkgs;
in {
"goose@adventurer" = makeHost [ /*./hosts/adventurer.nix*/ ];
};
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

View file

@ -1 +0,0 @@
chase-baker-NPiv36bUc4I-unsplash.jpg

View file

@ -0,0 +1 @@
${get_base16('wofi-colors')}

View file

@ -1 +0,0 @@
{{ get_base16('wofi-colors') }}

View file

@ -1,5 +1,9 @@
[font] [font]
size = {{ 10 if host.is_virtual else 12 }} % if host.get('is-virtual', False):
size = 10
% else:
size = 12
%endif
[font.bold] [font.bold]
family = "Fira Mono" family = "Fira Mono"
@ -10,4 +14,4 @@ family = "Fira Mono"
[window] [window]
opacity = 0.9 opacity = 0.9
{{ get_base16('alacritty') }} ${get_base16('alacritty')}

View file

@ -3,4 +3,5 @@
origin = bottom-center origin = bottom-center
font = "DejaVu Sans Mono 10" font = "DejaVu Sans Mono 10"
{{ get_base16('dunst') }} ${get_base16('dunst')}

View file

@ -3,23 +3,23 @@ general {
interval = 5 interval = 5
} }
{{ get_base16('i3status') }} ${get_base16('i3status')}
{% for iface in host.wireless %} % for iface in host.get('wireless', []):
wireless {{ iface }} { wireless ${iface} {
format_up = "{{ iface }} %ip %essid %quality" format_up = "${iface} %ip %essid %quality"
format_down = "{{ iface }} down" format_down = "${iface} down"
} }
order += "wireless {{ iface }}" order += "wireless ${iface}"
{% endfor %} % endfor
{% for iface in host.ethernet %} % for iface in host.get('ethernet', []):
ethernet {{ iface }} { ethernet ${iface} {
format_up = "{{ iface }} %ip" format_up = "${iface} %ip"
format_down = "{{ iface }} down" format_down = "${iface} down"
} }
order += "ethernet {{ iface }}" order += "ethernet ${iface}"
{% endfor %} % endfor
volume default { volume default {
format = "vol %volume" format = "vol %volume"
@ -38,12 +38,12 @@ battery all {
} }
order += "battery all" order += "battery all"
{% for disk in host.disks %} % for disk in host.get('disks', ['/']):
disk "{{ disk }}" { disk "${disk}" {
format = "{{ disk }} %avail" format = "${disk} %avail"
} }
order += "disk {{ disk }}" order += "disk ${disk}"
{% endfor %} % endfor
cpu_usage { cpu_usage {
format = "cpu %usage" format = "cpu %usage"
@ -59,13 +59,13 @@ memory {
} }
order += "memory" order += "memory"
{% if host.temperature_path %} % if 'temperature-path' in host:
cpu_temperature 0 { cpu_temperature 0 {
format = "temp %degrees°C" format = "temp %degrees°C"
path = "{{ host.temperature_path }}" path = "${host['temperature-path']}"
} }
order += "cpu_temperature 0" order += "cpu_temperature 0"
{% endif %} % endif
tztime utc { tztime utc {
format = "%Y-%m-%d %H:%M:%S" format = "%Y-%m-%d %H:%M:%S"

View file

@ -1,495 +0,0 @@
// This config is in the KDL format: https://kdl.dev
// "/-" comments out the following node.
// Check the wiki for a full description of the configuration:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Overview
// Input device configuration.
// Find the full list of options on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Input
input {
keyboard {
xkb {
// You can set rules, model, layout, variant and options.
// For more information, see xkeyboard-config(7).
// For example:
// layout "us,ru"
// options "grp:win_space_toggle,compose:ralt,ctrl:nocaps"
}
}
// Next sections include libinput settings.
// Omitting settings disables them, or leaves them at their default values.
touchpad {
// off
tap
// dwt
// dwtp
natural-scroll
// accel-speed 0.2
// accel-profile "flat"
// scroll-method "two-finger"
// disabled-on-external-mouse
}
mouse {
// off
// natural-scroll
// accel-speed 0.2
// accel-profile "flat"
// scroll-method "no-scroll"
}
trackpoint {
// off
// natural-scroll
// accel-speed 0.2
// accel-profile "flat"
// scroll-method "on-button-down"
// scroll-button 273
// middle-emulation
}
// Uncomment this to make the mouse warp to the center of newly focused windows.
// warp-mouse-to-focus
// Focus windows and outputs automatically when moving the mouse into them.
// Setting max-scroll-amount="0%" makes it work only on windows already fully on screen.
// focus-follows-mouse max-scroll-amount="0%"
// https://github.com/YaLTeR/niri/wiki/Configuration:-Input#disable-power-key-handling
disable-power-key-handling
}
{% for output in host.outputs %}
output "{{ output.match }}" {
{{ output.niri_lines }}
}
{% endfor %}
// Settings that influence how windows are positioned and sized.
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Layout
layout {
// Set gaps around windows in logical pixels.
gaps 16
// When to center a column when changing focus, options are:
// - "never", default behavior, focusing an off-screen column will keep at the left
// or right edge of the screen.
// - "always", the focused column will always be centered.
// - "on-overflow", focusing a column will center it if it doesn't fit
// together with the previously focused column.
center-focused-column "never"
// You can customize the widths that "switch-preset-column-width" (Mod+R) toggles between.
preset-column-widths {
// Proportion sets the width as a fraction of the output width, taking gaps into account.
// For example, you can perfectly fit four windows sized "proportion 0.25" on an output.
// The default preset widths are 1/3, 1/2 and 2/3 of the output.
proportion 0.33333
proportion 0.5
proportion 0.66667
// Fixed sets the width in logical pixels exactly.
// fixed 1920
}
// You can also customize the heights that "switch-preset-window-height" (Mod+Shift+R) toggles between.
// preset-window-heights { }
// You can change the default width of the new windows.
default-column-width { proportion {{ host.niri.default_column_width }}; }
// If you leave the brackets empty, the windows themselves will decide their initial width.
// default-column-width {}
// By default focus ring and border are rendered as a solid background rectangle
// behind windows. That is, they will show up through semitransparent windows.
// This is because windows using client-side decorations can have an arbitrary shape.
//
// If you don't like that, you should uncomment `prefer-no-csd` below.
// Niri will draw focus ring and border *around* windows that agree to omit their
// client-side decorations.
//
// Alternatively, you can override it with a window rule called
// `draw-border-with-background`.
// You can change how the focus ring looks.
focus-ring {
// Uncomment this line to disable the focus ring.
// off
// How many logical pixels the ring extends out from the windows.
width 4
// Colors can be set in a variety of ways:
// - CSS named colors: "red"
// - RGB hex: "#rgb", "#rgba", "#rrggbb", "#rrggbbaa"
// - CSS-like notation: "rgb(255, 127, 0)", rgba(), hsl() and a few others.
// Color of the ring on the active monitor.
active-color "#7fc8ff"
// Color of the ring on inactive monitors.
inactive-color "#505050"
// You can also use gradients. They take precedence over solid colors.
// Gradients are rendered the same as CSS linear-gradient(angle, from, to).
// The angle is the same as in linear-gradient, and is optional,
// defaulting to 180 (top-to-bottom gradient).
// You can use any CSS linear-gradient tool on the web to set these up.
// Changing the color space is also supported, check the wiki for more info.
//
// active-gradient from="#80c8ff" to="#bbddff" angle=45
// You can also color the gradient relative to the entire view
// of the workspace, rather than relative to just the window itself.
// To do that, set relative-to="workspace-view".
//
// inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
}
// You can also add a border. It's similar to the focus ring, but always visible.
border {
// The settings are the same as for the focus ring.
// If you enable the border, you probably want to disable the focus ring.
off
width 4
active-color "#ffc87f"
inactive-color "#505050"
// active-gradient from="#ffbb66" to="#ffc880" angle=45 relative-to="workspace-view"
// inactive-gradient from="#505050" to="#808080" angle=45 relative-to="workspace-view"
}
// Struts shrink the area occupied by windows, similarly to layer-shell panels.
// You can think of them as a kind of outer gaps. They are set in logical pixels.
// Left and right struts will cause the next window to the side to always be visible.
// Top and bottom struts will simply add outer gaps in addition to the area occupied by
// layer-shell panels and regular gaps.
struts {
left 32
right 32
// top 64
// bottom 64
}
}
// Add lines like this to spawn processes at startup.
// Note that running niri as a session supports xdg-desktop-autostart,
// which may be more convenient to use.
// See the binds section below for more spawn examples.
// spawn-at-startup "alacritty" "-e" "fish"
spawn-at-startup "pipewire"
spawn-at-startup "pipewire-pulse"
spawn-at-startup "wireplumber"
spawn-at-startup "waybar"
spawn-at-startup "xwayland-satellite" ":12"
spawn-at-startup "wpaperd"
environment {
DISPLAY ":12"
}
cursor {
xcursor-theme "breeze_cursors"
xcursor-size 24
}
// Uncomment this line to ask the clients to omit their client-side decorations if possible.
// If the client will specifically ask for CSD, the request will be honored.
// Additionally, clients will be informed that they are tiled, removing some client-side rounded corners.
// This option will also fix border/focus ring drawing behind some semitransparent windows.
// After enabling or disabling this, you need to restart the apps for this to take effect.
prefer-no-csd
// You can change the path where screenshots are saved.
// A ~ at the front will be expanded to the home directory.
// The path is formatted with strftime(3) to give you the screenshot date and time.
screenshot-path "~/pictures/screenshots/%Y-%m-%dT%H-%M-%S.png"
// You can also set this to null to disable saving screenshots to disk.
// screenshot-path null
// Animation settings.
// The wiki explains how to configure individual animations:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Animations
animations {
// Uncomment to turn off all animations.
// off
// Slow down all animations by this factor. Values below 1 speed them up instead.
// slowdown 3.0
}
// Window rules let you adjust behavior for individual windows.
// Find more information on the wiki:
// https://github.com/YaLTeR/niri/wiki/Configuration:-Window-Rules
// Work around WezTerm's initial configure bug
// by setting an empty default-column-width.
window-rule {
// This regular expression is intentionally made as specific as possible,
// since this is the default config, and we want no false positives.
// You can get away with just app-id="wezterm" if you want.
match app-id=r#"^org\.wezfurlong\.wezterm$"#
default-column-width {}
}
// Open the Firefox picture-in-picture player as floating by default.
window-rule {
// This app-id regular expression will work for both:
// - host Firefox (app-id is "firefox")
// - Flatpak Firefox (app-id is "org.mozilla.firefox")
match app-id=r#"[Ff]irefox$"# title="^Picture-in-Picture$"
open-floating true
}
// Example: block out two password managers from screen capture.
// (This example rule is commented out with a "/-" in front.)
/-window-rule {
match app-id=r#"^org\.keepassxc\.KeePassXC$"#
match app-id=r#"^org\.gnome\.World\.Secrets$"#
block-out-from "screen-capture"
// Use this instead if you want them visible on third-party screenshot tools.
// block-out-from "screencast"
}
// Example: enable rounded corners for all windows.
// (This example rule is commented out with a "/-" in front.)
window-rule {
geometry-corner-radius 4
clip-to-geometry true
}
binds {
// Keys consist of modifiers separated by + signs, followed by an XKB key name
// in the end. To find an XKB name for a particular key, you may use a program
// like wev.
//
// "Mod" is a special modifier equal to Super when running on a TTY, and to Alt
// when running as a winit window.
//
// Most actions that you can bind here can also be invoked programmatically with
// `niri msg action do-something`.
// Mod-Shift-/, which is usually the same as Mod-?,
// shows a list of important hotkeys.
Mod+Shift+Slash { show-hotkey-overlay; }
// Suggested binds for running programs: terminal, app launcher, screen locker.
Mod+T { spawn "alacritty"; }
Mod+D { spawn "wofi" "--show" "drun"; }
Mod+Shift+D { spawn "wofi" "--show" "run"; }
Mod+P { spawn "wofi-pass"; }
Super+Alt+L { spawn "swaylock"; }
// You can also use a shell. Do this if you need pipes, multiple commands, etc.
// Note: the entire command goes as a single argument in the end.
// Mod+T { spawn "bash" "-c" "notify-send hello && exec alacritty"; }
// Example volume keys mappings for PipeWire & WirePlumber.
// The allow-when-locked=true property makes them work even when the session is locked.
XF86AudioRaiseVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1+"; }
XF86AudioLowerVolume allow-when-locked=true { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.1-"; }
XF86AudioMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SINK@" "toggle"; }
XF86AudioMicMute allow-when-locked=true { spawn "wpctl" "set-mute" "@DEFAULT_AUDIO_SOURCE@" "toggle"; }
XF86AudioMedia allow-when-locked=true { spawn "playerctl" "play-pause"; }
XF86AudioPlay allow-when-locked=true { spawn "playerctl" "play-pause"; }
XF86AudioPrev allow-when-locked=true { spawn "playerctl" "previous"; }
XF86AudioNext allow-when-locked=true { spawn "playerctl" "next"; }
Mod+Q { close-window; }
Mod+Left { focus-column-left; }
Mod+Down { focus-window-down; }
Mod+Up { focus-window-up; }
Mod+Right { focus-column-right; }
Mod+H { focus-column-left; }
Mod+J { focus-window-down; }
Mod+K { focus-window-up; }
Mod+L { focus-column-right; }
Mod+Shift+Left { move-column-left; }
Mod+Shift+Down { move-window-down; }
Mod+Shift+Up { move-window-up; }
Mod+Shift+Right { move-column-right; }
Mod+Shift+H { move-column-left; }
Mod+Shift+J { move-window-down; }
Mod+Shift+K { move-window-up; }
Mod+Shift+L { move-column-right; }
// Alternative commands that move across workspaces when reaching
// the first or last window in a column.
// Mod+J { focus-window-or-workspace-down; }
// Mod+K { focus-window-or-workspace-up; }
// Mod+Ctrl+J { move-window-down-or-to-workspace-down; }
// Mod+Ctrl+K { move-window-up-or-to-workspace-up; }
Mod+Home { focus-column-first; }
Mod+End { focus-column-last; }
Mod+Ctrl+Home { move-column-to-first; }
Mod+Ctrl+End { move-column-to-last; }
Mod+Ctrl+Left { focus-monitor-left; }
Mod+Ctrl+Down { focus-monitor-down; }
Mod+Ctrl+Up { focus-monitor-up; }
Mod+Ctrl+Right { focus-monitor-right; }
Mod+Ctrl+H { focus-monitor-left; }
Mod+Ctrl+J { focus-monitor-down; }
Mod+Ctrl+K { focus-monitor-up; }
Mod+Ctrl+L { focus-monitor-right; }
Mod+Shift+Ctrl+Left { move-workspace-to-monitor-left; }
Mod+Shift+Ctrl+Down { move-workspace-to-monitor-down; }
Mod+Shift+Ctrl+Up { move-workspace-to-monitor-up; }
Mod+Shift+Ctrl+Right { move-workspace-to-monitor-right; }
Mod+Shift+Ctrl+H { move-workspace-to-monitor-left; }
Mod+Shift+Ctrl+J { move-workspace-to-monitor-down; }
Mod+Shift+Ctrl+K { move-workspace-to-monitor-up; }
Mod+Shift+Ctrl+L { move-workspace-to-monitor-right; }
Mod+Page_Down { focus-workspace-down; }
Mod+Page_Up { focus-workspace-up; }
Mod+U { focus-workspace-down; }
Mod+I { focus-workspace-up; }
Mod+Ctrl+Page_Down { move-column-to-workspace-down; }
Mod+Ctrl+Page_Up { move-column-to-workspace-up; }
Mod+Ctrl+U { move-column-to-workspace-down; }
Mod+Ctrl+I { move-column-to-workspace-up; }
// Alternatively, there are commands to move just a single window:
// Mod+Ctrl+Page_Down { move-window-to-workspace-down; }
// ...
Mod+Shift+Page_Down { move-workspace-down; }
Mod+Shift+Page_Up { move-workspace-up; }
Mod+Shift+U { move-workspace-down; }
Mod+Shift+I { move-workspace-up; }
// You can bind mouse wheel scroll ticks using the following syntax.
// These binds will change direction based on the natural-scroll setting.
//
// To avoid scrolling through workspaces really fast, you can use
// the cooldown-ms property. The bind will be rate-limited to this value.
// You can set a cooldown on any bind, but it's most useful for the wheel.
Mod+WheelScrollDown cooldown-ms=150 { focus-workspace-down; }
Mod+WheelScrollUp cooldown-ms=150 { focus-workspace-up; }
Mod+Ctrl+WheelScrollDown cooldown-ms=150 { move-column-to-workspace-down; }
Mod+Ctrl+WheelScrollUp cooldown-ms=150 { move-column-to-workspace-up; }
Mod+WheelScrollRight { focus-column-right; }
Mod+WheelScrollLeft { focus-column-left; }
Mod+Ctrl+WheelScrollRight { move-column-right; }
Mod+Ctrl+WheelScrollLeft { move-column-left; }
// Usually scrolling up and down with Shift in applications results in
// horizontal scrolling; these binds replicate that.
Mod+Shift+WheelScrollDown { focus-column-right; }
Mod+Shift+WheelScrollUp { focus-column-left; }
Mod+Ctrl+Shift+WheelScrollDown { move-column-right; }
Mod+Ctrl+Shift+WheelScrollUp { move-column-left; }
// Similarly, you can bind touchpad scroll "ticks".
// Touchpad scrolling is continuous, so for these binds it is split into
// discrete intervals.
// These binds are also affected by touchpad's natural-scroll, so these
// example binds are "inverted", since we have natural-scroll enabled for
// touchpads by default.
// Mod+TouchpadScrollDown { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02+"; }
// Mod+TouchpadScrollUp { spawn "wpctl" "set-volume" "@DEFAULT_AUDIO_SINK@" "0.02-"; }
// You can refer to workspaces by index. However, keep in mind that
// niri is a dynamic workspace system, so these commands are kind of
// "best effort". Trying to refer to a workspace index bigger than
// the current workspace count will instead refer to the bottommost
// (empty) workspace.
//
// For example, with 2 workspaces + 1 empty, indices 3, 4, 5 and so on
// will all refer to the 3rd workspace.
Mod+1 { focus-workspace 1; }
Mod+2 { focus-workspace 2; }
Mod+3 { focus-workspace 3; }
Mod+4 { focus-workspace 4; }
Mod+5 { focus-workspace 5; }
Mod+6 { focus-workspace 6; }
Mod+7 { focus-workspace 7; }
Mod+8 { focus-workspace 8; }
Mod+9 { focus-workspace 9; }
Mod+Ctrl+1 { move-column-to-workspace 1; }
Mod+Ctrl+2 { move-column-to-workspace 2; }
Mod+Ctrl+3 { move-column-to-workspace 3; }
Mod+Ctrl+4 { move-column-to-workspace 4; }
Mod+Ctrl+5 { move-column-to-workspace 5; }
Mod+Ctrl+6 { move-column-to-workspace 6; }
Mod+Ctrl+7 { move-column-to-workspace 7; }
Mod+Ctrl+8 { move-column-to-workspace 8; }
Mod+Ctrl+9 { move-column-to-workspace 9; }
// Alternatively, there are commands to move just a single window:
// Mod+Ctrl+1 { move-window-to-workspace 1; }
// Switches focus between the current and the previous workspace.
// Mod+Tab { focus-workspace-previous; }
// The following binds move the focused window in and out of a column.
// If the window is alone, they will consume it into the nearby column to the side.
// If the window is already in a column, they will expel it out.
Mod+BracketLeft { consume-or-expel-window-left; }
Mod+BracketRight { consume-or-expel-window-right; }
// Consume one window from the right to the bottom of the focused column.
Mod+Comma { consume-window-into-column; }
// Expel the bottom window from the focused column to the right.
Mod+Period { expel-window-from-column; }
Mod+R { switch-preset-column-width; }
Mod+Shift+R { switch-preset-window-height; }
Mod+Ctrl+R { reset-window-height; }
Mod+F { maximize-column; }
Mod+Shift+F { fullscreen-window; }
Mod+C { center-column; }
// Finer width adjustments.
// This command can also:
// * set width in pixels: "1000"
// * adjust width in pixels: "-5" or "+5"
// * set width as a percentage of screen width: "25%"
// * adjust width as a percentage of screen width: "-10%" or "+10%"
// Pixel sizes use logical, or scaled, pixels. I.e. on an output with scale 2.0,
// set-column-width "100" will make the column occupy 200 physical screen pixels.
Mod+Minus { set-column-width "-10%"; }
Mod+Equal { set-column-width "+10%"; }
// Finer height adjustments when in column with other windows.
Mod+Shift+Minus { set-window-height "-10%"; }
Mod+Shift+Equal { set-window-height "+10%"; }
// Move the focused window between the floating and the tiling layout.
Mod+V { toggle-window-floating; }
Mod+Shift+V { switch-focus-between-floating-and-tiling; }
// Actions to switch layouts.
// Note: if you uncomment these, make sure you do NOT have
// a matching layout switch hotkey configured in xkb options above.
// Having both at once on the same hotkey will break the switching,
// since it will switch twice upon pressing the hotkey (once by xkb, once by niri).
// Mod+Space { switch-layout "next"; }
// Mod+Shift+Space { switch-layout "prev"; }
Print { screenshot; }
Ctrl+Print { screenshot-screen; }
Alt+Print { screenshot-window; }
// The quit action will show a confirmation dialog to avoid accidental exits.
Mod+Shift+E { quit; }
Ctrl+Alt+Delete { quit; }
// Powers off the monitors. To turn them back on, do any input like
// moving the mouse or pressing any other key.
Mod+Shift+P { power-off-monitors; }
}

View file

@ -5,7 +5,7 @@ riverctl map normal Super D spawn 'wofi --show drun'
riverctl map normal Super+Shift D spawn 'wofi --show run' riverctl map normal Super+Shift D spawn 'wofi --show run'
riverctl map normal Super P spawn wofi-pass riverctl map normal Super P spawn wofi-pass
riverctl map normal Super+Shift S spawn 'wl-copy < "$(grimshot --notify save window)"' riverctl map normal Super+Shift S spawn 'wl-copy < "$(grimshot --notify save window)"'
riverctl map normal Super+Control S spawn 'wl-copy < "$(grimshot --notify save area)"' riverctl map normal Super+Ctrl S spawn 'wl-copy < "$(grimshot --notify save area)"'
riverctl map normal Super+Shift P spawn swaylock riverctl map normal Super+Shift P spawn swaylock
@ -127,12 +127,6 @@ riverctl default-layout rivertile
riverctl map normal Super E output-layout bsp-layout riverctl map normal Super E output-layout bsp-layout
riverctl map normal Super W output-layout rivertile riverctl map normal Super W output-layout rivertile
riverctl map normal Super G output-layout uniform-grid riverctl map normal Super G output-layout uniform-grid
riverctl map normal Super S output-layout secondary-grid
# TODO: automated script to register windows to always float
riverctl rule-add -app-id wsjtx -title "* Wide Graph" float
riverctl rule-add -app-id GridTracker -title Alerts float
riverctl rule-add -app-id wsjtx -title "* Log QSO" float
# Only run these at the first load. # Only run these at the first load.
if [ -z $RIVER_RELOAD ] if [ -z $RIVER_RELOAD ]
@ -143,7 +137,6 @@ then
rivertile -view-padding 6 -outer-padding 6 & rivertile -view-padding 6 -outer-padding 6 &
river-bsp-layout & river-bsp-layout &
river-uniform-grid-layout & river-uniform-grid-layout &
river-secondary-grid-layout &
# Daemons # Daemons
pipewire & pipewire &
@ -151,7 +144,6 @@ then
pipewire-pulse & pipewire-pulse &
dunst & dunst &
udiskie & udiskie &
swayidle &
# Bar # Bar
i3bar-river & i3bar-river &

View file

@ -27,7 +27,7 @@ set $kdown j
set $kup k set $kup k
set $kright l set $kright l
{{ get_base16('i3', 'colors') }} ${get_base16('i3', 'colors')}
# property border bg text indic child # property border bg text indic child
client.focused $base0D $base0D $base00 $base0E $base0D client.focused $base0D $base0D $base00 $base0E $base0D
@ -37,17 +37,21 @@ client.urgent $base08 $base08 $base00 $base08 $base08
client.placeholder $base01 $base01 $base05 $base01 $base01 client.placeholder $base01 $base01 $base05 $base01 $base01
client.background $base07 client.background $base07
{% for output in host.outputs %} % for output in host.get('outputs', []):
output "{{ output.match }}" { output ${repr(output['match'])} {
{{ output.sway_lines }} % for line in output['sway-lines']:
${line}
% endfor
} }
{% endfor %} % endfor
{% for input in host.inputs %} % for input in host.get('inputs', []):
input "{{ input.match }}" { input ${repr(input['match'])} {
{{ input.sway_lines }} % for line in input['sway-lines']:
${line}
% endfor
} }
{% endfor %} %endfor
gaps inner 8 gaps inner 8
@ -73,7 +77,7 @@ exec dunst
exec udiskie exec udiskie
exec fcitx5 exec fcitx5
font pango:{{ host.system_mono_font }} 8 font pango:${host['system-mono-font']} 8
focus_follows_mouse no focus_follows_mouse no
floating_modifier $mod floating_modifier $mod
@ -82,14 +86,14 @@ bindsym $mod+Shift+c reload
bindsym $mod+Shift+r restart bindsym $mod+Shift+r restart
bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit' bindsym $mod+Shift+e exec swaynag -t warning -m 'You pressed the exit shortcut. Do you really want to exit sway? This will end your Wayland session.' -b 'Yes, exit sway' 'swaymsg exit'
bindsym $mod+Shift+q kill bindsym $mod+Shift+q kill
bindsym $mod+Shift+p exec {{ host.lock_cmd }} bindsym $mod+Shift+p exec ${host.get('lock-cmd', 'swaylock -c 000000')}
# Blank individual displays # Blank individual displays
bindsym $mod+o output - dpms off bindsym $mod+o output - dpms off
# Unblank all displays # Unblank all displays
bindsym $mod+Shift+o output * dpms on bindsym $mod+Shift+o output * dpms on
bindsym $mod+Return exec {{ host.terminal }} bindsym $mod+Return exec ${host.get('terminal', 'alacritty')}
bindsym $mod+d exec wofi --show drun bindsym $mod+d exec wofi --show drun
bindsym $mod+Shift+d exec wofi --show run bindsym $mod+Shift+d exec wofi --show run
bindsym $mod+p exec wofi-pass bindsym $mod+p exec wofi-pass
@ -181,9 +185,9 @@ bindsym XF86AudioPlay exec playerctl play-pause
bar { bar {
tray_output none tray_output none
status_command i3status status_command i3status
font pango:{{ host.system_mono_font }} 10 font pango:${host['system-mono-font']} 10
{{ get_base16('i3', 'bar-colors') }} ${get_base16('i3', 'bar-colors')}
colors { colors {
background $base01 background $base01

View file

@ -0,0 +1,2 @@
timeout 10 'pgrep swaylock && ${host.get('display-off-cmd', 'swaymsg "output * dpms off"')}' \
resume 'pgrep swaylock && ${host.get('display-on-cmd', 'swaymsg "output * dpms on"')}'

View file

@ -1 +0,0 @@
timeout 10 'pgrep swaylock && {{ host.display_off_cmd }}' resume 'pgrep swaylock && {{ host.display_on_cmd }}'

View file

@ -0,0 +1,15 @@
ignore-empty-password
indicator-idle-visible
color=000000
scaling=fill
font=${host['system-font']}
% for output in host['outputs']:
% if 'background' in output and (output['match'] == '*' or 'device' in output):
% if output['match'] == '*':
image=${output['background'][0]}
% else:
image=${output['device']}:${output['background'][0]}
% endif
% endif
% endfor

View file

@ -1,8 +0,0 @@
ignore-empty-password
indicator-idle-visible
color=000000
scaling=fill
font={{ host.system_font }}
{{ host.swaylock_images }}

View file

@ -1,136 +0,0 @@
// -*- mode: jsonc -*-
{
"layer": "top",
"position": "top",
"height": 30,
"spacing": 4,
"modules-left": [
"niri/workspaces"
],
"modules-center": [
"niri/window"
],
"modules-right": [
{% for iface in host.wireless + host.ethernet %}
"network#{{ iface }}",
{% endfor %}
{% if not host.ethernet and host.auto_ethernet %}
"network#auto_ethernet",
{% endif %}
"wireplumber",
"battery",
"group/disks",
"cpu",
"memory",
{% if host.temperature_path %}
"temperature",
{% endif %}
"clock#utc",
"clock#local"
],
{% for iface in host.wireless %}
"network#{{ iface }}": {
"interface": "{{ iface }}",
"format": "\uf1eb \uf058",
"format-disconnected": "\uf1eb \uf057",
"tooltip-format": "{{ iface }} {ipaddr} {essid} {signalStrength}",
"tooltip-format-disconnected": "{{ iface }} down"
},
{% endfor %}
{% for iface in host.ethernet %}
"network#{{ iface }}": {
"interface": "{{ iface }}",
"format": "\uf6ff \uf058",
"format-disconnected": "\uf6ff \uf057",
"tooltip-format": "{{ iface }} {ipaddr}",
"tooltip-format-disconnected": "{{ iface }} down"
},
{% endfor %}
{% if not host.ethernet and host.auto_ethernet %}
"network#auto_ethernet": {
"interface": "en*",
"format": "\uf6ff \uf058",
"format-disconnected": "\uf6ff \uf057",
"tooltip-format": "{{ iface }} {ipaddr}",
"tooltip-format-disconnected": "{{ iface }} down"
},
{% endif %}
"wireplumber": {
"format": "{icon} {volume}%",
"format-muted": "\uf6a9 {volume}%",
"format-icons": ["\uf026", "\uf027", "\uf028"]
},
{% if host.has_battery %}
"battery": {
"design-capacity": true,
"format": "{icon} {capacity}% {time}",
"format-time": "{H}:{m}",
"format-icons": [
"\uf244",
"\uf243",
"\uf242",
"\uf241",
"\uf240",
],
"format-charging": "\ue55b {capacity}% {time}",
"format-full": "\ue55c {capacity}%",
},
{% endif %}
"group/disks": {
// TODO: make drawer that expands orthogonally, outside of the bar
"orientation": "inherit",
"modules": [
{% for disk in host.disks %}
"disk#{{ disk }}",
{% endfor %}
],
"drawer": {}
},
{% for disk in host.disks %}
"disk#{{ disk }}": {
"path": "{{ disk }}",
"format": "{{ disk }} {free}",
"tooltip-format": "{used} / {total} ({percentage_used}%)"
},
{% endfor %}
"cpu": {
"format": "\uf2db {usage}%",
"tooltip": false
},
"memory": {
"format": "\uf538 {percentage}%",
"tooltip-format": "{used}GiB / {total}GiB"
},
{% if host.temperature_path %}
"temperature": {
"format": "{temperatureC}°C",
"hwmon-path": "{{ host.temperature_path }}"
},
{% endif %}
"clock#utc": {
"interval": 5,
"format": "{:%Y-%m-%d %H:%M:%S}",
"timezone": "UTC",
"tooltip": false
},
"clock#local": {
"interval": 5,
"format": "{:%H:%M}",
"tooltip": false
}
}

View file

@ -1,328 +0,0 @@
* {
/* `otf-font-awesome` is required to be installed for icons */
font-family: '{{ host.system_mono_font }}', 'Font Awesome 6 Free';
font-size: 13px;
}
window#waybar {
background-color: rgba(43, 48, 59, 0.5);
border-bottom: 3px solid rgba(100, 114, 125, 0.5);
color: #ffffff;
transition-property: background-color;
transition-duration: .5s;
}
window#waybar.hidden {
opacity: 0.2;
}
/*
window#waybar.empty {
background-color: transparent;
}
window#waybar.solo {
background-color: #FFFFFF;
}
*/
window#waybar.termite {
background-color: #3F3F3F;
}
window#waybar.chromium {
background-color: #000000;
border: none;
}
button {
/* Use box-shadow instead of border so the text isn't offset */
box-shadow: inset 0 -3px transparent;
/* Avoid rounded borders under each button name */
border: none;
border-radius: 0;
}
/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */
button:hover {
background: inherit;
box-shadow: inset 0 -3px #ffffff;
}
/* you can set a style on hover for any module like this */
#pulseaudio:hover {
background-color: #a37800;
}
#workspaces button {
padding: 0 5px;
background-color: transparent;
color: #ffffff;
}
#workspaces button:hover {
background: rgba(0, 0, 0, 0.2);
}
#workspaces button.focused {
background-color: #64727D;
box-shadow: inset 0 -3px #ffffff;
}
#workspaces button.urgent {
background-color: #eb4d4b;
}
#mode {
background-color: #64727D;
box-shadow: inset 0 -3px #ffffff;
}
#clock,
#battery,
#cpu,
#memory,
#disk,
#temperature,
#backlight,
#network,
#pulseaudio,
#wireplumber,
#custom-media,
#tray,
#mode,
#idle_inhibitor,
#scratchpad,
#power-profiles-daemon,
#mpd {
padding: 0 10px;
color: #ffffff;
}
#window,
#workspaces {
margin: 0 4px;
}
/* If workspaces is the leftmost module, omit left margin */
.modules-left>widget:first-child>#workspaces {
margin-left: 0;
}
/* If workspaces is the rightmost module, omit right margin */
.modules-right>widget:last-child>#workspaces {
margin-right: 0;
}
#clock {
background-color: #64727D;
}
#battery {
background-color: #ffffff;
color: #000000;
}
#battery.charging,
#battery.plugged {
color: #ffffff;
background-color: #26A65B;
}
@keyframes blink {
to {
background-color: #ffffff;
color: #000000;
}
}
/* Using steps() instead of linear as a timing function to limit cpu usage */
#battery.critical:not(.charging) {
background-color: #f53c3c;
color: #ffffff;
animation-name: blink;
animation-duration: 0.5s;
animation-timing-function: steps(12);
animation-iteration-count: infinite;
animation-direction: alternate;
}
#power-profiles-daemon {
padding-right: 15px;
}
#power-profiles-daemon.performance {
background-color: #f53c3c;
color: #ffffff;
}
#power-profiles-daemon.balanced {
background-color: #2980b9;
color: #ffffff;
}
#power-profiles-daemon.power-saver {
background-color: #2ecc71;
color: #000000;
}
label:focus {
background-color: #000000;
}
#cpu {
background-color: #2ecc71;
color: #000000;
}
#memory {
background-color: #9b59b6;
}
#disk {
background-color: #964B00;
}
#backlight {
background-color: #90b1b1;
}
#network {
background-color: #2980b9;
}
#network.disconnected {
background-color: #f53c3c;
}
#pulseaudio {
background-color: #f1c40f;
color: #000000;
}
#pulseaudio.muted {
background-color: #90b1b1;
color: #2a5c45;
}
#wireplumber {
background-color: #fff0f5;
color: #000000;
}
#wireplumber.muted {
background-color: #f53c3c;
}
#custom-media {
background-color: #66cc99;
color: #2a5c45;
min-width: 100px;
}
#custom-media.custom-spotify {
background-color: #66cc99;
}
#custom-media.custom-vlc {
background-color: #ffa000;
}
#temperature {
background-color: #f0932b;
}
#temperature.critical {
background-color: #eb4d4b;
}
#tray {
background-color: #2980b9;
}
#tray>.passive {
-gtk-icon-effect: dim;
}
#tray>.needs-attention {
-gtk-icon-effect: highlight;
background-color: #eb4d4b;
}
#idle_inhibitor {
background-color: #2d3436;
}
#idle_inhibitor.activated {
background-color: #ecf0f1;
color: #2d3436;
}
#mpd {
background-color: #66cc99;
color: #2a5c45;
}
#mpd.disconnected {
background-color: #f53c3c;
}
#mpd.stopped {
background-color: #90b1b1;
}
#mpd.paused {
background-color: #51a37a;
}
#language {
background: #00b093;
color: #740864;
padding: 0 5px;
margin: 0 5px;
min-width: 16px;
}
#keyboard-state {
background: #97e1ad;
color: #000000;
padding: 0 0px;
margin: 0 5px;
min-width: 16px;
}
#keyboard-state>label {
padding: 0 5px;
}
#keyboard-state>label.locked {
background: rgba(0, 0, 0, 0.2);
}
#scratchpad {
background: rgba(0, 0, 0, 0.2);
}
#scratchpad.empty {
background-color: transparent;
}
#privacy {
padding: 0;
}
#privacy-item {
padding: 0 5px;
color: white;
}
#privacy-item.screenshare {
background-color: #cf5700;
}
#privacy-item.audio-in {
background-color: #1ca000;
}
#privacy-item.audio-out {
background-color: #0069d4;
}

View file

@ -1,7 +1,7 @@
window { window {
background-color: --wofi-color1; background-color: --wofi-color1;
color: --wofi-color5; color: --wofi-color5;
font-family: '{{ host.system_mono_font }}'; font-family: '${host['system-mono-font']}';
} }
#input { #input {
@ -17,3 +17,4 @@ window {
#entry:selected { #entry:selected {
background-color: --wofi-color2; background-color: --wofi-color2;
} }

View file

@ -1 +0,0 @@
{{ host.wpaperd_config }}

4
templates/.ssh/config Normal file
View file

@ -0,0 +1,4 @@
AddKeysToAgent confirm
Host *.mst.edu
User um-ad\ajgq56

View file

@ -1,9 +0,0 @@
AddKeysToAgent confirm
Host *.mst.edu
User um-ad\ajgq56
{% if host.use_jump_host %}
Host *.flock.wg
ProxyJump goose@reliant.gaussian.dev
{% endif %}

View file

@ -0,0 +1 @@
${get_base16('vim')}

View file

@ -1 +0,0 @@
{{ get_base16('vim') }}

View file

@ -1,46 +0,0 @@
#!/usr/bin/env python
import argparse
from io import StringIO
import subprocess
import urllib.parse
def main():
parser = argparse.ArgumentParser(
description="""
Fetch the wifi password and generate a QR code.
This program assumes that the network PSK is stored
in the password-store, and will look for it
at the path `wifi/<essid>`.
""",
)
parser.add_argument(
"-H",
"--hidden",
action="store_true",
help="Indicate that this network's SSID is hidden.",
)
parser.add_argument("essid", help="ESSID for this network")
args = parser.parse_args()
psk = subprocess.check_output(["pass", f"wifi/{args.essid}"], text=True).strip()
hidden_data = "H:true;" if args.hidden else ""
qr_data = f"WIFI:T:WPA;S:{quote(args.essid)};{hidden_data}P:{quote(psk)};;"
proc = subprocess.Popen(["qrencode", "-tANSI"], stdin=subprocess.PIPE, text=True)
proc.communicate(qr_data)
PRINTABLE = [*range(0x20, 0x3B), *range(0x3C, 0x7F)]
def quote(s: str) -> str:
return urllib.parse.quote(s, safe=PRINTABLE)
if __name__ == "__main__":
main()