Compare commits

...

302 Commits

Author SHA1 Message Date
renovate[bot]
53d324c747
chore(deps): lock file maintenance (#716)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-01 13:19:36 +02:00
renovate[bot]
acb91fe39b
fix(deps): update dependency zipp to v3.19.1 (#717)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-06-01 13:18:51 +02:00
renovate[bot]
433b8ce2aa
fix(deps): update dependency zipp to v3.19.0 (#714)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-30 20:23:20 +02:00
renovate[bot]
724e14c741 chore(deps): update devdeps non-major 2024-05-27 04:34:22 +00:00
renovate[bot]
c5d50cf47a
fix(deps): update dependency docker to v7.1.0 (#712)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-24 09:23:34 +02:00
renovate[bot]
ae9a16c898 chore(docker): update python:3.12-alpine docker digest to 5365725 2024-05-24 04:41:11 +00:00
renovate[bot]
635cd51a17
chore(deps): lock file maintenance (#707)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-17 09:37:14 +02:00
renovate[bot]
77ca9f62d2
fix(deps): update dependency zipp to v3.18.2 (#709)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-17 09:36:16 +02:00
renovate[bot]
40e2f72fb0
chore(deps): update quay.io/thegeeklab/hugo docker tag to v0.125.7 (#708)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-14 15:06:43 +02:00
renovate[bot]
5a4a9dc879 chore(deps): update dependency ruff to v0.4.4 2024-05-13 04:16:36 +00:00
renovate[bot]
0a8780c381
chore(deps): lock file maintenance (#705)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-07 12:15:13 +02:00
renovate[bot]
c0b496943f chore(deps): update dependency ruff to v0.4.3 2024-05-06 04:32:58 +00:00
renovate[bot]
393887fbb5
fix(deps): update dependency jsonschema to v4.22.0 (#703)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-05-01 12:36:25 +02:00
renovate[bot]
6555f4add6
chore(deps): lock file maintenance (#699)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-29 10:28:19 +02:00
renovate[bot]
eee7a5a1ff chore(deps): update devdeps non-major 2024-04-29 05:01:06 +00:00
renovate[bot]
9f31bfdf9e
fix(deps): update dependency websocket_client to v1.8.0 (#701)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-24 08:55:03 +02:00
renovate[bot]
9596da32c9 chore(deps): update dependency ruff to v0.4.1 2024-04-22 03:38:41 +00:00
renovate[bot]
d15499b120 chore(deps): update dependency ruff to v0.3.7 2024-04-15 03:13:34 +00:00
renovate[bot]
da587cdaf1
chore(deps): lock file maintenance (#686)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-12 08:54:56 +02:00
renovate[bot]
2e78717804
fix(deps): update dependency idna to v3.7 [security] (#697)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-04-12 08:54:49 +02:00
renovate[bot]
7e2c68c8fe chore(docker): update python:3.12-alpine docker digest to ef09762 2024-04-11 03:15:43 +00:00
renovate[bot]
5a98f7127d chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.45.0 2024-04-08 06:26:20 +00:00
renovate[bot]
9701519a85 chore(deps): update dependency ruff to v0.3.5 2024-04-08 05:27:50 +00:00
renovate[bot]
01293f3634 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.44.3 2024-04-01 04:59:23 +00:00
renovate[bot]
cbddcedb62
chore(deps): update quay.io/thegeeklab/wp-docker-buildx docker tag to v4 (#691)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-27 08:56:27 +01:00
renovate[bot]
4be97eb542 chore(docker): update python:3.12-alpine docker digest to c7eb5c9 2024-03-26 04:30:21 +00:00
renovate[bot]
3e644aa33d
chore(deps): update dependency pytest-cov to v5 (#688)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-25 08:34:23 +01:00
renovate[bot]
a86f86e3a1 chore(deps): update devdeps non-major 2024-03-25 04:48:50 +00:00
renovate[bot]
95e7ee4471
chore(deps): update quay.io/thegeeklab/hugo docker tag to v0.124.1 (#687)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-21 08:48:24 +01:00
renovate[bot]
73d739831a chore(deps): update dependency ruff to v0.3.3 2024-03-18 03:40:02 +00:00
renovate[bot]
44599113ab chore(docker): update python:3.12-alpine docker digest to 25a82f6 2024-03-17 03:32:01 +00:00
renovate[bot]
1b33fc3b74
fix(deps): update dependency zipp to v3.18.1 (#683)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-16 12:21:58 +01:00
renovate[bot]
83a32d14c6
fix(deps): update dependency zipp to v3.18.0 (#682)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-13 08:34:16 +01:00
63ca6e6bdb
ci: fix deprecated ruff command 2024-03-12 20:52:55 +01:00
renovate[bot]
1e557bd253
chore(deps): lock file maintenance (#681)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-11 09:39:36 +01:00
renovate[bot]
32da9eb537
chore(deps): update devdeps non-major (#680)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Robert Kaussow <mail@thegeeklab.de>
2024-03-11 09:39:29 +01:00
renovate[bot]
1d19939b68 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.44.2 2024-03-11 03:38:10 +00:00
renovate[bot]
233b29a8cd
chore(deps): lock file maintenance (#677)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-07 11:05:20 +01:00
renovate[bot]
90876dc452
fix(deps): update dependency environs to v11 (#678)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-07 11:04:49 +01:00
renovate[bot]
9d2503fb30 chore(deps): update devdeps non-major 2024-03-04 03:26:08 +00:00
renovate[bot]
ec6ff19057
fix(deps): update dependency python-dateutil to v2.9.0.post0 (#675)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-03-02 14:49:18 +01:00
renovate[bot]
fc31bd26c2
chore(deps): lock file maintenance (#673)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-26 10:43:40 +01:00
renovate[bot]
8d9c9a5f5f chore(deps): update dependency pytest to v8.0.2 2024-02-26 03:43:17 +00:00
renovate[bot]
6a80f83587 chore(deps): update devdeps non-major 2024-02-19 04:32:20 +00:00
e261307149
[skip ci] revert renovate automerge config 2024-02-15 12:23:09 +01:00
renovate[bot]
f69a97b61c
chore(deps): update quay.io/thegeeklab/hugo docker tag to v0.122.0 (#671)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-11 21:47:37 +01:00
84a3d303ed
enable renovate on automerge branches 2024-02-09 23:08:32 +01:00
renovate[bot]
24a8388cb1 chore(docker): update python:3.12-alpine docker digest to 1a05012 2024-02-09 06:11:13 +00:00
renovate[bot]
3a47080078
fix(deps): update dependency ruamel.yaml to v0.18.6 (#669)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-07 22:36:52 +01:00
7dbd1158c6
chore: bump ruff to v0.2.1 (#668) 2024-02-06 09:34:40 +01:00
renovate[bot]
536752a83e
fix(deps): update dependency certifi to v2024 (#667)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-02-03 14:04:32 +01:00
renovate[bot]
f334c0da1e
chore(deps): update dependency pytest to v8 (#665)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-31 09:05:12 +01:00
renovate[bot]
fc02a0071a chore(docker): update python:3.12-alpine docker digest to 14cfc61 2024-01-29 10:49:01 +00:00
renovate[bot]
9ce45bf75b
chore(deps): update quay.io/thegeeklab/wp-docker-buildx docker tag to v3 (#664)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-22 11:28:49 +01:00
renovate[bot]
9a5c025d7c chore(deps): update dependency ruff to v0.1.14 2024-01-22 03:08:44 +00:00
renovate[bot]
95e5f2ac4a
fix(deps): update dependency jsonschema to v4.21.1 (#662)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-20 15:51:39 +01:00
renovate[bot]
48e90b3fa8 chore(docker): update python:3.12-alpine docker digest to 801b54e 2024-01-20 02:17:35 +00:00
renovate[bot]
72f6b0e758 chore(docker): update python:3.12-alpine docker digest to 4a156f7 2024-01-19 07:11:22 +00:00
renovate[bot]
b684cb042f
fix(deps): update dependency jsonschema to v4.21.0 (#659)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-18 10:21:53 +01:00
renovate[bot]
e280fd4395 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.44.1 2024-01-16 00:18:09 +00:00
renovate[bot]
824b850e57
fix(deps): update dependency anyconfig to v0.14.0 (#656)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-15 21:55:52 +01:00
renovate[bot]
5fb5fbb2e5
chore(deps): update dependency ruff to v0.1.13 (#657)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Robert Kaussow <mail@thegeeklab.de>
2024-01-15 20:38:53 +01:00
renovate[bot]
fc20bb4de0
fix(deps): update dependency environs to v10.3.0 (#655)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-12 08:30:15 +01:00
renovate[bot]
df1c82beac
fix(deps): update dependency environs to v10.2.0 (#654)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-10 08:38:45 +01:00
renovate[bot]
c81a2b7dca
chore(deps): lock file maintenance (#644)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-09 15:36:03 +01:00
renovate[bot]
5e7b78b181
fix(deps): update dependency docker to v7 (#640)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-09 15:35:53 +01:00
renovate[bot]
f957a5c41d
fix(deps): update dependency environs to v10.1.0 (#653)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-09 15:03:24 +01:00
renovate[bot]
194a793cb2 chore(deps): update dependency ruff to v0.1.11 2024-01-08 05:01:20 +00:00
renovate[bot]
85a945b4ed
chore(deps): update quay.io/thegeeklab/hugo docker tag to v0.121.2 (#651)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2024-01-07 20:42:13 +01:00
renovate[bot]
bf8e7c5256 chore(deps): update dependency pytest to v7.4.4 2024-01-01 03:51:52 +00:00
renovate[bot]
7a7df50721
fix(deps): update dependency environs to v10 (#645)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-27 11:08:05 +01:00
renovate[bot]
535969d581 chore(deps): update dependency ruff to v0.1.9 2023-12-25 03:41:52 +00:00
3eebffb06a
disable renovate for python test matrix in ci 2023-12-24 00:03:57 +01:00
525483e99c
use list style synatx and cleanup (#647) 2023-12-23 23:25:22 +01:00
renovate[bot]
ea0468cc8d chore(deps): update dependency ruff to v0.1.8 2023-12-18 03:40:56 +00:00
5063ba7d6b
cleanup unused env vars in ci 2023-12-17 14:08:01 +01:00
renovate[bot]
3ea1adfe03
fix(deps): update dependency pathspec to v0.12.1 (#642)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-12 08:55:02 +01:00
renovate[bot]
ea56dc4f41 chore(deps): update dependency ruff to v0.1.7 2023-12-11 04:57:00 +00:00
renovate[bot]
e0f99929c1 chore(docker): update python:3.12-alpine docker digest to c793b92 2023-12-09 09:48:01 +00:00
renovate[bot]
0a2257fb13
chore(deps): update quay.io/thegeeklab/wp-docker-buildx docker tag to v2 (#639)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-07 09:50:02 +01:00
b1e15928ad
ci: exclude dockerhub from linkcheck due to rate limiting 2023-12-07 09:08:28 +01:00
renovate[bot]
f386910970 chore(docker): update python:3.12-alpine docker digest to 09f18c1 2023-12-04 23:17:59 +00:00
renovate[bot]
91fbaf9d9d
chore(deps): lock file maintenance (#636)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-04 21:18:50 +01:00
renovate[bot]
a4643c714a
fix(deps): update dependency idna to v3.6 (#635)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-04 21:18:37 +01:00
renovate[bot]
d7b1253555
fix(deps): update dependency websocket_client to v1.7.0 (#638)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-12-04 21:07:27 +01:00
1c7b43fff0
fix settings for required status checks 2023-12-04 21:01:52 +01:00
renovate[bot]
d325e16548
fix(deps): update dependency idna to v3.5 (#634)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-25 14:26:25 +01:00
renovate[bot]
7a7118aa75
chore(deps): lock file maintenance (#629)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-20 09:01:07 +01:00
renovate[bot]
042feaa792
fix(deps): update dependency jsonschema to v4.20.0 (#630)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-20 09:00:41 +01:00
renovate[bot]
39bca2ebf9 chore(deps): update dependency ruff to v0.1.6 2023-11-20 04:44:32 +00:00
renovate[bot]
03437632ff
fix(deps): update dependency certifi to v2023.11.17 (#632)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-18 14:09:40 +01:00
renovate[bot]
9b6e622a84
fix(deps): update dependency dateparser to v1.2.0 (#631)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-17 19:22:52 +01:00
renovate[bot]
7ac907ea02 chore(deps): update dependency ruff to v0.1.5 2023-11-13 04:51:04 +00:00
renovate[bot]
4f6d92bbcc
chore(deps): lock file maintenance (#625)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-12 14:48:56 +01:00
347e074e5b
fix: replace deprecated ruamel.yaml.safe_load (#627) 2023-11-12 14:48:48 +01:00
12f2428e9f
chore: drop yapf and favor of the ruff formatter (#626) 2023-11-10 14:50:56 +01:00
renovate[bot]
2a3e1612f8 chore(deps): update dependency ruff to v0.1.4 2023-11-06 03:53:54 +00:00
renovate[bot]
8a28ecefc6
chore(deps): lock file maintenance (#616)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-04 22:28:33 +01:00
71365ef471
ci: cleanup matrix build name (#623) 2023-11-04 16:24:29 +01:00
renovate[bot]
ce3d0acfcd
fix(deps): update dependency ruamel.yaml to v0.18.5 (#622)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-11-04 16:03:17 +01:00
renovate[bot]
c51f8d1578
fix(deps): update dependency ruamel.yaml to v0.18.3 (#617)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-31 20:43:16 +01:00
renovate[bot]
d27a1a974f
fix(deps): update dependency jsonschema to v4.19.2 (#621)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-31 20:07:57 +01:00
renovate[bot]
5ac3434045 chore(deps): update devdeps non-major 2023-10-30 04:33:50 +00:00
renovate[bot]
c976506e5a chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.44.0 2023-10-29 09:21:21 +00:00
renovate[bot]
e1fab9e27e chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.43.0 2023-10-27 15:45:18 +00:00
renovate[bot]
fed37cc7d0 chore(deps): update devdeps non-major 2023-10-23 04:22:59 +00:00
renovate[bot]
b82fdfbeed chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.42.0 2023-10-21 18:34:47 +00:00
renovate[bot]
06f21389bb
fix(deps): update dependency ruamel.yaml to v0.17.40 (#613)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-21 15:33:50 +02:00
renovate[bot]
54954fab7b chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.41.3 2023-10-20 12:45:37 +00:00
renovate[bot]
56e140e146
fix(deps): update dependency ruamel.yaml to v0.17.39 (#610)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-20 08:58:56 +02:00
renovate[bot]
f314885f99
chore(deps): lock file maintenance (#611)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-19 22:32:12 +02:00
renovate[bot]
985adf4614 chore(docker): update python:3.12-alpine docker digest to a5d1738 2023-10-19 15:16:44 +00:00
renovate[bot]
ee06eff3f2 chore(docker): update python:3.12-alpine docker digest to a4029bd 2023-10-19 06:41:42 +00:00
12cc05e53e
ci: fix changelog generation 2023-10-18 13:59:26 +02:00
b581e501da
chore: replace linkcheck by lychee (#607) 2023-10-16 21:34:26 +02:00
e91f10ae14
chore: replace git-chglog by git-sv (#606) 2023-10-16 15:42:46 +02:00
renovate[bot]
dd299ecf5c
chore(deps): lock file maintenance (#603)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-16 14:28:52 +02:00
ea4bf4a218
feat: add support for python 3.12 (#605)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-16 14:15:38 +02:00
4988cac525
fix: remove deprecated distutils (#604) 2023-10-16 12:11:13 +02:00
renovate[bot]
7b82bbf871 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.41.2 2023-10-11 01:28:27 +00:00
renovate[bot]
3c6dcda7a6
chore(deps): lock file maintenance (#601)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-09 14:56:21 +02:00
renovate[bot]
a75380dcab
fix(deps): update dependency ruamel.yaml to v0.17.35 (#598)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-09 14:56:13 +02:00
renovate[bot]
3ea31f660b
fix(deps): update dependency websocket_client to v1.6.4 (#599)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-09 14:41:11 +02:00
renovate[bot]
9bc9ef4d45 chore(deps): update dependency ruff to v0.0.292 2023-10-09 03:22:53 +00:00
renovate[bot]
0ef523ceb7 chore(docker): update python:3.11-alpine docker digest to 3e73c0b 2023-10-03 13:39:41 +00:00
renovate[bot]
2bebea17fd
chore(deps): lock file maintenance (#594)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-02 11:46:56 +02:00
renovate[bot]
43c1180bee
fix(deps): update dependency ruamel.yaml to v0.17.33 (#592)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-10-02 11:14:15 +02:00
renovate[bot]
39c8ce5c2e chore(docker): update python:3.11-alpine docker digest to cd311c6 2023-09-29 18:07:11 +00:00
renovate[bot]
fcee5e7f6f
fix(deps): update dependency jsonschema to v4.19.1 (#589)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-27 15:15:46 +02:00
renovate[bot]
7ffd2d6ca7
chore(deps): lock file maintenance (#591)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-27 13:47:15 +02:00
renovate[bot]
a97d20c6ff
fix(deps): update dependency zipp to v3.17.0 (#588)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-27 13:46:58 +02:00
8f4b694d7e
ci: use secret for s3 endpoint 2023-09-26 21:40:32 +02:00
renovate[bot]
15bface557
chore(deps): update devdeps non-major (#590)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-25 10:05:10 +02:00
88cf97ee86
docs: drop codecov badge 2023-09-25 09:27:02 +02:00
renovate[bot]
a4e893b5dd
chore(deps): lock file maintenance (#581)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-18 08:45:47 +02:00
renovate[bot]
fe27327da5
fix(deps): update dependency websocket_client to v1.6.3 (#586)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-09-18 08:45:39 +02:00
renovate[bot]
544c0bf25b chore(deps): update dependency ruff to v0.0.290 2023-09-18 04:32:51 +00:00
renovate[bot]
ff118d656a chore(deps): update dependency pytest to v7.4.2 2023-09-11 04:41:20 +00:00
renovate[bot]
cca9765fa2 chore(deps): update devdeps non-major 2023-09-04 04:51:54 +00:00
renovate[bot]
aa1b914f6b chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.41.1 2023-09-04 02:08:07 +00:00
renovate[bot]
a265caa3ca chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.41.0 2023-09-01 04:13:21 +00:00
renovate[bot]
5f2594710f chore(deps): update dependency ruff to v0.0.286 2023-08-28 03:34:59 +00:00
renovate[bot]
16e6aec457 chore(docker): update python:3.11-alpine docker digest to 5d769f9 2023-08-26 09:47:36 +00:00
7c1bab90c9
fix: use poetry-dynamic-versioning backend wrapper 2023-08-25 00:28:39 +02:00
4f6b8880c4
add back pytest to ci 2023-08-24 23:53:26 +02:00
renovate[bot]
f0b927edd2
chore(deps): lock file maintenance (#575)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-24 23:30:31 +02:00
renovate[bot]
bb651f9e10
fix(deps): update dependency websocket_client to v1.6.2 (#577)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-24 23:24:22 +02:00
9b2094d0f2
ci: migrate to woodpecker (#578) 2023-08-24 22:56:04 +02:00
renovate[bot]
034100a706 chore(deps): update dependency ruff to v0.0.285 2023-08-21 04:55:14 +00:00
renovate[bot]
b6c0253a04 chore(deps): update dependency ruff to v0.0.284 2023-08-14 03:37:02 +00:00
renovate[bot]
cae751f84a chore(docker): update python:3.11-alpine docker digest to 603975e 2023-08-09 13:04:49 +00:00
renovate[bot]
e7622ecf28 chore(docker): update python:3.11-alpine docker digest to 4352dc7 2023-08-09 06:48:26 +00:00
renovate[bot]
69c1ddecb6
fix(deps): update dependency jsonschema to v4.19.0 (#570)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-09 07:34:32 +02:00
renovate[bot]
81de219b8a
chore(deps): lock file maintenance (#569)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-09 07:34:03 +02:00
renovate[bot]
304c54cdaa chore(docker): update python:3.11-alpine docker digest to bd16cc5 2023-08-08 11:14:17 +00:00
renovate[bot]
3562868a44 chore(deps): update dependency ruff to v0.0.282 2023-08-07 05:09:28 +00:00
renovate[bot]
0b9ce24909
fix(deps): update dependency jsonschema to v4.18.6 (#567)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-05 15:50:19 +02:00
renovate[bot]
6397347f6e
fix(deps): update dependency jsonschema to v4.18.5 (#566)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-02 22:00:18 +02:00
renovate[bot]
53db01a050
chore(deps): lock file maintenance (#565)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-02 10:47:11 +02:00
renovate[bot]
4a3ffc823b
fix(deps): update dependency pathspec to v0.11.2 (#564)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-08-02 10:44:28 +02:00
renovate[bot]
88ddece439 chore(deps): update dependency ruff to v0.0.280 2023-07-24 04:05:17 +00:00
renovate[bot]
b4fcf55bad
fix(deps): update dependency jsonschema to v4.18.4 (#554)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-23 13:48:14 +02:00
renovate[bot]
eb600badab
fix(deps): update dependency zipp to v3.16.2 (#555)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-23 13:36:31 +02:00
00d3334ec8
chore: drop support for python 3.7 (#562)
BREAKING CHANGE: The support for Python 3.7 was removed.
2023-07-23 13:14:45 +02:00
renovate[bot]
f8c0ffc313
fix(deps): update dependency certifi to v2023.7.22 (#561)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-23 10:01:59 +02:00
renovate[bot]
5a14273f81
chore(deps): lock file maintenance (#546)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-07-19 10:38:06 +02:00
renovate[bot]
08c0bce852
chore(deps): update dependency ruff to v0.0.278 (#560)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Robert Kaussow <mail@thegeeklab.de>
2023-07-19 10:36:03 +02:00
renovate[bot]
f8cc44c8c8 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.40.1 2023-07-12 12:42:03 +00:00
renovate[bot]
8dd1af4c8c chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.40.0 2023-07-11 23:23:17 +00:00
5ac47c0af6
ci: bump hugo to v0.115.2 (#558) 2023-07-11 21:29:37 +02:00
renovate[bot]
330045634e chore(deps): update dependency ruff to v0.0.277 2023-07-10 04:52:23 +00:00
renovate[bot]
9a36af321b chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.7 2023-07-03 11:17:34 +00:00
renovate[bot]
e77b94a096 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.6 2023-06-28 22:58:07 +00:00
renovate[bot]
8e12d9d38d
chore(deps): update devdeps non-major (#551)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Robert Kaussow <mail@thegeeklab.de>
2023-06-28 10:10:26 +02:00
renovate[bot]
62b2865424
fix(deps): update dependency websocket_client to v1.6.1 (#550)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-28 07:53:47 +02:00
renovate[bot]
ce31cb7109 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.5 2023-06-23 12:41:47 +00:00
b99be1f3a5
ci: bump hugo to v0.114.0 (#549) 2023-06-23 11:13:55 +02:00
9d81d2fd66
docs: replace socialmedia image (#547) 2023-06-20 14:23:50 +02:00
renovate[bot]
2258638555 chore(deps): update dependency pytest-mock to v3.11.1 2023-06-19 04:13:29 +00:00
renovate[bot]
59dbc8daef
fix(deps): update dependency ruamel.yaml to v0.17.32 (#543)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-17 17:22:06 +02:00
renovate[bot]
aa20b9aa32
fix(deps): update dependency websocket_client to v1.6.0 (#544)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-17 15:22:40 +02:00
renovate[bot]
c1a372ebd0 chore(docker): update python:3.11-alpine docker digest to 25df32b 2023-06-15 16:38:45 +00:00
renovate[bot]
2ecdb5ce2c
chore(deps): lock file maintenance (#541)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-15 09:20:17 +02:00
renovate[bot]
983911a58b
chore(deps): update devdeps non-major (#540)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
Co-authored-by: Robert Kaussow <mail@thegeeklab.de>
2023-06-15 09:20:09 +02:00
renovate[bot]
b88a8fe280
fix(deps): update dependency websocket_client to v1.5.3 (#539)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-10 15:33:57 +02:00
renovate[bot]
758888ef93 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.4 2023-06-09 11:23:13 +00:00
renovate[bot]
28baf4f9bc chore(docker): update python:3.11-alpine docker digest to 995c7fc 2023-06-08 03:25:54 +00:00
renovate[bot]
f27e44e979 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.3 2023-06-05 18:22:10 +00:00
renovate[bot]
69761af054
fix(deps): update dependency ruamel.yaml to v0.17.31 (#533)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-05 10:35:56 +02:00
renovate[bot]
352bd11129
chore(deps): lock file maintenance (#535)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-05 10:06:36 +02:00
renovate[bot]
b048c76870
fix(deps): update dependency docker to v6.1.3 (#534)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-06-05 10:06:19 +02:00
renovate[bot]
fb8d7d835d chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.2 2023-05-29 12:28:00 +00:00
renovate[bot]
6f2ed5ca86
fix(deps): update dependency ruamel.yaml to v0.17.28 (#529)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-29 12:23:43 +02:00
renovate[bot]
92eb995799
chore(deps): lock file maintenance (#531)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-29 12:07:44 +02:00
renovate[bot]
c3c2cec106
fix(deps): update dependency websocket_client to v1.5.2 (#526)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-29 12:07:19 +02:00
renovate[bot]
82036df6ab
chore(deps): update devdeps non-major (#524) 2023-05-29 11:35:27 +02:00
renovate[bot]
5c457a3715
fix(deps): update dependency requests to v2.31.0 [security] (#528)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-28 23:10:05 +02:00
renovate[bot]
68cfc83503
chore(deps): lock file maintenance (#525)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-28 15:28:55 +02:00
renovate[bot]
3630fdc4e2
fix(deps): update dependency certifi to v2023 (#520)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-28 15:28:41 +02:00
7b2270d4f1
chore: remove poetry experimental.new-installer flag (#530) 2023-05-28 15:18:52 +02:00
renovate[bot]
f198a21b70
fix(deps): update dependency docker to v6.1.2 (#519)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-14 19:48:05 +02:00
renovate[bot]
a3b539953f
chore(deps): lock file maintenance (#506)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-14 18:56:44 +02:00
renovate[bot]
4de34d58f5
fix(deps): update dependency requests to v2.30.0 (#518)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-14 18:55:38 +02:00
renovate[bot]
839765c19d
fix(deps): update dependency ruamel.yaml to v0.17.26 (#513)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-05-13 11:11:54 +02:00
renovate[bot]
cafb48dd8c chore(docker): update python:3.11-alpine docker digest to 4e8e9a5 2023-05-12 19:26:32 +00:00
renovate[bot]
c09cbcecd5 chore(docker): update python:3.11-alpine docker digest to 2f2dadb 2023-05-12 08:02:20 +00:00
renovate[bot]
afcd209277 chore(deps): update dependency ruff to v0.0.265 2023-05-08 08:06:07 +00:00
renovate[bot]
3ff50a673f chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.1 2023-05-04 16:15:45 +00:00
renovate[bot]
7865d4bfe3 chore(docker): update python:3.11-alpine docker digest to 7210235 2023-05-03 23:27:41 +00:00
renovate[bot]
32eb2fcaed chore(docker): update python:3.11-alpine docker digest to 06a3f7b 2023-05-03 14:19:14 +00:00
7695d32d61
fix bare url in contribution file (#515) 2023-05-03 09:36:55 +02:00
renovate[bot]
3b4e4f042a chore(deps): update dependency ruff to v0.0.263 2023-05-01 04:36:48 +00:00
renovate[bot]
ffa9f1de98
fix(deps): update dependency requests to v2.29.0 (#511)
Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com>
2023-04-27 08:46:50 +02:00
renovate[bot]
222fdb9a24 chore(deps): update devdeps non-major 2023-04-24 05:43:03 +00:00
renovate[bot]
b26ea42ad0 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.39.0 2023-04-20 03:21:34 +00:00
renovate[bot]
beb4a34349 chore(deps): update dependency pytest to v7.3.1 2023-04-17 17:40:38 +00:00
5b55a2585c
ci: switch to new codecov uploader (#508) 2023-04-17 16:22:23 +02:00
renovate[bot]
9232d91088 chore(deps): update devdeps non-major 2023-04-10 04:43:37 +00:00
renovate[bot]
ae7d326db0 chore(docker): update python:3.11-alpine docker digest to 507818d 2023-04-08 02:25:54 +00:00
renovate[bot]
ffc99756d9 chore(docker): update python:3.11-alpine docker digest to 5405826 2023-04-06 10:01:41 +00:00
renovate[bot]
f453268586 chore(docker): update python:3.11-alpine docker digest to 4b4078a 2023-03-30 08:05:07 +00:00
renovate[bot]
e186b101f9 chore(docker): update python:3.11-alpine docker digest to 4d53bc4 2023-03-30 01:51:21 +00:00
renovate[bot]
61ff009407 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.38.1 2023-03-27 22:11:45 +00:00
renovate[bot]
1d71983c0a
chore(deps): lock file maintenance (#499) 2023-03-27 21:09:09 +02:00
renovate[bot]
f4a3917675
fix(deps): update dependency dateparser to v1.1.8 (#496) 2023-03-27 21:08:55 +02:00
renovate[bot]
1d3d472507 chore(docker): update python:3.11-alpine docker digest to 8af856d 2023-03-27 14:04:31 +00:00
renovate[bot]
99437083fc
chore(deps): update dependency ruff to v0.0.259 (#498) 2023-03-27 13:15:09 +02:00
renovate[bot]
f6039d90b8 chore(docker): update python:3.11-alpine docker digest to 506eed4 2023-03-23 19:52:15 +00:00
renovate[bot]
711acd985c
fix(deps): update dependency pathspec to v0.11.1 (#493) 2023-03-20 11:00:25 +01:00
renovate[bot]
b4caa60b51
chore(deps): lock file maintenance (#489) 2023-03-20 10:37:06 +01:00
renovate[bot]
f268028c67
chore(deps): update dependency ruff to v0.0.257 (#494) 2023-03-20 10:34:08 +01:00
renovate[bot]
088bcebfb0 chore(docker): update python:3.11-alpine docker digest to 741e650 2023-03-14 18:27:47 +00:00
6c97a93bc4
chore: exclude ruff linter rule UP038 (#490) 2023-03-07 14:21:44 +01:00
renovate[bot]
3f8f86351b chore(deps): update devdependencies (non-major) 2023-03-06 05:06:31 +00:00
renovate[bot]
913b5aab01 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.38.0 2023-03-05 00:51:31 +00:00
renovate[bot]
445e0e9435
fix(deps): update dependency zipp to v3.15.0 (#484) 2023-02-27 09:33:21 +01:00
renovate[bot]
005a44842e
fix(deps): update dependency python-json-logger to v2.0.7 (#482) 2023-02-27 09:21:42 +01:00
renovate[bot]
83e3c0a158
chore(deps): update dependency ruff to v0.0.252 (#485) 2023-02-27 09:02:39 +01:00
renovate[bot]
5e163ba5b5 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.37.5 2023-02-27 04:54:22 +00:00
renovate[bot]
baa8dbe240 chore(docker): update python:3.11-alpine docker digest to 1a5c146 2023-02-25 11:32:46 +00:00
renovate[bot]
1c1bc5fe32
fix(deps): update dependency python-json-logger to v2.0.6 (#478) 2023-02-18 14:34:38 +01:00
renovate[bot]
4cc8f89505
fix(deps): update dependency zipp to v3.14.0 (#481) 2023-02-18 14:25:13 +01:00
renovate[bot]
7480d76db5 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.37.4 2023-02-17 15:41:09 +00:00
renovate[bot]
20c43043c7 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.37.3 2023-02-16 16:41:47 +00:00
9073896721
refctor: migrate flake8 to ruff python linter (#477) 2023-02-12 14:46:35 +01:00
renovate[bot]
bff68cb9bd chore(docker): update python:3.11-alpine docker digest to 8463061 2023-02-11 19:07:50 +00:00
renovate[bot]
4ed5285d63 chore(docker): update python:3.11-alpine docker digest to dbc4bbe 2023-02-11 10:38:24 +00:00
renovate[bot]
80a953e930
fix(deps): update dependency zipp to v3.13.0 (#474) 2023-02-09 19:50:25 +01:00
5c92916f51
ci: bump container build plugin to drone-docker-buildx:23 (#473) 2023-02-09 19:42:09 +01:00
renovate[bot]
fd4eb05830 chore(docker): update python:3.11-alpine docker digest to deb0f63 2023-02-09 09:43:17 +00:00
6a2454d081
fix drone-matrix template (#471) 2023-02-08 21:57:33 +01:00
renovate[bot]
6d4ff66b3f
fix(deps): update dependency websocket_client to v1.5.1 (#469) 2023-02-08 12:11:52 +01:00
renovate[bot]
ca1db20838
fix(deps): update dependency zipp to v3.12.1 (#470) 2023-02-08 10:03:12 +01:00
renovate[bot]
ef35312edf chore(docker): update python:3.11-alpine docker digest to d8b0703 2023-02-04 11:25:08 +00:00
renovate[bot]
33d4d8cea3
fix(deps): update dependency dateparser to v1.1.7 (#467) 2023-02-02 21:33:45 +01:00
renovate[bot]
cf5af9f34f
fix(deps): update dependency pathspec to v0.11.0 (#464) 2023-02-02 12:21:23 +01:00
renovate[bot]
fbcc0e3dfa
fix(deps): update dependency websocket_client to v1.5.0 (#465) 2023-02-02 10:24:27 +01:00
renovate[bot]
6bbc993e48
chore(deps): lock file maintenance (#462) 2023-02-02 09:22:59 +01:00
renovate[bot]
4bc7375c13
fix(deps): update dependency zipp to v3.12.0 (#466) 2023-02-02 09:16:06 +01:00
renovate[bot]
98c740fb90 chore(docker): update python:3.11-alpine docker digest to ca1298a 2023-01-24 11:25:33 +00:00
renovate[bot]
31994c8c06 chore(deps): update devdependencies (non-major) 2023-01-23 05:52:37 +00:00
renovate[bot]
9346326e0b chore(docker): update python:3.11-alpine docker digest to 625383c 2023-01-18 13:11:59 +00:00
renovate[bot]
6f7e3cf889
fix(deps): update dependency dateparser to v1.1.6 (#457) 2023-01-16 09:46:17 +01:00
renovate[bot]
82d21e5b07
fix(deps): update dependency requests to v2.28.2 (#458) 2023-01-16 09:33:43 +01:00
8135f73ee2
refactor: use buildx for multiarch container builds (#459) 2023-01-16 09:10:35 +01:00
renovate[bot]
fa1d245f12 chore(docker): update docker digests 2023-01-10 05:19:59 +00:00
renovate[bot]
ff722181f9
chore(deps): lock file maintenance (#448) 2023-01-09 21:17:32 +01:00
renovate[bot]
1219aaa1c7 chore(deps): update dependency pydocstyle to v6.2.3 2023-01-09 03:36:22 +00:00
renovate[bot]
6929c94a3a chore(docker): update docker digests 2023-01-08 18:29:30 +00:00
8b8e3eafae
chore: remove support for arm32 (#454)
BREAKING CHANGE: We dropped the arm32 platform support and builds.
2023-01-08 16:12:23 +01:00
renovate[bot]
a3d1ee6d2a
chore(deps): update dependency flake8-isort to v6 (#450) 2023-01-03 14:52:39 +01:00
renovate[bot]
fcaf3e47d0
fix(deps): update dependency dateparser to v1.1.5 (#452) 2023-01-03 14:08:40 +01:00
renovate[bot]
55248a7199 chore(deps): update devdependencies (non-major) 2022-12-26 03:52:06 +00:00
renovate[bot]
522941a6e3 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.37.1 2022-12-21 20:29:48 +00:00
renovate[bot]
354d0ad8a7 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.37.0 2022-12-12 00:12:29 +00:00
renovate[bot]
825068c98d
fix(deps): update dependency pathspec to v0.10.3 (#446) 2022-12-11 12:42:21 +01:00
renovate[bot]
9e0e4d3bfa
chore(deps): lock file maintenance (#433) 2022-12-09 22:45:43 +01:00
renovate[bot]
26a4ca5601
chore(docker): update docker digests (#443) 2022-12-09 22:45:31 +01:00
renovate[bot]
a6973289bf
fix(deps): update dependency certifi to v2022.12.7 [security] (#444) 2022-12-09 22:14:08 +01:00
renovate[bot]
65af002494
fix(deps): update dependency zipp to v3.11.0 (#438) 2022-12-04 19:05:50 +01:00
renovate[bot]
1f15102098
fix(deps): update dependency jsonschema to v4.17.3 (#440) 2022-12-04 18:21:08 +01:00
renovate[bot]
9cd7526026 chore(docker): update docker digests 2022-11-30 04:40:48 +00:00
renovate[bot]
0d85108bc1 chore(deps): update dependency flake8-logging-format to v0.9.0 2022-11-28 03:34:14 +00:00
82ec4f3138
ci: use python311 base image on ci (#437) 2022-11-24 21:35:40 +01:00
renovate[bot]
2d27816802
fix(deps): update dependency dateparser to v1.1.4 (#434) 2022-11-24 15:10:22 +01:00
renovate[bot]
edddd5ea30
fix(deps): update dependency jsonschema to v4.17.1 (#435) 2022-11-24 10:46:24 +01:00
renovate[bot]
b3eb7c6659 chore(deps): update dependency flake8-isort to v5.0.3 2022-11-21 04:26:04 +00:00
renovate[bot]
62a6ecb92a
chore(deps): lock file maintenance (#425) 2022-11-17 21:40:02 +01:00
renovate[bot]
4d55cab3f0
fix(deps): update dependency pathspec to v0.10.2 (#429) 2022-11-17 21:39:48 +01:00
renovate[bot]
52241caf28 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.36.1 2022-11-17 00:26:29 +00:00
renovate[bot]
c823004049 chore(docker): update docker digests 2022-11-16 12:24:14 +00:00
renovate[bot]
b4442b9a95 chore(docker): update docker digests 2022-11-12 15:30:23 +00:00
renovate[bot]
c4dd01eb1a chore(docker): update docker digests 2022-11-11 16:08:02 +00:00
renovate[bot]
1347dbe794 chore(docker): update docker digests 2022-11-11 06:11:43 +00:00
renovate[bot]
6d66189180 chore(deps): update dependency flake8-builtins to v2.0.1 2022-11-07 04:47:47 +00:00
renovate[bot]
3a9eec8eb9
fix(deps): update dependency docker to v6.0.1 (#419) 2022-11-05 14:09:44 +01:00
renovate[bot]
fa86bb6aea
fix(deps): update dependency dateparser to v1.1.3 (#420) 2022-11-05 09:20:25 +01:00
104f38790b
chore: bump hugo to v0.105.0 (#423) 2022-11-05 09:20:01 +01:00
renovate[bot]
85c9bfe492
fix(deps): update dependency websocket_client to v1.4.2 (#421) 2022-11-05 07:46:30 +01:00
198c08f684
ci: refactor broken link check (#422) 2022-11-04 12:58:11 +01:00
renovate[bot]
45c5213b61 chore(deps): update dependency thegeeklab/hugo-geekdoc to v0.36.0 2022-11-03 18:49:54 +00:00
06a9dd3772
ci: add test step for python 11 (#417) 2022-11-02 13:01:40 +01:00
40 changed files with 1752 additions and 2832 deletions

View File

@ -1,23 +0,0 @@
# Changelog
{{ range .Versions -}}
## {{ if .Tag.Previous }}[{{ .Tag.Name }}]({{ $.Info.RepositoryURL }}/compare/{{ .Tag.Previous.Name }}...{{ .Tag.Name }}){{ else }}{{ .Tag.Name }}{{ end }} ({{ datetime "2006-01-02" .Tag.Date }})
{{ range .CommitGroups -}}
### {{ .Title }}
{{ range .Commits -}}
- {{ if .Scope }}**{{ .Scope }}:** {{ end }}{{ (regexReplaceAll "(.*)/issues/(.*)" (regexReplaceAll "(Co-\\w*-by.*)" .Subject "") "${1}/pull/${2}") | trim }}
{{ end }}
{{- end -}}
{{- if .NoteGroups -}}
{{ range .NoteGroups -}}
### {{ .Title }}
{{ range .Notes }}
{{ .Body }}
{{ end }}
{{ end -}}
{{ end -}}
{{ end -}}

View File

@ -1,25 +0,0 @@
style: github
template: CHANGELOG.tpl.md
info:
title: CHANGELOG
repository_url: https://github.com/thegeeklab/docker-tidy
options:
commit_groups:
title_maps:
feat: Features
fix: Bug Fixes
perf: Performance Improvements
refactor: Code Refactoring
chore: Others
test: Testing
ci: CI Pipeline
docs: Documentation
header:
pattern: "^(\\w*)(?:\\(([\\w\\$\\.\\-\\*\\s]*)\\))?\\:\\s(.*)$"
pattern_maps:
- Type
- Scope
- Subject
notes:
keywords:
- BREAKING CHANGE

View File

@ -1,510 +0,0 @@
local PythonVersion(pyversion='3.7') = {
name: 'python' + std.strReplace(pyversion, '.', '') + '-pytest',
image: 'python:' + pyversion,
environment: {
PY_COLORS: 1,
},
commands: [
'pip install poetry poetry-dynamic-versioning -qq',
'poetry config experimental.new-installer false',
'poetry install',
'poetry run pytest dockertidy --cov=dockertidy --cov-append --no-cov-on-fail',
'poetry version',
'poetry run docker-tidy --help',
],
depends_on: [
'fetch',
],
};
local PipelineLint = {
kind: 'pipeline',
name: 'lint',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
name: 'yapf',
image: 'python:3.10',
environment: {
PY_COLORS: 1,
},
commands: [
'git fetch -tq',
'pip install poetry poetry-dynamic-versioning -qq',
'poetry config experimental.new-installer false',
'poetry install',
'poetry run yapf -dr ./dockertidy',
],
},
{
name: 'flake8',
image: 'python:3.10',
environment: {
PY_COLORS: 1,
},
commands: [
'git fetch -tq',
'pip install poetry poetry-dynamic-versioning -qq',
'poetry config experimental.new-installer false',
'poetry install',
'poetry run flake8 ./dockertidy',
],
},
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineTest = {
kind: 'pipeline',
name: 'test',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
name: 'fetch',
image: 'python:3.10',
commands: [
'git fetch -tq',
],
},
PythonVersion(pyversion='3.7'),
PythonVersion(pyversion='3.8'),
PythonVersion(pyversion='3.9'),
PythonVersion(pyversion='3.10'),
{
name: 'codecov',
image: 'python:3.10',
environment: {
PY_COLORS: 1,
CODECOV_TOKEN: { from_secret: 'codecov_token' },
},
commands: [
'pip install codecov -qq',
'codecov --required -X gcov',
],
depends_on: [
'python37-pytest',
'python38-pytest',
'python39-pytest',
'python310-pytest',
],
},
],
depends_on: [
'lint',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineSecurity = {
kind: 'pipeline',
name: 'security',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
name: 'bandit',
image: 'python:3.10',
environment: {
PY_COLORS: 1,
},
commands: [
'git fetch -tq',
'pip install poetry poetry-dynamic-versioning -qq',
'poetry config experimental.new-installer false',
'poetry install',
'poetry run bandit -r ./dockertidy -x ./dockertidy/test',
],
},
],
depends_on: [
'test',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineBuildPackage = {
kind: 'pipeline',
name: 'build-package',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
name: 'build',
image: 'python:3.10',
commands: [
'git fetch -tq',
'pip install poetry poetry-dynamic-versioning -qq',
'poetry build',
],
},
{
name: 'checksum',
image: 'alpine',
commands: [
'cd dist/ && sha256sum * > ../sha256sum.txt',
],
},
{
name: 'changelog-generate',
image: 'thegeeklab/git-chglog',
commands: [
'git fetch -tq',
'git-chglog --no-color --no-emoji -o CHANGELOG.md ${DRONE_TAG:---next-tag unreleased unreleased}',
],
},
{
name: 'changelog-format',
image: 'thegeeklab/alpine-tools',
commands: [
'prettier CHANGELOG.md',
'prettier -w CHANGELOG.md',
],
},
{
name: 'publish-github',
image: 'plugins/github-release',
settings: {
overwrite: true,
api_key: { from_secret: 'github_token' },
files: ['dist/*', 'sha256sum.txt'],
title: '${DRONE_TAG}',
note: 'CHANGELOG.md',
},
when: {
ref: ['refs/tags/**'],
},
},
{
name: 'publish-pypi',
image: 'python:3.10',
commands: [
'git fetch -tq',
'pip install poetry poetry-dynamic-versioning -qq',
'poetry publish -n',
],
environment: {
POETRY_HTTP_BASIC_PYPI_USERNAME: { from_secret: 'pypi_username' },
POETRY_HTTP_BASIC_PYPI_PASSWORD: { from_secret: 'pypi_password' },
},
when: {
ref: ['refs/tags/**'],
},
},
],
depends_on: [
'security',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineBuildContainer(arch='amd64') = {
local build = if arch == 'arm' then [{
name: 'build',
image: 'python:3.10-alpine',
commands: [
'apk add -Uq --no-cache build-base openssl-dev libffi-dev musl-dev python3-dev git cargo',
'git fetch -tq',
'pip install poetry poetry-dynamic-versioning -qq',
'poetry build',
],
environment: {
CARGO_NET_GIT_FETCH_WITH_CLI: true,
},
}] else [{
name: 'build',
image: 'python:3.10',
commands: [
'git fetch -tq',
'pip install poetry poetry-dynamic-versioning -qq',
'poetry build',
],
}],
kind: 'pipeline',
name: 'build-container-' + arch,
platform: {
os: 'linux',
arch: arch,
},
steps: build + [
{
name: 'dryrun',
image: 'thegeeklab/drone-docker:19',
settings: {
dry_run: true,
dockerfile: 'docker/Dockerfile.' + arch,
repo: 'thegeeklab/${DRONE_REPO_NAME}',
username: { from_secret: 'docker_username' },
password: { from_secret: 'docker_password' },
},
depends_on: ['build'],
when: {
ref: ['refs/pull/**'],
},
},
{
name: 'publish-dockerhub',
image: 'thegeeklab/drone-docker:19',
settings: {
auto_tag: true,
auto_tag_suffix: arch,
dockerfile: 'docker/Dockerfile.' + arch,
repo: 'thegeeklab/${DRONE_REPO_NAME}',
username: { from_secret: 'docker_username' },
password: { from_secret: 'docker_password' },
},
when: {
ref: ['refs/heads/main', 'refs/tags/**'],
},
depends_on: ['dryrun'],
},
{
name: 'publish-quay',
image: 'thegeeklab/drone-docker:19',
settings: {
auto_tag: true,
auto_tag_suffix: arch,
dockerfile: 'docker/Dockerfile.' + arch,
registry: 'quay.io',
repo: 'quay.io/thegeeklab/${DRONE_REPO_NAME}',
username: { from_secret: 'quay_username' },
password: { from_secret: 'quay_password' },
},
when: {
ref: ['refs/heads/main', 'refs/tags/**'],
},
depends_on: ['dryrun'],
},
],
depends_on: [
'security',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineDocs = {
kind: 'pipeline',
name: 'docs',
platform: {
os: 'linux',
arch: 'amd64',
},
concurrency: {
limit: 1,
},
steps: [
{
name: 'assets',
image: 'thegeeklab/alpine-tools',
commands: [
'make doc',
],
},
{
name: 'markdownlint',
image: 'thegeeklab/markdownlint-cli',
commands: [
"markdownlint 'docs/content/**/*.md' 'README.md' 'CONTRIBUTING.md'",
],
},
{
name: 'spellcheck',
image: 'thegeeklab/alpine-tools',
commands: [
"spellchecker --files 'docs/content/**/*.md' 'README.md' 'CONTRIBUTING.md' -d .dictionary -p spell indefinite-article syntax-urls --no-suggestions",
],
environment: {
FORCE_COLOR: true,
NPM_CONFIG_LOGLEVEL: 'error',
},
},
{
name: 'testbuild',
image: 'thegeeklab/hugo:0.97.3',
commands: [
'hugo --panicOnWarning -s docs/ -b http://localhost:8000/',
],
},
{
name: 'link-validation',
image: 'thegeeklab/link-validator',
commands: [
'link-validator --nice --external --skip-file .linkcheckignore',
],
environment: {
LINK_VALIDATOR_BASE_DIR: 'docs/public',
},
},
{
name: 'build',
image: 'thegeeklab/hugo:0.97.3',
commands: [
'hugo --panicOnWarning -s docs/',
],
},
{
name: 'beautify',
image: 'thegeeklab/alpine-tools',
commands: [
"html-beautify -r -f 'docs/public/**/*.html'",
],
environment: {
FORCE_COLOR: true,
NPM_CONFIG_LOGLEVEL: 'error',
},
},
{
name: 'publish',
image: 'thegeeklab/drone-s3-sync',
settings: {
access_key: { from_secret: 's3_access_key' },
bucket: 'geekdocs',
delete: true,
endpoint: 'https://sp.rknet.org',
path_style: true,
secret_key: { from_secret: 's3_secret_access_key' },
source: 'docs/public/',
strip_prefix: 'docs/public/',
target: '/${DRONE_REPO_NAME}',
},
when: {
ref: ['refs/heads/main', 'refs/tags/**'],
},
},
],
depends_on: [
'build-package',
'build-container-amd64',
'build-container-arm64',
'build-container-arm',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**', 'refs/pull/**'],
},
};
local PipelineNotifications = {
kind: 'pipeline',
name: 'notifications',
platform: {
os: 'linux',
arch: 'amd64',
},
steps: [
{
image: 'plugins/manifest',
name: 'manifest-dockerhub',
settings: {
ignore_missing: true,
auto_tag: true,
username: { from_secret: 'docker_username' },
password: { from_secret: 'docker_password' },
spec: 'docker/manifest.tmpl',
},
when: {
status: ['success'],
},
},
{
image: 'plugins/manifest',
name: 'manifest-quay',
settings: {
ignore_missing: true,
auto_tag: true,
username: { from_secret: 'quay_username' },
password: { from_secret: 'quay_password' },
spec: 'docker/manifest-quay.tmpl',
},
when: {
status: ['success'],
},
},
{
name: 'pushrm-dockerhub',
pull: 'always',
image: 'chko/docker-pushrm:1',
environment: {
DOCKER_PASS: {
from_secret: 'docker_password',
},
DOCKER_USER: {
from_secret: 'docker_username',
},
PUSHRM_FILE: 'README.md',
PUSHRM_SHORT: 'Keep docker hosts tidy',
PUSHRM_TARGET: 'thegeeklab/${DRONE_REPO_NAME}',
},
when: {
status: ['success'],
},
},
{
name: 'pushrm-quay',
pull: 'always',
image: 'chko/docker-pushrm:1',
environment: {
APIKEY__QUAY_IO: {
from_secret: 'quay_token',
},
PUSHRM_FILE: 'README.md',
PUSHRM_TARGET: 'quay.io/thegeeklab/${DRONE_REPO_NAME}',
},
when: {
status: ['success'],
},
},
{
name: 'matrix',
image: 'thegeeklab/drone-matrix',
settings: {
homeserver: { from_secret: 'matrix_homeserver' },
roomid: { from_secret: 'matrix_roomid' },
template: 'Status: **{{ build.Status }}**<br/> Build: [{{ repo.Owner }}/{{ repo.Name }}]({{ build.Link }}){{#if build.Branch}} ({{ build.Branch }}){{/if}} by {{ commit.Author }}<br/> Message: {{ commit.Message.Title }}',
username: { from_secret: 'matrix_username' },
password: { from_secret: 'matrix_password' },
},
when: {
status: ['success', 'failure'],
},
},
],
depends_on: [
'docs',
],
trigger: {
ref: ['refs/heads/main', 'refs/tags/**'],
status: ['success', 'failure'],
},
};
[
PipelineLint,
PipelineTest,
PipelineSecurity,
PipelineBuildPackage,
PipelineBuildContainer(arch='amd64'),
PipelineBuildContainer(arch='arm64'),
PipelineBuildContainer(arch='arm'),
PipelineDocs,
PipelineNotifications,
]

View File

@ -1,652 +0,0 @@
---
kind: pipeline
name: lint
platform:
os: linux
arch: amd64
steps:
- name: yapf
image: python:3.10
commands:
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry config experimental.new-installer false
- poetry install
- poetry run yapf -dr ./dockertidy
environment:
PY_COLORS: 1
- name: flake8
image: python:3.10
commands:
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry config experimental.new-installer false
- poetry install
- poetry run flake8 ./dockertidy
environment:
PY_COLORS: 1
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
---
kind: pipeline
name: test
platform:
os: linux
arch: amd64
steps:
- name: fetch
image: python:3.10
commands:
- git fetch -tq
- name: python37-pytest
image: python:3.7
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry config experimental.new-installer false
- poetry install
- poetry run pytest dockertidy --cov=dockertidy --cov-append --no-cov-on-fail
- poetry version
- poetry run docker-tidy --help
environment:
PY_COLORS: 1
depends_on:
- fetch
- name: python38-pytest
image: python:3.8
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry config experimental.new-installer false
- poetry install
- poetry run pytest dockertidy --cov=dockertidy --cov-append --no-cov-on-fail
- poetry version
- poetry run docker-tidy --help
environment:
PY_COLORS: 1
depends_on:
- fetch
- name: python39-pytest
image: python:3.9
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry config experimental.new-installer false
- poetry install
- poetry run pytest dockertidy --cov=dockertidy --cov-append --no-cov-on-fail
- poetry version
- poetry run docker-tidy --help
environment:
PY_COLORS: 1
depends_on:
- fetch
- name: python310-pytest
image: python:3.10
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry config experimental.new-installer false
- poetry install
- poetry run pytest dockertidy --cov=dockertidy --cov-append --no-cov-on-fail
- poetry version
- poetry run docker-tidy --help
environment:
PY_COLORS: 1
depends_on:
- fetch
- name: codecov
image: python:3.10
commands:
- pip install codecov -qq
- codecov --required -X gcov
environment:
CODECOV_TOKEN:
from_secret: codecov_token
PY_COLORS: 1
depends_on:
- python37-pytest
- python38-pytest
- python39-pytest
- python310-pytest
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- lint
---
kind: pipeline
name: security
platform:
os: linux
arch: amd64
steps:
- name: bandit
image: python:3.10
commands:
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry config experimental.new-installer false
- poetry install
- poetry run bandit -r ./dockertidy -x ./dockertidy/test
environment:
PY_COLORS: 1
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- test
---
kind: pipeline
name: build-package
platform:
os: linux
arch: amd64
steps:
- name: build
image: python:3.10
commands:
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry build
- name: checksum
image: alpine
commands:
- cd dist/ && sha256sum * > ../sha256sum.txt
- name: changelog-generate
image: thegeeklab/git-chglog
commands:
- git fetch -tq
- git-chglog --no-color --no-emoji -o CHANGELOG.md ${DRONE_TAG:---next-tag unreleased unreleased}
- name: changelog-format
image: thegeeklab/alpine-tools
commands:
- prettier CHANGELOG.md
- prettier -w CHANGELOG.md
- name: publish-github
image: plugins/github-release
settings:
api_key:
from_secret: github_token
files:
- dist/*
- sha256sum.txt
note: CHANGELOG.md
overwrite: true
title: ${DRONE_TAG}
when:
ref:
- refs/tags/**
- name: publish-pypi
image: python:3.10
commands:
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry publish -n
environment:
POETRY_HTTP_BASIC_PYPI_PASSWORD:
from_secret: pypi_password
POETRY_HTTP_BASIC_PYPI_USERNAME:
from_secret: pypi_username
when:
ref:
- refs/tags/**
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- security
---
kind: pipeline
name: build-container-amd64
platform:
os: linux
arch: amd64
steps:
- name: build
image: python:3.10
commands:
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry build
- name: dryrun
image: thegeeklab/drone-docker:19
settings:
dockerfile: docker/Dockerfile.amd64
dry_run: true
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/pull/**
depends_on:
- build
- name: publish-dockerhub
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: amd64
dockerfile: docker/Dockerfile.amd64
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
- name: publish-quay
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: amd64
dockerfile: docker/Dockerfile.amd64
password:
from_secret: quay_password
registry: quay.io
repo: quay.io/thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: quay_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- security
---
kind: pipeline
name: build-container-arm64
platform:
os: linux
arch: arm64
steps:
- name: build
image: python:3.10
commands:
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry build
- name: dryrun
image: thegeeklab/drone-docker:19
settings:
dockerfile: docker/Dockerfile.arm64
dry_run: true
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/pull/**
depends_on:
- build
- name: publish-dockerhub
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: arm64
dockerfile: docker/Dockerfile.arm64
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
- name: publish-quay
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: arm64
dockerfile: docker/Dockerfile.arm64
password:
from_secret: quay_password
registry: quay.io
repo: quay.io/thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: quay_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- security
---
kind: pipeline
name: build-container-arm
platform:
os: linux
arch: arm
steps:
- name: build
image: python:3.10-alpine
commands:
- apk add -Uq --no-cache build-base openssl-dev libffi-dev musl-dev python3-dev git cargo
- git fetch -tq
- pip install poetry poetry-dynamic-versioning -qq
- poetry build
environment:
CARGO_NET_GIT_FETCH_WITH_CLI: true
- name: dryrun
image: thegeeklab/drone-docker:19
settings:
dockerfile: docker/Dockerfile.arm
dry_run: true
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/pull/**
depends_on:
- build
- name: publish-dockerhub
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: arm
dockerfile: docker/Dockerfile.arm
password:
from_secret: docker_password
repo: thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: docker_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
- name: publish-quay
image: thegeeklab/drone-docker:19
settings:
auto_tag: true
auto_tag_suffix: arm
dockerfile: docker/Dockerfile.arm
password:
from_secret: quay_password
registry: quay.io
repo: quay.io/thegeeklab/${DRONE_REPO_NAME}
username:
from_secret: quay_username
when:
ref:
- refs/heads/main
- refs/tags/**
depends_on:
- dryrun
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- security
---
kind: pipeline
name: docs
platform:
os: linux
arch: amd64
concurrency:
limit: 1
steps:
- name: assets
image: thegeeklab/alpine-tools
commands:
- make doc
- name: markdownlint
image: thegeeklab/markdownlint-cli
commands:
- markdownlint 'docs/content/**/*.md' 'README.md' 'CONTRIBUTING.md'
- name: spellcheck
image: thegeeklab/alpine-tools
commands:
- spellchecker --files 'docs/content/**/*.md' 'README.md' 'CONTRIBUTING.md' -d .dictionary -p spell indefinite-article syntax-urls --no-suggestions
environment:
FORCE_COLOR: true
NPM_CONFIG_LOGLEVEL: error
- name: testbuild
image: thegeeklab/hugo:0.97.3
commands:
- hugo --panicOnWarning -s docs/ -b http://localhost:8000/
- name: link-validation
image: thegeeklab/link-validator
commands:
- link-validator --nice --external --skip-file .linkcheckignore
environment:
LINK_VALIDATOR_BASE_DIR: docs/public
- name: build
image: thegeeklab/hugo:0.97.3
commands:
- hugo --panicOnWarning -s docs/
- name: beautify
image: thegeeklab/alpine-tools
commands:
- html-beautify -r -f 'docs/public/**/*.html'
environment:
FORCE_COLOR: true
NPM_CONFIG_LOGLEVEL: error
- name: publish
image: thegeeklab/drone-s3-sync
settings:
access_key:
from_secret: s3_access_key
bucket: geekdocs
delete: true
endpoint: https://sp.rknet.org
path_style: true
secret_key:
from_secret: s3_secret_access_key
source: docs/public/
strip_prefix: docs/public/
target: /${DRONE_REPO_NAME}
when:
ref:
- refs/heads/main
- refs/tags/**
trigger:
ref:
- refs/heads/main
- refs/tags/**
- refs/pull/**
depends_on:
- build-package
- build-container-amd64
- build-container-arm64
- build-container-arm
---
kind: pipeline
name: notifications
platform:
os: linux
arch: amd64
steps:
- name: manifest-dockerhub
image: plugins/manifest
settings:
auto_tag: true
ignore_missing: true
password:
from_secret: docker_password
spec: docker/manifest.tmpl
username:
from_secret: docker_username
when:
status:
- success
- name: manifest-quay
image: plugins/manifest
settings:
auto_tag: true
ignore_missing: true
password:
from_secret: quay_password
spec: docker/manifest-quay.tmpl
username:
from_secret: quay_username
when:
status:
- success
- name: pushrm-dockerhub
pull: always
image: chko/docker-pushrm:1
environment:
DOCKER_PASS:
from_secret: docker_password
DOCKER_USER:
from_secret: docker_username
PUSHRM_FILE: README.md
PUSHRM_SHORT: Keep docker hosts tidy
PUSHRM_TARGET: thegeeklab/${DRONE_REPO_NAME}
when:
status:
- success
- name: pushrm-quay
pull: always
image: chko/docker-pushrm:1
environment:
APIKEY__QUAY_IO:
from_secret: quay_token
PUSHRM_FILE: README.md
PUSHRM_TARGET: quay.io/thegeeklab/${DRONE_REPO_NAME}
when:
status:
- success
- name: matrix
image: thegeeklab/drone-matrix
settings:
homeserver:
from_secret: matrix_homeserver
password:
from_secret: matrix_password
roomid:
from_secret: matrix_roomid
template: "Status: **{{ build.Status }}**<br/> Build: [{{ repo.Owner }}/{{ repo.Name }}]({{ build.Link }}){{#if build.Branch}} ({{ build.Branch }}){{/if}} by {{ commit.Author }}<br/> Message: {{ commit.Message.Title }}"
username:
from_secret: matrix_username
when:
status:
- success
- failure
trigger:
ref:
- refs/heads/main
- refs/tags/**
status:
- success
- failure
depends_on:
- docs
---
kind: signature
hmac: fdc815dd75d3fa8ef72dac9840ba54ae3f1f071c7cf1b004bed565648d3a85ff
...

View File

@ -52,7 +52,11 @@ branches:
required_status_checks: required_status_checks:
strict: false strict: false
contexts: contexts:
- continuous-integration/drone/pr - ci/woodpecker/pr/lint
enforce_admins: true - ci/woodpecker/pr/test
- ci/woodpecker/pr/build-package
- ci/woodpecker/pr/build-container
- ci/woodpecker/pr/docs
enforce_admins: false
required_linear_history: true required_linear_history: true
restrictions: null restrictions: null

1
.gitignore vendored
View File

@ -111,3 +111,4 @@ resources/_gen/
# Misc # Misc
.dockertidy* .dockertidy*
CHANGELOG.md CHANGELOG.md
.ruff_cache

47
.gitsv/config.yml Normal file
View File

@ -0,0 +1,47 @@
---
version: "1.1"
versioning:
update-major: []
update-minor: [feat]
update-patch: [fix, perf, refactor, chore, test, ci, docs]
tag:
pattern: "v%d.%d.%d"
release-notes:
sections:
- name: Features
commit-types: [feat]
section-type: commits
- name: Bug Fixes
commit-types: [fix]
section-type: commits
- name: Performance Improvements
commit-types: [perf]
section-type: commits
- name: Code Refactoring
commit-types: [refactor]
section-type: commits
- name: Others
commit-types: [chore]
section-type: commits
- name: Testing
commit-types: [test]
section-type: commits
- name: CI Pipeline
commit-types: [ci]
section-type: commits
- name: Documentation
commit-types: [docs]
section-type: commits
- name: Breaking Changes
section-type: breaking-changes
commit-message:
footer:
issue:
key: issue
add-value-prefix: "#"
issue:
regex: "#?[0-9]+"

View File

1
.lycheeignore Normal file
View File

@ -0,0 +1 @@
https://hub.docker.com/r/thegeeklab/*

View File

@ -0,0 +1,73 @@
---
when:
- event: [pull_request, tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
steps:
- name: build
image: docker.io/library/python:3.12
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry build
- name: dryrun
image: quay.io/thegeeklab/wp-docker-buildx:4
settings:
containerfile: Containerfile.multiarch
dry_run: true
platforms:
- linux/amd64
- linux/arm64
provenance: false
repo: ${CI_REPO}
when:
- event: [pull_request]
- name: publish-dockerhub
image: quay.io/thegeeklab/wp-docker-buildx:4
group: container
settings:
auto_tag: true
containerfile: Containerfile.multiarch
password:
from_secret: docker_password
platforms:
- linux/amd64
- linux/arm64
provenance: false
repo: ${CI_REPO}
username:
from_secret: docker_username
when:
- event: [tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
- name: publish-quay
image: quay.io/thegeeklab/wp-docker-buildx:4
group: container
settings:
auto_tag: true
containerfile: Containerfile.multiarch
password:
from_secret: quay_password
platforms:
- linux/amd64
- linux/arm64
provenance: false
registry: quay.io
repo: quay.io/${CI_REPO}
username:
from_secret: quay_username
when:
- event: [tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
depends_on:
- lint
- test

View File

@ -0,0 +1,56 @@
---
when:
- event: [pull_request, tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
steps:
- name: build
image: docker.io/library/python:3.12
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry build
- name: checksum
image: quay.io/thegeeklab/alpine-tools
commands:
- cd dist/ && sha256sum * > ../sha256sum.txt
- name: changelog
image: quay.io/thegeeklab/git-sv
commands:
- git sv current-version
- git sv release-notes -t ${CI_COMMIT_TAG:-next} -o CHANGELOG.md
- cat CHANGELOG.md
- name: publish-github
image: docker.io/plugins/github-release
settings:
api_key:
from_secret: github_token
files:
- dist/*
- sha256sum.txt
note: CHANGELOG.md
overwrite: true
title: ${CI_COMMIT_TAG}
when:
- event: [tag]
- name: publish-pypi
image: docker.io/library/python:3.12
secrets:
- source: pypi_password
target: POETRY_HTTP_BASIC_PYPI_PASSWORD
- source: pypi_username
target: POETRY_HTTP_BASIC_PYPI_USERNAME
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry publish -n
when:
- event: [tag]
depends_on:
- lint
- test

100
.woodpecker/docs.yml Normal file
View File

@ -0,0 +1,100 @@
---
when:
- event: [pull_request, tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
steps:
- name: assets
image: quay.io/thegeeklab/alpine-tools
commands:
- make doc
- name: markdownlint
image: quay.io/thegeeklab/markdownlint-cli
group: test
commands:
- markdownlint 'README.md' 'CONTRIBUTING.md'
- name: spellcheck
image: quay.io/thegeeklab/alpine-tools
group: test
commands:
- spellchecker --files 'docs/**/*.md' 'README.md' 'CONTRIBUTING.md' -d .dictionary -p spell indefinite-article syntax-urls
environment:
FORCE_COLOR: "true"
- name: link-validation
image: docker.io/lycheeverse/lychee
group: test
commands:
- lychee --no-progress --format detailed docs/content README.md
- name: build
image: quay.io/thegeeklab/hugo:0.125.7
commands:
- hugo --panicOnWarning -s docs/
- name: beautify
image: quay.io/thegeeklab/alpine-tools
commands:
- html-beautify -r -f 'docs/public/**/*.html'
environment:
FORCE_COLOR: "true"
- name: publish
image: quay.io/thegeeklab/wp-s3-action
settings:
access_key:
from_secret: s3_access_key
bucket: geekdocs
delete: true
endpoint:
from_secret: s3_endpoint
path_style: true
secret_key:
from_secret: s3_secret_access_key
source: docs/public/
strip_prefix: docs/public/
target: /${CI_REPO_NAME}
when:
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
status: [success, failure]
- name: pushrm-dockerhub
image: docker.io/chko/docker-pushrm:1
secrets:
- source: docker_password
target: DOCKER_PASS
- source: docker_username
target: DOCKER_USER
environment:
PUSHRM_FILE: README.md
PUSHRM_SHORT: Keep docker hosts tidy
PUSHRM_TARGET: ${CI_REPO}
when:
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
status: [success]
- name: pushrm-quay
image: docker.io/chko/docker-pushrm:1
secrets:
- source: quay_token
target: APIKEY__QUAY_IO
environment:
PUSHRM_FILE: README.md
PUSHRM_TARGET: quay.io/${CI_REPO}
when:
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
status: [success]
depends_on:
- build-package
- build-container

25
.woodpecker/lint.yml Normal file
View File

@ -0,0 +1,25 @@
---
when:
- event: [pull_request, tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
steps:
- name: check-format
image: docker.io/library/python:3.12
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry install
- poetry run ruff format --check --diff ./${CI_REPO_NAME//-/}
environment:
PY_COLORS: "1"
- name: check-coding
image: docker.io/library/python:3.12
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry install
- poetry run ruff check ./${CI_REPO_NAME//-/}
environment:
PY_COLORS: "1"

26
.woodpecker/notify.yml Normal file
View File

@ -0,0 +1,26 @@
---
when:
- event: [tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
runs_on: [success, failure]
steps:
- name: matrix
image: quay.io/thegeeklab/wp-matrix
settings:
homeserver:
from_secret: matrix_homeserver
password:
from_secret: matrix_password
roomid:
from_secret: matrix_roomid
username:
from_secret: matrix_username
when:
- status: [success, failure]
depends_on:
- docs

39
.woodpecker/test.yml Normal file
View File

@ -0,0 +1,39 @@
---
when:
- event: [pull_request, tag]
- event: [push, manual]
branch:
- ${CI_REPO_DEFAULT_BRANCH}
variables:
- &pytest_base
group: pytest
commands:
- pip install poetry poetry-dynamic-versioning -qq
- poetry install
- poetry run pytest --cov-append
- poetry version
- poetry run ${CI_REPO_NAME} --help
environment:
PY_COLORS: "1"
steps:
- name: python-312
image: docker.io/library/python:3.12
<<: *pytest_base
- name: python-311
image: docker.io/library/python:3.11
<<: *pytest_base
- name: python-310
image: docker.io/library/python:3.10
<<: *pytest_base
- name: python-39
image: docker.io/library/python:3.9
<<: *pytest_base
- name: python-38
image: docker.io/library/python:3.8
<<: *pytest_base

View File

@ -3,7 +3,7 @@
## Security ## Security
If you think you have found a **security issue**, please do not mention it in this repository. If you think you have found a **security issue**, please do not mention it in this repository.
Instead, send an email to security@thegeeklab.de with as many details as possible so it can be handled confidential. Instead, send an email to `security@thegeeklab.de` with as many details as possible so it can be handled confidential.
## Bug Reports and Feature Requests ## Bug Reports and Feature Requests

View File

@ -1,4 +1,4 @@
FROM python:3.11-alpine@sha256:2a068b9442f61f4480306d44e3b166bfe3343761e9bd57c38f66302ebf28fd9e FROM python:3.12-alpine@sha256:5365725a6cd59b72a927628fdda9965103e3dc671676c89ef3ed8b8b0e22e812
LABEL maintainer="Robert Kaussow <mail@thegeeklab.de>" LABEL maintainer="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.authors="Robert Kaussow <mail@thegeeklab.de>" LABEL org.opencontainers.image.authors="Robert Kaussow <mail@thegeeklab.de>"

View File

@ -1,5 +1,5 @@
# renovate: datasource=github-releases depName=thegeeklab/hugo-geekdoc # renovate: datasource=github-releases depName=thegeeklab/hugo-geekdoc
THEME_VERSION := v0.35.8 THEME_VERSION := v0.45.0
THEME := hugo-geekdoc THEME := hugo-geekdoc
BASEDIR := docs BASEDIR := docs
THEMEDIR := $(BASEDIR)/themes THEMEDIR := $(BASEDIR)/themes

View File

@ -2,12 +2,11 @@
Keep docker hosts tidy Keep docker hosts tidy
[![Build Status](https://img.shields.io/drone/build/thegeeklab/docker-tidy?logo=drone&server=https%3A%2F%2Fdrone.thegeeklab.de)](https://drone.thegeeklab.de/thegeeklab/docker-tidy) [![Build Status](https://ci.thegeeklab.de/api/badges/thegeeklab/docker-tidy/status.svg)](https://ci.thegeeklab.de/repos/thegeeklab/docker-tidy)
[![Docker Hub](https://img.shields.io/badge/docker-latest-blue.svg?logo=docker&logoColor=white)](https://hub.docker.com/r/thegeeklab/docker-tidy) [![Docker Hub](https://img.shields.io/badge/docker-latest-blue.svg?logo=docker&logoColor=white)](https://hub.docker.com/r/thegeeklab/docker-tidy)
[![Python Version](https://img.shields.io/pypi/pyversions/docker-tidy.svg)](https://pypi.org/project/docker-tidy/) [![Python Version](https://img.shields.io/pypi/pyversions/docker-tidy.svg)](https://pypi.org/project/docker-tidy/)
[![PyPI Status](https://img.shields.io/pypi/status/docker-tidy.svg)](https://pypi.org/project/docker-tidy/) [![PyPI Status](https://img.shields.io/pypi/status/docker-tidy.svg)](https://pypi.org/project/docker-tidy/)
[![PyPI Release](https://img.shields.io/pypi/v/docker-tidy.svg)](https://pypi.org/project/docker-tidy/) [![PyPI Release](https://img.shields.io/pypi/v/docker-tidy.svg)](https://pypi.org/project/docker-tidy/)
[![Codecov](https://img.shields.io/codecov/c/github/thegeeklab/docker-tidy)](https://codecov.io/gh/thegeeklab/docker-tidy)
[![GitHub contributors](https://img.shields.io/github/contributors/thegeeklab/docker-tidy)](https://github.com/thegeeklab/docker-tidy/graphs/contributors) [![GitHub contributors](https://img.shields.io/github/contributors/thegeeklab/docker-tidy)](https://github.com/thegeeklab/docker-tidy/graphs/contributors)
[![Source: GitHub](https://img.shields.io/badge/source-github-blue.svg?logo=github&logoColor=white)](https://github.com/thegeeklab/docker-tidy) [![Source: GitHub](https://img.shields.io/badge/source-github-blue.svg?logo=github&logoColor=white)](https://github.com/thegeeklab/docker-tidy)
[![License: Apache-2.0](https://img.shields.io/github/license/thegeeklab/docker-tidy)](https://github.com/thegeeklab/docker-tidy/blob/main/LICENSE) [![License: Apache-2.0](https://img.shields.io/github/license/thegeeklab/docker-tidy)](https://github.com/thegeeklab/docker-tidy/blob/main/LICENSE)

View File

@ -1,26 +0,0 @@
FROM arm32v7/python:3.11-alpine@sha256:ed2285150d39677d00da2a48c357b0e61153f35974819b267765519c70405e35
LABEL maintainer="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.authors="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.title="docker-tidy"
LABEL org.opencontainers.image.url="https://docker-tidy.geekdocs.de/"
LABEL org.opencontainers.image.source="https://github.com/thegeeklab/docker-tidy"
LABEL org.opencontainers.image.documentation="https://docker-tidy.geekdocs.de/"
ENV PY_COLORS=1
ENV TZ=UTC
ADD dist/docker_tidy-*.whl /
RUN apk --update add --virtual .build-deps build-base libffi-dev openssl-dev && \
pip install --upgrade --no-cache-dir pip && \
pip install --no-cache-dir $(find / -name "docker_tidy-*.whl") && \
apk del .build-deps && \
rm -f docker_tidy-*.whl && \
rm -rf /var/cache/apk/* && \
rm -rf /root/.cache/ && \
rm -rf /tmp/*
USER root
CMD []
ENTRYPOINT ["/usr/local/bin/docker-tidy", "gc"]

View File

@ -1,26 +0,0 @@
FROM arm64v8/python:3.11-alpine@sha256:8b76406c45a3c49a6ce2d190c771aeb3695648bd07d2147e3ae8d00e2516aa2b
LABEL maintainer="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.authors="Robert Kaussow <mail@thegeeklab.de>"
LABEL org.opencontainers.image.title="docker-tidy"
LABEL org.opencontainers.image.url="https://docker-tidy.geekdocs.de/"
LABEL org.opencontainers.image.source="https://github.com/thegeeklab/docker-tidy"
LABEL org.opencontainers.image.documentation="https://docker-tidy.geekdocs.de/"
ENV PY_COLORS=1
ENV TZ=UTC
ADD dist/docker_tidy-*.whl /
RUN apk --update add --virtual .build-deps build-base libffi-dev openssl-dev && \
pip install --upgrade --no-cache-dir pip && \
pip install --no-cache-dir $(find / -name "docker_tidy-*.whl") && \
apk del .build-deps && \
rm -f docker_tidy-*.whl && \
rm -rf /var/cache/apk/* && \
rm -rf /root/.cache/ && \
rm -rf /tmp/*
USER root
CMD []
ENTRYPOINT ["/usr/local/bin/docker-tidy", "gc"]

View File

@ -1,24 +0,0 @@
image: quay.io/thegeeklab/docker-tidy:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}}
{{#if build.tags}}
tags:
{{#each build.tags}}
- {{this}}
{{/each}}
{{/if}}
manifests:
- image: quay.io/thegeeklab/docker-tidy:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}amd64
platform:
architecture: amd64
os: linux
- image: quay.io/thegeeklab/docker-tidy:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm64
platform:
architecture: arm64
os: linux
variant: v8
- image: quay.io/thegeeklab/docker-tidy:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm
platform:
architecture: arm
os: linux
variant: v7

View File

@ -1,24 +0,0 @@
image: thegeeklab/docker-tidy:{{#if build.tag}}{{trimPrefix "v" build.tag}}{{else}}latest{{/if}}
{{#if build.tags}}
tags:
{{#each build.tags}}
- {{this}}
{{/each}}
{{/if}}
manifests:
- image: thegeeklab/docker-tidy:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}amd64
platform:
architecture: amd64
os: linux
- image: thegeeklab/docker-tidy:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm64
platform:
architecture: arm64
os: linux
variant: v8
- image: thegeeklab/docker-tidy:{{#if build.tag}}{{trimPrefix "v" build.tag}}-{{/if}}arm
platform:
architecture: arm
os: linux
variant: v7

View File

@ -2,10 +2,10 @@
"""Stop long running docker iamges.""" """Stop long running docker iamges."""
import dateutil.parser import dateutil.parser
import docker
import docker.errors import docker.errors
import requests.exceptions import requests.exceptions
import docker
from dockertidy.config import SingleConfig from dockertidy.config import SingleConfig
from dockertidy.logger import SingleLog from dockertidy.logger import SingleLog
from dockertidy.parser import timedelta from dockertidy.parser import timedelta
@ -45,9 +45,7 @@ class AutoStop:
) or (not prefix and self._has_been_running_since(container, max_run_time)): ) or (not prefix and self._has_been_running_since(container, max_run_time)):
self.logger.info( self.logger.info(
"Stopping container {id} {name}: running since {started}".format( "Stopping container {id} {name}: running since {started}".format(
id=container["Id"][:16], id=container["Id"][:16], name=name, started=container["State"]["StartedAt"]
name=name,
started=container["State"]["StartedAt"]
) )
) )
@ -58,12 +56,11 @@ class AutoStop:
try: try:
client.stop(cid) client.stop(cid)
except requests.exceptions.Timeout as e: except requests.exceptions.Timeout as e:
self.logger.warning("Failed to stop container {id}: {msg}".format(id=cid, msg=str(e))) self.logger.warning(f"Failed to stop container {cid}: {e!s}")
except docker.errors.APIError as e: except docker.errors.APIError as e:
self.logger.warning("Error stopping {id}: {msg}".format(id=cid, msg=str(e))) self.logger.warning(f"Error stopping {cid}: {e!s}")
def _build_container_matcher(self, prefixes): def _build_container_matcher(self, prefixes):
def matcher(name): def matcher(name):
return any(name.startswith(prefix) for prefix in prefixes) return any(name.startswith(prefix) for prefix in prefixes)

View File

@ -36,7 +36,7 @@ class DockerTidy:
action="store_true", action="store_true",
default=None, default=None,
dest="dry_run", dest="dry_run",
help="only log actions, don't stop anything" help="only log actions, don't stop anything",
) )
parser.add_argument( parser.add_argument(
"-t", "-t",
@ -44,7 +44,7 @@ class DockerTidy:
type=int, type=int,
dest="http_timeout", dest="http_timeout",
metavar="HTTP_TIMEOUT", metavar="HTTP_TIMEOUT",
help="HTTP timeout in seconds for making docker API calls" help="HTTP timeout in seconds for making docker API calls",
) )
parser.add_argument( parser.add_argument(
"-v", dest="logging.level", action="append_const", const=-1, help="increase log level" "-v", dest="logging.level", action="append_const", const=-1, help="increase log level"
@ -52,9 +52,7 @@ class DockerTidy:
parser.add_argument( parser.add_argument(
"-q", dest="logging.level", action="append_const", const=1, help="decrease log level" "-q", dest="logging.level", action="append_const", const=1, help="decrease log level"
) )
parser.add_argument( parser.add_argument("--version", action="version", version=f"%(prog)s {__version__}")
"--version", action="version", version="%(prog)s {}".format(__version__)
)
subparsers = parser.add_subparsers(dest="command", help="sub-command help") subparsers = parser.add_subparsers(dest="command", help="sub-command help")
subparsers.required = True subparsers.required = True
@ -66,7 +64,7 @@ class DockerTidy:
dest="gc.max_container_age", dest="gc.max_container_age",
metavar="MAX_CONTAINER_AGE", metavar="MAX_CONTAINER_AGE",
help="maximum age for a container, containers older than this age " help="maximum age for a container, containers older than this age "
"will be removed (dateparser value)" "will be removed (dateparser value)",
) )
parser_gc.add_argument( parser_gc.add_argument(
"--max-image-age", "--max-image-age",
@ -74,13 +72,13 @@ class DockerTidy:
dest="gc.max_image_age", dest="gc.max_image_age",
metavar="MAX_IMAGE_AGE", metavar="MAX_IMAGE_AGE",
help="maxium age for an image, images older than this age will be " help="maxium age for an image, images older than this age will be "
"removed (dateparser value)" "removed (dateparser value)",
) )
parser_gc.add_argument( parser_gc.add_argument(
"--dangling-volumes", "--dangling-volumes",
action="store_true", action="store_true",
dest="gc.dangling_volumes", dest="gc.dangling_volumes",
help="dangling volumes will be removed" help="dangling volumes will be removed",
) )
parser_gc.add_argument( parser_gc.add_argument(
"--exclude-image", "--exclude-image",
@ -88,7 +86,7 @@ class DockerTidy:
type=str, type=str,
dest="gc.exclude_images", dest="gc.exclude_images",
metavar="EXCLUDE_IMAGE", metavar="EXCLUDE_IMAGE",
help="never remove images with this tag" help="never remove images with this tag",
) )
parser_gc.add_argument( parser_gc.add_argument(
"--exclude-container-label", "--exclude-container-label",
@ -96,8 +94,7 @@ class DockerTidy:
type=str, type=str,
dest="gc.exclude_container_labels", dest="gc.exclude_container_labels",
metavar="EXCLUDE_CONTAINER_LABEL", metavar="EXCLUDE_CONTAINER_LABEL",
help="never remove containers with this label key " help="never remove containers with this label key or label key=value",
"or label key=value"
) )
parser_stop = subparsers.add_parser( parser_stop = subparsers.add_parser(
@ -108,7 +105,7 @@ class DockerTidy:
type=timedelta_validator, type=timedelta_validator,
dest="stop.max_run_time", dest="stop.max_run_time",
metavar="MAX_RUN_TIME", metavar="MAX_RUN_TIME",
help="maximum time a container is allows to run (dateparser value)" help="maximum time a container is allows to run (dateparser value)",
) )
parser_stop.add_argument( parser_stop.add_argument(
"--prefix", "--prefix",
@ -116,7 +113,7 @@ class DockerTidy:
type=str, type=str,
dest="stop.prefix", dest="stop.prefix",
metavar="PREFIX", metavar="PREFIX",
help="only stop containers which match one of the prefix" help="only stop containers which match one of the prefix",
) )
return parser.parse_args().__dict__ return parser.parse_args().__dict__
@ -130,10 +127,10 @@ class DockerTidy:
try: try:
self.log.set_level(config.config["logging"]["level"]) self.log.set_level(config.config["logging"]["level"])
except ValueError as e: except ValueError as e:
self.log.sysexit_with_message("Can not set log level.\n{}".format(str(e))) self.log.sysexit_with_message(f"Can not set log level.\n{e!s}")
self.logger.info("Using config file {}".format(config.config_file)) self.logger.info(f"Using config file {config.config_file}")
self.logger.debug("Config dump: {}".format(config.config)) self.logger.debug(f"Config dump: {config.config}")
return config return config

View File

@ -13,15 +13,15 @@ from jsonschema._utils import format_as_index
import dockertidy.exception import dockertidy.exception
import dockertidy.parser import dockertidy.parser
from dockertidy.parser import env from dockertidy.parser import env
from dockertidy.utils import Singleton from dockertidy.utils import Singleton, dict_intersect
from dockertidy.utils import dict_intersect
config_dir = AppDirs("docker-tidy").user_config_dir config_dir = AppDirs("docker-tidy").user_config_dir
default_config_file = os.path.join(config_dir, "config.yml") default_config_file = os.path.join(config_dir, "config.yml")
class Config(): class Config:
"""Create an object with all necessary settings. """
Create an object with all necessary settings.
Settings are loade from multiple locations in defined order (last wins): Settings are loade from multiple locations in defined order (last wins):
- default settings defined by `self._get_defaults()` - default settings defined by `self._get_defaults()`
@ -36,77 +36,77 @@ class Config():
"config_file": { "config_file": {
"default": "", "default": "",
"env": "CONFIG_FILE", "env": "CONFIG_FILE",
"type": environs.Env().str "type": environs.Env().str,
}, },
"dry_run": { "dry_run": {
"default": False, "default": False,
"env": "DRY_RUN", "env": "DRY_RUN",
"file": True, "file": True,
"type": environs.Env().bool "type": environs.Env().bool,
}, },
"http_timeout": { "http_timeout": {
"default": 60, "default": 60,
"env": "HTTP_TIMEOUT", "env": "HTTP_TIMEOUT",
"file": True, "file": True,
"type": environs.Env().int "type": environs.Env().int,
}, },
"logging.level": { "logging.level": {
"default": "WARNING", "default": "WARNING",
"env": "LOG_LEVEL", "env": "LOG_LEVEL",
"file": True, "file": True,
"type": environs.Env().str "type": environs.Env().str,
}, },
"logging.json": { "logging.json": {
"default": False, "default": False,
"env": "LOG_JSON", "env": "LOG_JSON",
"file": True, "file": True,
"type": environs.Env().bool "type": environs.Env().bool,
}, },
"gc.max_container_age": { "gc.max_container_age": {
"default": "", "default": "",
"env": "GC_MAX_CONTAINER_AGE", "env": "GC_MAX_CONTAINER_AGE",
"file": True, "file": True,
"type": env.timedelta_validator "type": env.timedelta_validator,
}, },
"gc.max_image_age": { "gc.max_image_age": {
"default": "", "default": "",
"env": "GC_MAX_IMAGE_AGE", "env": "GC_MAX_IMAGE_AGE",
"file": True, "file": True,
"type": env.timedelta_validator "type": env.timedelta_validator,
}, },
"gc.dangling_volumes": { "gc.dangling_volumes": {
"default": False, "default": False,
"env": "GC_DANGLING_VOLUMES", "env": "GC_DANGLING_VOLUMES",
"file": True, "file": True,
"type": environs.Env().bool "type": environs.Env().bool,
}, },
"gc.exclude_images": { "gc.exclude_images": {
"default": [], "default": [],
"env": "GC_EXCLUDE_IMAGES", "env": "GC_EXCLUDE_IMAGES",
"file": True, "file": True,
"type": environs.Env().list "type": environs.Env().list,
}, },
"gc.exclude_container_labels": { "gc.exclude_container_labels": {
"default": [], "default": [],
"env": "GC_EXCLUDE_CONTAINER_LABELS", "env": "GC_EXCLUDE_CONTAINER_LABELS",
"file": True, "file": True,
"type": environs.Env().list "type": environs.Env().list,
}, },
"stop.max_run_time": { "stop.max_run_time": {
"default": "", "default": "",
"env": "STOP_MAX_RUN_TIME", "env": "STOP_MAX_RUN_TIME",
"file": True, "file": True,
"type": env.timedelta_validator "type": env.timedelta_validator,
}, },
"stop.prefix": { "stop.prefix": {
"default": [], "default": [],
"env": "STOP_PREFIX", "env": "STOP_PREFIX",
"file": True, "file": True,
"type": environs.Env().list "type": environs.Env().list,
}, },
} }
def __init__(self, args={}): def __init__(self, args=None):
""" """
Initialize a new settings class. Initialize a new settings class.
@ -115,7 +115,10 @@ class Config():
:returns: None :returns: None
""" """
self._args = args if args is None:
self._args = {}
else:
self._args = args
self._schema = None self._schema = None
self.config_file = default_config_file self.config_file = default_config_file
self.config = None self.config = None
@ -159,12 +162,12 @@ class Config():
value = item["type"](envname) value = item["type"](envname)
normalized = self._add_dict_branch(normalized, key.split("."), value) normalized = self._add_dict_branch(normalized, key.split("."), value)
except environs.EnvError as e: except environs.EnvError as e:
if '"{}" not set'.format(envname) in str(e): if f'"{envname}" not set' in str(e):
pass pass
else: else:
raise dockertidy.exception.ConfigError( raise dockertidy.exception.ConfigError(
"Unable to read environment variable", str(e) "Unable to read environment variable", str(e)
) ) from e
return normalized return normalized
@ -188,15 +191,15 @@ class Config():
source_files.append(os.path.join(os.getcwd(), ".dockertidy.yaml")) source_files.append(os.path.join(os.getcwd(), ".dockertidy.yaml"))
for config in [i for i in source_files if os.path.exists(i)]: for config in [i for i in source_files if os.path.exists(i)]:
with open(config, "r", encoding="utf8") as stream: with open(config, encoding="utf8") as stream:
s = stream.read() s = stream.read()
try: try:
normalized = ruamel.yaml.safe_load(s) normalized = ruamel.yaml.YAML(typ="safe", pure=True).load(s)
except (ruamel.yaml.composer.ComposerError, ruamel.yaml.scanner.ScannerError) as e: except (ruamel.yaml.composer.ComposerError, ruamel.yaml.scanner.ScannerError) as e:
message = "{} {}".format(e.context, e.problem) message = f"{e.context} {e.problem}"
raise dockertidy.exception.ConfigError( raise dockertidy.exception.ConfigError(
"Unable to read config file {}".format(config), message f"Unable to read config file {config}", message
) ) from e
if self._validate(normalized): if self._validate(normalized):
anyconfig.merge(files_raw, normalized, ac_merge=anyconfig.MS_DICTS) anyconfig.merge(files_raw, normalized, ac_merge=anyconfig.MS_DICTS)
@ -224,27 +227,26 @@ class Config():
if not os.path.isabs(path): if not os.path.isabs(path):
base = os.path.join(os.getcwd(), path) base = os.path.join(os.getcwd(), path)
return os.path.abspath(os.path.expanduser(os.path.expandvars(base))) return os.path.abspath(os.path.expanduser(os.path.expandvars(base)))
else:
return path return path
def _validate(self, config): def _validate(self, config):
try: try:
anyconfig.validate(config, self.schema, ac_schema_safe=False) anyconfig.validate(config, self.schema, ac_schema_safe=False)
except jsonschema.exceptions.ValidationError as e: except jsonschema.exceptions.ValidationError as e:
schema_error = "Failed validating '{validator}' in schema{schema}\n{message}".format( schema = format_as_index(list(e.relative_schema_path)[:-1])
validator=e.validator, schema_error = f"Failed validating '{e.validator}' in schema {schema}\n{e.message}"
schema=format_as_index(list(e.relative_schema_path)[:-1]), raise dockertidy.exception.ConfigError("Configuration error", schema_error) from e
message=e.message
)
raise dockertidy.exception.ConfigError("Configuration error", schema_error)
return True return True
def _add_dict_branch(self, tree, vector, value): def _add_dict_branch(self, tree, vector, value):
key = vector[0] key = vector[0]
tree[key] = value \ tree[key] = (
if len(vector) == 1 \ value
else self._add_dict_branch(tree[key] if key in tree else {}, vector[1:], value) if len(vector) == 1
else self._add_dict_branch(tree.get(key, {}), vector[1:], value)
)
return tree return tree

View File

@ -6,7 +6,7 @@ class TidyError(Exception):
"""Generic exception class for docker-tidy.""" """Generic exception class for docker-tidy."""
def __init__(self, msg, original_exception=""): def __init__(self, msg, original_exception=""):
super(TidyError, self).__init__("{msg}\n{org}".format(msg=msg, org=original_exception)) super().__init__(f"{msg}\n{original_exception}")
self.original_exception = original_exception self.original_exception = original_exception

View File

@ -5,10 +5,10 @@ import fnmatch
from collections import namedtuple from collections import namedtuple
import dateutil.parser import dateutil.parser
import docker
import docker.errors import docker.errors
import requests.exceptions import requests.exceptions
import docker
from dockertidy.config import SingleConfig from dockertidy.config import SingleConfig
from dockertidy.logger import SingleLog from dockertidy.logger import SingleLog
from dockertidy.parser import timedelta from dockertidy.parser import timedelta
@ -55,7 +55,8 @@ class GarbageCollector:
self.logger.info( self.logger.info(
"Removing container {} {} {}".format( "Removing container {} {} {}".format(
container["Id"][:16], container["Id"][:16],
container.get("Name", "").lstrip("/"), container["State"]["FinishedAt"] container.get("Name", "").lstrip("/"),
container["State"]["FinishedAt"],
) )
) )
@ -163,7 +164,6 @@ class GarbageCollector:
self._remove_image(image_summary, timedelta(config["gc"]["max_image_age"])) self._remove_image(image_summary, timedelta(config["gc"]["max_image_age"]))
def _filter_excluded_images(self, images, exclude_set): def _filter_excluded_images(self, images, exclude_set):
def include_image(image_summary): def include_image(image_summary):
image_tags = image_summary.get("RepoTags") image_tags = image_summary.get("RepoTags")
if self._no_image_tags(image_tags): if self._no_image_tags(image_tags):
@ -176,12 +176,11 @@ class GarbageCollector:
return filter(include_image, images) return filter(include_image, images)
def _filter_images_in_use(self, images, image_tags_in_use): def _filter_images_in_use(self, images, image_tags_in_use):
def get_tag_set(image_summary): def get_tag_set(image_summary):
image_tags = image_summary.get("RepoTags") image_tags = image_summary.get("RepoTags")
if self._no_image_tags(image_tags): if self._no_image_tags(image_tags):
# The repr of the image Id used by client.containers() # The repr of the image Id used by client.containers()
return set(["{id}:latest".format(id=image_summary["Id"][:12])]) return {"{id}:latest".format(id=image_summary["Id"][:12])}
return set(image_tags) return set(image_tags)
def image_not_in_use(image_summary): def image_not_in_use(image_summary):
@ -190,7 +189,6 @@ class GarbageCollector:
return filter(image_not_in_use, images) return filter(image_not_in_use, images)
def _filter_images_in_use_by_id(self, images, image_ids_in_use): def _filter_images_in_use_by_id(self, images, image_ids_in_use):
def image_not_in_use(image_summary): def image_not_in_use(image_summary):
return image_summary["Id"] not in image_ids_in_use return image_summary["Id"] not in image_ids_in_use
@ -210,9 +208,7 @@ class GarbageCollector:
if not image or not self._is_image_old(image, min_date): if not image or not self._is_image_old(image, min_date):
return return
self.logger.info( self.logger.info(f"Removing image {self._format_image(image, image_summary)}")
"Removing image {name}".format(name=self._format_image(image, image_summary))
)
if config["dry_run"]: if config["dry_run"]:
return return
@ -251,22 +247,13 @@ class GarbageCollector:
try: try:
return func(**kwargs) return func(**kwargs)
except requests.exceptions.Timeout as e: except requests.exceptions.Timeout as e:
params = ",".join("%s=%s" % item for item in kwargs.items()) # noqa params = ",".join("%s=%s" % item for item in kwargs.items()) # noqa:UP031
self.logger.warning( self.logger.warning(f"Failed to call {func.__name__} {params} {e!s}")
"Failed to call {name} {params} {msg}".format(
name=func.__name__, params=params, msg=str(e)
)
)
except docker.errors.APIError as e: except docker.errors.APIError as e:
params = ",".join("%s=%s" % item for item in kwargs.items()) # noqa params = ",".join("%s=%s" % item for item in kwargs.items()) # noqa:UP031
self.logger.warning( self.logger.warning(f"Error calling {func.__name__} {params} {e!s}")
"Error calling {name} {params} {msg}".format(
name=func.__name__, params=params, msg=str(e)
)
)
def _format_image(self, image, image_summary): def _format_image(self, image, image_summary):
def get_tags(): def get_tags():
tags = image_summary.get("RepoTags") tags = image_summary.get("RepoTags")
if not tags or tags == ["<none>:<none>"]: if not tags or tags == ["<none>:<none>"]:
@ -277,12 +264,11 @@ class GarbageCollector:
def _build_exclude_set(self): def _build_exclude_set(self):
config = self.config.config config = self.config.config
exclude_set = set(config["gc"]["exclude_images"])
def is_image_tag(line): def is_image_tag(line):
return line and not line.startswith("#") return line and not line.startswith("#")
return exclude_set return set(config["gc"]["exclude_images"])
def _format_exclude_labels(self): def _format_exclude_labels(self):
config = self.config.config config = self.config.config
@ -291,10 +277,7 @@ class GarbageCollector:
for exclude_label_arg in config["gc"]["exclude_container_labels"]: for exclude_label_arg in config["gc"]["exclude_container_labels"]:
split_exclude_label = exclude_label_arg.split("=", 1) split_exclude_label = exclude_label_arg.split("=", 1)
exclude_label_key = split_exclude_label[0] exclude_label_key = split_exclude_label[0]
if len(split_exclude_label) == 2: exclude_label_value = split_exclude_label[1] if len(split_exclude_label) == 2 else None
exclude_label_value = split_exclude_label[1]
else:
exclude_label_value = None
exclude_labels.append( exclude_labels.append(
self.ExcludeLabel( self.ExcludeLabel(
key=exclude_label_key, key=exclude_label_key,
@ -308,7 +291,7 @@ class GarbageCollector:
try: try:
return docker.APIClient(version="auto", timeout=config["http_timeout"]) return docker.APIClient(version="auto", timeout=config["http_timeout"])
except docker.errors.DockerException as e: except docker.errors.DockerException as e:
self.log.sysexit_with_message("Can't create docker client\n{}".format(e)) self.log.sysexit_with_message(f"Can't create docker client\n{e}")
def run(self): def run(self):
"""Garbage collector main method.""" """Garbage collector main method."""
@ -327,7 +310,8 @@ class GarbageCollector:
self.cleanup_volumes() self.cleanup_volumes()
if ( if (
not config["gc"]["max_container_age"] and not config["gc"]["max_image_age"] not config["gc"]["max_container_age"]
and not config["gc"]["max_image_age"]
and not config["gc"]["dangling_volumes"] and not config["gc"]["dangling_volumes"]
): ):
self.logger.ing("Skipped, no arguments given") self.logger.ing("Skipped, no arguments given")

View File

@ -8,8 +8,7 @@ import sys
import colorama import colorama
from pythonjsonlogger import jsonlogger from pythonjsonlogger import jsonlogger
from dockertidy.utils import Singleton from dockertidy.utils import Singleton, to_bool
from dockertidy.utils import to_bool
CONSOLE_FORMAT = "{}[%(levelname)s]{} %(message)s" CONSOLE_FORMAT = "{}[%(levelname)s]{} %(message)s"
JSON_FORMAT = "%(asctime)s %(levelname)s %(message)s" JSON_FORMAT = "%(asctime)s %(levelname)s %(message)s"
@ -26,7 +25,7 @@ def _should_do_markup():
colorama.init(autoreset=True, strip=not _should_do_markup()) colorama.init(autoreset=True, strip=not _should_do_markup())
class LogFilter(object): class LogFilter:
"""A custom log filter which excludes log messages above the logged level.""" """A custom log filter which excludes log messages above the logged level."""
def __init__(self, level): def __init__(self, level):
@ -47,15 +46,15 @@ class LogFilter(object):
class MultilineFormatter(logging.Formatter): class MultilineFormatter(logging.Formatter):
"""Logging Formatter to reset color after newline characters.""" """Logging Formatter to reset color after newline characters."""
def format(self, record): # noqa def format(self, record):
record.msg = record.msg.replace("\n", "\n{}... ".format(colorama.Style.RESET_ALL)) record.msg = record.msg.replace("\n", f"\n{colorama.Style.RESET_ALL}... ")
return logging.Formatter.format(self, record) return logging.Formatter.format(self, record)
class MultilineJsonFormatter(jsonlogger.JsonFormatter): class MultilineJsonFormatter(jsonlogger.JsonFormatter):
"""Logging Formatter to remove newline characters.""" """Logging Formatter to remove newline characters."""
def format(self, record): # noqa def format(self, record):
record.msg = record.msg.replace("\n", " ") record.msg = record.msg.replace("\n", " ")
return jsonlogger.JsonFormatter.format(self, record) return jsonlogger.JsonFormatter.format(self, record)
@ -94,9 +93,7 @@ class Log:
handler.addFilter(LogFilter(logging.WARNING)) handler.addFilter(LogFilter(logging.WARNING))
handler.setFormatter( handler.setFormatter(
MultilineFormatter( MultilineFormatter(
self.warning( self.warning(CONSOLE_FORMAT.format(colorama.Fore.YELLOW, colorama.Style.RESET_ALL))
CONSOLE_FORMAT.format(colorama.Fore.YELLOW, colorama.Style.RESET_ALL)
)
) )
) )
@ -183,7 +180,7 @@ class Log:
:returns: string :returns: string
""" """
return "{}{}{}".format(color, msg, colorama.Style.RESET_ALL) return f"{color}{msg}{colorama.Style.RESET_ALL}"
def sysexit(self, code=1): def sysexit(self, code=1):
"""Exit running program with given exit code.""" """Exit running program with given exit code."""

View File

@ -10,7 +10,8 @@ env = environs.Env()
def timedelta_validator(value): def timedelta_validator(value):
"""Return the dateparser string for a time in the past. """
Return the dateparser string for a time in the past.
:param value: a string containing a time format supported by :param value: a string containing a time format supported by
mod:`dateparser` mod:`dateparser`
@ -19,13 +20,14 @@ def timedelta_validator(value):
return None return None
if not dateparser.parse(value): if not dateparser.parse(value):
raise ArgumentTypeError("'{}' is not a valid timedelta string".format(value)) raise ArgumentTypeError(f"'{value}' is not a valid timedelta string")
return value return value
def timedelta(value, dt_format=None): def timedelta(value, dt_format=None):
"""Return the :class:`datetime.datetime.DateTime` for a time in the past. """
Return the :class:`datetime.datetime.DateTime` for a time in the past.
:param value: a string containing a time format supported by :param value: a string containing a time format supported by
mod:`dateparser` mod:`dateparser`
@ -34,10 +36,7 @@ def timedelta(value, dt_format=None):
return None return None
timedelta = dateparser.parse( timedelta = dateparser.parse(
value, settings={ value, settings={"TO_TIMEZONE": "UTC", "RETURN_AS_TIMEZONE_AWARE": True}
"TO_TIMEZONE": "UTC",
"RETURN_AS_TIMEZONE_AWARE": True
}
) )
if dt_format: if dt_format:
@ -52,4 +51,4 @@ def timedelta_parser(value):
timedelta_validator(value) timedelta_validator(value)
return value return value
except ArgumentTypeError as e: except ArgumentTypeError as e:
raise environs.EnvError(e) raise environs.EnvError(e) from e

View File

@ -1,8 +1,8 @@
"""Test Autostop class.""" """Test Autostop class."""
import docker
import pytest import pytest
import docker
from dockertidy import autostop from dockertidy import autostop
pytest_plugins = [ pytest_plugins = [

View File

@ -1,9 +1,9 @@
"""Test GarbageCollector class.""" """Test GarbageCollector class."""
import docker
import pytest import pytest
import requests import requests
import docker
from dockertidy import garbage_collector from dockertidy import garbage_collector
pytest_plugins = [ pytest_plugins = [

View File

@ -1,7 +1,29 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
"""Global utility methods and classes.""" """Global utility methods and classes."""
from distutils.util import strtobool
def strtobool(value):
"""Convert a string representation of truth to true or false."""
_map = {
"y": True,
"yes": True,
"t": True,
"true": True,
"on": True,
"1": True,
"n": False,
"no": False,
"f": False,
"false": False,
"off": False,
"0": False,
}
try:
return _map[str(value).lower()]
except KeyError as err:
raise ValueError(f'"{value}" is not a valid bool value') from err
def to_bool(string): def to_bool(string):
@ -20,8 +42,7 @@ class Singleton(type):
_instances = {} _instances = {}
def __call__(cls, *args, **kwargs): # noqa def __call__(cls, *args, **kwargs):
if cls not in cls._instances: if cls not in cls._instances:
cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs) cls._instances[cls] = super().__call__(*args, **kwargs)
return cls._instances[cls] return cls._instances[cls]

View File

@ -2,12 +2,11 @@
title: Documentation title: Documentation
--- ---
[![Build Status](https://img.shields.io/drone/build/thegeeklab/docker-tidy?logo=drone&server=https%3A%2F%2Fdrone.thegeeklab.de)](https://drone.thegeeklab.de/thegeeklab/docker-tidy) [![Build Status](https://ci.thegeeklab.de/api/badges/thegeeklab/docker-tidy/status.svg)](https://ci.thegeeklab.de/repos/thegeeklab/docker-tidy)
[![Docker Hub](https://img.shields.io/badge/docker-latest-blue.svg?logo=docker&logoColor=white)](https://hub.docker.com/r/thegeeklab/docker-tidy) [![Docker Hub](https://img.shields.io/badge/docker-latest-blue.svg?logo=docker&logoColor=white)](https://hub.docker.com/r/thegeeklab/docker-tidy)
[![Python Version](https://img.shields.io/pypi/pyversions/docker-tidy.svg)](https://pypi.org/project/docker-tidy/) [![Python Version](https://img.shields.io/pypi/pyversions/docker-tidy.svg)](https://pypi.org/project/docker-tidy/)
[![PyPI Status](https://img.shields.io/pypi/status/docker-tidy.svg)](https://pypi.org/project/docker-tidy/) [![PyPI Status](https://img.shields.io/pypi/status/docker-tidy.svg)](https://pypi.org/project/docker-tidy/)
[![PyPI Release](https://img.shields.io/pypi/v/docker-tidy.svg)](https://pypi.org/project/docker-tidy/) [![PyPI Release](https://img.shields.io/pypi/v/docker-tidy.svg)](https://pypi.org/project/docker-tidy/)
[![Codecov](https://img.shields.io/codecov/c/github/thegeeklab/docker-tidy)](https://codecov.io/gh/thegeeklab/docker-tidy)
[![GitHub contributors](https://img.shields.io/github/contributors/thegeeklab/docker-tidy)](https://github.com/thegeeklab/docker-tidy/graphs/contributors) [![GitHub contributors](https://img.shields.io/github/contributors/thegeeklab/docker-tidy)](https://github.com/thegeeklab/docker-tidy/graphs/contributors)
[![Source: GitHub](https://img.shields.io/badge/source-github-blue.svg?logo=github&logoColor=white)](https://github.com/thegeeklab/docker-tidy) [![Source: GitHub](https://img.shields.io/badge/source-github-blue.svg?logo=github&logoColor=white)](https://github.com/thegeeklab/docker-tidy)
[![License: Apache-2.0](https://img.shields.io/github/license/thegeeklab/docker-tidy)](https://github.com/thegeeklab/docker-tidy/blob/main/LICENSE) [![License: Apache-2.0](https://img.shields.io/github/license/thegeeklab/docker-tidy)](https://github.com/thegeeklab/docker-tidy/blob/main/LICENSE)

162
docs/static/socialmedia.svg vendored Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 36 KiB

After

Width:  |  Height:  |  Size: 28 KiB

2318
poetry.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -10,10 +10,11 @@ classifiers = [
"Natural Language :: English", "Natural Language :: English",
"Operating System :: POSIX", "Operating System :: POSIX",
"Programming Language :: Python :: 3", "Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.7",
"Programming Language :: Python :: 3.8", "Programming Language :: Python :: 3.8",
"Programming Language :: Python :: 3.9", "Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10", "Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Topic :: System :: Systems Administration", "Topic :: System :: Systems Administration",
"Topic :: Utilities", "Topic :: Utilities",
"Topic :: Software Development", "Topic :: Software Development",
@ -21,82 +22,57 @@ classifiers = [
description = "Keep docker hosts tidy." description = "Keep docker hosts tidy."
documentation = "https://docker-tidy.geekdocs.de/" documentation = "https://docker-tidy.geekdocs.de/"
homepage = "https://docker-tidy.geekdocs.de/" homepage = "https://docker-tidy.geekdocs.de/"
include = [ include = ["LICENSE"]
"LICENSE",
]
keywords = ["docker", "gc", "prune", "garbage"] keywords = ["docker", "gc", "prune", "garbage"]
license = "Apache-2.0" license = "Apache-2.0"
name = "docker-tidy" name = "docker-tidy"
packages = [ packages = [{ include = "dockertidy" }]
{include = "dockertidy"},
]
readme = "README.md" readme = "README.md"
repository = "https://github.com/thegeeklab/docker-tidy/" repository = "https://github.com/thegeeklab/docker-tidy/"
version = "0.0.0" version = "0.0.0"
[tool.poetry.dependencies] [tool.poetry.dependencies]
anyconfig = "0.13.0" anyconfig = "0.14.0"
appdirs = "1.4.4" appdirs = "1.4.4"
certifi = "2022.9.24" certifi = "2024.2.2"
colorama = "0.4.6" colorama = "0.4.6"
dateparser = "1.1.2" dateparser = "1.2.0"
docker = "6.0.0" docker = "7.1.0"
docker-pycreds = "0.4.0" docker-pycreds = "0.4.0"
environs = "9.5.0" environs = "11.0.0"
idna = "3.4" idna = "3.7"
ipaddress = "1.0.23" ipaddress = "1.0.23"
jsonschema = "4.17.0" jsonschema = "4.22.0"
nested-lookup = "0.2.25" nested-lookup = "0.2.25"
pathspec = "0.10.1" pathspec = "0.12.1"
python = "^3.7.0" python = "^3.8.0"
python-dateutil = "2.8.2" python-dateutil = "2.9.0.post0"
python-json-logger = "2.0.4" python-json-logger = "2.0.7"
requests = "2.28.1" requests = "2.31.0"
"ruamel.yaml" = "0.17.21" "ruamel.yaml" = "0.18.6"
websocket_client = "1.4.1" websocket_client = "1.8.0"
zipp = "3.10.0" zipp = "3.19.1"
[tool.poetry.dev-dependencies]
bandit = "1.7.4"
flake8 = "5.0.4"
flake8-blind-except = "0.2.1"
flake8-builtins = "2.0.0"
flake8-docstrings = "1.6.0"
flake8-eradicate = "1.4.0"
flake8-isort = "5.0.0"
flake8-logging-format = "0.8.1"
flake8-pep3101 = "2.0.0"
flake8-polyfill = "1.0.2"
flake8-quotes = "3.3.1"
pep8-naming = "0.13.2"
pydocstyle = "6.1.1"
pytest = "7.2.0"
pytest-cov = "4.0.0"
pytest-mock = "3.10.0"
tomli = "2.0.1"
yapf = "0.32.0"
toml = "0.10.2"
[tool.poetry.scripts] [tool.poetry.scripts]
docker-tidy = "dockertidy.cli:main" docker-tidy = "dockertidy.cli:main"
[tool.poetry.group.dev.dependencies]
ruff = "0.4.5"
pytest = "8.2.1"
pytest-mock = "3.14.0"
pytest-cov = "5.0.0"
toml = "0.10.2"
[tool.poetry-dynamic-versioning] [tool.poetry-dynamic-versioning]
enable = true enable = true
style = "semver" style = "semver"
vcs = "git" vcs = "git"
[tool.isort]
default_section = "THIRDPARTY"
force_single_line = true
line_length = 99
sections = ["FUTURE", "STDLIB", "THIRDPARTY", "FIRSTPARTY", "LOCALFOLDER"]
skip_glob = ["**/.env*", "**/env/*", "**/.venv/*", "**/docs/*"]
[tool.pytest.ini_options] [tool.pytest.ini_options]
addopts = "dockertidy --cov=dockertidy --cov-report=xml:coverage.xml --cov-report=term --cov-append --no-cov-on-fail" addopts = "dockertidy --cov=dockertidy --cov-report=xml:coverage.xml --cov-report=term --no-cov-on-fail"
filterwarnings = [ filterwarnings = [
"ignore::FutureWarning", "ignore::FutureWarning",
"ignore:.*collections.*:DeprecationWarning", "ignore::DeprecationWarning",
"ignore:.*pep8.*:FutureWarning", "ignore:.*pep8.*:FutureWarning",
] ]
@ -104,5 +80,70 @@ filterwarnings = [
omit = ["**/test/*"] omit = ["**/test/*"]
[build-system] [build-system]
build-backend = "poetry.core.masonry.api" build-backend = "poetry_dynamic_versioning.backend"
requires = ["poetry-core>=1.0.0", "poetry-dynamic-versioning"] requires = ["poetry-core>=1.0.0", "poetry-dynamic-versioning"]
[tool.ruff]
exclude = [
".git",
"__pycache__",
"build",
"dist",
"test",
"*.pyc",
"*.egg-info",
".cache",
".eggs",
"env*",
]
line-length = 99
indent-width = 4
[tool.ruff.lint]
# Explanation of errors
#
# D102: Missing docstring in public method
# D103: Missing docstring in public function
# D105: Missing docstring in magic method
# D107: Missing docstring in __init__
# D202: No blank lines allowed after function docstring
# D203: One blank line required before class docstring
# D212: Multi-line docstring summary should start at the first line
ignore = [
"D102",
"D103",
"D105",
"D107",
"D202",
"D203",
"D212",
"UP038",
"RUF012",
]
select = [
"D",
"E",
"F",
"Q",
"W",
"I",
"S",
"BLE",
"N",
"UP",
"B",
"A",
"C4",
"T20",
"SIM",
"RET",
"ARG",
"ERA",
"RUF",
]
[tool.ruff.format]
quote-style = "double"
indent-style = "space"
line-ending = "lf"

View File

@ -1,4 +1,12 @@
{ {
"$schema": "https://docs.renovatebot.com/renovate-schema.json", "$schema": "https://docs.renovatebot.com/renovate-schema.json",
"extends": ["github>thegeeklab/renovate-presets"] "extends": ["github>thegeeklab/renovate-presets"],
"packageRules": [
{
"matchManagers": ["woodpecker"],
"matchFileNames": [".woodpecker/test.yml"],
"matchPackageNames": ["docker.io/library/python"],
"enabled": false
}
]
} }

View File

@ -1,24 +0,0 @@
[flake8]
# Explanation of errors
#
# D102: Missing docstring in public method
# D103: Missing docstring in public function
# D105: Missing docstring in magic method
# D107: Missing docstring in __init__
# D202: No blank lines allowed after function docstring
# G001: Logging statements should not use string.format() for their first argument
# G004: Logging statements should not use f"..." for their first argument
# W503: Line break occurred before a binary operator
ignore = D102, D103, D105, D107, D202, G001, G004, W503
max-line-length = 99
inline-quotes = double
exclude = .git, __pycache__, build, dist, test, *.pyc, *.egg-info, .cache, .eggs, env*
[yapf]
based_on_style = google
column_limit = 99
dedent_closing_brackets = true
coalesce_brackets = true
split_before_logical_operator = true
indent_dictionary_value = true
allow_split_before_dict_value = false