From fe57f421ac819654f85aaecb7dbb103943e56002 Mon Sep 17 00:00:00 2001 From: jfuller Date: Tue, 10 Jan 2023 09:48:16 +0100 Subject: [PATCH] Basic foundation --- .github/workflows/main.yml | 17 + .gitignore | 132 ++ LICENSE | 2 +- Makefile | 41 + README.md | 120 +- docs/developer_guide.md | 30 + docs/image/griffon.jpg | Bin 0 -> 5836 bytes docs/tutorial.md | 2 + docs/user_guide.md | 101 + griffon/__init__.py | 55 + griffon/autocomplete/__init__.py | 30 + griffon/autocomplete/product_streams.py | 2332 ++++++++++++++++++++++ griffon/autocomplete/product_versions.py | 661 ++++++ griffon/cli.py | 101 + griffon/commands/configure.py | 21 + griffon/commands/docs.py | 66 + griffon/commands/entities.py | 438 ++++ griffon/commands/manage.py | 63 + griffon/commands/plugin_commands.py | 32 + griffon/commands/plugins/README.md | 3 + griffon/commands/plugins/z_fcc.py | 26 + griffon/commands/plugins/z_go_vuln.py | 31 + griffon/commands/plugins/z_osv.py | 60 + griffon/commands/process.py | 36 + griffon/commands/queries.py | 253 +++ griffon/commands/z_go_vuln.py | 26 + griffon/exceptions.py | 19 + griffon/output.py | 33 + griffon/service_layer/__init__.py | 34 + griffon/service_layer/core_process.py | 31 + griffon/service_layer/core_queries.py | 285 +++ pyproject.toml | 13 + requirements/base.in | 4 + requirements/base.txt | 146 ++ requirements/dev.in | 6 + requirements/dev.txt | 644 ++++++ requirements/lint.in | 7 + requirements/lint.txt | 138 ++ requirements/test.in | 8 + requirements/test.txt | 392 ++++ setup.py | 50 + tests/__init__.py | 0 tests/conftest.py | 0 tests/test_cli.py | 24 + tests/test_entities.py | 15 + tests/test_manage.py | 15 + tests/test_plugins.py | 15 + tests/test_process.py | 21 + tests/test_queries.py | 21 + tox.ini | 55 + 50 files changed, 6652 insertions(+), 3 deletions(-) create mode 100644 .github/workflows/main.yml create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 docs/developer_guide.md create mode 100644 docs/image/griffon.jpg create mode 100644 docs/tutorial.md create mode 100644 docs/user_guide.md create mode 100644 griffon/__init__.py create mode 100644 griffon/autocomplete/__init__.py create mode 100644 griffon/autocomplete/product_streams.py create mode 100644 griffon/autocomplete/product_versions.py create mode 100644 griffon/cli.py create mode 100644 griffon/commands/configure.py create mode 100644 griffon/commands/docs.py create mode 100644 griffon/commands/entities.py create mode 100644 griffon/commands/manage.py create mode 100644 griffon/commands/plugin_commands.py create mode 100644 griffon/commands/plugins/README.md create mode 100644 griffon/commands/plugins/z_fcc.py create mode 100644 griffon/commands/plugins/z_go_vuln.py create mode 100644 griffon/commands/plugins/z_osv.py create mode 100644 griffon/commands/process.py create mode 100644 griffon/commands/queries.py create mode 100644 griffon/commands/z_go_vuln.py create mode 100644 griffon/exceptions.py create mode 100644 griffon/output.py create mode 100644 griffon/service_layer/__init__.py create mode 100644 griffon/service_layer/core_process.py create mode 100644 griffon/service_layer/core_queries.py create mode 100644 pyproject.toml create mode 100644 requirements/base.in create mode 100644 requirements/base.txt create mode 100644 requirements/dev.in create mode 100644 requirements/dev.txt create mode 100644 requirements/lint.in create mode 100644 requirements/lint.txt create mode 100644 requirements/test.in create mode 100644 requirements/test.txt create mode 100644 setup.py create mode 100644 tests/__init__.py create mode 100644 tests/conftest.py create mode 100644 tests/test_cli.py create mode 100644 tests/test_entities.py create mode 100644 tests/test_manage.py create mode 100644 tests/test_plugins.py create mode 100644 tests/test_process.py create mode 100644 tests/test_queries.py create mode 100644 tox.ini diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..cb47b54 --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,17 @@ +name: Run CI + +on: [push, pull_request] + +jobs: + tox: + name: Run Tox + steps: + - uses: actions/checkout@v2 + - name: Run all envs + uses: fedora-python/tox-github-action@master + with: + tox_env: ${{ matrix.tox_env }} + strategy: + matrix: + tox_env: [black, isort, flake8, mypy] + runs-on: ubuntu-latest \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c98092a --- /dev/null +++ b/.gitignore @@ -0,0 +1,132 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +pip-wheel-metadata/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +junit.xml +nosetests.xml +coverage.xml +*.cover +.hypothesis/ +.pytest_cache/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal +staticfiles/ + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +.python-version + +# SageMath parsed files +*.sage.py + +# Environments +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ +.env +.env-enterprise + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# IDEs and editors +.idea/ +.project +.pydevproject +.vscode + +# UMB certificates +*.key +*.crt + +# ripgrep-specific ignore file +.rgignore + +# SonarQube +.scannerwork/ diff --git a/LICENSE b/LICENSE index 79f37b0..831fb6b 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2023 Red Hat Product Security +Copyright (c) 2023 Jim Fuller Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..8c861ce --- /dev/null +++ b/Makefile @@ -0,0 +1,41 @@ +python3=`which python3` +tox=`which tox` +pc=`which pip-compile` +ps=`which pip-sync` +openssl=`which openssl` + +test-all: + $(tox) + +test: + $(tox) -e griffon + +compile-deps: + $(pc) --generate-hashes --allow-unsafe requirements/base.in + $(pc) --generate-hashes --allow-unsafe requirements/test.in + $(pc) --generate-hashes --allow-unsafe requirements/lint.in + $(pc) --generate-hashes --allow-unsafe requirements/dev.in + +install: + pip install . + +install-dev-deps: + pip3 install -r requirements/dev.txt + +sync-dev-deps: + pip-sync requirements/dev.txt + +shell: + ipython + +venv: + virtualenv --python=/usr/bin/python3.9 venv + +docs: + tox -e manpages + +clean: + rm -Rf dist + rm -Rf man + rm -Rf griffon.egg-info + rm -Rf build diff --git a/README.md b/README.md index 37fed0f..83e1b11 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,118 @@ -# griffon -Red Hat Product Security CLI +# ![](docs/image/griffon.jpg) Ǥriffon + +**WARNING- NOT PROD (yet), no releases, if you use this you are running with scissors ...** + +Red Hat Product Security CLI providing: + +* Set of core entity operations on flaws, affects, components, products, etc... for +searching, listing and retrieving entities. +* Set of read only query service operations answering 'canned' product security related queries +* Set of process service operations (mutation) automating away manual 'drudgery' +* Dynamic, extensible set of custom plugin operations for interacting with external services + +The CLI provides a simple 'facade' over coarse grained security related data services allowing +for easier aggregation and narrowing of information providing a good security 'signal' +for end users. + + +```commandline +Usage: griffon [OPTIONS] COMMAND [ARGS]... + + Red Hat Product Security CLI + +Options: + --debug + --help Show this message and exit. + +Commands: + docs Links to useful docs. + entities List and retrieve entities operations. + manage Manage operations. + process Process operations. + queries Query operations. + z_fcc FCC plugin + z_osv OSV plugin + + +``` + +[User guide (quickstart)](docs/user_guide.md) + +[Tutorial](docs/tutorial.md) + +[Developer guide](docs/developer_guide.md) + + +## Entity operations + +Low level (ex. list, get) entity operations. + +```commandline +> griffon entities +Usage: griffon entities [OPTIONS] COMMAND [ARGS]... + + List and retrieve entities operations. + +Options: + --help Show this message and exit. + +Commands: + affects https:///osidb/api/v1/affects + components https:///api/v1/components + flaws https:///osidb/api/v1/flaws + product-streams ... + trackers https:///osidb/api/v1/trackers + +``` + +## Query operations + +Read only service operations + +```commandline +Usage: griffon queries [OPTIONS] COMMAND [ARGS]... + + Query operations. + +Options: + --help Show this message and exit. + +Commands: + component_cves List CVEs affecting a component. + components_affected_by_cve List components affected by CVE. + components_in_product_stream List components of product version. + cves_for_product_version List CVEs of a product version. + product_versions_affected_by_cve + List product versions affected by a CVE. + +``` + +## Process operations + +Service operations that update entities. + +```commandline +Usage: griffon process [OPTIONS] COMMAND [ARGS]... + + Mutation operations. + +Options: + --help Show this message and exit. + +Commands: + generate_affects_for_component Generate affects for component. + +``` + +#### Some Useful questions to answer + +* Which unfixed CVE are affecting a component? +* Which unfixed CVE are affecting a product + version + stream? +* Given a CVE ID, what products are affected? +* Given a CVE ID, what components are affected? +* What products + version + stream contain a given component (e.g. full text search)? +* What are the fixed CVEs for a product + version + stream? +* What are the fixed CVEs for a component? +* What are the won’t fix CVEs for a component? +* What are the won’t fix CVEs for a product? +* How many CVE’s are filed against a product + version diff --git a/docs/developer_guide.md b/docs/developer_guide.md new file mode 100644 index 0000000..3c1c46c --- /dev/null +++ b/docs/developer_guide.md @@ -0,0 +1,30 @@ +## Setup + +```commandline +> make venv +``` + +```commandline +> pip install pip-tools +``` + +```commandline +> make install-dev-deps +``` + +## Run tests + +```commandline +> make test +``` + +test target runs + +```commandline +> tox -e griffon +``` + + +## CI + +github actions \ No newline at end of file diff --git a/docs/image/griffon.jpg b/docs/image/griffon.jpg new file mode 100644 index 0000000000000000000000000000000000000000..677c3b0acfe987c5d35631a40f488614552f0742 GIT binary patch literal 5836 zcmb_0qHrmm(r-ulHsE-qe_A3?K*qi24D0 zb96IA1B2sMHkQUjbEDr5x)*>dFzS~~2@SR}(I+@LyAaUts3sM%W+8O#oL z4CW0Bf&~f`3P#5UdCSLI!aFaR_0L@IVA1Vh|~a>xi3(W<(F-C1Mt_ zhWLeKK=L4^keWy$(h2E}JdI35<{~SQO~_v4C~^V0g+ie?P+}-G)FG5J$`2KVNQN6-!>D=GCK`?2kCsAfp)JvF=umVb`Wm_x-H9GSFQC6+=rH^kMT{}V1w+A{#pGhD zF%K{!m?g{(7LOIdYGN(1By0pW4O@n7#|~i^usb+roET0EXNU8{#pABx>TtcdY1{@K z9i1SZ2AwsXFI^nnRl3`BeRQ*Q-|1QCCFu?5kJ5+Hr_xu_Kct_a-(X;15M|J1aA62# zNM)#Ec*O9Q;Tt0>qbwtlk;E9wn8(=6IKsHfgk=(8(qnREie$=Vy2~`g^a+o}i{cIN zZul5{9=;7fj^AWvWmaIeWF|AGFjq78Gk;(~vxu@7v5;62SV~zQvCOl=S%p{)SUp(J zv6iv+vM#Wp*u>a~Y<_IXY`543+1A)u*p=BG*u&ZL*zdE?aKJf4Ifxwo9BCX49Ag|m z_VMo1+vmCO(!RQVBm1^FxjA(?Jvoy&>p4d`f9xmhH`;%4f5!fn{cpGsT#{VYT&KAT zxq7)iakFtB;P&87;%?xc^4Rc1@s#pBgqHDc4^ z4B|TCLEJld<3M5`g!X#BBeI)ZFhooRqs#3mE1yaM(NNEjeigbzexD36F zp3Etk8kt#H4q0>Av$8F+t8&6}E^--iPvm~dtH}Gym&s2luqc=+oK6`Rd!X?RD)IPRF~C+)lR78tBtF(savV1 zsP}0gHS{%NH99oDYpQC7YBp$oIUsZ3f7?LQ;EcgTL%5-dVUppX5sQ(% z(RHJ@#)8J)#x=%kCMqUTCJzrG51AdxI5bY=C3+C6h-;>5re{oh%;?Q*&90lxnM;}n zo3|f^9X36jb$HrB#DZecVhJpXmRXi>ti-H>tnOK(tgWo`tQTz*Y@%(R*s|Ilx2?9_ zveUOqvzxLPw-2-Lc3^Ti>QLpd?P%zj={Vyg=XA#DsWX?euXC#l+Qq@8!e#S_(UF`Z z3rAIsCLSF-CUz|RSidWmtH100<4nihj^90jJmGkv`ovE+OSclYO?RSuzWbVofyWh( z6_PF~o3!ky<(cWZGi=|%R9?^*+<7G*XNV3f$w$Sb-zP?MSj~SEl*aS-1B$z zuP0;3C&+CS7RpIVPXJ#)c))O=RA6G@OpsGzX&hM|g^2Qq>W&tOj*p%_qj#n_28wZy>5dhO zO^98HGl{zykBdJU|NN}{+03(F&pDoJPvA|6OPD`za=s>!F)=uC{KA0?MHdkleJ>7P zQo3~Q(yt^^(m=9&a&Gd^6pxgF%LehUVT1K{-ylw0#d<9 zp>APa5pPj)(T^LxH(nQ;6gQWMmgJVAN>7z8mN}F?DOWGAs^F?fuGp=lRLux{L-gHm)US)?sN8Ww*`)Lnw4-y{ibw+k>J`8;L zsmr@-zWaFh)FY=yuX?O|27AqV`yLxVe)L4|NoSu{Uq`=Yf7^iiK+99rr_Ik)o;5vJ zdEPXrI@mmdgIF!`WwZwsTYS9`h^jL*D;fNLXZ8%w6JN zs`{Y#p<~&2`NhX09~V{vS9U%nerEohzbd}k_(k{2vo)u+h4tX|y}wd6_HR^vRsPz& zX|?%wi@de7o%C)0x0~P9zd!lm_+x43^iTB9tGg1r?Z3=^P4AKS_Ws2|WQj%w1XTqM zRaF^983lr&r*>UvB~}$iT*q@UJ?^ z*m!z*276Mduj=6IdD@raO?`g~$v4zDfI{%45dKe@Xz~9|`6thRxN)dwIF&zA^9%@# z2=?{%2_+CIp`O7MH(Ew+{=a7@n3iKmKyavU7+IP?Ws)iYgm@__{>}}eH>A?McYAvq zq5z*^ zadeDySS$lG10xe2&y2^>v#_$@S*aLL>ja`j!Vws1Af66ON45Tc%HBi3i~%G-fQ=%7+Q3wS(8xdU41*&8k{QJ!fL74M2wJnU zxy1`9Dg|W}-w_V(nq8v?aZ~R%FgWd!^B+N?s9_MA>Xf4n4ub&{1Vh6A^avoTj~U6r zDxhGk$L1!e9~3{#erHXnxNCNOZxYZ`lY=qCnSl=2w1~69LAv4$@>))z6#>?7mlN}^ zNN$H+T=ufPJ%v(|v`|aCc?dUY!8pCqYdF=rQrC;=?GK+^-vgvuM+GNFNAt5|hWcB% z@|eHO5`9f(q)9P3V%!39^q0d1wXL^npCQ2wHrSs*kkGlYcFzKj@>NZW(O@X5@^-Vs zPcbt}89qupBrW5y3GZd!zVhQoZru+UZcjeOA;t3ceqor;XYb*+XFt+4mAnyIDPLrH z8cb>(cuh{o>I)EJjLv~YJgmMjS90)qz{_vD8I*vJB2Vw1>CB=m7v9s&3lXUKL@FLd z-d1DZ2l3yFpE^qv8&VmfuN*3Se)sXwg5lV)q9baIX}t;L=GN^T<+*(l<(VALTHTiC zQuTHZzG~UzDY$9#a=htR℞C!L3h+1BN9URh#Z?(wR=FoGQ%N6nG=pByl_31%45S zwOTU{jLmUU_>yYKHopfFP)00I@)A;Z1C*1fCH_;0j|CQE9M73c>aI-XXE!F6-je8F zEvKiCb$S21FI7u1JGE9*BqKP*k}q)#qD; zR9t5VB*#gUyL5c+S@oF`zsi+=rHyj%Wt)$;E7|O>2bs6JWcM+)e8ISWf%|0_$}2Vg zJm+j#ddk2-My`PKNsT?%xv8DJi2|lNEz=M8gfXXfA~*eH5``|h z^Z7>mzJKn_Jpa6Y%9s0lu~GE4R;+N@*ZaeirqJRY@;&Ecx6Tf+OgFpwNiB@*#C`U` z>rUFp6ZfOnZFzL)M3dXIKHd8q5WCbMcF}8|WdHQ|=_yMW;a-b$_rI5fzAhpwP8=h* z5^~Is;c$3>-ehT&YU@*6c(L#mo=J;^qBz*?jJ1*wdq$ZYsbJ06T%GCWz*?VC6Wa|% zL4^RW@PRZwmS&Nt_(1Q-q(jzX8)@s-1x6z8Gp&NYDNUk&2u-N4R|RbgDtq%A7#&pS z<%A68V=R}CMC4`0?17o_@_}K+UAFdDC;ipR5qAYWPI^r0T(mtKJ6EPIJ<`^)ZFrjN zT-b87Z|3T)a;M+_71~51G0&m;rcUF~w|AQQQyWDt4W@q-VWT{%dee9_g3~6RAE&~f z@u>QNOnAWi)l%&N;i8-mXU~vcY+Yu(DSKV7CO;}6Ip!7Yys$V7>OvPhN?W%3)L~iC z)}>Yc*O5Dlg+`|2lU@xChRqXX$CX@a?9Tbl+?KtP?N4`9~c3F-PV2WR^|8 z!DZsnmNQB4%hdwvyP(?DF1t4W*Dtzewg}$@{?Z$hKOz{n5{n`u?Z09~=zN5;e*R2a zv{1eE&D){CvaK!jaO=dDxt`5bl00`nv(Cq6V@CeV+ZwCai)IZ|m$j>dc0Q8p4zh`u zn2!GX+{Qmw5l$YedHNY2tzZ7~U1^Yg+_``D5d&SlUmXg3L$$KQUA|=+3cjK0MScUR zvnk)Z`n4s~diKD`17ehHhvG3)_jjfC)!_+=$<|iQLpXt>WlQH{O!((Y*$1^6%}gat zyqczYEiap?WeCKnXs)+pikDVUjX`goJkNSyf|gGsJWfUFB;&So2w$*yS%Yf9qZ{a-1TRwx`8JdGI(Q#@-IU z;TX?+JQ|+EY(1m7Y_%XsbVN2Nyj$7>;kQPg<~2W8N-gZS9bquw8ux6`?m6|e_6*0g zfgjpkF=9Hx>L+tXmd$GoE&eG(3yO|?=YxL5^B3?rW$(pdlGBA_12rxhjyL{Z)#{o# z66NJ$h_bj?^?LquqwnL7`7~9F{D{iTletHz$~m8czik=)bF02+!Du|{U4LXxW`Wdk zgiGhgTPB_vqDpSZy}Bf!2HeFb0Ux3q{LYJS5I#q}RJ_h)=elZpwfXpG=^iGfZ3gv$ zOWiR2%p6iC)>32Rxwj{->DjgS{@IP!WFi&6F1bGos*+$jL>9ovz_QarUauDotvI=> zNi=neKamk(Z<@K<%<NeK{#g{N@c*ISinxFS-e^u?L;?=u6Xy%J<@Y|$IF2iWJmZ~hhV>WQ7S zV_o&J6U%)}B8jq!EFb&3_etqAS%Hl&gMraM7pt5j+rL{#-3jh_qx_g*TP@Att6^S6 zMq1>9$^9&K?lAeQlFXpZ^flaAcbx zjAxTK;qBF1YpfkeiP0unh)*k&%Vh@QI@r1!|1g0-+l#vW%E*MLnO2$jAXk50*CmOi zp}RpEeYNJ7O;}$po@<$Y*EZ3pQgzKn +export CORGI_API_URL=https:// +``` +And ensure your system is properly authorised to access these systems. + +**hint**- typically that means run > kinit + +### Enable autocompletion +Enable shell autocompletion by following these instructions for your specific shell. + +Add this to ~/.bashrc: + +```commandline +eval "$(_GRIFFON_COMPLETE=bash_source griffon)" +``` + +Add this to ~/.zshrc: + +```commandline +eval "$(_GRIFFON_COMPLETE=zsh_source griffon)" +``` + +ensuring to source (ex. source ~/.zshrc) to pickup the change. + +https://click.palletsprojects.com/en/8.1.x/shell-completion/ + +## Usage + +...... + + + + +Some more examples + +```commandline +griffon entities components list --re_name ansible --version 1.1.1 +griffon entities components get --purl "pkg:rpm/redhat/curl@7.29.0-19.el7?arch=aarch64" +griffon entities product-streams get_latest_components --ofuri o:redhat:rhel:9.1.0.z +griffon queries component_cves --purl "pkg:rpm/redhat/systemd@239-45.el8_4.11?arch=aarch64" --affectedness AFFECTED +griffon entities components list --name curl | jq '.results[].purl' + +griffon queries products_containing_specific_component --purl "pkg:rpm/redhat/systemd@239-45.el8_4.11?arch=aarch64" | jq ".product_streams" + +``` + + +## Writing custom plugins + +Griffon can be extended with custom plugins - handy for integrating with +3rd party services. + +To create plugins emulate provided [examples](griffon/commands/plugins) + +The **griffon/commands/plugins** directory (in your python site packages) will dynamically +register custom plugins. + +If you think your custom plugin could be useful for others then +raise a [pull request](https://github.com/RedHatProductSecurity/griffon/pulls). + +## Writing custom service processes or queries + +The griffon/service_layer directory contains service query and operations. diff --git a/griffon/__init__.py b/griffon/__init__.py new file mode 100644 index 0000000..1ab1150 --- /dev/null +++ b/griffon/__init__.py @@ -0,0 +1,55 @@ +import logging +import os + +import corgi_bindings +import osidb_bindings +from rich.logging import RichHandler + +__version__ = "0.1.0" + +CORGI_API_URL = os.environ["CORGI_API_URL"] +OSIDB_API_URL = os.environ["OSIDB_API_URL"] + + +def get_logging(level="INFO"): + FORMAT = "%(message)s" + logging.basicConfig(level=level, format=FORMAT, datefmt="[%X]", handlers=[RichHandler()]) + return logging.getLogger("rich") + + +class CorgiService: + name = "component-registry" + description = "Red Hat component registry" + has_binding = True + + @staticmethod + def create_session(): + """init corgi session""" + return corgi_bindings.new_session(corgi_server_uri=CORGI_API_URL) + + @staticmethod + def get_component_types(): + """get component type enum""" + return corgi_bindings.bindings.python_client.models.component_type_enum.ComponentTypeEnum + + @staticmethod + def get_component_namespaces(): + """get component namespaces enum""" + return corgi_bindings.bindings.python_client.models.namespace_enum.NamespaceEnum + + @staticmethod + def get_component_arch(): + """get component arch enum""" + pass + # return corgi_bindings.bindings.python_client.models.arch_enum.ArchEnum + + +class OSIDBService: + name = "osidb" + description = "Open Source Incident database" + has_binding = True + + @staticmethod + def create_session(): + """init osidb session""" + return osidb_bindings.new_session(osidb_server_uri=OSIDB_API_URL) diff --git a/griffon/autocomplete/__init__.py b/griffon/autocomplete/__init__.py new file mode 100644 index 0000000..8630c4b --- /dev/null +++ b/griffon/autocomplete/__init__.py @@ -0,0 +1,30 @@ +import logging + +from griffon.autocomplete import product_streams, product_versions + +logger = logging.getLogger("rich") + + +def get_product_version_ofuris(ctx, param, incomplete): + return [k for k in product_versions.ofuris if k.startswith(incomplete)] + + +def get_product_version_names(ctx, param, incomplete): + return [k for k in product_versions.product_version_names if k.startswith(incomplete)] + + +def get_product_stream_ofuris(ctx, param, incomplete): + return [k for k in product_streams.ofuris if k.startswith(incomplete)] + + +def get_product_stream_names(ctx, param, incomplete): + return [k for k in product_streams.product_stream_names if k.startswith(incomplete)] + + +def get_cve_ids(ctx, param, incomplete): + """TODO - the following is not ideal for autocomplete lookup - need to investigate""" + # response = requests.get( + # f"{OSIDB_API_URL}/osidb/api/v1/flaws?limit=5&search={incomplete}&include_fields=cve_id,title" # noqa + # ) + # return [k["cve_id"] for k in response.json()["results"]] + pass diff --git a/griffon/autocomplete/product_streams.py b/griffon/autocomplete/product_streams.py new file mode 100644 index 0000000..90d7700 --- /dev/null +++ b/griffon/autocomplete/product_streams.py @@ -0,0 +1,2332 @@ +# TODO: we could add an endpoint to component-registry that provides this for +# autocomplete or some automation to generate this file +# + +ofuris = [ + "o:redhat:3amp:2", + "o:redhat:3amp:2.0", + "o:redhat:3amp:2.5", + "o:redhat:3amp:2.7", + "o:redhat:3amp:2.8", + "o:redhat:amq-6.2.1.x:", + "o:redhat:amq-6.3.0.x:", + "o:redhat:amq-7-LTS:", + "o:redhat:amq-cl:2", + "o:redhat:amq-cl:2.3", + "o:redhat:amq-cl:2.4", + "o:redhat:amq-cl:2.5", + "o:redhat:amq-ic:1", + "o:redhat:amq-ic:2", + "o:redhat:amq-on:1", + "o:redhat:amq-on:1.1", + "o:redhat:amq-on:1.2", + "o:redhat:amq-on:1.3", + "o:redhat:amq-on:1.4", + "o:redhat:amq-st:1", + "o:redhat:amq-st:1.0.0", + "o:redhat:amq-st:1.2.0", + "o:redhat:amq-st:2", + "o:redhat:amq:6", + "o:redhat:amq:6.2.1", + "o:redhat:amq:6.3.0", + "o:redhat:amq:7", + "o:redhat:amq:7.1.0", + "o:redhat:amq:7.2.3", + "o:redhat:amq:7.2.4", + "o:redhat:amq:7.3.0", + "o:redhat:amq:7.4.0", + "o:redhat:ansible_automation_platform:1.2", + "o:redhat:ansible_automation_platform:2.0", + "o:redhat:ansible_automation_platform:2.1", + "o:redhat:ansible_automation_platform:2.2", + "o:redhat:ansible_engine:2", + "o:redhat:ansible_engine:2.4", + "o:redhat:ansible_engine:2.5", + "o:redhat:ansible_engine:2.6", + "o:redhat:ansible_engine:2.7", + "o:redhat:ansible_engine:2.8", + "o:redhat:ansible_engine:2.9", + "o:redhat:ansible_tower:3.0", + "o:redhat:ansible_tower:3.1", + "o:redhat:ansible_tower:3.2", + "o:redhat:ansible_tower:3.3", + "o:redhat:ansible_tower:3.4", + "o:redhat:ansible_tower:3.5", + "o:redhat:ansible_tower:3.6", + "o:redhat:ansible_tower:3.7", + "o:redhat:ansible_tower:3.8", + "o:redhat:atomic:7.3", + "o:redhat:bpms-6.0.x:", + "o:redhat:bpms-6.1.x:", + "o:redhat:bpms-6.2.x:", + "o:redhat:bpms-6.3.x:", + "o:redhat:bpms-6.4.x:", + "o:redhat:bpms:6.0.0", + "o:redhat:bpms:6.0.1", + "o:redhat:bpms:6.0.2", + "o:redhat:bpms:6.0.3", + "o:redhat:bpms:6.1.0", + "o:redhat:bpms:6.2.0", + "o:redhat:bpms:6.3.0", + "o:redhat:bpms:6.4.0", + "o:redhat:bpms:7.0.0", + "o:redhat:brms-6.0.x:", + "o:redhat:brms-6.1.x:", + "o:redhat:brms-6.2.x:", + "o:redhat:brms-6.3.x:", + "o:redhat:brms-6.4.x:", + "o:redhat:brms:5.3.1", + "o:redhat:brms:6.0.0", + "o:redhat:brms:6.0.1", + "o:redhat:brms:6.0.2", + "o:redhat:brms:6.0.3", + "o:redhat:brms:6.1.0", + "o:redhat:brms:6.2.0", + "o:redhat:brms:6.3.0", + "o:redhat:brms:6.4.0", + "o:redhat:brms:7.0.0", + "o:redhat:ceph-1.3-default:", + "o:redhat:ceph-2-default:", + "o:redhat:ceph-4-default:", + "o:redhat:ceph-5-default:", + "o:redhat:ceph:1.1", + "o:redhat:ceph:1.2", + "o:redhat:ceph:1.3", + "o:redhat:ceph:2", + "o:redhat:ceph:3", + "o:redhat:ceph:4", + "o:redhat:ceph:5", + "o:redhat:cert-manager:1", + "o:redhat:certificate_system:10.0", + "o:redhat:certificate_system:10.0.z", + "o:redhat:certificate_system:10.1", + "o:redhat:certificate_system:10.1.z", + "o:redhat:certificate_system:10.2", + "o:redhat:certificate_system:10.2.1", + "o:redhat:certificate_system:10.2.z", + "o:redhat:certificate_system:10.3", + "o:redhat:certificate_system:10.3.z", + "o:redhat:certificate_system:10.4", + "o:redhat:certificate_system:10.4.z", + "o:redhat:certificate_system:10.5", + "o:redhat:certificate_system:8", + "o:redhat:certificate_system:9", + "o:redhat:certificate_system:9.1", + "o:redhat:certificate_system:9.2", + "o:redhat:certificate_system:9.3", + "o:redhat:certificate_system:9.4", + "o:redhat:certificate_system:9.4.z", + "o:redhat:certificate_system:9.5", + "o:redhat:certificate_system:9.6", + "o:redhat:certificate_system:9.6.z", + "o:redhat:certificate_system:9.7", + "o:redhat:certificate_system:9.7.z", + "o:redhat:cfme:5.10", + "o:redhat:cfme:5.11", + "o:redhat:cfme:5.2", + "o:redhat:cfme:5.3", + "o:redhat:cfme:5.4", + "o:redhat:cfme:5.5", + "o:redhat:cfme:5.6", + "o:redhat:cfme:5.7", + "o:redhat:cfme:5.8", + "o:redhat:cfme:5.9", + "o:redhat:cfme:6.0", + "o:redhat:cma:2", + "o:redhat:cnv-1-default:", + "o:redhat:cnv-2-default:", + "o:redhat:cnv-4-default:", + "o:redhat:cnv:1.4", + "o:redhat:cnv:2.0", + "o:redhat:cnv:2.1", + "o:redhat:cnv:2.2", + "o:redhat:cnv:2.3", + "o:redhat:cnv:2.4", + "o:redhat:cnv:2.5", + "o:redhat:cnv:2.6", + "o:redhat:cnv:4.10", + "o:redhat:cnv:4.11", + "o:redhat:cnv:4.12", + "o:redhat:cnv:4.8", + "o:redhat:cnv:4.9", + "o:redhat:codeready_studio:12", + "o:redhat:codeready_ws-1-default:", + "o:redhat:codeready_ws-2-default:", + "o:redhat:codeready_ws:1", + "o:redhat:convert2rhel:6", + "o:redhat:convert2rhel:7", + "o:redhat:convert2rhel:8", + "o:redhat:cost-management:", + "o:redhat:cryostat:2", + "o:redhat:devtools-compilers:2019-3.z", + "o:redhat:devtools-compilers:2019-4", + "o:redhat:devtools-compilers:2019-4.z", + "o:redhat:devtools-compilers:2020-1", + "o:redhat:devtools-compilers:2020-1.z", + "o:redhat:devtools-compilers:2020-2", + "o:redhat:devtools-compilers:2020-2.z", + "o:redhat:devtools-compilers:2020-3", + "o:redhat:devtools-compilers:2020-3.z", + "o:redhat:devtools-compilers:2020-4", + "o:redhat:devtools-compilers:2020-4.z", + "o:redhat:devtools-compilers:2021-1", + "o:redhat:devtools-compilers:2021-1.z", + "o:redhat:devtools-compilers:2021-2", + "o:redhat:devtools-compilers:2021-2.z", + "o:redhat:devtools-compilers:2021-3", + "o:redhat:devtools-compilers:2021-3.z", + "o:redhat:devtools-compilers:2021-4", + "o:redhat:devtools-compilers:2021-4.z", + "o:redhat:devtools-compilers:2022-2", + "o:redhat:devtools-compilers:2022-2.z", + "o:redhat:devtools-compilers:2022-4", + "o:redhat:devtools-compilers:2022-4.z", + "o:redhat:devtools-compilers:2023-2", + "o:redhat:devtools-eclipse:", + "o:redhat:devtools-eclipse:2020-3.z", + "o:redhat:devtools-eclipse:2020-4", + "o:redhat:devtools-eclipse:2020-4.z", + "o:redhat:devtools-eclipse:2021-1", + "o:redhat:devtools-eclipse:2021-1.z", + "o:redhat:devtools-eclipse:2021-2", + "o:redhat:devtools-eclipse:2021-2.z", + "o:redhat:devtools-eclipse:2021-3", + "o:redhat:devworkspace_operator:0", + "o:redhat:directory_server:10", + "o:redhat:directory_server:10.1", + "o:redhat:directory_server:10.2", + "o:redhat:directory_server:11", + "o:redhat:directory_server:11.0", + "o:redhat:directory_server:11.1", + "o:redhat:directory_server:11.2", + "o:redhat:directory_server:11.3", + "o:redhat:directory_server:11.4", + "o:redhat:directory_server:11.5", + "o:redhat:directory_server:11.6", + "o:redhat:directory_server:12", + "o:redhat:directory_server:12.0", + "o:redhat:directory_server:12.1", + "o:redhat:directory_server:8", + "o:redhat:directory_server:9", + "o:redhat:directory_server:9.1", + "o:redhat:dotnet-1.0-default:", + "o:redhat:dotnet-1.1-default:", + "o:redhat:dotnet-2.0-default:", + "o:redhat:dotnet-2.1-default:", + "o:redhat:dotnet-2.2-default:", + "o:redhat:dotnet-3.0-default:", + "o:redhat:dotnet-5.0-default:", + "o:redhat:dotnet:1.0", + "o:redhat:dotnet:1.1", + "o:redhat:dotnet:2.0", + "o:redhat:dotnet:2.1", + "o:redhat:dotnet:2.2", + "o:redhat:dotnet:3.0", + "o:redhat:dotnet:3.1", + "o:redhat:dotnet:5.0", + "o:redhat:dotnet:6.0", + "o:redhat:dts-6-default:", + "o:redhat:dts:10.1.z", + "o:redhat:dts:11.0", + "o:redhat:dts:11.0.z", + "o:redhat:dts:11.1", + "o:redhat:dts:11.1.z", + "o:redhat:dts:12.0", + "o:redhat:dts:12.0.z", + "o:redhat:dts:12.1", + "o:redhat:dts:12.1.z", + "o:redhat:dts:3.1", + "o:redhat:dts:4.1", + "o:redhat:dts:6", + "o:redhat:dts:7", + "o:redhat:dts:7.0.z", + "o:redhat:dts:7.1", + "o:redhat:dts:7.1.z", + "o:redhat:eap-6.3.x:", + "o:redhat:eap:4", + "o:redhat:eap:5.2.0", + "o:redhat:eap:6.0.0", + "o:redhat:eap:6.0.1", + "o:redhat:eap:6.1.0", + "o:redhat:eap:6.1.1", + "o:redhat:eap:6.2.0", + "o:redhat:eap:6.2.1", + "o:redhat:eap:6.2.2", + "o:redhat:eap:6.2.3", + "o:redhat:eap:6.2.4", + "o:redhat:eap:6.3.0", + "o:redhat:eap:6.3.1", + "o:redhat:eap:6.3.2", + "o:redhat:eap:6.3.3", + "o:redhat:eap:6.3.z", + "o:redhat:eap:6.4.0", + "o:redhat:eap:6.4.1", + "o:redhat:eap:6.4.10", + "o:redhat:eap:6.4.11", + "o:redhat:eap:6.4.12", + "o:redhat:eap:6.4.13", + "o:redhat:eap:6.4.14", + "o:redhat:eap:6.4.15", + "o:redhat:eap:6.4.16", + "o:redhat:eap:6.4.17", + "o:redhat:eap:6.4.18", + "o:redhat:eap:6.4.19", + "o:redhat:eap:6.4.2", + "o:redhat:eap:6.4.20", + "o:redhat:eap:6.4.21", + "o:redhat:eap:6.4.22", + "o:redhat:eap:6.4.23", + "o:redhat:eap:6.4.3", + "o:redhat:eap:6.4.4", + "o:redhat:eap:6.4.6", + "o:redhat:eap:6.4.7", + "o:redhat:eap:6.4.8", + "o:redhat:eap:6.4.9", + "o:redhat:eap:6.4.z", + "o:redhat:eap:7.0.0", + "o:redhat:eap:7.0.1", + "o:redhat:eap:7.0.2", + "o:redhat:eap:7.0.3", + "o:redhat:eap:7.0.4", + "o:redhat:eap:7.0.5", + "o:redhat:eap:7.0.6", + "o:redhat:eap:7.0.7", + "o:redhat:eap:7.0.8", + "o:redhat:eap:7.0.9", + "o:redhat:eap:7.1.0", + "o:redhat:eap:7.1.1", + "o:redhat:eap:7.1.2", + "o:redhat:eap:7.1.3", + "o:redhat:eap:7.1.4", + "o:redhat:eap:7.1.5", + "o:redhat:eap:7.1.z", + "o:redhat:eap:7.2.0", + "o:redhat:eap:7.2.1", + "o:redhat:eap:7.2.2", + "o:redhat:eap:7.2.3", + "o:redhat:eap:7.2.4", + "o:redhat:eap:7.2.5", + "o:redhat:eap:7.2.6", + "o:redhat:eap:7.2.7", + "o:redhat:eap:7.2.8", + "o:redhat:eap:7.2.z", + "o:redhat:eap:7.3.0", + "o:redhat:eap:7.3.1", + "o:redhat:eap:7.3.2", + "o:redhat:eap:7.3.z", + "o:redhat:eap:7.4.z", + "o:redhat:eapcd:", + "o:redhat:eapxp:1", + "o:redhat:eapxp:2", + "o:redhat:eapxp:3", + "o:redhat:eapxp:4", + "o:redhat:epp:4.3.0", + "o:redhat:epp:5.2.2", + "o:redhat:fdp-el7-default:", + "o:redhat:fdp-el7-ovs:", + "o:redhat:fdp-el8-ovs:", + "o:redhat:fdp-el:7", + "o:redhat:fdp-el:9", + "o:redhat:fis:2.0", + "o:redhat:fsw-6.0.x:", + "o:redhat:fsw-6.2.x:", + "o:redhat:fsw:6", + "o:redhat:fsw:6.0.0", + "o:redhat:fsw:6.1.0", + "o:redhat:fsw:6.2.1", + "o:redhat:fuse:6.2.1", + "o:redhat:fuse:6.3.0", + "o:redhat:fuse:7", + "o:redhat:fuse:7.0.0", + "o:redhat:fuse:7.1.0", + "o:redhat:fuse:7.2.0", + "o:redhat:fuse:7.3.0", + "o:redhat:fuse:7.3.1", + "o:redhat:fuse:7.4.0", + "o:redhat:gitops:1", + "o:redhat:gitops:1.1.z", + "o:redhat:gitops:1.2", + "o:redhat:gitops:1.2.z", + "o:redhat:gitops:1.3.z", + "o:redhat:gitops:1.4.z", + "o:redhat:gitops:1.5.z", + "o:redhat:gitops:1.6.z", + "o:redhat:gitops:1.7", + "o:redhat:jaeger-operator:1.16.0", + "o:redhat:jaeger-operator:1.17.0", + "o:redhat:jaeger-operator:1.17.1", + "o:redhat:jaeger-operator:1.17.6", + "o:redhat:jaeger:1.17.9", + "o:redhat:jaeger:1.20.0", + "o:redhat:jaeger:1.20.3", + "o:redhat:jaeger:1.20.4", + "o:redhat:jaeger:1.24", + "o:redhat:jaeger:1.26", + "o:redhat:jbcs-httpd-2.4.23-sp:1", + "o:redhat:jbcs-httpd-2.4.23-sp:2", + "o:redhat:jbcs-httpd-2.4.23-sp:3", + "o:redhat:jbcs-httpd-2.4.23-sp:4", + "o:redhat:jbcs-httpd-2.4.23-sp:5", + "o:redhat:jbcs-httpd-2.4.29-sp2-native:", + "o:redhat:jbcs-httpd-2.4.29-sp2-rhel:", + "o:redhat:jbcs-httpd-2.4.29-sp:1", + "o:redhat:jbcs-httpd:2.4", + "o:redhat:jbcs-httpd:2.4.23", + "o:redhat:jbcs-httpd:2.4.29", + "o:redhat:jbcs-httpd:2.4.6", + "o:redhat:jbcs:1", + "o:redhat:jbcs:1.0.0", + "o:redhat:jbds:10.4", + "o:redhat:jbds:11.0", + "o:redhat:jbds:8.1", + "o:redhat:jbds:9.1", + "o:redhat:jbews:1.0.2", + "o:redhat:jbews:2.0.1", + "o:redhat:jbews:2.1.0", + "o:redhat:jbews:2.1.1", + "o:redhat:jbews:2.1.2", + "o:redhat:jbews:3.0.0", + "o:redhat:jbews:3.0.1", + "o:redhat:jbews:3.0.2", + "o:redhat:jbews:3.0.3", + "o:redhat:jdg-6.4.x:", + "o:redhat:jdg:6.2.1", + "o:redhat:jdg:6.3.0", + "o:redhat:jdg:6.3.1", + "o:redhat:jdg:6.4.0", + "o:redhat:jdg:6.5.0", + "o:redhat:jdg:6.5.1", + "o:redhat:jdg:6.6.0", + "o:redhat:jdg:6.6.1", + "o:redhat:jdg:6.6.2", + "o:redhat:jdg:7", + "o:redhat:jdg:7.0.0", + "o:redhat:jdg:7.0.1", + "o:redhat:jdg:7.1.0", + "o:redhat:jdg:7.1.1", + "o:redhat:jdg:7.1.2", + "o:redhat:jdg:7.2.0", + "o:redhat:jdg:7.2.1", + "o:redhat:jdg:7.3.0", + "o:redhat:jdg:7.3.1", + "o:redhat:jdg:7.3.2", + "o:redhat:jdg:8", + "o:redhat:jdv-6.0.x:", + "o:redhat:jdv-6.1.x:", + "o:redhat:jdv-6.2.x:", + "o:redhat:jdv-6.3.x:", + "o:redhat:jdv-6.4.x:", + "o:redhat:jdv:6.0.0", + "o:redhat:jdv:6.1.4", + "o:redhat:jdv:6.2.1", + "o:redhat:jdv:6.2.4", + "o:redhat:jdv:6.3.0", + "o:redhat:jdv:6.4.0", + "o:redhat:jdv:6.4.6", + "o:redhat:jdv:6.4.7", + "o:redhat:jon-3.3.x:", + "o:redhat:jon:2", + "o:redhat:jon:2.4.2", + "o:redhat:jon:3.1", + "o:redhat:jon:3.2.0", + "o:redhat:jon:3.2.1", + "o:redhat:jon:3.2.2", + "o:redhat:jon:3.2.3", + "o:redhat:jon:3.3.0", + "o:redhat:jon:3.3.4", + "o:redhat:jon:3.3.5", + "o:redhat:jon:3.3.6", + "o:redhat:jon:3.3.7", + "o:redhat:jon:3.3.8", + "o:redhat:jon:3.4.0", + "o:redhat:jpp-6.2.x:", + "o:redhat:jpp:6.0.0", + "o:redhat:jpp:6.1.0", + "o:redhat:jpp:6.1.1", + "o:redhat:jpp:6.2.0", + "o:redhat:jpp:6.3.0", + "o:redhat:jws-5.0.0-native:", + "o:redhat:jws-5.0.0-rhel:", + "o:redhat:jws:3.1", + "o:redhat:jws:3.1.0", + "o:redhat:jws:3.1.1", + "o:redhat:jws:3.1.2", + "o:redhat:jws:3.1.3", + "o:redhat:jws:5", + "o:redhat:kmm:1", + "o:redhat:maistra:0.11.0", + "o:redhat:maistra:0.12.0", + "o:redhat:maistra:0.9.0", + "o:redhat:maistra:0.9.1", + "o:redhat:maistra:1.0.0", + "o:redhat:maistra:1.0.1", + "o:redhat:maistra:1.0.10", + "o:redhat:maistra:1.0.11", + "o:redhat:maistra:1.0.2", + "o:redhat:maistra:1.0.4", + "o:redhat:maistra:1.0.5", + "o:redhat:maistra:1.0.7", + "o:redhat:maistra:1.1.0", + "o:redhat:maistra:1.1.3", + "o:redhat:managed-services-pssvcs:", + "o:redhat:mrg-m:3.0.0", + "o:redhat:mrg:1.1", + "o:redhat:mrg:1.2", + "o:redhat:mrg:1.3", + "o:redhat:mrg:2", + "o:redhat:mrg:2.0", + "o:redhat:mrg:2.1", + "o:redhat:mrg:2.2", + "o:redhat:mrg:2.3", + "o:redhat:mrg:2.3.z", + "o:redhat:mrg:2.4", + "o:redhat:mrg:2.4.z", + "o:redhat:mrg:2.5", + "o:redhat:mrg:2.5.z", + "o:redhat:mta:5.3", + "o:redhat:mta:6.0", + "o:redhat:mtc:1.3", + "o:redhat:mtc:1.4", + "o:redhat:mtc:1.5", + "o:redhat:mtc:1.6", + "o:redhat:mtc:1.7", + "o:redhat:mtr:1.0", + "o:redhat:mtv:2.0", + "o:redhat:mtv:2.1", + "o:redhat:mtv:2.2", + "o:redhat:mtv:2.3", + "o:redhat:nhc:", + "o:redhat:nhc:0.1.z", + "o:redhat:nhc:0.2.z", + "o:redhat:nhc:0.3.z", + "o:redhat:nmo:", + "o:redhat:nmo:4.10", + "o:redhat:nmo:4.11", + "o:redhat:noo:1", + "o:redhat:oadp:1", + "o:redhat:oadp:1.0", + "o:redhat:oadp:1.1", + "o:redhat:ocp-tools:4", + "o:redhat:ocp-tools:4.10", + "o:redhat:ocp-tools:4.11", + "o:redhat:ocp-tools:4.3", + "o:redhat:ocp-tools:4.4", + "o:redhat:ocp-tools:4.5", + "o:redhat:ocp-tools:4.6", + "o:redhat:ocp-tools:4.7", + "o:redhat:ocp-tools:4.8", + "o:redhat:ocp-tools:4.9", + "o:redhat:ocs:3", + "o:redhat:omr:1", + "o:redhat:openjdk:1.8", + "o:redhat:openjdk:11", + "o:redhat:openjdk:17", + "o:redhat:openshift-4.2-default:", + "o:redhat:openshift-4.3-default:", + "o:redhat:openshift-4.4-default:", + "o:redhat:openshift-container-storage-4.2-default:", + "o:redhat:openshift-container-storage:4", + "o:redhat:openshift-container-storage:4.2", + "o:redhat:openshift-container-storage:4.3", + "o:redhat:openshift-container-storage:4.3.z", + "o:redhat:openshift-container-storage:4.4", + "o:redhat:openshift-container-storage:4.4.z", + "o:redhat:openshift-container-storage:4.5", + "o:redhat:openshift-container-storage:4.5.z", + "o:redhat:openshift-container-storage:4.6", + "o:redhat:openshift-container-storage:4.6.z", + "o:redhat:openshift-container-storage:4.7", + "o:redhat:openshift-container-storage:4.7.z", + "o:redhat:openshift-container-storage:4.8", + "o:redhat:openshift-container-storage:4.8.z", + "o:redhat:openshift-container-storage:4.9", + "o:redhat:openshift-data-foundation:4.10", + "o:redhat:openshift-data-foundation:4.10.z", + "o:redhat:openshift-data-foundation:4.11", + "o:redhat:openshift-data-foundation:4.11.z", + "o:redhat:openshift-data-foundation:4.12", + "o:redhat:openshift-data-foundation:4.9", + "o:redhat:openshift-data-foundation:4.9.z", + "o:redhat:openshift-enterprise-3.11-default:", + "o:redhat:openshift-enterprise-4.1-default:", + "o:redhat:openshift-enterprise:1", + "o:redhat:openshift-enterprise:2.0", + "o:redhat:openshift-enterprise:2.1", + "o:redhat:openshift-enterprise:2.2", + "o:redhat:openshift-enterprise:3.0", + "o:redhat:openshift-enterprise:3.0.z", + "o:redhat:openshift-enterprise:3.1", + "o:redhat:openshift-enterprise:3.1.z", + "o:redhat:openshift-enterprise:3.10", + "o:redhat:openshift-enterprise:3.10.z", + "o:redhat:openshift-enterprise:3.11", + "o:redhat:openshift-enterprise:3.11.z", + "o:redhat:openshift-enterprise:3.2", + "o:redhat:openshift-enterprise:3.2.z", + "o:redhat:openshift-enterprise:3.3", + "o:redhat:openshift-enterprise:3.3.z", + "o:redhat:openshift-enterprise:3.4", + "o:redhat:openshift-enterprise:3.4.z", + "o:redhat:openshift-enterprise:3.5", + "o:redhat:openshift-enterprise:3.5.z", + "o:redhat:openshift-enterprise:3.6", + "o:redhat:openshift-enterprise:3.6.z", + "o:redhat:openshift-enterprise:3.7", + "o:redhat:openshift-enterprise:3.7.z", + "o:redhat:openshift-enterprise:3.8", + "o:redhat:openshift-enterprise:3.8.z", + "o:redhat:openshift-enterprise:3.9", + "o:redhat:openshift-enterprise:3.9.z", + "o:redhat:openshift-enterprise:4.1", + "o:redhat:openshift-enterprise:4.1.z", + "o:redhat:openshift-hosted-aro:3", + "o:redhat:openshift-hosted-aro:4", + "o:redhat:openshift-hosted-osd:3", + "o:redhat:openshift-hosted-osd:4", + "o:redhat:openshift-hosted-osio:3", + "o:redhat:openshift-hosted-oso-pro:3", + "o:redhat:openshift-hosted-oso-starter4-default:", + "o:redhat:openshift-hosted-oso-starter:4", + "o:redhat:openshift-logging:5", + "o:redhat:openshift-logging:5.0", + "o:redhat:openshift-logging:5.1", + "o:redhat:openshift-logging:5.2", + "o:redhat:openshift-logging:5.3", + "o:redhat:openshift-logging:5.4", + "o:redhat:openshift-logging:5.5", + "o:redhat:openshift:4.10", + "o:redhat:openshift:4.10.z", + "o:redhat:openshift:4.11", + "o:redhat:openshift:4.11.z", + "o:redhat:openshift:4.12", + "o:redhat:openshift:4.12.z", + "o:redhat:openshift:4.13", + "o:redhat:openshift:4.2", + "o:redhat:openshift:4.2.z", + "o:redhat:openshift:4.3", + "o:redhat:openshift:4.3.z", + "o:redhat:openshift:4.4", + "o:redhat:openshift:4.4.z", + "o:redhat:openshift:4.5", + "o:redhat:openshift:4.5.z", + "o:redhat:openshift:4.6", + "o:redhat:openshift:4.6.z", + "o:redhat:openshift:4.7", + "o:redhat:openshift:4.7.z", + "o:redhat:openshift:4.8", + "o:redhat:openshift:4.8.z", + "o:redhat:openshift:4.9", + "o:redhat:openshift:4.9.z", + "o:redhat:openstack-10-default:", + "o:redhat:openstack-10-optools-default:", + "o:redhat:openstack-10-optools:", + "o:redhat:openstack-11-default:", + "o:redhat:openstack-11-optools-default:", + "o:redhat:openstack-11-optools:", + "o:redhat:openstack-12-default:", + "o:redhat:openstack-12-optools-default:", + "o:redhat:openstack-12-optools:", + "o:redhat:openstack-13-default:", + "o:redhat:openstack-13-els:", + "o:redhat:openstack-13-optools-default:", + "o:redhat:openstack-13-optools:", + "o:redhat:openstack-14-default:", + "o:redhat:openstack-14-optools-default:", + "o:redhat:openstack-14-optools:", + "o:redhat:openstack-15-default:", + "o:redhat:openstack-16-default:", + "o:redhat:openstack-5-rhel:6", + "o:redhat:openstack-5-rhel:7", + "o:redhat:openstack-6-installer:", + "o:redhat:openstack-7-default:", + "o:redhat:openstack-7-director-default:", + "o:redhat:openstack-7-director-els:", + "o:redhat:openstack-7-director:", + "o:redhat:openstack-7-els:", + "o:redhat:openstack-7-optools-default:", + "o:redhat:openstack-7-optools-els:", + "o:redhat:openstack-7-optools:", + "o:redhat:openstack-8-default:", + "o:redhat:openstack-8-director-default:", + "o:redhat:openstack-8-director:", + "o:redhat:openstack-8-optools-default:", + "o:redhat:openstack-8-optools:", + "o:redhat:openstack-9-default:", + "o:redhat:openstack-9-director-default:", + "o:redhat:openstack-9-director:", + "o:redhat:openstack-9-optools-default:", + "o:redhat:openstack-9-optools:", + "o:redhat:openstack-foreman:", + "o:redhat:openstack:10", + "o:redhat:openstack:11", + "o:redhat:openstack:12", + "o:redhat:openstack:13", + "o:redhat:openstack:14", + "o:redhat:openstack:15", + "o:redhat:openstack:16", + "o:redhat:openstack:16.1", + "o:redhat:openstack:16.2", + "o:redhat:openstack:17.0", + "o:redhat:openstack:3", + "o:redhat:openstack:4", + "o:redhat:openstack:6", + "o:redhat:openstack:7", + "o:redhat:openstack:8", + "o:redhat:openstack:9", + "o:redhat:ossm:2.0.0", + "o:redhat:ossm:2.1", + "o:redhat:ossm:2.2", + "o:redhat:ossm:2.3", + "o:redhat:osso:1", + "o:redhat:pipelines:1", + "o:redhat:pipelines:1.4.z", + "o:redhat:pipelines:1.5", + "o:redhat:pipelines:1.6.2", + "o:redhat:pipelines:1.7", + "o:redhat:pipelines:1.7.1", + "o:redhat:pipelines:1.8", + "o:redhat:pipelines:1.8.1", + "o:redhat:pipelines:1.9", + "o:redhat:qci:1.0", + "o:redhat:qci:1.1", + "o:redhat:qci:1.2", + "o:redhat:quarkus:1", + "o:redhat:quarkus:2", + "o:redhat:quay-3.0-default:", + "o:redhat:quay-io:3", + "o:redhat:quay:2.9", + "o:redhat:quay:3", + "o:redhat:quay:3.0", + "o:redhat:quay:3.1", + "o:redhat:quay:3.2", + "o:redhat:quay:3.3", + "o:redhat:quay:3.4", + "o:redhat:quay:3.5", + "o:redhat:quay:3.6", + "o:redhat:quay:3.7", + "o:redhat:quay:3.8", + "o:redhat:red_hat_discovery:1.0", + "o:redhat:rhacm:1", + "o:redhat:rhacm:1.0.z", + "o:redhat:rhacm:2", + "o:redhat:rhacm:2.0.z", + "o:redhat:rhacm:2.1", + "o:redhat:rhacm:2.1.z", + "o:redhat:rhacm:2.2", + "o:redhat:rhacm:2.2.z", + "o:redhat:rhacm:2.3", + "o:redhat:rhacm:2.3.z", + "o:redhat:rhacm:2.4", + "o:redhat:rhacm:2.4.z", + "o:redhat:rhacm:2.5", + "o:redhat:rhacm:2.5.z", + "o:redhat:rhacm:2.6", + "o:redhat:rhacm:2.6.z", + "o:redhat:rhacm:2.7", + "o:redhat:rhacs:1", + "o:redhat:rhacs:3", + "o:redhat:rhacs:3.70", + "o:redhat:rhacs:3.71", + "o:redhat:rhacs:3.72", + "o:redhat:rhacs:3.73", + "o:redhat:rhai:1", + "o:redhat:rhapi:1", + "o:redhat:rhbop:8", + "o:redhat:rhbq:1", + "o:redhat:rhcam:1.2", + "o:redhat:rhcertification:6", + "o:redhat:rhcertification:7", + "o:redhat:rhcertification:8", + "o:redhat:rhdm:7", + "o:redhat:rhdm:7.0.0", + "o:redhat:rhdm:7.0.1", + "o:redhat:rhdm:7.1.0", + "o:redhat:rhdm:7.1.1", + "o:redhat:rhdm:7.2.0", + "o:redhat:rhdm:7.2.1", + "o:redhat:rhdm:7.3.0", + "o:redhat:rhdm:7.3.1", + "o:redhat:rhdm:7.4.0", + "o:redhat:rhdts:10.0.z", + "o:redhat:rhdts:10.1.0", + "o:redhat:rhdts:8", + "o:redhat:rhdts:8.0.z", + "o:redhat:rhdts:8.1.0", + "o:redhat:rhdts:8.1.z", + "o:redhat:rhdts:9", + "o:redhat:rhdts:9.0.0", + "o:redhat:rhdts:9.0.z", + "o:redhat:rhdts:9.1.0", + "o:redhat:rhdts:9.1.z", + "o:redhat:rhel-5-els:", + "o:redhat:rhel-6-els:", + "o:redhat:rhel-alt:7", + "o:redhat:rhel-alt:7.4", + "o:redhat:rhel-alt:7.4.z", + "o:redhat:rhel-alt:7.5", + "o:redhat:rhel-alt:7.5.z", + "o:redhat:rhel-alt:7.6", + "o:redhat:rhel-alt:7.6.z", + "o:redhat:rhel-alt:7.7", + "o:redhat:rhel-av:8.0", + "o:redhat:rhel-av:8.0.0.z", + "o:redhat:rhel-av:8.0.1", + "o:redhat:rhel-av:8.0.1.z", + "o:redhat:rhel-av:8.1.0", + "o:redhat:rhel-av:8.1.0.z", + "o:redhat:rhel-av:8.1.1", + "o:redhat:rhel-av:8.1.1.z", + "o:redhat:rhel-av:8.2.0", + "o:redhat:rhel-av:8.2.0.z", + "o:redhat:rhel-av:8.2.1", + "o:redhat:rhel-av:8.2.1.z", + "o:redhat:rhel-av:8.3.0", + "o:redhat:rhel-av:8.3.0.z", + "o:redhat:rhel-av:8.3.1", + "o:redhat:rhel-av:8.3.1.z", + "o:redhat:rhel-av:8.4.0", + "o:redhat:rhel-av:8.4.0.z", + "o:redhat:rhel-av:8.5.0", + "o:redhat:rhel-av:8.5.0.z", + "o:redhat:rhel-av:8.6.0", + "o:redhat:rhel-br:8", + "o:redhat:rhel-br:8.0", + "o:redhat:rhel-br:8.0.0.z", + "o:redhat:rhel-br:8.1.0", + "o:redhat:rhel-br:8.1.0.z", + "o:redhat:rhel-br:8.2.0", + "o:redhat:rhel-br:8.2.0.z", + "o:redhat:rhel-br:8.3.0", + "o:redhat:rhel-br:8.3.0.z", + "o:redhat:rhel-br:8.4.0", + "o:redhat:rhel-br:8.4.0.z", + "o:redhat:rhel-br:8.5.0", + "o:redhat:rhel-br:8.5.0.z", + "o:redhat:rhel-br:8.6.0", + "o:redhat:rhel-br:8.6.0.z", + "o:redhat:rhel-br:8.7.0", + "o:redhat:rhel-br:8.7.0.z", + "o:redhat:rhel-br:8.8.0", + "o:redhat:rhel-br:9", + "o:redhat:rhel-br:9.0", + "o:redhat:rhel-br:9.0.0.z", + "o:redhat:rhel-br:9.1.0", + "o:redhat:rhel-br:9.1.0.z", + "o:redhat:rhel-br:9.2.0", + "o:redhat:rhel:4.5", + "o:redhat:rhel:4.5.z", + "o:redhat:rhel:4.6", + "o:redhat:rhel:4.6.z", + "o:redhat:rhel:4.7", + "o:redhat:rhel:4.7.z", + "o:redhat:rhel:4.8", + "o:redhat:rhel:4.8.z", + "o:redhat:rhel:4.9", + "o:redhat:rhel:5.0", + "o:redhat:rhel:5.0.z", + "o:redhat:rhel:5.1", + "o:redhat:rhel:5.1.z", + "o:redhat:rhel:5.10", + "o:redhat:rhel:5.10.z", + "o:redhat:rhel:5.11", + "o:redhat:rhel:5.11.z", + "o:redhat:rhel:5.2", + "o:redhat:rhel:5.2.z", + "o:redhat:rhel:5.3", + "o:redhat:rhel:5.3.z", + "o:redhat:rhel:5.4", + "o:redhat:rhel:5.4.z", + "o:redhat:rhel:5.5", + "o:redhat:rhel:5.5.z", + "o:redhat:rhel:5.6", + "o:redhat:rhel:5.6.z", + "o:redhat:rhel:5.7", + "o:redhat:rhel:5.7.z", + "o:redhat:rhel:5.8", + "o:redhat:rhel:5.8.z", + "o:redhat:rhel:5.9", + "o:redhat:rhel:5.9.z", + "o:redhat:rhel:6", + "o:redhat:rhel:6.0", + "o:redhat:rhel:6.0.z", + "o:redhat:rhel:6.1", + "o:redhat:rhel:6.1.z", + "o:redhat:rhel:6.10", + "o:redhat:rhel:6.10.z", + "o:redhat:rhel:6.2", + "o:redhat:rhel:6.2.z", + "o:redhat:rhel:6.3", + "o:redhat:rhel:6.3.z", + "o:redhat:rhel:6.4", + "o:redhat:rhel:6.4.z", + "o:redhat:rhel:6.5", + "o:redhat:rhel:6.5.z", + "o:redhat:rhel:6.6", + "o:redhat:rhel:6.6.z", + "o:redhat:rhel:6.7", + "o:redhat:rhel:6.7.z", + "o:redhat:rhel:6.8", + "o:redhat:rhel:6.8.z", + "o:redhat:rhel:6.9", + "o:redhat:rhel:6.9.z", + "o:redhat:rhel:7.0", + "o:redhat:rhel:7.0.z", + "o:redhat:rhel:7.1", + "o:redhat:rhel:7.1.z", + "o:redhat:rhel:7.2", + "o:redhat:rhel:7.2.z", + "o:redhat:rhel:7.3", + "o:redhat:rhel:7.3.z", + "o:redhat:rhel:7.4", + "o:redhat:rhel:7.4.z", + "o:redhat:rhel:7.5", + "o:redhat:rhel:7.5.z", + "o:redhat:rhel:7.6", + "o:redhat:rhel:7.6.z", + "o:redhat:rhel:7.7", + "o:redhat:rhel:7.7.z", + "o:redhat:rhel:7.8", + "o:redhat:rhel:7.8.z", + "o:redhat:rhel:7.9", + "o:redhat:rhel:7.9.z", + "o:redhat:rhel:8.0", + "o:redhat:rhel:8.0.0.z", + "o:redhat:rhel:8.0.1.z", + "o:redhat:rhel:8.1.0", + "o:redhat:rhel:8.1.0.z", + "o:redhat:rhel:8.1.1", + "o:redhat:rhel:8.1.1.z", + "o:redhat:rhel:8.2.0", + "o:redhat:rhel:8.2.0.z", + "o:redhat:rhel:8.2.1", + "o:redhat:rhel:8.2.1.z", + "o:redhat:rhel:8.3.0", + "o:redhat:rhel:8.3.0.z", + "o:redhat:rhel:8.3.1", + "o:redhat:rhel:8.3.1.z", + "o:redhat:rhel:8.4.0", + "o:redhat:rhel:8.4.0.z", + "o:redhat:rhel:8.5.0", + "o:redhat:rhel:8.5.0.z", + "o:redhat:rhel:8.6.0", + "o:redhat:rhel:8.6.0.z", + "o:redhat:rhel:8.7.0", + "o:redhat:rhel:8.7.0.z", + "o:redhat:rhel:8.8.0", + "o:redhat:rhel:9", + "o:redhat:rhel:9.0", + "o:redhat:rhel:9.0.0.z", + "o:redhat:rhel:9.1.0", + "o:redhat:rhel:9.1.0.z", + "o:redhat:rhel:9.2.0", + "o:redhat:rhelsa:7.1", + "o:redhat:rhelsa:7.2", + "o:redhat:rhes:2.0", + "o:redhat:rhes:2.1", + "o:redhat:rhes:3.0", + "o:redhat:rhes:3.1", + "o:redhat:rhes:3.2", + "o:redhat:rhes:3.3", + "o:redhat:rhes:3.4", + "o:redhat:rhes:3.5", + "o:redhat:rhev-m:2.2.9", + "o:redhat:rhev-m:2.2.z", + "o:redhat:rhev-m:3.0.z", + "o:redhat:rhev-m:3.1", + "o:redhat:rhev-m:3.1.z", + "o:redhat:rhev-m:3.2", + "o:redhat:rhev-m:3.2.z", + "o:redhat:rhev-m:3.3", + "o:redhat:rhev-m:3.3.z", + "o:redhat:rhev-m:3.4", + "o:redhat:rhev-m:3.4.z", + "o:redhat:rhev-m:3.5", + "o:redhat:rhev-m:3.5.z", + "o:redhat:rhev-m:3.6", + "o:redhat:rhev-m:3.6.z", + "o:redhat:rhev-m:4.0.0", + "o:redhat:rhev-m:4.0.z", + "o:redhat:rhev-m:4.1.z", + "o:redhat:rhev-m:4.2.0", + "o:redhat:rhev-m:4.2.z", + "o:redhat:rhev-m:4.3.0", + "o:redhat:rhev-m:4.3.z", + "o:redhat:rhev-m:4.4.0", + "o:redhat:rhev-m:4.4.z", + "o:redhat:rhint-camel-k:1", + "o:redhat:rhint-camel-quarkus:1", + "o:redhat:rhint-camel-spring-boot:3", + "o:redhat:rhint-debezium:1", + "o:redhat:rhint-dv:1", + "o:redhat:rhint-operator:1", + "o:redhat:rhint-serv:1", + "o:redhat:rhint-serv:2", + "o:redhat:rhivos:1.0", + "o:redhat:rhmap:4.1.0", + "o:redhat:rhmap:4.3.1", + "o:redhat:rhmap:4.4.1", + "o:redhat:rhmap:4.5.0", + "o:redhat:rhmap:4.6.0", + "o:redhat:rhmap:4.7.0", + "o:redhat:rhmi-default:", + "o:redhat:rhmi-v2-default:", + "o:redhat:rhn_satellite:5", + "o:redhat:rhn_satellite:5.6", + "o:redhat:rhn_satellite:5.7", + "o:redhat:rhn_satellite:5.8", + "o:redhat:rhn_satellite:6", + "o:redhat:rhn_satellite:6.1", + "o:redhat:rhn_satellite:6.10", + "o:redhat:rhn_satellite:6.11", + "o:redhat:rhn_satellite:6.12", + "o:redhat:rhn_satellite:6.13", + "o:redhat:rhn_satellite:6.2", + "o:redhat:rhn_satellite:6.3", + "o:redhat:rhn_satellite:6.4", + "o:redhat:rhn_satellite:6.5", + "o:redhat:rhn_satellite:6.6", + "o:redhat:rhn_satellite:6.7", + "o:redhat:rhn_satellite:6.8", + "o:redhat:rhn_satellite:6.9", + "o:redhat:rhn_satellite_6-default:", + "o:redhat:rhoar-nodejs:10.4.1", + "o:redhat:rhoar-nodejs:8", + "o:redhat:rhoar-nodejs:8.11.2", + "o:redhat:rhoar-nodejs:8.9.4", + "o:redhat:rhos_devspaces:3", + "o:redhat:rhosc:1", + "o:redhat:rhoscts:", + "o:redhat:rhosdt:2", + "o:redhat:rhpam:7", + "o:redhat:rhpam:7.0.0", + "o:redhat:rhpam:7.0.1", + "o:redhat:rhpam:7.0.2", + "o:redhat:rhpam:7.1.0", + "o:redhat:rhpam:7.1.1", + "o:redhat:rhpam:7.2.0", + "o:redhat:rhpam:7.2.1", + "o:redhat:rhpam:7.3.0", + "o:redhat:rhpam:7.3.1", + "o:redhat:rhpam:7.4.0", + "o:redhat:rhscl:1.0", + "o:redhat:rhscl:1.0.z", + "o:redhat:rhscl:1.1", + "o:redhat:rhscl:1.1.z", + "o:redhat:rhscl:1.2", + "o:redhat:rhscl:1.2.z", + "o:redhat:rhscl:2.0", + "o:redhat:rhscl:2.0.z", + "o:redhat:rhscl:2.1", + "o:redhat:rhscl:2.1.z", + "o:redhat:rhscl:2.2", + "o:redhat:rhscl:2.2.z", + "o:redhat:rhscl:2.3", + "o:redhat:rhscl:2.3.z", + "o:redhat:rhscl:2.4", + "o:redhat:rhscl:2.4.z", + "o:redhat:rhscl:3.0", + "o:redhat:rhscl:3.0.z", + "o:redhat:rhscl:3.1", + "o:redhat:rhscl:3.1.z", + "o:redhat:rhscl:3.2", + "o:redhat:rhscl:3.2.z", + "o:redhat:rhscl:3.3.0", + "o:redhat:rhscl:3.3.z", + "o:redhat:rhscl:3.4.0", + "o:redhat:rhscl:3.4.z", + "o:redhat:rhscl:3.5.0", + "o:redhat:rhscl:3.5.z", + "o:redhat:rhscl:3.6.0", + "o:redhat:rhscl:3.6.z", + "o:redhat:rhscl:3.7.0", + "o:redhat:rhscl:3.7.z", + "o:redhat:rhscl:3.8.0", + "o:redhat:rhscl:3.8.z", + "o:redhat:rhscl:3.9", + "o:redhat:rhscon-2-default:", + "o:redhat:rhscon:2", + "o:redhat:rhsso:7", + "o:redhat:rhsso:7.0.0", + "o:redhat:rhsso:7.1.0", + "o:redhat:rhsso:7.1.1", + "o:redhat:rhsso:7.1.2", + "o:redhat:rhsso:7.1.3", + "o:redhat:rhsso:7.1.4", + "o:redhat:rhsso:7.2.0", + "o:redhat:rhsso:7.2.1", + "o:redhat:rhsso:7.2.2", + "o:redhat:rhsso:7.2.3", + "o:redhat:rhsso:7.2.4", + "o:redhat:rhsso:7.2.5", + "o:redhat:rhsso:7.2.6", + "o:redhat:rhsso:7.2.7", + "o:redhat:rhsso:7.3.0", + "o:redhat:rhsso:7.3.1", + "o:redhat:rhsso:7.3.2", + "o:redhat:rhui:3.0", + "o:redhat:rhui:3.1", + "o:redhat:rhui:4", + "o:redhat:rosa-cli:1", + "o:redhat:sam:1", + "o:redhat:services-advisor-default:", + "o:redhat:services-ansible-automation-analytics-default:", + "o:redhat:services-ansible-automation-hub-default:", + "o:redhat:services-ansible-on-aws-default:", + "o:redhat:services-ansible-on-clouds-default:", + "o:redhat:services-ansible-on-gcp-default:", + "o:redhat:services-api-management-default:", + "o:redhat:services-appstudio-spi-default:", + "o:redhat:services-assisted-installer-default:", + "o:redhat:services-automation-service-catalog-default:", + "o:redhat:services-ccx-default:", + "o:redhat:services-ciam-default:", + "o:redhat:services-compliance-default:", + "o:redhat:services-cost-management-default:", + "o:redhat:services-database-as-a-service-default:", + "o:redhat:services-developer-sandboxes-default:", + "o:redhat:services-drift-default:", + "o:redhat:services-edge-fleet-management-default:", + "o:redhat:services-eventing-default:", + "o:redhat:services-fifi-default:", + "o:redhat:services-gitops-default:", + "o:redhat:services-hac-default:", + "o:redhat:services-has-default:", + "o:redhat:services-hosted-control-planes:", + "o:redhat:services-image-builder-default:", + "o:redhat:services-insights-essentials-default:", + "o:redhat:services-inventory-default:", + "o:redhat:services-malware-detection-default:", + "o:redhat:services-managed-kafka-default:", + "o:redhat:services-management-platform-default:", + "o:redhat:services-migration-analytics-default:", + "o:redhat:services-notifications-default:", + "o:redhat:services-nvidia-gpu-add-on:", + "o:redhat:services-odf-default:", + "o:redhat:services-openbridge-default:", + "o:redhat:services-openshift-cluster-manager-default:", + "o:redhat:services-openshift-connectors-default:", + "o:redhat:services-openshift-data-federation:", + "o:redhat:services-openshift-smart-events-default:", + "o:redhat:services-package-evolution-default:", + "o:redhat:services-patch-default:", + "o:redhat:services-pipeline-default:", + "o:redhat:services-policies-default:", + "o:redhat:services-quarkus-registry-default:", + "o:redhat:services-resource-optimization-default:", + "o:redhat:services-rhacm-default:", + "o:redhat:services-rhacs:", + "o:redhat:services-rhcert-default:", + "o:redhat:services-rhoc-default:", + "o:redhat:services-rhods-default:", + "o:redhat:services-rhui-v3-aws-default:", + "o:redhat:services-service-registry-default:", + "o:redhat:services-sources-default:", + "o:redhat:services-subscription-central-default:", + "o:redhat:services-subscription-watch-default:", + "o:redhat:services-topological-inventory-default:", + "o:redhat:services-vulnerability-engine-default:", + "o:redhat:services-vulnerability-for-ocp-default:", + "o:redhat:snr:", + "o:redhat:snr:0.4.z", + "o:redhat:soap:4", + "o:redhat:soap:4.2", + "o:redhat:soap:4.3", + "o:redhat:soap:5.3.1", + "o:redhat:springboot:1", + "o:redhat:springboot:1.5.8", + "o:redhat:springboot:2", + "o:redhat:springboot:2.1.3", + "o:redhat:springboot:2.1.6", + "o:redhat:springboot:2.2", + "o:redhat:springboot:2.3", + "o:redhat:springboot:2.4", + "o:redhat:springboot:2.5", + "o:redhat:springboot:2.7", + "o:redhat:srvcom:1", + "o:redhat:stf-1.2-default:", + "o:redhat:stf:1.2", + "o:redhat:stf:1.3", + "o:redhat:stf:1.4", + "o:redhat:swarm:2.2.0", + "o:redhat:swarm:2.4.0", + "o:redhat:swarm:7.0.0", + "o:redhat:swarm:7.0.1", + "o:redhat:swarm:7.1.0", + "o:redhat:thorntail:2", + "o:redhat:thorntail:2.4.0", + "o:redhat:vertx:3", + "o:redhat:vertx:3.4.2", + "o:redhat:vertx:3.5.1", + "o:redhat:vertx:4.0", + "o:redhat:wfk:1.2.0", + "o:redhat:wfk:2.4.0", + "o:redhat:wfk:2.5.0", + "o:redhat:wfk:2.6.0", + "o:redhat:wfk:2.7.0", + "o:redhat:wto:1", + "o:redhat:wto:1.5", +] +product_stream_names = [ + "3amp-2", + "3amp-2.0", + "3amp-2.5", + "3amp-2.7", + "3amp-2.8", + "amq-6", + "amq-6.2.1", + "amq-6.2.1.x", + "amq-6.3.0", + "amq-6.3.0.x", + "amq-7", + "amq-7-LTS", + "amq-7.1.0", + "amq-7.2.3", + "amq-7.2.4", + "amq-7.3.0", + "amq-7.4.0", + "amq-cl-2", + "amq-cl-2.3", + "amq-cl-2.4", + "amq-cl-2.5", + "amq-ic-1", + "amq-ic-2", + "amq-on-1", + "amq-on-1.1", + "amq-on-1.2", + "amq-on-1.3", + "amq-on-1.4", + "amq-st-1", + "amq-st-1.0.0", + "amq-st-1.2.0", + "amq-st-2", + "ansible_automation_platform-1.2", + "ansible_automation_platform-2.0", + "ansible_automation_platform-2.1", + "ansible_automation_platform-2.2", + "ansible_engine-2", + "ansible_engine-2.4", + "ansible_engine-2.5", + "ansible_engine-2.6", + "ansible_engine-2.7", + "ansible_engine-2.8", + "ansible_engine-2.9", + "ansible_tower-3.0", + "ansible_tower-3.1", + "ansible_tower-3.2", + "ansible_tower-3.3", + "ansible_tower-3.4", + "ansible_tower-3.5", + "ansible_tower-3.6", + "ansible_tower-3.7", + "ansible_tower-3.8", + "atomic-7.3", + "bpms-6.0.0", + "bpms-6.0.1", + "bpms-6.0.2", + "bpms-6.0.3", + "bpms-6.0.x", + "bpms-6.1.0", + "bpms-6.1.x", + "bpms-6.2.0", + "bpms-6.2.x", + "bpms-6.3.0", + "bpms-6.3.x", + "bpms-6.4.0", + "bpms-6.4.x", + "bpms-7.0.0", + "brms-5.3.1", + "brms-6.0.0", + "brms-6.0.1", + "brms-6.0.2", + "brms-6.0.3", + "brms-6.0.x", + "brms-6.1.0", + "brms-6.1.x", + "brms-6.2.0", + "brms-6.2.x", + "brms-6.3.0", + "brms-6.3.x", + "brms-6.4.0", + "brms-6.4.x", + "brms-7.0.0", + "ceph-1.1", + "ceph-1.2", + "ceph-1.3", + "ceph-1.3-default", + "ceph-2", + "ceph-2-default", + "ceph-3", + "ceph-4", + "ceph-4-default", + "ceph-5", + "ceph-5-default", + "cert-manager-1", + "certificate_system_10.0", + "certificate_system_10.0.z", + "certificate_system_10.1", + "certificate_system_10.1.z", + "certificate_system_10.2", + "certificate_system_10.2.1", + "certificate_system_10.2.z", + "certificate_system_10.3", + "certificate_system_10.3.z", + "certificate_system_10.4", + "certificate_system_10.4.z", + "certificate_system_10.5", + "certificate_system_8", + "certificate_system_9", + "certificate_system_9.1", + "certificate_system_9.2", + "certificate_system_9.3", + "certificate_system_9.4", + "certificate_system_9.4.z", + "certificate_system_9.5", + "certificate_system_9.6", + "certificate_system_9.6.z", + "certificate_system_9.7", + "certificate_system_9.7.z", + "cfme-5.10", + "cfme-5.11", + "cfme-5.2", + "cfme-5.3", + "cfme-5.4", + "cfme-5.5", + "cfme-5.6", + "cfme-5.7", + "cfme-5.8", + "cfme-5.9", + "cfme-6.0", + "cma-2", + "cnv-1-default", + "cnv-1.4", + "cnv-2-default", + "cnv-2.0", + "cnv-2.1", + "cnv-2.2", + "cnv-2.3", + "cnv-2.4", + "cnv-2.5", + "cnv-2.6", + "cnv-4-default", + "cnv-4.10", + "cnv-4.11", + "cnv-4.12", + "cnv-4.8", + "cnv-4.9", + "codeready_studio-12", + "codeready_ws-1", + "codeready_ws-1-default", + "codeready_ws-2-default", + "convert2rhel-6", + "convert2rhel-7", + "convert2rhel-8", + "cost-management", + "cryostat-2", + "devtools-compilers-2019-3.z", + "devtools-compilers-2019-4", + "devtools-compilers-2019-4.z", + "devtools-compilers-2020-1", + "devtools-compilers-2020-1.z", + "devtools-compilers-2020-2", + "devtools-compilers-2020-2.z", + "devtools-compilers-2020-3", + "devtools-compilers-2020-3.z", + "devtools-compilers-2020-4", + "devtools-compilers-2020-4.z", + "devtools-compilers-2021-1", + "devtools-compilers-2021-1.z", + "devtools-compilers-2021-2", + "devtools-compilers-2021-2.z", + "devtools-compilers-2021-3", + "devtools-compilers-2021-3.z", + "devtools-compilers-2021-4", + "devtools-compilers-2021-4.z", + "devtools-compilers-2022-2", + "devtools-compilers-2022-2.z", + "devtools-compilers-2022-4", + "devtools-compilers-2022-4.z", + "devtools-compilers-2023-2", + "devtools-eclipse", + "devtools-eclipse-2020-3.z", + "devtools-eclipse-2020-4", + "devtools-eclipse-2020-4.z", + "devtools-eclipse-2021-1", + "devtools-eclipse-2021-1.z", + "devtools-eclipse-2021-2", + "devtools-eclipse-2021-2.z", + "devtools-eclipse-2021-3", + "devworkspace_operator-0", + "directory_server_10", + "directory_server_10.1", + "directory_server_10.2", + "directory_server_11", + "directory_server_11.0", + "directory_server_11.1", + "directory_server_11.2", + "directory_server_11.3", + "directory_server_11.4", + "directory_server_11.5", + "directory_server_11.6", + "directory_server_12", + "directory_server_12.0", + "directory_server_12.1", + "directory_server_8", + "directory_server_9", + "directory_server_9.1", + "dotnet-1.0", + "dotnet-1.0-default", + "dotnet-1.1", + "dotnet-1.1-default", + "dotnet-2.0", + "dotnet-2.0-default", + "dotnet-2.1", + "dotnet-2.1-default", + "dotnet-2.2", + "dotnet-2.2-default", + "dotnet-3.0", + "dotnet-3.0-default", + "dotnet-3.1", + "dotnet-5.0", + "dotnet-5.0-default", + "dotnet-6.0", + "dts-10.1.z", + "dts-11.0", + "dts-11.0.z", + "dts-11.1", + "dts-11.1.z", + "dts-12.0", + "dts-12.0.z", + "dts-12.1", + "dts-12.1.z", + "dts-3.1", + "dts-4.1", + "dts-6", + "dts-6-default", + "dts-7", + "dts-7.0.z", + "dts-7.1", + "dts-7.1.z", + "eap-4", + "eap-5.2.0", + "eap-6.0.0", + "eap-6.0.1", + "eap-6.1.0", + "eap-6.1.1", + "eap-6.2.0", + "eap-6.2.1", + "eap-6.2.2", + "eap-6.2.3", + "eap-6.2.4", + "eap-6.3.0", + "eap-6.3.1", + "eap-6.3.2", + "eap-6.3.3", + "eap-6.3.x", + "eap-6.3.z", + "eap-6.4.0", + "eap-6.4.1", + "eap-6.4.10", + "eap-6.4.11", + "eap-6.4.12", + "eap-6.4.13", + "eap-6.4.14", + "eap-6.4.15", + "eap-6.4.16", + "eap-6.4.17", + "eap-6.4.18", + "eap-6.4.19", + "eap-6.4.2", + "eap-6.4.20", + "eap-6.4.21", + "eap-6.4.22", + "eap-6.4.23", + "eap-6.4.3", + "eap-6.4.4", + "eap-6.4.6", + "eap-6.4.7", + "eap-6.4.8", + "eap-6.4.9", + "eap-6.4.z", + "eap-7.0.0", + "eap-7.0.1", + "eap-7.0.2", + "eap-7.0.3", + "eap-7.0.4", + "eap-7.0.5", + "eap-7.0.6", + "eap-7.0.7", + "eap-7.0.8", + "eap-7.0.9", + "eap-7.1.0", + "eap-7.1.1", + "eap-7.1.2", + "eap-7.1.3", + "eap-7.1.4", + "eap-7.1.5", + "eap-7.1.z", + "eap-7.2.0", + "eap-7.2.1", + "eap-7.2.2", + "eap-7.2.3", + "eap-7.2.4", + "eap-7.2.5", + "eap-7.2.6", + "eap-7.2.7", + "eap-7.2.8", + "eap-7.2.z", + "eap-7.3.0", + "eap-7.3.1", + "eap-7.3.2", + "eap-7.3.z", + "eap-7.4.z", + "eapcd", + "eapxp-1", + "eapxp-2", + "eapxp-3", + "eapxp-4", + "epp-4.3.0", + "epp-5.2.2", + "fdp-el7", + "fdp-el7-default", + "fdp-el7-ovs", + "fdp-el8-ovs", + "fdp-el9", + "fis-2.0", + "fsw-6", + "fsw-6.0.0", + "fsw-6.0.x", + "fsw-6.1.0", + "fsw-6.2.1", + "fsw-6.2.x", + "fuse-6.2.1", + "fuse-6.3.0", + "fuse-7", + "fuse-7.0.0", + "fuse-7.1.0", + "fuse-7.2.0", + "fuse-7.3.0", + "fuse-7.3.1", + "fuse-7.4.0", + "gitops-1", + "gitops-1.1.z", + "gitops-1.2", + "gitops-1.2.z", + "gitops-1.3.z", + "gitops-1.4.z", + "gitops-1.5.z", + "gitops-1.6.z", + "gitops-1.7", + "jaeger-1.17.9", + "jaeger-1.20.0", + "jaeger-1.20.3", + "jaeger-1.20.4", + "jaeger-1.24", + "jaeger-1.26", + "jaeger-operator-1.16.0", + "jaeger-operator-1.17.0", + "jaeger-operator-1.17.1", + "jaeger-operator-1.17.6", + "jbcs-1", + "jbcs-1.0.0", + "jbcs-httpd-2.4", + "jbcs-httpd-2.4.23", + "jbcs-httpd-2.4.23-sp1", + "jbcs-httpd-2.4.23-sp2", + "jbcs-httpd-2.4.23-sp3", + "jbcs-httpd-2.4.23-sp4", + "jbcs-httpd-2.4.23-sp5", + "jbcs-httpd-2.4.29", + "jbcs-httpd-2.4.29-sp1", + "jbcs-httpd-2.4.29-sp2-native", + "jbcs-httpd-2.4.29-sp2-rhel", + "jbcs-httpd-2.4.6", + "jbds-10.4", + "jbds-11.0", + "jbds-8.1", + "jbds-9.1", + "jbews-1.0.2", + "jbews-2.0.1", + "jbews-2.1.0", + "jbews-2.1.1", + "jbews-2.1.2", + "jbews-3.0.0", + "jbews-3.0.1", + "jbews-3.0.2", + "jbews-3.0.3", + "jdg-6.2.1", + "jdg-6.3.0", + "jdg-6.3.1", + "jdg-6.4.0", + "jdg-6.4.x", + "jdg-6.5.0", + "jdg-6.5.1", + "jdg-6.6.0", + "jdg-6.6.1", + "jdg-6.6.2", + "jdg-7", + "jdg-7.0.0", + "jdg-7.0.1", + "jdg-7.1.0", + "jdg-7.1.1", + "jdg-7.1.2", + "jdg-7.2.0", + "jdg-7.2.1", + "jdg-7.3.0", + "jdg-7.3.1", + "jdg-7.3.2", + "jdg-8", + "jdv-6.0.0", + "jdv-6.0.x", + "jdv-6.1.4", + "jdv-6.1.x", + "jdv-6.2.1", + "jdv-6.2.4", + "jdv-6.2.x", + "jdv-6.3.0", + "jdv-6.3.x", + "jdv-6.4.0", + "jdv-6.4.6", + "jdv-6.4.7", + "jdv-6.4.x", + "jon-2", + "jon-2.4.2", + "jon-3.1", + "jon-3.2.0", + "jon-3.2.1", + "jon-3.2.2", + "jon-3.2.3", + "jon-3.3.0", + "jon-3.3.4", + "jon-3.3.5", + "jon-3.3.6", + "jon-3.3.7", + "jon-3.3.8", + "jon-3.3.x", + "jon-3.4.0", + "jpp-6.0.0", + "jpp-6.1.0", + "jpp-6.1.1", + "jpp-6.2.0", + "jpp-6.2.x", + "jpp-6.3.0", + "jws-3.1", + "jws-3.1.0", + "jws-3.1.1", + "jws-3.1.2", + "jws-3.1.3", + "jws-5", + "jws-5.0.0-native", + "jws-5.0.0-rhel", + "kmm-1", + "maistra-0.11.0", + "maistra-0.12.0", + "maistra-0.9.0", + "maistra-0.9.1", + "maistra-1.0.0", + "maistra-1.0.1", + "maistra-1.0.10", + "maistra-1.0.11", + "maistra-1.0.2", + "maistra-1.0.4", + "maistra-1.0.5", + "maistra-1.0.7", + "maistra-1.1.0", + "maistra-1.1.3", + "managed-services-pssvcs", + "mrg-1.1", + "mrg-1.2", + "mrg-1.3", + "mrg-2", + "mrg-2.0", + "mrg-2.1", + "mrg-2.2", + "mrg-2.3", + "mrg-2.3.z", + "mrg-2.4", + "mrg-2.4.z", + "mrg-2.5", + "mrg-2.5.z", + "mrg-m-3.0.0", + "mta-5.3", + "mta-6.0", + "mtc-1.3", + "mtc-1.4", + "mtc-1.5", + "mtc-1.6", + "mtc-1.7", + "mtr-1.0", + "mtv-2.0", + "mtv-2.1", + "mtv-2.2", + "mtv-2.3", + "nhc", + "nhc-0.1.z", + "nhc-0.2.z", + "nhc-0.3.z", + "nmo", + "nmo-4.10", + "nmo-4.11", + "noo-1", + "oadp-1", + "oadp-1.0", + "oadp-1.1", + "ocp-tools-4", + "ocp-tools-4.10", + "ocp-tools-4.11", + "ocp-tools-4.3", + "ocp-tools-4.4", + "ocp-tools-4.5", + "ocp-tools-4.6", + "ocp-tools-4.7", + "ocp-tools-4.8", + "ocp-tools-4.9", + "ocs-3", + "omr-1", + "openjdk-1.8", + "openjdk-11", + "openjdk-17", + "openshift-4.10", + "openshift-4.10.z", + "openshift-4.11", + "openshift-4.11.z", + "openshift-4.12", + "openshift-4.12.z", + "openshift-4.13", + "openshift-4.2", + "openshift-4.2-default", + "openshift-4.2.z", + "openshift-4.3", + "openshift-4.3-default", + "openshift-4.3.z", + "openshift-4.4", + "openshift-4.4-default", + "openshift-4.4.z", + "openshift-4.5", + "openshift-4.5.z", + "openshift-4.6", + "openshift-4.6.z", + "openshift-4.7", + "openshift-4.7.z", + "openshift-4.8", + "openshift-4.8.z", + "openshift-4.9", + "openshift-4.9.z", + "openshift-container-storage-4", + "openshift-container-storage-4.2", + "openshift-container-storage-4.2-default", + "openshift-container-storage-4.3", + "openshift-container-storage-4.3.z", + "openshift-container-storage-4.4", + "openshift-container-storage-4.4.z", + "openshift-container-storage-4.5", + "openshift-container-storage-4.5.z", + "openshift-container-storage-4.6", + "openshift-container-storage-4.6.z", + "openshift-container-storage-4.7", + "openshift-container-storage-4.7.z", + "openshift-container-storage-4.8", + "openshift-container-storage-4.8.z", + "openshift-container-storage-4.9", + "openshift-data-foundation-4.10", + "openshift-data-foundation-4.10.z", + "openshift-data-foundation-4.11", + "openshift-data-foundation-4.11.z", + "openshift-data-foundation-4.12", + "openshift-data-foundation-4.9", + "openshift-data-foundation-4.9.z", + "openshift-enterprise-1", + "openshift-enterprise-2.0", + "openshift-enterprise-2.1", + "openshift-enterprise-2.2", + "openshift-enterprise-3.0", + "openshift-enterprise-3.0.z", + "openshift-enterprise-3.1", + "openshift-enterprise-3.1.z", + "openshift-enterprise-3.10", + "openshift-enterprise-3.10.z", + "openshift-enterprise-3.11", + "openshift-enterprise-3.11-default", + "openshift-enterprise-3.11.z", + "openshift-enterprise-3.2", + "openshift-enterprise-3.2.z", + "openshift-enterprise-3.3", + "openshift-enterprise-3.3.z", + "openshift-enterprise-3.4", + "openshift-enterprise-3.4.z", + "openshift-enterprise-3.5", + "openshift-enterprise-3.5.z", + "openshift-enterprise-3.6", + "openshift-enterprise-3.6.z", + "openshift-enterprise-3.7", + "openshift-enterprise-3.7.z", + "openshift-enterprise-3.8", + "openshift-enterprise-3.8.z", + "openshift-enterprise-3.9", + "openshift-enterprise-3.9.z", + "openshift-enterprise-4.1", + "openshift-enterprise-4.1-default", + "openshift-enterprise-4.1.z", + "openshift-hosted-aro3", + "openshift-hosted-aro4", + "openshift-hosted-osd3", + "openshift-hosted-osd4", + "openshift-hosted-osio3", + "openshift-hosted-oso-pro3", + "openshift-hosted-oso-starter4", + "openshift-hosted-oso-starter4-default", + "openshift-logging-5", + "openshift-logging-5.0", + "openshift-logging-5.1", + "openshift-logging-5.2", + "openshift-logging-5.3", + "openshift-logging-5.4", + "openshift-logging-5.5", + "openstack-10", + "openstack-10-default", + "openstack-10-optools", + "openstack-10-optools-default", + "openstack-11", + "openstack-11-default", + "openstack-11-optools", + "openstack-11-optools-default", + "openstack-12", + "openstack-12-default", + "openstack-12-optools", + "openstack-12-optools-default", + "openstack-13", + "openstack-13-default", + "openstack-13-els", + "openstack-13-optools", + "openstack-13-optools-default", + "openstack-14", + "openstack-14-default", + "openstack-14-optools", + "openstack-14-optools-default", + "openstack-15", + "openstack-15-default", + "openstack-16", + "openstack-16-default", + "openstack-16.1", + "openstack-16.2", + "openstack-17.0", + "openstack-3", + "openstack-4", + "openstack-5-rhel6", + "openstack-5-rhel7", + "openstack-6", + "openstack-6-installer", + "openstack-7", + "openstack-7-default", + "openstack-7-director", + "openstack-7-director-default", + "openstack-7-director-els", + "openstack-7-els", + "openstack-7-optools", + "openstack-7-optools-default", + "openstack-7-optools-els", + "openstack-8", + "openstack-8-default", + "openstack-8-director", + "openstack-8-director-default", + "openstack-8-optools", + "openstack-8-optools-default", + "openstack-9", + "openstack-9-default", + "openstack-9-director", + "openstack-9-director-default", + "openstack-9-optools", + "openstack-9-optools-default", + "openstack-foreman", + "ossm-2.0.0", + "ossm-2.1", + "ossm-2.2", + "ossm-2.3", + "osso-1", + "pipelines-1", + "pipelines-1.4.z", + "pipelines-1.5", + "pipelines-1.6.2", + "pipelines-1.7", + "pipelines-1.7.1", + "pipelines-1.8", + "pipelines-1.8.1", + "pipelines-1.9", + "qci-1.0", + "qci-1.1", + "qci-1.2", + "quarkus-1", + "quarkus-2", + "quay-2.9", + "quay-3", + "quay-3.0", + "quay-3.0-default", + "quay-3.1", + "quay-3.2", + "quay-3.3", + "quay-3.4", + "quay-3.5", + "quay-3.6", + "quay-3.7", + "quay-3.8", + "quay-io-3", + "red_hat_discovery-1.0", + "rhacm-1", + "rhacm-1.0.z", + "rhacm-2", + "rhacm-2.0.z", + "rhacm-2.1", + "rhacm-2.1.z", + "rhacm-2.2", + "rhacm-2.2.z", + "rhacm-2.3", + "rhacm-2.3.z", + "rhacm-2.4", + "rhacm-2.4.z", + "rhacm-2.5", + "rhacm-2.5.z", + "rhacm-2.6", + "rhacm-2.6.z", + "rhacm-2.7", + "rhacs-1", + "rhacs-3", + "rhacs-3.70", + "rhacs-3.71", + "rhacs-3.72", + "rhacs-3.73", + "rhai-1", + "rhapi-1", + "rhbop-8", + "rhbq-1", + "rhcam-1.2", + "rhcertification-6", + "rhcertification-7", + "rhcertification-8", + "rhdm-7", + "rhdm-7.0.0", + "rhdm-7.0.1", + "rhdm-7.1.0", + "rhdm-7.1.1", + "rhdm-7.2.0", + "rhdm-7.2.1", + "rhdm-7.3.0", + "rhdm-7.3.1", + "rhdm-7.4.0", + "rhdts-10.0.z", + "rhdts-10.1.0", + "rhdts-8", + "rhdts-8.0.z", + "rhdts-8.1.0", + "rhdts-8.1.z", + "rhdts-9", + "rhdts-9.0.0", + "rhdts-9.0.z", + "rhdts-9.1.0", + "rhdts-9.1.z", + "rhel-4.5", + "rhel-4.5.z", + "rhel-4.6", + "rhel-4.6.z", + "rhel-4.7", + "rhel-4.7.z", + "rhel-4.8", + "rhel-4.8.z", + "rhel-4.9", + "rhel-5-els", + "rhel-5.0", + "rhel-5.0.z", + "rhel-5.1", + "rhel-5.1.z", + "rhel-5.10", + "rhel-5.10.z", + "rhel-5.11", + "rhel-5.11.z", + "rhel-5.2", + "rhel-5.2.z", + "rhel-5.3", + "rhel-5.3.z", + "rhel-5.4", + "rhel-5.4.z", + "rhel-5.5", + "rhel-5.5.z", + "rhel-5.6", + "rhel-5.6.z", + "rhel-5.7", + "rhel-5.7.z", + "rhel-5.8", + "rhel-5.8.z", + "rhel-5.9", + "rhel-5.9.z", + "rhel-6", + "rhel-6-els", + "rhel-6.0", + "rhel-6.0.z", + "rhel-6.1", + "rhel-6.1.z", + "rhel-6.10", + "rhel-6.10.z", + "rhel-6.2", + "rhel-6.2.z", + "rhel-6.3", + "rhel-6.3.z", + "rhel-6.4", + "rhel-6.4.z", + "rhel-6.5", + "rhel-6.5.z", + "rhel-6.6", + "rhel-6.6.z", + "rhel-6.7", + "rhel-6.7.z", + "rhel-6.8", + "rhel-6.8.z", + "rhel-6.9", + "rhel-6.9.z", + "rhel-7.0", + "rhel-7.0.z", + "rhel-7.1", + "rhel-7.1.z", + "rhel-7.2", + "rhel-7.2.z", + "rhel-7.3", + "rhel-7.3.z", + "rhel-7.4", + "rhel-7.4.z", + "rhel-7.5", + "rhel-7.5.z", + "rhel-7.6", + "rhel-7.6.z", + "rhel-7.7", + "rhel-7.7.z", + "rhel-7.8", + "rhel-7.8.z", + "rhel-7.9", + "rhel-7.9.z", + "rhel-8.0", + "rhel-8.0.0.z", + "rhel-8.0.1.z", + "rhel-8.1.0", + "rhel-8.1.0.z", + "rhel-8.1.1", + "rhel-8.1.1.z", + "rhel-8.2.0", + "rhel-8.2.0.z", + "rhel-8.2.1", + "rhel-8.2.1.z", + "rhel-8.3.0", + "rhel-8.3.0.z", + "rhel-8.3.1", + "rhel-8.3.1.z", + "rhel-8.4.0", + "rhel-8.4.0.z", + "rhel-8.5.0", + "rhel-8.5.0.z", + "rhel-8.6.0", + "rhel-8.6.0.z", + "rhel-8.7.0", + "rhel-8.7.0.z", + "rhel-8.8.0", + "rhel-9", + "rhel-9.0", + "rhel-9.0.0.z", + "rhel-9.1.0", + "rhel-9.1.0.z", + "rhel-9.2.0", + "rhel-alt-7", + "rhel-alt-7.4", + "rhel-alt-7.4.z", + "rhel-alt-7.5", + "rhel-alt-7.5.z", + "rhel-alt-7.6", + "rhel-alt-7.6.z", + "rhel-alt-7.7", + "rhel-av-8.0", + "rhel-av-8.0.0.z", + "rhel-av-8.0.1", + "rhel-av-8.0.1.z", + "rhel-av-8.1.0", + "rhel-av-8.1.0.z", + "rhel-av-8.1.1", + "rhel-av-8.1.1.z", + "rhel-av-8.2.0", + "rhel-av-8.2.0.z", + "rhel-av-8.2.1", + "rhel-av-8.2.1.z", + "rhel-av-8.3.0", + "rhel-av-8.3.0.z", + "rhel-av-8.3.1", + "rhel-av-8.3.1.z", + "rhel-av-8.4.0", + "rhel-av-8.4.0.z", + "rhel-av-8.5.0", + "rhel-av-8.5.0.z", + "rhel-av-8.6.0", + "rhel-br-8", + "rhel-br-8.0", + "rhel-br-8.0.0.z", + "rhel-br-8.1.0", + "rhel-br-8.1.0.z", + "rhel-br-8.2.0", + "rhel-br-8.2.0.z", + "rhel-br-8.3.0", + "rhel-br-8.3.0.z", + "rhel-br-8.4.0", + "rhel-br-8.4.0.z", + "rhel-br-8.5.0", + "rhel-br-8.5.0.z", + "rhel-br-8.6.0", + "rhel-br-8.6.0.z", + "rhel-br-8.7.0", + "rhel-br-8.7.0.z", + "rhel-br-8.8.0", + "rhel-br-9", + "rhel-br-9.0", + "rhel-br-9.0.0.z", + "rhel-br-9.1.0", + "rhel-br-9.1.0.z", + "rhel-br-9.2.0", + "rhelsa-7.1", + "rhelsa-7.2", + "rhes-2.0", + "rhes-2.1", + "rhes-3.0", + "rhes-3.1", + "rhes-3.2", + "rhes-3.3", + "rhes-3.4", + "rhes-3.5", + "rhev-m-2.2.9", + "rhev-m-2.2.z", + "rhev-m-3.0.z", + "rhev-m-3.1", + "rhev-m-3.1.z", + "rhev-m-3.2", + "rhev-m-3.2.z", + "rhev-m-3.3", + "rhev-m-3.3.z", + "rhev-m-3.4", + "rhev-m-3.4.z", + "rhev-m-3.5", + "rhev-m-3.5.z", + "rhev-m-3.6", + "rhev-m-3.6.z", + "rhev-m-4.0.0", + "rhev-m-4.0.z", + "rhev-m-4.1.z", + "rhev-m-4.2.0", + "rhev-m-4.2.z", + "rhev-m-4.3.0", + "rhev-m-4.3.z", + "rhev-m-4.4.0", + "rhev-m-4.4.z", + "rhint-camel-k-1", + "rhint-camel-quarkus-1", + "rhint-camel-spring-boot-3", + "rhint-debezium-1", + "rhint-dv-1", + "rhint-operator-1", + "rhint-serv-1", + "rhint-serv-2", + "rhivos-1.0", + "rhmap-4.1.0", + "rhmap-4.3.1", + "rhmap-4.4.1", + "rhmap-4.5.0", + "rhmap-4.6.0", + "rhmap-4.7.0", + "rhmi-default", + "rhmi-v2-default", + "rhn_satellite_5", + "rhn_satellite_5.6", + "rhn_satellite_5.7", + "rhn_satellite_5.8", + "rhn_satellite_6", + "rhn_satellite_6-default", + "rhn_satellite_6.1", + "rhn_satellite_6.10", + "rhn_satellite_6.11", + "rhn_satellite_6.12", + "rhn_satellite_6.13", + "rhn_satellite_6.2", + "rhn_satellite_6.3", + "rhn_satellite_6.4", + "rhn_satellite_6.5", + "rhn_satellite_6.6", + "rhn_satellite_6.7", + "rhn_satellite_6.8", + "rhn_satellite_6.9", + "rhoar-nodejs-10.4.1", + "rhoar-nodejs-8", + "rhoar-nodejs-8.11.2", + "rhoar-nodejs-8.9.4", + "rhos_devspaces-3", + "rhosc-1", + "rhoscts", + "rhosdt-2", + "rhpam-7", + "rhpam-7.0.0", + "rhpam-7.0.1", + "rhpam-7.0.2", + "rhpam-7.1.0", + "rhpam-7.1.1", + "rhpam-7.2.0", + "rhpam-7.2.1", + "rhpam-7.3.0", + "rhpam-7.3.1", + "rhpam-7.4.0", + "rhscl-1.0", + "rhscl-1.0.z", + "rhscl-1.1", + "rhscl-1.1.z", + "rhscl-1.2", + "rhscl-1.2.z", + "rhscl-2.0", + "rhscl-2.0.z", + "rhscl-2.1", + "rhscl-2.1.z", + "rhscl-2.2", + "rhscl-2.2.z", + "rhscl-2.3", + "rhscl-2.3.z", + "rhscl-2.4", + "rhscl-2.4.z", + "rhscl-3.0", + "rhscl-3.0.z", + "rhscl-3.1", + "rhscl-3.1.z", + "rhscl-3.2", + "rhscl-3.2.z", + "rhscl-3.3.0", + "rhscl-3.3.z", + "rhscl-3.4.0", + "rhscl-3.4.z", + "rhscl-3.5.0", + "rhscl-3.5.z", + "rhscl-3.6.0", + "rhscl-3.6.z", + "rhscl-3.7.0", + "rhscl-3.7.z", + "rhscl-3.8.0", + "rhscl-3.8.z", + "rhscl-3.9", + "rhscon-2", + "rhscon-2-default", + "rhsso-7", + "rhsso-7.0.0", + "rhsso-7.1.0", + "rhsso-7.1.1", + "rhsso-7.1.2", + "rhsso-7.1.3", + "rhsso-7.1.4", + "rhsso-7.2.0", + "rhsso-7.2.1", + "rhsso-7.2.2", + "rhsso-7.2.3", + "rhsso-7.2.4", + "rhsso-7.2.5", + "rhsso-7.2.6", + "rhsso-7.2.7", + "rhsso-7.3.0", + "rhsso-7.3.1", + "rhsso-7.3.2", + "rhui-3.0", + "rhui-3.1", + "rhui-4", + "rosa-cli-1", + "sam-1", + "services-advisor-default", + "services-ansible-automation-analytics-default", + "services-ansible-automation-hub-default", + "services-ansible-on-aws-default", + "services-ansible-on-clouds-default", + "services-ansible-on-gcp-default", + "services-api-management-default", + "services-appstudio-spi-default", + "services-assisted-installer-default", + "services-automation-service-catalog-default", + "services-ccx-default", + "services-ciam-default", + "services-compliance-default", + "services-cost-management-default", + "services-database-as-a-service-default", + "services-developer-sandboxes-default", + "services-drift-default", + "services-edge-fleet-management-default", + "services-eventing-default", + "services-fifi-default", + "services-gitops-default", + "services-hac-default", + "services-has-default", + "services-hosted-control-planes", + "services-image-builder-default", + "services-insights-essentials-default", + "services-inventory-default", + "services-malware-detection-default", + "services-managed-kafka-default", + "services-management-platform-default", + "services-migration-analytics-default", + "services-notifications-default", + "services-nvidia-gpu-add-on", + "services-odf-default", + "services-openbridge-default", + "services-openshift-cluster-manager-default", + "services-openshift-connectors-default", + "services-openshift-data-federation", + "services-openshift-smart-events-default", + "services-package-evolution-default", + "services-patch-default", + "services-pipeline-default", + "services-policies-default", + "services-quarkus-registry-default", + "services-resource-optimization-default", + "services-rhacm-default", + "services-rhacs", + "services-rhcert-default", + "services-rhoc-default", + "services-rhods-default", + "services-rhui-v3-aws-default", + "services-service-registry-default", + "services-sources-default", + "services-subscription-central-default", + "services-subscription-watch-default", + "services-topological-inventory-default", + "services-vulnerability-engine-default", + "services-vulnerability-for-ocp-default", + "snr", + "snr-0.4.z", + "soap-4", + "soap-4.2", + "soap-4.3", + "soap-5.3.1", + "springboot-1", + "springboot-1.5.8", + "springboot-2", + "springboot-2.1.3", + "springboot-2.1.6", + "springboot-2.2", + "springboot-2.3", + "springboot-2.4", + "springboot-2.5", + "springboot-2.7", + "srvcom-1", + "stf-1.2", + "stf-1.2-default", + "stf-1.3", + "stf-1.4", + "swarm-2.2.0", + "swarm-2.4.0", + "swarm-7.0.0", + "swarm-7.0.1", + "swarm-7.1.0", + "thorntail-2", + "thorntail-2.4.0", + "vertx-3", + "vertx-3.4.2", + "vertx-3.5.1", + "vertx-4.0", + "wfk-1.2.0", + "wfk-2.4.0", + "wfk-2.5.0", + "wfk-2.6.0", + "wfk-2.7.0", + "wto-1", + "wto-1.5", +] diff --git a/griffon/autocomplete/product_versions.py b/griffon/autocomplete/product_versions.py new file mode 100644 index 0000000..a94847e --- /dev/null +++ b/griffon/autocomplete/product_versions.py @@ -0,0 +1,661 @@ +# TODO: we could add an endpoint to component-registry that provides this for +# autocomplete or some automation to generate this file +# + +ofuris = [ + "o:redhat:3amp:2", + "o:redhat:amq-cl:2", + "o:redhat:amq-ic:1", + "o:redhat:amq-ic:2", + "o:redhat:amq-on:", + "o:redhat:amq-st:", + "o:redhat:amq:6", + "o:redhat:amq:7", + "o:redhat:ansible_automation_platform:1", + "o:redhat:ansible_automation_platform:2", + "o:redhat:ansible_engine:2", + "o:redhat:ansible_tower:3", + "o:redhat:atomic:7", + "o:redhat:bpms:6", + "o:redhat:brms:5", + "o:redhat:brms:6", + "o:redhat:ceph:1.1", + "o:redhat:ceph:1.2", + "o:redhat:ceph:1.3", + "o:redhat:ceph:2", + "o:redhat:ceph:3", + "o:redhat:ceph:4", + "o:redhat:ceph:5", + "o:redhat:cert-manager:1", + "o:redhat:certificate_system:10", + "o:redhat:certificate_system:8", + "o:redhat:certificate_system:9", + "o:redhat:cfme:5", + "o:redhat:cfme:6", + "o:redhat:cnv:1", + "o:redhat:cnv:2", + "o:redhat:cnv:4", + "o:redhat:codeready_studio:12", + "o:redhat:codeready_ws:1", + "o:redhat:codeready_ws:2", + "o:redhat:convert2rhel:6", + "o:redhat:convert2rhel:7", + "o:redhat:convert2rhel:8", + "o:redhat:cost-management:", + "o:redhat:cryostat:2", + "o:redhat:custom-metrics-autoscaler:2", + "o:redhat:devtools-compilers:", + "o:redhat:devtools-eclipse:", + "o:redhat:devworkspace_operator:0", + "o:redhat:directory_server:10", + "o:redhat:directory_server:11", + "o:redhat:directory_server:12", + "o:redhat:directory_server:8", + "o:redhat:directory_server:9", + "o:redhat:distributed-tracing:2", + "o:redhat:dotnet:1.0", + "o:redhat:dotnet:1.1", + "o:redhat:dotnet:2.0", + "o:redhat:dotnet:2.1", + "o:redhat:dotnet:2.2", + "o:redhat:dotnet:3.0", + "o:redhat:dotnet:3.1", + "o:redhat:dotnet:5.0", + "o:redhat:dotnet:6.0", + "o:redhat:dts:10", + "o:redhat:dts:11", + "o:redhat:dts:12", + "o:redhat:dts:3", + "o:redhat:dts:4", + "o:redhat:dts:6", + "o:redhat:dts:7", + "o:redhat:dts:8", + "o:redhat:dts:9", + "o:redhat:eap-cd:", + "o:redhat:eap-xp:", + "o:redhat:eap:4", + "o:redhat:eap:5", + "o:redhat:eap:6", + "o:redhat:eap:7", + "o:redhat:epp:4", + "o:redhat:epp:5", + "o:redhat:fdp-el7-ovs:", + "o:redhat:fdp-el8-ovs:", + "o:redhat:fdp-el:7", + "o:redhat:fdp-el:9", + "o:redhat:fis:2", + "o:redhat:fsw:6", + "o:redhat:fuse:6", + "o:redhat:fuse:7", + "o:redhat:gitops:1", + "o:redhat:jaeger-operator:1", + "o:redhat:jbcs:1", + "o:redhat:jbds:10", + "o:redhat:jbds:11", + "o:redhat:jbds:8", + "o:redhat:jbds:9", + "o:redhat:jbews:1", + "o:redhat:jbews:2", + "o:redhat:jbews:3", + "o:redhat:jdg:6", + "o:redhat:jdg:7", + "o:redhat:jdg:8", + "o:redhat:jdv:6", + "o:redhat:jon:2", + "o:redhat:jon:3", + "o:redhat:jpp:6", + "o:redhat:jws:3", + "o:redhat:jws:5", + "o:redhat:kernel-module-management:1", + "o:redhat:maistra:0", + "o:redhat:managed-services:", + "o:redhat:mirror-registry:1", + "o:redhat:mrg-m:3", + "o:redhat:mrg:1", + "o:redhat:mrg:2", + "o:redhat:mta:5", + "o:redhat:mta:6", + "o:redhat:mtc:1", + "o:redhat:mtr:1", + "o:redhat:mtv:2", + "o:redhat:network-observability:1", + "o:redhat:node-healthcheck:", + "o:redhat:node-maintenance:", + "o:redhat:oadp:1", + "o:redhat:ocp-tools:4", + "o:redhat:openjdk:1.8", + "o:redhat:openjdk:11", + "o:redhat:openjdk:17", + "o:redhat:openshift-container-storage:4", + "o:redhat:openshift-data-foundation:4", + "o:redhat:openshift-enterprise:1", + "o:redhat:openshift-enterprise:2", + "o:redhat:openshift-enterprise:3", + "o:redhat:openshift-enterprise:3.0", + "o:redhat:openshift-enterprise:3.1", + "o:redhat:openshift-enterprise:3.10", + "o:redhat:openshift-enterprise:3.11", + "o:redhat:openshift-enterprise:3.2", + "o:redhat:openshift-enterprise:3.3", + "o:redhat:openshift-enterprise:3.4", + "o:redhat:openshift-enterprise:3.5", + "o:redhat:openshift-enterprise:3.6", + "o:redhat:openshift-enterprise:3.7", + "o:redhat:openshift-enterprise:3.8", + "o:redhat:openshift-enterprise:3.9", + "o:redhat:openshift-hosted-aro:3", + "o:redhat:openshift-hosted-aro:4", + "o:redhat:openshift-hosted-osd:3", + "o:redhat:openshift-hosted-osd:4", + "o:redhat:openshift-hosted-osio:3", + "o:redhat:openshift-hosted-oso-pro:3", + "o:redhat:openshift-hosted-oso-starter:4", + "o:redhat:openshift-logging:5", + "o:redhat:openshift:4", + "o:redhat:openstack-10-optools:", + "o:redhat:openstack-11-optools:", + "o:redhat:openstack-12-optools:", + "o:redhat:openstack-13-optools:", + "o:redhat:openstack-14-optools:", + "o:redhat:openstack-6-installer:", + "o:redhat:openstack-7-director:", + "o:redhat:openstack-7-optools:", + "o:redhat:openstack-8-director:", + "o:redhat:openstack-8-optools:", + "o:redhat:openstack-9-director:", + "o:redhat:openstack-9-optools:", + "o:redhat:openstack-foreman:", + "o:redhat:openstack:10", + "o:redhat:openstack:11", + "o:redhat:openstack:12", + "o:redhat:openstack:13", + "o:redhat:openstack:14", + "o:redhat:openstack:15", + "o:redhat:openstack:16", + "o:redhat:openstack:16.1", + "o:redhat:openstack:16.2", + "o:redhat:openstack:17.0", + "o:redhat:openstack:3", + "o:redhat:openstack:4", + "o:redhat:openstack:5", + "o:redhat:openstack:6", + "o:redhat:openstack:7", + "o:redhat:openstack:8", + "o:redhat:openstack:9", + "o:redhat:ossm:0", + "o:redhat:ossm:1", + "o:redhat:ossm:2", + "o:redhat:ossm:2.1", + "o:redhat:ossm:2.2", + "o:redhat:ossm:2.3", + "o:redhat:osso:1", + "o:redhat:pipelines:1", + "o:redhat:qci:1", + "o:redhat:quarkus:1", + "o:redhat:quarkus:2", + "o:redhat:quay-io:3", + "o:redhat:quay:2", + "o:redhat:quay:3", + "o:redhat:red_hat_discovery:1", + "o:redhat:rhacm:1", + "o:redhat:rhacm:2", + "o:redhat:rhacs:1", + "o:redhat:rhacs:3", + "o:redhat:rhai:1", + "o:redhat:rhapi:1", + "o:redhat:rhbop:8", + "o:redhat:rhbq:1", + "o:redhat:rhcam:1", + "o:redhat:rhcertification:6", + "o:redhat:rhcertification:7", + "o:redhat:rhcertification:8", + "o:redhat:rhdm:7", + "o:redhat:rhel-alt:7", + "o:redhat:rhel-av:8", + "o:redhat:rhel-br:8", + "o:redhat:rhel-br:9", + "o:redhat:rhel:4", + "o:redhat:rhel:5", + "o:redhat:rhel:6", + "o:redhat:rhel:7", + "o:redhat:rhel:8", + "o:redhat:rhel:9", + "o:redhat:rhelsa:7", + "o:redhat:rhes:2", + "o:redhat:rhes:3", + "o:redhat:rhev-m:2", + "o:redhat:rhev-m:3", + "o:redhat:rhev-m:4", + "o:redhat:rhint-camel-k:1", + "o:redhat:rhint-camel-quarkus:1", + "o:redhat:rhint-camel-spring-boot:3", + "o:redhat:rhint-debezium:1", + "o:redhat:rhint-dv:1", + "o:redhat:rhint-operator:1", + "o:redhat:rhint-serv:1", + "o:redhat:rhint-serv:2", + "o:redhat:rhivos:1", + "o:redhat:rhmap:4", + "o:redhat:rhmi-all:", + "o:redhat:rhmi-v:2", + "o:redhat:rhn_satellite:5", + "o:redhat:rhn_satellite:6", + "o:redhat:rhoar-nodejs:10", + "o:redhat:rhoar-nodejs:8", + "o:redhat:rhos_devspaces:3", + "o:redhat:rhosc:1", + "o:redhat:rhoscts:", + "o:redhat:rhpam:7", + "o:redhat:rhscl:1", + "o:redhat:rhscl:2", + "o:redhat:rhscl:3", + "o:redhat:rhscon:2", + "o:redhat:rhsso:7", + "o:redhat:rhui:3", + "o:redhat:rhui:4", + "o:redhat:rosa-cli:1", + "o:redhat:sam:1", + "o:redhat:self-node-remediation:", + "o:redhat:serverless:1", + "o:redhat:services-advisor:", + "o:redhat:services-ansible-automation-analytics:", + "o:redhat:services-ansible-automation-hub:", + "o:redhat:services-ansible-on-aws:", + "o:redhat:services-ansible-on-clouds:", + "o:redhat:services-ansible-on-gcp:", + "o:redhat:services-api-management:", + "o:redhat:services-appstudio-spi:", + "o:redhat:services-assisted-installer:", + "o:redhat:services-automation-service-catalog:", + "o:redhat:services-ccx:", + "o:redhat:services-ciam:", + "o:redhat:services-compliance:", + "o:redhat:services-cost-management:", + "o:redhat:services-database-as-a-service:", + "o:redhat:services-developer-sandboxes:", + "o:redhat:services-drift:", + "o:redhat:services-edge-fleet-management:", + "o:redhat:services-eventing:", + "o:redhat:services-fifi:", + "o:redhat:services-gitops:", + "o:redhat:services-hac:", + "o:redhat:services-has:", + "o:redhat:services-hosted-control-planes:", + "o:redhat:services-image-builder:", + "o:redhat:services-insights-essentials:", + "o:redhat:services-inventory:", + "o:redhat:services-malware-detection:", + "o:redhat:services-managed-kafka:", + "o:redhat:services-management-platform:", + "o:redhat:services-migration-analytics:", + "o:redhat:services-notifications:", + "o:redhat:services-nvidia-gpu-add-on:", + "o:redhat:services-odf:", + "o:redhat:services-openbridge:", + "o:redhat:services-openshift-cluster-manager:", + "o:redhat:services-openshift-connectors:", + "o:redhat:services-openshift-data-federation:", + "o:redhat:services-openshift-smart-events:", + "o:redhat:services-package-evolution:", + "o:redhat:services-patch:", + "o:redhat:services-pipeline:", + "o:redhat:services-policies:", + "o:redhat:services-quarkus-registry:", + "o:redhat:services-resource-optimization:", + "o:redhat:services-rhacm:", + "o:redhat:services-rhacs:", + "o:redhat:services-rhcert:", + "o:redhat:services-rhoc:", + "o:redhat:services-rhods:", + "o:redhat:services-rhui-v3-aws:", + "o:redhat:services-service-registry:", + "o:redhat:services-sources:", + "o:redhat:services-subscription-central:", + "o:redhat:services-subscription-watch:", + "o:redhat:services-topological-inventory:", + "o:redhat:services-vulnerability-engine:", + "o:redhat:services-vulnerability-for-ocp:", + "o:redhat:soap:4", + "o:redhat:soap:5", + "o:redhat:springboot:1", + "o:redhat:springboot:2", + "o:redhat:stf:1.2", + "o:redhat:stf:1.3", + "o:redhat:stf:1.4", + "o:redhat:swarm:7", + "o:redhat:thorntail:2", + "o:redhat:vertx:3", + "o:redhat:vertx:4", + "o:redhat:web-terminal:1", + "o:redhat:wfk:1", + "o:redhat:wfk:2", +] + +product_version_names = [ + "3amp-2", + "amq-6", + "amq-7", + "amq-cl-2", + "amq-ic-1", + "amq-ic-2", + "amq-on", + "amq-st", + "ansible_automation_platform-1", + "ansible_automation_platform-2", + "ansible_engine-2", + "ansible_tower-3", + "atomic-7", + "bpms-6", + "brms-5", + "brms-6", + "ceph-1.1", + "ceph-1.2", + "ceph-1.3", + "ceph-2", + "ceph-3", + "ceph-4", + "ceph-5", + "cert-manager-1", + "certificate_system_10", + "certificate_system_8", + "certificate_system_9", + "cfme-5", + "cfme-6", + "cnv-1", + "cnv-2", + "cnv-4", + "codeready_studio-12", + "codeready_ws-1", + "codeready_ws-2", + "convert2rhel-6", + "convert2rhel-7", + "convert2rhel-8", + "cost-management", + "cryostat-2", + "custom-metrics-autoscaler-2", + "devtools-compilers", + "devtools-eclipse", + "devworkspace_operator-0", + "directory_server_10", + "directory_server_11", + "directory_server_12", + "directory_server_8", + "directory_server_9", + "distributed-tracing-2", + "dotnet-1.0", + "dotnet-1.1", + "dotnet-2.0", + "dotnet-2.1", + "dotnet-2.2", + "dotnet-3.0", + "dotnet-3.1", + "dotnet-5.0", + "dotnet-6.0", + "dts-10", + "dts-11", + "dts-12", + "dts-3", + "dts-4", + "dts-6", + "dts-7", + "dts-8", + "dts-9", + "eap-4", + "eap-5", + "eap-6", + "eap-7", + "eap-cd", + "eap-xp", + "epp-4", + "epp-5", + "fdp-el7", + "fdp-el7-ovs", + "fdp-el8-ovs", + "fdp-el9", + "fis-2", + "fsw-6", + "fuse-6", + "fuse-7", + "gitops-1", + "jaeger-operator-1", + "jbcs-1", + "jbds-10", + "jbds-11", + "jbds-8", + "jbds-9", + "jbews-1", + "jbews-2", + "jbews-3", + "jdg-6", + "jdg-7", + "jdg-8", + "jdv-6", + "jon-2", + "jon-3", + "jpp-6", + "jws-3", + "jws-5", + "kernel-module-management-1", + "maistra-0", + "managed-services", + "mirror-registry-1", + "mrg-1", + "mrg-2", + "mrg-m-3", + "mta-5", + "mta-6", + "mtc-1", + "mtr-1", + "mtv-2", + "network-observability-1", + "node-healthcheck", + "node-maintenance", + "oadp-1", + "ocp-tools-4", + "openjdk-1.8", + "openjdk-11", + "openjdk-17", + "openshift-4", + "openshift-container-storage-4", + "openshift-data-foundation-4", + "openshift-enterprise-1", + "openshift-enterprise-2", + "openshift-enterprise-3", + "openshift-enterprise-3.0", + "openshift-enterprise-3.1", + "openshift-enterprise-3.10", + "openshift-enterprise-3.11", + "openshift-enterprise-3.2", + "openshift-enterprise-3.3", + "openshift-enterprise-3.4", + "openshift-enterprise-3.5", + "openshift-enterprise-3.6", + "openshift-enterprise-3.7", + "openshift-enterprise-3.8", + "openshift-enterprise-3.9", + "openshift-hosted-aro3", + "openshift-hosted-aro4", + "openshift-hosted-osd3", + "openshift-hosted-osd4", + "openshift-hosted-osio3", + "openshift-hosted-oso-pro3", + "openshift-hosted-oso-starter4", + "openshift-logging-5", + "openstack-10", + "openstack-10-optools", + "openstack-11", + "openstack-11-optools", + "openstack-12", + "openstack-12-optools", + "openstack-13", + "openstack-13-optools", + "openstack-14", + "openstack-14-optools", + "openstack-15", + "openstack-16", + "openstack-16.1", + "openstack-16.2", + "openstack-17.0", + "openstack-3", + "openstack-4", + "openstack-5", + "openstack-6", + "openstack-6-installer", + "openstack-7", + "openstack-7-director", + "openstack-7-optools", + "openstack-8", + "openstack-8-director", + "openstack-8-optools", + "openstack-9", + "openstack-9-director", + "openstack-9-optools", + "openstack-foreman", + "ossm-0", + "ossm-1", + "ossm-2", + "ossm-2.1", + "ossm-2.2", + "ossm-2.3", + "osso-1", + "pipelines-1", + "qci-1", + "quarkus-1", + "quarkus-2", + "quay-2", + "quay-3", + "quay-io-3", + "red_hat_discovery-1", + "rhacm-1", + "rhacm-2", + "rhacs-1", + "rhacs-3", + "rhai-1", + "rhapi-1", + "rhbop-8", + "rhbq-1", + "rhcam-1", + "rhcertification-6", + "rhcertification-7", + "rhcertification-8", + "rhdm-7", + "rhel-4", + "rhel-5", + "rhel-6", + "rhel-7", + "rhel-8", + "rhel-9", + "rhel-alt-7", + "rhel-av-8", + "rhel-br-8", + "rhel-br-9", + "rhelsa-7", + "rhes-2", + "rhes-3", + "rhev-m-2", + "rhev-m-3", + "rhev-m-4", + "rhint-camel-k-1", + "rhint-camel-quarkus-1", + "rhint-camel-spring-boot-3", + "rhint-debezium-1", + "rhint-dv-1", + "rhint-operator-1", + "rhint-serv-1", + "rhint-serv-2", + "rhivos-1", + "rhmap-4", + "rhmi-all", + "rhmi-v2", + "rhn_satellite_5", + "rhn_satellite_6", + "rhoar-nodejs-10", + "rhoar-nodejs-8", + "rhos_devspaces-3", + "rhosc-1", + "rhoscts", + "rhpam-7", + "rhscl-1", + "rhscl-2", + "rhscl-3", + "rhscon-2", + "rhsso-7", + "rhui-3", + "rhui-4", + "rosa-cli-1", + "sam-1", + "self-node-remediation", + "serverless-1", + "services-advisor", + "services-ansible-automation-analytics", + "services-ansible-automation-hub", + "services-ansible-on-aws", + "services-ansible-on-clouds", + "services-ansible-on-gcp", + "services-api-management", + "services-appstudio-spi", + "services-assisted-installer", + "services-automation-service-catalog", + "services-ccx", + "services-ciam", + "services-compliance", + "services-cost-management", + "services-database-as-a-service", + "services-developer-sandboxes", + "services-drift", + "services-edge-fleet-management", + "services-eventing", + "services-fifi", + "services-gitops", + "services-hac", + "services-has", + "services-hosted-control-planes", + "services-image-builder", + "services-insights-essentials", + "services-inventory", + "services-malware-detection", + "services-managed-kafka", + "services-management-platform", + "services-migration-analytics", + "services-notifications", + "services-nvidia-gpu-add-on", + "services-odf", + "services-openbridge", + "services-openshift-cluster-manager", + "services-openshift-connectors", + "services-openshift-data-federation", + "services-openshift-smart-events", + "services-package-evolution", + "services-patch", + "services-pipeline", + "services-policies", + "services-quarkus-registry", + "services-resource-optimization", + "services-rhacm", + "services-rhacs", + "services-rhcert", + "services-rhoc", + "services-rhods", + "services-rhui-v3-aws", + "services-service-registry", + "services-sources", + "services-subscription-central", + "services-subscription-watch", + "services-topological-inventory", + "services-vulnerability-engine", + "services-vulnerability-for-ocp", + "soap-4", + "soap-5", + "springboot-1", + "springboot-2", + "stf-1.2", + "stf-1.3", + "stf-1.4", + "swarm-7", + "thorntail-2", + "vertx-3", + "vertx-4", + "web-terminal-1", + "wfk-1", + "wfk-2", +] diff --git a/griffon/cli.py b/griffon/cli.py new file mode 100644 index 0000000..cc31b31 --- /dev/null +++ b/griffon/cli.py @@ -0,0 +1,101 @@ +""" + +""" +import logging + +import click +import click_completion + +from griffon import get_logging + +from .commands.configure import configure_grp +from .commands.docs import docs_grp +from .commands.entities import entities_grp +from .commands.manage import manage_grp +from .commands.plugin_commands import plugin_commands +from .commands.process import process_grp +from .commands.queries import queries_grp + +logger = logging.getLogger("rich") + +click_completion.init() + + +@click.group() +@click.pass_context +def configure(ctx): + pass + + +configure.add_command(configure_grp) + + +@click.group() +@click.pass_context +def entities(ctx): + pass + + +entities.add_command(entities_grp) + + +@click.group() +@click.pass_context +def manage(ctx): + pass + + +manage.add_command(manage_grp) + + +@click.group() +@click.pass_context +def services_grp(ctx): + pass + + +@services_grp.group(name="service", help="Service operations.") +@click.pass_context +def services(ctx): + pass + + +services.add_command(queries_grp) +services.add_command(process_grp) + + +@click.group() +@click.pass_context +def docs(ctx): + pass + + +docs.add_command(docs_grp) + + +# CLI entry point +# +# A click.CommandCollection is used to aggregate up all CLI sub commands. +# Top level CLI options (germane to all commands) are included here. + + +@click.group( + cls=click.CommandCollection, + sources=(configure, entities, services_grp, manage, docs, plugin_commands), +) +@click.option("--debug", is_flag=True) +@click.pass_context +def cli(ctx, debug): + """Red Hat product security CLI""" + + if ctx.invoked_subcommand is None: + click.echo(ctx.parent.get_help()) + + if debug: + get_logging(level="DEBUG") + + ctx.ensure_object(dict) + ctx.obj["DEBUG"] = debug + + +cli.help = "Red Hat Product Security CLI" diff --git a/griffon/commands/configure.py b/griffon/commands/configure.py new file mode 100644 index 0000000..3f26865 --- /dev/null +++ b/griffon/commands/configure.py @@ -0,0 +1,21 @@ +""" + +""" +import logging + +import click + +logger = logging.getLogger("rich") + + +@click.group(name="configure") +@click.pass_context +def configure_grp(ctx): + """Configure operations.""" + pass + + +@configure_grp.command(name="stub") +def stub(): + """stub""" + click.echo("generate ~/.griffonrc configuration file") diff --git a/griffon/commands/docs.py b/griffon/commands/docs.py new file mode 100644 index 0000000..8c99bc7 --- /dev/null +++ b/griffon/commands/docs.py @@ -0,0 +1,66 @@ +""" + +""" + +import click + +from griffon import CORGI_API_URL, OSIDB_API_URL + + +@click.group(name="docs", help="Links to useful docs.") +@click.pass_context +def docs_grp(ctx): + pass + + +@docs_grp.command() +def griffon_github(): + click.launch("https://github.com/RedHatProductSecurity/griffon") + + +@docs_grp.command() +def griffon_tutorial(): + click.launch("https://github.com/RedHatProductSecurity/griffon/blob/main/docs/tutorial.md") + + +@docs_grp.command() +def osidb(): + click.launch(OSIDB_API_URL) + + +@docs_grp.command() +def osidb_github(): + click.launch("https://github.com/RedHatProductSecurity/osidb") + + +@docs_grp.command() +def osidb_tutorial(): + click.launch("https://github.com/RedHatProductSecurity/osidb/blob/master/docs/user/TUTORIAL.md") + + +@docs_grp.command() +def osidb_bindings(): + click.launch("https://github.com/RedHatProductSecurity/osidb-bindings/blob/master/TUTORIAL.md") + + +@docs_grp.command() +def corgi(): + click.launch(CORGI_API_URL) + + +@docs_grp.command() +def corgi_github(): + click.launch("https://github.com/RedHatProductSecurity/component-registry") + + +@docs_grp.command() +def corgi_tutorial(): + click.launch( + "https://github.com/RedHatProductSecurity/component-registry/blob/main/docs/user_guide.md" + ) + + +@docs_grp.command() +def corgi_bindings(): + pass + # click.launch("test") diff --git a/griffon/commands/entities.py b/griffon/commands/entities.py new file mode 100644 index 0000000..5f24d2a --- /dev/null +++ b/griffon/commands/entities.py @@ -0,0 +1,438 @@ +""" + +""" +import concurrent.futures +import logging + +import click + +from griffon import CORGI_API_URL, OSIDB_API_URL, CorgiService, OSIDBService +from griffon.autocomplete import get_product_stream_names, get_product_stream_ofuris +from griffon.output import console, cprint + +logger = logging.getLogger("rich") + +default_conditions: dict = {} + + +@click.group(name="entities", help="List and retrieve entities operations.") +@click.option("--open-browser", is_flag=True) +@click.option("--limit", default=10) +@click.pass_context +def entities_grp(ctx, open_browser, limit): + ctx.ensure_object(dict) + ctx.obj["open_browser"] = open_browser + ctx.obj["limit"] = limit + + +# flaws +@entities_grp.group(help=f"{OSIDB_API_URL}/osidb/api/v1/flaws") +@click.pass_context +def flaws(ctx): + """OSIDB Flaws.""" + + +@flaws.command(name="list") +@click.option( + "--state", + "flaw_state", + type=click.Choice( + [ + "ASSIGNED", + "CLOSED", + "MODIFIED", + "NEW", + "ON_DEV", + "ON_QA", + "POST", + "RELEASE_PENDING", + "VERIFIED", + ] + ), +) +@click.option( + "--resolution", + type=click.Choice( + [ + "CANTFIX", + "CURRENTRELEASE", + "DEFERRED", + "DUPLICATE", + "EOL", + "ERRATA", + "INSUFFICIENT_DATA", + "NEXTRELEASE", + "NOTABUG", + "RAWHIDE", + "UPSTREAM", + "WONTFIX", + "WORKSFORME", + ] + ), +) +@click.option("--impact", type=click.Choice(["CRITICAL", "IMPORTANT", "MODERATE", "LOW"])) +@click.option("--embargoed", "is_embargoed", is_flag=True) +@click.option("--major-incident", "is_major_incident", is_flag=True) +@click.pass_context +def list_flaws(ctx, flaw_state, resolution, impact, is_embargoed, is_major_incident): + if not flaw_state and not resolution and not impact: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + session = OSIDBService.create_session() + conditions = default_conditions + if flaw_state: + conditions["state"] = flaw_state + if resolution: + conditions["resolution"] = resolution + if impact: + conditions["impact"] = impact + data = session.flaws.retrieve_list(**conditions).results + return cprint(data, ctx=ctx) + + +@flaws.command(name="get") +@click.option("--cve-id") +@click.option("--uuid", "flaw_uuid") +@click.pass_context +def get_flaw(ctx, cve_id, flaw_uuid): + if not cve_id and not flaw_uuid: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + session = OSIDBService.create_session() + if flaw_uuid: + data = session.flaws.retrieve(flaw_uuid) + if cve_id: + data = session.flaws.retrieve(cve_id) + return cprint(data, ctx=ctx) + + +# affects +@entities_grp.group(help=f"{OSIDB_API_URL}/osidb/api/v1/affects") +@click.pass_context +def affects(ctx): + """OSIDB Affects.""" + pass + + +@affects.command(name="list") +@click.option("--product_version", help="ps module") +@click.option("--component_name", help="ps component") +@click.option("--affectedness", type=click.Choice(["NEW", "AFFECTED", "NOTAFFECTED"])) +@click.option( + "--resolution", + type=click.Choice(["DEFER", "DELEGATED", "FIX", "OOSS", "WONTFIX", "WONTREPORT"]), +) +@click.option("--impact", type=click.Choice(["CRITICAL", "IMPORTANT", "MODERATE", "LOW"])) +@click.pass_context +def list_affects(ctx, product_version, component_name, affectedness, resolution, impact): + if ( + not product_version + and not component_name + and not affectedness + and not resolution + and not impact + ): + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + session = OSIDBService.create_session() + conditions = default_conditions + if product_version: + conditions["ps_module"] = product_version + if component_name: + conditions["ps_component"] = component_name + if affectedness: + conditions["affectedness"] = affectedness + if resolution: + conditions["resolution"] = resolution + if impact: + conditions["impact"] = impact + data = session.affects.retrieve_list(**conditions).results + return cprint(data, ctx=ctx) + + +@affects.command(name="get") +@click.option("--uuid", "affect_uuid") +@click.pass_context +def get_affect(ctx, affect_uuid): + if not affect_uuid: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + session = OSIDBService.create_session() + data = session.affects.retrieve(affect_uuid) + return cprint(data, ctx=ctx) + + +# trackers +@entities_grp.group(help=f"{OSIDB_API_URL}/osidb/api/v1/trackers") +@click.pass_context +def trackers(ctx): + """OSIDB Trackers.""" + pass + + +@trackers.command(name="list") +@click.pass_context +def list_trackers(ctx): + with console.status("griffoning...", spinner="line"): + session = OSIDBService.create_session() + conditions = default_conditions + data = session.trackers.retrieve_list(**conditions).results + return cprint(data, ctx=ctx) + + +@trackers.command(name="get") +@click.option("--uuid", "tracker_uuid") +@click.pass_context +def get_tracker(ctx, tracker_uuid): + if not tracker_uuid: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + session = OSIDBService.create_session() + data = session.trackers.retrieve(tracker_uuid) + return cprint(data, ctx=ctx) + + +# components +@entities_grp.group(help=f"{CORGI_API_URL}/api/v1/components") +@click.pass_context +def components(ctx): + pass + + +@components.command(name="list") +@click.option("--namespace", type=click.Choice(CorgiService.get_component_namespaces()), help="") +@click.option("--ofuri") +@click.option("--product-stream-name") +@click.option("--re_purl") +@click.option("--name") +@click.option("--re_name") +@click.option("--version") +@click.option( + "--type", + "component_type", + type=click.Choice(CorgiService.get_component_types()), + help="", # noqa +) +@click.option( + "--arch", + type=click.Choice( + [ + "src", + "noarch", + "i386", + "ia64", + "s390", + "x86_64", + "s390x", + "ppc", + "ppc64", + "aarch64", + "ppc64le", + ] + ), +) +@click.option("--view", default="summary") +@click.pass_context +def list_components( + ctx, + namespace, + ofuri, + product_stream_name, + re_purl, + name, + re_name, + version, + component_type, + arch, + view, +): + """Retrieve a list of components.""" + + if ( + not ofuri + and not re_purl + and not name + and not re_name + and not version + and not arch + and not namespace + and not component_type + ): + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + session = CorgiService.create_session() + + conditions = default_conditions + conditions["view"] = view + + # TODO- condition union could be a separate helper function + + if namespace: + conditions["namespace"] = namespace + if ofuri: + conditions["ofuri"] = ofuri + if re_purl: + conditions["re_purl"] = re_purl + if name: + conditions["name"] = name + if re_name: + conditions["re_name"] = re_name + if version: + conditions["version"] = version + if arch: + conditions["arch"] = arch + + # TODO- This kind of optimisation should probably be developed in the + # service binding itself rather then here + logger.debug("starting parallel http requests") + component_cnt = session.components.retrieve_list(**conditions).count + if component_cnt < 30000: + with concurrent.futures.ThreadPoolExecutor() as executor: + futures = [] + components = list() + for batch in range(0, component_cnt, 1200): + futures.append( + executor.submit( + session.components.retrieve_list, + **conditions, + offset=batch, + limit=1200, # noqa + ) + ) + + for future in concurrent.futures.as_completed(futures): + try: + components.extend(future.result().results) + except Exception as exc: + logger.info("%r generated an exception: %s" % (future, exc)) + exit(0) + + data = sorted(components, key=lambda d: d.purl) + return cprint(data, ctx=ctx) + else: + console.print("downloading too many") + + +@components.command(name="get") +@click.option("--uuid", "component_uuid") +@click.option("--purl") +@click.option("--nvr") +@click.pass_context +def get_component(ctx, component_uuid, purl, nvr): + """Retrieve a specific component.""" + if not component_uuid and not purl and not nvr: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + session = CorgiService.create_session() + data = session.components.retrieve_list(purl=purl) + return cprint(data, ctx=ctx) + + +@components.command(name="get_manifest") +@click.option("--uuid", "component_uuid") +@click.option("--purl") +@click.pass_context +def get_component_manifest(ctx, component_uuid, purl): + """Retrieve a specific component.""" + if not component_uuid and not purl: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + session = CorgiService.create_session() + if component_uuid: + data = session.components.retrieve_manifest(component_uuid) + return cprint(data, ctx=ctx) + else: + c = session.components.retrieve_list(purl=purl) + if c: + data = session.components.retrieve_manifest(c["uuid"]) + return cprint(data, ctx=ctx) + + +# product streams +@entities_grp.group(help=f"{CORGI_API_URL}/api/v1/product_streams") +@click.pass_context +def product_streams(ctx): + pass + + +@product_streams.command(name="list") +@click.option("--inactive", is_flag=True, default=False, help="Show inactive project streams") +@click.option("--re-name", "re_name") +@click.pass_context +def list_product_streams(ctx, inactive, re_name): + """Retrieve a list of product_streams.""" + with console.status("griffoning...", spinner="line"): + session = CorgiService.create_session() + cond = default_conditions + if re_name: + cond["re_name"] = re_name + data = session.product_streams.retrieve_list(**cond).results + return cprint(data, ctx=ctx) + + +@product_streams.command(name="get") +@click.option("--inactive", is_flag=True, default=False, help="Show inactive project streams") +@click.option("--ofuri", "ofuri", type=click.STRING, shell_complete=get_product_stream_ofuris) +@click.option( + "--name", "product_stream_name", type=click.STRING, shell_complete=get_product_stream_names +) +@click.pass_context +def get_product_stream(ctx, inactive, ofuri, product_stream_name): + """Retrieve a specific product_stream.""" + if not ofuri and not product_stream_name: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + session = CorgiService.create_session() + cond = {} + if ofuri: + cond["ofuri"] = ofuri + if product_stream_name: + cond["name"] = product_stream_name + data = session.product_streams.retrieve_list(**cond) + return cprint(data, ctx=ctx) + + +@product_streams.command(name="get_latest_components") +@click.option("--namespace", type=click.Choice(CorgiService.get_component_namespaces()), help="") +@click.option("--ofuri", "ofuri") +@click.option("--name", "product_stream_name") +@click.option("--view", default="summary") +@click.pass_context +def get_product_stream_components(ctx, namespace, ofuri, product_stream_name, view): + """Retrieve a specific product_stream.""" + if not ofuri and not product_stream_name: + click.echo(ctx.get_help()) + exit(0) + ctx.invoke(list_components, ofuri=ofuri) + + +@product_streams.command(name="get_manifest") +@click.option("--ofuri", "ofuri") +@click.option("--name", "product_stream_name") +@click.pass_context +def get_product_stream_manifest(ctx, ofuri, product_stream_name): + """Retrieve a product_stream manifest.""" + if not ofuri and not product_stream_name: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + session = CorgiService.create_session() + pv = None + if ofuri: + pv = session.product_streams.retrieve_list(ofuri=ofuri).additional_properties + if product_stream_name: + pv = session.product_streams.retrieve_list( + name=product_stream_name + ).additional_properties + if pv: + data = session.product_streams.retrieve_manifest(pv["uuid"]) + return cprint(data, ctx=ctx) diff --git a/griffon/commands/manage.py b/griffon/commands/manage.py new file mode 100644 index 0000000..568de1b --- /dev/null +++ b/griffon/commands/manage.py @@ -0,0 +1,63 @@ +""" + +""" +import logging + +import click + +from griffon import CORGI_API_URL, OSIDB_API_URL, CorgiService, OSIDBService +from griffon.output import cprint + +logger = logging.getLogger("rich") + + +@click.group(name="manage") +@click.pass_context +def manage_grp(ctx): + """Manage operations.""" + pass + + +# osidb manage commands +@manage_grp.group() +@click.pass_context +def osidb(ctx): + """Manage osidb""" + pass + + +@osidb.command(name="status") +def osidb_status(): + session = OSIDBService.create_session() + data = session.status() + return cprint(data) + + +@osidb.command(name="api_doc") +def osidb_api_docs(): + click.launch(f"{OSIDB_API_URL}/osidb/api/v1/schema/swagger-ui/") + + +# component-registry manage commands +@manage_grp.group() +@click.pass_context +def corgi(ctx): + """Manage component registry""" + pass + + +@corgi.command(name="status") +def corgi_status(): + session = CorgiService.create_session() + data = session.status() + return cprint(data.additional_properties) + + +@corgi.command(name="data") +def corgi_data(): + click.launch(f"{CORGI_API_URL}/data") + + +@corgi.command(name="api_doc") +def corgi_api_docs(): + click.launch(f"{CORGI_API_URL}/api/v1/schema/docs") diff --git a/griffon/commands/plugin_commands.py b/griffon/commands/plugin_commands.py new file mode 100644 index 0000000..544e5a4 --- /dev/null +++ b/griffon/commands/plugin_commands.py @@ -0,0 +1,32 @@ +""" + +""" + +import os + +import click + +plugin_folder = os.path.join(os.path.dirname(__file__), "plugins") + + +class plugin_commands(click.MultiCommand): + def list_commands(self): + """Dynamically generate list of commands.""" + rv = [] + for filename in os.listdir(plugin_folder): + if filename.endswith(".py") and not filename.startswith("__init__"): + rv.append(filename[:-3]) + rv.sort() + return rv + + def get_command(self, name): + """Invoke command.""" + ns = {} + try: + fn = os.path.join(plugin_folder, name + ".py") + with open(fn) as f: + code = compile(f.read(), fn, "exec") + eval(code, ns, ns) + return ns["plugins"] + except FileNotFoundError: + click.echo("") diff --git a/griffon/commands/plugins/README.md b/griffon/commands/plugins/README.md new file mode 100644 index 0000000..a1f5fea --- /dev/null +++ b/griffon/commands/plugins/README.md @@ -0,0 +1,3 @@ +# Custom plugins + +Plugins are picked up dynamically. diff --git a/griffon/commands/plugins/z_fcc.py b/griffon/commands/plugins/z_fcc.py new file mode 100644 index 0000000..20cf350 --- /dev/null +++ b/griffon/commands/plugins/z_fcc.py @@ -0,0 +1,26 @@ +""" +FCC plugin: + + +""" +import click + +api_url = "https://fcc.io" + + +@click.group() +@click.pass_context +def plugins(ctx): + """FCC plugin""" + pass + + +@plugins.command() +@click.option("--fcc-id", help="FCC ID") +@click.pass_context +def search(ctx, fcc_id): + """Search FCC by FCC ID""" + if not fcc_id: + click.echo(ctx.get_help()) + exit(0) + click.launch(f"{api_url}/{fcc_id}") diff --git a/griffon/commands/plugins/z_go_vuln.py b/griffon/commands/plugins/z_go_vuln.py new file mode 100644 index 0000000..8855b16 --- /dev/null +++ b/griffon/commands/plugins/z_go_vuln.py @@ -0,0 +1,31 @@ +""" +vuln.go.dev plugin: + + +""" +import click +import requests + +from griffon.output import cprint + +api_url = "https://vuln.go.dev/ID" + + +@click.group() +@click.pass_context +def plugins(ctx): + """vuln.go.dev plugin""" + pass + + +@plugins.command() +@click.option("--id", "go_id", help="go vuln ID (ex. GO-2022-0189") +@click.pass_context +def get(ctx, go_id): + """Search go.vuln.dev by go vuln ID""" + if not go_id: + click.echo(ctx.get_help()) + exit(0) + + res = requests.get(f"{api_url}/{go_id}.json") + cprint(res.json()) diff --git a/griffon/commands/plugins/z_osv.py b/griffon/commands/plugins/z_osv.py new file mode 100644 index 0000000..5806026 --- /dev/null +++ b/griffon/commands/plugins/z_osv.py @@ -0,0 +1,60 @@ +""" +osv plugin: + +https://osv.dev/docs/#tag/api/operation/OSV_QueryAffected + +""" +import json +import logging + +import click +import requests + +from griffon.output import cprint + +logger = logging.getLogger("rich") + +api_url = "https://api.osv.dev/v1/query" + + +@click.group() +@click.pass_context +def plugins(ctx): + """OSV plugin""" + pass + + +@plugins.command() +@click.option("--version", "package_version", help="package version") +@click.option("--name", "package_name", help="package name") +@click.option("--ecosystem", help="ecosystem (ex. PyPI) ") +@click.pass_context +def query_by_version(ctx, package_version, package_name, ecosystem): + if not package_version and not package_name: + click.echo(ctx.get_help()) + exit(0) + data = json.dumps( + {"version": package_version, "package": {"name": package_name, "ecosystem": ecosystem}} + ) + res = requests.post( + api_url, + data=data, + headers={"Content-type": "application/json"}, + ) + cprint(res.json()) + + +@plugins.command() +@click.option("--commit_hash", help="specific commit hash") +@click.pass_context +def query_by_commit_hash(ctx, commit_hash): + if not commit_hash: + click.echo(ctx.get_help()) + exit(0) + data = json.dumps({"commit": commit_hash}) + res = requests.post( + api_url, + data=data, + headers={"Content-type": "application/json"}, + ) + cprint(res.json()) diff --git a/griffon/commands/process.py b/griffon/commands/process.py new file mode 100644 index 0000000..d19ecf7 --- /dev/null +++ b/griffon/commands/process.py @@ -0,0 +1,36 @@ +""" + +""" +import logging + +import click +from requests import HTTPError + +from griffon.exceptions import catch_exception +from griffon.output import console, cprint +from griffon.service_layer import Process, core_process + +logger = logging.getLogger("rich") + + +@click.group(name="process", help="Service operations that perform mutations/write.") +@click.pass_context +def process_grp(ctx): + """Mutation operations.""" + pass + + +@process_grp.command(name="generate_affects_for_component", help="Generate affects for component.") +@click.option("--purl") +@click.option("--cve_id") +@catch_exception(handle=(HTTPError)) +@click.pass_context +def generate_affects_for_component_process(ctx, purl, cve_id): + """List cves of a specific component.""" + if not purl and not cve_id: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + q = core_process.generate_affects_for_specific_component_process() + assert isinstance(q, Process) + cprint(q.execute({"purl": purl})) diff --git a/griffon/commands/queries.py b/griffon/commands/queries.py new file mode 100644 index 0000000..9b9cf0d --- /dev/null +++ b/griffon/commands/queries.py @@ -0,0 +1,253 @@ +""" + +""" +import logging + +import click + +from griffon.autocomplete import get_product_version_names +from griffon.commands.entities import ( + get_product_stream_manifest, + get_product_stream_names, + get_product_stream_ofuris, + list_components, +) +from griffon.output import console, cprint +from griffon.service_layer import Query, core_queries + +logger = logging.getLogger("rich") + + +@click.group(name="queries", help="Service operations that are read only.") +@click.pass_context +def queries_grp(ctx): + """Query operations.""" + pass + + +@queries_grp.group(name="core", help="(Experimental) Core queries.") +@click.pass_context +def core_grp(ctx): + """Query operations.""" + pass + + +@core_grp.command(name="component_cves", help="List CVEs affecting a component.") +@click.option("--purl") +@click.option("--affectedness") +@click.pass_context +def cves_for_specific_component_query(ctx, purl, affectedness): + """List cves of a specific component.""" + if not purl: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + q = core_queries.cves_for_specific_component_query() + assert isinstance(q, Query) + cprint(q.execute({"purl": purl, "affectedness": affectedness})) + + +@core_grp.command( + name="components_affected_by_cve", + help="List components affected by CVE.", +) +@click.option("--cve-id") +@click.pass_context +def components_affected_by_specific_cve_query(ctx, cve_id): + """List unfixed cves of a specific component.""" + if not cve_id: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + q = core_queries.components_affected_by_specific_cve_query() + assert isinstance(q, Query) + cprint(q.execute({"cve_id": cve_id})) + + +@core_grp.command( + name="cves_for_product_version", + help="List CVEs of a product version.", +) +@click.option( + "--name", + "product_version_name", + help="product_version name (eg. ps_module)", + shell_complete=get_product_version_names, +) +@click.option("--affectedness") +@click.option("--affect-impact") +@click.option("--affect-resolution") +@click.option("--flaw-state") +@click.option("--flaw-resolution") +@click.pass_context +def cves_for_specific_product_query( + ctx, + product_version_name, + affectedness, + affect_impact, + affect_resolution, + flaw_state, + flaw_resolution, +): + """List cves of a specific product.""" + if not product_version_name: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + q = core_queries.cves_for_specific_product_query() + assert isinstance(q, Query) + cprint( + q.execute( + { + "product_version_name": product_version_name, + "affectedness": affectedness, + "affect_impact": affect_impact, + "affect_resolution": affect_resolution, + "flaw_state": flaw_state, + "flaw_resolution": flaw_resolution, + } + ) + ) + + +# cves_for_product_stream_query + + +@core_grp.command( + name="product_versions_affected_by_cve", + help="List product versions affected by a CVE.", +) +@click.option("--cve-id") +@click.pass_context +def product_versions_affected_by_cve_query(ctx, cve_id): + """List cves of a specific product.""" + if not cve_id: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + q = core_queries.products_versions_affected_by_specific_cve_query() + cprint(q.execute({"cve_id": cve_id})) + + +@core_grp.command( + name="components_in_product_stream", + help="List components of product version.", +) +@click.option("--ofuri", shell_complete=get_product_stream_ofuris) +@click.option("--namespace", type=click.Choice(["REDHAT", "UPSTREAM"]), help="") +@click.pass_context +def components_in_product_stream_query(ctx, ofuri, namespace): + """List components of a specific product version.""" + if not ofuri: + click.echo(ctx.get_help()) + exit(0) + # good example of invoking an existing command + ctx.invoke(list_components, ofuri=ofuri) + + +@core_grp.command( + name="products_containing_specific_component", + help="List products of a specific component.", +) +@click.option("--purl") +@click.pass_context +def products_containing_specific_component_query(ctx, purl): + """List components of a specific product version.""" + if not purl: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + q = core_queries.products_containing_specific_component_query() + cprint(q.execute({"purl": purl})) + + +@queries_grp.command( + name="get-product", + help="(DEP1US7) Get product stream summary", +) +@click.option("--inactive", is_flag=True, default=False, help="Show inactive project streams") +@click.option("--ofuri", "ofuri", type=click.STRING, shell_complete=get_product_stream_ofuris) +@click.option( + "--name", "product_stream_name", type=click.STRING, shell_complete=get_product_stream_names +) +@click.pass_context +def dep7_query(ctx, inactive, ofuri, product_stream_name): + """List components of a specific product version.""" + if not product_stream_name and not ofuri: + click.echo(ctx.get_help()) + exit(0) + with console.status("griffoning...", spinner="line"): + q = core_queries.dep_us7_query() + cprint(q.execute(product_stream_name, ofuri)) + + +@queries_grp.command( + name="get-product-manifest", + help="(DEP1US7) Get manifest", +) +@click.option("--ofuri", "ofuri", type=click.STRING, shell_complete=get_product_stream_ofuris) +@click.option( + "--name", "product_stream_name", type=click.STRING, shell_complete=get_product_stream_names +) +@click.pass_context +def dep7_manifest_query(ctx, ofuri, product_stream_name): + """List components of a specific product version.""" + if not ofuri and not product_stream_name: + click.echo(ctx.get_help()) + exit(0) + cond = {} + if ofuri: + cond["ofuri"] = ofuri + if product_stream_name: + cond["product_stream_name"] = product_stream_name + ctx.invoke(get_product_stream_manifest, **cond) + + +@queries_grp.command( + name="get-product-components", + help="(DEP1US7) Get latest-components", +) +@click.option("--ofuri", "ofuri", type=click.STRING, shell_complete=get_product_stream_ofuris) +@click.option( + "--name", "product_stream_name", type=click.STRING, shell_complete=get_product_stream_names +) +@click.pass_context +def dep7_latest_components_query(ctx, ofuri, product_stream_name): + """List components of a specific product version.""" + if not ofuri and not product_stream_name: + click.echo(ctx.get_help()) + exit(0) + cond = {} + if ofuri: + cond["ofuri"] = ofuri + if product_stream_name: + # lookup ofuri + q = core_queries.dep_us7_query() + ofuri = q.execute(product_stream_name, None)["ofuri"] + cond["ofuri"] = ofuri + ctx.invoke(list_components, **cond) + + +@queries_grp.command( + name="get-product-shipped-components", + help="(DEP1US7) Get shipped-components", +) +@click.option("--ofuri", "ofuri", type=click.STRING, shell_complete=get_product_stream_ofuris) +@click.option( + "--name", "product_stream_name", type=click.STRING, shell_complete=get_product_stream_names +) +@click.pass_context +def dep7_shipped_components_query(ctx, ofuri, product_stream_name): + """List components of a specific product version.""" + if not ofuri and not product_stream_name: + click.echo(ctx.get_help()) + exit(0) + cond = {} + if ofuri: + cond["ofuri"] = ofuri + if product_stream_name: + # lookup ofuri + q = core_queries.dep_us7_query() + ofuri = q.execute(product_stream_name, None)["ofuri"] + cond["ofuri"] = ofuri + ctx.invoke(list_components, **cond) diff --git a/griffon/commands/z_go_vuln.py b/griffon/commands/z_go_vuln.py new file mode 100644 index 0000000..b470035 --- /dev/null +++ b/griffon/commands/z_go_vuln.py @@ -0,0 +1,26 @@ +""" +vuln.go.dev plugin: + + +""" +import click + +api_url = "https://vuln.go.dev/ID" + + +@click.group() +@click.pass_context +def plugins(ctx): + """vuln.go.dev plugin""" + pass + + +@plugins.command() +@click.option("--id", "go_id", help="go vuln ID (ex. GO-2022-0189") +@click.pass_context +def get(ctx, go_id): + """Search go.vuln.dev by go vuln ID""" + if not go_id: + click.echo(ctx.get_help()) + exit(0) + click.launch(f"{api_url}/{go_id}.json") diff --git a/griffon/exceptions.py b/griffon/exceptions.py new file mode 100644 index 0000000..dc84521 --- /dev/null +++ b/griffon/exceptions.py @@ -0,0 +1,19 @@ +from functools import partial, wraps + +import click + + +# TODO - unsure if this is the right idiom +def catch_exception(func=None, *, handle): + """catch exception decorator""" + if not func: + return partial(catch_exception, handle=handle) + + @wraps(func) + def wrapper(*args, **kwargs): + try: + return func(*args, **kwargs) + except handle as e: + raise click.ClickException(e) + + return wrapper diff --git a/griffon/output.py b/griffon/output.py new file mode 100644 index 0000000..a731743 --- /dev/null +++ b/griffon/output.py @@ -0,0 +1,33 @@ +import json + +import click +from rich.console import Console + +console = Console() + + +def cprint(data, dest="console", format="json", filename=None, ctx=None, show_count=True): + """handle format and output""" + if type(data) == list: + results = [] + for d in data: + if type(d) is dict: + results.append(d) + else: + results.append(d.to_dict()) + output = { + "results": results, + "count": len(data), + } + if show_count: + output["count"] = len(data) + console.print_json(json.dumps(output)) + else: + try: + console.print_json(json.dumps(data)) + except Exception as exc: # noqa + console.print_json(json.dumps(data.to_dict())) + if ctx: + if "link" in data and "open_browser" in ctx.obj: + if ctx.obj["open_browser"]: + click.launch(data["link"]) diff --git a/griffon/service_layer/__init__.py b/griffon/service_layer/__init__.py new file mode 100644 index 0000000..39d8a1e --- /dev/null +++ b/griffon/service_layer/__init__.py @@ -0,0 +1,34 @@ +# define interface for query which is asserted by mypy as well as runtime checking + +from typing import Protocol, runtime_checkable + + +@runtime_checkable +class Query(Protocol): + """Query service interface""" + + name: str + description: str + + def execute(self, ctx: dict) -> dict: + """execute() uses a generic ctx dict to pass in all parameters""" + return {} + + +@runtime_checkable +class Process(Protocol): + """Process service interface""" + + name: str + description: str + + def update(self, payload: dict) -> dict: + return {} + + def payload(self, ctx: dict) -> dict: + """execute() uses a generic ctx dict to pass in all parameters""" + return {} + + def execute(self, ctx: dict) -> dict: + """execute() uses a generic ctx dict to pass in all parameters""" + return {} diff --git a/griffon/service_layer/core_process.py b/griffon/service_layer/core_process.py new file mode 100644 index 0000000..07c3c84 --- /dev/null +++ b/griffon/service_layer/core_process.py @@ -0,0 +1,31 @@ +""" + mutation + + inputs and mutation output +""" + +from griffon import CorgiService, OSIDBService + + +# TODO - stub +class generate_affects_for_specific_component_process: + """Generate OSIDB affects for a specific component.""" + + name = "generate_affects_for_specific_component" + description = "Generate osidb affects for a specific component." + + def __init__(self) -> None: + self.corgi_session = CorgiService.create_session() + self.osidb_session = OSIDBService.create_session() + + def update(self, payload: dict) -> None: + # create = self.osidb_session.affects.create(payload) + pass + + def payload(self, ctx) -> dict: + return { + "test": "test", + } + + def execute(self, ctx) -> None: + return self.update(self.payload(ctx)) diff --git a/griffon/service_layer/core_queries.py b/griffon/service_layer/core_queries.py new file mode 100644 index 0000000..0801620 --- /dev/null +++ b/griffon/service_layer/core_queries.py @@ -0,0 +1,285 @@ +""" + read only queries + +""" +import concurrent +import logging + +from griffon import CORGI_API_URL, OSIDB_API_URL, CorgiService, OSIDBService + +logger = logging.getLogger("rich") + + +class cves_for_specific_component_query: + """CVEs affecting a specific component?""" + + # include count + name = "cves_for_specific component" + description = "Which CVEs affect a specific component ?" + + def __init__(self) -> None: + self.corgi_session = CorgiService.create_session() + self.osidb_session = OSIDBService.create_session() + + def execute(self, ctx) -> dict: + # TODO: add flaw_state, flaw_resolution, affect_impact, affect_resolution + purl = ctx["purl"] + affectedness = ctx["affectedness"] + component = self.corgi_session.components.retrieve_list(purl=purl) + c = component.additional_properties + affects: list = list() + for pv in c["product_versions"]: + ofuri = "o:redhat" + for part in pv["name"].split("-"): + ofuri += f":{part}" + + for affect in self.osidb_session.affects.retrieve_list( + ps_component=c["name"], ps_module=pv["name"], affectedness=affectedness, limit=10000 + ).results: + # TODO - OSIDB will be allowing for search of cve by affect which will optimise this + flaw = self.osidb_session.flaws.retrieve(affect.flaw) + if flaw: + affects.append( + { + "link_affect": f"{OSIDB_API_URL}/osidb/api/v1/affects/{affect.uuid}", # noqa + "link_cve": f"{OSIDB_API_URL}/osidb/api/v1/flaws/{flaw.cve_id}", + "flaw_cve_id": flaw.cve_id, + "title": flaw.title, + "flaw_state": flaw.state, + "flaw_resolution": flaw.resolution, + "affect_name": affect.ps_component, + "affect_product_version": affect.ps_module, + "affect_affectedness": affect.affectedness, + "affect_impact": affect.impact, + "affect_resolution": affect.resolution, + } + ) + return { + "link": f"{CORGI_API_URL}/api/v1/components?purl={c['purl']}", + "purl": c["purl"], + "name": c["name"], + "version": c["version"], + "nvr": c["nvr"], + "arch": c["arch"], + "affects": affects, + } + + +class components_affected_by_specific_cve_query: + """Given a specific CVE ID, what components are affected?""" + + name = "components_affected_by_specific_cve_query" + description = "Given a CVE ID, what components are affected?" + + def __init__(self) -> None: + self.corgi_session = CorgiService.create_session() + self.osidb_session = OSIDBService.create_session() + + # TODO - needs to be optimised + def execute(self, ctx) -> dict: + cve_id = ctx["cve_id"] + flaw = self.osidb_session.flaws.retrieve_list(cve_id=cve_id).results[0] + affects = self.osidb_session.affects.retrieve_list(flaw=flaw.uuid, limit=10000).results + components: list = list() + for affect in affects: + product_versions = self.corgi_session.product_versions.retrieve_list( + name=affect.ps_module + ).results + for pv in product_versions: + with concurrent.futures.ThreadPoolExecutor() as executor: + futures = [] + for ps in pv.product_streams: + futures.append( + executor.submit( + self.corgi_session.components.retrieve_list, + ofuri=ps["ofuri"], + name=affect.ps_component, + view="summary", + limit=10000, + ) + ) + for future in concurrent.futures.as_completed(futures): + try: + for c in future.result().results: + components.append(c.purl) + except Exception as exc: + logger.error("%r generated an exception: %s" % (future, exc)) + exit(0) + + distinct_components: list = list() + for purl in components: + distinct_components.append( + { + "link": f"{CORGI_API_URL}/api/v1/components?purl={purl}", + "purl": purl, + } + ) + return { + "link": f"{OSIDB_API_URL}/osidb/api/v1/flaws/{flaw.cve_id}", + "cve_id": flaw.cve_id, + "title": flaw.title, + "description": flaw.description, + "components": distinct_components, + } + + +class cves_for_specific_product_query: + name = "cves-for-product" + description = "What cves affect a specific product ?" + # include count + + def __init__(self) -> None: + self.corgi_session = CorgiService.create_session() + self.osidb_session = OSIDBService.create_session() + + def execute(self, ctx) -> dict: + product_version_name = ctx["product_version_name"] + affectedness = ctx["affectedness"] + impact = ctx["impact"] + resolution = ctx["resolution"] + flaw_state = ctx["flaw_state"] + flaw_resolution = ctx["flaw_resolution"] + + pv = self.corgi_session.product_versions.retrieve_list(name=product_version_name).results[0] + + if pv: + affects = list() + + affect_filters = {} + if affectedness: + affect_filters["affectedness"] = affectedness + if impact: + affect_filters["impact"] = impact + if resolution: + affect_filters["resolution"] = resolution + for affect in self.osidb_session.affects.retrieve_list( + ps_module=product_version_name, + **affect_filters, + ).results: + flaw_filters = {} + if flaw_state: + flaw_filters["state"] = flaw_state + if flaw_resolution: + flaw_filters["resolution"] = flaw_resolution + flaw = self.osidb_session.flaws.retrieve_list( + uuid=affect.flaw, + **flaw_filters, + ) + if flaw.count > 0: + f = flaw.results[0] + affects.append( + { + "link_cve": f"{OSIDB_API_URL}/osidb/api/v1/flaws/{f.cve_id}", + "flaw_cve_id": f.cve_id, + "flaw_state": f.state, + "flaw_resolution": f.resolution, + "title": f.title, + "link_affect": f"{OSIDB_API_URL}/osidb/api/v1/affects/{affect.uuid}", + "affect_name": affect.ps_component, + "affect_affectedness": affect.affectedness, + "affect_impact": affect.impact, + "affect_resolution": affect.resolution, + "link_component": f"{CORGI_API_URL}/api/v1/components?name={affect.ps_component}", # noqa + } + ) + + return { + "link": f"{CORGI_API_URL}/api/v1/product_versions?name={product_version_name}", + "ofuri": f"{pv.ofuri}", + "name": product_version_name, + "description": f"{pv.description}", + "affects": affects, + } + + +class products_versions_affected_by_specific_cve_query: + """Given a specific CVE ID, what products are affected?""" + + name = "product-versions-affected-by-specific-cve" + description = "Given a specific CVE ID, what product versions are affected?" + + def __init__(self) -> None: + self.osidb_session = OSIDBService.create_session() + + def execute(self, ctx) -> dict: + cve_id = ctx["cve_id"] + flaw = self.osidb_session.flaws.retrieve(cve_id) + pv_names = list() + for affect in flaw.affects: + pv_names.append(affect.ps_module) + pv_names = list(set(pv_names)) + product_versions = list() + for pv_name in pv_names: + product_versions.append( + { + "link": f"{CORGI_API_URL}/api/v1/product_versions?name={pv_name}", + "name": pv_name, + } + ) + return { + "link": f"{OSIDB_API_URL}/osidb/api/v1/flaws/{cve_id}", + "cve_id": cve_id, + "title": flaw.title, + "description": flaw.description, + "product_versions": product_versions, + } + + +class products_containing_specific_component_query: + """What products contain a specific component?""" + + name = "products_containing_specific_component_query" + description = "What products contain a specific component?" + + def __init__(self) -> None: + self.corgi_session = CorgiService.create_session() + + def execute(self, ctx) -> dict: + purl = ctx["purl"] + c = self.corgi_session.components.retrieve_list( + purl=purl, + ) + return { + "products": c["products"], + "product_versions": c["product_versions"], + "product_streams": c["product_streams"], + "product_variants": c["product_variants"], + "channels": c["channels"], + } + + + +class dep_us7_query: + """list active product_streams""" + + name = "dep_us7_query" + description = "list active product_streams" + + def __init__(self) -> None: + self.corgi_session = CorgiService.create_session() + + def execute(self, product_stream_name, ofuri) -> dict: + cond = {} + if product_stream_name: + cond["name"] = product_stream_name + if ofuri: + cond["ofuri"] = ofuri + # TODO - corgi bindings need to support ofuri in product_streams + product_stream = self.corgi_session.product_streams.retrieve_list(**cond) + components_cnt = self.corgi_session.components.retrieve_list( + ofuri=product_stream["ofuri"], view="summary", limit=1 + ).count + return { + "link": product_stream["link"], + "ofuri": product_stream["ofuri"], + "name": product_stream["name"], + "product": product_stream["products"][0]["name"], + "product_version": product_stream["product_versions"][0]["name"], + "brew_tags": list(product_stream["brew_tags"].keys()), + "build_count": product_stream["build_count"], + "latest_component_count": components_cnt, + "manifest_link": product_stream["manifest"], + "shipped_components_link": "tbd", + "latest_components_link": product_stream["components"], + "all_components_link": f"{CORGI_API_URL}/api/v1/components?product_streams={product_stream['ofuri']}&view=summary", # noqa + } diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..1a53d6a --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,13 @@ +[tool.black] +line-length = 100 + +[tool.isort] +profile = "black" + +[tool.mypy] +python_version = "3.9" +warn_unused_configs = true +warn_unreachable = true +warn_no_return = true +warn_unused_ignores = true +ignore_missing_imports = true diff --git a/requirements/base.in b/requirements/base.in new file mode 100644 index 0000000..a4bbf7d --- /dev/null +++ b/requirements/base.in @@ -0,0 +1,4 @@ +osidb-bindings +click +click-completion +rich diff --git a/requirements/base.txt b/requirements/base.txt new file mode 100644 index 0000000..1f0d1c7 --- /dev/null +++ b/requirements/base.txt @@ -0,0 +1,146 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --generate-hashes requirements/base.in +# +attrs==22.2.0 \ + --hash=sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836 \ + --hash=sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99 + # via osidb-bindings +certifi==2022.12.7 \ + --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ + --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 + # via requests +charset-normalizer==2.1.1 \ + --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ + --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f + # via requests +click==8.1.3 \ + --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \ + --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 + # via + # -r requirements/base.in + # click-completion +click-completion==0.5.2 \ + --hash=sha256:5bf816b81367e638a190b6e91b50779007d14301b3f9f3145d68e3cade7bce86 + # via -r requirements/base.in +commonmark==0.9.1 \ + --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ + --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 + # via rich +decorator==5.1.1 \ + --hash=sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330 \ + --hash=sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 + # via gssapi +gssapi==1.8.2 \ + --hash=sha256:02e0a8f35e1f5b1c0eada646e3da1af3022c25e8df26ded3fd18ee78abb155ea \ + --hash=sha256:13aba9a947994f5f5f1fb6f425b397a359b191cee2983fa33911cf5e212d6cfb \ + --hash=sha256:43c8b1acb8efa1f881ff7f7e912ccdc611689484190b7cc83f538b44f8992cbd \ + --hash=sha256:47d69b1fd3bd0764d7a14500c6cbd8fd08198ee6e1737048a01ad7024d57f67d \ + --hash=sha256:4aaed04439aed8eba525ea44dd7219ecd97d520254320e66ac53d9ae4acb8fe5 \ + --hash=sha256:512a2bd98e8003f48d98908bf54d1ed94c5388764e0a09fdc24cc691422a4162 \ + --hash=sha256:67c85758a6b40042509c96bb00d0873a501491453ad5b0da88dbfa9343c8ffea \ + --hash=sha256:75763c49b3e18da60e160d76e8ac9a27b0bbd637c6e88513150fbb7158ae15d7 \ + --hash=sha256:787262e0db124d302c972d30e6f4b7c81423e696d08ee6e07047194a9bce2664 \ + --hash=sha256:7c14cf97d61073d8211abfded77066af791356868022acda10224a8212639cf5 \ + --hash=sha256:84bfd1b3954a5a608302884a36586eed6f623f6f38fcd331ad55937eca1ea89f \ + --hash=sha256:85e7e623dfe51fef3f613acb965c4fa1866e7a7ee2c2558cbe2f203798171510 \ + --hash=sha256:8b4c1c664635153b0055a08bf30ec1552c8aa064a76f565d7905057500f334b3 \ + --hash=sha256:a36bc089036196aa03c3c312ea1639677065b3d7e8f37edbba731f61f5e56dd6 \ + --hash=sha256:b78e0a021cc91158660e4c5cc9263e07c719346c35a9c0f66725e914b235c89a \ + --hash=sha256:cdd6bff2cf7f3a5a5a24cddde137b6e117fe53aad81f240dee2e8e383c0b289b \ + --hash=sha256:d6be1d8e07cc151e217f8a0ccf7c28ca5a1bb0ae00c8512586642c9f876a7298 \ + --hash=sha256:dcd2be270bf490b6007eb3734795aaeddf92848f79b69d6a23f6204ccaa9b6c7 \ + --hash=sha256:f75b094913a1757e5e634b70b03e808cab0eb02c802ec50b760636b23b0aa50c \ + --hash=sha256:fac7d1f4b14383bd29d3996cf5f6f23d0dc50ffd7965d2bc35bcc0849da24152 + # via requests-gssapi +idna==3.4 \ + --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ + --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 + # via requests +jinja2==3.1.2 \ + --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ + --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 + # via click-completion +markupsafe==2.1.1 \ + --hash=sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003 \ + --hash=sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88 \ + --hash=sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5 \ + --hash=sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7 \ + --hash=sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a \ + --hash=sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603 \ + --hash=sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1 \ + --hash=sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135 \ + --hash=sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247 \ + --hash=sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6 \ + --hash=sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601 \ + --hash=sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77 \ + --hash=sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02 \ + --hash=sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e \ + --hash=sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63 \ + --hash=sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f \ + --hash=sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980 \ + --hash=sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b \ + --hash=sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812 \ + --hash=sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff \ + --hash=sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96 \ + --hash=sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1 \ + --hash=sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925 \ + --hash=sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a \ + --hash=sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6 \ + --hash=sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e \ + --hash=sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f \ + --hash=sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4 \ + --hash=sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f \ + --hash=sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3 \ + --hash=sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c \ + --hash=sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a \ + --hash=sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417 \ + --hash=sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a \ + --hash=sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a \ + --hash=sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37 \ + --hash=sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452 \ + --hash=sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933 \ + --hash=sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a \ + --hash=sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7 + # via jinja2 +osidb-bindings==2.1.0 \ + --hash=sha256:9f5f3811c82c81d0451e0353abc7dd382979681e1c047a7d0db41b661f7f04cd \ + --hash=sha256:a7d6b0189fed00538485b216d5169f36f655b58124f8bf10fb7f23285b037121 + # via -r requirements/base.in +pygments==2.14.0 \ + --hash=sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297 \ + --hash=sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717 + # via rich +python-dateutil==2.8.2 \ + --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ + --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 + # via osidb-bindings +requests==2.28.1 \ + --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \ + --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349 + # via + # osidb-bindings + # requests-gssapi +requests-gssapi==1.2.3 \ + --hash=sha256:20784508981401f7153c933eed095338933a40818da65a259dbf2d80dccb150e + # via osidb-bindings +rich==13.0.1 \ + --hash=sha256:25f83363f636995627a99f6e4abc52ed0970ebbd544960cc63cbb43aaac3d6f0 \ + --hash=sha256:41fe1d05f433b0f4724cda8345219213d2bfa472ef56b2f64f415b5b94d51b04 + # via -r requirements/base.in +shellingham==1.5.0.post1 \ + --hash=sha256:368bf8c00754fd4f55afb7bbb86e272df77e4dc76ac29dbcbb81a59e9fc15744 \ + --hash=sha256:823bc5fb5c34d60f285b624e7264f4dda254bc803a3774a147bf99c0e3004a28 + # via click-completion +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via + # click-completion + # python-dateutil +urllib3==1.26.13 \ + --hash=sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc \ + --hash=sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8 + # via requests diff --git a/requirements/dev.in b/requirements/dev.in new file mode 100644 index 0000000..2648f84 --- /dev/null +++ b/requirements/dev.in @@ -0,0 +1,6 @@ +-r base.txt +-r lint.txt +-r test.txt +ipdb +ipython +pip-tools diff --git a/requirements/dev.txt b/requirements/dev.txt new file mode 100644 index 0000000..30d9fd3 --- /dev/null +++ b/requirements/dev.txt @@ -0,0 +1,644 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --generate-hashes requirements/dev.in +# +asttokens==2.2.1 \ + --hash=sha256:4622110b2a6f30b77e1473affaa97e711bc2f07d3f10848420ff1898edbe94f3 \ + --hash=sha256:6b0ac9e93fb0335014d382b8fa9b3afa7df546984258005da0b9e7095b3deb1c + # via stack-data +attrs==22.2.0 \ + --hash=sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836 \ + --hash=sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99 + # via + # -r requirements/base.txt + # -r requirements/test.txt + # osidb-bindings + # pytest +backcall==0.2.0 \ + --hash=sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e \ + --hash=sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255 + # via ipython +black==22.12.0 \ + --hash=sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320 \ + --hash=sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351 \ + --hash=sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350 \ + --hash=sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f \ + --hash=sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf \ + --hash=sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148 \ + --hash=sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4 \ + --hash=sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d \ + --hash=sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc \ + --hash=sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d \ + --hash=sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2 \ + --hash=sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f + # via -r requirements/lint.txt +build==0.9.0 \ + --hash=sha256:1a07724e891cbd898923145eb7752ee7653674c511378eb9c7691aab1612bc3c \ + --hash=sha256:38a7a2b7a0bdc61a42a0a67509d88c71ecfc37b393baba770fae34e20929ff69 + # via pip-tools +certifi==2022.12.7 \ + --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ + --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 + # via + # -r requirements/base.txt + # -r requirements/lint.txt + # -r requirements/test.txt + # requests +charset-normalizer==2.1.1 \ + --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ + --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f + # via + # -r requirements/base.txt + # -r requirements/lint.txt + # -r requirements/test.txt + # requests +click==8.1.3 \ + --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \ + --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 + # via + # -r requirements/base.txt + # -r requirements/lint.txt + # -r requirements/test.txt + # black + # click-completion + # pip-tools +click-completion==0.5.2 \ + --hash=sha256:5bf816b81367e638a190b6e91b50779007d14301b3f9f3145d68e3cade7bce86 + # via + # -r requirements/base.txt + # -r requirements/test.txt +commonmark==0.9.1 \ + --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ + --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 + # via + # -r requirements/base.txt + # -r requirements/test.txt + # rich +coverage[toml]==7.0.4 \ + --hash=sha256:0322354757b47640535daabd2d56384ff3cad2896248fc84d328c5fad4922d5c \ + --hash=sha256:053cdc47cae08257051d7e934a0de4d095b60eb8a3024fa9f1b2322fa1547137 \ + --hash=sha256:0815a09b32384e8ff00a5939ec9cd10efce8742347e019c2daca1a32f5ac2aae \ + --hash=sha256:1791e5f74c5b52f76e83fe9f4bb9571cf76d40ee0c51952ee1e4ee935b7e98b9 \ + --hash=sha256:1ba5cc54baf3c322c4388de2a43cc95f7809366f0600e743e5aae8ea9d1038b2 \ + --hash=sha256:1e9e94f2612ee549a4b3ee79cbc61bceed77e69cf38cfa05858bae939a886d16 \ + --hash=sha256:22d8ef6865cb6834cab2b72fff20747a55c714b57b675f7e11c9624fe4f7cb45 \ + --hash=sha256:260854160083f8275a9d9d49a05ab0ffc7a1f08f2ccccbfaec94a18aae9f407c \ + --hash=sha256:2904d7a0388911c61e7e3beefe48c29dfccaba938fc1158f63190101a21e04c2 \ + --hash=sha256:2b5936b624fbe711ed02dfd86edd678822e5ee68da02b6d231e5c01090b64590 \ + --hash=sha256:2b854f7985b48122b6fe346631e86d67b63293f8255cb59a93d79e3d9f1574e3 \ + --hash=sha256:2dfbee0bf0d633be3a2ab068f5a5731a70adf147d0ba17d9f9932b46c7c5782b \ + --hash=sha256:2e59aef3fba5758059208c9eff10ae7ded3629e797972746ec33b56844f69411 \ + --hash=sha256:32dc010713455ac0fe2fddb0e48aa43875cc7eb7b09768df10bad8ce45f9c430 \ + --hash=sha256:34c0457e1ba450ae8b22dc8ea2fd36ada1010af61291e4c96963cd9d9633366f \ + --hash=sha256:3d9201cfa5a98652b9cef36ab202f17fe3ea83f497b4ba2a8ed39399dfb8fcd4 \ + --hash=sha256:4665a714af31f160403c2e448fb2fef330719d2e04e836b08d60d612707c1041 \ + --hash=sha256:4e8267466662aff93d66fa72b9591d02122dfc8a729b0a43dd70e0fb07ed9b37 \ + --hash=sha256:55121fe140d7e42cb970999b93cf1c2b24484ce028b32bbd00238bb25c13e34a \ + --hash=sha256:5caa9dd91dcc5f054350dc57a02e053d79633907b9ccffff999568d13dcd19f8 \ + --hash=sha256:6abc91f6f8b3cc0ae1034e2c03f38769fba1952ab70d0b26953aa01691265c39 \ + --hash=sha256:6c5554d55668381e131577f20e8f620d4882b04ad558f7e7f3f1f55b3124c379 \ + --hash=sha256:70c294bb15ba576fb96b580db35895bf03749d683df044212b74e938a7f6821f \ + --hash=sha256:73bc6114aab7753ca784f87bcd3b7613bc797aa255b5bca45e5654070ae9acfb \ + --hash=sha256:92f135d370fcd7a6fb9659fa2eb716dd2ca364719cbb1756f74d90a221bca1a7 \ + --hash=sha256:9cb88a3019ad042eaa69fc7639ef077793fedbf313e89207aa82fefe92c97ebd \ + --hash=sha256:9dafdba3b2b9010abab08cb8c0dc6549bfca6e1630fe14d47b01dca00d39e694 \ + --hash=sha256:a63922765ee49d5b4c32afb2cd5516812c8665f3b78e64a0dd005bdfabf991b1 \ + --hash=sha256:a78a80d131c067d67d8a6f9bd3d3f7ea7eac82c1c7259f97d7ab73f723da9d55 \ + --hash=sha256:b75aff2c35ceaa299691e772f7bf7c8aeab25f46acea2be3dd04cccb914a9860 \ + --hash=sha256:b84076e3de192fba0f95e279ac017b64c7c6ecd4f09f36f13420f5bed898a9c7 \ + --hash=sha256:b8dfb5fed540f77e814bf4ec79619c241af6b4578fa1093c5e3389bbb7beab3f \ + --hash=sha256:bc74b64bfa89e2f862ea45dd6ac1def371d7cc883b76680d20bdd61a6f3daa20 \ + --hash=sha256:bc9c77004970a364a1e5454cf7cb884e4277592b959c287689b2a0fd027ef552 \ + --hash=sha256:c027fbb83a8c78a6e06a0302ea1799fdb70e5cda9845a5e000545b8e2b47ea39 \ + --hash=sha256:c06046f54e719da21c79f98ecc0962581d1aee0b3798dc6b12b1217da8bf93f4 \ + --hash=sha256:c58921fcd9914b56444292e7546fe183d079db99528142c809549ddeaeacd8e9 \ + --hash=sha256:c82f34fafaf5bc05d222fcf84423d6e156432ca35ca78672d4affd0c09c6ef6c \ + --hash=sha256:caf82db5b7f16b51ec32fe0bd2da0805b177c807aa8bfb478c7e6f893418c284 \ + --hash=sha256:cb8cfa3bf3a9f18211279458917fef5edeb5e1fdebe2ea8b11969ec2ebe48884 \ + --hash=sha256:d68f2f7bddb3acdd3b36ef7f334b9d14f30b93e094f808fbbd8d288b8f9e2f9b \ + --hash=sha256:daf91db39324e9939a9db919ee4fb42a1a23634a056616dae891a030e89f87ba \ + --hash=sha256:dcfbf8ffc046f20d75fd775a92c378f6fc7b9bded6c6f2ab88b6b9cb5805a184 \ + --hash=sha256:e44b60b0b49aa85d548d392a2dca2c6a581cd4084e72e9e16bd58bd86ec20816 \ + --hash=sha256:ea45f0dba5a993e93b158f1a9dcfff2770e3bcabf2b80dbe7aa15dce0bcb3bf3 \ + --hash=sha256:ee32a080bab779b71c4d09a3eb5254bfca43ee88828a683dab27dfe8f582516e \ + --hash=sha256:efc200fa75d9634525b40babc7a16342bd21c101db1a58ef84dc14f4bf6ac0fd \ + --hash=sha256:f092d9f2ddaa30235d33335fbdb61eb8f3657af519ef5f9dd6bdae65272def11 \ + --hash=sha256:f3d485e6ec6e09857bf2115ece572d666b7c498377d4c70e66bb06c63ed177c2 \ + --hash=sha256:f684d88eb4924ed0630cf488fd5606e334c6835594bb5fe36b50a509b10383ed \ + --hash=sha256:f6c4ad409a0caf7e2e12e203348b1a9b19c514e7d078520973147bf2d3dcbc6f + # via + # -r requirements/test.txt + # pytest-cov +decorator==5.1.1 \ + --hash=sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330 \ + --hash=sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 + # via + # -r requirements/base.txt + # -r requirements/test.txt + # gssapi + # ipdb + # ipython +detect-secrets==1.4.0 \ + --hash=sha256:d08ecabeee8b68c0acb0e8a354fb98d822a653f6ed05e520cead4c6fc1fc02cd \ + --hash=sha256:d56787e339758cef48c9ccd6692f7a094b9963c979c9813580b0169e41132833 + # via -r requirements/lint.txt +exceptiongroup==1.1.0 \ + --hash=sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e \ + --hash=sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23 + # via + # -r requirements/lint.txt + # -r requirements/test.txt + # pytest +executing==1.2.0 \ + --hash=sha256:0314a69e37426e3608aada02473b4161d4caf5a4b244d1d0c48072b8fee7bacc \ + --hash=sha256:19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107 + # via stack-data +flake8==6.0.0 \ + --hash=sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7 \ + --hash=sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181 + # via -r requirements/lint.txt +gssapi==1.8.2 \ + --hash=sha256:02e0a8f35e1f5b1c0eada646e3da1af3022c25e8df26ded3fd18ee78abb155ea \ + --hash=sha256:13aba9a947994f5f5f1fb6f425b397a359b191cee2983fa33911cf5e212d6cfb \ + --hash=sha256:43c8b1acb8efa1f881ff7f7e912ccdc611689484190b7cc83f538b44f8992cbd \ + --hash=sha256:47d69b1fd3bd0764d7a14500c6cbd8fd08198ee6e1737048a01ad7024d57f67d \ + --hash=sha256:4aaed04439aed8eba525ea44dd7219ecd97d520254320e66ac53d9ae4acb8fe5 \ + --hash=sha256:512a2bd98e8003f48d98908bf54d1ed94c5388764e0a09fdc24cc691422a4162 \ + --hash=sha256:67c85758a6b40042509c96bb00d0873a501491453ad5b0da88dbfa9343c8ffea \ + --hash=sha256:75763c49b3e18da60e160d76e8ac9a27b0bbd637c6e88513150fbb7158ae15d7 \ + --hash=sha256:787262e0db124d302c972d30e6f4b7c81423e696d08ee6e07047194a9bce2664 \ + --hash=sha256:7c14cf97d61073d8211abfded77066af791356868022acda10224a8212639cf5 \ + --hash=sha256:84bfd1b3954a5a608302884a36586eed6f623f6f38fcd331ad55937eca1ea89f \ + --hash=sha256:85e7e623dfe51fef3f613acb965c4fa1866e7a7ee2c2558cbe2f203798171510 \ + --hash=sha256:8b4c1c664635153b0055a08bf30ec1552c8aa064a76f565d7905057500f334b3 \ + --hash=sha256:a36bc089036196aa03c3c312ea1639677065b3d7e8f37edbba731f61f5e56dd6 \ + --hash=sha256:b78e0a021cc91158660e4c5cc9263e07c719346c35a9c0f66725e914b235c89a \ + --hash=sha256:cdd6bff2cf7f3a5a5a24cddde137b6e117fe53aad81f240dee2e8e383c0b289b \ + --hash=sha256:d6be1d8e07cc151e217f8a0ccf7c28ca5a1bb0ae00c8512586642c9f876a7298 \ + --hash=sha256:dcd2be270bf490b6007eb3734795aaeddf92848f79b69d6a23f6204ccaa9b6c7 \ + --hash=sha256:f75b094913a1757e5e634b70b03e808cab0eb02c802ec50b760636b23b0aa50c \ + --hash=sha256:fac7d1f4b14383bd29d3996cf5f6f23d0dc50ffd7965d2bc35bcc0849da24152 + # via + # -r requirements/base.txt + # -r requirements/test.txt + # requests-gssapi +idna==3.4 \ + --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ + --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 + # via + # -r requirements/base.txt + # -r requirements/lint.txt + # -r requirements/test.txt + # requests +iniconfig==2.0.0 \ + --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ + --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 + # via + # -r requirements/test.txt + # pytest +ipdb==0.13.11 \ + --hash=sha256:c23b6736f01fd4586cc2ecbebdf79a5eb454796853e1cd8f2ed3b7b91d4a3e93 \ + --hash=sha256:f74c2f741c18b909eaf89f19fde973f745ac721744aa1465888ce45813b63a9c + # via -r requirements/dev.in +ipython==8.8.0 \ + --hash=sha256:da01e6df1501e6e7c32b5084212ddadd4ee2471602e2cf3e0190f4de6b0ea481 \ + --hash=sha256:f3bf2c08505ad2c3f4ed5c46ae0331a8547d36bf4b21a451e8ae80c0791db95b + # via + # -r requirements/dev.in + # ipdb +isort==5.11.4 \ + --hash=sha256:6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6 \ + --hash=sha256:c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b + # via -r requirements/lint.txt +jedi==0.18.2 \ + --hash=sha256:203c1fd9d969ab8f2119ec0a3342e0b49910045abe6af0a3ae83a5764d54639e \ + --hash=sha256:bae794c30d07f6d910d32a7048af09b5a39ed740918da923c6b780790ebac612 + # via ipython +jinja2==3.1.2 \ + --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ + --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 + # via + # -r requirements/base.txt + # -r requirements/test.txt + # click-completion +lxml==4.9.2 \ + --hash=sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7 \ + --hash=sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726 \ + --hash=sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03 \ + --hash=sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140 \ + --hash=sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a \ + --hash=sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05 \ + --hash=sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03 \ + --hash=sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419 \ + --hash=sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4 \ + --hash=sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e \ + --hash=sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67 \ + --hash=sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50 \ + --hash=sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894 \ + --hash=sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf \ + --hash=sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947 \ + --hash=sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1 \ + --hash=sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd \ + --hash=sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3 \ + --hash=sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92 \ + --hash=sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3 \ + --hash=sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457 \ + --hash=sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74 \ + --hash=sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf \ + --hash=sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1 \ + --hash=sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4 \ + --hash=sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975 \ + --hash=sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5 \ + --hash=sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe \ + --hash=sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7 \ + --hash=sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1 \ + --hash=sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2 \ + --hash=sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409 \ + --hash=sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f \ + --hash=sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f \ + --hash=sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5 \ + --hash=sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24 \ + --hash=sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e \ + --hash=sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4 \ + --hash=sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a \ + --hash=sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c \ + --hash=sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de \ + --hash=sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f \ + --hash=sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b \ + --hash=sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5 \ + --hash=sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7 \ + --hash=sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a \ + --hash=sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c \ + --hash=sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9 \ + --hash=sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e \ + --hash=sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab \ + --hash=sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941 \ + --hash=sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5 \ + --hash=sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45 \ + --hash=sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7 \ + --hash=sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892 \ + --hash=sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746 \ + --hash=sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c \ + --hash=sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53 \ + --hash=sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe \ + --hash=sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184 \ + --hash=sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38 \ + --hash=sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df \ + --hash=sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9 \ + --hash=sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b \ + --hash=sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2 \ + --hash=sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0 \ + --hash=sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda \ + --hash=sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b \ + --hash=sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5 \ + --hash=sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380 \ + --hash=sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33 \ + --hash=sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8 \ + --hash=sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1 \ + --hash=sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889 \ + --hash=sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9 \ + --hash=sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f \ + --hash=sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c + # via -r requirements/test.txt +markupsafe==2.1.1 \ + --hash=sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003 \ + --hash=sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88 \ + --hash=sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5 \ + --hash=sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7 \ + --hash=sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a \ + --hash=sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603 \ + --hash=sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1 \ + --hash=sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135 \ + --hash=sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247 \ + --hash=sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6 \ + --hash=sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601 \ + --hash=sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77 \ + --hash=sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02 \ + --hash=sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e \ + --hash=sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63 \ + --hash=sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f \ + --hash=sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980 \ + --hash=sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b \ + --hash=sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812 \ + --hash=sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff \ + --hash=sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96 \ + --hash=sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1 \ + --hash=sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925 \ + --hash=sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a \ + --hash=sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6 \ + --hash=sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e \ + --hash=sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f \ + --hash=sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4 \ + --hash=sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f \ + --hash=sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3 \ + --hash=sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c \ + --hash=sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a \ + --hash=sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417 \ + --hash=sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a \ + --hash=sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a \ + --hash=sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37 \ + --hash=sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452 \ + --hash=sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933 \ + --hash=sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a \ + --hash=sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7 + # via + # -r requirements/base.txt + # -r requirements/test.txt + # jinja2 +matplotlib-inline==0.1.6 \ + --hash=sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311 \ + --hash=sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304 + # via ipython +mccabe==0.7.0 \ + --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e + # via + # -r requirements/lint.txt + # flake8 +mypy==0.991 \ + --hash=sha256:0714258640194d75677e86c786e80ccf294972cc76885d3ebbb560f11db0003d \ + --hash=sha256:0c8f3be99e8a8bd403caa8c03be619544bc2c77a7093685dcf308c6b109426c6 \ + --hash=sha256:0cca5adf694af539aeaa6ac633a7afe9bbd760df9d31be55ab780b77ab5ae8bf \ + --hash=sha256:1c8cd4fb70e8584ca1ed5805cbc7c017a3d1a29fb450621089ffed3e99d1857f \ + --hash=sha256:1f7d1a520373e2272b10796c3ff721ea1a0712288cafaa95931e66aa15798813 \ + --hash=sha256:209ee89fbb0deed518605edddd234af80506aec932ad28d73c08f1400ef80a33 \ + --hash=sha256:26efb2fcc6b67e4d5a55561f39176821d2adf88f2745ddc72751b7890f3194ad \ + --hash=sha256:37bd02ebf9d10e05b00d71302d2c2e6ca333e6c2a8584a98c00e038db8121f05 \ + --hash=sha256:3a700330b567114b673cf8ee7388e949f843b356a73b5ab22dd7cff4742a5297 \ + --hash=sha256:3c0165ba8f354a6d9881809ef29f1a9318a236a6d81c690094c5df32107bde06 \ + --hash=sha256:3d80e36b7d7a9259b740be6d8d906221789b0d836201af4234093cae89ced0cd \ + --hash=sha256:4175593dc25d9da12f7de8de873a33f9b2b8bdb4e827a7cae952e5b1a342e243 \ + --hash=sha256:4307270436fd7694b41f913eb09210faff27ea4979ecbcd849e57d2da2f65305 \ + --hash=sha256:5e80e758243b97b618cdf22004beb09e8a2de1af481382e4d84bc52152d1c476 \ + --hash=sha256:641411733b127c3e0dab94c45af15fea99e4468f99ac88b39efb1ad677da5711 \ + --hash=sha256:652b651d42f155033a1967739788c436491b577b6a44e4c39fb340d0ee7f0d70 \ + --hash=sha256:6d7464bac72a85cb3491c7e92b5b62f3dcccb8af26826257760a552a5e244aa5 \ + --hash=sha256:74e259b5c19f70d35fcc1ad3d56499065c601dfe94ff67ae48b85596b9ec1461 \ + --hash=sha256:7d17e0a9707d0772f4a7b878f04b4fd11f6f5bcb9b3813975a9b13c9332153ab \ + --hash=sha256:901c2c269c616e6cb0998b33d4adbb4a6af0ac4ce5cd078afd7bc95830e62c1c \ + --hash=sha256:98e781cd35c0acf33eb0295e8b9c55cdbef64fcb35f6d3aa2186f289bed6e80d \ + --hash=sha256:a12c56bf73cdab116df96e4ff39610b92a348cc99a1307e1da3c3768bbb5b135 \ + --hash=sha256:ac6e503823143464538efda0e8e356d871557ef60ccd38f8824a4257acc18d93 \ + --hash=sha256:b8472f736a5bfb159a5e36740847808f6f5b659960115ff29c7cecec1741c648 \ + --hash=sha256:b86ce2c1866a748c0f6faca5232059f881cda6dda2a893b9a8373353cfe3715a \ + --hash=sha256:bc9ec663ed6c8f15f4ae9d3c04c989b744436c16d26580eaa760ae9dd5d662eb \ + --hash=sha256:c9166b3f81a10cdf9b49f2d594b21b31adadb3d5e9db9b834866c3258b695be3 \ + --hash=sha256:d13674f3fb73805ba0c45eb6c0c3053d218aa1f7abead6e446d474529aafc372 \ + --hash=sha256:de32edc9b0a7e67c2775e574cb061a537660e51210fbf6006b0b36ea695ae9bb \ + --hash=sha256:e62ebaad93be3ad1a828a11e90f0e76f15449371ffeecca4a0a0b9adc99abcef + # via -r requirements/test.txt +mypy-extensions==0.4.3 \ + --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \ + --hash=sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8 + # via + # -r requirements/lint.txt + # -r requirements/test.txt + # black + # mypy +osidb-bindings==2.1.0 \ + --hash=sha256:9f5f3811c82c81d0451e0353abc7dd382979681e1c047a7d0db41b661f7f04cd \ + --hash=sha256:a7d6b0189fed00538485b216d5169f36f655b58124f8bf10fb7f23285b037121 + # via + # -r requirements/base.txt + # -r requirements/test.txt +packaging==23.0 \ + --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 \ + --hash=sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97 + # via + # -r requirements/test.txt + # build + # pytest +parso==0.8.3 \ + --hash=sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0 \ + --hash=sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 + # via jedi +pathspec==0.10.3 \ + --hash=sha256:3c95343af8b756205e2aba76e843ba9520a24dd84f68c22b9f93251507509dd6 \ + --hash=sha256:56200de4077d9d0791465aa9095a01d421861e405b5096955051deefd697d6f6 + # via + # -r requirements/lint.txt + # black +pep517==0.13.0 \ + --hash=sha256:4ba4446d80aed5b5eac6509ade100bff3e7943a8489de249654a5ae9b33ee35b \ + --hash=sha256:ae69927c5c172be1add9203726d4b84cf3ebad1edcd5f71fcdc746e66e829f59 + # via build +pexpect==4.8.0 \ + --hash=sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937 \ + --hash=sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c + # via ipython +pickleshare==0.7.5 \ + --hash=sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca \ + --hash=sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56 + # via ipython +pip==22.3.1 \ + --hash=sha256:65fd48317359f3af8e593943e6ae1506b66325085ea64b706a998c6e83eeaf38 \ + --hash=sha256:908c78e6bc29b676ede1c4d57981d490cb892eb45cd8c214ab6298125119e077 + # via pip-tools +pip-tools==6.12.1 \ + --hash=sha256:88efb7b29a923ffeac0713e6f23ef8529cc6175527d42b93f73756cc94387293 \ + --hash=sha256:f0c0c0ec57b58250afce458e2e6058b1f30a4263db895b7d72fd6311bf1dc6f7 + # via -r requirements/dev.in +platformdirs==2.6.2 \ + --hash=sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490 \ + --hash=sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2 + # via + # -r requirements/lint.txt + # black +pluggy==1.0.0 \ + --hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \ + --hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3 + # via + # -r requirements/test.txt + # pytest +prompt-toolkit==3.0.36 \ + --hash=sha256:3e163f254bef5a03b146397d7c1963bd3e2812f0964bb9a24e6ec761fd28db63 \ + --hash=sha256:aa64ad242a462c5ff0363a7b9cfe696c20d55d9fc60c11fd8e632d064804d305 + # via ipython +ptyprocess==0.7.0 \ + --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 \ + --hash=sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220 + # via pexpect +pure-eval==0.2.2 \ + --hash=sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350 \ + --hash=sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3 + # via stack-data +pycodestyle==2.10.0 \ + --hash=sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053 \ + --hash=sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610 + # via + # -r requirements/lint.txt + # flake8 +pyflakes==3.0.1 \ + --hash=sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf \ + --hash=sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd + # via + # -r requirements/lint.txt + # flake8 +pygments==2.14.0 \ + --hash=sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297 \ + --hash=sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717 + # via + # -r requirements/base.txt + # -r requirements/test.txt + # ipython + # rich +pytest==7.2.0 \ + --hash=sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71 \ + --hash=sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59 + # via + # -r requirements/test.txt + # pytest-cov +pytest-cov==4.0.0 \ + --hash=sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b \ + --hash=sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470 + # via -r requirements/test.txt +python-dateutil==2.8.2 \ + --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ + --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 + # via + # -r requirements/base.txt + # -r requirements/test.txt + # osidb-bindings +pyyaml==6.0 \ + --hash=sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf \ + --hash=sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293 \ + --hash=sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b \ + --hash=sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57 \ + --hash=sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b \ + --hash=sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4 \ + --hash=sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07 \ + --hash=sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba \ + --hash=sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9 \ + --hash=sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287 \ + --hash=sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513 \ + --hash=sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0 \ + --hash=sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782 \ + --hash=sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0 \ + --hash=sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92 \ + --hash=sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f \ + --hash=sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2 \ + --hash=sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc \ + --hash=sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1 \ + --hash=sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c \ + --hash=sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86 \ + --hash=sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4 \ + --hash=sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c \ + --hash=sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34 \ + --hash=sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b \ + --hash=sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d \ + --hash=sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c \ + --hash=sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb \ + --hash=sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7 \ + --hash=sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737 \ + --hash=sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3 \ + --hash=sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d \ + --hash=sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358 \ + --hash=sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53 \ + --hash=sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78 \ + --hash=sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803 \ + --hash=sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a \ + --hash=sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f \ + --hash=sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174 \ + --hash=sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5 + # via + # -r requirements/lint.txt + # detect-secrets +requests==2.28.1 \ + --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \ + --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349 + # via + # -r requirements/base.txt + # -r requirements/lint.txt + # -r requirements/test.txt + # detect-secrets + # osidb-bindings + # requests-gssapi +requests-gssapi==1.2.3 \ + --hash=sha256:20784508981401f7153c933eed095338933a40818da65a259dbf2d80dccb150e + # via + # -r requirements/base.txt + # -r requirements/test.txt + # osidb-bindings +rich==13.0.1 \ + --hash=sha256:25f83363f636995627a99f6e4abc52ed0970ebbd544960cc63cbb43aaac3d6f0 \ + --hash=sha256:41fe1d05f433b0f4724cda8345219213d2bfa472ef56b2f64f415b5b94d51b04 + # via + # -r requirements/base.txt + # -r requirements/test.txt +setuptools==65.6.3 \ + --hash=sha256:57f6f22bde4e042978bcd50176fdb381d7c21a9efa4041202288d3737a0c6a54 \ + --hash=sha256:a7620757bf984b58deaf32fc8a4577a9bbc0850cf92c20e1ce41c38c19e5fb75 + # via pip-tools +shellingham==1.5.0.post1 \ + --hash=sha256:368bf8c00754fd4f55afb7bbb86e272df77e4dc76ac29dbcbb81a59e9fc15744 \ + --hash=sha256:823bc5fb5c34d60f285b624e7264f4dda254bc803a3774a147bf99c0e3004a28 + # via + # -r requirements/base.txt + # -r requirements/test.txt + # click-completion +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via + # -r requirements/base.txt + # -r requirements/test.txt + # click-completion + # python-dateutil +stack-data==0.6.2 \ + --hash=sha256:32d2dd0376772d01b6cb9fc996f3c8b57a357089dec328ed4b6553d037eaf815 \ + --hash=sha256:cbb2a53eb64e5785878201a97ed7c7b94883f48b87bfb0bbe8b623c74679e4a8 + # via ipython +tomli==2.0.1 \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f + # via + # -r requirements/lint.txt + # -r requirements/test.txt + # black + # build + # coverage + # ipdb + # mypy + # pytest +traitlets==5.8.1 \ + --hash=sha256:32500888f5ff7bbf3b9267ea31748fa657aaf34d56d85e60f91dda7dc7f5785b \ + --hash=sha256:a1ca5df6414f8b5760f7c5f256e326ee21b581742114545b462b35ffe3f04861 + # via + # ipython + # matplotlib-inline +types-requests==2.28.11.7 \ + --hash=sha256:0ae38633734990d019b80f5463dfa164ebd3581998ac8435f526da6fe4d598c3 \ + --hash=sha256:b6a2fca8109f4fdba33052f11ed86102bddb2338519e1827387137fefc66a98b + # via -r requirements/test.txt +types-urllib3==1.26.25.4 \ + --hash=sha256:ed6b9e8a8be488796f72306889a06a3fc3cb1aa99af02ab8afb50144d7317e49 \ + --hash=sha256:eec5556428eec862b1ac578fb69aab3877995a99ffec9e5a12cf7fbd0cc9daee + # via + # -r requirements/test.txt + # types-requests +typing-extensions==4.4.0 \ + --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ + --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e + # via + # -r requirements/lint.txt + # -r requirements/test.txt + # black + # mypy +urllib3==1.26.13 \ + --hash=sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc \ + --hash=sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8 + # via + # -r requirements/base.txt + # -r requirements/lint.txt + # -r requirements/test.txt + # requests +wcwidth==0.2.5 \ + --hash=sha256:beb4802a9cebb9144e99086eff703a642a13d6a0052920003a230f3294bbe784 \ + --hash=sha256:c4d647b99872929fdb7bdcaa4fbe7f01413ed3d98077df798530e5b04f116c83 + # via prompt-toolkit +wheel==0.38.4 \ + --hash=sha256:965f5259b566725405b05e7cf774052044b1ed30119b5d586b2703aafe8719ac \ + --hash=sha256:b60533f3f5d530e971d6737ca6d58681ee434818fab630c83a734bb10c083ce8 + # via pip-tools diff --git a/requirements/lint.in b/requirements/lint.in new file mode 100644 index 0000000..5f68a7b --- /dev/null +++ b/requirements/lint.in @@ -0,0 +1,7 @@ +black +detect-secrets +flake8 +isort +tomli +exceptiongroup +typing-extensions diff --git a/requirements/lint.txt b/requirements/lint.txt new file mode 100644 index 0000000..f482761 --- /dev/null +++ b/requirements/lint.txt @@ -0,0 +1,138 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --generate-hashes requirements/lint.in +# +black==22.12.0 \ + --hash=sha256:101c69b23df9b44247bd88e1d7e90154336ac4992502d4197bdac35dd7ee3320 \ + --hash=sha256:159a46a4947f73387b4d83e87ea006dbb2337eab6c879620a3ba52699b1f4351 \ + --hash=sha256:1f58cbe16dfe8c12b7434e50ff889fa479072096d79f0a7f25e4ab8e94cd8350 \ + --hash=sha256:229351e5a18ca30f447bf724d007f890f97e13af070bb6ad4c0a441cd7596a2f \ + --hash=sha256:436cc9167dd28040ad90d3b404aec22cedf24a6e4d7de221bec2730ec0c97bcf \ + --hash=sha256:559c7a1ba9a006226f09e4916060982fd27334ae1998e7a38b3f33a37f7a2148 \ + --hash=sha256:7412e75863aa5c5411886804678b7d083c7c28421210180d67dfd8cf1221e1f4 \ + --hash=sha256:77d86c9f3db9b1bf6761244bc0b3572a546f5fe37917a044e02f3166d5aafa7d \ + --hash=sha256:82d9fe8fee3401e02e79767016b4907820a7dc28d70d137eb397b92ef3cc5bfc \ + --hash=sha256:9eedd20838bd5d75b80c9f5487dbcb06836a43833a37846cf1d8c1cc01cef59d \ + --hash=sha256:c116eed0efb9ff870ded8b62fe9f28dd61ef6e9ddd28d83d7d264a38417dcee2 \ + --hash=sha256:d30b212bffeb1e252b31dd269dfae69dd17e06d92b87ad26e23890f3efea366f + # via -r requirements/lint.in +certifi==2022.12.7 \ + --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ + --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 + # via requests +charset-normalizer==2.1.1 \ + --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ + --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f + # via requests +click==8.1.3 \ + --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \ + --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 + # via black +detect-secrets==1.4.0 \ + --hash=sha256:d08ecabeee8b68c0acb0e8a354fb98d822a653f6ed05e520cead4c6fc1fc02cd \ + --hash=sha256:d56787e339758cef48c9ccd6692f7a094b9963c979c9813580b0169e41132833 + # via -r requirements/lint.in +exceptiongroup==1.1.0 \ + --hash=sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e \ + --hash=sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23 + # via -r requirements/lint.in +flake8==6.0.0 \ + --hash=sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7 \ + --hash=sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181 + # via -r requirements/lint.in +idna==3.4 \ + --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ + --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 + # via requests +isort==5.11.4 \ + --hash=sha256:6db30c5ded9815d813932c04c2f85a360bcdd35fed496f4d8f35495ef0a261b6 \ + --hash=sha256:c033fd0edb91000a7f09527fe5c75321878f98322a77ddcc81adbd83724afb7b + # via -r requirements/lint.in +mccabe==0.7.0 \ + --hash=sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325 \ + --hash=sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e + # via flake8 +mypy-extensions==0.4.3 \ + --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \ + --hash=sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8 + # via black +pathspec==0.10.3 \ + --hash=sha256:3c95343af8b756205e2aba76e843ba9520a24dd84f68c22b9f93251507509dd6 \ + --hash=sha256:56200de4077d9d0791465aa9095a01d421861e405b5096955051deefd697d6f6 + # via black +platformdirs==2.6.2 \ + --hash=sha256:83c8f6d04389165de7c9b6f0c682439697887bca0aa2f1c87ef1826be3584490 \ + --hash=sha256:e1fea1fe471b9ff8332e229df3cb7de4f53eeea4998d3b6bfff542115e998bd2 + # via black +pycodestyle==2.10.0 \ + --hash=sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053 \ + --hash=sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610 + # via flake8 +pyflakes==3.0.1 \ + --hash=sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf \ + --hash=sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd + # via flake8 +pyyaml==6.0 \ + --hash=sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf \ + --hash=sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293 \ + --hash=sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b \ + --hash=sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57 \ + --hash=sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b \ + --hash=sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4 \ + --hash=sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07 \ + --hash=sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba \ + --hash=sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9 \ + --hash=sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287 \ + --hash=sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513 \ + --hash=sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0 \ + --hash=sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782 \ + --hash=sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0 \ + --hash=sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92 \ + --hash=sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f \ + --hash=sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2 \ + --hash=sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc \ + --hash=sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1 \ + --hash=sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c \ + --hash=sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86 \ + --hash=sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4 \ + --hash=sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c \ + --hash=sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34 \ + --hash=sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b \ + --hash=sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d \ + --hash=sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c \ + --hash=sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb \ + --hash=sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7 \ + --hash=sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737 \ + --hash=sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3 \ + --hash=sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d \ + --hash=sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358 \ + --hash=sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53 \ + --hash=sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78 \ + --hash=sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803 \ + --hash=sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a \ + --hash=sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f \ + --hash=sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174 \ + --hash=sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5 + # via detect-secrets +requests==2.28.1 \ + --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \ + --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349 + # via detect-secrets +tomli==2.0.1 \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f + # via + # -r requirements/lint.in + # black +typing-extensions==4.4.0 \ + --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ + --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e + # via + # -r requirements/lint.in + # black +urllib3==1.26.13 \ + --hash=sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc \ + --hash=sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8 + # via requests diff --git a/requirements/test.in b/requirements/test.in new file mode 100644 index 0000000..54ddb98 --- /dev/null +++ b/requirements/test.in @@ -0,0 +1,8 @@ +-r base.txt +mypy +lxml +pytest +pytest-cov +tomli +exceptiongroup +types-requests \ No newline at end of file diff --git a/requirements/test.txt b/requirements/test.txt new file mode 100644 index 0000000..e84dde1 --- /dev/null +++ b/requirements/test.txt @@ -0,0 +1,392 @@ +# +# This file is autogenerated by pip-compile with Python 3.9 +# by the following command: +# +# pip-compile --allow-unsafe --generate-hashes requirements/test.in +# +attrs==22.2.0 \ + --hash=sha256:29e95c7f6778868dbd49170f98f8818f78f3dc5e0e37c0b1f474e3561b240836 \ + --hash=sha256:c9227bfc2f01993c03f68db37d1d15c9690188323c067c641f1a35ca58185f99 + # via + # -r requirements/base.txt + # osidb-bindings + # pytest +certifi==2022.12.7 \ + --hash=sha256:35824b4c3a97115964b408844d64aa14db1cc518f6562e8d7261699d1350a9e3 \ + --hash=sha256:4ad3232f5e926d6718ec31cfc1fcadfde020920e278684144551c91769c7bc18 + # via + # -r requirements/base.txt + # requests +charset-normalizer==2.1.1 \ + --hash=sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845 \ + --hash=sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f + # via + # -r requirements/base.txt + # requests +click==8.1.3 \ + --hash=sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e \ + --hash=sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48 + # via + # -r requirements/base.txt + # click-completion +click-completion==0.5.2 \ + --hash=sha256:5bf816b81367e638a190b6e91b50779007d14301b3f9f3145d68e3cade7bce86 + # via -r requirements/base.txt +commonmark==0.9.1 \ + --hash=sha256:452f9dc859be7f06631ddcb328b6919c67984aca654e5fefb3914d54691aed60 \ + --hash=sha256:da2f38c92590f83de410ba1a3cbceafbc74fee9def35f9251ba9a971d6d66fd9 + # via + # -r requirements/base.txt + # rich +coverage[toml]==7.0.4 \ + --hash=sha256:0322354757b47640535daabd2d56384ff3cad2896248fc84d328c5fad4922d5c \ + --hash=sha256:053cdc47cae08257051d7e934a0de4d095b60eb8a3024fa9f1b2322fa1547137 \ + --hash=sha256:0815a09b32384e8ff00a5939ec9cd10efce8742347e019c2daca1a32f5ac2aae \ + --hash=sha256:1791e5f74c5b52f76e83fe9f4bb9571cf76d40ee0c51952ee1e4ee935b7e98b9 \ + --hash=sha256:1ba5cc54baf3c322c4388de2a43cc95f7809366f0600e743e5aae8ea9d1038b2 \ + --hash=sha256:1e9e94f2612ee549a4b3ee79cbc61bceed77e69cf38cfa05858bae939a886d16 \ + --hash=sha256:22d8ef6865cb6834cab2b72fff20747a55c714b57b675f7e11c9624fe4f7cb45 \ + --hash=sha256:260854160083f8275a9d9d49a05ab0ffc7a1f08f2ccccbfaec94a18aae9f407c \ + --hash=sha256:2904d7a0388911c61e7e3beefe48c29dfccaba938fc1158f63190101a21e04c2 \ + --hash=sha256:2b5936b624fbe711ed02dfd86edd678822e5ee68da02b6d231e5c01090b64590 \ + --hash=sha256:2b854f7985b48122b6fe346631e86d67b63293f8255cb59a93d79e3d9f1574e3 \ + --hash=sha256:2dfbee0bf0d633be3a2ab068f5a5731a70adf147d0ba17d9f9932b46c7c5782b \ + --hash=sha256:2e59aef3fba5758059208c9eff10ae7ded3629e797972746ec33b56844f69411 \ + --hash=sha256:32dc010713455ac0fe2fddb0e48aa43875cc7eb7b09768df10bad8ce45f9c430 \ + --hash=sha256:34c0457e1ba450ae8b22dc8ea2fd36ada1010af61291e4c96963cd9d9633366f \ + --hash=sha256:3d9201cfa5a98652b9cef36ab202f17fe3ea83f497b4ba2a8ed39399dfb8fcd4 \ + --hash=sha256:4665a714af31f160403c2e448fb2fef330719d2e04e836b08d60d612707c1041 \ + --hash=sha256:4e8267466662aff93d66fa72b9591d02122dfc8a729b0a43dd70e0fb07ed9b37 \ + --hash=sha256:55121fe140d7e42cb970999b93cf1c2b24484ce028b32bbd00238bb25c13e34a \ + --hash=sha256:5caa9dd91dcc5f054350dc57a02e053d79633907b9ccffff999568d13dcd19f8 \ + --hash=sha256:6abc91f6f8b3cc0ae1034e2c03f38769fba1952ab70d0b26953aa01691265c39 \ + --hash=sha256:6c5554d55668381e131577f20e8f620d4882b04ad558f7e7f3f1f55b3124c379 \ + --hash=sha256:70c294bb15ba576fb96b580db35895bf03749d683df044212b74e938a7f6821f \ + --hash=sha256:73bc6114aab7753ca784f87bcd3b7613bc797aa255b5bca45e5654070ae9acfb \ + --hash=sha256:92f135d370fcd7a6fb9659fa2eb716dd2ca364719cbb1756f74d90a221bca1a7 \ + --hash=sha256:9cb88a3019ad042eaa69fc7639ef077793fedbf313e89207aa82fefe92c97ebd \ + --hash=sha256:9dafdba3b2b9010abab08cb8c0dc6549bfca6e1630fe14d47b01dca00d39e694 \ + --hash=sha256:a63922765ee49d5b4c32afb2cd5516812c8665f3b78e64a0dd005bdfabf991b1 \ + --hash=sha256:a78a80d131c067d67d8a6f9bd3d3f7ea7eac82c1c7259f97d7ab73f723da9d55 \ + --hash=sha256:b75aff2c35ceaa299691e772f7bf7c8aeab25f46acea2be3dd04cccb914a9860 \ + --hash=sha256:b84076e3de192fba0f95e279ac017b64c7c6ecd4f09f36f13420f5bed898a9c7 \ + --hash=sha256:b8dfb5fed540f77e814bf4ec79619c241af6b4578fa1093c5e3389bbb7beab3f \ + --hash=sha256:bc74b64bfa89e2f862ea45dd6ac1def371d7cc883b76680d20bdd61a6f3daa20 \ + --hash=sha256:bc9c77004970a364a1e5454cf7cb884e4277592b959c287689b2a0fd027ef552 \ + --hash=sha256:c027fbb83a8c78a6e06a0302ea1799fdb70e5cda9845a5e000545b8e2b47ea39 \ + --hash=sha256:c06046f54e719da21c79f98ecc0962581d1aee0b3798dc6b12b1217da8bf93f4 \ + --hash=sha256:c58921fcd9914b56444292e7546fe183d079db99528142c809549ddeaeacd8e9 \ + --hash=sha256:c82f34fafaf5bc05d222fcf84423d6e156432ca35ca78672d4affd0c09c6ef6c \ + --hash=sha256:caf82db5b7f16b51ec32fe0bd2da0805b177c807aa8bfb478c7e6f893418c284 \ + --hash=sha256:cb8cfa3bf3a9f18211279458917fef5edeb5e1fdebe2ea8b11969ec2ebe48884 \ + --hash=sha256:d68f2f7bddb3acdd3b36ef7f334b9d14f30b93e094f808fbbd8d288b8f9e2f9b \ + --hash=sha256:daf91db39324e9939a9db919ee4fb42a1a23634a056616dae891a030e89f87ba \ + --hash=sha256:dcfbf8ffc046f20d75fd775a92c378f6fc7b9bded6c6f2ab88b6b9cb5805a184 \ + --hash=sha256:e44b60b0b49aa85d548d392a2dca2c6a581cd4084e72e9e16bd58bd86ec20816 \ + --hash=sha256:ea45f0dba5a993e93b158f1a9dcfff2770e3bcabf2b80dbe7aa15dce0bcb3bf3 \ + --hash=sha256:ee32a080bab779b71c4d09a3eb5254bfca43ee88828a683dab27dfe8f582516e \ + --hash=sha256:efc200fa75d9634525b40babc7a16342bd21c101db1a58ef84dc14f4bf6ac0fd \ + --hash=sha256:f092d9f2ddaa30235d33335fbdb61eb8f3657af519ef5f9dd6bdae65272def11 \ + --hash=sha256:f3d485e6ec6e09857bf2115ece572d666b7c498377d4c70e66bb06c63ed177c2 \ + --hash=sha256:f684d88eb4924ed0630cf488fd5606e334c6835594bb5fe36b50a509b10383ed \ + --hash=sha256:f6c4ad409a0caf7e2e12e203348b1a9b19c514e7d078520973147bf2d3dcbc6f + # via pytest-cov +decorator==5.1.1 \ + --hash=sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330 \ + --hash=sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186 + # via + # -r requirements/base.txt + # gssapi +exceptiongroup==1.1.0 \ + --hash=sha256:327cbda3da756e2de031a3107b81ab7b3770a602c4d16ca618298c526f4bec1e \ + --hash=sha256:bcb67d800a4497e1b404c2dd44fca47d3b7a5e5433dbab67f96c1a685cdfdf23 + # via + # -r requirements/test.in + # pytest +gssapi==1.8.2 \ + --hash=sha256:02e0a8f35e1f5b1c0eada646e3da1af3022c25e8df26ded3fd18ee78abb155ea \ + --hash=sha256:13aba9a947994f5f5f1fb6f425b397a359b191cee2983fa33911cf5e212d6cfb \ + --hash=sha256:43c8b1acb8efa1f881ff7f7e912ccdc611689484190b7cc83f538b44f8992cbd \ + --hash=sha256:47d69b1fd3bd0764d7a14500c6cbd8fd08198ee6e1737048a01ad7024d57f67d \ + --hash=sha256:4aaed04439aed8eba525ea44dd7219ecd97d520254320e66ac53d9ae4acb8fe5 \ + --hash=sha256:512a2bd98e8003f48d98908bf54d1ed94c5388764e0a09fdc24cc691422a4162 \ + --hash=sha256:67c85758a6b40042509c96bb00d0873a501491453ad5b0da88dbfa9343c8ffea \ + --hash=sha256:75763c49b3e18da60e160d76e8ac9a27b0bbd637c6e88513150fbb7158ae15d7 \ + --hash=sha256:787262e0db124d302c972d30e6f4b7c81423e696d08ee6e07047194a9bce2664 \ + --hash=sha256:7c14cf97d61073d8211abfded77066af791356868022acda10224a8212639cf5 \ + --hash=sha256:84bfd1b3954a5a608302884a36586eed6f623f6f38fcd331ad55937eca1ea89f \ + --hash=sha256:85e7e623dfe51fef3f613acb965c4fa1866e7a7ee2c2558cbe2f203798171510 \ + --hash=sha256:8b4c1c664635153b0055a08bf30ec1552c8aa064a76f565d7905057500f334b3 \ + --hash=sha256:a36bc089036196aa03c3c312ea1639677065b3d7e8f37edbba731f61f5e56dd6 \ + --hash=sha256:b78e0a021cc91158660e4c5cc9263e07c719346c35a9c0f66725e914b235c89a \ + --hash=sha256:cdd6bff2cf7f3a5a5a24cddde137b6e117fe53aad81f240dee2e8e383c0b289b \ + --hash=sha256:d6be1d8e07cc151e217f8a0ccf7c28ca5a1bb0ae00c8512586642c9f876a7298 \ + --hash=sha256:dcd2be270bf490b6007eb3734795aaeddf92848f79b69d6a23f6204ccaa9b6c7 \ + --hash=sha256:f75b094913a1757e5e634b70b03e808cab0eb02c802ec50b760636b23b0aa50c \ + --hash=sha256:fac7d1f4b14383bd29d3996cf5f6f23d0dc50ffd7965d2bc35bcc0849da24152 + # via + # -r requirements/base.txt + # requests-gssapi +idna==3.4 \ + --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ + --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 + # via + # -r requirements/base.txt + # requests +iniconfig==2.0.0 \ + --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ + --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 + # via pytest +jinja2==3.1.2 \ + --hash=sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852 \ + --hash=sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61 + # via + # -r requirements/base.txt + # click-completion +lxml==4.9.2 \ + --hash=sha256:01d36c05f4afb8f7c20fd9ed5badca32a2029b93b1750f571ccc0b142531caf7 \ + --hash=sha256:04876580c050a8c5341d706dd464ff04fd597095cc8c023252566a8826505726 \ + --hash=sha256:05ca3f6abf5cf78fe053da9b1166e062ade3fa5d4f92b4ed688127ea7d7b1d03 \ + --hash=sha256:090c6543d3696cbe15b4ac6e175e576bcc3f1ccfbba970061b7300b0c15a2140 \ + --hash=sha256:0dc313ef231edf866912e9d8f5a042ddab56c752619e92dfd3a2c277e6a7299a \ + --hash=sha256:0f2b1e0d79180f344ff9f321327b005ca043a50ece8713de61d1cb383fb8ac05 \ + --hash=sha256:13598ecfbd2e86ea7ae45ec28a2a54fb87ee9b9fdb0f6d343297d8e548392c03 \ + --hash=sha256:16efd54337136e8cd72fb9485c368d91d77a47ee2d42b057564aae201257d419 \ + --hash=sha256:1ab8f1f932e8f82355e75dda5413a57612c6ea448069d4fb2e217e9a4bed13d4 \ + --hash=sha256:223f4232855ade399bd409331e6ca70fb5578efef22cf4069a6090acc0f53c0e \ + --hash=sha256:2455cfaeb7ac70338b3257f41e21f0724f4b5b0c0e7702da67ee6c3640835b67 \ + --hash=sha256:2899456259589aa38bfb018c364d6ae7b53c5c22d8e27d0ec7609c2a1ff78b50 \ + --hash=sha256:2a29ba94d065945944016b6b74e538bdb1751a1db6ffb80c9d3c2e40d6fa9894 \ + --hash=sha256:2a87fa548561d2f4643c99cd13131acb607ddabb70682dcf1dff5f71f781a4bf \ + --hash=sha256:2e430cd2824f05f2d4f687701144556646bae8f249fd60aa1e4c768ba7018947 \ + --hash=sha256:36c3c175d34652a35475a73762b545f4527aec044910a651d2bf50de9c3352b1 \ + --hash=sha256:3818b8e2c4b5148567e1b09ce739006acfaa44ce3156f8cbbc11062994b8e8dd \ + --hash=sha256:3ab9fa9d6dc2a7f29d7affdf3edebf6ece6fb28a6d80b14c3b2fb9d39b9322c3 \ + --hash=sha256:3efea981d956a6f7173b4659849f55081867cf897e719f57383698af6f618a92 \ + --hash=sha256:4c8f293f14abc8fd3e8e01c5bd86e6ed0b6ef71936ded5bf10fe7a5efefbaca3 \ + --hash=sha256:5344a43228767f53a9df6e5b253f8cdca7dfc7b7aeae52551958192f56d98457 \ + --hash=sha256:58bfa3aa19ca4c0f28c5dde0ff56c520fbac6f0daf4fac66ed4c8d2fb7f22e74 \ + --hash=sha256:5b4545b8a40478183ac06c073e81a5ce4cf01bf1734962577cf2bb569a5b3bbf \ + --hash=sha256:5f50a1c177e2fa3ee0667a5ab79fdc6b23086bc8b589d90b93b4bd17eb0e64d1 \ + --hash=sha256:63da2ccc0857c311d764e7d3d90f429c252e83b52d1f8f1d1fe55be26827d1f4 \ + --hash=sha256:6749649eecd6a9871cae297bffa4ee76f90b4504a2a2ab528d9ebe912b101975 \ + --hash=sha256:6804daeb7ef69e7b36f76caddb85cccd63d0c56dedb47555d2fc969e2af6a1a5 \ + --hash=sha256:689bb688a1db722485e4610a503e3e9210dcc20c520b45ac8f7533c837be76fe \ + --hash=sha256:699a9af7dffaf67deeae27b2112aa06b41c370d5e7633e0ee0aea2e0b6c211f7 \ + --hash=sha256:6b418afe5df18233fc6b6093deb82a32895b6bb0b1155c2cdb05203f583053f1 \ + --hash=sha256:76cf573e5a365e790396a5cc2b909812633409306c6531a6877c59061e42c4f2 \ + --hash=sha256:7b515674acfdcadb0eb5d00d8a709868173acece5cb0be3dd165950cbfdf5409 \ + --hash=sha256:7b770ed79542ed52c519119473898198761d78beb24b107acf3ad65deae61f1f \ + --hash=sha256:7d2278d59425777cfcb19735018d897ca8303abe67cc735f9f97177ceff8027f \ + --hash=sha256:7e91ee82f4199af8c43d8158024cbdff3d931df350252288f0d4ce656df7f3b5 \ + --hash=sha256:821b7f59b99551c69c85a6039c65b75f5683bdc63270fec660f75da67469ca24 \ + --hash=sha256:822068f85e12a6e292803e112ab876bc03ed1f03dddb80154c395f891ca6b31e \ + --hash=sha256:8340225bd5e7a701c0fa98284c849c9b9fc9238abf53a0ebd90900f25d39a4e4 \ + --hash=sha256:85cabf64adec449132e55616e7ca3e1000ab449d1d0f9d7f83146ed5bdcb6d8a \ + --hash=sha256:880bbbcbe2fca64e2f4d8e04db47bcdf504936fa2b33933efd945e1b429bea8c \ + --hash=sha256:8d0b4612b66ff5d62d03bcaa043bb018f74dfea51184e53f067e6fdcba4bd8de \ + --hash=sha256:8e20cb5a47247e383cf4ff523205060991021233ebd6f924bca927fcf25cf86f \ + --hash=sha256:925073b2fe14ab9b87e73f9a5fde6ce6392da430f3004d8b72cc86f746f5163b \ + --hash=sha256:998c7c41910666d2976928c38ea96a70d1aa43be6fe502f21a651e17483a43c5 \ + --hash=sha256:9b22c5c66f67ae00c0199f6055705bc3eb3fcb08d03d2ec4059a2b1b25ed48d7 \ + --hash=sha256:9f102706d0ca011de571de32c3247c6476b55bb6bc65a20f682f000b07a4852a \ + --hash=sha256:a08cff61517ee26cb56f1e949cca38caabe9ea9fbb4b1e10a805dc39844b7d5c \ + --hash=sha256:a0a336d6d3e8b234a3aae3c674873d8f0e720b76bc1d9416866c41cd9500ffb9 \ + --hash=sha256:a35f8b7fa99f90dd2f5dc5a9fa12332642f087a7641289ca6c40d6e1a2637d8e \ + --hash=sha256:a38486985ca49cfa574a507e7a2215c0c780fd1778bb6290c21193b7211702ab \ + --hash=sha256:a5da296eb617d18e497bcf0a5c528f5d3b18dadb3619fbdadf4ed2356ef8d941 \ + --hash=sha256:a6e441a86553c310258aca15d1c05903aaf4965b23f3bc2d55f200804e005ee5 \ + --hash=sha256:a82d05da00a58b8e4c0008edbc8a4b6ec5a4bc1e2ee0fb6ed157cf634ed7fa45 \ + --hash=sha256:ab323679b8b3030000f2be63e22cdeea5b47ee0abd2d6a1dc0c8103ddaa56cd7 \ + --hash=sha256:b1f42b6921d0e81b1bcb5e395bc091a70f41c4d4e55ba99c6da2b31626c44892 \ + --hash=sha256:b23e19989c355ca854276178a0463951a653309fb8e57ce674497f2d9f208746 \ + --hash=sha256:b264171e3143d842ded311b7dccd46ff9ef34247129ff5bf5066123c55c2431c \ + --hash=sha256:b26a29f0b7fc6f0897f043ca366142d2b609dc60756ee6e4e90b5f762c6adc53 \ + --hash=sha256:b64d891da92e232c36976c80ed7ebb383e3f148489796d8d31a5b6a677825efe \ + --hash=sha256:b9cc34af337a97d470040f99ba4282f6e6bac88407d021688a5d585e44a23184 \ + --hash=sha256:bc718cd47b765e790eecb74d044cc8d37d58562f6c314ee9484df26276d36a38 \ + --hash=sha256:be7292c55101e22f2a3d4d8913944cbea71eea90792bf914add27454a13905df \ + --hash=sha256:c83203addf554215463b59f6399835201999b5e48019dc17f182ed5ad87205c9 \ + --hash=sha256:c9ec3eaf616d67db0764b3bb983962b4f385a1f08304fd30c7283954e6a7869b \ + --hash=sha256:ca34efc80a29351897e18888c71c6aca4a359247c87e0b1c7ada14f0ab0c0fb2 \ + --hash=sha256:ca989b91cf3a3ba28930a9fc1e9aeafc2a395448641df1f387a2d394638943b0 \ + --hash=sha256:d02a5399126a53492415d4906ab0ad0375a5456cc05c3fc0fc4ca11771745cda \ + --hash=sha256:d17bc7c2ccf49c478c5bdd447594e82692c74222698cfc9b5daae7ae7e90743b \ + --hash=sha256:d5bf6545cd27aaa8a13033ce56354ed9e25ab0e4ac3b5392b763d8d04b08e0c5 \ + --hash=sha256:d6b430a9938a5a5d85fc107d852262ddcd48602c120e3dbb02137c83d212b380 \ + --hash=sha256:da248f93f0418a9e9d94b0080d7ebc407a9a5e6d0b57bb30db9b5cc28de1ad33 \ + --hash=sha256:da4dd7c9c50c059aba52b3524f84d7de956f7fef88f0bafcf4ad7dde94a064e8 \ + --hash=sha256:df0623dcf9668ad0445e0558a21211d4e9a149ea8f5666917c8eeec515f0a6d1 \ + --hash=sha256:e5168986b90a8d1f2f9dc1b841467c74221bd752537b99761a93d2d981e04889 \ + --hash=sha256:efa29c2fe6b4fdd32e8ef81c1528506895eca86e1d8c4657fda04c9b3786ddf9 \ + --hash=sha256:f1496ea22ca2c830cbcbd473de8f114a320da308438ae65abad6bab7867fe38f \ + --hash=sha256:f49e52d174375a7def9915c9f06ec4e569d235ad428f70751765f48d5926678c + # via -r requirements/test.in +markupsafe==2.1.1 \ + --hash=sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003 \ + --hash=sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88 \ + --hash=sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5 \ + --hash=sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7 \ + --hash=sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a \ + --hash=sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603 \ + --hash=sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1 \ + --hash=sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135 \ + --hash=sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247 \ + --hash=sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6 \ + --hash=sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601 \ + --hash=sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77 \ + --hash=sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02 \ + --hash=sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e \ + --hash=sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63 \ + --hash=sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f \ + --hash=sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980 \ + --hash=sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b \ + --hash=sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812 \ + --hash=sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff \ + --hash=sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96 \ + --hash=sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1 \ + --hash=sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925 \ + --hash=sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a \ + --hash=sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6 \ + --hash=sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e \ + --hash=sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f \ + --hash=sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4 \ + --hash=sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f \ + --hash=sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3 \ + --hash=sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c \ + --hash=sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a \ + --hash=sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417 \ + --hash=sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a \ + --hash=sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a \ + --hash=sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37 \ + --hash=sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452 \ + --hash=sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933 \ + --hash=sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a \ + --hash=sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7 + # via + # -r requirements/base.txt + # jinja2 +mypy==0.991 \ + --hash=sha256:0714258640194d75677e86c786e80ccf294972cc76885d3ebbb560f11db0003d \ + --hash=sha256:0c8f3be99e8a8bd403caa8c03be619544bc2c77a7093685dcf308c6b109426c6 \ + --hash=sha256:0cca5adf694af539aeaa6ac633a7afe9bbd760df9d31be55ab780b77ab5ae8bf \ + --hash=sha256:1c8cd4fb70e8584ca1ed5805cbc7c017a3d1a29fb450621089ffed3e99d1857f \ + --hash=sha256:1f7d1a520373e2272b10796c3ff721ea1a0712288cafaa95931e66aa15798813 \ + --hash=sha256:209ee89fbb0deed518605edddd234af80506aec932ad28d73c08f1400ef80a33 \ + --hash=sha256:26efb2fcc6b67e4d5a55561f39176821d2adf88f2745ddc72751b7890f3194ad \ + --hash=sha256:37bd02ebf9d10e05b00d71302d2c2e6ca333e6c2a8584a98c00e038db8121f05 \ + --hash=sha256:3a700330b567114b673cf8ee7388e949f843b356a73b5ab22dd7cff4742a5297 \ + --hash=sha256:3c0165ba8f354a6d9881809ef29f1a9318a236a6d81c690094c5df32107bde06 \ + --hash=sha256:3d80e36b7d7a9259b740be6d8d906221789b0d836201af4234093cae89ced0cd \ + --hash=sha256:4175593dc25d9da12f7de8de873a33f9b2b8bdb4e827a7cae952e5b1a342e243 \ + --hash=sha256:4307270436fd7694b41f913eb09210faff27ea4979ecbcd849e57d2da2f65305 \ + --hash=sha256:5e80e758243b97b618cdf22004beb09e8a2de1af481382e4d84bc52152d1c476 \ + --hash=sha256:641411733b127c3e0dab94c45af15fea99e4468f99ac88b39efb1ad677da5711 \ + --hash=sha256:652b651d42f155033a1967739788c436491b577b6a44e4c39fb340d0ee7f0d70 \ + --hash=sha256:6d7464bac72a85cb3491c7e92b5b62f3dcccb8af26826257760a552a5e244aa5 \ + --hash=sha256:74e259b5c19f70d35fcc1ad3d56499065c601dfe94ff67ae48b85596b9ec1461 \ + --hash=sha256:7d17e0a9707d0772f4a7b878f04b4fd11f6f5bcb9b3813975a9b13c9332153ab \ + --hash=sha256:901c2c269c616e6cb0998b33d4adbb4a6af0ac4ce5cd078afd7bc95830e62c1c \ + --hash=sha256:98e781cd35c0acf33eb0295e8b9c55cdbef64fcb35f6d3aa2186f289bed6e80d \ + --hash=sha256:a12c56bf73cdab116df96e4ff39610b92a348cc99a1307e1da3c3768bbb5b135 \ + --hash=sha256:ac6e503823143464538efda0e8e356d871557ef60ccd38f8824a4257acc18d93 \ + --hash=sha256:b8472f736a5bfb159a5e36740847808f6f5b659960115ff29c7cecec1741c648 \ + --hash=sha256:b86ce2c1866a748c0f6faca5232059f881cda6dda2a893b9a8373353cfe3715a \ + --hash=sha256:bc9ec663ed6c8f15f4ae9d3c04c989b744436c16d26580eaa760ae9dd5d662eb \ + --hash=sha256:c9166b3f81a10cdf9b49f2d594b21b31adadb3d5e9db9b834866c3258b695be3 \ + --hash=sha256:d13674f3fb73805ba0c45eb6c0c3053d218aa1f7abead6e446d474529aafc372 \ + --hash=sha256:de32edc9b0a7e67c2775e574cb061a537660e51210fbf6006b0b36ea695ae9bb \ + --hash=sha256:e62ebaad93be3ad1a828a11e90f0e76f15449371ffeecca4a0a0b9adc99abcef + # via -r requirements/test.in +mypy-extensions==0.4.3 \ + --hash=sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d \ + --hash=sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8 + # via mypy +osidb-bindings==2.1.0 \ + --hash=sha256:9f5f3811c82c81d0451e0353abc7dd382979681e1c047a7d0db41b661f7f04cd \ + --hash=sha256:a7d6b0189fed00538485b216d5169f36f655b58124f8bf10fb7f23285b037121 + # via -r requirements/base.txt +packaging==23.0 \ + --hash=sha256:714ac14496c3e68c99c29b00845f7a2b85f3bb6f1078fd9f72fd20f0570002b2 \ + --hash=sha256:b6ad297f8907de0fa2fe1ccbd26fdaf387f5f47c7275fedf8cce89f99446cf97 + # via pytest +pluggy==1.0.0 \ + --hash=sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159 \ + --hash=sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3 + # via pytest +pygments==2.14.0 \ + --hash=sha256:b3ed06a9e8ac9a9aae5a6f5dbe78a8a58655d17b43b93c078f094ddc476ae297 \ + --hash=sha256:fa7bd7bd2771287c0de303af8bfdfc731f51bd2c6a47ab69d117138893b82717 + # via + # -r requirements/base.txt + # rich +pytest==7.2.0 \ + --hash=sha256:892f933d339f068883b6fd5a459f03d85bfcb355e4981e146d2c7616c21fef71 \ + --hash=sha256:c4014eb40e10f11f355ad4e3c2fb2c6c6d1919c73f3b5a433de4708202cade59 + # via + # -r requirements/test.in + # pytest-cov +pytest-cov==4.0.0 \ + --hash=sha256:2feb1b751d66a8bd934e5edfa2e961d11309dc37b73b0eabe73b5945fee20f6b \ + --hash=sha256:996b79efde6433cdbd0088872dbc5fb3ed7fe1578b68cdbba634f14bb8dd0470 + # via -r requirements/test.in +python-dateutil==2.8.2 \ + --hash=sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86 \ + --hash=sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9 + # via + # -r requirements/base.txt + # osidb-bindings +requests==2.28.1 \ + --hash=sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983 \ + --hash=sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349 + # via + # -r requirements/base.txt + # osidb-bindings + # requests-gssapi +requests-gssapi==1.2.3 \ + --hash=sha256:20784508981401f7153c933eed095338933a40818da65a259dbf2d80dccb150e + # via + # -r requirements/base.txt + # osidb-bindings +rich==13.0.1 \ + --hash=sha256:25f83363f636995627a99f6e4abc52ed0970ebbd544960cc63cbb43aaac3d6f0 \ + --hash=sha256:41fe1d05f433b0f4724cda8345219213d2bfa472ef56b2f64f415b5b94d51b04 + # via -r requirements/base.txt +shellingham==1.5.0.post1 \ + --hash=sha256:368bf8c00754fd4f55afb7bbb86e272df77e4dc76ac29dbcbb81a59e9fc15744 \ + --hash=sha256:823bc5fb5c34d60f285b624e7264f4dda254bc803a3774a147bf99c0e3004a28 + # via + # -r requirements/base.txt + # click-completion +six==1.16.0 \ + --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ + --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 + # via + # -r requirements/base.txt + # click-completion + # python-dateutil +tomli==2.0.1 \ + --hash=sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc \ + --hash=sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f + # via + # -r requirements/test.in + # mypy + # pytest +types-requests==2.28.11.7 \ + --hash=sha256:0ae38633734990d019b80f5463dfa164ebd3581998ac8435f526da6fe4d598c3 \ + --hash=sha256:b6a2fca8109f4fdba33052f11ed86102bddb2338519e1827387137fefc66a98b + # via -r requirements/test.in +types-urllib3==1.26.25.4 \ + --hash=sha256:ed6b9e8a8be488796f72306889a06a3fc3cb1aa99af02ab8afb50144d7317e49 \ + --hash=sha256:eec5556428eec862b1ac578fb69aab3877995a99ffec9e5a12cf7fbd0cc9daee + # via types-requests +typing-extensions==4.4.0 \ + --hash=sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa \ + --hash=sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e + # via mypy +urllib3==1.26.13 \ + --hash=sha256:47cc05d99aaa09c9e72ed5809b60e7ba354e64b59c9c173ac3018642d8bb41fc \ + --hash=sha256:c083dd0dce68dbfbe1129d5271cb90f9447dea7d52097c6e0126120c521ddea8 + # via + # -r requirements/base.txt + # requests diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..9a55fbc --- /dev/null +++ b/setup.py @@ -0,0 +1,50 @@ +"""griffon Python Package + +This setup.py file uses setuptools to install the `griffon` package +""" + +from setuptools import setup + +with open("README.md") as f: + readme = f.read() + +with open("griffon/__init__.py") as f: + for line in f: + if line.startswith("__version__"): + delim = '"' if '"' in line else "'" + version = line.split(delim)[1] + break + else: + raise RuntimeError("Unable to find version string.") + +setup( + name="griffon", + version=version, + long_description=readme, + long_description_content_type="text/markdown", + url="https://github.com/RedHatProductSecurity/griffon", + description="Red Hat Product Security CLI", + packages=[ + "griffon", + "griffon/commands", + "griffon/commands/plugins", + "griffon/service_layer", + "griffon/autocomplete", + ], + install_requires=[ + "click", + "click-completion", + "rich", + "osidb-bindings", + # "corgi-bindings", UNCOMMENT WHEN COMPONENT REGISTRY BINDINGS ARE IN PYPI + ], + entry_points={"console_scripts": ["griffon=griffon.cli:cli"]}, + author="James Fuller", + license="MIT", + classifiers=[ + "Topic :: Security", + "License :: OSI Approved :: MIT License", + "Programming Language :: Python :: 3", + "Programming Language :: Python :: 3.9", + ], +) diff --git a/tests/__init__.py b/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/conftest.py b/tests/conftest.py new file mode 100644 index 0000000..e69de29 diff --git a/tests/test_cli.py b/tests/test_cli.py new file mode 100644 index 0000000..55fcd0c --- /dev/null +++ b/tests/test_cli.py @@ -0,0 +1,24 @@ +from click.testing import CliRunner + +from griffon.cli import cli + +# @pytest.skip +# def test_cli_verbose(): +# runner = CliRunner() +# result = runner.invoke(cli, ["-v"]) +# assert result.exit_code == 0, result.output +# +# +# @pytest.skip +# def test_cli_version(): +# runner = CliRunner() +# result = runner.invoke(cli, ["-V"]) +# assert result.exit_code == 0 +# assert result.output == "griffon 0.1.0\n" +# + + +def test_cli_components(): + runner = CliRunner() + result = runner.invoke(cli, ["--help"]) + assert result.exit_code == 0 diff --git a/tests/test_entities.py b/tests/test_entities.py new file mode 100644 index 0000000..18c8684 --- /dev/null +++ b/tests/test_entities.py @@ -0,0 +1,15 @@ +from click.testing import CliRunner + +from griffon.cli import cli + + +def test_cli_flaws(): + runner = CliRunner() + result = runner.invoke(cli, ["entities", "flaws"]) + assert result.exit_code == 0 + + +def test_cli_components(): + runner = CliRunner() + result = runner.invoke(cli, ["entities", "components"]) + assert result.exit_code == 0 diff --git a/tests/test_manage.py b/tests/test_manage.py new file mode 100644 index 0000000..44e034f --- /dev/null +++ b/tests/test_manage.py @@ -0,0 +1,15 @@ +from click.testing import CliRunner + +from griffon.cli import cli + + +def test_osidb(): + runner = CliRunner() + result = runner.invoke(cli, ["manage", "osidb"]) + assert result.exit_code == 0 + + +def test_corgi(): + runner = CliRunner() + result = runner.invoke(cli, ["manage", "corgi"]) + assert result.exit_code == 0 diff --git a/tests/test_plugins.py b/tests/test_plugins.py new file mode 100644 index 0000000..4df7cd2 --- /dev/null +++ b/tests/test_plugins.py @@ -0,0 +1,15 @@ +from click.testing import CliRunner + +from griffon.cli import cli + + +def test_osv(): + runner = CliRunner() + result = runner.invoke(cli, ["z_osv"]) + assert result.exit_code == 0 + + +def test_fcc(): + runner = CliRunner() + result = runner.invoke(cli, ["z_fcc"]) + assert result.exit_code == 0 diff --git a/tests/test_process.py b/tests/test_process.py new file mode 100644 index 0000000..e8932f0 --- /dev/null +++ b/tests/test_process.py @@ -0,0 +1,21 @@ +import inspect + +from click.testing import CliRunner + +from griffon.cli import cli +from griffon.service_layer import Process, core_process + + +def test_processes(): + runner = CliRunner() + result = runner.invoke(cli, ["process"]) + assert result.exit_code == 0 + + +def test_process_defs(): + for name, obj in inspect.getmembers(core_process): + if inspect.isclass(obj) and inspect.ismodule(obj): + assert isinstance(obj, Process) + assert isinstance(core_process.generate_affects_for_specific_component_process, Process) + q: Process = core_process.generate_affects_for_specific_component_process() + assert q diff --git a/tests/test_queries.py b/tests/test_queries.py new file mode 100644 index 0000000..261501c --- /dev/null +++ b/tests/test_queries.py @@ -0,0 +1,21 @@ +import inspect + +from click.testing import CliRunner + +from griffon.cli import cli +from griffon.service_layer import Query, core_queries + + +def test_queries(): + runner = CliRunner() + result = runner.invoke(cli, ["queries"]) + assert result.exit_code == 0 + + +def test_query_defs(): + for name, obj in inspect.getmembers(core_queries): + if inspect.isclass(obj) and inspect.ismodule(obj): + assert isinstance(obj, Query) + assert isinstance(core_queries.cves_for_specific_component_query, Query) + q: Query = core_queries.cves_for_specific_component_query() + assert q diff --git a/tox.ini b/tox.ini new file mode 100644 index 0000000..7cac5dc --- /dev/null +++ b/tox.ini @@ -0,0 +1,55 @@ +[tox] +envlist = black,flake8,isort,mypy,secrets,griffon +skipsdist = false + +[testenv] +basepython = python3.9 +passenv = + CORGI_API_URL + OSIDB_API_URL + +[testenv:griffon] +deps = + -rrequirements/test.txt +commands = + pytest {posargs} + +[flake8] +# NOTE: Any ignored errors/warnings specified below are subjective and can be changed based on +# common agreement of all developers contributing to this project. +# +# E203: whitespace before ':' (ignored per Black documentation, non PEP8-compliant) +# +extend-ignore = E203 +# Keep in sync with black.line-length in pyproject.toml +max-line-length = 100 +exclude = .git/,venv/,.tox/,tests/data/ + +[testenv:flake8] +deps = -r requirements/lint.txt +commands = flake8 + +[testenv:black] +deps = -r requirements/lint.txt +commands = black --check --diff . + +[testenv:isort] +deps = -r requirements/lint.txt +commands = isort --check --diff . + +[testenv:mypy] +deps = -r requirements/test.txt +commands = mypy griffon + +[testenv:manpages] +deps = click-man +commands = click-man griffon -t man + +[testenv:secrets] +deps = -r requirements/lint.txt +allowlist_externals = bash +# Check only files in the current branch which have changed, compared to the main branch, for secrets +# Scan all files for secrets if the first form fails, since Gitlab CI uses shallow clone and does not have a "main" ref +commands = /usr/bin/bash -c 'detect-secrets-hook --baseline .secrets.baseline \ + $(git diff --name-only "origin/main..HEAD" || \ + git ls-files)'