From f8a1f3ef72f17e077c60712634b728262393a8f7 Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Thu, 3 Nov 2022 06:49:30 +0900 Subject: [PATCH 01/25] bump annofabapi to 0.64.0 --- poetry.lock | 644 ++++++++-------------------------------------------- 1 file changed, 91 insertions(+), 553 deletions(-) diff --git a/poetry.lock b/poetry.lock index 3724a44..14e09d0 100644 --- a/poetry.lock +++ b/poetry.lock @@ -8,7 +8,7 @@ python-versions = "*" [[package]] name = "annofabapi" -version = "0.63.0" +version = "0.64.0" description = "Python Clinet Library of Annofab WebAPI (https://annofab.com/docs/api/)" category = "main" optional = false @@ -330,14 +330,14 @@ python-versions = ">=3.7" mdurl = ">=0.1,<1.0" [package.extras] -testing = ["pytest-regressions", "pytest-cov", "pytest", "coverage"] -rtd = ["sphinx-book-theme", "sphinx-design", "sphinx-copybutton", "sphinx", "pyyaml", "myst-parser", "attrs"] -profiling = ["gprof2dot"] -plugins = ["mdit-py-plugins"] -linkify = ["linkify-it-py (>=1.0,<2.0)"] -compare = ["panflute (>=2.1.3,<2.2.0)", "mistune (>=2.0.2,<2.1.0)", "mistletoe (>=0.8.1,<0.9.0)", "markdown (>=3.3.6,<3.4.0)", "commonmark (>=0.9.1,<0.10.0)"] +benchmarking = ["psutil", "pytest", "pytest-benchmark (>=3.2,<4.0)"] code_style = ["pre-commit (==2.6)"] -benchmarking = ["pytest-benchmark (>=3.2,<4.0)", "pytest", "psutil"] +compare = ["commonmark (>=0.9.1,<0.10.0)", "markdown (>=3.3.6,<3.4.0)", "mistletoe (>=0.8.1,<0.9.0)", "mistune (>=2.0.2,<2.1.0)", "panflute (>=2.1.3,<2.2.0)"] +linkify = ["linkify-it-py (>=1.0,<2.0)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["attrs", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "markupsafe" @@ -395,9 +395,9 @@ python-versions = ">=3.7" markdown-it-py = ">=1.0.0,<3.0.0" [package.extras] -testing = ["pytest-regressions", "pytest-cov", "pytest", "coverage"] -rtd = ["sphinx-book-theme (>=0.1.0,<0.2.0)", "myst-parser (>=0.16.1,<0.17.0)", "attrs"] code_style = ["pre-commit"] +rtd = ["attrs", "myst-parser (>=0.16.1,<0.17.0)", "sphinx-book-theme (>=0.1.0,<0.2.0)"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] [[package]] name = "mdurl" @@ -512,8 +512,8 @@ optional = false python-versions = ">=3.6" [package.extras] -testing = ["pytest-benchmark", "pytest"] -dev = ["tox", "pre-commit"] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] [[package]] name = "py" @@ -546,10 +546,10 @@ packaging = "*" sphinx = ">=4.0.2" [package.extras] -dev = ["pydata-sphinx-theme", "nox", "pre-commit", "pyyaml"] -coverage = ["pydata-sphinx-theme", "codecov", "pytest-cov"] -test = ["pydata-sphinx-theme", "pytest"] -doc = ["sphinx-design", "xarray", "numpy", "plotly", "jupyter-sphinx", "sphinx-sitemap", "sphinxext-rediraffe", "pytest-regressions", "pytest", "pandas", "myst-parser", "numpydoc"] +doc = ["numpydoc", "myst-parser", "pandas", "pytest", "pytest-regressions", "sphinxext-rediraffe", "sphinx-sitemap", "jupyter-sphinx", "plotly", "numpy", "xarray", "sphinx-design"] +test = ["pytest", "pydata-sphinx-theme"] +coverage = ["pytest-cov", "codecov", "pydata-sphinx-theme"] +dev = ["pyyaml", "pre-commit", "nox", "pydata-sphinx-theme"] [[package]] name = "pyflakes" @@ -764,8 +764,8 @@ optional = false python-versions = ">=3.5" [package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] -lint = ["docutils-stubs", "mypy", "flake8"] [[package]] name = "sphinxcontrib-devhelp" @@ -776,8 +776,8 @@ optional = false python-versions = ">=3.5" [package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] -lint = ["docutils-stubs", "mypy", "flake8"] [[package]] name = "sphinxcontrib-htmlhelp" @@ -788,8 +788,8 @@ optional = false python-versions = ">=3.6" [package.extras] -test = ["html5lib", "pytest"] -lint = ["docutils-stubs", "mypy", "flake8"] +lint = ["flake8", "mypy", "docutils-stubs"] +test = ["pytest", "html5lib"] [[package]] name = "sphinxcontrib-jsmath" @@ -800,7 +800,7 @@ optional = false python-versions = ">=3.5" [package.extras] -test = ["mypy", "flake8", "pytest"] +test = ["pytest", "flake8", "mypy"] [[package]] name = "sphinxcontrib-qthelp" @@ -811,8 +811,8 @@ optional = false python-versions = ">=3.5" [package.extras] +lint = ["flake8", "mypy", "docutils-stubs"] test = ["pytest"] -lint = ["docutils-stubs", "mypy", "flake8"] [[package]] name = "sphinxcontrib-serializinghtml" @@ -835,7 +835,7 @@ optional = false python-versions = ">=3.7" [package.extras] -tests = ["pytest-cov", "pytest"] +tests = ["pytest", "pytest-cov"] [[package]] name = "tomli" @@ -935,213 +935,37 @@ alabaster = [ {file = "alabaster-0.7.12-py2.py3-none-any.whl", hash = "sha256:446438bdcca0e05bd45ea2de1668c1d9b032e1a9154c2c259092d77031ddd359"}, {file = "alabaster-0.7.12.tar.gz", hash = "sha256:a661d72d58e6ea8a57f7a86e37d86716863ee5e92788398526d58b26a4e4dc02"}, ] -annofabapi = [ - {file = "annofabapi-0.63.0-py3-none-any.whl", hash = "sha256:98f45c330887691b9969e50efcac5ee68a20192c02c69ca9f2031015007e4268"}, - {file = "annofabapi-0.63.0.tar.gz", hash = "sha256:1c1428cc3f4c89fd92230237ca032c7d0557bb4ef288d49edbed3f740a739dac"}, -] -astroid = [ - {file = "astroid-2.12.12-py3-none-any.whl", hash = "sha256:72702205200b2a638358369d90c222d74ebc376787af8fb2f7f2a86f7b5cc85f"}, - {file = "astroid-2.12.12.tar.gz", hash = "sha256:1c00a14f5a3ed0339d38d2e2e5b74ea2591df5861c0936bb292b84ccf3a78d83"}, -] -attrs = [ - {file = "attrs-22.1.0-py2.py3-none-any.whl", hash = "sha256:86efa402f67bf2df34f51a335487cf46b1ec130d02b8d39fd248abfd30da551c"}, - {file = "attrs-22.1.0.tar.gz", hash = "sha256:29adc2665447e5191d0e7c568fde78b21f9672d344281d0c6e1ab085429b22b6"}, -] -babel = [ - {file = "Babel-2.10.3-py3-none-any.whl", hash = "sha256:ff56f4892c1c4bf0d814575ea23471c230d544203c7748e8c68f0089478d48eb"}, - {file = "Babel-2.10.3.tar.gz", hash = "sha256:7614553711ee97490f732126dc077f8d0ae084ebc6a96e23db1482afabdb2c51"}, -] -backoff = [ - {file = "backoff-2.2.1-py3-none-any.whl", hash = "sha256:63579f9a0628e06278f7e47b7d7d5b6ce20dc65c5e96a6f3ca99a6adca0396e8"}, - {file = "backoff-2.2.1.tar.gz", hash = "sha256:03f829f5bb1923180821643f8753b0502c3b682293992485b0eef2807afa5cba"}, -] -beautifulsoup4 = [ - {file = "beautifulsoup4-4.11.1-py3-none-any.whl", hash = "sha256:58d5c3d29f5a36ffeb94f02f0d786cd53014cf9b3b3951d42e0080d8a9498d30"}, - {file = "beautifulsoup4-4.11.1.tar.gz", hash = "sha256:ad9aa55b65ef2808eb405f46cf74df7fcb7044d5cbc26487f96eb2ef2e436693"}, -] -black = [ - {file = "black-22.10.0-1fixedarch-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:5cc42ca67989e9c3cf859e84c2bf014f6633db63d1cbdf8fdb666dcd9e77e3fa"}, - {file = "black-22.10.0-1fixedarch-cp311-cp311-macosx_11_0_x86_64.whl", hash = "sha256:5d8f74030e67087b219b032aa33a919fae8806d49c867846bfacde57f43972ef"}, - {file = "black-22.10.0-1fixedarch-cp37-cp37m-macosx_10_16_x86_64.whl", hash = "sha256:197df8509263b0b8614e1df1756b1dd41be6738eed2ba9e9769f3880c2b9d7b6"}, - {file = "black-22.10.0-1fixedarch-cp38-cp38-macosx_10_16_x86_64.whl", hash = "sha256:2644b5d63633702bc2c5f3754b1b475378fbbfb481f62319388235d0cd104c2d"}, - {file = "black-22.10.0-1fixedarch-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:e41a86c6c650bcecc6633ee3180d80a025db041a8e2398dcc059b3afa8382cd4"}, - {file = "black-22.10.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2039230db3c6c639bd84efe3292ec7b06e9214a2992cd9beb293d639c6402edb"}, - {file = "black-22.10.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:14ff67aec0a47c424bc99b71005202045dc09270da44a27848d534600ac64fc7"}, - {file = "black-22.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:819dc789f4498ecc91438a7de64427c73b45035e2e3680c92e18795a839ebb66"}, - {file = "black-22.10.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5b9b29da4f564ba8787c119f37d174f2b69cdfdf9015b7d8c5c16121ddc054ae"}, - {file = "black-22.10.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8b49776299fece66bffaafe357d929ca9451450f5466e997a7285ab0fe28e3b"}, - {file = "black-22.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:21199526696b8f09c3997e2b4db8d0b108d801a348414264d2eb8eb2532e540d"}, - {file = "black-22.10.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1e464456d24e23d11fced2bc8c47ef66d471f845c7b7a42f3bd77bf3d1789650"}, - {file = "black-22.10.0-cp37-cp37m-win_amd64.whl", hash = "sha256:9311e99228ae10023300ecac05be5a296f60d2fd10fff31cf5c1fa4ca4b1988d"}, - {file = "black-22.10.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:fba8a281e570adafb79f7755ac8721b6cf1bbf691186a287e990c7929c7692ff"}, - {file = "black-22.10.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:915ace4ff03fdfff953962fa672d44be269deb2eaf88499a0f8805221bc68c87"}, - {file = "black-22.10.0-cp38-cp38-win_amd64.whl", hash = "sha256:444ebfb4e441254e87bad00c661fe32df9969b2bf224373a448d8aca2132b395"}, - {file = "black-22.10.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:974308c58d057a651d182208a484ce80a26dac0caef2895836a92dd6ebd725e0"}, - {file = "black-22.10.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72ef3925f30e12a184889aac03d77d031056860ccae8a1e519f6cbb742736383"}, - {file = "black-22.10.0-cp39-cp39-win_amd64.whl", hash = "sha256:432247333090c8c5366e69627ccb363bc58514ae3e63f7fc75c54b1ea80fa7de"}, - {file = "black-22.10.0-py3-none-any.whl", hash = "sha256:c957b2b4ea88587b46cf49d1dc17681c1e672864fd7af32fc1e9664d572b3458"}, - {file = "black-22.10.0.tar.gz", hash = "sha256:f513588da599943e0cde4e32cc9879e825d58720d6557062d1098c5ad80080e1"}, -] -boto3 = [ - {file = "boto3-1.24.96-py3-none-any.whl", hash = "sha256:748c055214c629744c34c7f94bfa888733dfac0b92e1daef9c243e1391ea4f53"}, - {file = "boto3-1.24.96.tar.gz", hash = "sha256:6b8899542cff82becceb3498a2240bf77c96def0515b0a31f7f6a9d5b92e7a3d"}, -] -botocore = [ - {file = "botocore-1.27.96-py3-none-any.whl", hash = "sha256:e41a81a18511f2f9181b2a9ab302a55c0effecccbef846c55aad0c47bfdbefb9"}, - {file = "botocore-1.27.96.tar.gz", hash = "sha256:fc0a13ef6042e890e361cf408759230f8574409bb51f81740d2e5d8ad5d1fbea"}, -] -certifi = [ - {file = "certifi-2022.9.24-py3-none-any.whl", hash = "sha256:90c1a32f1d68f940488354e36370f6cca89f0f106db09518524c88d6ed83f382"}, - {file = "certifi-2022.9.24.tar.gz", hash = "sha256:0d9c601124e5a6ba9712dbc60d9c53c21e34f5f641fe83002317394311bdce14"}, -] -charset-normalizer = [ - {file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"}, - {file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"}, -] -click = [ - {file = "click-8.1.3-py3-none-any.whl", hash = "sha256:bb4d8133cb15a609f44e8213d9b391b0809795062913b383c62be0ee95b1db48"}, - {file = "click-8.1.3.tar.gz", hash = "sha256:7682dc8afb30297001674575ea00d1814d808d6a36af415a82bd481d37ba7b8e"}, -] -colorama = [ - {file = "colorama-0.4.5-py2.py3-none-any.whl", hash = "sha256:854bf444933e37f5824ae7bfc1e98d5bce2ebe4160d46b5edf346a89358e99da"}, - {file = "colorama-0.4.5.tar.gz", hash = "sha256:e6c6b4334fc50988a639d9b98aa429a0b57da6e17b9a44f0451f930b6967b7a4"}, -] -dataclasses-json = [ - {file = "dataclasses-json-0.5.7.tar.gz", hash = "sha256:c2c11bc8214fbf709ffc369d11446ff6945254a7f09128154a7620613d8fda90"}, - {file = "dataclasses_json-0.5.7-py3-none-any.whl", hash = "sha256:bc285b5f892094c3a53d558858a88553dd6a61a11ab1a8128a0e554385dcc5dd"}, -] -dill = [ - {file = "dill-0.3.6-py3-none-any.whl", hash = "sha256:a07ffd2351b8c678dfc4a856a3005f8067aea51d6ba6c700796a4d9e280f39f0"}, - {file = "dill-0.3.6.tar.gz", hash = "sha256:e5db55f3687856d8fbdab002ed78544e1c4559a130302693d839dfe8f93f2373"}, -] -docutils = [ - {file = "docutils-0.19-py3-none-any.whl", hash = "sha256:5e1de4d849fee02c63b040a4a3fd567f4ab104defd8a5511fbbc24a8a017efbc"}, - {file = "docutils-0.19.tar.gz", hash = "sha256:33995a6753c30b7f577febfc2c50411fec6aac7f7ffeb7c4cfe5991072dcf9e6"}, -] +annofabapi = [] +astroid = [] +attrs = [] +babel = [] +backoff = [] +beautifulsoup4 = [] +black = [] +boto3 = [] +botocore = [] +certifi = [] +charset-normalizer = [] +click = [] +colorama = [] +dataclasses-json = [] +dill = [] +docutils = [] fire = [ {file = "fire-0.3.1.tar.gz", hash = "sha256:9736a16227c3d469e5d2d296bce5b4d8fa8d7851e953bda327a455fc2994307f"}, ] -flake8 = [ - {file = "flake8-4.0.1-py2.py3-none-any.whl", hash = "sha256:479b1304f72536a55948cb40a32dce8bb0ffe3501e26eaf292c7e60eb5e0428d"}, - {file = "flake8-4.0.1.tar.gz", hash = "sha256:806e034dda44114815e23c16ef92f95c91e4c71100ff52813adf7132a6ad870d"}, -] -idna = [ - {file = "idna-3.4-py3-none-any.whl", hash = "sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2"}, - {file = "idna-3.4.tar.gz", hash = "sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4"}, -] -imagesize = [ - {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, - {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, -] -importlib-metadata = [ - {file = "importlib_metadata-5.0.0-py3-none-any.whl", hash = "sha256:ddb0e35065e8938f867ed4928d0ae5bf2a53b7773871bfe6bcc7e4fcdc7dea43"}, - {file = "importlib_metadata-5.0.0.tar.gz", hash = "sha256:da31db32b304314d044d3c12c79bd59e307889b287ad12ff387b3500835fc2ab"}, -] -iniconfig = [ - {file = "iniconfig-1.1.1-py2.py3-none-any.whl", hash = "sha256:011e24c64b7f47f6ebd835bb12a743f2fbe9a26d4cecaa7f53bc4f35ee9da8b3"}, - {file = "iniconfig-1.1.1.tar.gz", hash = "sha256:bc3af051d7d14b2ee5ef9969666def0cd1a000e121eaea580d4a313df4b37f32"}, -] -isort = [ - {file = "isort-5.10.1-py3-none-any.whl", hash = "sha256:6f62d78e2f89b4500b080fe3a81690850cd254227f27f75c3a0c491a1f351ba7"}, - {file = "isort-5.10.1.tar.gz", hash = "sha256:e8443a5e7a020e9d7f97f1d7d9cd17c88bcb3bc7e218bf9cf5095fe550be2951"}, -] -jinja2 = [ - {file = "Jinja2-3.1.2-py3-none-any.whl", hash = "sha256:6088930bfe239f0e6710546ab9c19c9ef35e29792895fed6e6e31a023a182a61"}, - {file = "Jinja2-3.1.2.tar.gz", hash = "sha256:31351a702a408a9e7595a8fc6150fc3f43bb6bf7e319770cbc0db9df9437e852"}, -] -jmespath = [ - {file = "jmespath-1.0.1-py3-none-any.whl", hash = "sha256:02e2e4cc71b5bcab88332eebf907519190dd9e6e82107fa7f83b1003a6252980"}, - {file = "jmespath-1.0.1.tar.gz", hash = "sha256:90261b206d6defd58fdd5e85f478bf633a2901798906be2ad389150c5c60edbe"}, -] -lazy-object-proxy = [ - {file = "lazy-object-proxy-1.7.1.tar.gz", hash = "sha256:d609c75b986def706743cdebe5e47553f4a5a1da9c5ff66d76013ef396b5a8a4"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bb8c5fd1684d60a9902c60ebe276da1f2281a318ca16c1d0a96db28f62e9166b"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a57d51ed2997e97f3b8e3500c984db50a554bb5db56c50b5dab1b41339b37e36"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd45683c3caddf83abbb1249b653a266e7069a09f486daa8863fb0e7496a9fdb"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:8561da8b3dd22d696244d6d0d5330618c993a215070f473b699e00cf1f3f6443"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fccdf7c2c5821a8cbd0a9440a456f5050492f2270bd54e94360cac663398739b"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-win32.whl", hash = "sha256:898322f8d078f2654d275124a8dd19b079080ae977033b713f677afcfc88e2b9"}, - {file = "lazy_object_proxy-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:85b232e791f2229a4f55840ed54706110c80c0a210d076eee093f2b2e33e1bfd"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:46ff647e76f106bb444b4533bb4153c7370cdf52efc62ccfc1a28bdb3cc95442"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12f3bb77efe1367b2515f8cb4790a11cffae889148ad33adad07b9b55e0ab22c"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c19814163728941bb871240d45c4c30d33b8a2e85972c44d4e63dd7107faba44"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:e40f2013d96d30217a51eeb1db28c9ac41e9d0ee915ef9d00da639c5b63f01a1"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2052837718516a94940867e16b1bb10edb069ab475c3ad84fd1e1a6dd2c0fcfc"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win32.whl", hash = "sha256:6a24357267aa976abab660b1d47a34aaf07259a0c3859a34e536f1ee6e76b5bb"}, - {file = "lazy_object_proxy-1.7.1-cp36-cp36m-win_amd64.whl", hash = "sha256:6aff3fe5de0831867092e017cf67e2750c6a1c7d88d84d2481bd84a2e019ec35"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6a6e94c7b02641d1311228a102607ecd576f70734dc3d5e22610111aeacba8a0"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c4ce15276a1a14549d7e81c243b887293904ad2d94ad767f42df91e75fd7b5b6"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e368b7f7eac182a59ff1f81d5f3802161932a41dc1b1cc45c1f757dc876b5d2c"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:6ecbb350991d6434e1388bee761ece3260e5228952b1f0c46ffc800eb313ff42"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:553b0f0d8dbf21890dd66edd771f9b1b5f51bd912fa5f26de4449bfc5af5e029"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win32.whl", hash = "sha256:c7a683c37a8a24f6428c28c561c80d5f4fd316ddcf0c7cab999b15ab3f5c5c69"}, - {file = "lazy_object_proxy-1.7.1-cp37-cp37m-win_amd64.whl", hash = "sha256:df2631f9d67259dc9620d831384ed7732a198eb434eadf69aea95ad18c587a28"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:07fa44286cda977bd4803b656ffc1c9b7e3bc7dff7d34263446aec8f8c96f88a"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dca6244e4121c74cc20542c2ca39e5c4a5027c81d112bfb893cf0790f96f57e"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:91ba172fc5b03978764d1df5144b4ba4ab13290d7bab7a50f12d8117f8630c38"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:043651b6cb706eee4f91854da4a089816a6606c1428fd391573ef8cb642ae4f7"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b9e89b87c707dd769c4ea91f7a31538888aad05c116a59820f28d59b3ebfe25a"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-win32.whl", hash = "sha256:9d166602b525bf54ac994cf833c385bfcc341b364e3ee71e3bf5a1336e677b55"}, - {file = "lazy_object_proxy-1.7.1-cp38-cp38-win_amd64.whl", hash = "sha256:8f3953eb575b45480db6568306893f0bd9d8dfeeebd46812aa09ca9579595148"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:dd7ed7429dbb6c494aa9bc4e09d94b778a3579be699f9d67da7e6804c422d3de"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:70ed0c2b380eb6248abdef3cd425fc52f0abd92d2b07ce26359fcbc399f636ad"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7096a5e0c1115ec82641afbdd70451a144558ea5cf564a896294e346eb611be1"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:f769457a639403073968d118bc70110e7dce294688009f5c24ab78800ae56dc8"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:39b0e26725c5023757fc1ab2a89ef9d7ab23b84f9251e28f9cc114d5b59c1b09"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-win32.whl", hash = "sha256:2130db8ed69a48a3440103d4a520b89d8a9405f1b06e2cc81640509e8bf6548f"}, - {file = "lazy_object_proxy-1.7.1-cp39-cp39-win_amd64.whl", hash = "sha256:677ea950bef409b47e51e733283544ac3d660b709cfce7b187f5ace137960d61"}, - {file = "lazy_object_proxy-1.7.1-pp37.pp38-none-any.whl", hash = "sha256:d66906d5785da8e0be7360912e99c9188b70f52c422f9fc18223347235691a84"}, -] -markdown-it-py = [ - {file = "markdown-it-py-2.1.0.tar.gz", hash = "sha256:cf7e59fed14b5ae17c0006eff14a2d9a00ed5f3a846148153899a0224e2c07da"}, - {file = "markdown_it_py-2.1.0-py3-none-any.whl", hash = "sha256:93de681e5c021a432c63147656fe21790bc01231e0cd2da73626f1aa3ac0fe27"}, -] -markupsafe = [ - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:86b1f75c4e7c2ac2ccdaec2b9022845dbb81880ca318bb7a0a01fbf7813e3812"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f121a1420d4e173a5d96e47e9a0c0dcff965afdf1626d28de1460815f7c4ee7a"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a49907dd8420c5685cfa064a1335b6754b74541bbb3706c259c02ed65b644b3e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:10c1bfff05d95783da83491be968e8fe789263689c02724e0c691933c52994f5"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b7bd98b796e2b6553da7225aeb61f447f80a1ca64f41d83612e6139ca5213aa4"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b09bf97215625a311f669476f44b8b318b075847b49316d3e28c08e41a7a573f"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:694deca8d702d5db21ec83983ce0bb4b26a578e71fbdbd4fdcd387daa90e4d5e"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:efc1913fd2ca4f334418481c7e595c00aad186563bbc1ec76067848c7ca0a933"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win32.whl", hash = "sha256:4a33dea2b688b3190ee12bd7cfa29d39c9ed176bda40bfa11099a3ce5d3a7ac6"}, - {file = "MarkupSafe-2.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:dda30ba7e87fbbb7eab1ec9f58678558fd9a6b8b853530e176eabd064da81417"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:671cd1187ed5e62818414afe79ed29da836dde67166a9fac6d435873c44fdd02"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3799351e2336dc91ea70b034983ee71cf2f9533cdff7c14c90ea126bfd95d65a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e72591e9ecd94d7feb70c1cbd7be7b3ebea3f548870aa91e2732960fa4d57a37"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6fbf47b5d3728c6aea2abb0589b5d30459e369baa772e0f37a0320185e87c980"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:d5ee4f386140395a2c818d149221149c54849dfcfcb9f1debfe07a8b8bd63f9a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:bcb3ed405ed3222f9904899563d6fc492ff75cce56cba05e32eff40e6acbeaa3"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:e1c0b87e09fa55a220f058d1d49d3fb8df88fbfab58558f1198e08c1e1de842a"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win32.whl", hash = "sha256:8dc1c72a69aa7e082593c4a203dcf94ddb74bb5c8a731e4e1eb68d031e8498ff"}, - {file = "MarkupSafe-2.1.1-cp37-cp37m-win_amd64.whl", hash = "sha256:97a68e6ada378df82bc9f16b800ab77cbf4b2fada0081794318520138c088e4a"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:e8c843bbcda3a2f1e3c2ab25913c80a3c5376cd00c6e8c4a86a89a28c8dc5452"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0212a68688482dc52b2d45013df70d169f542b7394fc744c02a57374a4207003"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e576a51ad59e4bfaac456023a78f6b5e6e7651dcd383bcc3e18d06f9b55d6d1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9fe39a2ccc108a4accc2676e77da025ce383c108593d65cc909add5c3bd601"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:96e37a3dc86e80bf81758c152fe66dbf60ed5eca3d26305edf01892257049925"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6d0072fea50feec76a4c418096652f2c3238eaa014b2f94aeb1d56a66b41403f"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:089cf3dbf0cd6c100f02945abeb18484bd1ee57a079aefd52cffd17fba910b88"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:6a074d34ee7a5ce3effbc526b7083ec9731bb3cbf921bbe1d3005d4d2bdb3a63"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win32.whl", hash = "sha256:421be9fbf0ffe9ffd7a378aafebbf6f4602d564d34be190fc19a193232fd12b1"}, - {file = "MarkupSafe-2.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:fc7b548b17d238737688817ab67deebb30e8073c95749d55538ed473130ec0c7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e04e26803c9c3851c931eac40c695602c6295b8d432cbe78609649ad9bd2da8a"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b87db4360013327109564f0e591bd2a3b318547bcef31b468a92ee504d07ae4f"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99a2a507ed3ac881b975a2976d59f38c19386d128e7a9a18b7df6fff1fd4c1d6"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:56442863ed2b06d19c37f94d999035e15ee982988920e12a5b4ba29b62ad1f77"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3ce11ee3f23f79dbd06fb3d63e2f6af7b12db1d46932fe7bd8afa259a5996603"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:33b74d289bd2f5e527beadcaa3f401e0df0a89927c1559c8566c066fa4248ab7"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:43093fb83d8343aac0b1baa75516da6092f58f41200907ef92448ecab8825135"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8e3dcf21f367459434c18e71b2a9532d96547aef8a871872a5bd69a715c15f96"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win32.whl", hash = "sha256:d4306c36ca495956b6d568d276ac11fdd9c30a36f1b6eb928070dc5360b22e1c"}, - {file = "MarkupSafe-2.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:46d00d6cfecdde84d40e572d63735ef81423ad31184100411e6e3388d405e247"}, - {file = "MarkupSafe-2.1.1.tar.gz", hash = "sha256:7f91197cc9e48f989d12e4e6fbc46495c446636dfc81b9ccf50bb0ec74b91d4b"}, -] -marshmallow = [ - {file = "marshmallow-3.18.0-py3-none-any.whl", hash = "sha256:35e02a3a06899c9119b785c12a22f4cda361745d66a71ab691fd7610202ae104"}, - {file = "marshmallow-3.18.0.tar.gz", hash = "sha256:6804c16114f7fce1f5b4dadc31f4674af23317fcc7f075da21e35c1a35d781f7"}, -] +flake8 = [] +idna = [] +imagesize = [] +importlib-metadata = [] +iniconfig = [] +isort = [] +jinja2 = [] +jmespath = [] +lazy-object-proxy = [] +markdown-it-py = [] +markupsafe = [] +marshmallow = [] marshmallow-enum = [ {file = "marshmallow-enum-1.5.1.tar.gz", hash = "sha256:38e697e11f45a8e64b4a1e664000897c659b60aa57bfa18d44e226a9920b6e58"}, {file = "marshmallow_enum-1.5.1-py2.py3-none-any.whl", hash = "sha256:57161ab3dbfde4f57adeb12090f39592e992b9c86d206d02f6bd03ebec60f072"}, @@ -1150,226 +974,38 @@ mccabe = [ {file = "mccabe-0.6.1-py2.py3-none-any.whl", hash = "sha256:ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42"}, {file = "mccabe-0.6.1.tar.gz", hash = "sha256:dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"}, ] -mdit-py-plugins = [ - {file = "mdit-py-plugins-0.3.1.tar.gz", hash = "sha256:3fc13298497d6e04fe96efdd41281bfe7622152f9caa1815ea99b5c893de9441"}, - {file = "mdit_py_plugins-0.3.1-py3-none-any.whl", hash = "sha256:606a7f29cf56dbdfaf914acb21709b8f8ee29d857e8f29dcc33d8cb84c57bfa1"}, -] -mdurl = [ - {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, - {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, -] -more-itertools = [ - {file = "more-itertools-8.14.0.tar.gz", hash = "sha256:c09443cd3d5438b8dafccd867a6bc1cb0894389e90cb53d227456b0b0bccb750"}, - {file = "more_itertools-8.14.0-py3-none-any.whl", hash = "sha256:1bc4f91ee5b1b31ac7ceacc17c09befe6a40a503907baf9c839c229b5095cfd2"}, -] -mypy = [ - {file = "mypy-0.971-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f2899a3cbd394da157194f913a931edfd4be5f274a88041c9dc2d9cdcb1c315c"}, - {file = "mypy-0.971-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:98e02d56ebe93981c41211c05adb630d1d26c14195d04d95e49cd97dbc046dc5"}, - {file = "mypy-0.971-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:19830b7dba7d5356d3e26e2427a2ec91c994cd92d983142cbd025ebe81d69cf3"}, - {file = "mypy-0.971-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:02ef476f6dcb86e6f502ae39a16b93285fef97e7f1ff22932b657d1ef1f28655"}, - {file = "mypy-0.971-cp310-cp310-win_amd64.whl", hash = "sha256:25c5750ba5609a0c7550b73a33deb314ecfb559c350bb050b655505e8aed4103"}, - {file = "mypy-0.971-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:d3348e7eb2eea2472db611486846742d5d52d1290576de99d59edeb7cd4a42ca"}, - {file = "mypy-0.971-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:3fa7a477b9900be9b7dd4bab30a12759e5abe9586574ceb944bc29cddf8f0417"}, - {file = "mypy-0.971-cp36-cp36m-win_amd64.whl", hash = "sha256:2ad53cf9c3adc43cf3bea0a7d01a2f2e86db9fe7596dfecb4496a5dda63cbb09"}, - {file = "mypy-0.971-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:855048b6feb6dfe09d3353466004490b1872887150c5bb5caad7838b57328cc8"}, - {file = "mypy-0.971-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:23488a14a83bca6e54402c2e6435467a4138785df93ec85aeff64c6170077fb0"}, - {file = "mypy-0.971-cp37-cp37m-win_amd64.whl", hash = "sha256:4b21e5b1a70dfb972490035128f305c39bc4bc253f34e96a4adf9127cf943eb2"}, - {file = "mypy-0.971-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:9796a2ba7b4b538649caa5cecd398d873f4022ed2333ffde58eaf604c4d2cb27"}, - {file = "mypy-0.971-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a361d92635ad4ada1b1b2d3630fc2f53f2127d51cf2def9db83cba32e47c856"}, - {file = "mypy-0.971-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b793b899f7cf563b1e7044a5c97361196b938e92f0a4343a5d27966a53d2ec71"}, - {file = "mypy-0.971-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d1ea5d12c8e2d266b5fb8c7a5d2e9c0219fedfeb493b7ed60cd350322384ac27"}, - {file = "mypy-0.971-cp38-cp38-win_amd64.whl", hash = "sha256:23c7ff43fff4b0df93a186581885c8512bc50fc4d4910e0f838e35d6bb6b5e58"}, - {file = "mypy-0.971-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f7656b69974a6933e987ee8ffb951d836272d6c0f81d727f1d0e2696074d9e6"}, - {file = "mypy-0.971-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d2022bfadb7a5c2ef410d6a7c9763188afdb7f3533f22a0a32be10d571ee4bbe"}, - {file = "mypy-0.971-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef943c72a786b0f8d90fd76e9b39ce81fb7171172daf84bf43eaf937e9f220a9"}, - {file = "mypy-0.971-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d744f72eb39f69312bc6c2abf8ff6656973120e2eb3f3ec4f758ed47e414a4bf"}, - {file = "mypy-0.971-cp39-cp39-win_amd64.whl", hash = "sha256:77a514ea15d3007d33a9e2157b0ba9c267496acf12a7f2b9b9f8446337aac5b0"}, - {file = "mypy-0.971-py3-none-any.whl", hash = "sha256:0d054ef16b071149917085f51f89555a576e2618d5d9dd70bd6eea6410af3ac9"}, - {file = "mypy-0.971.tar.gz", hash = "sha256:40b0f21484238269ae6a57200c807d80debc6459d444c0489a102d7c6a75fa56"}, -] +mdit-py-plugins = [] +mdurl = [] +more-itertools = [] +mypy = [] mypy-extensions = [ {file = "mypy_extensions-0.4.3-py2.py3-none-any.whl", hash = "sha256:090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d"}, {file = "mypy_extensions-0.4.3.tar.gz", hash = "sha256:2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"}, ] -myst-parser = [ - {file = "myst-parser-0.18.1.tar.gz", hash = "sha256:79317f4bb2c13053dd6e64f9da1ba1da6cd9c40c8a430c447a7b146a594c246d"}, - {file = "myst_parser-0.18.1-py3-none-any.whl", hash = "sha256:61b275b85d9f58aa327f370913ae1bec26ebad372cc99f3ab85c8ec3ee8d9fb8"}, -] -numpy = [ - {file = "numpy-1.23.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:95d79ada05005f6f4f337d3bb9de8a7774f259341c70bc88047a1f7b96a4bcb2"}, - {file = "numpy-1.23.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:926db372bc4ac1edf81cfb6c59e2a881606b409ddc0d0920b988174b2e2a767f"}, - {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c237129f0e732885c9a6076a537e974160482eab8f10db6292e92154d4c67d71"}, - {file = "numpy-1.23.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8365b942f9c1a7d0f0dc974747d99dd0a0cdfc5949a33119caf05cb314682d3"}, - {file = "numpy-1.23.4-cp310-cp310-win32.whl", hash = "sha256:2341f4ab6dba0834b685cce16dad5f9b6606ea8a00e6da154f5dbded70fdc4dd"}, - {file = "numpy-1.23.4-cp310-cp310-win_amd64.whl", hash = "sha256:d331afac87c92373826af83d2b2b435f57b17a5c74e6268b79355b970626e329"}, - {file = "numpy-1.23.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:488a66cb667359534bc70028d653ba1cf307bae88eab5929cd707c761ff037db"}, - {file = "numpy-1.23.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ce03305dd694c4873b9429274fd41fc7eb4e0e4dea07e0af97a933b079a5814f"}, - {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8981d9b5619569899666170c7c9748920f4a5005bf79c72c07d08c8a035757b0"}, - {file = "numpy-1.23.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7a70a7d3ce4c0e9284e92285cba91a4a3f5214d87ee0e95928f3614a256a1488"}, - {file = "numpy-1.23.4-cp311-cp311-win32.whl", hash = "sha256:5e13030f8793e9ee42f9c7d5777465a560eb78fa7e11b1c053427f2ccab90c79"}, - {file = "numpy-1.23.4-cp311-cp311-win_amd64.whl", hash = "sha256:7607b598217745cc40f751da38ffd03512d33ec06f3523fb0b5f82e09f6f676d"}, - {file = "numpy-1.23.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:7ab46e4e7ec63c8a5e6dbf5c1b9e1c92ba23a7ebecc86c336cb7bf3bd2fb10e5"}, - {file = "numpy-1.23.4-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a8aae2fb3180940011b4862b2dd3756616841c53db9734b27bb93813cd79fce6"}, - {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c053d7557a8f022ec823196d242464b6955a7e7e5015b719e76003f63f82d0f"}, - {file = "numpy-1.23.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a0882323e0ca4245eb0a3d0a74f88ce581cc33aedcfa396e415e5bba7bf05f68"}, - {file = "numpy-1.23.4-cp38-cp38-win32.whl", hash = "sha256:dada341ebb79619fe00a291185bba370c9803b1e1d7051610e01ed809ef3a4ba"}, - {file = "numpy-1.23.4-cp38-cp38-win_amd64.whl", hash = "sha256:0fe563fc8ed9dc4474cbf70742673fc4391d70f4363f917599a7fa99f042d5a8"}, - {file = "numpy-1.23.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c67b833dbccefe97cdd3f52798d430b9d3430396af7cdb2a0c32954c3ef73894"}, - {file = "numpy-1.23.4-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f76025acc8e2114bb664294a07ede0727aa75d63a06d2fae96bf29a81747e4a7"}, - {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:12ac457b63ec8ded85d85c1e17d85efd3c2b0967ca39560b307a35a6703a4735"}, - {file = "numpy-1.23.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:95de7dc7dc47a312f6feddd3da2500826defdccbc41608d0031276a24181a2c0"}, - {file = "numpy-1.23.4-cp39-cp39-win32.whl", hash = "sha256:f2f390aa4da44454db40a1f0201401f9036e8d578a25f01a6e237cea238337ef"}, - {file = "numpy-1.23.4-cp39-cp39-win_amd64.whl", hash = "sha256:f260da502d7441a45695199b4e7fd8ca87db659ba1c78f2bbf31f934fe76ae0e"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:61be02e3bf810b60ab74e81d6d0d36246dbfb644a462458bb53b595791251911"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:296d17aed51161dbad3c67ed6d164e51fcd18dbcd5dd4f9d0a9c6055dce30810"}, - {file = "numpy-1.23.4-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4d52914c88b4930dafb6c48ba5115a96cbab40f45740239d9f4159c4ba779962"}, - {file = "numpy-1.23.4.tar.gz", hash = "sha256:ed2cc92af0efad20198638c69bb0fc2870a58dabfba6eb722c933b48556c686c"}, -] -packaging = [ - {file = "packaging-21.3-py3-none-any.whl", hash = "sha256:ef103e05f519cdc783ae24ea4e2e0f508a9c99b2d4969652eed6a2e1ea5bd522"}, - {file = "packaging-21.3.tar.gz", hash = "sha256:dd47c42927d89ab911e606518907cc2d3a1f38bbd026385970643f9c5b8ecfeb"}, -] -pathspec = [ - {file = "pathspec-0.10.1-py3-none-any.whl", hash = "sha256:46846318467efc4556ccfd27816e004270a9eeeeb4d062ce5e6fc7a87c573f93"}, - {file = "pathspec-0.10.1.tar.gz", hash = "sha256:7ace6161b621d31e7902eb6b5ae148d12cfd23f4a249b9ffb6b9fee12084323d"}, -] -platformdirs = [ - {file = "platformdirs-2.5.2-py3-none-any.whl", hash = "sha256:027d8e83a2d7de06bbac4e5ef7e023c02b863d7ea5d079477e722bb41ab25788"}, - {file = "platformdirs-2.5.2.tar.gz", hash = "sha256:58c8abb07dcb441e6ee4b11d8df0ac856038f944ab98b7be6b27b2a3c7feef19"}, -] -pluggy = [ - {file = "pluggy-1.0.0-py2.py3-none-any.whl", hash = "sha256:74134bbf457f031a36d68416e1509f34bd5ccc019f0bcc952c7b909d06b37bd3"}, - {file = "pluggy-1.0.0.tar.gz", hash = "sha256:4224373bacce55f955a878bf9cfa763c1e360858e330072059e10bad68531159"}, -] -py = [ - {file = "py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378"}, - {file = "py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719"}, -] -pycodestyle = [ - {file = "pycodestyle-2.8.0-py2.py3-none-any.whl", hash = "sha256:720f8b39dde8b293825e7ff02c475f3077124006db4f440dcbc9a20b76548a20"}, - {file = "pycodestyle-2.8.0.tar.gz", hash = "sha256:eddd5847ef438ea1c7870ca7eb78a9d47ce0cdb4851a5523949f2601d0cbbe7f"}, -] -pydata-sphinx-theme = [ - {file = "pydata_sphinx_theme-0.9.0-py3-none-any.whl", hash = "sha256:b22b442a6d6437e5eaf0a1f057169ffcb31eaa9f10be7d5481a125e735c71c12"}, - {file = "pydata_sphinx_theme-0.9.0.tar.gz", hash = "sha256:03598a86915b596f4bf80bef79a4d33276a83e670bf360def699dbb9f99dc57a"}, -] -pyflakes = [ - {file = "pyflakes-2.4.0-py2.py3-none-any.whl", hash = "sha256:3bb3a3f256f4b7968c9c788781e4ff07dce46bdf12339dcda61053375426ee2e"}, - {file = "pyflakes-2.4.0.tar.gz", hash = "sha256:05a85c2872edf37a4ed30b0cce2f6093e1d0581f8c19d7393122da7e25b2b24c"}, -] -pygments = [ - {file = "Pygments-2.13.0-py3-none-any.whl", hash = "sha256:f643f331ab57ba3c9d89212ee4a2dabc6e94f117cf4eefde99a0574720d14c42"}, - {file = "Pygments-2.13.0.tar.gz", hash = "sha256:56a8508ae95f98e2b9bdf93a6be5ae3f7d8af858b43e02c5a2ff083726be40c1"}, -] -pylint = [ - {file = "pylint-2.15.5-py3-none-any.whl", hash = "sha256:c2108037eb074334d9e874dc3c783752cc03d0796c88c9a9af282d0f161a1004"}, - {file = "pylint-2.15.5.tar.gz", hash = "sha256:3b120505e5af1d06a5ad76b55d8660d44bf0f2fc3c59c2bdd94e39188ee3a4df"}, -] -pyparsing = [ - {file = "pyparsing-3.0.9-py3-none-any.whl", hash = "sha256:5026bae9a10eeaefb61dab2f09052b9f4307d44aee4eda64b309723d8d206bbc"}, - {file = "pyparsing-3.0.9.tar.gz", hash = "sha256:2b020ecf7d21b687f219b71ecad3631f644a47f01403fa1d1036b0c6416d70fb"}, -] -pytest = [ - {file = "pytest-7.1.3-py3-none-any.whl", hash = "sha256:1377bda3466d70b55e3f5cecfa55bb7cfcf219c7964629b967c37cf0bda818b7"}, - {file = "pytest-7.1.3.tar.gz", hash = "sha256:4f365fec2dff9c1162f834d9f18af1ba13062db0c708bf7b946f8a5c76180c39"}, -] -python-dateutil = [ - {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, - {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, -] -pytz = [ - {file = "pytz-2022.5-py2.py3-none-any.whl", hash = "sha256:335ab46900b1465e714b4fda4963d87363264eb662aab5e65da039c25f1f5b22"}, - {file = "pytz-2022.5.tar.gz", hash = "sha256:c4d88f472f54d615e9cd582a5004d1e5f624854a6a27a6211591c251f22a6914"}, -] -pyyaml = [ - {file = "PyYAML-6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d4db7c7aef085872ef65a8fd7d6d09a14ae91f691dec3e87ee5ee0539d516f53"}, - {file = "PyYAML-6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9df7ed3b3d2e0ecfe09e14741b857df43adb5a3ddadc919a2d94fbdf78fea53c"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77f396e6ef4c73fdc33a9157446466f1cff553d979bd00ecb64385760c6babdc"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a80a78046a72361de73f8f395f1f1e49f956c6be882eed58505a15f3e430962b"}, - {file = "PyYAML-6.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f84fbc98b019fef2ee9a1cb3ce93e3187a6df0b2538a651bfb890254ba9f90b5"}, - {file = "PyYAML-6.0-cp310-cp310-win32.whl", hash = "sha256:2cd5df3de48857ed0544b34e2d40e9fac445930039f3cfe4bcc592a1f836d513"}, - {file = "PyYAML-6.0-cp310-cp310-win_amd64.whl", hash = "sha256:daf496c58a8c52083df09b80c860005194014c3698698d1a57cbcfa182142a3a"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d4b0ba9512519522b118090257be113b9468d804b19d63c71dbcf4a48fa32358"}, - {file = "PyYAML-6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:81957921f441d50af23654aa6c5e5eaf9b06aba7f0a19c18a538dc7ef291c5a1"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afa17f5bc4d1b10afd4466fd3a44dc0e245382deca5b3c353d8b757f9e3ecb8d"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dbad0e9d368bb989f4515da330b88a057617d16b6a8245084f1b05400f24609f"}, - {file = "PyYAML-6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:432557aa2c09802be39460360ddffd48156e30721f5e8d917f01d31694216782"}, - {file = "PyYAML-6.0-cp311-cp311-win32.whl", hash = "sha256:bfaef573a63ba8923503d27530362590ff4f576c626d86a9fed95822a8255fd7"}, - {file = "PyYAML-6.0-cp311-cp311-win_amd64.whl", hash = "sha256:01b45c0191e6d66c470b6cf1b9531a771a83c1c4208272ead47a3ae4f2f603bf"}, - {file = "PyYAML-6.0-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:897b80890765f037df3403d22bab41627ca8811ae55e9a722fd0392850ec4d86"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:50602afada6d6cbfad699b0c7bb50d5ccffa7e46a3d738092afddc1f9758427f"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:48c346915c114f5fdb3ead70312bd042a953a8ce5c7106d5bfb1a5254e47da92"}, - {file = "PyYAML-6.0-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:98c4d36e99714e55cfbaaee6dd5badbc9a1ec339ebfc3b1f52e293aee6bb71a4"}, - {file = "PyYAML-6.0-cp36-cp36m-win32.whl", hash = "sha256:0283c35a6a9fbf047493e3a0ce8d79ef5030852c51e9d911a27badfde0605293"}, - {file = "PyYAML-6.0-cp36-cp36m-win_amd64.whl", hash = "sha256:07751360502caac1c067a8132d150cf3d61339af5691fe9e87803040dbc5db57"}, - {file = "PyYAML-6.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:819b3830a1543db06c4d4b865e70ded25be52a2e0631ccd2f6a47a2822f2fd7c"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:473f9edb243cb1935ab5a084eb238d842fb8f404ed2193a915d1784b5a6b5fc0"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0ce82d761c532fe4ec3f87fc45688bdd3a4c1dc5e0b4a19814b9009a29baefd4"}, - {file = "PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:231710d57adfd809ef5d34183b8ed1eeae3f76459c18fb4a0b373ad56bedcdd9"}, - {file = "PyYAML-6.0-cp37-cp37m-win32.whl", hash = "sha256:c5687b8d43cf58545ade1fe3e055f70eac7a5a1a0bf42824308d868289a95737"}, - {file = "PyYAML-6.0-cp37-cp37m-win_amd64.whl", hash = "sha256:d15a181d1ecd0d4270dc32edb46f7cb7733c7c508857278d3d378d14d606db2d"}, - {file = "PyYAML-6.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0b4624f379dab24d3725ffde76559cff63d9ec94e1736b556dacdfebe5ab6d4b"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:213c60cd50106436cc818accf5baa1aba61c0189ff610f64f4a3e8c6726218ba"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9fa600030013c4de8165339db93d182b9431076eb98eb40ee068700c9c813e34"}, - {file = "PyYAML-6.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:277a0ef2981ca40581a47093e9e2d13b3f1fbbeffae064c1d21bfceba2030287"}, - {file = "PyYAML-6.0-cp38-cp38-win32.whl", hash = "sha256:d4eccecf9adf6fbcc6861a38015c2a64f38b9d94838ac1810a9023a0609e1b78"}, - {file = "PyYAML-6.0-cp38-cp38-win_amd64.whl", hash = "sha256:1e4747bc279b4f613a09eb64bba2ba602d8a6664c6ce6396a4d0cd413a50ce07"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:055d937d65826939cb044fc8c9b08889e8c743fdc6a32b33e2390f66013e449b"}, - {file = "PyYAML-6.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e61ceaab6f49fb8bdfaa0f92c4b57bcfbea54c09277b1b4f7ac376bfb7a7c174"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d67d839ede4ed1b28a4e8909735fc992a923cdb84e618544973d7dfc71540803"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cba8c411ef271aa037d7357a2bc8f9ee8b58b9965831d9e51baf703280dc73d3"}, - {file = "PyYAML-6.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:40527857252b61eacd1d9af500c3337ba8deb8fc298940291486c465c8b46ec0"}, - {file = "PyYAML-6.0-cp39-cp39-win32.whl", hash = "sha256:b5b9eccad747aabaaffbc6064800670f0c297e52c12754eb1d976c57e4f74dcb"}, - {file = "PyYAML-6.0-cp39-cp39-win_amd64.whl", hash = "sha256:b3d267842bf12586ba6c734f89d1f5b871df0273157918b0ccefa29deb05c21c"}, - {file = "PyYAML-6.0.tar.gz", hash = "sha256:68fb519c14306fec9720a2a5b45bc9f0c8d1b9c72adf45c37baedfcd949c35a2"}, -] -requests = [ - {file = "requests-2.28.1-py3-none-any.whl", hash = "sha256:8fefa2a1a1365bf5520aac41836fbee479da67864514bdb821f31ce07ce65349"}, - {file = "requests-2.28.1.tar.gz", hash = "sha256:7c5599b102feddaa661c826c56ab4fee28bfd17f5abca1ebbe3e7f19d7c97983"}, -] -s3transfer = [ - {file = "s3transfer-0.6.0-py3-none-any.whl", hash = "sha256:06176b74f3a15f61f1b4f25a1fc29a4429040b7647133a463da8fa5bd28d5ecd"}, - {file = "s3transfer-0.6.0.tar.gz", hash = "sha256:2ed07d3866f523cc561bf4a00fc5535827981b117dd7876f036b0c1aca42c947"}, -] -scipy = [ - {file = "scipy-1.9.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1884b66a54887e21addf9c16fb588720a8309a57b2e258ae1c7986d4444d3bc0"}, - {file = "scipy-1.9.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:83b89e9586c62e787f5012e8475fbb12185bafb996a03257e9675cd73d3736dd"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a72d885fa44247f92743fc20732ae55564ff2a519e8302fb7e18717c5355a8b"}, - {file = "scipy-1.9.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d01e1dd7b15bd2449c8bfc6b7cc67d630700ed655654f0dfcf121600bad205c9"}, - {file = "scipy-1.9.3-cp310-cp310-win_amd64.whl", hash = "sha256:68239b6aa6f9c593da8be1509a05cb7f9efe98b80f43a5861cd24c7557e98523"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b41bc822679ad1c9a5f023bc93f6d0543129ca0f37c1ce294dd9d386f0a21096"}, - {file = "scipy-1.9.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:90453d2b93ea82a9f434e4e1cba043e779ff67b92f7a0e85d05d286a3625df3c"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:83c06e62a390a9167da60bedd4575a14c1f58ca9dfde59830fc42e5197283dab"}, - {file = "scipy-1.9.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:abaf921531b5aeaafced90157db505e10345e45038c39e5d9b6c7922d68085cb"}, - {file = "scipy-1.9.3-cp311-cp311-win_amd64.whl", hash = "sha256:06d2e1b4c491dc7d8eacea139a1b0b295f74e1a1a0f704c375028f8320d16e31"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5a04cd7d0d3eff6ea4719371cbc44df31411862b9646db617c99718ff68d4840"}, - {file = "scipy-1.9.3-cp38-cp38-macosx_12_0_arm64.whl", hash = "sha256:545c83ffb518094d8c9d83cce216c0c32f8c04aaf28b92cc8283eda0685162d5"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d54222d7a3ba6022fdf5773931b5d7c56efe41ede7f7128c7b1637700409108"}, - {file = "scipy-1.9.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cff3a5295234037e39500d35316a4c5794739433528310e117b8a9a0c76d20fc"}, - {file = "scipy-1.9.3-cp38-cp38-win_amd64.whl", hash = "sha256:2318bef588acc7a574f5bfdff9c172d0b1bf2c8143d9582e05f878e580a3781e"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d644a64e174c16cb4b2e41dfea6af722053e83d066da7343f333a54dae9bc31c"}, - {file = "scipy-1.9.3-cp39-cp39-macosx_12_0_arm64.whl", hash = "sha256:da8245491d73ed0a994ed9c2e380fd058ce2fa8a18da204681f2fe1f57f98f95"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4db5b30849606a95dcf519763dd3ab6fe9bd91df49eba517359e450a7d80ce2e"}, - {file = "scipy-1.9.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c68db6b290cbd4049012990d7fe71a2abd9ffbe82c0056ebe0f01df8be5436b0"}, - {file = "scipy-1.9.3-cp39-cp39-win_amd64.whl", hash = "sha256:5b88e6d91ad9d59478fafe92a7c757d00c59e3bdc3331be8ada76a4f8d683f58"}, - {file = "scipy-1.9.3.tar.gz", hash = "sha256:fbc5c05c85c1a02be77b1ff591087c83bc44579c6d2bd9fb798bb64ea5e1a027"}, -] -six = [ - {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, - {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, -] -snowballstemmer = [ - {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, - {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, -] -soupsieve = [ - {file = "soupsieve-2.3.2.post1-py3-none-any.whl", hash = "sha256:3b2503d3c7084a42b1ebd08116e5f81aadfaea95863628c80a3b774a11b7c759"}, - {file = "soupsieve-2.3.2.post1.tar.gz", hash = "sha256:fc53893b3da2c33de295667a0e19f078c14bf86544af307354de5fcf12a3f30d"}, -] -sphinx = [ - {file = "Sphinx-5.3.0.tar.gz", hash = "sha256:51026de0a9ff9fc13c05d74913ad66047e104f56a129ff73e174eb5c3ee794b5"}, - {file = "sphinx-5.3.0-py3-none-any.whl", hash = "sha256:060ca5c9f7ba57a08a1219e547b269fadf125ae25b06b9fa7f66768efb652d6d"}, -] +myst-parser = [] +numpy = [] +packaging = [] +pathspec = [] +platformdirs = [] +pluggy = [] +py = [] +pycodestyle = [] +pydata-sphinx-theme = [] +pyflakes = [] +pygments = [] +pylint = [] +pyparsing = [] +pytest = [] +python-dateutil = [] +pytz = [] +pyyaml = [] +requests = [] +s3transfer = [] +scipy = [] +six = [] +snowballstemmer = [] +soupsieve = [] +sphinx = [] sphinxcontrib-applehelp = [ {file = "sphinxcontrib-applehelp-1.0.2.tar.gz", hash = "sha256:a072735ec80e7675e3f432fcae8610ecf509c5f1869d17e2eecff44389cdbc58"}, {file = "sphinxcontrib_applehelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:806111e5e962be97c29ec4c1e7fe277bfd19e9652fb1a4392105b43e01af885a"}, @@ -1378,10 +1014,7 @@ sphinxcontrib-devhelp = [ {file = "sphinxcontrib-devhelp-1.0.2.tar.gz", hash = "sha256:ff7f1afa7b9642e7060379360a67e9c41e8f3121f2ce9164266f61b9f4b338e4"}, {file = "sphinxcontrib_devhelp-1.0.2-py2.py3-none-any.whl", hash = "sha256:8165223f9a335cc1af7ffe1ed31d2871f325254c0423bc0c4c7cd1c1e4734a2e"}, ] -sphinxcontrib-htmlhelp = [ - {file = "sphinxcontrib-htmlhelp-2.0.0.tar.gz", hash = "sha256:f5f8bb2d0d629f398bf47d0d69c07bc13b65f75a81ad9e2f71a63d4b7a2f6db2"}, - {file = "sphinxcontrib_htmlhelp-2.0.0-py2.py3-none-any.whl", hash = "sha256:d412243dfb797ae3ec2b59eca0e52dac12e75a241bf0e4eb861e450d06c6ed07"}, -] +sphinxcontrib-htmlhelp = [] sphinxcontrib-jsmath = [ {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, @@ -1390,109 +1023,14 @@ sphinxcontrib-qthelp = [ {file = "sphinxcontrib-qthelp-1.0.3.tar.gz", hash = "sha256:4c33767ee058b70dba89a6fc5c1892c0d57a54be67ddd3e7875a18d14cba5a72"}, {file = "sphinxcontrib_qthelp-1.0.3-py2.py3-none-any.whl", hash = "sha256:bd9fc24bcb748a8d51fd4ecaade681350aa63009a347a8c14e637895444dfab6"}, ] -sphinxcontrib-serializinghtml = [ - {file = "sphinxcontrib-serializinghtml-1.1.5.tar.gz", hash = "sha256:aa5f6de5dfdf809ef505c4895e51ef5c9eac17d0f287933eb49ec495280b6952"}, - {file = "sphinxcontrib_serializinghtml-1.1.5-py2.py3-none-any.whl", hash = "sha256:352a9a00ae864471d3a7ead8d7d79f5fc0b57e8b3f95e9867eb9eb28999b92fd"}, -] -termcolor = [ - {file = "termcolor-2.0.1-py3-none-any.whl", hash = "sha256:7e597f9de8e001a3208c4132938597413b9da45382b6f1d150cff8d062b7aaa3"}, - {file = "termcolor-2.0.1.tar.gz", hash = "sha256:6b2cf769e93364a2676e1de56a7c0cff2cf5bd07f37e9cc80b0dd6320ebfe388"}, -] -tomli = [ - {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, - {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, -] -tomlkit = [ - {file = "tomlkit-0.11.5-py3-none-any.whl", hash = "sha256:f2ef9da9cef846ee027947dc99a45d6b68a63b0ebc21944649505bf2e8bc5fe7"}, - {file = "tomlkit-0.11.5.tar.gz", hash = "sha256:571854ebbb5eac89abcb4a2e47d7ea27b89bf29e09c35395da6f03dd4ae23d1c"}, -] -types-requests = [ - {file = "types-requests-2.28.11.2.tar.gz", hash = "sha256:fdcd7bd148139fb8eef72cf4a41ac7273872cad9e6ada14b11ff5dfdeee60ed3"}, - {file = "types_requests-2.28.11.2-py3-none-any.whl", hash = "sha256:14941f8023a80b16441b3b46caffcbfce5265fd14555844d6029697824b5a2ef"}, -] -types-urllib3 = [ - {file = "types-urllib3-1.26.25.1.tar.gz", hash = "sha256:a948584944b2412c9a74b9cf64f6c48caf8652cb88b38361316f6d15d8a184cd"}, - {file = "types_urllib3-1.26.25.1-py3-none-any.whl", hash = "sha256:f6422596cc9ee5fdf68f9d547f541096a20c2dcfd587e37c804c9ea720bf5cb2"}, -] -typing-extensions = [ - {file = "typing_extensions-4.4.0-py3-none-any.whl", hash = "sha256:16fa4864408f655d35ec496218b85f79b3437c829e93320c7c9215ccfd92489e"}, - {file = "typing_extensions-4.4.0.tar.gz", hash = "sha256:1511434bb92bf8dd198c12b1cc812e800d4181cfcb867674e0f8279cc93087aa"}, -] -typing-inspect = [ - {file = "typing_inspect-0.8.0-py3-none-any.whl", hash = "sha256:5fbf9c1e65d4fa01e701fe12a5bca6c6e08a4ffd5bc60bfac028253a447c5188"}, - {file = "typing_inspect-0.8.0.tar.gz", hash = "sha256:8b1ff0c400943b6145df8119c41c244ca8207f1f10c9c057aeed1560e4806e3d"}, -] -urllib3 = [ - {file = "urllib3-1.26.12-py2.py3-none-any.whl", hash = "sha256:b930dd878d5a8afb066a637fbb35144fe7901e3b209d1cd4f524bd0e9deee997"}, - {file = "urllib3-1.26.12.tar.gz", hash = "sha256:3fa96cf423e6987997fc326ae8df396db2a8b7c667747d47ddd8ecba91f4a74e"}, -] -wrapt = [ - {file = "wrapt-1.14.1-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:1b376b3f4896e7930f1f772ac4b064ac12598d1c38d04907e696cc4d794b43d3"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:903500616422a40a98a5a3c4ff4ed9d0066f3b4c951fa286018ecdf0750194ef"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:5a9a0d155deafd9448baff28c08e150d9b24ff010e899311ddd63c45c2445e28"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:ddaea91abf8b0d13443f6dac52e89051a5063c7d014710dcb4d4abb2ff811a59"}, - {file = "wrapt-1.14.1-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:36f582d0c6bc99d5f39cd3ac2a9062e57f3cf606ade29a0a0d6b323462f4dd87"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:7ef58fb89674095bfc57c4069e95d7a31cfdc0939e2a579882ac7d55aadfd2a1"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:e2f83e18fe2f4c9e7db597e988f72712c0c3676d337d8b101f6758107c42425b"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:ee2b1b1769f6707a8a445162ea16dddf74285c3964f605877a20e38545c3c462"}, - {file = "wrapt-1.14.1-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:833b58d5d0b7e5b9832869f039203389ac7cbf01765639c7309fd50ef619e0b1"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:80bb5c256f1415f747011dc3604b59bc1f91c6e7150bd7db03b19170ee06b320"}, - {file = "wrapt-1.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07f7a7d0f388028b2df1d916e94bbb40624c59b48ecc6cbc232546706fac74c2"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02b41b633c6261feff8ddd8d11c711df6842aba629fdd3da10249a53211a72c4"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fe803deacd09a233e4762a1adcea5db5d31e6be577a43352936179d14d90069"}, - {file = "wrapt-1.14.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:257fd78c513e0fb5cdbe058c27a0624c9884e735bbd131935fd49e9fe719d310"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4fcc4649dc762cddacd193e6b55bc02edca674067f5f98166d7713b193932b7f"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:11871514607b15cfeb87c547a49bca19fde402f32e2b1c24a632506c0a756656"}, - {file = "wrapt-1.14.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8ad85f7f4e20964db4daadcab70b47ab05c7c1cf2a7c1e51087bfaa83831854c"}, - {file = "wrapt-1.14.1-cp310-cp310-win32.whl", hash = "sha256:a9a52172be0b5aae932bef82a79ec0a0ce87288c7d132946d645eba03f0ad8a8"}, - {file = "wrapt-1.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:6d323e1554b3d22cfc03cd3243b5bb815a51f5249fdcbb86fda4bf62bab9e164"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_i686.whl", hash = "sha256:43ca3bbbe97af00f49efb06e352eae40434ca9d915906f77def219b88e85d907"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux1_x86_64.whl", hash = "sha256:6b1a564e6cb69922c7fe3a678b9f9a3c54e72b469875aa8018f18b4d1dd1adf3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_i686.whl", hash = "sha256:00b6d4ea20a906c0ca56d84f93065b398ab74b927a7a3dbd470f6fc503f95dc3"}, - {file = "wrapt-1.14.1-cp35-cp35m-manylinux2010_x86_64.whl", hash = "sha256:a85d2b46be66a71bedde836d9e41859879cc54a2a04fad1191eb50c2066f6e9d"}, - {file = "wrapt-1.14.1-cp35-cp35m-win32.whl", hash = "sha256:dbcda74c67263139358f4d188ae5faae95c30929281bc6866d00573783c422b7"}, - {file = "wrapt-1.14.1-cp35-cp35m-win_amd64.whl", hash = "sha256:b21bb4c09ffabfa0e85e3a6b623e19b80e7acd709b9f91452b8297ace2a8ab00"}, - {file = "wrapt-1.14.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9e0fd32e0148dd5dea6af5fee42beb949098564cc23211a88d799e434255a1f4"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9736af4641846491aedb3c3f56b9bc5568d92b0692303b5a305301a95dfd38b1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5b02d65b9ccf0ef6c34cba6cf5bf2aab1bb2f49c6090bafeecc9cd81ad4ea1c1"}, - {file = "wrapt-1.14.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21ac0156c4b089b330b7666db40feee30a5d52634cc4560e1905d6529a3897ff"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:9f3e6f9e05148ff90002b884fbc2a86bd303ae847e472f44ecc06c2cd2fcdb2d"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:6e743de5e9c3d1b7185870f480587b75b1cb604832e380d64f9504a0535912d1"}, - {file = "wrapt-1.14.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:d79d7d5dc8a32b7093e81e97dad755127ff77bcc899e845f41bf71747af0c569"}, - {file = "wrapt-1.14.1-cp36-cp36m-win32.whl", hash = "sha256:81b19725065dcb43df02b37e03278c011a09e49757287dca60c5aecdd5a0b8ed"}, - {file = "wrapt-1.14.1-cp36-cp36m-win_amd64.whl", hash = "sha256:b014c23646a467558be7da3d6b9fa409b2c567d2110599b7cf9a0c5992b3b471"}, - {file = "wrapt-1.14.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:88bd7b6bd70a5b6803c1abf6bca012f7ed963e58c68d76ee20b9d751c74a3248"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5901a312f4d14c59918c221323068fad0540e34324925c8475263841dbdfe68"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d77c85fedff92cf788face9bfa3ebaa364448ebb1d765302e9af11bf449ca36d"}, - {file = "wrapt-1.14.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d649d616e5c6a678b26d15ece345354f7c2286acd6db868e65fcc5ff7c24a77"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7d2872609603cb35ca513d7404a94d6d608fc13211563571117046c9d2bcc3d7"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:ee6acae74a2b91865910eef5e7de37dc6895ad96fa23603d1d27ea69df545015"}, - {file = "wrapt-1.14.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2b39d38039a1fdad98c87279b48bc5dce2c0ca0d73483b12cb72aa9609278e8a"}, - {file = "wrapt-1.14.1-cp37-cp37m-win32.whl", hash = "sha256:60db23fa423575eeb65ea430cee741acb7c26a1365d103f7b0f6ec412b893853"}, - {file = "wrapt-1.14.1-cp37-cp37m-win_amd64.whl", hash = "sha256:709fe01086a55cf79d20f741f39325018f4df051ef39fe921b1ebe780a66184c"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:8c0ce1e99116d5ab21355d8ebe53d9460366704ea38ae4d9f6933188f327b456"}, - {file = "wrapt-1.14.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e3fb1677c720409d5f671e39bac6c9e0e422584e5f518bfd50aa4cbbea02433f"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:642c2e7a804fcf18c222e1060df25fc210b9c58db7c91416fb055897fc27e8cc"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7b7c050ae976e286906dd3f26009e117eb000fb2cf3533398c5ad9ccc86867b1"}, - {file = "wrapt-1.14.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef3f72c9666bba2bab70d2a8b79f2c6d2c1a42a7f7e2b0ec83bb2f9e383950af"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:01c205616a89d09827986bc4e859bcabd64f5a0662a7fe95e0d359424e0e071b"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5a0f54ce2c092aaf439813735584b9537cad479575a09892b8352fea5e988dc0"}, - {file = "wrapt-1.14.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2cf71233a0ed05ccdabe209c606fe0bac7379fdcf687f39b944420d2a09fdb57"}, - {file = "wrapt-1.14.1-cp38-cp38-win32.whl", hash = "sha256:aa31fdcc33fef9eb2552cbcbfee7773d5a6792c137b359e82879c101e98584c5"}, - {file = "wrapt-1.14.1-cp38-cp38-win_amd64.whl", hash = "sha256:d1967f46ea8f2db647c786e78d8cc7e4313dbd1b0aca360592d8027b8508e24d"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3232822c7d98d23895ccc443bbdf57c7412c5a65996c30442ebe6ed3df335383"}, - {file = "wrapt-1.14.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:988635d122aaf2bdcef9e795435662bcd65b02f4f4c1ae37fbee7401c440b3a7"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cca3c2cdadb362116235fdbd411735de4328c61425b0aa9f872fd76d02c4e86"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d52a25136894c63de15a35bc0bdc5adb4b0e173b9c0d07a2be9d3ca64a332735"}, - {file = "wrapt-1.14.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:40e7bc81c9e2b2734ea4bc1aceb8a8f0ceaac7c5299bc5d69e37c44d9081d43b"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b9b7a708dd92306328117d8c4b62e2194d00c365f18eff11a9b53c6f923b01e3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:6a9a25751acb379b466ff6be78a315e2b439d4c94c1e99cb7266d40a537995d3"}, - {file = "wrapt-1.14.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:34aa51c45f28ba7f12accd624225e2b1e5a3a45206aa191f6f9aac931d9d56fe"}, - {file = "wrapt-1.14.1-cp39-cp39-win32.whl", hash = "sha256:dee0ce50c6a2dd9056c20db781e9c1cfd33e77d2d569f5d1d9321c641bb903d5"}, - {file = "wrapt-1.14.1-cp39-cp39-win_amd64.whl", hash = "sha256:dee60e1de1898bde3b238f18340eec6148986da0455d8ba7848d50470a7a32fb"}, - {file = "wrapt-1.14.1.tar.gz", hash = "sha256:380a85cf89e0e69b7cfbe2ea9f765f004ff419f34194018a6827ac0e3edfed4d"}, -] -zipp = [ - {file = "zipp-3.10.0-py3-none-any.whl", hash = "sha256:4fcb6f278987a6605757302a6e40e896257570d11c51628968ccb2a47e80c6c1"}, - {file = "zipp-3.10.0.tar.gz", hash = "sha256:7a7262fd930bd3e36c50b9a64897aec3fafff3dfdeec9623ae22b40e93f99bb8"}, -] +sphinxcontrib-serializinghtml = [] +termcolor = [] +tomli = [] +tomlkit = [] +types-requests = [] +types-urllib3 = [] +typing-extensions = [] +typing-inspect = [] +urllib3 = [] +wrapt = [] +zipp = [] From a3044f77492e03438757030695a9528675a0c503 Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Fri, 4 Nov 2022 06:23:09 +0900 Subject: [PATCH 02/25] =?UTF-8?q?Annotation=E3=81=AE=E3=83=87=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E5=AE=9A=E7=BE=A9=E3=81=A8=E4=BD=9C=E6=88=90=E3=82=92?= =?UTF-8?q?AnnotationV2=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/model.py | 74 +++++++++++++++++++++++++++++++--- anno3d/annofab/task.py | 19 ++++----- anno3d/kitti/scene_uploader.py | 22 +++++----- 3 files changed, 86 insertions(+), 29 deletions(-) diff --git a/anno3d/annofab/model.py b/anno3d/annofab/model.py index 1ae82bc..3ab2325 100644 --- a/anno3d/annofab/model.py +++ b/anno3d/annofab/model.py @@ -1,3 +1,4 @@ +import typing from dataclasses import dataclass, field from typing import Dict, List, Optional, Tuple, Union @@ -73,22 +74,83 @@ class CuboidAnnotationDetailData(DataClassJsonMixin): version: str = "2" +class UnknownDataField(fields.Field): + """ + FullAnnotationDataUnknownのdataのserialize / deserialize定義 + FullAnnotationDataUnknownのdataは文字列型で、3d-editorのCuboidの場合、json形式文字列を埋めないといけないが、str型だと不便。 + なので、deup / load時に文字列との相互変換をするような定義をしておく + """ + + _type: typing.Any + + def __init__(self, cls: typing.Type, **additional_metadata) -> None: + """ + + Args: + cls: 実際の型 + **additional_metadata: + """ + + super().__init__(**additional_metadata) + self._type = cls + + def _serialize(self, value: typing.Any, attr: Union[str, None], obj: typing.Any, **kwargs) -> str: + return typing.cast(str, value.to_json(ensure_ascii=False)) + + def _deserialize( + self, value: str, attr: Union[str, None], data: Union[typing.Mapping[str, typing.Any], None], **kwargs + ) -> typing.Any: + return self._type.from_json(str) + + +@dataclass +class CuboidFullAnnotationData(DataClassJsonMixin): + data: CuboidAnnotationDetailData = field(metadata=config(mm_field=UnknownDataField(CuboidAnnotationDetailData))) + _type: str = "Unknown" + + +@dataclass +class CuboidAnnotationDetailBody(DataClassJsonMixin): + """Cuboid用 AnnotationDetailContentInputInner""" + + data: CuboidFullAnnotationData + _type: str = "Inner" + + @classmethod + def from_detail_data(cls, data: CuboidAnnotationDetailData) -> "CuboidAnnotationDetailBody": + return CuboidAnnotationDetailBody(data=CuboidFullAnnotationData(data=data)) + + @classmethod + def from_shape(cls, shape: CuboidShape) -> "CuboidAnnotationDetailBody": + return cls.from_detail_data(CuboidAnnotationDetailData(shape)) + + +@dataclass +class AnnotationPropsForEditor: + can_delete: bool + + @dataclass -class CuboidAnnotationDetail(DataClassJsonMixin): +class CuboidAnnotationDetailCreate(DataClassJsonMixin): + """Cuboid用AnnotationDetailV2Createに対応する型""" + annotation_id: str - account_id: str label_id: str - is_protected: bool - data: CuboidAnnotationDetailData - data_holding_type: str = "inner" + body: CuboidAnnotationDetailBody + editor_props: AnnotationPropsForEditor + _type: str = "Create" @dataclass class CuboidAnnotations(DataClassJsonMixin): + """CLIからCuboidAnnotationを生成する場合に利用する AnnotationV2Input""" + project_id: str task_id: str input_data_id: str - details: List[CuboidAnnotationDetail] + details: List[CuboidAnnotationDetailCreate] + additional_data_list: list = field(default_factory=list) # 型を定義してないので空を前提としておく + format_version: str = "2.0.0" @dataclass diff --git a/anno3d/annofab/task.py b/anno3d/annofab/task.py index 2b503a4..d3f9014 100644 --- a/anno3d/annofab/task.py +++ b/anno3d/annofab/task.py @@ -1,4 +1,3 @@ -import json from typing import Collection, List, Optional from annofabapi import AnnofabApi @@ -6,7 +5,7 @@ from annofabapi.dataclass.task import Task from annofabapi.models import TaskStatus -from anno3d.annofab.model import CuboidAnnotationDetail +from anno3d.annofab.model import CuboidAnnotationDetailCreate, CuboidAnnotations from anno3d.annofab.project import ProjectApi @@ -44,20 +43,16 @@ def put_task(self, task_id: str, input_data_ids: Collection[str]) -> Task: return self._decode_task(result) def put_cuboid_annotations( - self, task_id: str, input_data_id: str, annotations: List[CuboidAnnotationDetail] + self, task_id: str, input_data_id: str, details: List[CuboidAnnotationDetailCreate] ) -> None: client = self._client project_id = self._project_id + annotations = CuboidAnnotations( + project_id=project_id, task_id=task_id, input_data_id=input_data_id, details=details + ) - details: List[dict] = CuboidAnnotationDetail.schema().dump(annotations, many=True) - for d in details: - data: dict = d["data"] - d["data"] = json.dumps(data, ensure_ascii=False) - d["additional_data_list"] = [] - - body = {"project_id": project_id, "task_id": task_id, "input_data_id": input_data_id, "details": details} - - client.put_annotation(project_id, task_id, input_data_id, body) + body = annotations.to_json(ensure_ascii=False) + client.put_annotation(project_id, task_id, input_data_id, {"v": "2"}, body) def start_annotate(self, task_id: str) -> Optional[Task]: """対象タスクの担当者を自分自身ににして、 annotate状態にする""" diff --git a/anno3d/kitti/scene_uploader.py b/anno3d/kitti/scene_uploader.py index aec5b15..9f68f1c 100644 --- a/anno3d/kitti/scene_uploader.py +++ b/anno3d/kitti/scene_uploader.py @@ -14,8 +14,9 @@ from anno3d.annofab.model import ( XYZ, - CuboidAnnotationDetail, - CuboidAnnotationDetailData, + AnnotationPropsForEditor, + CuboidAnnotationDetailBody, + CuboidAnnotationDetailCreate, CuboidDirection, CuboidShape, Size, @@ -158,13 +159,13 @@ def _create_tasks(self, project_id: str, task_to_data_dict: Dict[TaskId, List[Tu def _label_to_cuboids( self, id_to_label: Dict[str, LabelV2], labels: List[KittiLabel] - ) -> List[CuboidAnnotationDetail]: - def detail_data(kitti_label: KittiLabel) -> CuboidAnnotationDetailData: + ) -> List[CuboidAnnotationDetailCreate]: + def detail_data(kitti_label: KittiLabel) -> CuboidAnnotationDetailBody: # directionはrotationから計算可能で、且つ3dpc-editorでの読み込みには利用していないが、エディタで編集されない場合があるので、計算しておく rotation = Rotation.from_euler("xyz", np.array([0.0, 0.0, kitti_label.yaw])) direction = rotation.apply(np.array([1.0, 0.0, 0.0])) - return CuboidAnnotationDetailData( + return CuboidAnnotationDetailBody.from_shape( CuboidShape( dimensions=Size(width=kitti_label.width, height=kitti_label.height, depth=kitti_label.depth), location=XYZ(x=kitti_label.x, y=kitti_label.y, z=kitti_label.z + (kitti_label.height / 2)), @@ -174,12 +175,11 @@ def detail_data(kitti_label: KittiLabel) -> CuboidAnnotationDetailData: ) return [ - CuboidAnnotationDetail( - label.annotation_id if label.annotation_id is not None else str(uuid.uuid4()), - self._client.account_id, - label.type, - False, - detail_data(label), + CuboidAnnotationDetailCreate( + annotation_id=label.annotation_id if label.annotation_id is not None else str(uuid.uuid4()), + label_id=label.type, + body=detail_data(label), + editor_props=AnnotationPropsForEditor(can_delete=True), ) for label in labels if label.type in id_to_label From b4a0b67a6e4861f184db113828b1e7869d002fe1 Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Sat, 5 Nov 2022 04:50:53 +0900 Subject: [PATCH 03/25] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E8=A8=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/project.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/anno3d/annofab/project.py b/anno3d/annofab/project.py index 5f88940..541455a 100644 --- a/anno3d/annofab/project.py +++ b/anno3d/annofab/project.py @@ -300,7 +300,7 @@ def put_label( en_name: color: ラベルの表示色。 "(R,G,B)"形式 R/G/Bは、それぞれ0〜255の整数値で指定する metadata: - ignore_additional: + ignore_additional: Segmentの『無視』を属性にマッピングする場合はその無視属性のDef。 そうでなければNone Returns: From 67956618abf1c220e16b46a5fa820c1e56f0c741 Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Sat, 5 Nov 2022 04:51:11 +0900 Subject: [PATCH 04/25] bump annofabapi to 0.65.0 --- poetry.lock | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/poetry.lock b/poetry.lock index 14e09d0..91794d5 100644 --- a/poetry.lock +++ b/poetry.lock @@ -8,7 +8,7 @@ python-versions = "*" [[package]] name = "annofabapi" -version = "0.64.0" +version = "0.65.0" description = "Python Clinet Library of Annofab WebAPI (https://annofab.com/docs/api/)" category = "main" optional = false From 92480a967208f16c7355cd752a106da2694ab7db Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Sat, 5 Nov 2022 07:51:48 +0900 Subject: [PATCH 05/25] =?UTF-8?q?SpecsV3=E3=81=A7=E3=81=AE=E6=97=A73dpc-ed?= =?UTF-8?q?itor=E4=BB=95=E6=A7=98=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/model.py | 14 ++--- anno3d/annofab/project.py | 51 +++++++++---------- anno3d/annofab/specifiers/label_specifiers.py | 6 +-- .../annofab/specifiers/project_specifiers.py | 16 +++--- anno3d/annofab/specifiers/utils.py | 12 +++++ anno3d/kitti/scene_uploader.py | 8 +-- 6 files changed, 57 insertions(+), 50 deletions(-) diff --git a/anno3d/annofab/model.py b/anno3d/annofab/model.py index 3ab2325..e5ab64e 100644 --- a/anno3d/annofab/model.py +++ b/anno3d/annofab/model.py @@ -5,9 +5,9 @@ from annofabapi.dataclass.annotation_specs import ( AdditionalDataDefinitionV2, AdditionalDataRestriction, - AnnotationSpecsV2, + AnnotationSpecsV3, InspectionPhrase, - LabelV2, + LabelV3, ) from annofabapi.dataclass.job import ProjectJobInfo from annofabapi.dataclass.project import Project @@ -154,8 +154,8 @@ class CuboidAnnotations(DataClassJsonMixin): @dataclass -class AnnotationSpecsRequestV2(DataClassJsonMixin): - labels: List[LabelV2] +class AnnotationSpecsRequestV3(DataClassJsonMixin): + labels: List[LabelV3] additionals: List[AdditionalDataDefinitionV2] restrictions: List[AdditionalDataRestriction] inspection_phrases: List[InspectionPhrase] @@ -167,15 +167,15 @@ class AnnotationSpecsRequestV2(DataClassJsonMixin): metadata: Optional[Dict[str, str]] @staticmethod - def from_specs(specs: AnnotationSpecsV2) -> "AnnotationSpecsRequestV2": - return AnnotationSpecsRequestV2( + def from_specs(specs: AnnotationSpecsV3) -> "AnnotationSpecsRequestV3": + return AnnotationSpecsRequestV3( labels=specs.labels if specs.labels is not None else [], additionals=specs.additionals if specs.additionals is not None else [], restrictions=specs.restrictions if specs.restrictions is not None else [], inspection_phrases=specs.inspection_phrases if specs.inspection_phrases is not None else [], comment="", auto_marking=False, - format_version=specs.format_version if specs.format_version is not None else "2.1.0", + format_version=specs.format_version if specs.format_version is not None else "3.0.0", last_updated_datetime=specs.updated_datetime, option=specs.option, metadata=specs.metadata, diff --git a/anno3d/annofab/project.py b/anno3d/annofab/project.py index 541455a..a868654 100644 --- a/anno3d/annofab/project.py +++ b/anno3d/annofab/project.py @@ -7,12 +7,11 @@ from annofabapi import models as afm from annofabapi.dataclass.annotation_specs import ( AdditionalDataDefinitionV2, - AnnotationEditorFeature, - AnnotationSpecsV2, + AnnotationSpecsV3, Color, InternationalizationMessage, InternationalizationMessageMessages, - LabelV2, + LabelV3, ) from annofabapi.dataclass.job import ProjectJobInfo from annofabapi.dataclass.project import Project @@ -26,7 +25,7 @@ lang_en, lang_ja, ) -from anno3d.annofab.model import AnnotationSpecsRequestV2, Label +from anno3d.annofab.model import AnnotationSpecsRequestV3, Label from anno3d.annofab.specifiers.label_specifiers import LabelSpecifiers from anno3d.annofab.specifiers.project_specifiers import ProjectSpecifiers from anno3d.model.annotation_area import AnnotationArea @@ -40,11 +39,11 @@ class ProjectModifiers: specifiers = ProjectSpecifiers @classmethod - def set_annotation_area(cls, area: AnnotationArea) -> DataModifier[AnnotationSpecsV2]: + def set_annotation_area(cls, area: AnnotationArea) -> DataModifier[AnnotationSpecsV3]: return cls.specifiers.annotation_area.mod(lambda _: area) @classmethod - def remove_preset_cuboid_size(cls, key_name: str) -> DataModifier[AnnotationSpecsV2]: + def remove_preset_cuboid_size(cls, key_name: str) -> DataModifier[AnnotationSpecsV3]: prefixed = preset_cuboid_size_metadata_prefix + key_name.title() return cls.specifiers.preset_cuboid_sizes.mod( lambda curr: dict(filter(lambda kv: kv[0] != prefixed, curr.items())) @@ -53,7 +52,7 @@ def remove_preset_cuboid_size(cls, key_name: str) -> DataModifier[AnnotationSpec @classmethod def add_preset_cuboid_size( cls, key_name: str, ja_name: str, en_name: str, width: float, height: float, depth: float, order: int - ) -> DataModifier[AnnotationSpecsV2]: + ) -> DataModifier[AnnotationSpecsV3]: prefixed = preset_cuboid_size_metadata_prefix + key_name.title() def update(sizes: PresetCuboidSizes) -> PresetCuboidSizes: @@ -77,9 +76,9 @@ def put_label( label_id: str = "", ja_name: str = "", color: Optional[Tuple[int, int, int]] = None, - ) -> DataModifier[AnnotationSpecsV2]: - def init_label() -> LabelV2: - return LabelV2( + ) -> DataModifier[AnnotationSpecsV3]: + def init_label() -> LabelV3: + return LabelV3( label_id=label_id if label_id != "" else str(uuid.uuid4()), label_name=InternationalizationMessage( [ @@ -90,18 +89,13 @@ def init_label() -> LabelV2: ), keybind=[], annotation_type=DefaultAnnotationType.CUSTOM.value, - bounding_box_metadata=None, - segmentation_metadata=None, + field_values={}, additional_data_definitions=[], color=Color(red=0, green=0, blue=0), - annotation_editor_feature=AnnotationEditorFeature( - append=False, erase=False, freehand=False, rectangle_fill=False, polygon_fill=False, fill_near=False - ), - allow_out_of_image_bounds=False, metadata={}, ) - def mod(label_opt: Optional[LabelV2]) -> Optional[LabelV2]: + def mod(label_opt: Optional[LabelV3]) -> Optional[LabelV3]: label = label_opt if label_opt is not None else init_label() label.label_name = InternationalizationMessage( [ @@ -138,7 +132,7 @@ def mod(label_opt: Optional[LabelV2]) -> Optional[LabelV2]: @classmethod def create_ignore_additional_if_necessary( cls, additional_def: IgnoreAdditionalDef - ) -> DataModifier[AnnotationSpecsV2]: + ) -> DataModifier[AnnotationSpecsV3]: def mod(current: Optional[AdditionalDataDefinitionV2]) -> Optional[AdditionalDataDefinitionV2]: if current is not None: return current @@ -225,16 +219,17 @@ def create_custom_project( return created_id def _mod_project_specs( - self, project_id: str, mod_func: Callable[[AnnotationSpecsV2], AnnotationSpecsV2] - ) -> AnnotationSpecsV2: + self, project_id: str, mod_func: Callable[[AnnotationSpecsV3], AnnotationSpecsV3] + ) -> AnnotationSpecsV3: client = self._client specs = self.get_annotation_specs(project_id) new_specs = mod_func(specs) - request = AnnotationSpecsRequestV2.from_specs(new_specs) + request = AnnotationSpecsRequestV3.from_specs(new_specs) - created_specs, _ = client.put_annotation_specs(project_id, request.to_dict(encode_json=True)) - return AnnotationSpecsV2.from_dict(created_specs) + print(request.to_json(ensure_ascii=False, indent=2)) + created_specs, _ = client.put_annotation_specs(project_id, {"v": "3"}, request.to_dict(encode_json=True)) + return AnnotationSpecsV3.from_dict(created_specs) def put_cuboid_label( self, @@ -262,14 +257,14 @@ def put_segment_label( return self.put_label(project_id, en_name, metadata, additional_def, label_id, ja_name, color) - def get_annotation_specs(self, project_id: str) -> AnnotationSpecsV2: + def get_annotation_specs(self, project_id: str) -> AnnotationSpecsV3: client = self._client - specs, _ = client.get_annotation_specs(project_id, {"v": "2"}) + specs, _ = client.get_annotation_specs(project_id, {"v": "3"}) - return AnnotationSpecsV2.from_dict(specs) + return AnnotationSpecsV3.from_dict(specs) @staticmethod - def _from_annofab_label(annofab_label: afm.LabelV2) -> Label: + def _from_annofab_label(annofab_label: afm.LabelV3) -> Label: messages = annofab_label["label_name"]["messages"] color = annofab_label["color"] empty_message: dict = InternationalizationMessageMessages("", "").to_dict() @@ -317,7 +312,7 @@ def put_label( mod_additionals = ( ProjectModifiers.create_ignore_additional_if_necessary(ignore_additional) if ignore_additional is not None - else DataModifier.identity(AnnotationSpecsV2) + else DataModifier.identity(AnnotationSpecsV3) ) created_specs = self._mod_project_specs(project_id, mod_labels.and_then(mod_additionals)) diff --git a/anno3d/annofab/specifiers/label_specifiers.py b/anno3d/annofab/specifiers/label_specifiers.py index 5ed117f..eafd8f3 100644 --- a/anno3d/annofab/specifiers/label_specifiers.py +++ b/anno3d/annofab/specifiers/label_specifiers.py @@ -1,7 +1,7 @@ from dataclasses import replace from typing import Callable, Optional -from annofabapi.dataclass.annotation_specs import Color, LabelV2 +from annofabapi.dataclass.annotation_specs import Color, LabelV3 from anno3d.annofab.specifiers.utils import GenList from anno3d.util.modifier import DataSpecifier @@ -10,7 +10,7 @@ class LabelSpecifiers: - label = DataSpecifier.identity(LabelV2) + label = DataSpecifier.identity(LabelV3) color = label.zoom( lambda label: label.color if label.color is not None else zero_color, lambda label, color: replace(label, color=color), @@ -22,6 +22,6 @@ class LabelSpecifiers: ) @classmethod - def additional(cls, additional_id: str) -> DataSpecifier[LabelV2, Optional[str]]: + def additional(cls, additional_id: str) -> DataSpecifier[LabelV3, Optional[str]]: predicate: Callable[[str], bool] = lambda additional: additional == additional_id return cls.additionals.zoom(GenList.gen_zoom_in(predicate), GenList.gen_zoom_out(predicate)) diff --git a/anno3d/annofab/specifiers/project_specifiers.py b/anno3d/annofab/specifiers/project_specifiers.py index 26de8f5..a14de37 100644 --- a/anno3d/annofab/specifiers/project_specifiers.py +++ b/anno3d/annofab/specifiers/project_specifiers.py @@ -1,33 +1,33 @@ from dataclasses import replace from typing import Callable, Dict, List, Optional, TypeVar -from annofabapi.dataclass.annotation_specs import AdditionalDataDefinitionV2, AnnotationSpecsV2, LabelV2 +from annofabapi.dataclass.annotation_specs import AdditionalDataDefinitionV2, AnnotationSpecsV3, LabelV3 from anno3d.annofab.specifiers.utils import GenList from anno3d.model.project_specs_meta import decode_project_meta, encode_project_meta from anno3d.util.modifier import DataSpecifier A = TypeVar("A") -AS = AnnotationSpecsV2 +AS = AnnotationSpecsV3 class ProjectSpecifiers: - annotation = DataSpecifier.identity(AnnotationSpecsV2) + annotation = DataSpecifier.identity(AnnotationSpecsV3) class Labels: @staticmethod - def zoom_in(anno: AS) -> List[LabelV2]: + def zoom_in(anno: AS) -> List[LabelV3]: return anno.labels if anno.labels is not None else [] @staticmethod - def zoom_out(anno: AS, labels: List[LabelV2]) -> AS: + def zoom_out(anno: AS, labels: List[LabelV3]) -> AS: return replace(anno, labels=labels) - labels: DataSpecifier[AS, List[LabelV2]] = annotation.zoom(Labels.zoom_in, Labels.zoom_out) + labels: DataSpecifier[AS, List[LabelV3]] = annotation.zoom(Labels.zoom_in, Labels.zoom_out) @classmethod - def label(cls, label_id: str) -> DataSpecifier[AS, Optional[LabelV2]]: - predicate: Callable[[LabelV2], bool] = lambda l: l.label_id == label_id + def label(cls, label_id: str) -> DataSpecifier[AS, Optional[LabelV3]]: + predicate: Callable[[LabelV3], bool] = lambda l: l.label_id == label_id return cls.labels.zoom(GenList.gen_zoom_in(predicate), GenList.gen_zoom_out(predicate)) class Additionals: diff --git a/anno3d/annofab/specifiers/utils.py b/anno3d/annofab/specifiers/utils.py index 0140423..3cedae7 100644 --- a/anno3d/annofab/specifiers/utils.py +++ b/anno3d/annofab/specifiers/utils.py @@ -8,11 +8,23 @@ class GenList: @staticmethod def gen_zoom_in(pred: Callable[[A], bool]) -> Callable[[List[A]], Optional[A]]: + """Listの要素のうち最初に条件を満たす値を取得するzoom_inを生成する""" return lambda l: more_itertools.first_true(l, pred=pred) @staticmethod def gen_zoom_out(pred: Callable[[A], bool]) -> Callable[[List[A], Optional[A]], List[A]]: + """Listの要素のうち最初に条件を満たす値を更新するzoom_outを生成する""" + def zoom_out(a_list: List[A], a: Optional[A]) -> List[A]: + """ + 条件を最初に満たした要素を更新する。 条件を満たす要素がない場合、a_listの最後に値を追加する + Args: + a_list: 更新対象リスト + a: 更新要素。 Noneの場合値を削除する。 + + Returns: + + """ index, _ = more_itertools.first_true(enumerate(a_list), pred=lambda ie: pred(ie[1]), default=(None, None)) if index is None: if a is None: diff --git a/anno3d/kitti/scene_uploader.py b/anno3d/kitti/scene_uploader.py index 9f68f1c..84cc24e 100644 --- a/anno3d/kitti/scene_uploader.py +++ b/anno3d/kitti/scene_uploader.py @@ -9,7 +9,7 @@ import more_itertools import numpy as np from annofabapi import AnnofabApi -from annofabapi.dataclass.annotation_specs import LabelV2 +from annofabapi.dataclass.annotation_specs import LabelV3 from scipy.spatial.transform import Rotation from anno3d.annofab.model import ( @@ -158,7 +158,7 @@ def _create_tasks(self, project_id: str, task_to_data_dict: Dict[TaskId, List[Tu task.put_task(task_id, input_data_id_list) def _label_to_cuboids( - self, id_to_label: Dict[str, LabelV2], labels: List[KittiLabel] + self, id_to_label: Dict[str, LabelV3], labels: List[KittiLabel] ) -> List[CuboidAnnotationDetailCreate]: def detail_data(kitti_label: KittiLabel) -> CuboidAnnotationDetailBody: # directionはrotationから計算可能で、且つ3dpc-editorでの読み込みには利用していないが、エディタで編集されない場合があるので、計算しておく @@ -188,7 +188,7 @@ def detail_data(kitti_label: KittiLabel) -> CuboidAnnotationDetailBody: async def _create_annotations( self, task: TaskApi, - id_to_label: Dict[str, LabelV2], + id_to_label: Dict[str, LabelV3], task_id: TaskId, pathsss: List[Tuple[DataId, List[LabelPaths]]], ) -> None: @@ -291,7 +291,7 @@ async def upload_scene_async(self, scene: Scene, uploader_input: SceneUploaderIn if uploader_input.kind == UploadKind.CREATE_TASK: return - id_to_label: Dict[str, LabelV2] = { + id_to_label: Dict[str, LabelV3] = { anno_label.label_id: anno_label for anno_label in annofab_labels if anno_label.label_id is not None } From 10aec6452bb827eab61a7a6e08720b02dce2fe10 Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Sat, 5 Nov 2022 08:18:14 +0900 Subject: [PATCH 06/25] =?UTF-8?q?KittiLabel=E3=81=AEdecode=E6=99=82?= =?UTF-8?q?=E3=81=AB=E5=AF=BE=E8=B1=A1=E3=81=AE=E3=83=95=E3=82=A1=E3=82=A4?= =?UTF-8?q?=E3=83=AB=E3=81=8C=E7=84=A1=E3=81=84=E5=A0=B4=E5=90=88=E3=80=81?= =?UTF-8?q?=E3=83=A9=E3=83=99=E3=83=AB=E3=81=8C=E7=84=A1=E3=81=84=E3=81=93?= =?UTF-8?q?=E3=81=A8=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/model/kitti_label.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/anno3d/model/kitti_label.py b/anno3d/model/kitti_label.py index 85db46b..0acfb3e 100644 --- a/anno3d/model/kitti_label.py +++ b/anno3d/model/kitti_label.py @@ -46,5 +46,7 @@ def decode_many(cls, csv: str) -> List["KittiLabel"]: @classmethod def decode_path(cls, csv_path: Path) -> List["KittiLabel"]: + if not csv_path.exists(): + return [] with csv_path.open("r") as reader: return cls.decode_many(reader.read()) From 01009935d5c067d07f74714457575b684bf7f2b3 Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Sun, 6 Nov 2022 05:33:58 +0900 Subject: [PATCH 07/25] =?UTF-8?q?=E4=BB=95=E6=A7=98=E6=8B=A1=E5=BC=B5?= =?UTF-8?q?=E3=83=97=E3=83=A9=E3=82=B0=E3=82=A4=E3=83=B3=E3=81=A7=E5=BF=85?= =?UTF-8?q?=E8=A6=81=E3=81=AB=E3=81=AA=E3=82=8Bdataclass=E3=82=92=E5=AE=9A?= =?UTF-8?q?=E7=BE=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/model.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/anno3d/annofab/model.py b/anno3d/annofab/model.py index e5ab64e..507605e 100644 --- a/anno3d/annofab/model.py +++ b/anno3d/annofab/model.py @@ -153,6 +153,30 @@ class CuboidAnnotations(DataClassJsonMixin): format_version: str = "2.0.0" +@dataclass +class OneIntegerFieldValue(DataClassJsonMixin): + """ + LabelV3.field_valuesに格納される値の種別の一つ + 整数値を一つだけ保持するValue + """ + + value: int + _type: str = "OneIntegerFieldValue" + + +@dataclass +class CuboidFieldValues(DataClassJsonMixin): + """Cuboid用LabelV3のfield_values値 常に空""" + + +@dataclass +class SegmentFieldValues(DataClassJsonMixin): + """Segment用LabelV3のfield_values値""" + + layer: OneIntegerFieldValue + """セグメントがどのレイヤーに所属するかを表す値。 0以上の整数値""" + + @dataclass class AnnotationSpecsRequestV3(DataClassJsonMixin): labels: List[LabelV3] From 4808cc5105fdc243a600378a0f10b77aac80a5c8 Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Sun, 6 Nov 2022 08:37:57 +0900 Subject: [PATCH 08/25] =?UTF-8?q?=E6=8B=A1=E5=BC=B5=E4=BB=95=E6=A7=98?= =?UTF-8?q?=E3=83=97=E3=83=A9=E3=82=B0=E3=82=A4=E3=83=B3=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=E3=81=AE=E6=BA=96=E5=82=99=E3=81=AE=E3=81=9F=E3=82=81=E3=80=81?= =?UTF-8?q?label=5Fspecifiers=E3=81=B8=E3=81=AE=E5=AE=9A=E7=BE=A9=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * anno3d/model/label.pyに定義されていた、MetadataをInfoにして、実際のJson表現とは関係ない型にした * 消えた情報は、LabelSpecifier上に実装された。 * LabelSpecifierは更に抽象化される予定 * label_specifiers.pyに実Json構造に対して中立なインターフェースを追加 * それらを利用して、ProjectModifier / ProjectApi を変更 --- anno3d/annofab/project.py | 175 +++++++++++++----- anno3d/annofab/specifiers/label_specifiers.py | 130 ++++++++++++- anno3d/app.py | 5 +- anno3d/model/label.py | 22 +-- 4 files changed, 273 insertions(+), 59 deletions(-) diff --git a/anno3d/annofab/project.py b/anno3d/annofab/project.py index a868654..f59cedc 100644 --- a/anno3d/annofab/project.py +++ b/anno3d/annofab/project.py @@ -1,7 +1,7 @@ import colorsys import random import uuid -from typing import Any, Callable, Dict, List, Optional, Tuple, Union +from typing import Any, Callable, Dict, List, Literal, Optional, Tuple from annofabapi import AnnofabApi from annofabapi import models as afm @@ -29,7 +29,6 @@ from anno3d.annofab.specifiers.label_specifiers import LabelSpecifiers from anno3d.annofab.specifiers.project_specifiers import ProjectSpecifiers from anno3d.model.annotation_area import AnnotationArea -from anno3d.model.label import CuboidLabelMetadata, SegmentLabelMetadata from anno3d.model.preset_cuboids import PresetCuboidSize, PresetCuboidSizes, preset_cuboid_size_metadata_prefix from anno3d.model.project_specs_meta import ProjectMetadata from anno3d.util.modifier import DataModifier @@ -67,11 +66,96 @@ def update(sizes: PresetCuboidSizes) -> PresetCuboidSizes: return cls.specifiers.preset_cuboid_sizes.mod(update) + @classmethod + def put_cuboid_label( + cls, + en_name: str, + label_id: str = "", + ja_name: str = "", + color: Optional[Tuple[int, int, int]] = None, + ) -> DataModifier[AnnotationSpecsV3]: + set_anno_type = LabelSpecifiers.annotation_type.set("user_bounding_box") + + return cls.put_label( + en_name=en_name, + mod_label_info=set_anno_type, + ignore_additional=None, + label_id=label_id, + ja_name=ja_name, + color=color, + ) + + @classmethod + def put_instance_segment_label( + cls, + en_name: str, + layer: int, + default_ignore: Optional[bool] = None, + label_id: str = "", + ja_name: str = "", + color: Optional[Tuple[int, int, int]] = None, + ) -> DataModifier[AnnotationSpecsV3]: + set_anno_type = LabelSpecifiers.annotation_type.set("user_instance_segment") + set_layer = LabelSpecifiers.layer.set(layer) + + ignore_additional: Optional[IgnoreAdditionalDef] + ignore_id: Optional[str] + if default_ignore is None: + ignore_additional = None + ignore_id = None + else: + ignore_additional = default_ignore_additional if default_ignore else default_non_ignore_additional + ignore_id = ignore_additional.id + + set_ignore = LabelSpecifiers.ignore.set(ignore_id) + + return cls.put_label( + en_name=en_name, + mod_label_info=set_anno_type.and_then(set_layer).and_then(set_ignore), + ignore_additional=ignore_additional, + label_id=label_id, + ja_name=ja_name, + color=color, + ) + + @classmethod + def put_semantic_segment_label( + cls, + en_name: str, + layer: int, + default_ignore: Optional[bool] = None, + label_id: str = "", + ja_name: str = "", + color: Optional[Tuple[int, int, int]] = None, + ) -> DataModifier[AnnotationSpecsV3]: + set_anno_type = LabelSpecifiers.annotation_type.set("user_semantic_segment") + set_layer = LabelSpecifiers.layer.set(layer) + + ignore_additional: Optional[IgnoreAdditionalDef] + ignore_id: Optional[str] + if default_ignore is None: + ignore_additional = None + ignore_id = None + else: + ignore_additional = default_ignore_additional if default_ignore else default_non_ignore_additional + ignore_id = ignore_additional.id + + set_ignore = LabelSpecifiers.ignore.set(ignore_id) + + return cls.put_label( + en_name=en_name, + mod_label_info=set_anno_type.and_then(set_layer).and_then(set_ignore), + ignore_additional=ignore_additional, + label_id=label_id, + ja_name=ja_name, + color=color, + ) + @classmethod def put_label( cls, en_name: str, - metadata: Union[CuboidLabelMetadata, SegmentLabelMetadata], + mod_label_info: DataModifier[LabelV3], ignore_additional: Optional[IgnoreAdditionalDef], label_id: str = "", ja_name: str = "", @@ -88,6 +172,7 @@ def init_label() -> LabelV3: lang_ja, ), keybind=[], + # 仕様拡張プラグインを使っている場合annotation_typeはmod_label_infoで上書きされるはず。 そうでなければそのまま annotation_type=DefaultAnnotationType.CUSTOM.value, field_values={}, additional_data_definitions=[], @@ -121,13 +206,16 @@ def mod(label_opt: Optional[LabelV3]) -> Optional[LabelV3]: ) )(label) - meta_dic: dict = metadata.to_dict(encode_json=True) - label.metadata = meta_dic + return mod_label_info(label) - return label + mod_additionals = ( + ProjectModifiers.create_ignore_additional_if_necessary(ignore_additional) + if ignore_additional is not None + else DataModifier.identity(AnnotationSpecsV3) + ) label_specifier = cls.specifiers.label(label_id) - return label_specifier.mod(mod) + return label_specifier.mod(mod).and_then(mod_additionals) @classmethod def create_ignore_additional_if_necessary( @@ -239,23 +327,49 @@ def put_cuboid_label( ja_name: str = "", color: Optional[Tuple[int, int, int]] = None, ) -> List[Label]: - return self.put_label(project_id, en_name, CuboidLabelMetadata(), None, label_id, ja_name, color) + mod_specs = ProjectModifiers.put_cuboid_label(en_name=en_name, label_id=label_id, ja_name=ja_name, color=color) + return self.put_label(project_id, mod_specs) def put_segment_label( self, project_id: str, en_name: str, - default_ignore: bool, - segment_kind: str, + default_ignore: Optional[bool], + segment_kind: Literal["SEMANTIC", "INSTANCE"], layer: int, ja_name: str = "", label_id: str = "", color: Optional[Tuple[int, int, int]] = None, ) -> List[Label]: - additional_def = default_ignore_additional if default_ignore else default_non_ignore_additional - metadata = SegmentLabelMetadata(ignore=additional_def.id, layer=str(layer), segment_kind=segment_kind) + """ - return self.put_label(project_id, en_name, metadata, additional_def, label_id, ja_name, color) + Args: + project_id: + en_name: + default_ignore: デフォルトで無視属性をOnにするかどうか。 基本的にNone。 仕様拡張プラグインを利用しない古い仕様との互換性のために残っている + segment_kind: + layer: + ja_name: + label_id: + color: ラベルの表示色。 "(R,G,B)"形式 R/G/Bは、それぞれ0〜255の整数値で指定する + + Returns: + + """ + if segment_kind == "SEMANTIC": + mod_specs_f = ProjectModifiers.put_semantic_segment_label + else: + mod_specs_f = ProjectModifiers.put_instance_segment_label + + mod_specs = mod_specs_f( + en_name=en_name, + layer=layer, + default_ignore=default_ignore, + label_id=label_id, + ja_name=ja_name, + color=color, + ) + return self.put_label(project_id, mod_specs) def get_annotation_specs(self, project_id: str) -> AnnotationSpecsV3: client = self._client @@ -276,45 +390,18 @@ def _from_annofab_label(annofab_label: afm.LabelV3) -> Label: annofab_label["label_id"], ja_name, en_name, (color["red"], color["green"], color["blue"]), metadata ) - def put_label( - self, - project_id: str, - en_name: str, - metadata: Union[CuboidLabelMetadata, SegmentLabelMetadata], - ignore_additional: Optional[IgnoreAdditionalDef], - label_id: str = "", - ja_name: str = "", - color: Optional[Tuple[int, int, int]] = None, - ) -> List[Label]: + def put_label(self, project_id: str, mod_specs: DataModifier[AnnotationSpecsV3]) -> List[Label]: """ Args: project_id: - label_id: - ja_name: - en_name: - color: ラベルの表示色。 "(R,G,B)"形式 R/G/Bは、それぞれ0〜255の整数値で指定する - metadata: - ignore_additional: Segmentの『無視』を属性にマッピングする場合はその無視属性のDef。 そうでなければNone + mod_specs: ラベル更新を行うアノテーション仕様の変更関数 - Returns: + Returns: 変更後のラベル一覧 """ - mod_labels = ProjectModifiers.put_label( - en_name, - metadata, - ignore_additional, - label_id, - ja_name, - color, - ) - mod_additionals = ( - ProjectModifiers.create_ignore_additional_if_necessary(ignore_additional) - if ignore_additional is not None - else DataModifier.identity(AnnotationSpecsV3) - ) - created_specs = self._mod_project_specs(project_id, mod_labels.and_then(mod_additionals)) + created_specs = self._mod_project_specs(project_id, mod_specs) if created_specs.labels is None: return [] diff --git a/anno3d/annofab/specifiers/label_specifiers.py b/anno3d/annofab/specifiers/label_specifiers.py index eafd8f3..c9a6bcd 100644 --- a/anno3d/annofab/specifiers/label_specifiers.py +++ b/anno3d/annofab/specifiers/label_specifiers.py @@ -1,14 +1,19 @@ +import copy from dataclasses import replace -from typing import Callable, Optional +from typing import Callable, Dict, Literal, Optional, cast from annofabapi.dataclass.annotation_specs import Color, LabelV3 from anno3d.annofab.specifiers.utils import GenList +from anno3d.model.label import SegmentLabelInfo from anno3d.util.modifier import DataSpecifier zero_color = Color(0, 0, 0) +AnnotationType = Literal["user_bounding_box", "user_semantic_segment", "user_instance_segment"] + + class LabelSpecifiers: label = DataSpecifier.identity(LabelV3) color = label.zoom( @@ -16,6 +21,129 @@ class LabelSpecifiers: lambda label, color: replace(label, color=color), ) + metadata: DataSpecifier[LabelV3, Dict[str, str]] = label.zoom( + lambda label: label.metadata if label.metadata is not None else {}, + lambda label, metadata: replace(label, metadata=metadata), + ) + + """ + 仕様拡張プラグイン前との互換性のため、以下の表現のメタデータを生成する定義群 + @camelcase + @dataclass(frozen=True) + class CuboidLabelMetadata(DataClassJsonMixin): + "" + LabelV3.metadataに3d-editor用情報を埋め込む場合に利用する型 + 互換性用に残してある型なので、拡張しないこと + Cuboid用 + "" + + type: str = "CUBOID" + + + @camelcase + @dataclass(frozen=True) + class SegmentLabelMetadata(DataClassJsonMixin): + "" + LabelV3.metadataに3d-editor用情報を埋め込む場合に利用する型 + 互換性用に残してある型なので、拡張しないこと + Segment用 + Args: + ignore: ignore設定に利用するAdditionalDataのid + layer: レイヤーを表す数値文字列 + segment_kind: "SEMANTIC" | "INSTANCE" + type: "SEGMENT" 固定 + "" + + ignore: str + layer: str = "100" + segment_kind: str = "SEMANTIC" + type: str = "SEGMENT" + version: str = "1" + """ + + @staticmethod + def zoom_in_segment_info(meta: Dict[str, str]) -> SegmentLabelInfo: + return SegmentLabelInfo(ignore=meta["ignore"], layer=int(meta["layer"])) + + @staticmethod + def zoom_out_segment_info(meta: Dict[str, str], info: SegmentLabelInfo) -> Dict[str, str]: + result = copy.deepcopy(meta) + + if info.ignore is None: + result.pop("ignore", None) + else: + result["ignore"] = info.ignore + + result["layer"] = str(info.layer) + return result + + @staticmethod + def zoom_in_segment_kind(meta: Dict[str, str]) -> Literal["SEMANTIC", "INSTANCE"]: + return cast(Literal["SEMANTIC", "INSTANCE"], meta["segmentKind"]) + + @staticmethod + def zoom_out_segment_kind(meta: Dict[str, str], kind: Literal["SEMANTIC", "INSTANCE"]) -> Dict[str, str]: + result = copy.deepcopy(meta) + result["segmentKind"] = kind + return result + + @staticmethod + def zoom_in_annotation_type(meta: Dict[str, str]) -> AnnotationType: + label_type = meta.get("type", None) + if label_type == "SEGMENT": + seg_kind = meta.get("segmentKind", None) + if seg_kind == "SEMANTIC": + return "user_semantic_segment" + elif seg_kind == "INSTANCE": + return "user_instance_segment" + else: + raise RuntimeError(f'label.metadata["segmentKind"]が想定外の値(={label_type})です。') + else: + # "type"が無い場合は、Cuboidしかなかった最初期の仕様のはず + return "user_bounding_box" + + @staticmethod + def zoom_out_annotation_type(meta: Dict[str, str], anno_type: AnnotationType) -> Dict[str, str]: + def init_segment_result(base: Dict[str, str]) -> Dict[str, str]: + init = copy.deepcopy(base) + init["version"] = "1" + init["type"] = "SEGMENT" + return init + + if anno_type == "user_bounding_box": + return {"type": "CUBOID"} + elif anno_type == "user_semantic_segment": + result = init_segment_result(meta) + result["segmentKind"] = "SEMANTIC" + return result + elif anno_type == "user_instance_segment": + result = init_segment_result(meta) + result["segmentKind"] = "INSTANCE" + return result + else: + raise RuntimeError(f"anno_typeが想定外の値(={anno_type})です。") + + @staticmethod + def zoom_in_ignore(meta: Dict[str, str]) -> Optional[str]: + return meta.get("ignore", None) + + @staticmethod + def zoom_out_ignore(meta: Dict[str, str], ignore: Optional[str]) -> Dict[str, str]: + result = copy.deepcopy(meta) + if ignore is None: + result.pop("ignore", None) + else: + result["ignore"] = ignore + + return result + + annotation_type = metadata.zoom(zoom_in_annotation_type, zoom_out_annotation_type) + segment_kind = metadata.zoom(zoom_in_segment_kind, zoom_out_segment_kind) + ignore = metadata.zoom(zoom_in_ignore, zoom_out_ignore) + segment_info: DataSpecifier[LabelV3, SegmentLabelInfo] = metadata.zoom(zoom_in_segment_info, zoom_out_segment_info) + + layer = segment_info.zoom(lambda meta: meta.layer, lambda meta, layer: replace(meta, layer=layer)) + additionals = label.zoom( lambda label: label.additional_data_definitions if label.additional_data_definitions is not None else [], lambda label, additionals: replace(label, additional_data_definitions=additionals), diff --git a/anno3d/app.py b/anno3d/app.py index 6a6578f..a461e90 100644 --- a/anno3d/app.py +++ b/anno3d/app.py @@ -4,7 +4,7 @@ import sys from enum import Enum from pathlib import Path -from typing import Any, List, Literal, Optional, Tuple, Type, TypeVar +from typing import Any, List, Literal, Optional, Tuple, Type, TypeVar, cast import boto3 import fire @@ -226,6 +226,7 @@ def put_segment_label( raise RuntimeError( f"segment_typeの値は、{segment_type_semantic} もしくは {segment_type_instance} でなければなりませんが、 {segment_type} でした" ) + safe_segment_type = cast(Literal["SEMANTIC", "INSTANCE"], segment_type) if layer < 0: raise RuntimeError(f"layerは、0以上の整数である必要がありますが、{layer} でした") @@ -235,7 +236,7 @@ def put_segment_label( project_id, en_name, default_ignore, - segment_kind=segment_type, + segment_kind=safe_segment_type, layer=layer, label_id=label_id, ja_name=ja_name, diff --git a/anno3d/model/label.py b/anno3d/model/label.py index a8c1127..8ab8395 100644 --- a/anno3d/model/label.py +++ b/anno3d/model/label.py @@ -1,4 +1,5 @@ from dataclasses import dataclass +from typing import Optional from dataclasses_json import DataClassJsonMixin @@ -7,23 +8,20 @@ @camelcase @dataclass(frozen=True) -class CuboidLabelMetadata(DataClassJsonMixin): - type: str = "CUBOID" +class CuboidLabelInfo(DataClassJsonMixin): + """アノテーション仕様のうちCuboid用の部分。 現状存在しないので空""" @camelcase @dataclass(frozen=True) -class SegmentLabelMetadata(DataClassJsonMixin): +class SegmentLabelInfo(DataClassJsonMixin): """ + アノテーション仕様のうちSegment用部分 + Args: - ignore: ignore設定に利用するAdditionalDataのid - layer: レイヤーを表す数値文字列 - segment_kind: "SEMANTIC" | "INSTANCE" - type: "SEGMENT" 固定 + ignore: ignore設定に利用するAdditionalDataのid。 通常None。 仕様拡張プラグインを利用しない、古い仕様の場合のみSome + layer: レイヤーを表す数値。 0以上の整数 """ - ignore: str - layer: str = "100" - segment_kind: str = "SEMANTIC" - type: str = "SEGMENT" - version: str = "1" + ignore: Optional[str] = None + layer: int = 100 From 9286a2364babae7e856086a949d56b45b909826e Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Mon, 7 Nov 2022 04:57:52 +0900 Subject: [PATCH 09/25] =?UTF-8?q?=E6=8B=A1=E5=BC=B5=E4=BB=95=E6=A7=98?= =?UTF-8?q?=E3=83=97=E3=83=A9=E3=82=B0=E3=82=A4=E3=83=B3=E5=AF=BE=E5=BF=9C?= =?UTF-8?q?=E3=81=AE=E6=BA=96=E5=82=99=E3=81=AE=E3=81=9F=E3=82=81=E3=80=81?= =?UTF-8?q?LabelSpecification=20/=20ProjectModifier=E3=82=92=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=82=B9=E3=82=BF=E3=83=B3=E3=82=B9=E5=8C=96=E3=81=97?= =?UTF-8?q?=E3=81=A6=E5=88=A9=E7=94=A8=E3=81=99=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/project.py | 67 ++++++++----- anno3d/annofab/specifiers/label_specifiers.py | 94 +++++++++++++------ 2 files changed, 107 insertions(+), 54 deletions(-) diff --git a/anno3d/annofab/project.py b/anno3d/annofab/project.py index f59cedc..44db9da 100644 --- a/anno3d/annofab/project.py +++ b/anno3d/annofab/project.py @@ -35,6 +35,9 @@ class ProjectModifiers: + def __init__(self, label_specifiers: LabelSpecifiers): + self._label_specifiers = label_specifiers + specifiers = ProjectSpecifiers @classmethod @@ -66,17 +69,16 @@ def update(sizes: PresetCuboidSizes) -> PresetCuboidSizes: return cls.specifiers.preset_cuboid_sizes.mod(update) - @classmethod def put_cuboid_label( - cls, + self, en_name: str, label_id: str = "", ja_name: str = "", color: Optional[Tuple[int, int, int]] = None, ) -> DataModifier[AnnotationSpecsV3]: - set_anno_type = LabelSpecifiers.annotation_type.set("user_bounding_box") + set_anno_type = self._label_specifiers.annotation_type.set("user_bounding_box") - return cls.put_label( + return self.put_label( en_name=en_name, mod_label_info=set_anno_type, ignore_additional=None, @@ -85,9 +87,8 @@ def put_cuboid_label( color=color, ) - @classmethod def put_instance_segment_label( - cls, + self, en_name: str, layer: int, default_ignore: Optional[bool] = None, @@ -95,8 +96,8 @@ def put_instance_segment_label( ja_name: str = "", color: Optional[Tuple[int, int, int]] = None, ) -> DataModifier[AnnotationSpecsV3]: - set_anno_type = LabelSpecifiers.annotation_type.set("user_instance_segment") - set_layer = LabelSpecifiers.layer.set(layer) + set_anno_type = self._label_specifiers.annotation_type.set("user_instance_segment") + set_layer = self._label_specifiers.layer.set(layer) ignore_additional: Optional[IgnoreAdditionalDef] ignore_id: Optional[str] @@ -107,9 +108,9 @@ def put_instance_segment_label( ignore_additional = default_ignore_additional if default_ignore else default_non_ignore_additional ignore_id = ignore_additional.id - set_ignore = LabelSpecifiers.ignore.set(ignore_id) + set_ignore = self._label_specifiers.ignore.set(ignore_id) - return cls.put_label( + return self.put_label( en_name=en_name, mod_label_info=set_anno_type.and_then(set_layer).and_then(set_ignore), ignore_additional=ignore_additional, @@ -118,9 +119,8 @@ def put_instance_segment_label( color=color, ) - @classmethod def put_semantic_segment_label( - cls, + self, en_name: str, layer: int, default_ignore: Optional[bool] = None, @@ -128,8 +128,8 @@ def put_semantic_segment_label( ja_name: str = "", color: Optional[Tuple[int, int, int]] = None, ) -> DataModifier[AnnotationSpecsV3]: - set_anno_type = LabelSpecifiers.annotation_type.set("user_semantic_segment") - set_layer = LabelSpecifiers.layer.set(layer) + set_anno_type = self._label_specifiers.annotation_type.set("user_semantic_segment") + set_layer = self._label_specifiers.layer.set(layer) ignore_additional: Optional[IgnoreAdditionalDef] ignore_id: Optional[str] @@ -140,9 +140,9 @@ def put_semantic_segment_label( ignore_additional = default_ignore_additional if default_ignore else default_non_ignore_additional ignore_id = ignore_additional.id - set_ignore = LabelSpecifiers.ignore.set(ignore_id) + set_ignore = self._label_specifiers.ignore.set(ignore_id) - return cls.put_label( + return self.put_label( en_name=en_name, mod_label_info=set_anno_type.and_then(set_layer).and_then(set_ignore), ignore_additional=ignore_additional, @@ -151,9 +151,8 @@ def put_semantic_segment_label( color=color, ) - @classmethod def put_label( - cls, + self, en_name: str, mod_label_info: DataModifier[LabelV3], ignore_additional: Optional[IgnoreAdditionalDef], @@ -191,14 +190,14 @@ def mod(label_opt: Optional[LabelV3]) -> Optional[LabelV3]: ) if ignore_additional is not None: - label = LabelSpecifiers.additional(ignore_additional.id).set(ignore_additional.id)(label) + label = self._label_specifiers.additional(ignore_additional.id).set(ignore_additional.id)(label) if color is not None: - label = LabelSpecifiers.color.set(Color(red=color[0], green=color[1], blue=color[2]))(label) + label = self._label_specifiers.color.set(Color(red=color[0], green=color[1], blue=color[2]))(label) else: # 明度彩度をMAXで固定しランダムに色を選ぶ random_color = colorsys.hsv_to_rgb(random.random(), 1, 1) - label = LabelSpecifiers.color.set( + label = self._label_specifiers.color.set( Color( red=round(255 * random_color[0]), green=round(255 * random_color[1]), @@ -209,12 +208,12 @@ def mod(label_opt: Optional[LabelV3]) -> Optional[LabelV3]: return mod_label_info(label) mod_additionals = ( - ProjectModifiers.create_ignore_additional_if_necessary(ignore_additional) + self.create_ignore_additional_if_necessary(ignore_additional) if ignore_additional is not None else DataModifier.identity(AnnotationSpecsV3) ) - label_specifier = cls.specifiers.label(label_id) + label_specifier = self.specifiers.label(label_id) return label_specifier.mod(mod).and_then(mod_additionals) @classmethod @@ -251,6 +250,19 @@ class ProjectApi: def __init__(self, client: AnnofabApi): self._client = client + # project_id -> ProjectModifiersの辞書 + self._modifiers_dic: Dict[str, ProjectModifiers] = {} + + def _project_modifiers(self, project_id: str) -> ProjectModifiers: + current = self._modifiers_dic.get(project_id, None) + if current is not None: + return current + + # TODO ここでspec取って、LabelSpecifiersを切り替えるようにする + new = ProjectModifiers(LabelSpecifiers()) + self._modifiers_dic[project_id] = new + return new + @staticmethod def _decode_project(project: afm.Project) -> Project: return Project.from_dict(project) @@ -327,7 +339,9 @@ def put_cuboid_label( ja_name: str = "", color: Optional[Tuple[int, int, int]] = None, ) -> List[Label]: - mod_specs = ProjectModifiers.put_cuboid_label(en_name=en_name, label_id=label_id, ja_name=ja_name, color=color) + mod_specs = self._project_modifiers(project_id).put_cuboid_label( + en_name=en_name, label_id=label_id, ja_name=ja_name, color=color + ) return self.put_label(project_id, mod_specs) def put_segment_label( @@ -356,10 +370,11 @@ def put_segment_label( Returns: """ + modifiers = self._project_modifiers(project_id) if segment_kind == "SEMANTIC": - mod_specs_f = ProjectModifiers.put_semantic_segment_label + mod_specs_f = modifiers.put_semantic_segment_label else: - mod_specs_f = ProjectModifiers.put_instance_segment_label + mod_specs_f = modifiers.put_instance_segment_label mod_specs = mod_specs_f( en_name=en_name, diff --git a/anno3d/annofab/specifiers/label_specifiers.py b/anno3d/annofab/specifiers/label_specifiers.py index c9a6bcd..aede4d9 100644 --- a/anno3d/annofab/specifiers/label_specifiers.py +++ b/anno3d/annofab/specifiers/label_specifiers.py @@ -1,6 +1,6 @@ import copy from dataclasses import replace -from typing import Callable, Dict, Literal, Optional, cast +from typing import Callable, Dict, List, Literal, Optional, TypeVar, cast from annofabapi.dataclass.annotation_specs import Color, LabelV3 @@ -12,21 +12,48 @@ AnnotationType = Literal["user_bounding_box", "user_semantic_segment", "user_instance_segment"] +SegmentKind = Literal["SEMANTIC", "INSTANCE"] +T = TypeVar("T") +LabelSpecifier = DataSpecifier[LabelV3, T] class LabelSpecifiers: - label = DataSpecifier.identity(LabelV3) - color = label.zoom( - lambda label: label.color if label.color is not None else zero_color, - lambda label, color: replace(label, color=color), - ) - - metadata: DataSpecifier[LabelV3, Dict[str, str]] = label.zoom( - lambda label: label.metadata if label.metadata is not None else {}, - lambda label, metadata: replace(label, metadata=metadata), - ) - - """ + def __init__(self): + self._label = DataSpecifier.identity(LabelV3) + self._color = self.label.zoom( + lambda label: label.color if label.color is not None else zero_color, + lambda label, color: replace(label, color=color), + ) + self._additionals = self._label.zoom( + lambda label: label.additional_data_definitions if label.additional_data_definitions is not None else [], + lambda label, additionals: replace(label, additional_data_definitions=additionals), + ) + self._metadata = self.label.zoom( + lambda label: label.metadata if label.metadata is not None else {}, + lambda label, metadata: replace(label, metadata=metadata), + ) + + c = LabelSpecifiers + self._annotation_type = self.metadata.zoom(c.zoom_in_annotation_type, c.zoom_out_annotation_type) + self._segment_kind = self.metadata.zoom(c.zoom_in_segment_kind, c.zoom_out_segment_kind) + self._ignore = self._metadata.zoom(c.zoom_in_ignore, c.zoom_out_ignore) + self._segment_info = self.metadata.zoom(c.zoom_in_segment_info, c.zoom_out_segment_info) + + self._layer = self._segment_info.zoom(lambda meta: meta.layer, lambda meta, layer: replace(meta, layer=layer)) + + @property + def label(self) -> LabelSpecifier[LabelV3]: + return self._label + + @property + def color(self) -> LabelSpecifier[Color]: + return self._color + + @property + def metadata(self) -> LabelSpecifier[Dict[str, str]]: + return self._metadata + + __comment = """ 仕様拡張プラグイン前との互換性のため、以下の表現のメタデータを生成する定義群 @camelcase @dataclass(frozen=True) @@ -78,11 +105,11 @@ def zoom_out_segment_info(meta: Dict[str, str], info: SegmentLabelInfo) -> Dict[ return result @staticmethod - def zoom_in_segment_kind(meta: Dict[str, str]) -> Literal["SEMANTIC", "INSTANCE"]: - return cast(Literal["SEMANTIC", "INSTANCE"], meta["segmentKind"]) + def zoom_in_segment_kind(meta: Dict[str, str]) -> SegmentKind: + return cast(SegmentKind, meta["segmentKind"]) @staticmethod - def zoom_out_segment_kind(meta: Dict[str, str], kind: Literal["SEMANTIC", "INSTANCE"]) -> Dict[str, str]: + def zoom_out_segment_kind(meta: Dict[str, str], kind: SegmentKind) -> Dict[str, str]: result = copy.deepcopy(meta) result["segmentKind"] = kind return result @@ -137,19 +164,30 @@ def zoom_out_ignore(meta: Dict[str, str], ignore: Optional[str]) -> Dict[str, st return result - annotation_type = metadata.zoom(zoom_in_annotation_type, zoom_out_annotation_type) - segment_kind = metadata.zoom(zoom_in_segment_kind, zoom_out_segment_kind) - ignore = metadata.zoom(zoom_in_ignore, zoom_out_ignore) - segment_info: DataSpecifier[LabelV3, SegmentLabelInfo] = metadata.zoom(zoom_in_segment_info, zoom_out_segment_info) + @property + def annotation_type(self) -> LabelSpecifier[AnnotationType]: + return self._annotation_type + + @property + def segment_kind(self) -> LabelSpecifier[SegmentKind]: + return self._segment_kind + + @property + def ignore(self) -> LabelSpecifier[Optional[str]]: + return self._ignore + + @property + def segment_info(self) -> LabelSpecifier[SegmentLabelInfo]: + return self._segment_info - layer = segment_info.zoom(lambda meta: meta.layer, lambda meta, layer: replace(meta, layer=layer)) + @property + def layer(self) -> LabelSpecifier[int]: + return self._layer - additionals = label.zoom( - lambda label: label.additional_data_definitions if label.additional_data_definitions is not None else [], - lambda label, additionals: replace(label, additional_data_definitions=additionals), - ) + @property + def additionals(self) -> LabelSpecifier[List[str]]: + return self._additionals - @classmethod - def additional(cls, additional_id: str) -> DataSpecifier[LabelV3, Optional[str]]: + def additional(self, additional_id: str) -> DataSpecifier[LabelV3, Optional[str]]: predicate: Callable[[str], bool] = lambda additional: additional == additional_id - return cls.additionals.zoom(GenList.gen_zoom_in(predicate), GenList.gen_zoom_out(predicate)) + return self.additionals.zoom(GenList.gen_zoom_in(predicate), GenList.gen_zoom_out(predicate)) From fafc9c74ac10c87218a1e26a9ee066f3b3fb2c67 Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Mon, 7 Nov 2022 05:29:57 +0900 Subject: [PATCH 10/25] =?UTF-8?q?metadata=E3=81=ABignore=20/=20layer?= =?UTF-8?q?=E3=81=8C=E5=AD=98=E5=9C=A8=E3=81=97=E3=81=AA=E3=81=84=E6=99=82?= =?UTF-8?q?=E3=81=AB=E3=82=A8=E3=83=A9=E3=83=BC=E3=81=AB=E3=81=AA=E3=82=8B?= =?UTF-8?q?=E3=81=AE=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/specifiers/label_specifiers.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/anno3d/annofab/specifiers/label_specifiers.py b/anno3d/annofab/specifiers/label_specifiers.py index aede4d9..7f521b8 100644 --- a/anno3d/annofab/specifiers/label_specifiers.py +++ b/anno3d/annofab/specifiers/label_specifiers.py @@ -90,7 +90,10 @@ class SegmentLabelMetadata(DataClassJsonMixin): @staticmethod def zoom_in_segment_info(meta: Dict[str, str]) -> SegmentLabelInfo: - return SegmentLabelInfo(ignore=meta["ignore"], layer=int(meta["layer"])) + default = SegmentLabelInfo() + ignore = meta.get("ignore", default.ignore) + layer = int(meta.get("layer", str(default.layer))) + return SegmentLabelInfo(ignore=ignore, layer=layer) @staticmethod def zoom_out_segment_info(meta: Dict[str, str], info: SegmentLabelInfo) -> Dict[str, str]: From 85bcfc77c367f7b523086a5936f67d0230637fba Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Mon, 7 Nov 2022 07:18:51 +0900 Subject: [PATCH 11/25] =?UTF-8?q?=E6=84=8F=E5=9B=B3=E3=81=97=E3=81=9FJson?= =?UTF-8?q?=E3=81=B8=E3=81=AE=E3=82=A8=E3=83=B3=E3=82=B3=E3=83=BC=E3=83=89?= =?UTF-8?q?=E3=81=8C=E8=A1=8C=E3=82=8F=E3=82=8C=E3=81=9A=E3=80=81=E3=82=A2?= =?UTF-8?q?=E3=83=8E=E3=83=86=E3=83=BC=E3=82=B7=E3=83=A7=E3=83=B3=E3=81=AE?= =?UTF-8?q?=E7=99=BB=E9=8C=B2=E3=81=8C=E5=87=BA=E6=9D=A5=E3=81=AA=E3=81=8F?= =?UTF-8?q?=E3=81=AA=E3=81=A3=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/model.py | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/anno3d/annofab/model.py b/anno3d/annofab/model.py index 507605e..0af61e6 100644 --- a/anno3d/annofab/model.py +++ b/anno3d/annofab/model.py @@ -94,18 +94,29 @@ def __init__(self, cls: typing.Type, **additional_metadata) -> None: super().__init__(**additional_metadata) self._type = cls - def _serialize(self, value: typing.Any, attr: Union[str, None], obj: typing.Any, **kwargs) -> str: + def encode(self, value: typing.Any) -> str: return typing.cast(str, value.to_json(ensure_ascii=False)) + def _serialize(self, value: typing.Any, attr: Union[str, None], obj: typing.Any, **kwargs) -> str: + return self.encode(value) + + def decode(self, value: str) -> typing.Any: + return self._type.from_json(value) + def _deserialize( self, value: str, attr: Union[str, None], data: Union[typing.Mapping[str, typing.Any], None], **kwargs ) -> typing.Any: - return self._type.from_json(str) + return self.decode(value) + + +cuboid_data_field = UnknownDataField(CuboidAnnotationDetailData) @dataclass class CuboidFullAnnotationData(DataClassJsonMixin): - data: CuboidAnnotationDetailData = field(metadata=config(mm_field=UnknownDataField(CuboidAnnotationDetailData))) + data: CuboidAnnotationDetailData = field( + metadata=config(mm_field=cuboid_data_field, encoder=cuboid_data_field.encode, decoder=cuboid_data_field.decode) + ) _type: str = "Unknown" @@ -138,6 +149,7 @@ class CuboidAnnotationDetailCreate(DataClassJsonMixin): label_id: str body: CuboidAnnotationDetailBody editor_props: AnnotationPropsForEditor + additional_data_list: list = field(default_factory=list) # 型を定義してないので空を前提としておく _type: str = "Create" @@ -149,7 +161,6 @@ class CuboidAnnotations(DataClassJsonMixin): task_id: str input_data_id: str details: List[CuboidAnnotationDetailCreate] - additional_data_list: list = field(default_factory=list) # 型を定義してないので空を前提としておく format_version: str = "2.0.0" From 6942e825a26a9a480e56cd5ebd3f38ba942d670a Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Tue, 8 Nov 2022 00:29:34 +0900 Subject: [PATCH 12/25] =?UTF-8?q?debug=E3=83=97=E3=83=AA=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=8C=E6=AE=8B=E3=81=A3=E3=81=A6=E3=81=84=E3=81=9F=E3=81=AE?= =?UTF-8?q?=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/project.py | 1 - 1 file changed, 1 deletion(-) diff --git a/anno3d/annofab/project.py b/anno3d/annofab/project.py index 44db9da..8111f32 100644 --- a/anno3d/annofab/project.py +++ b/anno3d/annofab/project.py @@ -327,7 +327,6 @@ def _mod_project_specs( new_specs = mod_func(specs) request = AnnotationSpecsRequestV3.from_specs(new_specs) - print(request.to_json(ensure_ascii=False, indent=2)) created_specs, _ = client.put_annotation_specs(project_id, {"v": "3"}, request.to_dict(encode_json=True)) return AnnotationSpecsV3.from_dict(created_specs) From 1362b44d8adee48770e4b45bf63cc0d36c0975cc Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Tue, 8 Nov 2022 04:25:15 +0900 Subject: [PATCH 13/25] =?UTF-8?q?LabelSpecifiers=E3=82=92=E3=80=81?= =?UTF-8?q?=E6=8A=BD=E8=B1=A1=E5=9F=BA=E5=BA=95=E3=82=AF=E3=83=A9=E3=82=B9?= =?UTF-8?q?=E3=81=A8=E3=81=9D=E3=82=8C=E3=82=92=E7=B6=99=E6=89=BF=E3=81=99?= =?UTF-8?q?=E3=82=8BMetadataLabelSpecifiers=E3=81=AB=E5=88=86=E9=9B=A2?= =?UTF-8?q?=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/project.py | 3 +- anno3d/annofab/specifiers/label_specifiers.py | 187 ++++++------------ .../specifiers/metadata_label_specifiers.py | 132 +++++++++++++ 3 files changed, 190 insertions(+), 132 deletions(-) create mode 100644 anno3d/annofab/specifiers/metadata_label_specifiers.py diff --git a/anno3d/annofab/project.py b/anno3d/annofab/project.py index 8111f32..9c2ddb1 100644 --- a/anno3d/annofab/project.py +++ b/anno3d/annofab/project.py @@ -27,6 +27,7 @@ ) from anno3d.annofab.model import AnnotationSpecsRequestV3, Label from anno3d.annofab.specifiers.label_specifiers import LabelSpecifiers +from anno3d.annofab.specifiers.metadata_label_specifiers import MetadataLabelSpecifiers from anno3d.annofab.specifiers.project_specifiers import ProjectSpecifiers from anno3d.model.annotation_area import AnnotationArea from anno3d.model.preset_cuboids import PresetCuboidSize, PresetCuboidSizes, preset_cuboid_size_metadata_prefix @@ -259,7 +260,7 @@ def _project_modifiers(self, project_id: str) -> ProjectModifiers: return current # TODO ここでspec取って、LabelSpecifiersを切り替えるようにする - new = ProjectModifiers(LabelSpecifiers()) + new = ProjectModifiers(MetadataLabelSpecifiers()) self._modifiers_dic[project_id] = new return new diff --git a/anno3d/annofab/specifiers/label_specifiers.py b/anno3d/annofab/specifiers/label_specifiers.py index 7f521b8..9d9bd91 100644 --- a/anno3d/annofab/specifiers/label_specifiers.py +++ b/anno3d/annofab/specifiers/label_specifiers.py @@ -1,6 +1,6 @@ -import copy +from abc import ABC, abstractmethod from dataclasses import replace -from typing import Callable, Dict, List, Literal, Optional, TypeVar, cast +from typing import Callable, Dict, List, Literal, Optional, TypeVar from annofabapi.dataclass.annotation_specs import Color, LabelV3 @@ -17,8 +17,9 @@ LabelSpecifier = DataSpecifier[LabelV3, T] -class LabelSpecifiers: +class LabelSpecifiers(ABC): def __init__(self): + super().__init__() self._label = DataSpecifier.identity(LabelV3) self._color = self.label.zoom( lambda label: label.color if label.color is not None else zero_color, @@ -28,19 +29,57 @@ def __init__(self): lambda label: label.additional_data_definitions if label.additional_data_definitions is not None else [], lambda label, additionals: replace(label, additional_data_definitions=additionals), ) - self._metadata = self.label.zoom( + self._metadata = self._label.zoom( lambda label: label.metadata if label.metadata is not None else {}, lambda label, metadata: replace(label, metadata=metadata), ) - c = LabelSpecifiers - self._annotation_type = self.metadata.zoom(c.zoom_in_annotation_type, c.zoom_out_annotation_type) - self._segment_kind = self.metadata.zoom(c.zoom_in_segment_kind, c.zoom_out_segment_kind) - self._ignore = self._metadata.zoom(c.zoom_in_ignore, c.zoom_out_ignore) - self._segment_info = self.metadata.zoom(c.zoom_in_segment_info, c.zoom_out_segment_info) - + self._annotation_type = self._label.zoom(self._zoom_in_annotation_type, self._zoom_out_annotation_type) + self._segment_kind = self._label.zoom(self._zoom_in_segment_kind, self._zoom_out_segment_kind) + self._ignore = self._label.zoom(self._zoom_in_ignore, self._zoom_out_ignore) + self._segment_info = self._label.zoom(self._zoom_in_segment_info, self._zoom_out_segment_info) self._layer = self._segment_info.zoom(lambda meta: meta.layer, lambda meta, layer: replace(meta, layer=layer)) + # ============================== + # abstract method群 ここから + # ============================== + + @abstractmethod + def _zoom_in_segment_info(self, label: LabelV3) -> SegmentLabelInfo: + pass + + @abstractmethod + def _zoom_out_segment_info(self, label: LabelV3, info: SegmentLabelInfo) -> LabelV3: + pass + + @abstractmethod + def _zoom_in_segment_kind(self, label: LabelV3) -> SegmentKind: + pass + + @abstractmethod + def _zoom_out_segment_kind(self, label: LabelV3, kind: SegmentKind) -> LabelV3: + pass + + @abstractmethod + def _zoom_in_annotation_type(self, label: LabelV3) -> AnnotationType: + pass + + @abstractmethod + def _zoom_out_annotation_type(self, label: LabelV3, anno_type: AnnotationType) -> LabelV3: + pass + + @abstractmethod + def _zoom_in_ignore(self, label: LabelV3) -> Optional[str]: + pass + + @abstractmethod + def _zoom_out_ignore(self, label: LabelV3, ignore: Optional[str]) -> LabelV3: + pass + + # ============================== + # abstract method群 ここまで + # ============================== + @property def label(self) -> LabelSpecifier[LabelV3]: return self._label @@ -53,119 +92,13 @@ def color(self) -> LabelSpecifier[Color]: def metadata(self) -> LabelSpecifier[Dict[str, str]]: return self._metadata - __comment = """ - 仕様拡張プラグイン前との互換性のため、以下の表現のメタデータを生成する定義群 - @camelcase - @dataclass(frozen=True) - class CuboidLabelMetadata(DataClassJsonMixin): - "" - LabelV3.metadataに3d-editor用情報を埋め込む場合に利用する型 - 互換性用に残してある型なので、拡張しないこと - Cuboid用 - "" - - type: str = "CUBOID" - - - @camelcase - @dataclass(frozen=True) - class SegmentLabelMetadata(DataClassJsonMixin): - "" - LabelV3.metadataに3d-editor用情報を埋め込む場合に利用する型 - 互換性用に残してある型なので、拡張しないこと - Segment用 - Args: - ignore: ignore設定に利用するAdditionalDataのid - layer: レイヤーを表す数値文字列 - segment_kind: "SEMANTIC" | "INSTANCE" - type: "SEGMENT" 固定 - "" - - ignore: str - layer: str = "100" - segment_kind: str = "SEMANTIC" - type: str = "SEGMENT" - version: str = "1" - """ - - @staticmethod - def zoom_in_segment_info(meta: Dict[str, str]) -> SegmentLabelInfo: - default = SegmentLabelInfo() - ignore = meta.get("ignore", default.ignore) - layer = int(meta.get("layer", str(default.layer))) - return SegmentLabelInfo(ignore=ignore, layer=layer) - - @staticmethod - def zoom_out_segment_info(meta: Dict[str, str], info: SegmentLabelInfo) -> Dict[str, str]: - result = copy.deepcopy(meta) - - if info.ignore is None: - result.pop("ignore", None) - else: - result["ignore"] = info.ignore - - result["layer"] = str(info.layer) - return result - - @staticmethod - def zoom_in_segment_kind(meta: Dict[str, str]) -> SegmentKind: - return cast(SegmentKind, meta["segmentKind"]) - - @staticmethod - def zoom_out_segment_kind(meta: Dict[str, str], kind: SegmentKind) -> Dict[str, str]: - result = copy.deepcopy(meta) - result["segmentKind"] = kind - return result - - @staticmethod - def zoom_in_annotation_type(meta: Dict[str, str]) -> AnnotationType: - label_type = meta.get("type", None) - if label_type == "SEGMENT": - seg_kind = meta.get("segmentKind", None) - if seg_kind == "SEMANTIC": - return "user_semantic_segment" - elif seg_kind == "INSTANCE": - return "user_instance_segment" - else: - raise RuntimeError(f'label.metadata["segmentKind"]が想定外の値(={label_type})です。') - else: - # "type"が無い場合は、Cuboidしかなかった最初期の仕様のはず - return "user_bounding_box" - - @staticmethod - def zoom_out_annotation_type(meta: Dict[str, str], anno_type: AnnotationType) -> Dict[str, str]: - def init_segment_result(base: Dict[str, str]) -> Dict[str, str]: - init = copy.deepcopy(base) - init["version"] = "1" - init["type"] = "SEGMENT" - return init - - if anno_type == "user_bounding_box": - return {"type": "CUBOID"} - elif anno_type == "user_semantic_segment": - result = init_segment_result(meta) - result["segmentKind"] = "SEMANTIC" - return result - elif anno_type == "user_instance_segment": - result = init_segment_result(meta) - result["segmentKind"] = "INSTANCE" - return result - else: - raise RuntimeError(f"anno_typeが想定外の値(={anno_type})です。") - - @staticmethod - def zoom_in_ignore(meta: Dict[str, str]) -> Optional[str]: - return meta.get("ignore", None) - - @staticmethod - def zoom_out_ignore(meta: Dict[str, str], ignore: Optional[str]) -> Dict[str, str]: - result = copy.deepcopy(meta) - if ignore is None: - result.pop("ignore", None) - else: - result["ignore"] = ignore - - return result + @property + def additionals(self) -> LabelSpecifier[List[str]]: + return self._additionals + + def additional(self, additional_id: str) -> DataSpecifier[LabelV3, Optional[str]]: + predicate: Callable[[str], bool] = lambda additional: additional == additional_id + return self.additionals.zoom(GenList.gen_zoom_in(predicate), GenList.gen_zoom_out(predicate)) @property def annotation_type(self) -> LabelSpecifier[AnnotationType]: @@ -186,11 +119,3 @@ def segment_info(self) -> LabelSpecifier[SegmentLabelInfo]: @property def layer(self) -> LabelSpecifier[int]: return self._layer - - @property - def additionals(self) -> LabelSpecifier[List[str]]: - return self._additionals - - def additional(self, additional_id: str) -> DataSpecifier[LabelV3, Optional[str]]: - predicate: Callable[[str], bool] = lambda additional: additional == additional_id - return self.additionals.zoom(GenList.gen_zoom_in(predicate), GenList.gen_zoom_out(predicate)) diff --git a/anno3d/annofab/specifiers/metadata_label_specifiers.py b/anno3d/annofab/specifiers/metadata_label_specifiers.py new file mode 100644 index 0000000..8c881e7 --- /dev/null +++ b/anno3d/annofab/specifiers/metadata_label_specifiers.py @@ -0,0 +1,132 @@ +import copy +from dataclasses import replace +from typing import Dict, Optional, cast + +from annofabapi.dataclass.annotation_specs import LabelV3 + +from anno3d.annofab.specifiers.label_specifiers import AnnotationType, LabelSpecifiers, SegmentKind +from anno3d.model.label import SegmentLabelInfo + + +class MetadataLabelSpecifiers(LabelSpecifiers): + """ + 仕様拡張プラグイン適用前の、Metadataにラベルの情報を埋め込んでいる仕様のための LabelSpecifiers実装 + 以下のコードで表現されるメタデータを編集する機能をLabelSpecifiersに注入する + + @camelcase + @dataclass(frozen=True) + class CuboidLabelMetadata(DataClassJsonMixin): + "" + LabelV3.metadataに3d-editor用情報を埋め込む場合に利用する型 + 互換性用に残してある型なので、拡張しないこと + Cuboid用 + "" + + type: str = "CUBOID" + + + @camelcase + @dataclass(frozen=True) + class SegmentLabelMetadata(DataClassJsonMixin): + "" + LabelV3.metadataに3d-editor用情報を埋め込む場合に利用する型 + 互換性用に残してある型なので、拡張しないこと + Segment用 + Args: + ignore: ignore設定に利用するAdditionalDataのid + layer: レイヤーを表す数値文字列 + segment_kind: "SEMANTIC" | "INSTANCE" + type: "SEGMENT" 固定 + "" + + ignore: str + layer: str = "100" + segment_kind: str = "SEMANTIC" + type: str = "SEGMENT" + version: str = "1" + """ + + def __init__(self): + super().__init__() + + def _get_metadata(self, label: LabelV3) -> Dict[str, str]: + return self.metadata.get(label) + + def _zoom_in_segment_info(self, label: LabelV3) -> SegmentLabelInfo: + default = SegmentLabelInfo() + meta = self._get_metadata(label) + ignore = meta.get("ignore", default.ignore) + layer = int(meta.get("layer", str(default.layer))) + return SegmentLabelInfo(ignore=ignore, layer=layer) + + def _zoom_out_segment_info(self, label: LabelV3, info: SegmentLabelInfo) -> LabelV3: + meta = self._get_metadata(label) + result = copy.deepcopy(meta) + + if info.ignore is None: + result.pop("ignore", None) + else: + result["ignore"] = info.ignore + + result["layer"] = str(info.layer) + return replace(label, metadata=result) + + def _zoom_in_segment_kind(self, label: LabelV3) -> SegmentKind: + meta = self._get_metadata(label) + return cast(SegmentKind, meta["segmentKind"]) + + def _zoom_out_segment_kind(self, label: LabelV3, kind: SegmentKind) -> LabelV3: + meta = self._get_metadata(label) + result = copy.deepcopy(meta) + result["segmentKind"] = kind + return replace(label, metadata=result) + + def _zoom_in_annotation_type(self, label: LabelV3) -> AnnotationType: + meta = self._get_metadata(label) + label_type = meta.get("type", None) + if label_type == "SEGMENT": + seg_kind = meta.get("segmentKind", None) + if seg_kind == "SEMANTIC": + return "user_semantic_segment" + elif seg_kind == "INSTANCE": + return "user_instance_segment" + else: + raise RuntimeError(f'label.metadata["segmentKind"]が想定外の値(={label_type})です。') + else: + # "type"が無い場合は、Cuboidしかなかった最初期の仕様のはず + return "user_bounding_box" + + def _zoom_out_annotation_type(self, label: LabelV3, anno_type: AnnotationType) -> LabelV3: + def init_segment_result(base: Dict[str, str]) -> Dict[str, str]: + init = copy.deepcopy(base) + init["version"] = "1" + init["type"] = "SEGMENT" + return init + + meta = self._get_metadata(label) + if anno_type == "user_bounding_box": + return replace(label, metadata={"type": "CUBOID"}) + elif anno_type == "user_semantic_segment": + result = init_segment_result(meta) + result["segmentKind"] = "SEMANTIC" + return replace(label, metadata=result) + elif anno_type == "user_instance_segment": + result = init_segment_result(meta) + result["segmentKind"] = "INSTANCE" + return replace(label, metadata=result) + else: + raise RuntimeError(f"anno_typeが想定外の値(={anno_type})です。") + + def _zoom_in_ignore(self, label: LabelV3) -> Optional[str]: + meta = self._get_metadata(label) + return meta.get("ignore", None) + + def _zoom_out_ignore(self, label: LabelV3, ignore: Optional[str]) -> LabelV3: + meta = self._get_metadata(label) + result = copy.deepcopy(meta) + if ignore is None: + result.pop("ignore", None) + else: + result["ignore"] = ignore + + return replace(label, metadata=result) From 5de0ebfa28afda39b889e904f481bfd99dd27fe1 Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Tue, 8 Nov 2022 05:28:11 +0900 Subject: [PATCH 14/25] =?UTF-8?q?=E6=9C=AA=E4=BD=BF=E7=94=A8=E3=81=AEDataS?= =?UTF-8?q?pecifier=20=5Fsegment=5Fkind=E3=82=92=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/specifiers/label_specifiers.py | 13 ------------- .../specifiers/metadata_label_specifiers.py | 14 ++------------ 2 files changed, 2 insertions(+), 25 deletions(-) diff --git a/anno3d/annofab/specifiers/label_specifiers.py b/anno3d/annofab/specifiers/label_specifiers.py index 9d9bd91..3e0ea34 100644 --- a/anno3d/annofab/specifiers/label_specifiers.py +++ b/anno3d/annofab/specifiers/label_specifiers.py @@ -35,7 +35,6 @@ def __init__(self): ) self._annotation_type = self._label.zoom(self._zoom_in_annotation_type, self._zoom_out_annotation_type) - self._segment_kind = self._label.zoom(self._zoom_in_segment_kind, self._zoom_out_segment_kind) self._ignore = self._label.zoom(self._zoom_in_ignore, self._zoom_out_ignore) self._segment_info = self._label.zoom(self._zoom_in_segment_info, self._zoom_out_segment_info) self._layer = self._segment_info.zoom(lambda meta: meta.layer, lambda meta, layer: replace(meta, layer=layer)) @@ -52,14 +51,6 @@ def _zoom_in_segment_info(self, label: LabelV3) -> SegmentLabelInfo: def _zoom_out_segment_info(self, label: LabelV3, info: SegmentLabelInfo) -> LabelV3: pass - @abstractmethod - def _zoom_in_segment_kind(self, label: LabelV3) -> SegmentKind: - pass - - @abstractmethod - def _zoom_out_segment_kind(self, label: LabelV3, kind: SegmentKind) -> LabelV3: - pass - @abstractmethod def _zoom_in_annotation_type(self, label: LabelV3) -> AnnotationType: pass @@ -104,10 +95,6 @@ def additional(self, additional_id: str) -> DataSpecifier[LabelV3, Optional[str] def annotation_type(self) -> LabelSpecifier[AnnotationType]: return self._annotation_type - @property - def segment_kind(self) -> LabelSpecifier[SegmentKind]: - return self._segment_kind - @property def ignore(self) -> LabelSpecifier[Optional[str]]: return self._ignore diff --git a/anno3d/annofab/specifiers/metadata_label_specifiers.py b/anno3d/annofab/specifiers/metadata_label_specifiers.py index 8c881e7..7dd4a48 100644 --- a/anno3d/annofab/specifiers/metadata_label_specifiers.py +++ b/anno3d/annofab/specifiers/metadata_label_specifiers.py @@ -1,10 +1,10 @@ import copy from dataclasses import replace -from typing import Dict, Optional, cast +from typing import Dict, Optional from annofabapi.dataclass.annotation_specs import LabelV3 -from anno3d.annofab.specifiers.label_specifiers import AnnotationType, LabelSpecifiers, SegmentKind +from anno3d.annofab.specifiers.label_specifiers import AnnotationType, LabelSpecifiers from anno3d.model.label import SegmentLabelInfo @@ -71,16 +71,6 @@ def _zoom_out_segment_info(self, label: LabelV3, info: SegmentLabelInfo) -> Labe result["layer"] = str(info.layer) return replace(label, metadata=result) - def _zoom_in_segment_kind(self, label: LabelV3) -> SegmentKind: - meta = self._get_metadata(label) - return cast(SegmentKind, meta["segmentKind"]) - - def _zoom_out_segment_kind(self, label: LabelV3, kind: SegmentKind) -> LabelV3: - meta = self._get_metadata(label) - result = copy.deepcopy(meta) - result["segmentKind"] = kind - return replace(label, metadata=result) - def _zoom_in_annotation_type(self, label: LabelV3) -> AnnotationType: meta = self._get_metadata(label) label_type = meta.get("type", None) From 508b28df78f4bf5fc3f84f801c5f04b294d33ade Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Tue, 8 Nov 2022 05:28:36 +0900 Subject: [PATCH 15/25] =?UTF-8?q?ExtendSpecsLabelSpecifiers=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/model.py | 4 + .../extend_specs_label_specifiers_v1.py | 76 +++++++++++++++++++ 2 files changed, 80 insertions(+) create mode 100644 anno3d/annofab/specifiers/extend_specs_label_specifiers_v1.py diff --git a/anno3d/annofab/model.py b/anno3d/annofab/model.py index 0af61e6..a1bb00b 100644 --- a/anno3d/annofab/model.py +++ b/anno3d/annofab/model.py @@ -187,6 +187,10 @@ class SegmentFieldValues(DataClassJsonMixin): layer: OneIntegerFieldValue """セグメントがどのレイヤーに所属するかを表す値。 0以上の整数値""" + @staticmethod + def from_values(layer: int) -> "SegmentFieldValues": + return SegmentFieldValues(OneIntegerFieldValue(layer)) + @dataclass class AnnotationSpecsRequestV3(DataClassJsonMixin): diff --git a/anno3d/annofab/specifiers/extend_specs_label_specifiers_v1.py b/anno3d/annofab/specifiers/extend_specs_label_specifiers_v1.py new file mode 100644 index 0000000..3b3ccaf --- /dev/null +++ b/anno3d/annofab/specifiers/extend_specs_label_specifiers_v1.py @@ -0,0 +1,76 @@ +from dataclasses import replace +from typing import Optional, cast + +from annofabapi.dataclass.annotation_specs import LabelV3 + +from anno3d.annofab.model import CuboidFieldValues, SegmentFieldValues +from anno3d.annofab.specifiers.label_specifiers import AnnotationType, LabelSpecifiers +from anno3d.model.label import SegmentLabelInfo + + +class ExtendSpecsLabelSpecifiers(LabelSpecifiers): + def __init__(self): + super().__init__() + + def zoom_in_segment_field_values(label: LabelV3) -> Optional[SegmentFieldValues]: + try: + return SegmentFieldValues.from_dict(label.field_values) + except: # noqa: E722 pylint: disable=bare-except + return None + + def zoom_out_segment_field_values(label: LabelV3, values: Optional[SegmentFieldValues]) -> LabelV3: + if values is not None: + return replace( + # encode_jsonがTrueの時、Valueを全てJsonに直接変換可能な型に変換しようとする + label, + field_values=values.to_dict(encode_json=True), + ) + else: + return label + + self._segment_field_values = self.label.zoom(zoom_in_segment_field_values, zoom_out_segment_field_values) + + def zoom_in_cuboid_field_values(label: LabelV3) -> Optional[CuboidFieldValues]: + try: + return CuboidFieldValues.from_dict(label.field_values) + except: # noqa: E722 pylint: disable=bare-except + return None + + def zoom_out_cuboid_field_values(label: LabelV3, values: Optional[CuboidFieldValues]) -> LabelV3: + if values is not None: + return replace( + # encode_jsonがTrueの時、Valueを全てJsonに直接変換可能な型に変換しようとする + label, + field_values=values.to_dict(encode_json=True), + ) + else: + return label + + self._cuboid_field_values = self.label.zoom( + zoom_in_cuboid_field_values, + zoom_out_cuboid_field_values, + ) + + def _zoom_in_segment_info(self, label: LabelV3) -> SegmentLabelInfo: + field_values = self._segment_field_values.get(label) + default = SegmentLabelInfo() + layer = field_values.layer.value if field_values is not None else default.layer + return SegmentLabelInfo(layer=layer, ignore=None) + + def _zoom_out_segment_info(self, label: LabelV3, info: SegmentLabelInfo) -> LabelV3: + values = SegmentFieldValues.from_values(info.layer) + return self._segment_field_values.set(values)(label) + + def _zoom_in_annotation_type(self, label: LabelV3) -> AnnotationType: + return cast(AnnotationType, label.annotation_type) + + def _zoom_out_annotation_type(self, label: LabelV3, anno_type: AnnotationType) -> LabelV3: + return replace(label, annotation_type=anno_type) + + def _zoom_in_ignore(self, label: LabelV3) -> Optional[str]: + # ignoreは廃止された + return None + + def _zoom_out_ignore(self, label: LabelV3, ignore: Optional[str]) -> LabelV3: + # ignoreは廃止された + return label From 55872d8d86c462bd345f1a6458d0bd4568ddf774 Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Tue, 8 Nov 2022 06:47:04 +0900 Subject: [PATCH 16/25] =?UTF-8?q?=E4=BB=95=E6=A7=98=E6=8B=A1=E5=BC=B5?= =?UTF-8?q?=E3=83=97=E3=83=A9=E3=82=B0=E3=82=A4=E3=83=B3=E3=81=AB=E3=82=88?= =?UTF-8?q?=E3=82=8B=E4=B8=89=E6=AC=A1=E5=85=83=E3=82=A8=E3=83=87=E3=82=A3?= =?UTF-8?q?=E3=82=BF=E3=83=97=E3=83=AD=E3=82=B8=E3=82=A7=E3=82=AF=E3=83=88?= =?UTF-8?q?=E3=82=92=E4=BD=9C=E6=88=90=E3=83=BB=E7=B7=A8=E9=9B=86=E5=87=BA?= =?UTF-8?q?=E6=9D=A5=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 新規にプロジェクトを作る場合、新仕様のプロジェクトが作成されるようにした * 編集時に編集対象プロジェクトが旧仕様プロジェクトだった場合、その状態を維持するようにした * put_segment_labelのdefault_ignoreを必須の引数からはずした --- anno3d/annofab/constant.py | 6 +++ anno3d/annofab/model.py | 2 + anno3d/annofab/project.py | 43 ++++++++++++++++--- ... => extended_specs_label_specifiers_v1.py} | 6 ++- anno3d/annofab/specifiers/label_specifiers.py | 8 ++++ .../specifiers/metadata_label_specifiers.py | 4 ++ anno3d/app.py | 20 ++++++--- 7 files changed, 76 insertions(+), 13 deletions(-) rename anno3d/annofab/specifiers/{extend_specs_label_specifiers_v1.py => extended_specs_label_specifiers_v1.py} (95%) diff --git a/anno3d/annofab/constant.py b/anno3d/annofab/constant.py index be9982e..c9259ca 100644 --- a/anno3d/annofab/constant.py +++ b/anno3d/annofab/constant.py @@ -17,3 +17,9 @@ class IgnoreAdditionalDef: default_ignore_additional = IgnoreAdditionalDef("__3dpc-editor-default-ignore", "無視", "ignore", True) default_non_ignore_additional = IgnoreAdditionalDef("__3dpc-editor-non-default-ignore", "無視", "ignore", False) + +# Annofabで定義されている標準三次元エディタプラグインのID(dev / production共通) +builtin_3d_editor_plugin_id = "bdc16348-107e-4fbc-af4a-e482bc84a60f" + +# Annofabで定義されている標準三次元エディタ用仕様拡張プラグインのID(dev / production共通) +builtin_3d_extend_specs_plugin_id = "703ababa-96ac-4920-8afb-d4f2bddac7e3" diff --git a/anno3d/annofab/model.py b/anno3d/annofab/model.py index a1bb00b..4a15743 100644 --- a/anno3d/annofab/model.py +++ b/anno3d/annofab/model.py @@ -200,6 +200,7 @@ class AnnotationSpecsRequestV3(DataClassJsonMixin): inspection_phrases: List[InspectionPhrase] comment: str auto_marking: bool + annotation_type_version: Optional[str] format_version: str last_updated_datetime: Optional[str] option: Union[AnnotationSpecsMovieOption, None] @@ -214,6 +215,7 @@ def from_specs(specs: AnnotationSpecsV3) -> "AnnotationSpecsRequestV3": inspection_phrases=specs.inspection_phrases if specs.inspection_phrases is not None else [], comment="", auto_marking=False, + annotation_type_version=specs.annotation_type_version, format_version=specs.format_version if specs.format_version is not None else "3.0.0", last_updated_datetime=specs.updated_datetime, option=specs.option, diff --git a/anno3d/annofab/project.py b/anno3d/annofab/project.py index 9c2ddb1..233ac89 100644 --- a/anno3d/annofab/project.py +++ b/anno3d/annofab/project.py @@ -1,6 +1,7 @@ import colorsys import random import uuid +from dataclasses import replace from typing import Any, Callable, Dict, List, Literal, Optional, Tuple from annofabapi import AnnofabApi @@ -20,12 +21,15 @@ from anno3d.annofab.constant import ( IgnoreAdditionalDef, + builtin_3d_editor_plugin_id, + builtin_3d_extend_specs_plugin_id, default_ignore_additional, default_non_ignore_additional, lang_en, lang_ja, ) from anno3d.annofab.model import AnnotationSpecsRequestV3, Label +from anno3d.annofab.specifiers.extended_specs_label_specifiers_v1 import ExtendedSpecsLabelSpecifiersV1 from anno3d.annofab.specifiers.label_specifiers import LabelSpecifiers from anno3d.annofab.specifiers.metadata_label_specifiers import MetadataLabelSpecifiers from anno3d.annofab.specifiers.project_specifiers import ProjectSpecifiers @@ -41,6 +45,10 @@ def __init__(self, label_specifiers: LabelSpecifiers): specifiers = ProjectSpecifiers + @property + def extended_specs_plugin_version(self) -> Optional[str]: + return self._label_specifiers.extended_specs_plugin_version() + @classmethod def set_annotation_area(cls, area: AnnotationArea) -> DataModifier[AnnotationSpecsV3]: return cls.specifiers.annotation_area.mod(lambda _: area) @@ -259,8 +267,18 @@ def _project_modifiers(self, project_id: str) -> ProjectModifiers: if current is not None: return current - # TODO ここでspec取って、LabelSpecifiersを切り替えるようにする - new = ProjectModifiers(MetadataLabelSpecifiers()) + project: Dict[str, Any] + project, _ = self._client.get_project(project_id) + conf: Dict[str, Any] = project["configuration"] + specs_plugin = conf.get("extended_specs_plugin_id", None) + + # 仕様拡張プラグインが利用されているかどうかでLabelSpecifiersの実装を入れ替える + if specs_plugin is None: + new = ProjectModifiers(MetadataLabelSpecifiers()) + else: + # TODO Pluginに埋まってるバージョンを読んで選択出来るようにしたい + # 現状は、1.0.1しか無い&pluginのdataclassが存在しないのでやってない + new = ProjectModifiers(ExtendedSpecsLabelSpecifiersV1()) self._modifiers_dic[project_id] = new return new @@ -281,7 +299,13 @@ def _decode_jobinfo(info: afm.ProjectJobInfo) -> ProjectJobInfo: return ProjectJobInfo.from_dict(info) def create_custom_project( - self, title: str, organization_name: str, plugin_id: str, project_id: str = "", overview: str = "" + self, + title: str, + organization_name: str, + editor_plugin_id: str, + specs_plugin_id: str, + project_id: str = "", + overview: str = "", ) -> str: """ カスタムプロジェクトを作成し、作成したprojectのidを返します @@ -290,7 +314,8 @@ def create_custom_project( title: organization_name: - plugin_id: + editor_plugin_id: + specs_plugin_id: project_id: overview: @@ -299,13 +324,18 @@ def create_custom_project( """ client = self._client + if editor_plugin_id == "": + editor_plugin_id = builtin_3d_editor_plugin_id + if specs_plugin_id == "": + specs_plugin_id = builtin_3d_extend_specs_plugin_id + body = { "title": title, "overview": overview if len(overview) != 0 else None, "status": "active", "input_data_type": "custom", "organization_name": organization_name, - "configuration": {"plugin_id": plugin_id}, + "configuration": {"plugin_id": editor_plugin_id, "extended_specs_plugin_id": specs_plugin_id}, } project: Dict[str, Any] @@ -325,7 +355,8 @@ def _mod_project_specs( client = self._client specs = self.get_annotation_specs(project_id) - new_specs = mod_func(specs) + annotation_type_version = self._project_modifiers(project_id).extended_specs_plugin_version + new_specs = replace(mod_func(specs), annotation_type_version=annotation_type_version) request = AnnotationSpecsRequestV3.from_specs(new_specs) created_specs, _ = client.put_annotation_specs(project_id, {"v": "3"}, request.to_dict(encode_json=True)) diff --git a/anno3d/annofab/specifiers/extend_specs_label_specifiers_v1.py b/anno3d/annofab/specifiers/extended_specs_label_specifiers_v1.py similarity index 95% rename from anno3d/annofab/specifiers/extend_specs_label_specifiers_v1.py rename to anno3d/annofab/specifiers/extended_specs_label_specifiers_v1.py index 3b3ccaf..f60a014 100644 --- a/anno3d/annofab/specifiers/extend_specs_label_specifiers_v1.py +++ b/anno3d/annofab/specifiers/extended_specs_label_specifiers_v1.py @@ -8,7 +8,7 @@ from anno3d.model.label import SegmentLabelInfo -class ExtendSpecsLabelSpecifiers(LabelSpecifiers): +class ExtendedSpecsLabelSpecifiersV1(LabelSpecifiers): def __init__(self): super().__init__() @@ -51,6 +51,10 @@ def zoom_out_cuboid_field_values(label: LabelV3, values: Optional[CuboidFieldVal zoom_out_cuboid_field_values, ) + @staticmethod + def extended_specs_plugin_version() -> Optional[str]: + return "1.0.1" + def _zoom_in_segment_info(self, label: LabelV3) -> SegmentLabelInfo: field_values = self._segment_field_values.get(label) default = SegmentLabelInfo() diff --git a/anno3d/annofab/specifiers/label_specifiers.py b/anno3d/annofab/specifiers/label_specifiers.py index 3e0ea34..e0ee0fa 100644 --- a/anno3d/annofab/specifiers/label_specifiers.py +++ b/anno3d/annofab/specifiers/label_specifiers.py @@ -43,6 +43,14 @@ def __init__(self): # abstract method群 ここから # ============================== + @staticmethod + @abstractmethod + def extended_specs_plugin_version() -> Optional[str]: + """ + このLabelSpecifiersが対応している仕様拡張プラグインバージョン + 仕様拡張プラグイン前の仕様に対応している場合None + """ + @abstractmethod def _zoom_in_segment_info(self, label: LabelV3) -> SegmentLabelInfo: pass diff --git a/anno3d/annofab/specifiers/metadata_label_specifiers.py b/anno3d/annofab/specifiers/metadata_label_specifiers.py index 7dd4a48..890fec0 100644 --- a/anno3d/annofab/specifiers/metadata_label_specifiers.py +++ b/anno3d/annofab/specifiers/metadata_label_specifiers.py @@ -49,6 +49,10 @@ class SegmentLabelMetadata(DataClassJsonMixin): def __init__(self): super().__init__() + @staticmethod + def extended_specs_plugin_version() -> Optional[str]: + return None + def _get_metadata(self, label: LabelV3) -> Dict[str, str]: return self.metadata.get(label) diff --git a/anno3d/app.py b/anno3d/app.py index a461e90..0f7f676 100644 --- a/anno3d/app.py +++ b/anno3d/app.py @@ -103,15 +103,16 @@ class ProjectCommand: def create( title: str, organization_name: str, - plugin_id: str, project_id: str = "", + plugin_id: str = "", + specs_plugin_id: str = "", overview: str = "", annofab_id: Optional[str] = env_annofab_user_id, annofab_pass: Optional[str] = env_annofab_password, annofab_endpoint: Optional[str] = env_annofab_endpoint, ) -> None: """ - 新しいカスタムプロジェクトを生成します。 + 新しい三次元エディタプロジェクトを生成します。 Args: annofab_id: AnnoFabのユーザID。指定が無い場合は環境変数`ANNOFAB_USER_ID`の値を採用する @@ -120,7 +121,8 @@ def create( 環境変数も指定されていない場合、デフォルトのエンドポイント(https://annofab.com)を利用します title: projectのタイトル organization_name: projectを所属させる組織の名前 - plugin_id: このプロジェクトで使用する、組織に登録されているプラグインのid。 + plugin_id: このプロジェクトで使用する、組織に登録されている三次元エディタプラグインのid。 省略時は標準プラグインを利用します + specs_plugin_id: このプロジェクトで使用する、組織に登録されている仕様拡張プラグインのid。 省略時は標準プラグインを利用します project_id: 作成するprojectのid。省略した場合自動的にuuidが設定されます。 overview: projectの概要 @@ -133,7 +135,12 @@ def create( client_loader = ClientLoader(annofab_id, annofab_pass, annofab_endpoint) with client_loader.open_api() as api: created_project_id = ProjectApi(api).create_custom_project( - title, organization_name, plugin_id, project_id, overview + title=title, + organization_name=organization_name, + editor_plugin_id=plugin_id, + specs_plugin_id=specs_plugin_id, + project_id=project_id, + overview=overview, ) logger.info("プロジェクト(=%s)を作成しました。", created_project_id) @@ -182,8 +189,8 @@ def put_cuboid_label( def put_segment_label( project_id: str, en_name: str, - default_ignore: bool, segment_type: str, + default_ignore: bool = False, layer: int = 100, label_id: str = "", ja_name: str = "", @@ -201,7 +208,8 @@ def put_segment_label( 環境変数も指定されていない場合、デフォルトのエンドポイント(https://annofab.com)を利用します project_id: 対象プロジェクト en_name:  英語名称 - default_ignore: このラベルがついた領域を、デフォルトでは他のアノテーションから除外するかどうか。 Trueであれば除外する + default_ignore: deprecated。Annofabの標準プラグインを利用したプロジェクトでは指定しても無視されます。 \ + このラベルがついた領域を、デフォルトでは他のアノテーションから除外するかどうか。 Trueであれば除外します。 segment_type: "SEMANTIC" or "INSTANCE" を指定する。 "SEMANTIC"の場合、このラベルのインスタンスは唯一つとなる。 "INSTANCE"の場合複数のインスタンスを作成可能となる From fc82dda64317cf420ce64265ba17deda001b1a2c Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Tue, 8 Nov 2022 07:17:55 +0900 Subject: [PATCH 17/25] =?UTF-8?q?=E6=96=B0=E4=BB=95=E6=A7=98=E3=81=AE?= =?UTF-8?q?=E3=83=97=E3=83=AD=E3=82=B8=E3=82=A7=E3=82=AF=E3=83=88=E3=81=A7?= =?UTF-8?q?=E7=84=A1=E8=A6=96=E5=B1=9E=E6=80=A7=E3=81=8C=E4=BD=9C=E6=88=90?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=A6=E3=81=97=E3=81=BE=E3=81=86=E3=81=AE?= =?UTF-8?q?=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/project.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/anno3d/annofab/project.py b/anno3d/annofab/project.py index 233ac89..3acf59c 100644 --- a/anno3d/annofab/project.py +++ b/anno3d/annofab/project.py @@ -110,7 +110,10 @@ def put_instance_segment_label( ignore_additional: Optional[IgnoreAdditionalDef] ignore_id: Optional[str] - if default_ignore is None: + + # 無視属性の追加は仕様拡張プラグインを使ってる場合は行わない + # ここでifするの微妙だが、ProjectModifiersまで抽象化するのは手間なので、こうしておく + if default_ignore is None or self._label_specifiers.extended_specs_plugin_version() is not None: ignore_additional = None ignore_id = None else: @@ -142,7 +145,10 @@ def put_semantic_segment_label( ignore_additional: Optional[IgnoreAdditionalDef] ignore_id: Optional[str] - if default_ignore is None: + + # 無視属性の追加は仕様拡張プラグインを使ってる場合は行わない + # ここでifするの微妙だが、ProjectModifiersまで抽象化するのは手間なので、こうしておく + if default_ignore is None or self._label_specifiers.extended_specs_plugin_version() is not None: ignore_additional = None ignore_id = None else: @@ -225,9 +231,8 @@ def mod(label_opt: Optional[LabelV3]) -> Optional[LabelV3]: label_specifier = self.specifiers.label(label_id) return label_specifier.mod(mod).and_then(mod_additionals) - @classmethod def create_ignore_additional_if_necessary( - cls, additional_def: IgnoreAdditionalDef + self, additional_def: IgnoreAdditionalDef ) -> DataModifier[AnnotationSpecsV3]: def mod(current: Optional[AdditionalDataDefinitionV2]) -> Optional[AdditionalDataDefinitionV2]: if current is not None: @@ -250,7 +255,7 @@ def mod(current: Optional[AdditionalDataDefinitionV2]) -> Optional[AdditionalDat metadata={}, ) - return cls.specifiers.additional(additional_def.id).mod(mod) + return self.specifiers.additional(additional_def.id).mod(mod) class ProjectApi: From 91f336c4200f0661242211626b5a2c386eabedb6 Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Tue, 8 Nov 2022 07:33:12 +0900 Subject: [PATCH 18/25] =?UTF-8?q?=E3=83=A9=E3=83=99=E3=83=AB=E3=81=AE?= =?UTF-8?q?=E6=83=85=E5=A0=B1=E3=81=A8=E3=81=97=E3=81=A6=E3=80=81annotatio?= =?UTF-8?q?n=5Ftype=E3=81=A8field=5Fvalues=E3=82=92=E5=87=BA=E5=8A=9B?= =?UTF-8?q?=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/model.py | 2 ++ anno3d/annofab/project.py | 8 +++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/anno3d/annofab/model.py b/anno3d/annofab/model.py index 4a15743..c8f4ab8 100644 --- a/anno3d/annofab/model.py +++ b/anno3d/annofab/model.py @@ -19,12 +19,14 @@ @dataclass class Label(DataClassJsonMixin): label_id: str + annotation_type: str ja_name: str en_name: str color: Tuple[int, int, int] = field( # `Label.schema()`を実行するとエラーが発生するため、mm_fieldをした。https://github.com/lidatong/dataclasses-json/issues/318 metadata=config(mm_field=fields.Tuple((fields.Integer(), fields.Integer(), fields.Integer()))) ) + field_values: Dict[str, typing.Any] metadata: Dict[str, str] diff --git a/anno3d/annofab/project.py b/anno3d/annofab/project.py index 3acf59c..b4e7c9e 100644 --- a/anno3d/annofab/project.py +++ b/anno3d/annofab/project.py @@ -438,7 +438,13 @@ def _from_annofab_label(annofab_label: afm.LabelV3) -> Label: metadata = annofab_label["metadata"] return Label( - annofab_label["label_id"], ja_name, en_name, (color["red"], color["green"], color["blue"]), metadata + label_id=annofab_label["label_id"], + annotation_type=annofab_label["annotation_type"], + ja_name=ja_name, + en_name=en_name, + color=(color["red"], color["green"], color["blue"]), + field_values=annofab_label["field_values"], + metadata=metadata, ) def put_label(self, project_id: str, mod_specs: DataModifier[AnnotationSpecsV3]) -> List[Label]: From 939ac4bed2071e4a67b29e0dd5b496077fef09cd Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Tue, 8 Nov 2022 07:49:38 +0900 Subject: [PATCH 19/25] =?UTF-8?q?=E3=82=B3=E3=83=9E=E3=83=B3=E3=83=89?= =?UTF-8?q?=E3=82=B5=E3=83=B3=E3=83=97=E3=83=AB=E3=82=92=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../command_sample/create_project.md | 16 +++++++----- docs/user_guide/command_sample/set_label.md | 26 ++++++++----------- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/docs/user_guide/command_sample/create_project.md b/docs/user_guide/command_sample/create_project.md index c402d04..42bd57f 100644 --- a/docs/user_guide/command_sample/create_project.md +++ b/docs/user_guide/command_sample/create_project.md @@ -7,27 +7,29 @@ $ anno3d project create --help | cat INFO: Showing help with the command 'anno3d project create -- --help'. NAME - anno3d project create - 新しいカスタムプロジェクトを生成します。 + anno3d project create - 新しい三次元エディタプロジェクトを生成します。 SYNOPSIS - anno3d project create TITLE ORGANIZATION_NAME PLUGIN_ID + anno3d project create TITLE ORGANIZATION_NAME DESCRIPTION - 新しいカスタムプロジェクトを生成します。 + 新しい三次元エディタプロジェクトを生成します。 POSITIONAL ARGUMENTS TITLE projectのタイトル ORGANIZATION_NAME projectを所属させる組織の名前 - PLUGIN_ID - このプロジェクトで使用する、組織に登録されているプラグインのid。 FLAGS --project_id=PROJECT_ID 作成するprojectのid。省略した場合自動的にuuidが設定されます。 + --plugin_id=PLUGIN_ID + このプロジェクトで使用する、組織に登録されている三次元エディタプラグインのid。 省略時は標準プラグインを利用します + --specs_plugin_id=SPECS_PLUGIN_ID + このプロジェクトで使用する、組織に登録されている仕様拡張プラグインのid。 省略時は標準プラグインを利用します --overview=OVERVIEW - projectの概要。 + projectの概要 --annofab_id=ANNOFAB_ID AnnoFabのユーザID。指定が無い場合は環境変数`ANNOFAB_USER_ID`の値を採用する --annofab_pass=ANNOFAB_PASS @@ -44,5 +46,5 @@ NOTES ## コマンド例 ``` -anno3d project create --annofab_id ${ANNO_ID} --annofab_pass ${ANNO_PASS} --title "test_project" --organization_name "3dpc-editor-devel" --plugin_id "ace7bf49-aefb-4db2-96ad-805496bd40aa" +anno3d project create --annofab_id ${ANNO_ID} --annofab_pass ${ANNO_PASS} --title "test_project" --organization_name "3dpc-editor-devel" ``` diff --git a/docs/user_guide/command_sample/set_label.md b/docs/user_guide/command_sample/set_label.md index cc81225..e1e5f9f 100644 --- a/docs/user_guide/command_sample/set_label.md +++ b/docs/user_guide/command_sample/set_label.md @@ -27,27 +27,28 @@ FLAGS --ja_name=JA_NAME 日本語名称。指定しない場合はen_nameと同じ名称が設定される。 --color=COLOR - ラベルの表示色。 "(R,G,B)"形式の文字列 R/G/Bは、それぞれ0〜255の整数値で指定する。指定しない場合はランダムに設定される。 + ラベルの表示色。 "(R,G,B)"形式の文字列 R/G/Bは、それぞれ0〜255の整数値で指定する。 指定しない場合はランダムに設定される。 --annofab_id=ANNOFAB_ID AnnoFabのユーザID。指定が無い場合は環境変数`ANNOFAB_USER_ID`の値を採用する --annofab_pass=ANNOFAB_PASS AnnoFabのパスワード。指定が無い場合は環境変数`ANNOFAB_PASSWORD`の値を採用する --annofab_endpoint=ANNOFAB_ENDPOINT - AnnofabのAPIアクセス先エンドポイントを指定します。 省略した場合は環境変数`ANNOFAB_ENDPOINT`の値を利用します。 環境変数も指定されていない場合、デフォルトのエンドポイント(https://annofab.com)を利用します + AnnofabのAPIアクセス先エンドポイントを指定します。 省略した場合は環境変数`ANNOFAB_ENDPOINT`の値を利用します。環境変数も指定されていない場合、デフォルトのエンドポイント(https://annofab.com)を利用します NOTES You can also use flags syntax for POSITIONAL ARGUMENTS + ``` ``` $ anno3d project put_segment_label --help | cat -INFO: Showing help with the command 'app.py project put_segment_label -- --help'. +INFO: Showing help with the command 'anno3d project put_segment_label -- --help'. NAME anno3d project put_segment_label - 対象のプロジェクトにsegmentのlabelを追加・更新します。 SYNOPSIS - anno3d project put_segment_label PROJECT_ID EN_NAME DEFAULT_IGNORE SEGMENT_TYPE + anno3d project put_segment_label PROJECT_ID EN_NAME SEGMENT_TYPE DESCRIPTION 対象のプロジェクトにsegmentのlabelを追加・更新します。 @@ -57,12 +58,12 @@ POSITIONAL ARGUMENTS 対象プロジェクト EN_NAME 英語名称 - DEFAULT_IGNORE - このラベルがついた領域を、デフォルトでは他のアノテーションから除外するかどうか。 Trueであれば除外する SEGMENT_TYPE "SEMANTIC" or "INSTANCE" を指定する。 "SEMANTIC"の場合、このラベルのインスタンスは唯一つとなる。 "INSTANCE"の場合複数のインスタンスを作成可能となる FLAGS + --default_ignore=DEFAULT_IGNORE + deprecated。Annofabの標準プラグインを利用したプロジェクトでは指定しても無視されます。 このラベルがついた領域を、デフォルトでは他のアノテーションから除外するかどうか。 Trueであれば除外します。 --layer=LAYER このラベルのレイヤーを指定する。 同じレイヤーのラベルは、頂点を共有することが出来ない。 また、大きな値のレイヤーが優先して表示される。 指定しない場合は 100 --label_id=LABEL_ID @@ -70,13 +71,13 @@ FLAGS --ja_name=JA_NAME 日本語名称。指定しない場合はen_nameと同じ名称が設定される。 --color=COLOR - ラベルの表示色。 "(R,G,B)"形式の文字列 R/G/Bは、それぞれ0〜255の整数値で指定する。指定しない場合はランダムに設定される。 + ラベルの表示色。 "(R,G,B)"形式の文字列 R/G/Bは、それぞれ0〜255の整数値で指定する。 指定しない場合はランダムに設定される。 --annofab_id=ANNOFAB_ID AnnoFabのユーザID。指定が無い場合は環境変数`ANNOFAB_USER_ID`の値を採用する --annofab_pass=ANNOFAB_PASS AnnoFabのパスワード。指定が無い場合は環境変数`ANNOFAB_PASSWORD`の値を採用する --annofab_endpoint=ANNOFAB_ENDPOINT - AnnofabのAPIアクセス先エンドポイントを指定します。 省略した場合は環境変数`ANNOFAB_ENDPOINT`の値を利用します。環境変数も指定されていない場合、デフォルトのエンドポイント(https://annofab.com)を利用します + AnnofabのAPIアクセス先エンドポイントを指定します。 省略した場合は環境変数`ANNOFAB_ENDPOINT`の値を利用します。 環境変数も指定されていない場合、デフォルトのエンドポイント(https://annofab.com)を利用します NOTES You can also use flags syntax for POSITIONAL ARGUMENTS @@ -94,6 +95,7 @@ anno3d project put_cuboid_label \ --ja_name "車" \ --en_name "car" \ --color "(255, 0, 0)" + anno3d project put_cuboid_label \ --annofab_id ${ANNO_ID} \ --annofab_pass ${ANNO_PASS} \ @@ -104,7 +106,6 @@ anno3d project put_cuboid_label \ --color "(0, 255, 0)" # セマンティックセグメンテーションのラベルを追加 -# defaultで無視属性が有効 anno3d project put_segment_label \ --annofab_id ${ANNO_ID} \ --annofab_pass ${ANNO_PASS} \ @@ -113,10 +114,8 @@ anno3d project put_segment_label \ --ja_name "道" \ --en_name "road" \ --color "(238, 130, 238)" \ - --default_ignore True \ --segment_type SEMANTIC -# defaultで無視属性が無効 anno3d project put_segment_label \ --annofab_id ${ANNO_ID} \ --annofab_pass ${ANNO_PASS} \ @@ -125,7 +124,6 @@ anno3d project put_segment_label \ --ja_name "壁" \ --en_name "wall" \ --color "(0, 182, 110)" \ - --default_ignore False \ --segment_type SEMANTIC # インスタンスセグメンテーションのラベルを追加 @@ -133,11 +131,9 @@ anno3d project put_segment_label \ --annofab_id ${ANNO_ID} \ --annofab_pass ${ANNO_PASS} \ --project_id ${ANNO_PRJ} \ - --label_id "car" \ + --label_id "car-seg" \ --ja_name "車(seg)" \ --en_name "car-seg" \ --color "(255, 0, 0)" \ - --default_ignore False \ --segment_type INSTANCE - ``` From faa649a171353938bc842b61c42a3e14091e9cb3 Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Tue, 8 Nov 2022 08:07:34 +0900 Subject: [PATCH 20/25] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=82=92=E8=BF=BD=E8=A8=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/specifiers/extended_specs_label_specifiers_v1.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/anno3d/annofab/specifiers/extended_specs_label_specifiers_v1.py b/anno3d/annofab/specifiers/extended_specs_label_specifiers_v1.py index f60a014..cd91cef 100644 --- a/anno3d/annofab/specifiers/extended_specs_label_specifiers_v1.py +++ b/anno3d/annofab/specifiers/extended_specs_label_specifiers_v1.py @@ -9,6 +9,8 @@ class ExtendedSpecsLabelSpecifiersV1(LabelSpecifiers): + """仕様拡張プラグイン利用のアノテーション仕様向けLabelSpecifiers プラグインVersion 1.0.1用""" + def __init__(self): super().__init__() From 8a798e6f5df90524754285eb6cd74cff39f24430 Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Tue, 8 Nov 2022 22:22:53 +0900 Subject: [PATCH 21/25] annofabapi = ">=0.65.0" --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 905b1d8..0c1bdfd 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -24,7 +24,7 @@ packages = [ [tool.poetry.dependencies] python = ">=3.8,<3.11" -annofabapi = ">=0.62.0" +annofabapi = ">=0.65.0" dataclasses-json = "^0.5.7" fire = "^0.3.1" more-itertools = "^8.5.0" From 934c733f61e263d12394f11f35bfb37fd55986cd Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Tue, 8 Nov 2022 22:33:01 +0900 Subject: [PATCH 22/25] =?UTF-8?q?=E6=8B=A1=E5=BC=B5=E4=BB=95=E6=A7=98?= =?UTF-8?q?=E3=83=97=E3=83=A9=E3=82=B0=E3=82=A4=E3=83=B3=E3=82=92=E5=88=A9?= =?UTF-8?q?=E7=94=A8=E3=81=97=E3=81=A6=E3=81=84=E3=82=8B=E6=99=82=E3=81=AB?= =?UTF-8?q?=E3=80=81default=5Fignore=E3=81=8C=E6=8C=87=E5=AE=9A=E3=81=95?= =?UTF-8?q?=E3=82=8C=E3=81=9F=E5=A0=B4=E5=90=88=E3=80=81=E8=AD=A6=E5=91=8A?= =?UTF-8?q?=E3=82=92=E5=87=BA=E3=81=99=E3=82=88=E3=81=86=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/project.py | 6 ++++++ anno3d/app.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/anno3d/annofab/project.py b/anno3d/annofab/project.py index b4e7c9e..e16dce7 100644 --- a/anno3d/annofab/project.py +++ b/anno3d/annofab/project.py @@ -1,4 +1,5 @@ import colorsys +import logging import random import uuid from dataclasses import replace @@ -38,6 +39,8 @@ from anno3d.model.project_specs_meta import ProjectMetadata from anno3d.util.modifier import DataModifier +logger: logging.Logger = logging.getLogger(__name__) + class ProjectModifiers: def __init__(self, label_specifiers: LabelSpecifiers): @@ -412,6 +415,9 @@ def put_segment_label( else: mod_specs_f = modifiers.put_instance_segment_label + if default_ignore is not None and modifiers.extended_specs_plugin_version is not None: + logger.warning("default_ignore(=%s)が指定されていますが、仕様拡張プラグインを利用したプロジェクトが対象であるため、無視します。", default_ignore) + mod_specs = mod_specs_f( en_name=en_name, layer=layer, diff --git a/anno3d/app.py b/anno3d/app.py index 0f7f676..478cf66 100644 --- a/anno3d/app.py +++ b/anno3d/app.py @@ -190,7 +190,7 @@ def put_segment_label( project_id: str, en_name: str, segment_type: str, - default_ignore: bool = False, + default_ignore: Optional[bool] = None, layer: int = 100, label_id: str = "", ja_name: str = "", From b716f027f2758835961809fc7d3df15c61b51dab Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Tue, 8 Nov 2022 22:35:52 +0900 Subject: [PATCH 23/25] fix typo --- anno3d/annofab/model.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/anno3d/annofab/model.py b/anno3d/annofab/model.py index c8f4ab8..8322800 100644 --- a/anno3d/annofab/model.py +++ b/anno3d/annofab/model.py @@ -80,7 +80,7 @@ class UnknownDataField(fields.Field): """ FullAnnotationDataUnknownのdataのserialize / deserialize定義 FullAnnotationDataUnknownのdataは文字列型で、3d-editorのCuboidの場合、json形式文字列を埋めないといけないが、str型だと不便。 - なので、deup / load時に文字列との相互変換をするような定義をしておく + なので、dump / load時に文字列との相互変換をするような定義をしておく """ _type: typing.Any From e319150c53a42b944613e9b3d13380196f0a14df Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Tue, 8 Nov 2022 22:40:04 +0900 Subject: [PATCH 24/25] rename builtin_3d_extend_specs_plugin_id to builtin_3d_extended_specs_plugin_id --- anno3d/annofab/constant.py | 2 +- anno3d/annofab/project.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/anno3d/annofab/constant.py b/anno3d/annofab/constant.py index c9259ca..3437a45 100644 --- a/anno3d/annofab/constant.py +++ b/anno3d/annofab/constant.py @@ -22,4 +22,4 @@ class IgnoreAdditionalDef: builtin_3d_editor_plugin_id = "bdc16348-107e-4fbc-af4a-e482bc84a60f" # Annofabで定義されている標準三次元エディタ用仕様拡張プラグインのID(dev / production共通) -builtin_3d_extend_specs_plugin_id = "703ababa-96ac-4920-8afb-d4f2bddac7e3" +builtin_3d_extended_specs_plugin_id = "703ababa-96ac-4920-8afb-d4f2bddac7e3" diff --git a/anno3d/annofab/project.py b/anno3d/annofab/project.py index e16dce7..5d41f82 100644 --- a/anno3d/annofab/project.py +++ b/anno3d/annofab/project.py @@ -23,7 +23,7 @@ from anno3d.annofab.constant import ( IgnoreAdditionalDef, builtin_3d_editor_plugin_id, - builtin_3d_extend_specs_plugin_id, + builtin_3d_extended_specs_plugin_id, default_ignore_additional, default_non_ignore_additional, lang_en, @@ -335,7 +335,7 @@ def create_custom_project( if editor_plugin_id == "": editor_plugin_id = builtin_3d_editor_plugin_id if specs_plugin_id == "": - specs_plugin_id = builtin_3d_extend_specs_plugin_id + specs_plugin_id = builtin_3d_extended_specs_plugin_id body = { "title": title, From 75b465bf977ab6869300cc88658b28c1e0a4902c Mon Sep 17 00:00:00 2001 From: Toshiya MORI Date: Wed, 9 Nov 2022 01:12:34 +0900 Subject: [PATCH 25/25] =?UTF-8?q?rename=20=E4=BB=95=E6=A7=98=E6=8B=A1?= =?UTF-8?q?=E5=BC=B5=E3=83=97=E3=83=A9=E3=82=B0=E3=82=A4=E3=83=B3=20to=20?= =?UTF-8?q?=E6=8B=A1=E5=BC=B5=E4=BB=95=E6=A7=98=E3=83=97=E3=83=A9=E3=82=B0?= =?UTF-8?q?=E3=82=A4=E3=83=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- anno3d/annofab/constant.py | 2 +- anno3d/annofab/project.py | 12 ++++++------ .../specifiers/extended_specs_label_specifiers_v1.py | 2 +- anno3d/annofab/specifiers/label_specifiers.py | 4 ++-- .../annofab/specifiers/metadata_label_specifiers.py | 2 +- anno3d/app.py | 2 +- anno3d/model/label.py | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/anno3d/annofab/constant.py b/anno3d/annofab/constant.py index 3437a45..ee79f6d 100644 --- a/anno3d/annofab/constant.py +++ b/anno3d/annofab/constant.py @@ -21,5 +21,5 @@ class IgnoreAdditionalDef: # Annofabで定義されている標準三次元エディタプラグインのID(dev / production共通) builtin_3d_editor_plugin_id = "bdc16348-107e-4fbc-af4a-e482bc84a60f" -# Annofabで定義されている標準三次元エディタ用仕様拡張プラグインのID(dev / production共通) +# Annofabで定義されている標準三次元エディタ用拡張仕様プラグインのID(dev / production共通) builtin_3d_extended_specs_plugin_id = "703ababa-96ac-4920-8afb-d4f2bddac7e3" diff --git a/anno3d/annofab/project.py b/anno3d/annofab/project.py index 5d41f82..ed2cc9e 100644 --- a/anno3d/annofab/project.py +++ b/anno3d/annofab/project.py @@ -114,7 +114,7 @@ def put_instance_segment_label( ignore_additional: Optional[IgnoreAdditionalDef] ignore_id: Optional[str] - # 無視属性の追加は仕様拡張プラグインを使ってる場合は行わない + # 無視属性の追加は拡張仕様プラグインを使ってる場合は行わない # ここでifするの微妙だが、ProjectModifiersまで抽象化するのは手間なので、こうしておく if default_ignore is None or self._label_specifiers.extended_specs_plugin_version() is not None: ignore_additional = None @@ -149,7 +149,7 @@ def put_semantic_segment_label( ignore_additional: Optional[IgnoreAdditionalDef] ignore_id: Optional[str] - # 無視属性の追加は仕様拡張プラグインを使ってる場合は行わない + # 無視属性の追加は拡張仕様プラグインを使ってる場合は行わない # ここでifするの微妙だが、ProjectModifiersまで抽象化するのは手間なので、こうしておく if default_ignore is None or self._label_specifiers.extended_specs_plugin_version() is not None: ignore_additional = None @@ -189,7 +189,7 @@ def init_label() -> LabelV3: lang_ja, ), keybind=[], - # 仕様拡張プラグインを使っている場合annotation_typeはmod_label_infoで上書きされるはず。 そうでなければそのまま + # 拡張仕様プラグインを使っている場合annotation_typeはmod_label_infoで上書きされるはず。 そうでなければそのまま annotation_type=DefaultAnnotationType.CUSTOM.value, field_values={}, additional_data_definitions=[], @@ -280,7 +280,7 @@ def _project_modifiers(self, project_id: str) -> ProjectModifiers: conf: Dict[str, Any] = project["configuration"] specs_plugin = conf.get("extended_specs_plugin_id", None) - # 仕様拡張プラグインが利用されているかどうかでLabelSpecifiersの実装を入れ替える + # 拡張仕様プラグインが利用されているかどうかでLabelSpecifiersの実装を入れ替える if specs_plugin is None: new = ProjectModifiers(MetadataLabelSpecifiers()) else: @@ -399,7 +399,7 @@ def put_segment_label( Args: project_id: en_name: - default_ignore: デフォルトで無視属性をOnにするかどうか。 基本的にNone。 仕様拡張プラグインを利用しない古い仕様との互換性のために残っている + default_ignore: デフォルトで無視属性をOnにするかどうか。 基本的にNone。 拡張仕様プラグインを利用しない古い仕様との互換性のために残っている segment_kind: layer: ja_name: @@ -416,7 +416,7 @@ def put_segment_label( mod_specs_f = modifiers.put_instance_segment_label if default_ignore is not None and modifiers.extended_specs_plugin_version is not None: - logger.warning("default_ignore(=%s)が指定されていますが、仕様拡張プラグインを利用したプロジェクトが対象であるため、無視します。", default_ignore) + logger.warning("default_ignore(=%s)が指定されていますが、拡張仕様プラグインを利用したプロジェクトが対象であるため、無視します。", default_ignore) mod_specs = mod_specs_f( en_name=en_name, diff --git a/anno3d/annofab/specifiers/extended_specs_label_specifiers_v1.py b/anno3d/annofab/specifiers/extended_specs_label_specifiers_v1.py index cd91cef..1bb8496 100644 --- a/anno3d/annofab/specifiers/extended_specs_label_specifiers_v1.py +++ b/anno3d/annofab/specifiers/extended_specs_label_specifiers_v1.py @@ -9,7 +9,7 @@ class ExtendedSpecsLabelSpecifiersV1(LabelSpecifiers): - """仕様拡張プラグイン利用のアノテーション仕様向けLabelSpecifiers プラグインVersion 1.0.1用""" + """拡張仕様プラグイン利用のアノテーション仕様向けLabelSpecifiers プラグインVersion 1.0.1用""" def __init__(self): super().__init__() diff --git a/anno3d/annofab/specifiers/label_specifiers.py b/anno3d/annofab/specifiers/label_specifiers.py index e0ee0fa..5c36327 100644 --- a/anno3d/annofab/specifiers/label_specifiers.py +++ b/anno3d/annofab/specifiers/label_specifiers.py @@ -47,8 +47,8 @@ def __init__(self): @abstractmethod def extended_specs_plugin_version() -> Optional[str]: """ - このLabelSpecifiersが対応している仕様拡張プラグインバージョン - 仕様拡張プラグイン前の仕様に対応している場合None + このLabelSpecifiersが対応している拡張仕様プラグインバージョン + 拡張仕様プラグイン前の仕様に対応している場合None """ @abstractmethod diff --git a/anno3d/annofab/specifiers/metadata_label_specifiers.py b/anno3d/annofab/specifiers/metadata_label_specifiers.py index 890fec0..ca978ad 100644 --- a/anno3d/annofab/specifiers/metadata_label_specifiers.py +++ b/anno3d/annofab/specifiers/metadata_label_specifiers.py @@ -10,7 +10,7 @@ class MetadataLabelSpecifiers(LabelSpecifiers): """ - 仕様拡張プラグイン適用前の、Metadataにラベルの情報を埋め込んでいる仕様のための LabelSpecifiers実装 + 拡張仕様プラグイン適用前の、Metadataにラベルの情報を埋め込んでいる仕様のための LabelSpecifiers実装 以下のコードで表現されるメタデータを編集する機能をLabelSpecifiersに注入する @camelcase diff --git a/anno3d/app.py b/anno3d/app.py index 478cf66..303f2b2 100644 --- a/anno3d/app.py +++ b/anno3d/app.py @@ -122,7 +122,7 @@ def create( title: projectのタイトル organization_name: projectを所属させる組織の名前 plugin_id: このプロジェクトで使用する、組織に登録されている三次元エディタプラグインのid。 省略時は標準プラグインを利用します - specs_plugin_id: このプロジェクトで使用する、組織に登録されている仕様拡張プラグインのid。 省略時は標準プラグインを利用します + specs_plugin_id: このプロジェクトで使用する、組織に登録されている拡張仕様プラグインのid。 省略時は標準プラグインを利用します project_id: 作成するprojectのid。省略した場合自動的にuuidが設定されます。 overview: projectの概要 diff --git a/anno3d/model/label.py b/anno3d/model/label.py index 8ab8395..4a75cd0 100644 --- a/anno3d/model/label.py +++ b/anno3d/model/label.py @@ -19,7 +19,7 @@ class SegmentLabelInfo(DataClassJsonMixin): アノテーション仕様のうちSegment用部分 Args: - ignore: ignore設定に利用するAdditionalDataのid。 通常None。 仕様拡張プラグインを利用しない、古い仕様の場合のみSome + ignore: ignore設定に利用するAdditionalDataのid。 通常None。 拡張仕様プラグインを利用しない、古い仕様の場合のみSome layer: レイヤーを表す数値。 0以上の整数 """