diff --git a/.gitignore b/.gitignore index 908386a..cdef3a3 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ /test.py /gen /build -/mcaddon/todo +/.venv +/examples diff --git a/.venv/Lib/site-packages/629853fdff261ed89b74__mypyc.cp311-win_amd64.pyd b/.venv/Lib/site-packages/629853fdff261ed89b74__mypyc.cp311-win_amd64.pyd deleted file mode 100644 index 20cb316..0000000 Binary files a/.venv/Lib/site-packages/629853fdff261ed89b74__mypyc.cp311-win_amd64.pyd and /dev/null differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-311.pyc index a7d6e65..b5b44b5 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/BdfFontFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-311.pyc index d19a096..c0a45c5 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/BlpImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-311.pyc index 9f7cdd6..0d3a329 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/BmpImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-311.pyc index bdf6fc0..80f4c3e 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/BufrStubImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-311.pyc index 68cad00..4b64187 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ContainerIO.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/CurImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/CurImagePlugin.cpython-311.pyc index b10ba7a..f676944 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/CurImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/CurImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-311.pyc index 57cc9b4..f3d788e 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/DcxImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-311.pyc index bc51ce2..2359b93 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/DdsImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-311.pyc index eb8d686..4b988b2 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/EpsImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ExifTags.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ExifTags.cpython-311.pyc index 5511079..b27fd99 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ExifTags.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ExifTags.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-311.pyc index 5f556e7..39c2959 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/FitsImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/FliImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/FliImagePlugin.cpython-311.pyc index 4ca6f42..3cbf739 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/FliImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/FliImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/FontFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/FontFile.cpython-311.pyc index a33dc0d..e34a991 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/FontFile.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/FontFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-311.pyc index 1745ec5..0423e8b 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/FpxImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-311.pyc index e0a1404..6d70131 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/FtexImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-311.pyc index d702e1e..8c96387 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/GbrImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GdImageFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GdImageFile.cpython-311.pyc index 0679296..7c9e743 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/GdImageFile.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/GdImageFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-311.pyc index c8299c6..7eb8b2e 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/GifImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GimpGradientFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GimpGradientFile.cpython-311.pyc index 441de08..919958e 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/GimpGradientFile.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/GimpGradientFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-311.pyc index baf62c0..3f47359 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/GimpPaletteFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-311.pyc index 443ec53..8a1ca8d 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/GribStubImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-311.pyc index 8ca7a07..2d5928a 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/Hdf5StubImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-311.pyc index 29fae47..9cbc52e 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/IcnsImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-311.pyc index 13e8709..aead31c 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/IcoImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImImagePlugin.cpython-311.pyc index 8e92026..82734ec 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/Image.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/Image.cpython-311.pyc index 9844a04..5aecd27 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/Image.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/Image.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageChops.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageChops.cpython-311.pyc index 1eaa354..90ee2f3 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageChops.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageChops.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageCms.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageCms.cpython-311.pyc index 75653a9..5a49084 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageCms.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageCms.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageColor.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageColor.cpython-311.pyc index b7a2dfa..930630c 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageColor.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageColor.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw.cpython-311.pyc index 058ea87..52ef430 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw2.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw2.cpython-311.pyc index 952f0e6..0ba4ad5 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw2.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageDraw2.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageEnhance.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageEnhance.cpython-311.pyc index 7494997..bf37bb8 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageEnhance.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageEnhance.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageFile.cpython-311.pyc index aee72e9..0eeb492 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageFile.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageFilter.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageFilter.cpython-311.pyc index dd4f2d8..60dee04 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageFilter.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageFilter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-311.pyc index 041fdbc..dadc0e6 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageFont.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-311.pyc index f98e22e..5e8bcc0 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageGrab.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-311.pyc index 79dd594..0cf09ee 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageMath.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-311.pyc index 3399824..ffb1438 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageMode.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageMorph.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageMorph.cpython-311.pyc index ff1ca8d..d32c8ec 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageMorph.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageMorph.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageOps.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageOps.cpython-311.pyc index c536c3e..bf96f04 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageOps.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageOps.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-311.pyc index 21bc889..ef29aff 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImagePalette.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImagePath.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImagePath.cpython-311.pyc index 8c8c65a..c04dea6 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImagePath.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImagePath.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageQt.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageQt.cpython-311.pyc index 5a783f1..74ebcd5 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageQt.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageQt.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageSequence.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageSequence.cpython-311.pyc index 9cefcd7..ca3dce5 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageSequence.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageSequence.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageShow.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageShow.cpython-311.pyc index 1365503..2ef7654 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageShow.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageShow.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageStat.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageStat.cpython-311.pyc index 867b1d5..c5b6513 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageStat.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageStat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageTk.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageTk.cpython-311.pyc index 6c3fde1..6b71455 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageTk.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageTk.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageTransform.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageTransform.cpython-311.pyc index ce873d9..1f7eb78 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageTransform.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageTransform.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-311.pyc index 092ab19..e66e7a4 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImageWin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-311.pyc index c900e74..8231459 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/ImtImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-311.pyc index e1f89fb..609363a 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/IptcImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-311.pyc index 8b511c3..1e09403 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/Jpeg2KImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-311.pyc index ff6c95e..2c897ff 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/JpegImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/JpegPresets.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/JpegPresets.cpython-311.pyc index 444a78e..dd13a67 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/JpegPresets.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/JpegPresets.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-311.pyc index 1691414..a54e89a 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/McIdasImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/MicImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/MicImagePlugin.cpython-311.pyc index 07a87f7..c53b9b6 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/MicImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/MicImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-311.pyc index 418f0c3..255b73c 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/MpegImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-311.pyc index a1cf6a5..3eaaf75 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/MpoImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/MspImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/MspImagePlugin.cpython-311.pyc index 411faa5..35a2c56 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/MspImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/MspImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-311.pyc index bd63d29..c4fb0c0 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/PSDraw.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-311.pyc index 52a7e6d..618ce20 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/PaletteFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-311.pyc index 658902f..38652af 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/PalmImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-311.pyc index f34694e..52444c3 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/PcdImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-311.pyc index c60441c..ad13858 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/PcfFontFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-311.pyc index d149890..f886e7a 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/PcxImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-311.pyc index 1cd5143..57eb2e7 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/PdfImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PdfParser.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PdfParser.cpython-311.pyc index a0e346b..577dfbd 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/PdfParser.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/PdfParser.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-311.pyc index 895fb16..859023f 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/PixarImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PngImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PngImagePlugin.cpython-311.pyc index 2adbd4d..077bba8 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/PngImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/PngImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-311.pyc index b83080e..6af8736 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/PpmImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-311.pyc index cf87568..2094e79 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/PsdImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/PyAccess.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/PyAccess.cpython-311.pyc index 6339644..c0f791f 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/PyAccess.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/PyAccess.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-311.pyc index 2d98630..c5ec420 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/QoiImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-311.pyc index ed2f1f4..85a3006 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/SgiImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-311.pyc index 0383ef5..eaed6d4 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/SpiderImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/SunImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/SunImagePlugin.cpython-311.pyc index 9f610e2..3a4d506 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/SunImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/SunImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/TarIO.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/TarIO.cpython-311.pyc index f3e7543..89272a4 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/TarIO.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/TarIO.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-311.pyc index d414a64..69a6d40 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/TgaImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-311.pyc index 9f7caae..e84afb2 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/TiffImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/TiffTags.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/TiffTags.cpython-311.pyc index 03c479a..be580c7 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/TiffTags.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/TiffTags.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-311.pyc index e31b6fa..8e06b24 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/WalImageFile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-311.pyc index ee701db..1a852f4 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/WebPImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-311.pyc index 919aaf7..2a7c060 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/WmfImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-311.pyc index 2120479..7597fc0 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/XVThumbImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-311.pyc index a946331..9a41725 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/XbmImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-311.pyc index ca3d674..7d9b4a1 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/XpmImagePlugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/__init__.cpython-311.pyc index d1135e1..a9639f2 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/__main__.cpython-311.pyc index 33b537e..9c87fa0 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/_binary.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/_binary.cpython-311.pyc index 4c55fac..44250e5 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/_binary.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/_binary.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/_deprecate.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/_deprecate.cpython-311.pyc index fc0cac9..a4b63c3 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/_deprecate.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/_deprecate.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/_tkinter_finder.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/_tkinter_finder.cpython-311.pyc index 0613d40..e025821 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/_tkinter_finder.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/_tkinter_finder.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/_typing.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/_typing.cpython-311.pyc index 3221ad4..c7dc680 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/_typing.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/_typing.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/_util.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/_util.cpython-311.pyc index ebdd709..b7a5b9c 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/_util.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/_util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/_version.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/_version.cpython-311.pyc index 46a489e..988304a 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/_version.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/_version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/PIL/__pycache__/features.cpython-311.pyc b/.venv/Lib/site-packages/PIL/__pycache__/features.cpython-311.pyc index ef6c4e0..97e15e6 100644 Binary files a/.venv/Lib/site-packages/PIL/__pycache__/features.cpython-311.pyc and b/.venv/Lib/site-packages/PIL/__pycache__/features.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/__pycache__/_black_version.cpython-311.pyc b/.venv/Lib/site-packages/__pycache__/_black_version.cpython-311.pyc index 1cd2029..97a2f09 100644 Binary files a/.venv/Lib/site-packages/__pycache__/_black_version.cpython-311.pyc and b/.venv/Lib/site-packages/__pycache__/_black_version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/__pycache__/mypy_extensions.cpython-311.pyc b/.venv/Lib/site-packages/__pycache__/mypy_extensions.cpython-311.pyc index 3ef719d..a7b28a8 100644 Binary files a/.venv/Lib/site-packages/__pycache__/mypy_extensions.cpython-311.pyc and b/.venv/Lib/site-packages/__pycache__/mypy_extensions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/_black_version.py b/.venv/Lib/site-packages/_black_version.py index 9342224..42a1d59 100644 --- a/.venv/Lib/site-packages/_black_version.py +++ b/.venv/Lib/site-packages/_black_version.py @@ -1 +1 @@ -version = "24.1.1" +version = "24.2.0" diff --git a/.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc index 24650b8..8a9e6cb 100644 Binary files a/.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc b/.venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc index 8a78d7c..ede8df0 100644 Binary files a/.venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc and b/.venv/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attr/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/__init__.cpython-311.pyc index cdce2ce..f8e1e49 100644 Binary files a/.venv/Lib/site-packages/attr/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/attr/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attr/__pycache__/_cmp.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/_cmp.cpython-311.pyc index e124c31..8df7080 100644 Binary files a/.venv/Lib/site-packages/attr/__pycache__/_cmp.cpython-311.pyc and b/.venv/Lib/site-packages/attr/__pycache__/_cmp.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attr/__pycache__/_compat.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/_compat.cpython-311.pyc index 1558c74..57258e6 100644 Binary files a/.venv/Lib/site-packages/attr/__pycache__/_compat.cpython-311.pyc and b/.venv/Lib/site-packages/attr/__pycache__/_compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attr/__pycache__/_config.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/_config.cpython-311.pyc index 4653d35..6dcb351 100644 Binary files a/.venv/Lib/site-packages/attr/__pycache__/_config.cpython-311.pyc and b/.venv/Lib/site-packages/attr/__pycache__/_config.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attr/__pycache__/_funcs.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/_funcs.cpython-311.pyc index 83d4146..63f4366 100644 Binary files a/.venv/Lib/site-packages/attr/__pycache__/_funcs.cpython-311.pyc and b/.venv/Lib/site-packages/attr/__pycache__/_funcs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attr/__pycache__/_make.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/_make.cpython-311.pyc index 3c59eba..11c3e44 100644 Binary files a/.venv/Lib/site-packages/attr/__pycache__/_make.cpython-311.pyc and b/.venv/Lib/site-packages/attr/__pycache__/_make.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attr/__pycache__/_next_gen.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/_next_gen.cpython-311.pyc index 2035331..1b740ba 100644 Binary files a/.venv/Lib/site-packages/attr/__pycache__/_next_gen.cpython-311.pyc and b/.venv/Lib/site-packages/attr/__pycache__/_next_gen.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attr/__pycache__/_version_info.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/_version_info.cpython-311.pyc index 811b404..630739b 100644 Binary files a/.venv/Lib/site-packages/attr/__pycache__/_version_info.cpython-311.pyc and b/.venv/Lib/site-packages/attr/__pycache__/_version_info.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attr/__pycache__/converters.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/converters.cpython-311.pyc index f005779..c2da6be 100644 Binary files a/.venv/Lib/site-packages/attr/__pycache__/converters.cpython-311.pyc and b/.venv/Lib/site-packages/attr/__pycache__/converters.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attr/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/exceptions.cpython-311.pyc index 670238a..99e66fb 100644 Binary files a/.venv/Lib/site-packages/attr/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/attr/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attr/__pycache__/filters.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/filters.cpython-311.pyc index 3f505be..64c50a5 100644 Binary files a/.venv/Lib/site-packages/attr/__pycache__/filters.cpython-311.pyc and b/.venv/Lib/site-packages/attr/__pycache__/filters.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attr/__pycache__/setters.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/setters.cpython-311.pyc index 8cda389..988b07f 100644 Binary files a/.venv/Lib/site-packages/attr/__pycache__/setters.cpython-311.pyc and b/.venv/Lib/site-packages/attr/__pycache__/setters.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attr/__pycache__/validators.cpython-311.pyc b/.venv/Lib/site-packages/attr/__pycache__/validators.cpython-311.pyc index 21c5eb1..ba4c287 100644 Binary files a/.venv/Lib/site-packages/attr/__pycache__/validators.cpython-311.pyc and b/.venv/Lib/site-packages/attr/__pycache__/validators.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attrs/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/attrs/__pycache__/__init__.cpython-311.pyc index 1aa8ede..673e2a4 100644 Binary files a/.venv/Lib/site-packages/attrs/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/attrs/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attrs/__pycache__/converters.cpython-311.pyc b/.venv/Lib/site-packages/attrs/__pycache__/converters.cpython-311.pyc index 497efdc..641c53a 100644 Binary files a/.venv/Lib/site-packages/attrs/__pycache__/converters.cpython-311.pyc and b/.venv/Lib/site-packages/attrs/__pycache__/converters.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attrs/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/attrs/__pycache__/exceptions.cpython-311.pyc index 0f90ba1..111af69 100644 Binary files a/.venv/Lib/site-packages/attrs/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/attrs/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attrs/__pycache__/filters.cpython-311.pyc b/.venv/Lib/site-packages/attrs/__pycache__/filters.cpython-311.pyc index 8158e31..873c07b 100644 Binary files a/.venv/Lib/site-packages/attrs/__pycache__/filters.cpython-311.pyc and b/.venv/Lib/site-packages/attrs/__pycache__/filters.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attrs/__pycache__/setters.cpython-311.pyc b/.venv/Lib/site-packages/attrs/__pycache__/setters.cpython-311.pyc index 11c1b08..46f686e 100644 Binary files a/.venv/Lib/site-packages/attrs/__pycache__/setters.cpython-311.pyc and b/.venv/Lib/site-packages/attrs/__pycache__/setters.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/attrs/__pycache__/validators.cpython-311.pyc b/.venv/Lib/site-packages/attrs/__pycache__/validators.cpython-311.pyc index aada14e..b0f40ff 100644 Binary files a/.venv/Lib/site-packages/attrs/__pycache__/validators.cpython-311.pyc and b/.venv/Lib/site-packages/attrs/__pycache__/validators.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black-24.1.1.dist-info/INSTALLER b/.venv/Lib/site-packages/black-24.1.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/black-24.1.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/black-24.1.1.dist-info/METADATA b/.venv/Lib/site-packages/black-24.1.1.dist-info/METADATA deleted file mode 100644 index 2887d58..0000000 --- a/.venv/Lib/site-packages/black-24.1.1.dist-info/METADATA +++ /dev/null @@ -1,1965 +0,0 @@ -Metadata-Version: 2.1 -Name: black -Version: 24.1.1 -Summary: The uncompromising code formatter. -Project-URL: Changelog, https://github.com/psf/black/blob/main/CHANGES.md -Project-URL: Homepage, https://github.com/psf/black -Author-email: Łukasz Langa -License: MIT -License-File: AUTHORS.md -License-File: LICENSE -Keywords: automation,autopep8,formatter,gofmt,pyfmt,rustfmt,yapf -Classifier: Development Status :: 5 - Production/Stable -Classifier: Environment :: Console -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Topic :: Software Development :: Libraries :: Python Modules -Classifier: Topic :: Software Development :: Quality Assurance -Requires-Python: >=3.8 -Requires-Dist: click>=8.0.0 -Requires-Dist: mypy-extensions>=0.4.3 -Requires-Dist: packaging>=22.0 -Requires-Dist: pathspec>=0.9.0 -Requires-Dist: platformdirs>=2 -Requires-Dist: tomli>=1.1.0; python_version < '3.11' -Requires-Dist: typing-extensions>=4.0.1; python_version < '3.11' -Provides-Extra: colorama -Requires-Dist: colorama>=0.4.3; extra == 'colorama' -Provides-Extra: d -Requires-Dist: aiohttp!=3.9.0,>=3.7.4; (sys_platform == 'win32' and implementation_name == 'pypy') and extra == 'd' -Requires-Dist: aiohttp>=3.7.4; (sys_platform != 'win32' or implementation_name != 'pypy') and extra == 'd' -Provides-Extra: jupyter -Requires-Dist: ipython>=7.8.0; extra == 'jupyter' -Requires-Dist: tokenize-rt>=3.2.0; extra == 'jupyter' -Provides-Extra: uvloop -Requires-Dist: uvloop>=0.15.2; extra == 'uvloop' -Description-Content-Type: text/markdown - -[![Black Logo](https://raw.githubusercontent.com/psf/black/main/docs/_static/logo2-readme.png)](https://black.readthedocs.io/en/stable/) - -

The Uncompromising Code Formatter

- -

-Actions Status -Documentation Status -Coverage Status -License: MIT -PyPI -Downloads -conda-forge -Code style: black -

- -> “Any color you like.” - -_Black_ is the uncompromising Python code formatter. By using it, you agree to cede -control over minutiae of hand-formatting. In return, _Black_ gives you speed, -determinism, and freedom from `pycodestyle` nagging about formatting. You will save time -and mental energy for more important matters. - -Blackened code looks the same regardless of the project you're reading. Formatting -becomes transparent after a while and you can focus on the content instead. - -_Black_ makes code review faster by producing the smallest diffs possible. - -Try it out now using the [Black Playground](https://black.vercel.app). Watch the -[PyCon 2019 talk](https://youtu.be/esZLCuWs_2Y) to learn more. - ---- - -**[Read the documentation on ReadTheDocs!](https://black.readthedocs.io/en/stable)** - ---- - -## Installation and usage - -### Installation - -_Black_ can be installed by running `pip install black`. It requires Python 3.8+ to run. -If you want to format Jupyter Notebooks, install with `pip install "black[jupyter]"`. - -If you can't wait for the latest _hotness_ and want to install from GitHub, use: - -`pip install git+https://github.com/psf/black` - -### Usage - -To get started right away with sensible defaults: - -```sh -black {source_file_or_directory} -``` - -You can run _Black_ as a package if running it as a script doesn't work: - -```sh -python -m black {source_file_or_directory} -``` - -Further information can be found in our docs: - -- [Usage and Configuration](https://black.readthedocs.io/en/stable/usage_and_configuration/index.html) - -_Black_ is already [successfully used](https://github.com/psf/black#used-by) by many -projects, small and big. _Black_ has a comprehensive test suite, with efficient parallel -tests, and our own auto formatting and parallel Continuous Integration runner. Now that -we have become stable, you should not expect large formatting changes in the future. -Stylistic changes will mostly be responses to bug reports and support for new Python -syntax. For more information please refer to -[The Black Code Style](https://black.readthedocs.io/en/stable/the_black_code_style/index.html). - -Also, as a safety measure which slows down processing, _Black_ will check that the -reformatted code still produces a valid AST that is effectively equivalent to the -original (see the -[Pragmatism](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#ast-before-and-after-formatting) -section for details). If you're feeling confident, use `--fast`. - -## The _Black_ code style - -_Black_ is a PEP 8 compliant opinionated formatter. _Black_ reformats entire files in -place. Style configuration options are deliberately limited and rarely added. It doesn't -take previous formatting into account (see -[Pragmatism](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#pragmatism) -for exceptions). - -Our documentation covers the current _Black_ code style, but planned changes to it are -also documented. They're both worth taking a look at: - -- [The _Black_ Code Style: Current style](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html) -- [The _Black_ Code Style: Future style](https://black.readthedocs.io/en/stable/the_black_code_style/future_style.html) - -Changes to the _Black_ code style are bound by the Stability Policy: - -- [The _Black_ Code Style: Stability Policy](https://black.readthedocs.io/en/stable/the_black_code_style/index.html#stability-policy) - -Please refer to this document before submitting an issue. What seems like a bug might be -intended behaviour. - -### Pragmatism - -Early versions of _Black_ used to be absolutist in some respects. They took after its -initial author. This was fine at the time as it made the implementation simpler and -there were not many users anyway. Not many edge cases were reported. As a mature tool, -_Black_ does make some exceptions to rules it otherwise holds. - -- [The _Black_ code style: Pragmatism](https://black.readthedocs.io/en/stable/the_black_code_style/current_style.html#pragmatism) - -Please refer to this document before submitting an issue just like with the document -above. What seems like a bug might be intended behaviour. - -## Configuration - -_Black_ is able to read project-specific default values for its command line options -from a `pyproject.toml` file. This is especially useful for specifying custom -`--include` and `--exclude`/`--force-exclude`/`--extend-exclude` patterns for your -project. - -You can find more details in our documentation: - -- [The basics: Configuration via a file](https://black.readthedocs.io/en/stable/usage_and_configuration/the_basics.html#configuration-via-a-file) - -And if you're looking for more general configuration documentation: - -- [Usage and Configuration](https://black.readthedocs.io/en/stable/usage_and_configuration/index.html) - -**Pro-tip**: If you're asking yourself "Do I need to configure anything?" the answer is -"No". _Black_ is all about sensible defaults. Applying those defaults will have your -code in compliance with many other _Black_ formatted projects. - -## Used by - -The following notable open-source projects trust _Black_ with enforcing a consistent -code style: pytest, tox, Pyramid, Django, Django Channels, Hypothesis, attrs, -SQLAlchemy, Poetry, PyPA applications (Warehouse, Bandersnatch, Pipenv, virtualenv), -pandas, Pillow, Twisted, LocalStack, every Datadog Agent Integration, Home Assistant, -Zulip, Kedro, OpenOA, FLORIS, ORBIT, WOMBAT, and many more. - -The following organizations use _Black_: Facebook, Dropbox, KeepTruckin, Lyft, Mozilla, -Quora, Duolingo, QuantumBlack, Tesla, Archer Aviation. - -Are we missing anyone? Let us know. - -## Testimonials - -**Mike Bayer**, [author of `SQLAlchemy`](https://www.sqlalchemy.org/): - -> I can't think of any single tool in my entire programming career that has given me a -> bigger productivity increase by its introduction. I can now do refactorings in about -> 1% of the keystrokes that it would have taken me previously when we had no way for -> code to format itself. - -**Dusty Phillips**, -[writer](https://smile.amazon.com/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=dusty+phillips): - -> _Black_ is opinionated so you don't have to be. - -**Hynek Schlawack**, [creator of `attrs`](https://www.attrs.org/), core developer of -Twisted and CPython: - -> An auto-formatter that doesn't suck is all I want for Xmas! - -**Carl Meyer**, [Django](https://www.djangoproject.com/) core developer: - -> At least the name is good. - -**Kenneth Reitz**, creator of [`requests`](https://requests.readthedocs.io/en/latest/) -and [`pipenv`](https://readthedocs.org/projects/pipenv/): - -> This vastly improves the formatting of our code. Thanks a ton! - -## Show your style - -Use the badge in your project's README.md: - -```md -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) -``` - -Using the badge in README.rst: - -``` -.. image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://github.com/psf/black -``` - -Looks like this: -[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/psf/black) - -## License - -MIT - -## Contributing - -Welcome! Happy to see you willing to make the project better. You can get started by -reading this: - -- [Contributing: The basics](https://black.readthedocs.io/en/latest/contributing/the_basics.html) - -You can also take a look at the rest of the contributing docs or talk with the -developers: - -- [Contributing documentation](https://black.readthedocs.io/en/latest/contributing/index.html) -- [Chat on Discord](https://discord.gg/RtVdv86PrH) - -## Change log - -The log has become rather long. It moved to its own file. - -See [CHANGES](https://black.readthedocs.io/en/latest/change_log.html). - -## Authors - -The author list is quite long nowadays, so it lives in its own file. - -See [AUTHORS.md](./AUTHORS.md) - -## Code of Conduct - -Everyone participating in the _Black_ project, and in particular in the issue tracker, -pull requests, and social media activity, is expected to treat other people with respect -and more generally to follow the guidelines articulated in the -[Python Community Code of Conduct](https://www.python.org/psf/codeofconduct/). - -At the same time, humor is encouraged. In fact, basic familiarity with Monty Python's -Flying Circus is expected. We are not savages. - -And if you _really_ need to slap somebody, do it with a fish while dancing. -# Change Log - -## 24.1.1 - -Bugfix release to fix a bug that made Black unusable on certain file systems with strict -limits on path length. - -### Preview style - -- Consistently add trailing comma on typed parameters (#4164) - -### Configuration - -- Shorten the length of the name of the cache file to fix crashes on file systems that - do not support long paths (#4176) - -## 24.1.0 - -### Highlights - -This release introduces the new 2024 stable style (#4106), stabilizing the following -changes: - -- Add parentheses around `if`-`else` expressions (#2278) -- Dummy class and function implementations consisting only of `...` are formatted more - compactly (#3796) -- If an assignment statement is too long, we now prefer splitting on the right-hand side - (#3368) -- Hex codes in Unicode escape sequences are now standardized to lowercase (#2916) -- Allow empty first lines at the beginning of most blocks (#3967, #4061) -- Add parentheses around long type annotations (#3899) -- Enforce newline after module docstrings (#3932, #4028) -- Fix incorrect magic trailing comma handling in return types (#3916) -- Remove blank lines before class docstrings (#3692) -- Wrap multiple context managers in parentheses if combined in a single `with` statement - (#3489) -- Fix bug in line length calculations for power operations (#3942) -- Add trailing commas to collection literals even if there's a comment after the last - entry (#3393) -- When using `--skip-magic-trailing-comma` or `-C`, trailing commas are stripped from - subscript expressions with more than 1 element (#3209) -- Add extra blank lines in stubs in a few cases (#3564, #3862) -- Accept raw strings as docstrings (#3947) -- Split long lines in case blocks (#4024) -- Stop removing spaces from walrus operators within subscripts (#3823) -- Fix incorrect formatting of certain async statements (#3609) -- Allow combining `# fmt: skip` with other comments (#3959) - -There are already a few improvements in the `--preview` style, which are slated for the -2025 stable style. Try them out and -[share your feedback](https://github.com/psf/black/issues). In the past, the preview -style has included some features that we were not able to stabilize. This year, we're -adding a separate `--unstable` style for features with known problems. Now, the -`--preview` style only includes features that we actually expect to make it into next -year's stable style. - -### Stable style - -Several bug fixes were made in features that are moved to the stable style in this -release: - -- Fix comment handling when parenthesising conditional expressions (#4134) -- Fix bug where spaces were not added around parenthesized walruses in subscripts, - unlike other binary operators (#4109) -- Remove empty lines before docstrings in async functions (#4132) -- Address a missing case in the change to allow empty lines at the beginning of all - blocks, except immediately before a docstring (#4130) -- For stubs, fix logic to enforce empty line after nested classes with bodies (#4141) - -### Preview style - -- Add `--unstable` style, covering preview features that have known problems that would - block them from going into the stable style. Also add the `--enable-unstable-feature` - flag; for example, use - `--enable-unstable-feature hug_parens_with_braces_and_square_brackets` to apply this - preview feature throughout 2024, even if a later Black release downgrades the feature - to unstable (#4096) -- Format module docstrings the same as class and function docstrings (#4095) -- Fix crash when using a walrus in a dictionary (#4155) -- Fix unnecessary parentheses when wrapping long dicts (#4135) -- Stop normalizing spaces before `# fmt: skip` comments (#4146) - -### Configuration - -- Print warning when configuration in `pyproject.toml` contains an invalid key (#4165) -- Fix symlink handling, properly ignoring symlinks that point outside of root (#4161) -- Fix cache mtime logic that resulted in false positive cache hits (#4128) -- Remove the long-deprecated `--experimental-string-processing` flag. This feature can - currently be enabled with `--preview --enable-unstable-feature string_processing`. - (#4096) - -### Integrations - -- Revert the change to run Black's pre-commit integration only on specific git hooks - (#3940) for better compatibility with older versions of pre-commit (#4137) - -## 23.12.1 - -### Packaging - -- Fixed a bug that included dependencies from the `d` extra by default (#4108) - -## 23.12.0 - -### Highlights - -It's almost 2024, which means it's time for a new edition of _Black_'s stable style! -Together with this release, we'll put out an alpha release 24.1a1 showcasing the draft -2024 stable style, which we'll finalize in the January release. Please try it out and -[share your feedback](https://github.com/psf/black/issues/4042). - -This release (23.12.0) will still produce the 2023 style. Most but not all of the -changes in `--preview` mode will be in the 2024 stable style. - -### Stable style - -- Fix bug where `# fmt: off` automatically dedents when used with the `--line-ranges` - option, even when it is not within the specified line range. (#4084) -- Fix feature detection for parenthesized context managers (#4104) - -### Preview style - -- Prefer more equal signs before a break when splitting chained assignments (#4010) -- Standalone form feed characters at the module level are no longer removed (#4021) -- Additional cases of immediately nested tuples, lists, and dictionaries are now - indented less (#4012) -- Allow empty lines at the beginning of all blocks, except immediately before a - docstring (#4060) -- Fix crash in preview mode when using a short `--line-length` (#4086) -- Keep suites consisting of only an ellipsis on their own lines if they are not - functions or class definitions (#4066) (#4103) - -### Configuration - -- `--line-ranges` now skips _Black_'s internal stability check in `--safe` mode. This - avoids a crash on rare inputs that have many unformatted same-content lines. (#4034) - -### Packaging - -- Upgrade to mypy 1.7.1 (#4049) (#4069) -- Faster compiled wheels are now available for CPython 3.12 (#4070) - -### Integrations - -- Enable 3.12 CI (#4035) -- Build docker images in parallel (#4054) -- Build docker images with 3.12 (#4055) - -## 23.11.0 - -### Highlights - -- Support formatting ranges of lines with the new `--line-ranges` command-line option - (#4020) - -### Stable style - -- Fix crash on formatting bytes strings that look like docstrings (#4003) -- Fix crash when whitespace followed a backslash before newline in a docstring (#4008) -- Fix standalone comments inside complex blocks crashing Black (#4016) -- Fix crash on formatting code like `await (a ** b)` (#3994) -- No longer treat leading f-strings as docstrings. This matches Python's behaviour and - fixes a crash (#4019) - -### Preview style - -- Multiline dicts and lists that are the sole argument to a function are now indented - less (#3964) -- Multiline unpacked dicts and lists as the sole argument to a function are now also - indented less (#3992) -- In f-string debug expressions, quote types that are visible in the final string are - now preserved (#4005) -- Fix a bug where long `case` blocks were not split into multiple lines. Also enable - general trailing comma rules on `case` blocks (#4024) -- Keep requiring two empty lines between module-level docstring and first function or - class definition (#4028) -- Add support for single-line format skip with other comments on the same line (#3959) - -### Configuration - -- Consistently apply force exclusion logic before resolving symlinks (#4015) -- Fix a bug in the matching of absolute path names in `--include` (#3976) - -### Performance - -- Fix mypyc builds on arm64 on macOS (#4017) - -### Integrations - -- Black's pre-commit integration will now run only on git hooks appropriate for a code - formatter (#3940) - -## 23.10.1 - -### Highlights - -- Maintenance release to get a fix out for GitHub Action edge case (#3957) - -### Preview style - -- Fix merging implicit multiline strings that have inline comments (#3956) -- Allow empty first line after block open before a comment or compound statement (#3967) - -### Packaging - -- Change Dockerfile to hatch + compile black (#3965) - -### Integrations - -- The summary output for GitHub workflows is now suppressible using the `summary` - parameter. (#3958) -- Fix the action failing when Black check doesn't pass (#3957) - -### Documentation - -- It is known Windows documentation CI is broken - https://github.com/psf/black/issues/3968 - -## 23.10.0 - -### Stable style - -- Fix comments getting removed from inside parenthesized strings (#3909) - -### Preview style - -- Fix long lines with power operators getting split before the line length (#3942) -- Long type hints are now wrapped in parentheses and properly indented when split across - multiple lines (#3899) -- Magic trailing commas are now respected in return types. (#3916) -- Require one empty line after module-level docstrings. (#3932) -- Treat raw triple-quoted strings as docstrings (#3947) - -### Configuration - -- Fix cache versioning logic when `BLACK_CACHE_DIR` is set (#3937) - -### Parser - -- Fix bug where attributes named `type` were not accepted inside `match` statements - (#3950) -- Add support for PEP 695 type aliases containing lambdas and other unusual expressions - (#3949) - -### Output - -- Black no longer attempts to provide special errors for attempting to format Python 2 - code (#3933) -- Black will more consistently print stacktraces on internal errors in verbose mode - (#3938) - -### Integrations - -- The action output displayed in the job summary is now wrapped in Markdown (#3914) - -## 23.9.1 - -Due to various issues, the previous release (23.9.0) did not include compiled mypyc -wheels, which make Black significantly faster. These issues have now been fixed, and -this release should come with compiled wheels once again. - -There will be no wheels for Python 3.12 due to a bug in mypyc. We will provide 3.12 -wheels in a future release as soon as the mypyc bug is fixed. - -### Packaging - -- Upgrade to mypy 1.5.1 (#3864) - -### Performance - -- Store raw tuples instead of NamedTuples in Black's cache, improving performance and - decreasing the size of the cache (#3877) - -## 23.9.0 - -### Preview style - -- More concise formatting for dummy implementations (#3796) -- In stub files, add a blank line between a statement with a body (e.g an - `if sys.version_info > (3, x):`) and a function definition on the same level (#3862) -- Fix a bug whereby spaces were removed from walrus operators within subscript(#3823) - -### Configuration - -- Black now applies exclusion and ignore logic before resolving symlinks (#3846) - -### Performance - -- Avoid importing `IPython` if notebook cells do not contain magics (#3782) -- Improve caching by comparing file hashes as fallback for mtime and size (#3821) - -### _Blackd_ - -- Fix an issue in `blackd` with single character input (#3558) - -### Integrations - -- Black now has an - [official pre-commit mirror](https://github.com/psf/black-pre-commit-mirror). Swapping - `https://github.com/psf/black` to `https://github.com/psf/black-pre-commit-mirror` in - your `.pre-commit-config.yaml` will make Black about 2x faster (#3828) -- The `.black.env` folder specified by `ENV_PATH` will now be removed on the completion - of the GitHub Action (#3759) - -## 23.7.0 - -### Highlights - -- Runtime support for Python 3.7 has been removed. Formatting 3.7 code will still be - supported until further notice (#3765) - -### Stable style - -- Fix a bug where an illegal trailing comma was added to return type annotations using - PEP 604 unions (#3735) -- Fix several bugs and crashes where comments in stub files were removed or mishandled - under some circumstances (#3745) -- Fix a crash with multi-line magic comments like `type: ignore` within parentheses - (#3740) -- Fix error in AST validation when _Black_ removes trailing whitespace in a type comment - (#3773) - -### Preview style - -- Implicitly concatenated strings used as function args are no longer wrapped inside - parentheses (#3640) -- Remove blank lines between a class definition and its docstring (#3692) - -### Configuration - -- The `--workers` argument to _Black_ can now be specified via the `BLACK_NUM_WORKERS` - environment variable (#3743) -- `.pytest_cache`, `.ruff_cache` and `.vscode` are now excluded by default (#3691) -- Fix _Black_ not honouring `pyproject.toml` settings when running `--stdin-filename` - and the `pyproject.toml` found isn't in the current working directory (#3719) -- _Black_ will now error if `exclude` and `extend-exclude` have invalid data types in - `pyproject.toml`, instead of silently doing the wrong thing (#3764) - -### Packaging - -- Upgrade mypyc from 0.991 to 1.3 (#3697) -- Remove patching of Click that mitigated errors on Python 3.6 with `LANG=C` (#3768) - -### Parser - -- Add support for the new PEP 695 syntax in Python 3.12 (#3703) - -### Performance - -- Speed up _Black_ significantly when the cache is full (#3751) -- Avoid importing `IPython` in a case where we wouldn't need it (#3748) - -### Output - -- Use aware UTC datetimes internally, avoids deprecation warning on Python 3.12 (#3728) -- Change verbose logging to exactly mirror _Black_'s logic for source discovery (#3749) - -### _Blackd_ - -- The `blackd` argument parser now shows the default values for options in their help - text (#3712) - -### Integrations - -- Black is now tested with - [`PYTHONWARNDEFAULTENCODING = 1`](https://docs.python.org/3/library/io.html#io-encoding-warning) - (#3763) -- Update GitHub Action to display black output in the job summary (#3688) - -### Documentation - -- Add a CITATION.cff file to the root of the repository, containing metadata on how to - cite this software (#3723) -- Update the _classes_ and _exceptions_ documentation in Developer reference to match - the latest code base (#3755) - -## 23.3.0 - -### Highlights - -This release fixes a longstanding confusing behavior in Black's GitHub action, where the -version of the action did not determine the version of Black being run (issue #3382). In -addition, there is a small bug fix around imports and a number of improvements to the -preview style. - -Please try out the -[preview style](https://black.readthedocs.io/en/stable/the_black_code_style/future_style.html#preview-style) -with `black --preview` and tell us your feedback. All changes in the preview style are -expected to become part of Black's stable style in January 2024. - -### Stable style - -- Import lines with `# fmt: skip` and `# fmt: off` no longer have an extra blank line - added when they are right after another import line (#3610) - -### Preview style - -- Add trailing commas to collection literals even if there's a comment after the last - entry (#3393) -- `async def`, `async for`, and `async with` statements are now formatted consistently - compared to their non-async version. (#3609) -- `with` statements that contain two context managers will be consistently wrapped in - parentheses (#3589) -- Let string splitters respect [East Asian Width](https://www.unicode.org/reports/tr11/) - (#3445) -- Now long string literals can be split after East Asian commas and periods (`、` U+3001 - IDEOGRAPHIC COMMA, `。` U+3002 IDEOGRAPHIC FULL STOP, & `,` U+FF0C FULLWIDTH COMMA) - besides before spaces (#3445) -- For stubs, enforce one blank line after a nested class with a body other than just - `...` (#3564) -- Improve handling of multiline strings by changing line split behavior (#1879) - -### Parser - -- Added support for formatting files with invalid type comments (#3594) - -### Integrations - -- Update GitHub Action to use the version of Black equivalent to action's version if - version input is not specified (#3543) -- Fix missing Python binary path in autoload script for vim (#3508) - -### Documentation - -- Document that only the most recent release is supported for security issues; - vulnerabilities should be reported through Tidelift (#3612) - -## 23.1.0 - -### Highlights - -This is the first release of 2023, and following our -[stability policy](https://black.readthedocs.io/en/stable/the_black_code_style/index.html#stability-policy), -it comes with a number of improvements to our stable style, including improvements to -empty line handling, removal of redundant parentheses in several contexts, and output -that highlights implicitly concatenated strings better. - -There are also many changes to the preview style; try out `black --preview` and give us -feedback to help us set the stable style for next year. - -In addition to style changes, Black now automatically infers the supported Python -versions from your `pyproject.toml` file, removing the need to set Black's target -versions separately. - -### Stable style - -- Introduce the 2023 stable style, which incorporates most aspects of last year's - preview style (#3418). Specific changes: - - Enforce empty lines before classes and functions with sticky leading comments - (#3302) (22.12.0) - - Reformat empty and whitespace-only files as either an empty file (if no newline is - present) or as a single newline character (if a newline is present) (#3348) - (22.12.0) - - Implicitly concatenated strings used as function args are now wrapped inside - parentheses (#3307) (22.12.0) - - Correctly handle trailing commas that are inside a line's leading non-nested parens - (#3370) (22.12.0) - - `--skip-string-normalization` / `-S` now prevents docstring prefixes from being - normalized as expected (#3168) (since 22.8.0) - - When using `--skip-magic-trailing-comma` or `-C`, trailing commas are stripped from - subscript expressions with more than 1 element (#3209) (22.8.0) - - Implicitly concatenated strings inside a list, set, or tuple are now wrapped inside - parentheses (#3162) (22.8.0) - - Fix a string merging/split issue when a comment is present in the middle of - implicitly concatenated strings on its own line (#3227) (22.8.0) - - Docstring quotes are no longer moved if it would violate the line length limit - (#3044, #3430) (22.6.0) - - Parentheses around return annotations are now managed (#2990) (22.6.0) - - Remove unnecessary parentheses around awaited objects (#2991) (22.6.0) - - Remove unnecessary parentheses in `with` statements (#2926) (22.6.0) - - Remove trailing newlines after code block open (#3035) (22.6.0) - - Code cell separators `#%%` are now standardised to `# %%` (#2919) (22.3.0) - - Remove unnecessary parentheses from `except` statements (#2939) (22.3.0) - - Remove unnecessary parentheses from tuple unpacking in `for` loops (#2945) (22.3.0) - - Avoid magic-trailing-comma in single-element subscripts (#2942) (22.3.0) -- Fix a crash when a colon line is marked between `# fmt: off` and `# fmt: on` (#3439) - -### Preview style - -- Format hex codes in unicode escape sequences in string literals (#2916) -- Add parentheses around `if`-`else` expressions (#2278) -- Improve performance on large expressions that contain many strings (#3467) -- Fix a crash in preview style with assert + parenthesized string (#3415) -- Fix crashes in preview style with walrus operators used in function return annotations - and except clauses (#3423) -- Fix a crash in preview advanced string processing where mixed implicitly concatenated - regular and f-strings start with an empty span (#3463) -- Fix a crash in preview advanced string processing where a standalone comment is placed - before a dict's value (#3469) -- Fix an issue where extra empty lines are added when a decorator has `# fmt: skip` - applied or there is a standalone comment between decorators (#3470) -- Do not put the closing quotes in a docstring on a separate line, even if the line is - too long (#3430) -- Long values in dict literals are now wrapped in parentheses; correspondingly - unnecessary parentheses around short values in dict literals are now removed; long - string lambda values are now wrapped in parentheses (#3440) -- Fix two crashes in preview style involving edge cases with docstrings (#3451) -- Exclude string type annotations from improved string processing; fix crash when the - return type annotation is stringified and spans across multiple lines (#3462) -- Wrap multiple context managers in parentheses when targeting Python 3.9+ (#3489) -- Fix several crashes in preview style with walrus operators used in `with` statements - or tuples (#3473) -- Fix an invalid quote escaping bug in f-string expressions where it produced invalid - code. Implicitly concatenated f-strings with different quotes can now be merged or - quote-normalized by changing the quotes used in expressions. (#3509) -- Fix crash on `await (yield)` when Black is compiled with mypyc (#3533) - -### Configuration - -- Black now tries to infer its `--target-version` from the project metadata specified in - `pyproject.toml` (#3219) - -### Packaging - -- Upgrade mypyc from `0.971` to `0.991` so mypycified _Black_ can be built on armv7 - (#3380) - - This also fixes some crashes while using compiled Black with a debug build of - CPython -- Drop specific support for the `tomli` requirement on 3.11 alpha releases, working - around a bug that would cause the requirement not to be installed on any non-final - Python releases (#3448) -- Black now depends on `packaging` version `22.0` or later. This is required for new - functionality that needs to parse part of the project metadata (#3219) - -### Output - -- Calling `black --help` multiple times will return the same help contents each time - (#3516) -- Verbose logging now shows the values of `pyproject.toml` configuration variables - (#3392) -- Fix false symlink detection messages in verbose output due to using an incorrect - relative path to the project root (#3385) - -### Integrations - -- Move 3.11 CI to normal flow now that all dependencies support 3.11 (#3446) -- Docker: Add new `latest_prerelease` tag automation to follow latest black alpha - release on docker images (#3465) - -### Documentation - -- Expand `vim-plug` installation instructions to offer more explicit options (#3468) - -## 22.12.0 - -### Preview style - -- Enforce empty lines before classes and functions with sticky leading comments (#3302) -- Reformat empty and whitespace-only files as either an empty file (if no newline is - present) or as a single newline character (if a newline is present) (#3348) -- Implicitly concatenated strings used as function args are now wrapped inside - parentheses (#3307) -- For assignment statements, prefer splitting the right hand side if the left hand side - fits on a single line (#3368) -- Correctly handle trailing commas that are inside a line's leading non-nested parens - (#3370) - -### Configuration - -- Fix incorrectly applied `.gitignore` rules by considering the `.gitignore` location - and the relative path to the target file (#3338) -- Fix incorrectly ignoring `.gitignore` presence when more than one source directory is - specified (#3336) - -### Parser - -- Parsing support has been added for walruses inside generator expression that are - passed as function args (for example, - `any(match := my_re.match(text) for text in texts)`) (#3327). - -### Integrations - -- Vim plugin: Optionally allow using the system installation of Black via - `let g:black_use_virtualenv = 0`(#3309) - -## 22.10.0 - -### Highlights - -- Runtime support for Python 3.6 has been removed. Formatting 3.6 code will still be - supported until further notice. - -### Stable style - -- Fix a crash when `# fmt: on` is used on a different block level than `# fmt: off` - (#3281) - -### Preview style - -- Fix a crash when formatting some dicts with parenthesis-wrapped long string keys - (#3262) - -### Configuration - -- `.ipynb_checkpoints` directories are now excluded by default (#3293) -- Add `--skip-source-first-line` / `-x` option to ignore the first line of source code - while formatting (#3299) - -### Packaging - -- Executables made with PyInstaller will no longer crash when formatting several files - at once on macOS. Native x86-64 executables for macOS are available once again. - (#3275) -- Hatchling is now used as the build backend. This will not have any effect for users - who install Black with its wheels from PyPI. (#3233) -- Faster compiled wheels are now available for CPython 3.11 (#3276) - -### _Blackd_ - -- Windows style (CRLF) newlines will be preserved (#3257). - -### Integrations - -- Vim plugin: add flag (`g:black_preview`) to enable/disable the preview style (#3246) -- Update GitHub Action to support formatting of Jupyter Notebook files via a `jupyter` - option (#3282) -- Update GitHub Action to support use of version specifiers (e.g. `<23`) for Black - version (#3265) - -## 22.8.0 - -### Highlights - -- Python 3.11 is now supported, except for _blackd_ as aiohttp does not support 3.11 as - of publishing (#3234) -- This is the last release that supports running _Black_ on Python 3.6 (formatting 3.6 - code will continue to be supported until further notice) -- Reword the stability policy to say that we may, in rare cases, make changes that - affect code that was not previously formatted by _Black_ (#3155) - -### Stable style - -- Fix an infinite loop when using `# fmt: on/off` in the middle of an expression or code - block (#3158) -- Fix incorrect handling of `# fmt: skip` on colon (`:`) lines (#3148) -- Comments are no longer deleted when a line had spaces removed around power operators - (#2874) - -### Preview style - -- Single-character closing docstring quotes are no longer moved to their own line as - this is invalid. This was a bug introduced in version 22.6.0. (#3166) -- `--skip-string-normalization` / `-S` now prevents docstring prefixes from being - normalized as expected (#3168) -- When using `--skip-magic-trailing-comma` or `-C`, trailing commas are stripped from - subscript expressions with more than 1 element (#3209) -- Implicitly concatenated strings inside a list, set, or tuple are now wrapped inside - parentheses (#3162) -- Fix a string merging/split issue when a comment is present in the middle of implicitly - concatenated strings on its own line (#3227) - -### _Blackd_ - -- `blackd` now supports enabling the preview style via the `X-Preview` header (#3217) - -### Configuration - -- Black now uses the presence of debug f-strings to detect target version (#3215) -- Fix misdetection of project root and verbose logging of sources in cases involving - `--stdin-filename` (#3216) -- Immediate `.gitignore` files in source directories given on the command line are now - also respected, previously only `.gitignore` files in the project root and - automatically discovered directories were respected (#3237) - -### Documentation - -- Recommend using BlackConnect in IntelliJ IDEs (#3150) - -### Integrations - -- Vim plugin: prefix messages with `Black: ` so it's clear they come from Black (#3194) -- Docker: changed to a /opt/venv installation + added to PATH to be available to - non-root users (#3202) - -### Output - -- Change from deprecated `asyncio.get_event_loop()` to create our event loop which - removes DeprecationWarning (#3164) -- Remove logging from internal `blib2to3` library since it regularly emits error logs - about failed caching that can and should be ignored (#3193) - -### Parser - -- Type comments are now included in the AST equivalence check consistently so accidental - deletion raises an error. Though type comments can't be tracked when running on PyPy - 3.7 due to standard library limitations. (#2874) - -### Performance - -- Reduce Black's startup time when formatting a single file by 15-30% (#3211) - -## 22.6.0 - -### Style - -- Fix unstable formatting involving `#fmt: skip` and `# fmt:skip` comments (notice the - lack of spaces) (#2970) - -### Preview style - -- Docstring quotes are no longer moved if it would violate the line length limit (#3044) -- Parentheses around return annotations are now managed (#2990) -- Remove unnecessary parentheses around awaited objects (#2991) -- Remove unnecessary parentheses in `with` statements (#2926) -- Remove trailing newlines after code block open (#3035) - -### Integrations - -- Add `scripts/migrate-black.py` script to ease introduction of Black to a Git project - (#3038) - -### Output - -- Output Python version and implementation as part of `--version` flag (#2997) - -### Packaging - -- Use `tomli` instead of `tomllib` on Python 3.11 builds where `tomllib` is not - available (#2987) - -### Parser - -- [PEP 654](https://peps.python.org/pep-0654/#except) syntax (for example, - `except *ExceptionGroup:`) is now supported (#3016) -- [PEP 646](https://peps.python.org/pep-0646) syntax (for example, - `Array[Batch, *Shape]` or `def fn(*args: *T) -> None`) is now supported (#3071) - -### Vim Plugin - -- Fix `strtobool` function. It didn't parse true/on/false/off. (#3025) - -## 22.3.0 - -### Preview style - -- Code cell separators `#%%` are now standardised to `# %%` (#2919) -- Remove unnecessary parentheses from `except` statements (#2939) -- Remove unnecessary parentheses from tuple unpacking in `for` loops (#2945) -- Avoid magic-trailing-comma in single-element subscripts (#2942) - -### Configuration - -- Do not format `__pypackages__` directories by default (#2836) -- Add support for specifying stable version with `--required-version` (#2832). -- Avoid crashing when the user has no homedir (#2814) -- Avoid crashing when md5 is not available (#2905) -- Fix handling of directory junctions on Windows (#2904) - -### Documentation - -- Update pylint config documentation (#2931) - -### Integrations - -- Move test to disable plugin in Vim/Neovim, which speeds up loading (#2896) - -### Output - -- In verbose mode, log when _Black_ is using user-level config (#2861) - -### Packaging - -- Fix Black to work with Click 8.1.0 (#2966) -- On Python 3.11 and newer, use the standard library's `tomllib` instead of `tomli` - (#2903) -- `black-primer`, the deprecated internal devtool, has been removed and copied to a - [separate repository](https://github.com/cooperlees/black-primer) (#2924) - -### Parser - -- Black can now parse starred expressions in the target of `for` and `async for` - statements, e.g `for item in *items_1, *items_2: pass` (#2879). - -## 22.1.0 - -At long last, _Black_ is no longer a beta product! This is the first non-beta release -and the first release covered by our new -[stability policy](https://black.readthedocs.io/en/stable/the_black_code_style/index.html#stability-policy). - -### Highlights - -- **Remove Python 2 support** (#2740) -- Introduce the `--preview` flag (#2752) - -### Style - -- Deprecate `--experimental-string-processing` and move the functionality under - `--preview` (#2789) -- For stubs, one blank line between class attributes and methods is now kept if there's - at least one pre-existing blank line (#2736) -- Black now normalizes string prefix order (#2297) -- Remove spaces around power operators if both operands are simple (#2726) -- Work around bug that causes unstable formatting in some cases in the presence of the - magic trailing comma (#2807) -- Use parentheses for attribute access on decimal float and int literals (#2799) -- Don't add whitespace for attribute access on hexadecimal, binary, octal, and complex - literals (#2799) -- Treat blank lines in stubs the same inside top-level `if` statements (#2820) -- Fix unstable formatting with semicolons and arithmetic expressions (#2817) -- Fix unstable formatting around magic trailing comma (#2572) - -### Parser - -- Fix mapping cases that contain as-expressions, like `case {"key": 1 | 2 as password}` - (#2686) -- Fix cases that contain multiple top-level as-expressions, like `case 1 as a, 2 as b` - (#2716) -- Fix call patterns that contain as-expressions with keyword arguments, like - `case Foo(bar=baz as quux)` (#2749) -- Tuple unpacking on `return` and `yield` constructs now implies 3.8+ (#2700) -- Unparenthesized tuples on annotated assignments (e.g - `values: Tuple[int, ...] = 1, 2, 3`) now implies 3.8+ (#2708) -- Fix handling of standalone `match()` or `case()` when there is a trailing newline or a - comment inside of the parentheses. (#2760) -- `from __future__ import annotations` statement now implies Python 3.7+ (#2690) - -### Performance - -- Speed-up the new backtracking parser about 4X in general (enabled when - `--target-version` is set to 3.10 and higher). (#2728) -- _Black_ is now compiled with [mypyc](https://github.com/mypyc/mypyc) for an overall 2x - speed-up. 64-bit Windows, MacOS, and Linux (not including musl) are supported. (#1009, - #2431) - -### Configuration - -- Do not accept bare carriage return line endings in pyproject.toml (#2408) -- Add configuration option (`python-cell-magics`) to format cells with custom magics in - Jupyter Notebooks (#2744) -- Allow setting custom cache directory on all platforms with environment variable - `BLACK_CACHE_DIR` (#2739). -- Enable Python 3.10+ by default, without any extra need to specify - `--target-version=py310`. (#2758) -- Make passing `SRC` or `--code` mandatory and mutually exclusive (#2804) - -### Output - -- Improve error message for invalid regular expression (#2678) -- Improve error message when parsing fails during AST safety check by embedding the - underlying SyntaxError (#2693) -- No longer color diff headers white as it's unreadable in light themed terminals - (#2691) -- Text coloring added in the final statistics (#2712) -- Verbose mode also now describes how a project root was discovered and which paths will - be formatted. (#2526) - -### Packaging - -- All upper version bounds on dependencies have been removed (#2718) -- `typing-extensions` is no longer a required dependency in Python 3.10+ (#2772) -- Set `click` lower bound to `8.0.0` (#2791) - -### Integrations - -- Update GitHub action to support containerized runs (#2748) - -### Documentation - -- Change protocol in pip installation instructions to `https://` (#2761) -- Change HTML theme to Furo primarily for its responsive design and mobile support - (#2793) -- Deprecate the `black-primer` tool (#2809) -- Document Python support policy (#2819) - -## 21.12b0 - -### _Black_ - -- Fix determination of f-string expression spans (#2654) -- Fix bad formatting of error messages about EOF in multi-line statements (#2343) -- Functions and classes in blocks now have more consistent surrounding spacing (#2472) - -#### Jupyter Notebook support - -- Cell magics are now only processed if they are known Python cell magics. Earlier, all - cell magics were tokenized, leading to possible indentation errors e.g. with - `%%writefile`. (#2630) -- Fix assignment to environment variables in Jupyter Notebooks (#2642) - -#### Python 3.10 support - -- Point users to using `--target-version py310` if we detect 3.10-only syntax (#2668) -- Fix `match` statements with open sequence subjects, like `match a, b:` or - `match a, *b:` (#2639) (#2659) -- Fix `match`/`case` statements that contain `match`/`case` soft keywords multiple - times, like `match re.match()` (#2661) -- Fix `case` statements with an inline body (#2665) -- Fix styling of starred expressions inside `match` subject (#2667) -- Fix parser error location on invalid syntax in a `match` statement (#2649) -- Fix Python 3.10 support on platforms without ProcessPoolExecutor (#2631) -- Improve parsing performance on code that uses `match` under `--target-version py310` - up to ~50% (#2670) - -### Packaging - -- Remove dependency on `regex` (#2644) (#2663) - -## 21.11b1 - -### _Black_ - -- Bumped regex version minimum to 2021.4.4 to fix Pattern class usage (#2621) - -## 21.11b0 - -### _Black_ - -- Warn about Python 2 deprecation in more cases by improving Python 2 only syntax - detection (#2592) -- Add experimental PyPy support (#2559) -- Add partial support for the match statement. As it's experimental, it's only enabled - when `--target-version py310` is explicitly specified (#2586) -- Add support for parenthesized with (#2586) -- Declare support for Python 3.10 for running Black (#2562) - -### Integrations - -- Fixed vim plugin with Python 3.10 by removing deprecated distutils import (#2610) -- The vim plugin now parses `skip_magic_trailing_comma` from pyproject.toml (#2613) - -## 21.10b0 - -### _Black_ - -- Document stability policy, that will apply for non-beta releases (#2529) -- Add new `--workers` parameter (#2514) -- Fixed feature detection for positional-only arguments in lambdas (#2532) -- Bumped typed-ast version minimum to 1.4.3 for 3.10 compatibility (#2519) -- Fixed a Python 3.10 compatibility issue where the loop argument was still being passed - even though it has been removed (#2580) -- Deprecate Python 2 formatting support (#2523) - -### _Blackd_ - -- Remove dependency on aiohttp-cors (#2500) -- Bump required aiohttp version to 3.7.4 (#2509) - -### _Black-Primer_ - -- Add primer support for --projects (#2555) -- Print primer summary after individual failures (#2570) - -### Integrations - -- Allow to pass `target_version` in the vim plugin (#1319) -- Install build tools in docker file and use multi-stage build to keep the image size - down (#2582) - -## 21.9b0 - -### Packaging - -- Fix missing modules in self-contained binaries (#2466) -- Fix missing toml extra used during installation (#2475) - -## 21.8b0 - -### _Black_ - -- Add support for formatting Jupyter Notebook files (#2357) -- Move from `appdirs` dependency to `platformdirs` (#2375) -- Present a more user-friendly error if .gitignore is invalid (#2414) -- The failsafe for accidentally added backslashes in f-string expressions has been - hardened to handle more edge cases during quote normalization (#2437) -- Avoid changing a function return type annotation's type to a tuple by adding a - trailing comma (#2384) -- Parsing support has been added for unparenthesized walruses in set literals, set - comprehensions, and indices (#2447). -- Pin `setuptools-scm` build-time dependency version (#2457) -- Exclude typing-extensions version 3.10.0.1 due to it being broken on Python 3.10 - (#2460) - -### _Blackd_ - -- Replace sys.exit(-1) with raise ImportError as it plays more nicely with tools that - scan installed packages (#2440) - -### Integrations - -- The provided pre-commit hooks no longer specify `language_version` to avoid overriding - `default_language_version` (#2430) - -## 21.7b0 - -### _Black_ - -- Configuration files using TOML features higher than spec v0.5.0 are now supported - (#2301) -- Add primer support and test for code piped into black via STDIN (#2315) -- Fix internal error when `FORCE_OPTIONAL_PARENTHESES` feature is enabled (#2332) -- Accept empty stdin (#2346) -- Provide a more useful error when parsing fails during AST safety checks (#2304) - -### Docker - -- Add new `latest_release` tag automation to follow latest black release on docker - images (#2374) - -### Integrations - -- The vim plugin now searches upwards from the directory containing the current buffer - instead of the current working directory for pyproject.toml. (#1871) -- The vim plugin now reads the correct string normalization option in pyproject.toml - (#1869) -- The vim plugin no longer crashes Black when there's boolean values in pyproject.toml - (#1869) - -## 21.6b0 - -### _Black_ - -- Fix failure caused by `fmt: skip` and indentation (#2281) -- Account for += assignment when deciding whether to split string (#2312) -- Correct max string length calculation when there are string operators (#2292) -- Fixed option usage when using the `--code` flag (#2259) -- Do not call `uvloop.install()` when _Black_ is used as a library (#2303) -- Added `--required-version` option to require a specific version to be running (#2300) -- Fix incorrect custom breakpoint indices when string group contains fake f-strings - (#2311) -- Fix regression where `R` prefixes would be lowercased for docstrings (#2285) -- Fix handling of named escapes (`\N{...}`) when `--experimental-string-processing` is - used (#2319) - -### Integrations - -- The official Black action now supports choosing what version to use, and supports the - major 3 OSes. (#1940) - -## 21.5b2 - -### _Black_ - -- A space is no longer inserted into empty docstrings (#2249) -- Fix handling of .gitignore files containing non-ASCII characters on Windows (#2229) -- Respect `.gitignore` files in all levels, not only `root/.gitignore` file (apply - `.gitignore` rules like `git` does) (#2225) -- Restored compatibility with Click 8.0 on Python 3.6 when LANG=C used (#2227) -- Add extra uvloop install + import support if in python env (#2258) -- Fix --experimental-string-processing crash when matching parens are not found (#2283) -- Make sure to split lines that start with a string operator (#2286) -- Fix regular expression that black uses to identify f-expressions (#2287) - -### _Blackd_ - -- Add a lower bound for the `aiohttp-cors` dependency. Only 0.4.0 or higher is - supported. (#2231) - -### Packaging - -- Release self-contained x86_64 MacOS binaries as part of the GitHub release pipeline - (#2198) -- Always build binaries with the latest available Python (#2260) - -### Documentation - -- Add discussion of magic comments to FAQ page (#2272) -- `--experimental-string-processing` will be enabled by default in the future (#2273) -- Fix typos discovered by codespell (#2228) -- Fix Vim plugin installation instructions. (#2235) -- Add new Frequently Asked Questions page (#2247) -- Fix encoding + symlink issues preventing proper build on Windows (#2262) - -## 21.5b1 - -### _Black_ - -- Refactor `src/black/__init__.py` into many files (#2206) - -### Documentation - -- Replaced all remaining references to the - [`master`](https://github.com/psf/black/tree/main) branch with the - [`main`](https://github.com/psf/black/tree/main) branch. Some additional changes in - the source code were also made. (#2210) -- Significantly reorganized the documentation to make much more sense. Check them out by - heading over to [the stable docs on RTD](https://black.readthedocs.io/en/stable/). - (#2174) - -## 21.5b0 - -### _Black_ - -- Set `--pyi` mode if `--stdin-filename` ends in `.pyi` (#2169) -- Stop detecting target version as Python 3.9+ with pre-PEP-614 decorators that are - being called but with no arguments (#2182) - -### _Black-Primer_ - -- Add `--no-diff` to black-primer to suppress formatting changes (#2187) - -## 21.4b2 - -### _Black_ - -- Fix crash if the user configuration directory is inaccessible. (#2158) - -- Clarify - [circumstances](https://github.com/psf/black/blob/master/docs/the_black_code_style.md#pragmatism) - in which _Black_ may change the AST (#2159) - -- Allow `.gitignore` rules to be overridden by specifying `exclude` in `pyproject.toml` - or on the command line. (#2170) - -### _Packaging_ - -- Install `primer.json` (used by `black-primer` by default) with black. (#2154) - -## 21.4b1 - -### _Black_ - -- Fix crash on docstrings ending with "\\ ". (#2142) - -- Fix crash when atypical whitespace is cleaned out of dostrings (#2120) - -- Reflect the `--skip-magic-trailing-comma` and `--experimental-string-processing` flags - in the name of the cache file. Without this fix, changes in these flags would not take - effect if the cache had already been populated. (#2131) - -- Don't remove necessary parentheses from assignment expression containing assert / - return statements. (#2143) - -### _Packaging_ - -- Bump pathspec to >= 0.8.1 to solve invalid .gitignore exclusion handling - -## 21.4b0 - -### _Black_ - -- Fixed a rare but annoying formatting instability created by the combination of - optional trailing commas inserted by `Black` and optional parentheses looking at - pre-existing "magic" trailing commas. This fixes issue #1629 and all of its many many - duplicates. (#2126) - -- `Black` now processes one-line docstrings by stripping leading and trailing spaces, - and adding a padding space when needed to break up """". (#1740) - -- `Black` now cleans up leading non-breaking spaces in comments (#2092) - -- `Black` now respects `--skip-string-normalization` when normalizing multiline - docstring quotes (#1637) - -- `Black` no longer removes all empty lines between non-function code and decorators - when formatting typing stubs. Now `Black` enforces a single empty line. (#1646) - -- `Black` no longer adds an incorrect space after a parenthesized assignment expression - in if/while statements (#1655) - -- Added `--skip-magic-trailing-comma` / `-C` to avoid using trailing commas as a reason - to split lines (#1824) - -- fixed a crash when PWD=/ on POSIX (#1631) - -- fixed "I/O operation on closed file" when using --diff (#1664) - -- Prevent coloured diff output being interleaved with multiple files (#1673) - -- Added support for PEP 614 relaxed decorator syntax on python 3.9 (#1711) - -- Added parsing support for unparenthesized tuples and yield expressions in annotated - assignments (#1835) - -- added `--extend-exclude` argument (PR #2005) - -- speed up caching by avoiding pathlib (#1950) - -- `--diff` correctly indicates when a file doesn't end in a newline (#1662) - -- Added `--stdin-filename` argument to allow stdin to respect `--force-exclude` rules - (#1780) - -- Lines ending with `fmt: skip` will now be not formatted (#1800) - -- PR #2053: Black no longer relies on typed-ast for Python 3.8 and higher - -- PR #2053: Python 2 support is now optional, install with - `python3 -m pip install black[python2]` to maintain support. - -- Exclude `venv` directory by default (#1683) - -- Fixed "Black produced code that is not equivalent to the source" when formatting - Python 2 docstrings (#2037) - -### _Packaging_ - -- Self-contained native _Black_ binaries are now provided for releases via GitHub - Releases (#1743) - -## 20.8b1 - -### _Packaging_ - -- explicitly depend on Click 7.1.2 or newer as `Black` no longer works with versions - older than 7.0 - -## 20.8b0 - -### _Black_ - -- re-implemented support for explicit trailing commas: now it works consistently within - any bracket pair, including nested structures (#1288 and duplicates) - -- `Black` now reindents docstrings when reindenting code around it (#1053) - -- `Black` now shows colored diffs (#1266) - -- `Black` is now packaged using 'py3' tagged wheels (#1388) - -- `Black` now supports Python 3.8 code, e.g. star expressions in return statements - (#1121) - -- `Black` no longer normalizes capital R-string prefixes as those have a - community-accepted meaning (#1244) - -- `Black` now uses exit code 2 when specified configuration file doesn't exit (#1361) - -- `Black` now works on AWS Lambda (#1141) - -- added `--force-exclude` argument (#1032) - -- removed deprecated `--py36` option (#1236) - -- fixed `--diff` output when EOF is encountered (#526) - -- fixed `# fmt: off` handling around decorators (#560) - -- fixed unstable formatting with some `# type: ignore` comments (#1113) - -- fixed invalid removal on organizing brackets followed by indexing (#1575) - -- introduced `black-primer`, a CI tool that allows us to run regression tests against - existing open source users of Black (#1402) - -- introduced property-based fuzzing to our test suite based on Hypothesis and - Hypothersmith (#1566) - -- implemented experimental and disabled by default long string rewrapping (#1132), - hidden under a `--experimental-string-processing` flag while it's being worked on; - this is an undocumented and unsupported feature, you lose Internet points for - depending on it (#1609) - -### Vim plugin - -- prefer virtualenv packages over global packages (#1383) - -## 19.10b0 - -- added support for PEP 572 assignment expressions (#711) - -- added support for PEP 570 positional-only arguments (#943) - -- added support for async generators (#593) - -- added support for pre-splitting collections by putting an explicit trailing comma - inside (#826) - -- added `black -c` as a way to format code passed from the command line (#761) - -- --safe now works with Python 2 code (#840) - -- fixed grammar selection for Python 2-specific code (#765) - -- fixed feature detection for trailing commas in function definitions and call sites - (#763) - -- `# fmt: off`/`# fmt: on` comment pairs placed multiple times within the same block of - code now behave correctly (#1005) - -- _Black_ no longer crashes on Windows machines with more than 61 cores (#838) - -- _Black_ no longer crashes on standalone comments prepended with a backslash (#767) - -- _Black_ no longer crashes on `from` ... `import` blocks with comments (#829) - -- _Black_ no longer crashes on Python 3.7 on some platform configurations (#494) - -- _Black_ no longer fails on comments in from-imports (#671) - -- _Black_ no longer fails when the file starts with a backslash (#922) - -- _Black_ no longer merges regular comments with type comments (#1027) - -- _Black_ no longer splits long lines that contain type comments (#997) - -- removed unnecessary parentheses around `yield` expressions (#834) - -- added parentheses around long tuples in unpacking assignments (#832) - -- added parentheses around complex powers when they are prefixed by a unary operator - (#646) - -- fixed bug that led _Black_ format some code with a line length target of 1 (#762) - -- _Black_ no longer introduces quotes in f-string subexpressions on string boundaries - (#863) - -- if _Black_ puts parenthesis around a single expression, it moves comments to the - wrapped expression instead of after the brackets (#872) - -- `blackd` now returns the version of _Black_ in the response headers (#1013) - -- `blackd` can now output the diff of formats on source code when the `X-Diff` header is - provided (#969) - -## 19.3b0 - -- new option `--target-version` to control which Python versions _Black_-formatted code - should target (#618) - -- deprecated `--py36` (use `--target-version=py36` instead) (#724) - -- _Black_ no longer normalizes numeric literals to include `_` separators (#696) - -- long `del` statements are now split into multiple lines (#698) - -- type comments are no longer mangled in function signatures - -- improved performance of formatting deeply nested data structures (#509) - -- _Black_ now properly formats multiple files in parallel on Windows (#632) - -- _Black_ now creates cache files atomically which allows it to be used in parallel - pipelines (like `xargs -P8`) (#673) - -- _Black_ now correctly indents comments in files that were previously formatted with - tabs (#262) - -- `blackd` now supports CORS (#622) - -## 18.9b0 - -- numeric literals are now formatted by _Black_ (#452, #461, #464, #469): - - - numeric literals are normalized to include `_` separators on Python 3.6+ code - - - added `--skip-numeric-underscore-normalization` to disable the above behavior and - leave numeric underscores as they were in the input - - - code with `_` in numeric literals is recognized as Python 3.6+ - - - most letters in numeric literals are lowercased (e.g., in `1e10`, `0x01`) - - - hexadecimal digits are always uppercased (e.g. `0xBADC0DE`) - -- added `blackd`, see - [its documentation](https://github.com/psf/black/blob/18.9b0/README.md#blackd) for - more info (#349) - -- adjacent string literals are now correctly split into multiple lines (#463) - -- trailing comma is now added to single imports that don't fit on a line (#250) - -- cache is now populated when `--check` is successful for a file which speeds up - consecutive checks of properly formatted unmodified files (#448) - -- whitespace at the beginning of the file is now removed (#399) - -- fixed mangling [pweave](http://mpastell.com/pweave/) and - [Spyder IDE](https://www.spyder-ide.org/) special comments (#532) - -- fixed unstable formatting when unpacking big tuples (#267) - -- fixed parsing of `__future__` imports with renames (#389) - -- fixed scope of `# fmt: off` when directly preceding `yield` and other nodes (#385) - -- fixed formatting of lambda expressions with default arguments (#468) - -- fixed `async for` statements: _Black_ no longer breaks them into separate lines (#372) - -- note: the Vim plugin stopped registering `,=` as a default chord as it turned out to - be a bad idea (#415) - -## 18.6b4 - -- hotfix: don't freeze when multiple comments directly precede `# fmt: off` (#371) - -## 18.6b3 - -- typing stub files (`.pyi`) now have blank lines added after constants (#340) - -- `# fmt: off` and `# fmt: on` are now much more dependable: - - - they now work also within bracket pairs (#329) - - - they now correctly work across function/class boundaries (#335) - - - they now work when an indentation block starts with empty lines or misaligned - comments (#334) - -- made Click not fail on invalid environments; note that Click is right but the - likelihood we'll need to access non-ASCII file paths when dealing with Python source - code is low (#277) - -- fixed improper formatting of f-strings with quotes inside interpolated expressions - (#322) - -- fixed unnecessary slowdown when long list literals where found in a file - -- fixed unnecessary slowdown on AST nodes with very many siblings - -- fixed cannibalizing backslashes during string normalization - -- fixed a crash due to symbolic links pointing outside of the project directory (#338) - -## 18.6b2 - -- added `--config` (#65) - -- added `-h` equivalent to `--help` (#316) - -- fixed improper unmodified file caching when `-S` was used - -- fixed extra space in string unpacking (#305) - -- fixed formatting of empty triple quoted strings (#313) - -- fixed unnecessary slowdown in comment placement calculation on lines without comments - -## 18.6b1 - -- hotfix: don't output human-facing information on stdout (#299) - -- hotfix: don't output cake emoji on non-zero return code (#300) - -## 18.6b0 - -- added `--include` and `--exclude` (#270) - -- added `--skip-string-normalization` (#118) - -- added `--verbose` (#283) - -- the header output in `--diff` now actually conforms to the unified diff spec - -- fixed long trivial assignments being wrapped in unnecessary parentheses (#273) - -- fixed unnecessary parentheses when a line contained multiline strings (#232) - -- fixed stdin handling not working correctly if an old version of Click was used (#276) - -- _Black_ now preserves line endings when formatting a file in place (#258) - -## 18.5b1 - -- added `--pyi` (#249) - -- added `--py36` (#249) - -- Python grammar pickle caches are stored with the formatting caches, making _Black_ - work in environments where site-packages is not user-writable (#192) - -- _Black_ now enforces a PEP 257 empty line after a class-level docstring (and/or - fields) and the first method - -- fixed invalid code produced when standalone comments were present in a trailer that - was omitted from line splitting on a large expression (#237) - -- fixed optional parentheses being removed within `# fmt: off` sections (#224) - -- fixed invalid code produced when stars in very long imports were incorrectly wrapped - in optional parentheses (#234) - -- fixed unstable formatting when inline comments were moved around in a trailer that was - omitted from line splitting on a large expression (#238) - -- fixed extra empty line between a class declaration and the first method if no class - docstring or fields are present (#219) - -- fixed extra empty line between a function signature and an inner function or inner - class (#196) - -## 18.5b0 - -- call chains are now formatted according to the - [fluent interfaces](https://en.wikipedia.org/wiki/Fluent_interface) style (#67) - -- data structure literals (tuples, lists, dictionaries, and sets) are now also always - exploded like imports when they don't fit in a single line (#152) - -- slices are now formatted according to PEP 8 (#178) - -- parentheses are now also managed automatically on the right-hand side of assignments - and return statements (#140) - -- math operators now use their respective priorities for delimiting multiline - expressions (#148) - -- optional parentheses are now omitted on expressions that start or end with a bracket - and only contain a single operator (#177) - -- empty parentheses in a class definition are now removed (#145, #180) - -- string prefixes are now standardized to lowercase and `u` is removed on Python 3.6+ - only code and Python 2.7+ code with the `unicode_literals` future import (#188, #198, - #199) - -- typing stub files (`.pyi`) are now formatted in a style that is consistent with PEP - 484 (#207, #210) - -- progress when reformatting many files is now reported incrementally - -- fixed trailers (content with brackets) being unnecessarily exploded into their own - lines after a dedented closing bracket (#119) - -- fixed an invalid trailing comma sometimes left in imports (#185) - -- fixed non-deterministic formatting when multiple pairs of removable parentheses were - used (#183) - -- fixed multiline strings being unnecessarily wrapped in optional parentheses in long - assignments (#215) - -- fixed not splitting long from-imports with only a single name - -- fixed Python 3.6+ file discovery by also looking at function calls with unpacking. - This fixed non-deterministic formatting if trailing commas where used both in function - signatures with stars and function calls with stars but the former would be - reformatted to a single line. - -- fixed crash on dealing with optional parentheses (#193) - -- fixed "is", "is not", "in", and "not in" not considered operators for splitting - purposes - -- fixed crash when dead symlinks where encountered - -## 18.4a4 - -- don't populate the cache on `--check` (#175) - -## 18.4a3 - -- added a "cache"; files already reformatted that haven't changed on disk won't be - reformatted again (#109) - -- `--check` and `--diff` are no longer mutually exclusive (#149) - -- generalized star expression handling, including double stars; this fixes - multiplication making expressions "unsafe" for trailing commas (#132) - -- _Black_ no longer enforces putting empty lines behind control flow statements (#90) - -- _Black_ now splits imports like "Mode 3 + trailing comma" of isort (#127) - -- fixed comment indentation when a standalone comment closes a block (#16, #32) - -- fixed standalone comments receiving extra empty lines if immediately preceding a - class, def, or decorator (#56, #154) - -- fixed `--diff` not showing entire path (#130) - -- fixed parsing of complex expressions after star and double stars in function calls - (#2) - -- fixed invalid splitting on comma in lambda arguments (#133) - -- fixed missing splits of ternary expressions (#141) - -## 18.4a2 - -- fixed parsing of unaligned standalone comments (#99, #112) - -- fixed placement of dictionary unpacking inside dictionary literals (#111) - -- Vim plugin now works on Windows, too - -- fixed unstable formatting when encountering unnecessarily escaped quotes in a string - (#120) - -## 18.4a1 - -- added `--quiet` (#78) - -- added automatic parentheses management (#4) - -- added [pre-commit](https://pre-commit.com) integration (#103, #104) - -- fixed reporting on `--check` with multiple files (#101, #102) - -- fixed removing backslash escapes from raw strings (#100, #105) - -## 18.4a0 - -- added `--diff` (#87) - -- add line breaks before all delimiters, except in cases like commas, to better comply - with PEP 8 (#73) - -- standardize string literals to use double quotes (almost) everywhere (#75) - -- fixed handling of standalone comments within nested bracketed expressions; _Black_ - will no longer produce super long lines or put all standalone comments at the end of - the expression (#22) - -- fixed 18.3a4 regression: don't crash and burn on empty lines with trailing whitespace - (#80) - -- fixed 18.3a4 regression: `# yapf: disable` usage as trailing comment would cause - _Black_ to not emit the rest of the file (#95) - -- when CTRL+C is pressed while formatting many files, _Black_ no longer freaks out with - a flurry of asyncio-related exceptions - -- only allow up to two empty lines on module level and only single empty lines within - functions (#74) - -## 18.3a4 - -- `# fmt: off` and `# fmt: on` are implemented (#5) - -- automatic detection of deprecated Python 2 forms of print statements and exec - statements in the formatted file (#49) - -- use proper spaces for complex expressions in default values of typed function - arguments (#60) - -- only return exit code 1 when --check is used (#50) - -- don't remove single trailing commas from square bracket indexing (#59) - -- don't omit whitespace if the previous factor leaf wasn't a math operator (#55) - -- omit extra space in kwarg unpacking if it's the first argument (#46) - -- omit extra space in - [Sphinx auto-attribute comments](http://www.sphinx-doc.org/en/stable/ext/autodoc.html#directive-autoattribute) - (#68) - -## 18.3a3 - -- don't remove single empty lines outside of bracketed expressions (#19) - -- added ability to pipe formatting from stdin to stdin (#25) - -- restored ability to format code with legacy usage of `async` as a name (#20, #42) - -- even better handling of numpy-style array indexing (#33, again) - -## 18.3a2 - -- changed positioning of binary operators to occur at beginning of lines instead of at - the end, following - [a recent change to PEP 8](https://github.com/python/peps/commit/c59c4376ad233a62ca4b3a6060c81368bd21e85b) - (#21) - -- ignore empty bracket pairs while splitting. This avoids very weirdly looking - formattings (#34, #35) - -- remove a trailing comma if there is a single argument to a call - -- if top level functions were separated by a comment, don't put four empty lines after - the upper function - -- fixed unstable formatting of newlines with imports - -- fixed unintentional folding of post scriptum standalone comments into last statement - if it was a simple statement (#18, #28) - -- fixed missing space in numpy-style array indexing (#33) - -- fixed spurious space after star-based unary expressions (#31) - -## 18.3a1 - -- added `--check` - -- only put trailing commas in function signatures and calls if it's safe to do so. If - the file is Python 3.6+ it's always safe, otherwise only safe if there are no `*args` - or `**kwargs` used in the signature or call. (#8) - -- fixed invalid spacing of dots in relative imports (#6, #13) - -- fixed invalid splitting after comma on unpacked variables in for-loops (#23) - -- fixed spurious space in parenthesized set expressions (#7) - -- fixed spurious space after opening parentheses and in default arguments (#14, #17) - -- fixed spurious space after unary operators when the operand was a complex expression - (#15) - -## 18.3a0 - -- first published version, Happy 🍰 Day 2018! - -- alpha quality - -- date-versioned (see: ) diff --git a/.venv/Lib/site-packages/black-24.1.1.dist-info/RECORD b/.venv/Lib/site-packages/black-24.1.1.dist-info/RECORD deleted file mode 100644 index 6aaba93..0000000 --- a/.venv/Lib/site-packages/black-24.1.1.dist-info/RECORD +++ /dev/null @@ -1,121 +0,0 @@ -../../Scripts/black.exe,sha256=YijV21ZxBRwOkfoHAklBn9tveIi7Q267nDx5Cm47JjU,108429 -../../Scripts/blackd.exe,sha256=srIpb75sAh13rb_gfQj1nf8Psbb413A5z_IZ-57LC4E,108430 -629853fdff261ed89b74__mypyc.cp311-win_amd64.pyd,sha256=urdtAwNb4DXvyOW6SEiHrjhvgdI8ZjbTMrKfUIQqfxs,2641408 -__pycache__/_black_version.cpython-311.pyc,, -_black_version.py,sha256=MfjET8U0RSSrpBPDwhEAEh1mCfb-q9E6CgTeiKGIwoI,20 -black-24.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -black-24.1.1.dist-info/METADATA,sha256=UjwckrsEsYWVhIN4BFZ6F8JDwnv7v8Oiw7m7Icm34OA,73257 -black-24.1.1.dist-info/RECORD,, -black-24.1.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -black-24.1.1.dist-info/WHEEL,sha256=Bhyvsd77hNJ8BpezXTzQvB6wjPGL_9v1DwvGJjAurgk,97 -black-24.1.1.dist-info/entry_points.txt,sha256=qBIyywHwGRkJj7kieq86kqf77rz3qGC4Joj36lHnxwc,78 -black-24.1.1.dist-info/licenses/AUTHORS.md,sha256=4jGDRetz--ILF1-PseZpENVjGDaMp87ZyFza3va2IuA,8288 -black-24.1.1.dist-info/licenses/LICENSE,sha256=XQJSBb4crFXeCOvZ-WHsfXTQ-Zj2XxeFbd0ien078zM,1101 -black/__init__.cp311-win_amd64.pyd,sha256=iN5--x6uZREktydeC2hmpi4KtCs-vmtwBtMBgXrX4cg,10752 -black/__init__.py,sha256=U6_9NgthXUwEKrcAP-05UEVCQx3rbLY1UFOur7EE8vc,53452 -black/__main__.py,sha256=6V0pV9Zeh8940mbQbVTCPdTX4Gjq1HGrFCA6E4HLGaM,50 -black/__pycache__/__init__.cpython-311.pyc,, -black/__pycache__/__main__.cpython-311.pyc,, -black/__pycache__/_width_table.cpython-311.pyc,, -black/__pycache__/brackets.cpython-311.pyc,, -black/__pycache__/cache.cpython-311.pyc,, -black/__pycache__/comments.cpython-311.pyc,, -black/__pycache__/concurrency.cpython-311.pyc,, -black/__pycache__/const.cpython-311.pyc,, -black/__pycache__/debug.cpython-311.pyc,, -black/__pycache__/files.cpython-311.pyc,, -black/__pycache__/handle_ipynb_magics.cpython-311.pyc,, -black/__pycache__/linegen.cpython-311.pyc,, -black/__pycache__/lines.cpython-311.pyc,, -black/__pycache__/mode.cpython-311.pyc,, -black/__pycache__/nodes.cpython-311.pyc,, -black/__pycache__/numerics.cpython-311.pyc,, -black/__pycache__/output.cpython-311.pyc,, -black/__pycache__/parsing.cpython-311.pyc,, -black/__pycache__/ranges.cpython-311.pyc,, -black/__pycache__/report.cpython-311.pyc,, -black/__pycache__/rusty.cpython-311.pyc,, -black/__pycache__/strings.cpython-311.pyc,, -black/__pycache__/trans.cpython-311.pyc,, -black/_width_table.cp311-win_amd64.pyd,sha256=XaPMyon6brHYtihMI6uoh3SgZxic8XQhDG4BAES5MKA,10752 -black/_width_table.py,sha256=uqFP3zYts-3377jZH5uSmP-jYRIm3905uTWmbJSENJo,11239 -black/brackets.cp311-win_amd64.pyd,sha256=shGdmgvuTnBHce2ChxhuGizW6FZWn_SrR1TZao_7GXE,10752 -black/brackets.py,sha256=a243zE0GFwttgqLIJoi4e29YMX32W7PSbE4_ENZmJow,12808 -black/cache.cp311-win_amd64.pyd,sha256=YSzBPRbQ4FScigcYN1x_WajBjulim8LAJcRYdWXuVh4,10752 -black/cache.py,sha256=rgBEWc6FTjJGlXcHwQD9CjHjDVSvz4SE_HTCTPcUh-E,4985 -black/comments.cp311-win_amd64.pyd,sha256=O6UTWr-f8-1KZuN1qFDF8Rn003JFJesPZghxrjbBqf8,10752 -black/comments.py,sha256=NFX5gbgMf1g1FpglU-M3bjixwYyPv5eMK4vJ_yITBkU,16398 -black/concurrency.py,sha256=GtEDt_jO-foKJYcSWs_g9ZVv1kLxapEBN2rtQOLvpMY,6600 -black/const.cp311-win_amd64.pyd,sha256=gvq5d9FcYcUDakP-NsSfx3TEE3lIpYZ-2aRDWCZAblU,10752 -black/const.py,sha256=FP5YcSxH6Cb0jqSkwF0nI4dHxPyQtL34hoWBfAqnAhI,325 -black/debug.py,sha256=IXttshwoOffLMy4gheK99cuPAneiykG3T86Fs25GVqQ,1960 -black/files.py,sha256=dE3RHsIq5cod-0Fw5kTtmfXyxQwpfMHi2Mnz4W8IP6Y,14508 -black/handle_ipynb_magics.cp311-win_amd64.pyd,sha256=ZLB8gmJIgEt2QZaBmnZHIMFrII3IdgCo7V14KUVm2Fs,10752 -black/handle_ipynb_magics.py,sha256=dM5vYI2UmrpPrtPHmcaZFVGKOBuVf87HbwHH4NxySW8,13816 -black/linegen.cp311-win_amd64.pyd,sha256=EZetjfHZKk-KtjnxdeFMekKpsXYYdaHpMXz1zP3mYqM,10752 -black/linegen.py,sha256=xOUbbpv9jMSFiqQKhq2bnr3i8L6TqaK00SPJmCeiACc,68070 -black/lines.cp311-win_amd64.pyd,sha256=57KzCg_PJ_6vqP2xQeWzuU67ISZVoWGU2LyvaIfgDWw,10752 -black/lines.py,sha256=X-NO0oFUKnsB4s2FXuWGgN76hO6xDOXm-FmSXZcC0xU,40332 -black/mode.cp311-win_amd64.pyd,sha256=kJDgQyYYlfsGcvS47gv7ZJvjAPeauZmgtwlwO0ZETJM,10752 -black/mode.py,sha256=4QMqqBDSiPXLU5JR80WQyx_hYjduD6TRh7VATn2LwbU,8447 -black/nodes.cp311-win_amd64.pyd,sha256=aYTsV_Nj5gwE8yYo1kNVY_u09401xh5Bp6P6QPHzk6w,10752 -black/nodes.py,sha256=9tl4uIeOuXHB8LCac5ZKgcJ9tp_rejDHlCofYJOZk7Y,29650 -black/numerics.cp311-win_amd64.pyd,sha256=-WLluKvkk7xKAcM0EXPZMO_IvU74b5fKl_yOZSQODXc,10752 -black/numerics.py,sha256=gB1T1-npxj44Vhex63ov-oGsoIPwx_PZlT-n_qUcwO4,1716 -black/output.py,sha256=egzlMOmfLx5KfU68uEK3i9ijJH2koCB0euSH6C1mceY,4061 -black/parsing.cp311-win_amd64.pyd,sha256=k9K2oM4v1TIjLXUJCHF9kCM0bTzoG7yWSHIoIOweN5c,10752 -black/parsing.py,sha256=Cmh7jTOxu06VjNyvt16DjUJuCTUAcppM0D0TWLy4xAE,7552 -black/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -black/ranges.cp311-win_amd64.pyd,sha256=PLOJLLnCXwQFyt1hkP5udjD-tXZz8m0q-dlpTcyEHbc,10752 -black/ranges.py,sha256=lcMohNRWeXV9A-3NzUIys2y2XkU1l6g6lViAtOBg7wo,19313 -black/report.py,sha256=8Xies3PseQeTN4gYfHS7RewVQRjDsDBfFDR3sSNytco,3559 -black/rusty.cp311-win_amd64.pyd,sha256=FPGE5alQCuHgRQvSE_7QsHBpOzN5zJvclM6WoFlJfP0,10752 -black/rusty.py,sha256=RogIomJ1RCLMTOK_RA6U3EMbzWV_ZHxPtrXveXbMjzQ,585 -black/strings.cp311-win_amd64.pyd,sha256=AJLgpufP1Cd5GnXOaqPvzS4LW4aXKZpYwDyV_CtqyQA,10752 -black/strings.py,sha256=AJE6d6h5XrrrE38o5BrLdm4fhTcPa1J2X3o4NSJiSNA,11479 -black/trans.cp311-win_amd64.pyd,sha256=WRAzlNhjmX_9Bcmd7PNBjcoWVKGwaEp6NF3DWNIh1jo,10752 -black/trans.py,sha256=26Y-b7aVplpBP4dHAGvzpvvyF2QWGU04bDOneaGlKSI,95027 -blackd/__init__.py,sha256=SzWsmhQM-hFEyPOCge2A_QamaCwarcZLCnuWvzmzlLc,9126 -blackd/__main__.py,sha256=-2NrSIZ5Es7pTFThp8w5JL9LwmmxtF1akhe7NU1OGvs,40 -blackd/__pycache__/__init__.cpython-311.pyc,, -blackd/__pycache__/__main__.cpython-311.pyc,, -blackd/__pycache__/middlewares.cpython-311.pyc,, -blackd/middlewares.py,sha256=77hGqdr2YypGhF_PhRiUgOEOUYykCB174Bb0higSI_U,1630 -blib2to3/Grammar.txt,sha256=qIILzOhDfGP3RgxCgoEeBphrPf6cxe3WFwL-wsakNlE,11607 -blib2to3/LICENSE,sha256=D2HM6JsydKABNqFe2-_N4Lf8VxxE1_5DVQtAFzw2_w8,13016 -blib2to3/PatternGrammar.txt,sha256=m6wfWk7y3-Qo35r77NWdJQ78XL1CqT_Pm0xr6eCOdpM,821 -blib2to3/README,sha256=G-DiXkC8aKINCNv7smI2q_mz-8k6kC4yYO2OrMb0Nqs,1098 -blib2to3/__init__.py,sha256=CSR2VOIKJL-JnGG41PcfbQZQEPCw43jfeK_EUisNsFQ,9 -blib2to3/__pycache__/__init__.cpython-311.pyc,, -blib2to3/__pycache__/pygram.cpython-311.pyc,, -blib2to3/__pycache__/pytree.cpython-311.pyc,, -blib2to3/pgen2/__init__.py,sha256=z8NemtNtAaIBocPMl0aMLgxaQMedsKOS_dOVAy8c3TI,147 -blib2to3/pgen2/__pycache__/__init__.cpython-311.pyc,, -blib2to3/pgen2/__pycache__/conv.cpython-311.pyc,, -blib2to3/pgen2/__pycache__/driver.cpython-311.pyc,, -blib2to3/pgen2/__pycache__/grammar.cpython-311.pyc,, -blib2to3/pgen2/__pycache__/literals.cpython-311.pyc,, -blib2to3/pgen2/__pycache__/parse.cpython-311.pyc,, -blib2to3/pgen2/__pycache__/pgen.cpython-311.pyc,, -blib2to3/pgen2/__pycache__/token.cpython-311.pyc,, -blib2to3/pgen2/__pycache__/tokenize.cpython-311.pyc,, -blib2to3/pgen2/conv.cp311-win_amd64.pyd,sha256=sk_ryyQNxTmESlHoL0rHPDa0nG2wgldFxVSz6ZkMGOQ,10752 -blib2to3/pgen2/conv.py,sha256=E52W8XiOlM1uldhN086T_2WVNrQyQ1ux2rhJPhDdobs,9843 -blib2to3/pgen2/driver.cp311-win_amd64.pyd,sha256=F49GRn86grMpruftYcCyVXloir-xZkRaarC5ekdDgjA,10752 -blib2to3/pgen2/driver.py,sha256=TowvHrzDoEaBTCa8QMTR8OoZokPn5-suHfMzhuEUYtY,10947 -blib2to3/pgen2/grammar.cp311-win_amd64.pyd,sha256=MfXaEKZclyHpukbJFDWdxUjSpSLgsl3Re6yowG7BO8A,10752 -blib2to3/pgen2/grammar.py,sha256=aI4Utpd21TKLXoE4RGnHTs2XBU2OvbVeaIWph1s-mr4,7085 -blib2to3/pgen2/literals.cp311-win_amd64.pyd,sha256=lIgb-0IxiHG7asj90n0aKQiLhHrjDYJUBZQtgRNILDY,10752 -blib2to3/pgen2/literals.py,sha256=ziWD3VwbuJ2ar3lQRqNAkfBJ3-MapxGEIT6pH9pVJjM,1680 -blib2to3/pgen2/parse.cp311-win_amd64.pyd,sha256=9kIizApQTK3eY4Pefm3k7dvDR97Mmco_ScEEar_IBu8,10752 -blib2to3/pgen2/parse.py,sha256=Ppy73dmeVmqIoCa-cOP2DBfIGFFt18VOiraxyle_O3U,16069 -blib2to3/pgen2/pgen.cp311-win_amd64.pyd,sha256=Q5N3rBiLN52cjPydd23NeMl0NgqAuS9veF8JXN9PEto,10752 -blib2to3/pgen2/pgen.py,sha256=YBwrPdsPzofevLtAk986PebMWr8quXo5ubJqgXMQZLs,15856 -blib2to3/pgen2/token.cp311-win_amd64.pyd,sha256=i23veHvdbrXjhfNIfIMaXLPeOnv1smKnYzyakb8YEmc,10752 -blib2to3/pgen2/token.py,sha256=X6DMhp_dwMa8FtcQWR2PJYSg0Hc6jwQ14l0KHU0oaag,1893 -blib2to3/pgen2/tokenize.cp311-win_amd64.pyd,sha256=EmXqwjqED--7cykAWUQNM6Ldz8l9l1O7soY7SqNY1qg,10752 -blib2to3/pgen2/tokenize.py,sha256=iTtUHjhC3e-tIzZZMF9g_dRPllRs-5aqALjZXakRd8s,23704 -blib2to3/pygram.cp311-win_amd64.pyd,sha256=1m24OW6ecjwHUvF3ukc_4j63HnfyCuQdSzVUOdNkpiA,10752 -blib2to3/pygram.py,sha256=qQGiwqYGpMAQmX0zpyB7IwrbWM1V9noSw0NU47CKkk0,5010 -blib2to3/pytree.cp311-win_amd64.pyd,sha256=5PMOUYHykHASf-7T0Kf1bTSa2bWksETUNVETt0eNY_M,10752 -blib2to3/pytree.py,sha256=3qTHBIv4F1faH2cNpd1ud4n7Ab9E7W4Hu-xQ3IxDuHw,33552 diff --git a/.venv/Lib/site-packages/black-24.1.1.dist-info/WHEEL b/.venv/Lib/site-packages/black-24.1.1.dist-info/WHEEL deleted file mode 100644 index 1cb583c..0000000 --- a/.venv/Lib/site-packages/black-24.1.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.21.1 -Root-Is-Purelib: false -Tag: cp311-cp311-win_amd64 diff --git a/.venv/Lib/site-packages/black-24.1.1.dist-info/entry_points.txt b/.venv/Lib/site-packages/black-24.1.1.dist-info/entry_points.txt deleted file mode 100644 index d0bf907..0000000 --- a/.venv/Lib/site-packages/black-24.1.1.dist-info/entry_points.txt +++ /dev/null @@ -1,3 +0,0 @@ -[console_scripts] -black = black:patched_main -blackd = blackd:patched_main [d] diff --git a/.venv/Lib/site-packages/black-24.1.1.dist-info/licenses/AUTHORS.md b/.venv/Lib/site-packages/black-24.1.1.dist-info/licenses/AUTHORS.md deleted file mode 100644 index e0511bb..0000000 --- a/.venv/Lib/site-packages/black-24.1.1.dist-info/licenses/AUTHORS.md +++ /dev/null @@ -1,196 +0,0 @@ -# Authors - -Glued together by [Łukasz Langa](mailto:lukasz@langa.pl). - -Maintained with: - -- [Carol Willing](mailto:carolcode@willingconsulting.com) -- [Carl Meyer](mailto:carl@oddbird.net) -- [Jelle Zijlstra](mailto:jelle.zijlstra@gmail.com) -- [Mika Naylor](mailto:mail@autophagy.io) -- [Zsolt Dollenstein](mailto:zsol.zsol@gmail.com) -- [Cooper Lees](mailto:me@cooperlees.com) -- [Richard Si](mailto:sichard26@gmail.com) -- [Felix Hildén](mailto:felix.hilden@gmail.com) -- [Batuhan Taskaya](mailto:batuhan@python.org) -- [Shantanu Jain](mailto:hauntsaninja@gmail.com) - -Multiple contributions by: - -- [Abdur-Rahmaan Janhangeer](mailto:arj.python@gmail.com) -- [Adam Johnson](mailto:me@adamj.eu) -- [Adam Williamson](mailto:adamw@happyassassin.net) -- [Alexander Huynh](mailto:ahrex-gh-psf-black@e.sc) -- [Alexandr Artemyev](mailto:mogost@gmail.com) -- [Alex Vandiver](mailto:github@chmrr.net) -- [Allan Simon](mailto:allan.simon@supinfo.com) -- Anders-Petter Ljungquist -- [Amethyst Reese](mailto:amy@n7.gg) -- [Andrew Thorp](mailto:andrew.thorp.dev@gmail.com) -- [Andrew Zhou](mailto:andrewfzhou@gmail.com) -- [Andrey](mailto:dyuuus@yandex.ru) -- [Andy Freeland](mailto:andy@andyfreeland.net) -- [Anthony Sottile](mailto:asottile@umich.edu) -- [Antonio Ossa Guerra](mailto:aaossa+black@uc.cl) -- [Arjaan Buijk](mailto:arjaan.buijk@gmail.com) -- [Arnav Borbornah](mailto:arnavborborah11@gmail.com) -- [Artem Malyshev](mailto:proofit404@gmail.com) -- [Asger Hautop Drewsen](mailto:asgerdrewsen@gmail.com) -- [Augie Fackler](mailto:raf@durin42.com) -- [Aviskar KC](mailto:aviskarkc10@gmail.com) -- Batuhan Taşkaya -- [Benjamin Wohlwend](mailto:bw@piquadrat.ch) -- [Benjamin Woodruff](mailto:github@benjam.info) -- [Bharat Raghunathan](mailto:bharatraghunthan9767@gmail.com) -- [Brandt Bucher](mailto:brandtbucher@gmail.com) -- [Brett Cannon](mailto:brett@python.org) -- [Bryan Bugyi](mailto:bryan.bugyi@rutgers.edu) -- [Bryan Forbes](mailto:bryan@reigndropsfall.net) -- [Calum Lind](mailto:calumlind@gmail.com) -- [Charles](mailto:peacech@gmail.com) -- Charles Reid -- [Christian Clauss](mailto:cclauss@bluewin.ch) -- [Christian Heimes](mailto:christian@python.org) -- [Chuck Wooters](mailto:chuck.wooters@microsoft.com) -- [Chris Rose](mailto:offline@offby1.net) -- Codey Oxley -- [Cong](mailto:congusbongus@gmail.com) -- [Cooper Ry Lees](mailto:me@cooperlees.com) -- [Dan Davison](mailto:dandavison7@gmail.com) -- [Daniel Hahler](mailto:github@thequod.de) -- [Daniel M. Capella](mailto:polycitizen@gmail.com) -- Daniele Esposti -- [David Hotham](mailto:david.hotham@metaswitch.com) -- [David Lukes](mailto:dafydd.lukes@gmail.com) -- [David Szotten](mailto:davidszotten@gmail.com) -- [Denis Laxalde](mailto:denis@laxalde.org) -- [Douglas Thor](mailto:dthor@transphormusa.com) -- dylanjblack -- [Eli Treuherz](mailto:eli@treuherz.com) -- [Emil Hessman](mailto:emil@hessman.se) -- [Felix Kohlgrüber](mailto:felix.kohlgrueber@gmail.com) -- [Florent Thiery](mailto:fthiery@gmail.com) -- Francisco -- [Giacomo Tagliabue](mailto:giacomo.tag@gmail.com) -- [Greg Gandenberger](mailto:ggandenberger@shoprunner.com) -- [Gregory P. Smith](mailto:greg@krypto.org) -- Gustavo Camargo -- hauntsaninja -- [Hadi Alqattan](mailto:alqattanhadizaki@gmail.com) -- [Hassan Abouelela](mailto:hassan@hassanamr.com) -- [Heaford](mailto:dan@heaford.com) -- [Hugo Barrera](mailto::hugo@barrera.io) -- Hugo van Kemenade -- [Hynek Schlawack](mailto:hs@ox.cx) -- [Ionite](mailto:dev@ionite.io) -- [Ivan Katanić](mailto:ivan.katanic@gmail.com) -- [Jakub Kadlubiec](mailto:jakub.kadlubiec@skyscanner.net) -- [Jakub Warczarek](mailto:jakub.warczarek@gmail.com) -- [Jan Hnátek](mailto:jan.hnatek@gmail.com) -- [Jason Fried](mailto:me@jasonfried.info) -- [Jason Friedland](mailto:jason@friedland.id.au) -- [jgirardet](mailto:ijkl@netc.fr) -- Jim Brännlund -- [Jimmy Jia](mailto:tesrin@gmail.com) -- [Joe Antonakakis](mailto:jma353@cornell.edu) -- [Jon Dufresne](mailto:jon.dufresne@gmail.com) -- [Jonas Obrist](mailto:ojiidotch@gmail.com) -- [Jonty Wareing](mailto:jonty@jonty.co.uk) -- [Jose Nazario](mailto:jose.monkey.org@gmail.com) -- [Joseph Larson](mailto:larson.joseph@gmail.com) -- [Josh Bode](mailto:joshbode@fastmail.com) -- [Josh Holland](mailto:anowlcalledjosh@gmail.com) -- [Joshua Cannon](mailto:joshdcannon@gmail.com) -- [José Padilla](mailto:jpadilla@webapplicate.com) -- [Juan Luis Cano Rodríguez](mailto:hello@juanlu.space) -- [kaiix](mailto:kvn.hou@gmail.com) -- [Katie McLaughlin](mailto:katie@glasnt.com) -- Katrin Leinweber -- [Keith Smiley](mailto:keithbsmiley@gmail.com) -- [Kenyon Ralph](mailto:kenyon@kenyonralph.com) -- [Kevin Kirsche](mailto:Kev.Kirsche+GitHub@gmail.com) -- [Kyle Hausmann](mailto:kyle.hausmann@gmail.com) -- [Kyle Sunden](mailto:sunden@wisc.edu) -- Lawrence Chan -- [Linus Groh](mailto:mail@linusgroh.de) -- [Loren Carvalho](mailto:comradeloren@gmail.com) -- [Luka Sterbic](mailto:luka.sterbic@gmail.com) -- [LukasDrude](mailto:mail@lukas-drude.de) -- Mahmoud Hossam -- Mariatta -- [Matt VanEseltine](mailto:vaneseltine@gmail.com) -- [Matthew Clapp](mailto:itsayellow+dev@gmail.com) -- [Matthew Walster](mailto:matthew@walster.org) -- Max Smolens -- [Michael Aquilina](mailto:michaelaquilina@gmail.com) -- [Michael Flaxman](mailto:michael.flaxman@gmail.com) -- [Michael J. Sullivan](mailto:sully@msully.net) -- [Michael McClimon](mailto:michael@mcclimon.org) -- [Miguel Gaiowski](mailto:miggaiowski@gmail.com) -- [Mike](mailto:roshi@fedoraproject.org) -- [mikehoyio](mailto:mikehoy@gmail.com) -- [Min ho Kim](mailto:minho42@gmail.com) -- [Miroslav Shubernetskiy](mailto:miroslav@miki725.com) -- MomIsBestFriend -- [Nathan Goldbaum](mailto:ngoldbau@illinois.edu) -- [Nathan Hunt](mailto:neighthan.hunt@gmail.com) -- [Neraste](mailto:neraste.herr10@gmail.com) -- [Nikolaus Waxweiler](mailto:madigens@gmail.com) -- [Ofek Lev](mailto:ofekmeister@gmail.com) -- [Osaetin Daniel](mailto:osaetindaniel@gmail.com) -- [otstrel](mailto:otstrel@gmail.com) -- [Pablo Galindo](mailto:Pablogsal@gmail.com) -- [Paul Ganssle](mailto:p.ganssle@gmail.com) -- [Paul Meinhardt](mailto:mnhrdt@gmail.com) -- [Peter Bengtsson](mailto:mail@peterbe.com) -- [Peter Grayson](mailto:pete@jpgrayson.net) -- [Peter Stensmyr](mailto:peter.stensmyr@gmail.com) -- pmacosta -- [Quentin Pradet](mailto:quentin@pradet.me) -- [Ralf Schmitt](mailto:ralf@systemexit.de) -- [Ramón Valles](mailto:mroutis@protonmail.com) -- [Richard Fearn](mailto:richardfearn@gmail.com) -- [Rishikesh Jha](mailto:rishijha424@gmail.com) -- [Rupert Bedford](mailto:rupert@rupertb.com) -- Russell Davis -- [Sagi Shadur](mailto:saroad2@gmail.com) -- [Rémi Verschelde](mailto:rverschelde@gmail.com) -- [Sami Salonen](mailto:sakki@iki.fi) -- [Samuel Cormier-Iijima](mailto:samuel@cormier-iijima.com) -- [Sanket Dasgupta](mailto:sanketdasgupta@gmail.com) -- Sergi -- [Scott Stevenson](mailto:scott@stevenson.io) -- Shantanu -- [shaoran](mailto:shaoran@sakuranohana.org) -- [Shinya Fujino](mailto:shf0811@gmail.com) -- springstan -- [Stavros Korokithakis](mailto:hi@stavros.io) -- [Stephen Rosen](mailto:sirosen@globus.org) -- [Steven M. Vascellaro](mailto:S.Vascellaro@gmail.com) -- [Sunil Kapil](mailto:snlkapil@gmail.com) -- [Sébastien Eustace](mailto:sebastien.eustace@gmail.com) -- [Tal Amuyal](mailto:TalAmuyal@gmail.com) -- [Terrance](mailto:git@terrance.allofti.me) -- [Thom Lu](mailto:thomas.c.lu@gmail.com) -- [Thomas Grainger](mailto:tagrain@gmail.com) -- [Tim Gates](mailto:tim.gates@iress.com) -- [Tim Swast](mailto:swast@google.com) -- [Timo](mailto:timo_tk@hotmail.com) -- Toby Fleming -- [Tom Christie](mailto:tom@tomchristie.com) -- [Tony Narlock](mailto:tony@git-pull.com) -- [Tsuyoshi Hombashi](mailto:tsuyoshi.hombashi@gmail.com) -- [Tushar Chandra](mailto:tusharchandra2018@u.northwestern.edu) -- [Tzu-ping Chung](mailto:uranusjr@gmail.com) -- [Utsav Shah](mailto:ukshah2@illinois.edu) -- utsav-dbx -- vezeli -- [Ville Skyttä](mailto:ville.skytta@iki.fi) -- [Vishwas B Sharma](mailto:sharma.vishwas88@gmail.com) -- [Vlad Emelianov](mailto:volshebnyi@gmail.com) -- [williamfzc](mailto:178894043@qq.com) -- [wouter bolsterlee](mailto:wouter@bolsterl.ee) -- Yazdan -- [Yngve Høiseth](mailto:yngve@hoiseth.net) -- [Yurii Karabas](mailto:1998uriyyo@gmail.com) -- [Zac Hatfield-Dodds](mailto:zac@zhd.dev) diff --git a/.venv/Lib/site-packages/black-24.1.1.dist-info/licenses/LICENSE b/.venv/Lib/site-packages/black-24.1.1.dist-info/licenses/LICENSE deleted file mode 100644 index 7a9b891..0000000 --- a/.venv/Lib/site-packages/black-24.1.1.dist-info/licenses/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2018 Łukasz Langa - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/.venv/Lib/site-packages/black/__init__.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/__init__.cp311-win_amd64.pyd index cb56f75..e5c64ef 100644 Binary files a/.venv/Lib/site-packages/black/__init__.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/__init__.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/__init__.py b/.venv/Lib/site-packages/black/__init__.py index 8ab5b47..f82b9fe 100644 --- a/.venv/Lib/site-packages/black/__init__.py +++ b/.venv/Lib/site-packages/black/__init__.py @@ -44,15 +44,15 @@ STDIN_PLACEHOLDER, ) from black.files import ( + best_effort_relative_path, find_project_root, find_pyproject_toml, find_user_pyproject_toml, gen_python_files, get_gitignore, - get_root_relative_path, - normalize_path_maybe_ignore, parse_pyproject_toml, path_is_excluded, + resolves_outside_root_or_cannot_stat, wrap_stream_for_windows, ) from black.handle_ipynb_magics import ( @@ -734,6 +734,7 @@ def get_sources( """Compute the set of files to be formatted.""" sources: Set[Path] = set() + assert root.is_absolute(), f"INTERNAL ERROR: `root` must be absolute but is {root}" using_default_exclude = exclude is None exclude = re_compile_maybe_verbose(DEFAULT_EXCLUDES) if exclude is None else exclude gitignore: Optional[Dict[Path, PathSpec]] = None @@ -749,11 +750,12 @@ def get_sources( # Compare the logic here to the logic in `gen_python_files`. if is_stdin or path.is_file(): - root_relative_path = get_root_relative_path(path, root, report) - - if root_relative_path is None: + if resolves_outside_root_or_cannot_stat(path, root, report): + if verbose: + out(f'Skipping invalid source: "{path}"', fg="red") continue + root_relative_path = best_effort_relative_path(path, root).as_posix() root_relative_path = "/" + root_relative_path # Hard-exclude any files that matches the `--force-exclude` regex. @@ -763,14 +765,6 @@ def get_sources( ) continue - normalized_path: Optional[str] = normalize_path_maybe_ignore( - path, root, report - ) - if normalized_path is None: - if verbose: - out(f'Skipping invalid source: "{normalized_path}"', fg="red") - continue - if is_stdin: path = Path(f"{STDIN_PLACEHOLDER}{str(path)}") @@ -780,7 +774,7 @@ def get_sources( continue if verbose: - out(f'Found input source: "{normalized_path}"', fg="blue") + out(f'Found input source: "{path}"', fg="blue") sources.add(path) elif path.is_dir(): path = root / (path.resolve().relative_to(root)) diff --git a/.venv/Lib/site-packages/black/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/__init__.cpython-311.pyc index 93152e3..d14eb67 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/__main__.cpython-311.pyc index 91cd519..a28a7c9 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/_width_table.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/_width_table.cpython-311.pyc index 184d7ae..7d6f016 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/_width_table.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/_width_table.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/brackets.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/brackets.cpython-311.pyc index 9e40682..f6d120f 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/brackets.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/brackets.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/cache.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/cache.cpython-311.pyc index 8b8d578..41a2de9 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/cache.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/cache.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/comments.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/comments.cpython-311.pyc index bc9fbe8..a907253 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/comments.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/comments.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/concurrency.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/concurrency.cpython-311.pyc index e1392e3..066cc4f 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/concurrency.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/concurrency.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/const.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/const.cpython-311.pyc index c85a9e4..681f199 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/const.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/const.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/debug.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/debug.cpython-311.pyc index 1fbb4f3..5caf12f 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/debug.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/debug.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/files.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/files.cpython-311.pyc index 4e0f35b..34dd030 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/files.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/files.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/handle_ipynb_magics.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/handle_ipynb_magics.cpython-311.pyc index 7abfb6e..4a21455 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/handle_ipynb_magics.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/handle_ipynb_magics.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/linegen.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/linegen.cpython-311.pyc index 09de718..53635c4 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/linegen.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/linegen.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/lines.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/lines.cpython-311.pyc index e879f67..3acd649 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/lines.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/lines.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/mode.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/mode.cpython-311.pyc index 7083d1c..15d27e8 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/mode.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/mode.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/nodes.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/nodes.cpython-311.pyc index fe04250..2b0cb8c 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/nodes.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/nodes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/numerics.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/numerics.cpython-311.pyc index cb4d5cd..6ac37da 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/numerics.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/numerics.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/output.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/output.cpython-311.pyc index f09fad2..015d6f6 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/output.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/output.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/parsing.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/parsing.cpython-311.pyc index 3b1f950..c208513 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/parsing.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/parsing.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/ranges.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/ranges.cpython-311.pyc index 0a22630..13da823 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/ranges.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/ranges.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/report.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/report.cpython-311.pyc index fc40b2b..1a16d16 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/report.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/report.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/rusty.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/rusty.cpython-311.pyc index ed6e78a..76041b7 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/rusty.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/rusty.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/strings.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/strings.cpython-311.pyc index 7b3b783..a733bd6 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/strings.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/strings.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/__pycache__/trans.cpython-311.pyc b/.venv/Lib/site-packages/black/__pycache__/trans.cpython-311.pyc index 2850530..9e13115 100644 Binary files a/.venv/Lib/site-packages/black/__pycache__/trans.cpython-311.pyc and b/.venv/Lib/site-packages/black/__pycache__/trans.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/black/_width_table.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/_width_table.cp311-win_amd64.pyd index 41df75a..750c331 100644 Binary files a/.venv/Lib/site-packages/black/_width_table.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/_width_table.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/brackets.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/brackets.cp311-win_amd64.pyd index 90a39b0..9774fef 100644 Binary files a/.venv/Lib/site-packages/black/brackets.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/brackets.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/cache.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/cache.cp311-win_amd64.pyd index 895a25d..5d6999e 100644 Binary files a/.venv/Lib/site-packages/black/cache.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/cache.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/comments.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/comments.cp311-win_amd64.pyd index 0c135c2..25c5c69 100644 Binary files a/.venv/Lib/site-packages/black/comments.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/comments.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/const.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/const.cp311-win_amd64.pyd index 7b55d69..bcd75a0 100644 Binary files a/.venv/Lib/site-packages/black/const.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/const.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/files.py b/.venv/Lib/site-packages/black/files.py index 1eb8745..c0cadbf 100644 --- a/.venv/Lib/site-packages/black/files.py +++ b/.venv/Lib/site-packages/black/files.py @@ -42,6 +42,17 @@ import colorama # noqa: F401 +@lru_cache +def _load_toml(path: Union[Path, str]) -> Dict[str, Any]: + with open(path, "rb") as f: + return tomllib.load(f) + + +@lru_cache +def _cached_resolve(path: Path) -> Path: + return path.resolve() + + @lru_cache def find_project_root( srcs: Sequence[str], stdin_filename: Optional[str] = None @@ -61,9 +72,9 @@ def find_project_root( if stdin_filename is not None: srcs = tuple(stdin_filename if s == "-" else s for s in srcs) if not srcs: - srcs = [str(Path.cwd().resolve())] + srcs = [str(_cached_resolve(Path.cwd()))] - path_srcs = [Path(Path.cwd(), src).resolve() for src in srcs] + path_srcs = [_cached_resolve(Path(Path.cwd(), src)) for src in srcs] # A list of lists of parents for each 'src'. 'src' is included as a # "parent" of itself if it is a directory @@ -84,7 +95,9 @@ def find_project_root( return directory, ".hg directory" if (directory / "pyproject.toml").is_file(): - return directory, "pyproject.toml" + pyproject_toml = _load_toml(directory / "pyproject.toml") + if "black" in pyproject_toml.get("tool", {}): + return directory, "pyproject.toml" return directory, "file system root" @@ -117,8 +130,7 @@ def parse_pyproject_toml(path_config: str) -> Dict[str, Any]: If parsing fails, will raise a tomllib.TOMLDecodeError. """ - with open(path_config, "rb") as f: - pyproject_toml = tomllib.load(f) + pyproject_toml = _load_toml(path_config) config: Dict[str, Any] = pyproject_toml.get("tool", {}).get("black", {}) config = {k.replace("--", "").replace("-", "_"): v for k, v in config.items()} @@ -229,7 +241,7 @@ def find_user_pyproject_toml() -> Path: else: config_root = os.environ.get("XDG_CONFIG_HOME", "~/.config") user_config_path = Path(config_root).expanduser() / "black" - return user_config_path.resolve() + return _cached_resolve(user_config_path) @lru_cache @@ -247,41 +259,43 @@ def get_gitignore(root: Path) -> PathSpec: raise -def normalize_path_maybe_ignore( +def resolves_outside_root_or_cannot_stat( path: Path, root: Path, report: Optional[Report] = None, -) -> Optional[str]: - """Normalize `path`. May return `None` if `path` was ignored. - - `report` is where "path ignored" output goes. +) -> bool: + """ + Returns whether the path is a symbolic link that points outside the + root directory. Also returns True if we failed to resolve the path. """ try: - abspath = path if path.is_absolute() else Path.cwd() / path - normalized_path = abspath.resolve() - root_relative_path = get_root_relative_path(normalized_path, root, report) - + if sys.version_info < (3, 8, 6): + path = path.absolute() # https://bugs.python.org/issue33660 + resolved_path = _cached_resolve(path) except OSError as e: if report: report.path_ignored(path, f"cannot be read because {e}") - return None - - return root_relative_path - - -def get_root_relative_path( - path: Path, - root: Path, - report: Optional[Report] = None, -) -> Optional[str]: - """Returns the file path relative to the 'root' directory""" + return True try: - root_relative_path = path.absolute().relative_to(root).as_posix() + resolved_path.relative_to(root) except ValueError: if report: report.path_ignored(path, f"is a symbolic link that points outside {root}") - return None - return root_relative_path + return True + return False + + +def best_effort_relative_path(path: Path, root: Path) -> Path: + # Precondition: resolves_outside_root_or_cannot_stat(path, root) is False + try: + return path.absolute().relative_to(root) + except ValueError: + pass + root_parent = next((p for p in path.parents if _cached_resolve(p) == root), None) + if root_parent is not None: + return path.relative_to(root_parent) + # something adversarial, fallback to path guaranteed by precondition + return _cached_resolve(path).relative_to(root) def _path_is_ignored( @@ -334,7 +348,8 @@ def gen_python_files( assert root.is_absolute(), f"INTERNAL ERROR: `root` must be absolute but is {root}" for child in paths: - root_relative_path = child.absolute().relative_to(root).as_posix() + assert child.is_absolute() + root_relative_path = child.relative_to(root).as_posix() # First ignore files matching .gitignore, if passed if gitignore_dict and _path_is_ignored( @@ -362,8 +377,7 @@ def gen_python_files( report.path_ignored(child, "matches the --force-exclude regular expression") continue - normalized_path = normalize_path_maybe_ignore(child, root, report) - if normalized_path is None: + if resolves_outside_root_or_cannot_stat(child, root, report): continue if child.is_dir(): diff --git a/.venv/Lib/site-packages/black/handle_ipynb_magics.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/handle_ipynb_magics.cp311-win_amd64.pyd index 0acb6db..2171c5c 100644 Binary files a/.venv/Lib/site-packages/black/handle_ipynb_magics.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/handle_ipynb_magics.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/linegen.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/linegen.cp311-win_amd64.pyd index 3bce75e..6653293 100644 Binary files a/.venv/Lib/site-packages/black/linegen.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/linegen.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/linegen.py b/.venv/Lib/site-packages/black/linegen.py index c74ff9c..cc8e41d 100644 --- a/.venv/Lib/site-packages/black/linegen.py +++ b/.venv/Lib/site-packages/black/linegen.py @@ -477,15 +477,22 @@ def visit_STRING(self, leaf: Leaf) -> Iterator[Line]: last_line_length = len(lines[-1]) if docstring else 0 # If adding closing quotes would cause the last line to exceed - # the maximum line length then put a line break before the - # closing quotes + # the maximum line length, and the closing quote is not + # prefixed by a newline then put a line break before + # the closing quotes if ( len(lines) > 1 and last_line_length + quote_len > self.mode.line_length and len(indent) + quote_len <= self.mode.line_length and not has_trailing_backslash ): - leaf.value = prefix + quote + docstring + "\n" + indent + quote + if ( + Preview.docstring_check_for_newline in self.mode + and leaf.value[-1 - quote_len] == "\n" + ): + leaf.value = prefix + quote + docstring + quote + else: + leaf.value = prefix + quote + docstring + "\n" + indent + quote else: leaf.value = prefix + quote + docstring + quote else: @@ -522,6 +529,8 @@ def __post_init__(self) -> None: # PEP 634 self.visit_match_stmt = self.visit_match_case self.visit_case_block = self.visit_match_case + if Preview.remove_redundant_guard_parens in self.mode: + self.visit_guard = partial(v, keywords=Ø, parens={"if"}) def _hugging_power_ops_line_to_string( @@ -1544,6 +1553,9 @@ def maybe_make_parens_invisible_in_atom( not is_type_ignore_comment_string(middle.prefix.strip()) ): first.value = "" + if first.prefix.strip(): + # Preserve comments before first paren + middle.prefix = first.prefix + middle.prefix last.value = "" maybe_make_parens_invisible_in_atom( middle, @@ -1555,6 +1567,9 @@ def maybe_make_parens_invisible_in_atom( # Strip the invisible parens from `middle` by replacing # it with the child in-between the invisible parens middle.replace(middle.children[1]) + if middle.children[-1].prefix.strip(): + # Preserve comments before last paren + last.prefix = middle.children[-1].prefix + last.prefix return False diff --git a/.venv/Lib/site-packages/black/lines.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/lines.cp311-win_amd64.pyd index ac48d3b..1eac8a2 100644 Binary files a/.venv/Lib/site-packages/black/lines.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/lines.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/mode.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/mode.cp311-win_amd64.pyd index 4cf18aa..f64aff8 100644 Binary files a/.venv/Lib/site-packages/black/mode.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/mode.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/mode.py b/.venv/Lib/site-packages/black/mode.py index 22352e7..90c10c3 100644 --- a/.venv/Lib/site-packages/black/mode.py +++ b/.venv/Lib/site-packages/black/mode.py @@ -177,6 +177,9 @@ class Preview(Enum): wrap_long_dict_values_in_parens = auto() multiline_string_handling = auto() typed_params_trailing_comma = auto() + is_simple_lookup_for_doublestar_expression = auto() + docstring_check_for_newline = auto() + remove_redundant_guard_parens = auto() UNSTABLE_FEATURES: Set[Preview] = { @@ -186,6 +189,8 @@ class Preview(Enum): Preview.wrap_long_dict_values_in_parens, # See issue #4159 Preview.multiline_string_handling, + # See issue #4036 (crash), #4098, #4099 (proposed tweaks) + Preview.hug_parens_with_braces_and_square_brackets, } diff --git a/.venv/Lib/site-packages/black/nodes.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/nodes.cp311-win_amd64.pyd index 4ef3aee..e207e80 100644 Binary files a/.venv/Lib/site-packages/black/nodes.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/nodes.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/numerics.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/numerics.cp311-win_amd64.pyd index 81ba8f0..8e7db8e 100644 Binary files a/.venv/Lib/site-packages/black/numerics.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/numerics.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/parsing.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/parsing.cp311-win_amd64.pyd index 920d0e4..2747d3e 100644 Binary files a/.venv/Lib/site-packages/black/parsing.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/parsing.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/parsing.py b/.venv/Lib/site-packages/black/parsing.py index 178a7ef..63c5e71 100644 --- a/.venv/Lib/site-packages/black/parsing.py +++ b/.venv/Lib/site-packages/black/parsing.py @@ -4,6 +4,7 @@ import ast import sys +import warnings from typing import Iterable, Iterator, List, Set, Tuple from black.mode import VERSION_TO_FEATURES, Feature, TargetVersion, supports_feature @@ -109,13 +110,16 @@ def lib2to3_unparse(node: Node) -> str: return code -def parse_single_version( +def _parse_single_version( src: str, version: Tuple[int, int], *, type_comments: bool ) -> ast.AST: filename = "" - return ast.parse( - src, filename, feature_version=version, type_comments=type_comments - ) + with warnings.catch_warnings(): + warnings.simplefilter("ignore", SyntaxWarning) + warnings.simplefilter("ignore", DeprecationWarning) + return ast.parse( + src, filename, feature_version=version, type_comments=type_comments + ) def parse_ast(src: str) -> ast.AST: @@ -125,7 +129,7 @@ def parse_ast(src: str) -> ast.AST: first_error = "" for version in sorted(versions, reverse=True): try: - return parse_single_version(src, version, type_comments=True) + return _parse_single_version(src, version, type_comments=True) except SyntaxError as e: if not first_error: first_error = str(e) @@ -133,7 +137,7 @@ def parse_ast(src: str) -> ast.AST: # Try to parse without type comments for version in sorted(versions, reverse=True): try: - return parse_single_version(src, version, type_comments=False) + return _parse_single_version(src, version, type_comments=False) except SyntaxError: pass diff --git a/.venv/Lib/site-packages/black/ranges.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/ranges.cp311-win_amd64.pyd index 8107fde..f85bc69 100644 Binary files a/.venv/Lib/site-packages/black/ranges.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/ranges.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/rusty.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/rusty.cp311-win_amd64.pyd index 95c7b8c..7fe0ceb 100644 Binary files a/.venv/Lib/site-packages/black/rusty.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/rusty.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/strings.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/strings.cp311-win_amd64.pyd index c2d31c6..93af029 100644 Binary files a/.venv/Lib/site-packages/black/strings.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/strings.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/trans.cp311-win_amd64.pyd b/.venv/Lib/site-packages/black/trans.cp311-win_amd64.pyd index fe48ee8..d20ff4e 100644 Binary files a/.venv/Lib/site-packages/black/trans.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/black/trans.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/black/trans.py b/.venv/Lib/site-packages/black/trans.py index 7c7335a..29a978c 100644 --- a/.venv/Lib/site-packages/black/trans.py +++ b/.venv/Lib/site-packages/black/trans.py @@ -29,7 +29,7 @@ from black.comments import contains_pragma_comment from black.lines import Line, append_leaves -from black.mode import Feature, Mode +from black.mode import Feature, Mode, Preview from black.nodes import ( CLOSING_BRACKETS, OPENING_BRACKETS, @@ -94,43 +94,36 @@ def hug_power_op( else: raise CannotTransform("No doublestar token was found in the line.") - def is_simple_lookup(index: int, step: Literal[1, -1]) -> bool: + def is_simple_lookup(index: int, kind: Literal[1, -1]) -> bool: # Brackets and parentheses indicate calls, subscripts, etc. ... # basically stuff that doesn't count as "simple". Only a NAME lookup # or dotted lookup (eg. NAME.NAME) is OK. - if step == -1: - disallowed = {token.RPAR, token.RSQB} - else: - disallowed = {token.LPAR, token.LSQB} - - while 0 <= index < len(line.leaves): - current = line.leaves[index] - if current.type in disallowed: - return False - if current.type not in {token.NAME, token.DOT} or current.value == "for": - # If the current token isn't disallowed, we'll assume this is simple as - # only the disallowed tokens are semantically attached to this lookup - # expression we're checking. Also, stop early if we hit the 'for' bit - # of a comprehension. - return True + if Preview.is_simple_lookup_for_doublestar_expression not in mode: + return original_is_simple_lookup_func(line, index, kind) - index += step - - return True + else: + if kind == -1: + return handle_is_simple_look_up_prev( + line, index, {token.RPAR, token.RSQB} + ) + else: + return handle_is_simple_lookup_forward( + line, index, {token.LPAR, token.LSQB} + ) - def is_simple_operand(index: int, kind: Literal["base", "exponent"]) -> bool: + def is_simple_operand(index: int, kind: Literal[1, -1]) -> bool: # An operand is considered "simple" if's a NAME, a numeric CONSTANT, a simple # lookup (see above), with or without a preceding unary operator. start = line.leaves[index] if start.type in {token.NAME, token.NUMBER}: - return is_simple_lookup(index, step=(1 if kind == "exponent" else -1)) + return is_simple_lookup(index, kind) if start.type in {token.PLUS, token.MINUS, token.TILDE}: if line.leaves[index + 1].type in {token.NAME, token.NUMBER}: - # step is always one as bases with a preceding unary op will be checked + # kind is always one as bases with a preceding unary op will be checked # for simplicity starting from the next token (so it'll hit the check # above). - return is_simple_lookup(index + 1, step=1) + return is_simple_lookup(index + 1, kind=1) return False @@ -145,9 +138,9 @@ def is_simple_operand(index: int, kind: Literal["base", "exponent"]) -> bool: should_hug = ( (0 < idx < len(line.leaves) - 1) and leaf.type == token.DOUBLESTAR - and is_simple_operand(idx - 1, kind="base") + and is_simple_operand(idx - 1, kind=-1) and line.leaves[idx - 1].value != "lambda" - and is_simple_operand(idx + 1, kind="exponent") + and is_simple_operand(idx + 1, kind=1) ) if should_hug: new_leaf.prefix = "" @@ -162,6 +155,99 @@ def is_simple_operand(index: int, kind: Literal["base", "exponent"]) -> bool: yield new_line +def original_is_simple_lookup_func( + line: Line, index: int, step: Literal[1, -1] +) -> bool: + if step == -1: + disallowed = {token.RPAR, token.RSQB} + else: + disallowed = {token.LPAR, token.LSQB} + + while 0 <= index < len(line.leaves): + current = line.leaves[index] + if current.type in disallowed: + return False + if current.type not in {token.NAME, token.DOT} or current.value == "for": + # If the current token isn't disallowed, we'll assume this is + # simple as only the disallowed tokens are semantically + # attached to this lookup expression we're checking. Also, + # stop early if we hit the 'for' bit of a comprehension. + return True + + index += step + + return True + + +def handle_is_simple_look_up_prev(line: Line, index: int, disallowed: Set[int]) -> bool: + """ + Handling the determination of is_simple_lookup for the lines prior to the doublestar + token. This is required because of the need to isolate the chained expression + to determine the bracket or parenthesis belong to the single expression. + """ + contains_disallowed = False + chain = [] + + while 0 <= index < len(line.leaves): + current = line.leaves[index] + chain.append(current) + if not contains_disallowed and current.type in disallowed: + contains_disallowed = True + if not is_expression_chained(chain): + return not contains_disallowed + + index -= 1 + + return True + + +def handle_is_simple_lookup_forward( + line: Line, index: int, disallowed: Set[int] +) -> bool: + """ + Handling decision is_simple_lookup for the lines behind the doublestar token. + This function is simplified to keep consistent with the prior logic and the forward + case are more straightforward and do not need to care about chained expressions. + """ + while 0 <= index < len(line.leaves): + current = line.leaves[index] + if current.type in disallowed: + return False + if current.type not in {token.NAME, token.DOT} or ( + current.type == token.NAME and current.value == "for" + ): + # If the current token isn't disallowed, we'll assume this is simple as + # only the disallowed tokens are semantically attached to this lookup + # expression we're checking. Also, stop early if we hit the 'for' bit + # of a comprehension. + return True + + index += 1 + + return True + + +def is_expression_chained(chained_leaves: List[Leaf]) -> bool: + """ + Function to determine if the variable is a chained call. + (e.g., foo.lookup, foo().lookup, (foo.lookup())) will be recognized as chained call) + """ + if len(chained_leaves) < 2: + return True + + current_leaf = chained_leaves[-1] + past_leaf = chained_leaves[-2] + + if past_leaf.type == token.NAME: + return current_leaf.type in {token.DOT} + elif past_leaf.type in {token.RPAR, token.RSQB}: + return current_leaf.type in {token.RSQB, token.RPAR} + elif past_leaf.type in {token.LPAR, token.LSQB}: + return current_leaf.type in {token.NAME, token.LPAR, token.LSQB} + else: + return False + + class StringTransformer(ABC): """ An implementation of the Transformer protocol that relies on its diff --git a/.venv/Lib/site-packages/blackd/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/blackd/__pycache__/__init__.cpython-311.pyc index e1a800a..1bafdd8 100644 Binary files a/.venv/Lib/site-packages/blackd/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/blackd/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blackd/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/blackd/__pycache__/__main__.cpython-311.pyc index 200be74..f726224 100644 Binary files a/.venv/Lib/site-packages/blackd/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/blackd/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blackd/__pycache__/middlewares.cpython-311.pyc b/.venv/Lib/site-packages/blackd/__pycache__/middlewares.cpython-311.pyc index 0409e19..7acab24 100644 Binary files a/.venv/Lib/site-packages/blackd/__pycache__/middlewares.cpython-311.pyc and b/.venv/Lib/site-packages/blackd/__pycache__/middlewares.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blib2to3/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/blib2to3/__pycache__/__init__.cpython-311.pyc index c4baa4a..7b7fdb1 100644 Binary files a/.venv/Lib/site-packages/blib2to3/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/blib2to3/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blib2to3/__pycache__/pygram.cpython-311.pyc b/.venv/Lib/site-packages/blib2to3/__pycache__/pygram.cpython-311.pyc index 55f1c8c..7171d8d 100644 Binary files a/.venv/Lib/site-packages/blib2to3/__pycache__/pygram.cpython-311.pyc and b/.venv/Lib/site-packages/blib2to3/__pycache__/pygram.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blib2to3/__pycache__/pytree.cpython-311.pyc b/.venv/Lib/site-packages/blib2to3/__pycache__/pytree.cpython-311.pyc index 39137b8..cc63576 100644 Binary files a/.venv/Lib/site-packages/blib2to3/__pycache__/pytree.cpython-311.pyc and b/.venv/Lib/site-packages/blib2to3/__pycache__/pytree.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/__init__.cpython-311.pyc index 0757f89..5a09057 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/conv.cpython-311.pyc b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/conv.cpython-311.pyc index 2f23f39..726ca62 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/conv.cpython-311.pyc and b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/conv.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/driver.cpython-311.pyc b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/driver.cpython-311.pyc index cade7fe..d51fc82 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/driver.cpython-311.pyc and b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/driver.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/grammar.cpython-311.pyc b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/grammar.cpython-311.pyc index 0ed4529..531ea03 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/grammar.cpython-311.pyc and b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/grammar.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/literals.cpython-311.pyc b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/literals.cpython-311.pyc index cc08557..0b7ee28 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/literals.cpython-311.pyc and b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/literals.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/parse.cpython-311.pyc b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/parse.cpython-311.pyc index 2d4b26a..14ce653 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/parse.cpython-311.pyc and b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/parse.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/pgen.cpython-311.pyc b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/pgen.cpython-311.pyc index 5a91285..deed9ba 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/pgen.cpython-311.pyc and b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/pgen.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/token.cpython-311.pyc b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/token.cpython-311.pyc index 150203e..23b7557 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/token.cpython-311.pyc and b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/token.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/tokenize.cpython-311.pyc b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/tokenize.cpython-311.pyc index 0470e48..c03aed0 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/tokenize.cpython-311.pyc and b/.venv/Lib/site-packages/blib2to3/pgen2/__pycache__/tokenize.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/conv.cp311-win_amd64.pyd b/.venv/Lib/site-packages/blib2to3/pgen2/conv.cp311-win_amd64.pyd index 2588ce4..17a1ade 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/conv.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/blib2to3/pgen2/conv.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/driver.cp311-win_amd64.pyd b/.venv/Lib/site-packages/blib2to3/pgen2/driver.cp311-win_amd64.pyd index 2769eed..e30d847 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/driver.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/blib2to3/pgen2/driver.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/grammar.cp311-win_amd64.pyd b/.venv/Lib/site-packages/blib2to3/pgen2/grammar.cp311-win_amd64.pyd index f29c551..ddd88fd 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/grammar.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/blib2to3/pgen2/grammar.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/literals.cp311-win_amd64.pyd b/.venv/Lib/site-packages/blib2to3/pgen2/literals.cp311-win_amd64.pyd index 1a427b8..21fb3f5 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/literals.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/blib2to3/pgen2/literals.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/parse.cp311-win_amd64.pyd b/.venv/Lib/site-packages/blib2to3/pgen2/parse.cp311-win_amd64.pyd index 30388a4..30cd26f 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/parse.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/blib2to3/pgen2/parse.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/pgen.cp311-win_amd64.pyd b/.venv/Lib/site-packages/blib2to3/pgen2/pgen.cp311-win_amd64.pyd index 782b0bc..9dbdd40 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/pgen.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/blib2to3/pgen2/pgen.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/token.cp311-win_amd64.pyd b/.venv/Lib/site-packages/blib2to3/pgen2/token.cp311-win_amd64.pyd index b6740cc..f0075e4 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/token.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/blib2to3/pgen2/token.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/blib2to3/pgen2/tokenize.cp311-win_amd64.pyd b/.venv/Lib/site-packages/blib2to3/pgen2/tokenize.cp311-win_amd64.pyd index e5f4b50..2eca88c 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pgen2/tokenize.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/blib2to3/pgen2/tokenize.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/blib2to3/pygram.cp311-win_amd64.pyd b/.venv/Lib/site-packages/blib2to3/pygram.cp311-win_amd64.pyd index e59fa0d..8243104 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pygram.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/blib2to3/pygram.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/blib2to3/pytree.cp311-win_amd64.pyd b/.venv/Lib/site-packages/blib2to3/pytree.cp311-win_amd64.pyd index dbd79b3..2cab6a3 100644 Binary files a/.venv/Lib/site-packages/blib2to3/pytree.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/blib2to3/pytree.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/chevron-0.14.0.dist-info/RECORD b/.venv/Lib/site-packages/chevron-0.14.0.dist-info/RECORD index e5ffb2f..a5555ec 100644 --- a/.venv/Lib/site-packages/chevron-0.14.0.dist-info/RECORD +++ b/.venv/Lib/site-packages/chevron-0.14.0.dist-info/RECORD @@ -1,4 +1,4 @@ -../../Scripts/chevron.exe,sha256=fSwhIrEN9oGYnma_A_Wnf0CmDDZghEof4Mkdgs58-ZM,108423 +../../Scripts/chevron.exe,sha256=PpNxEz15Z5rHr7t4wZrg6xqfBrQQ65Y9nS7GYomYH0s,108423 chevron-0.14.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 chevron-0.14.0.dist-info/LICENSE,sha256=DxdmdxUkdeureg_qrMdTa2SbttLIqb-RqVPT2ToQFys,1081 chevron-0.14.0.dist-info/METADATA,sha256=spkAlhejSRn0sz2KTmX3eUC8JMkamrjDRl1BZ8SpkhM,4899 diff --git a/.venv/Lib/site-packages/chevron/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/chevron/__pycache__/__init__.cpython-311.pyc index d51ecba..a3ad543 100644 Binary files a/.venv/Lib/site-packages/chevron/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/chevron/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/chevron/__pycache__/main.cpython-311.pyc b/.venv/Lib/site-packages/chevron/__pycache__/main.cpython-311.pyc index 316540c..b005dc5 100644 Binary files a/.venv/Lib/site-packages/chevron/__pycache__/main.cpython-311.pyc and b/.venv/Lib/site-packages/chevron/__pycache__/main.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/chevron/__pycache__/metadata.cpython-311.pyc b/.venv/Lib/site-packages/chevron/__pycache__/metadata.cpython-311.pyc index 869f8ab..1fc68ce 100644 Binary files a/.venv/Lib/site-packages/chevron/__pycache__/metadata.cpython-311.pyc and b/.venv/Lib/site-packages/chevron/__pycache__/metadata.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/chevron/__pycache__/renderer.cpython-311.pyc b/.venv/Lib/site-packages/chevron/__pycache__/renderer.cpython-311.pyc index 4255082..5ee135a 100644 Binary files a/.venv/Lib/site-packages/chevron/__pycache__/renderer.cpython-311.pyc and b/.venv/Lib/site-packages/chevron/__pycache__/renderer.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/chevron/__pycache__/tokenizer.cpython-311.pyc b/.venv/Lib/site-packages/chevron/__pycache__/tokenizer.cpython-311.pyc index cf017f7..1f7d3c3 100644 Binary files a/.venv/Lib/site-packages/chevron/__pycache__/tokenizer.cpython-311.pyc and b/.venv/Lib/site-packages/chevron/__pycache__/tokenizer.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/__init__.cpython-311.pyc index 3badc50..f239590 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/_compat.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/_compat.cpython-311.pyc index d9bad2f..9f3d405 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/_compat.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/_compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc index a65984f..3e75cf1 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/_termui_impl.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-311.pyc index 946a1a0..cf5285a 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/_textwrap.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-311.pyc index 2d03825..8f24f6b 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/_winconsole.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/core.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/core.cpython-311.pyc index f36c7f2..64e148f 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/core.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/core.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/decorators.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/decorators.cpython-311.pyc index d602849..32ca384 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/decorators.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/decorators.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/exceptions.cpython-311.pyc index bd9a612..d810aae 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/formatting.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/formatting.cpython-311.pyc index 3f9cac7..9d5e216 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/formatting.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/formatting.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/globals.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/globals.cpython-311.pyc index 00c4834..615d0e3 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/globals.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/globals.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/parser.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/parser.cpython-311.pyc index 3340197..4efecc6 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/parser.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/parser.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/shell_completion.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/shell_completion.cpython-311.pyc index c27979a..176467f 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/shell_completion.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/shell_completion.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/termui.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/termui.cpython-311.pyc index 7b0007b..7ef334e 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/termui.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/termui.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/testing.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/testing.cpython-311.pyc index 19308dc..07987c3 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/testing.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/testing.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/types.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/types.cpython-311.pyc index ed5f10b..2120461 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/types.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/types.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/click/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/click/__pycache__/utils.cpython-311.pyc index c92f6cf..7c54467 100644 Binary files a/.venv/Lib/site-packages/click/__pycache__/utils.cpython-311.pyc and b/.venv/Lib/site-packages/click/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-311.pyc index a967bf5..d327d54 100644 Binary files a/.venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/colorama/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-311.pyc b/.venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-311.pyc index 4b8ab6d..2555f62 100644 Binary files a/.venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-311.pyc and b/.venv/Lib/site-packages/colorama/__pycache__/ansi.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-311.pyc b/.venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-311.pyc index e8b74cc..95e2289 100644 Binary files a/.venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-311.pyc and b/.venv/Lib/site-packages/colorama/__pycache__/ansitowin32.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-311.pyc b/.venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-311.pyc index ab50c73..d297e86 100644 Binary files a/.venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-311.pyc and b/.venv/Lib/site-packages/colorama/__pycache__/initialise.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/colorama/__pycache__/win32.cpython-311.pyc b/.venv/Lib/site-packages/colorama/__pycache__/win32.cpython-311.pyc index 2822895..94ef67d 100644 Binary files a/.venv/Lib/site-packages/colorama/__pycache__/win32.cpython-311.pyc and b/.venv/Lib/site-packages/colorama/__pycache__/win32.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-311.pyc b/.venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-311.pyc index 29860a2..898760b 100644 Binary files a/.venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-311.pyc and b/.venv/Lib/site-packages/colorama/__pycache__/winterm.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/colorama/tests/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/colorama/tests/__pycache__/__init__.cpython-311.pyc index 45de1eb..6ac7528 100644 Binary files a/.venv/Lib/site-packages/colorama/tests/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/colorama/tests/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/colorama/tests/__pycache__/ansi_test.cpython-311.pyc b/.venv/Lib/site-packages/colorama/tests/__pycache__/ansi_test.cpython-311.pyc index a5f0ff3..9c9498c 100644 Binary files a/.venv/Lib/site-packages/colorama/tests/__pycache__/ansi_test.cpython-311.pyc and b/.venv/Lib/site-packages/colorama/tests/__pycache__/ansi_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc b/.venv/Lib/site-packages/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc index 591999c..e9dc7fe 100644 Binary files a/.venv/Lib/site-packages/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc and b/.venv/Lib/site-packages/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/colorama/tests/__pycache__/initialise_test.cpython-311.pyc b/.venv/Lib/site-packages/colorama/tests/__pycache__/initialise_test.cpython-311.pyc index 91e3b5b..e42f207 100644 Binary files a/.venv/Lib/site-packages/colorama/tests/__pycache__/initialise_test.cpython-311.pyc and b/.venv/Lib/site-packages/colorama/tests/__pycache__/initialise_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/colorama/tests/__pycache__/isatty_test.cpython-311.pyc b/.venv/Lib/site-packages/colorama/tests/__pycache__/isatty_test.cpython-311.pyc index 21576c1..c061305 100644 Binary files a/.venv/Lib/site-packages/colorama/tests/__pycache__/isatty_test.cpython-311.pyc and b/.venv/Lib/site-packages/colorama/tests/__pycache__/isatty_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/colorama/tests/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/colorama/tests/__pycache__/utils.cpython-311.pyc index cfcd2b3..ededc0f 100644 Binary files a/.venv/Lib/site-packages/colorama/tests/__pycache__/utils.cpython-311.pyc and b/.venv/Lib/site-packages/colorama/tests/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/colorama/tests/__pycache__/winterm_test.cpython-311.pyc b/.venv/Lib/site-packages/colorama/tests/__pycache__/winterm_test.cpython-311.pyc index e4fca6f..ac976c0 100644 Binary files a/.venv/Lib/site-packages/colorama/tests/__pycache__/winterm_test.cpython-311.pyc and b/.venv/Lib/site-packages/colorama/tests/__pycache__/winterm_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/__pycache__/__init__.cpython-311.pyc index 8c652d7..b2a1ee1 100644 Binary files a/.venv/Lib/site-packages/commentjson/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/__pycache__/commentjson.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/__pycache__/commentjson.cpython-311.pyc index 3c77bc1..ff894d7 100644 Binary files a/.venv/Lib/site-packages/commentjson/__pycache__/commentjson.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/__pycache__/commentjson.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/tests/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/tests/__pycache__/__init__.cpython-311.pyc index e73a067..4be3cdc 100644 Binary files a/.venv/Lib/site-packages/commentjson/tests/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/tests/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/tests/__pycache__/test_commentjson.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/tests/__pycache__/test_commentjson.cpython-311.pyc index aa1aa19..41d0411 100644 Binary files a/.venv/Lib/site-packages/commentjson/tests/__pycache__/test_commentjson.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/tests/__pycache__/test_commentjson.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/__init__.cpython-311.pyc index c4673dd..51eaa61 100644 Binary files a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_decode.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_decode.cpython-311.pyc index f70da8d..0073e96 100644 Binary files a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_decode.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_decode.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_dump.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_dump.cpython-311.pyc index 8fcd658..7c4fcea 100644 Binary files a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_dump.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_dump.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_encode_basestring_ascii.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_encode_basestring_ascii.cpython-311.pyc index b11cc9e..4c2eeb0 100644 Binary files a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_encode_basestring_ascii.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_encode_basestring_ascii.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_float.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_float.cpython-311.pyc index 6a85cd7..48bdbba 100644 Binary files a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_float.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_float.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_indent.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_indent.cpython-311.pyc index c34141d..66fb536 100644 Binary files a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_indent.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_indent.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_pass1.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_pass1.cpython-311.pyc index 3e8e9fb..c37763b 100644 Binary files a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_pass1.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_pass1.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_pass2.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_pass2.cpython-311.pyc index 0919e54..21c2f29 100644 Binary files a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_pass2.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_pass2.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_pass3.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_pass3.cpython-311.pyc index 5462ecf..fdc83d3 100644 Binary files a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_pass3.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_pass3.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_recursion.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_recursion.cpython-311.pyc index 403fde3..3935f64 100644 Binary files a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_recursion.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_recursion.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_separators.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_separators.cpython-311.pyc index bcf24c3..29c5cac 100644 Binary files a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_separators.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_separators.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_unicode.cpython-311.pyc b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_unicode.cpython-311.pyc index aa63f5e..cb17471 100644 Binary files a/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_unicode.cpython-311.pyc and b/.venv/Lib/site-packages/commentjson/tests/test_json/__pycache__/test_unicode.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema-4.21.1.dist-info/RECORD b/.venv/Lib/site-packages/jsonschema-4.21.1.dist-info/RECORD index a155111..6285f6e 100644 --- a/.venv/Lib/site-packages/jsonschema-4.21.1.dist-info/RECORD +++ b/.venv/Lib/site-packages/jsonschema-4.21.1.dist-info/RECORD @@ -1,4 +1,4 @@ -../../Scripts/jsonschema.exe,sha256=Acd4ceIjOwoH2vOzNR00uEKkIRkFsjFO6DvW_y-Bk90,108422 +../../Scripts/jsonschema.exe,sha256=oZW6AMxkkn7dUXbkVuPHNfW38VzZBVol7R8lIsbYCWg,108422 jsonschema-4.21.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 jsonschema-4.21.1.dist-info/METADATA,sha256=x2J7cuqnMmopRhlFHCtWMD1nQ3qiUpMqh0yz2cRTPT8,7831 jsonschema-4.21.1.dist-info/RECORD,, diff --git a/.venv/Lib/site-packages/jsonschema/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/__pycache__/__init__.cpython-311.pyc index fc74c5c..6a1c41e 100644 Binary files a/.venv/Lib/site-packages/jsonschema/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/__pycache__/__main__.cpython-311.pyc index c8f11e4..0aefcca 100644 Binary files a/.venv/Lib/site-packages/jsonschema/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/__pycache__/_format.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/__pycache__/_format.cpython-311.pyc index df19f6c..21ae1ca 100644 Binary files a/.venv/Lib/site-packages/jsonschema/__pycache__/_format.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/__pycache__/_format.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/__pycache__/_keywords.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/__pycache__/_keywords.cpython-311.pyc index 0638870..8f393cc 100644 Binary files a/.venv/Lib/site-packages/jsonschema/__pycache__/_keywords.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/__pycache__/_keywords.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/__pycache__/_legacy_keywords.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/__pycache__/_legacy_keywords.cpython-311.pyc index 0461fc0..664db06 100644 Binary files a/.venv/Lib/site-packages/jsonschema/__pycache__/_legacy_keywords.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/__pycache__/_legacy_keywords.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/__pycache__/_types.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/__pycache__/_types.cpython-311.pyc index 864b1c0..eeab8f4 100644 Binary files a/.venv/Lib/site-packages/jsonschema/__pycache__/_types.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/__pycache__/_types.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/__pycache__/_typing.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/__pycache__/_typing.cpython-311.pyc index 4164789..5287832 100644 Binary files a/.venv/Lib/site-packages/jsonschema/__pycache__/_typing.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/__pycache__/_typing.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/__pycache__/_utils.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/__pycache__/_utils.cpython-311.pyc index 5bb939f..a62128d 100644 Binary files a/.venv/Lib/site-packages/jsonschema/__pycache__/_utils.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/__pycache__/_utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/__pycache__/cli.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/__pycache__/cli.cpython-311.pyc index 4fc234c..db98690 100644 Binary files a/.venv/Lib/site-packages/jsonschema/__pycache__/cli.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/__pycache__/cli.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/__pycache__/exceptions.cpython-311.pyc index b5bf76d..840c925 100644 Binary files a/.venv/Lib/site-packages/jsonschema/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/__pycache__/protocols.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/__pycache__/protocols.cpython-311.pyc index b49a701..5f51e18 100644 Binary files a/.venv/Lib/site-packages/jsonschema/__pycache__/protocols.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/__pycache__/protocols.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/__pycache__/validators.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/__pycache__/validators.cpython-311.pyc index 2416599..56b6fe2 100644 Binary files a/.venv/Lib/site-packages/jsonschema/__pycache__/validators.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/__pycache__/validators.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/__init__.cpython-311.pyc index d625902..13a1c9a 100644 Binary files a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/contains.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/contains.cpython-311.pyc index ff0c979..00ae5c7 100644 Binary files a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/contains.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/contains.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/issue232.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/issue232.cpython-311.pyc index 2b0b8f7..c1c8be1 100644 Binary files a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/issue232.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/issue232.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/json_schema_test_suite.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/json_schema_test_suite.cpython-311.pyc index 1fb7483..b55cc7e 100644 Binary files a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/json_schema_test_suite.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/json_schema_test_suite.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/nested_schemas.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/nested_schemas.cpython-311.pyc index 928fae0..9c6211c 100644 Binary files a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/nested_schemas.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/nested_schemas.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/subcomponents.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/subcomponents.cpython-311.pyc index 9919317..586ca80 100644 Binary files a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/subcomponents.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/subcomponents.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/unused_registry.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/unused_registry.cpython-311.pyc index fd3b611..29e51c9 100644 Binary files a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/unused_registry.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/unused_registry.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/validator_creation.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/validator_creation.cpython-311.pyc index c33ca34..f5d4f8a 100644 Binary files a/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/validator_creation.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/benchmarks/__pycache__/validator_creation.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/__init__.cpython-311.pyc index ef22029..c1f5d70 100644 Binary files a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/_suite.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/_suite.cpython-311.pyc index 94d6cc1..fae00a2 100644 Binary files a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/_suite.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/_suite.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/fuzz_validate.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/fuzz_validate.cpython-311.pyc index db5104c..7763afd 100644 Binary files a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/fuzz_validate.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/fuzz_validate.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_cli.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_cli.cpython-311.pyc index 1bee293..1d82ef7 100644 Binary files a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_cli.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_cli.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_deprecations.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_deprecations.cpython-311.pyc index b3ec187..894edaa 100644 Binary files a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_deprecations.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_deprecations.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_exceptions.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_exceptions.cpython-311.pyc index f0f63e0..1594800 100644 Binary files a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_format.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_format.cpython-311.pyc index 49a3ca6..74ddb9c 100644 Binary files a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_format.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_format.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_jsonschema_test_suite.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_jsonschema_test_suite.cpython-311.pyc index 3609bce..247c9d0 100644 Binary files a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_jsonschema_test_suite.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_jsonschema_test_suite.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_types.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_types.cpython-311.pyc index dc45469..989dda1 100644 Binary files a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_types.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_types.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_utils.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_utils.cpython-311.pyc index 82888e0..d782f0c 100644 Binary files a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_utils.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_validators.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_validators.cpython-311.pyc index 9903c3d..ada9b28 100644 Binary files a/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_validators.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema/tests/__pycache__/test_validators.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema_specifications/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema_specifications/__pycache__/__init__.cpython-311.pyc index 32047e2..e6ac515 100644 Binary files a/.venv/Lib/site-packages/jsonschema_specifications/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema_specifications/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema_specifications/__pycache__/_core.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema_specifications/__pycache__/_core.cpython-311.pyc index d5f2719..1e8c94c 100644 Binary files a/.venv/Lib/site-packages/jsonschema_specifications/__pycache__/_core.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema_specifications/__pycache__/_core.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema_specifications/tests/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema_specifications/tests/__pycache__/__init__.cpython-311.pyc index 69fbadb..39e292e 100644 Binary files a/.venv/Lib/site-packages/jsonschema_specifications/tests/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema_specifications/tests/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/jsonschema_specifications/tests/__pycache__/test_jsonschema_specifications.cpython-311.pyc b/.venv/Lib/site-packages/jsonschema_specifications/tests/__pycache__/test_jsonschema_specifications.cpython-311.pyc index 74129ad..17a4ef4 100644 Binary files a/.venv/Lib/site-packages/jsonschema_specifications/tests/__pycache__/test_jsonschema_specifications.cpython-311.pyc and b/.venv/Lib/site-packages/jsonschema_specifications/tests/__pycache__/test_jsonschema_specifications.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/lark/__pycache__/__init__.cpython-311.pyc index 1908fbb..8d80f8d 100644 Binary files a/.venv/Lib/site-packages/lark/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/lark/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/__pycache__/common.cpython-311.pyc b/.venv/Lib/site-packages/lark/__pycache__/common.cpython-311.pyc index 3042cf7..f72ad68 100644 Binary files a/.venv/Lib/site-packages/lark/__pycache__/common.cpython-311.pyc and b/.venv/Lib/site-packages/lark/__pycache__/common.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/lark/__pycache__/exceptions.cpython-311.pyc index 113444e..c2ab68b 100644 Binary files a/.venv/Lib/site-packages/lark/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/lark/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/__pycache__/grammar.cpython-311.pyc b/.venv/Lib/site-packages/lark/__pycache__/grammar.cpython-311.pyc index 861201f..923b90f 100644 Binary files a/.venv/Lib/site-packages/lark/__pycache__/grammar.cpython-311.pyc and b/.venv/Lib/site-packages/lark/__pycache__/grammar.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/__pycache__/indenter.cpython-311.pyc b/.venv/Lib/site-packages/lark/__pycache__/indenter.cpython-311.pyc index 42c9da0..20deb78 100644 Binary files a/.venv/Lib/site-packages/lark/__pycache__/indenter.cpython-311.pyc and b/.venv/Lib/site-packages/lark/__pycache__/indenter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/__pycache__/lark.cpython-311.pyc b/.venv/Lib/site-packages/lark/__pycache__/lark.cpython-311.pyc index 4871964..c107277 100644 Binary files a/.venv/Lib/site-packages/lark/__pycache__/lark.cpython-311.pyc and b/.venv/Lib/site-packages/lark/__pycache__/lark.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/__pycache__/lexer.cpython-311.pyc b/.venv/Lib/site-packages/lark/__pycache__/lexer.cpython-311.pyc index 5cbf917..34db8c4 100644 Binary files a/.venv/Lib/site-packages/lark/__pycache__/lexer.cpython-311.pyc and b/.venv/Lib/site-packages/lark/__pycache__/lexer.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/__pycache__/load_grammar.cpython-311.pyc b/.venv/Lib/site-packages/lark/__pycache__/load_grammar.cpython-311.pyc index 86add01..d8ff75f 100644 Binary files a/.venv/Lib/site-packages/lark/__pycache__/load_grammar.cpython-311.pyc and b/.venv/Lib/site-packages/lark/__pycache__/load_grammar.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/__pycache__/parse_tree_builder.cpython-311.pyc b/.venv/Lib/site-packages/lark/__pycache__/parse_tree_builder.cpython-311.pyc index 2b4cf73..398c83a 100644 Binary files a/.venv/Lib/site-packages/lark/__pycache__/parse_tree_builder.cpython-311.pyc and b/.venv/Lib/site-packages/lark/__pycache__/parse_tree_builder.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/__pycache__/parser_frontends.cpython-311.pyc b/.venv/Lib/site-packages/lark/__pycache__/parser_frontends.cpython-311.pyc index e1dc55a..834155d 100644 Binary files a/.venv/Lib/site-packages/lark/__pycache__/parser_frontends.cpython-311.pyc and b/.venv/Lib/site-packages/lark/__pycache__/parser_frontends.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/__pycache__/reconstruct.cpython-311.pyc b/.venv/Lib/site-packages/lark/__pycache__/reconstruct.cpython-311.pyc index 94d4e48..b566480 100644 Binary files a/.venv/Lib/site-packages/lark/__pycache__/reconstruct.cpython-311.pyc and b/.venv/Lib/site-packages/lark/__pycache__/reconstruct.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/__pycache__/tree.cpython-311.pyc b/.venv/Lib/site-packages/lark/__pycache__/tree.cpython-311.pyc index f7ffe19..6b669d7 100644 Binary files a/.venv/Lib/site-packages/lark/__pycache__/tree.cpython-311.pyc and b/.venv/Lib/site-packages/lark/__pycache__/tree.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/lark/__pycache__/utils.cpython-311.pyc index eae9888..3be6564 100644 Binary files a/.venv/Lib/site-packages/lark/__pycache__/utils.cpython-311.pyc and b/.venv/Lib/site-packages/lark/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/__pycache__/visitors.cpython-311.pyc b/.venv/Lib/site-packages/lark/__pycache__/visitors.cpython-311.pyc index 31ea94b..bda18f6 100644 Binary files a/.venv/Lib/site-packages/lark/__pycache__/visitors.cpython-311.pyc and b/.venv/Lib/site-packages/lark/__pycache__/visitors.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/parsers/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/lark/parsers/__pycache__/__init__.cpython-311.pyc index b2ce2db..331d992 100644 Binary files a/.venv/Lib/site-packages/lark/parsers/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/lark/parsers/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/parsers/__pycache__/cyk.cpython-311.pyc b/.venv/Lib/site-packages/lark/parsers/__pycache__/cyk.cpython-311.pyc index c4f9f5d..94931f9 100644 Binary files a/.venv/Lib/site-packages/lark/parsers/__pycache__/cyk.cpython-311.pyc and b/.venv/Lib/site-packages/lark/parsers/__pycache__/cyk.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/parsers/__pycache__/earley.cpython-311.pyc b/.venv/Lib/site-packages/lark/parsers/__pycache__/earley.cpython-311.pyc index 8eebdd1..492e5ef 100644 Binary files a/.venv/Lib/site-packages/lark/parsers/__pycache__/earley.cpython-311.pyc and b/.venv/Lib/site-packages/lark/parsers/__pycache__/earley.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/parsers/__pycache__/earley_common.cpython-311.pyc b/.venv/Lib/site-packages/lark/parsers/__pycache__/earley_common.cpython-311.pyc index a880768..e57e2ca 100644 Binary files a/.venv/Lib/site-packages/lark/parsers/__pycache__/earley_common.cpython-311.pyc and b/.venv/Lib/site-packages/lark/parsers/__pycache__/earley_common.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/parsers/__pycache__/earley_forest.cpython-311.pyc b/.venv/Lib/site-packages/lark/parsers/__pycache__/earley_forest.cpython-311.pyc index b564bdf..5bb430f 100644 Binary files a/.venv/Lib/site-packages/lark/parsers/__pycache__/earley_forest.cpython-311.pyc and b/.venv/Lib/site-packages/lark/parsers/__pycache__/earley_forest.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/parsers/__pycache__/grammar_analysis.cpython-311.pyc b/.venv/Lib/site-packages/lark/parsers/__pycache__/grammar_analysis.cpython-311.pyc index a527a3c..84842f3 100644 Binary files a/.venv/Lib/site-packages/lark/parsers/__pycache__/grammar_analysis.cpython-311.pyc and b/.venv/Lib/site-packages/lark/parsers/__pycache__/grammar_analysis.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/parsers/__pycache__/lalr_analysis.cpython-311.pyc b/.venv/Lib/site-packages/lark/parsers/__pycache__/lalr_analysis.cpython-311.pyc index 161c58d..70b7c17 100644 Binary files a/.venv/Lib/site-packages/lark/parsers/__pycache__/lalr_analysis.cpython-311.pyc and b/.venv/Lib/site-packages/lark/parsers/__pycache__/lalr_analysis.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/parsers/__pycache__/lalr_parser.cpython-311.pyc b/.venv/Lib/site-packages/lark/parsers/__pycache__/lalr_parser.cpython-311.pyc index ef841cc..3b70345 100644 Binary files a/.venv/Lib/site-packages/lark/parsers/__pycache__/lalr_parser.cpython-311.pyc and b/.venv/Lib/site-packages/lark/parsers/__pycache__/lalr_parser.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/parsers/__pycache__/xearley.cpython-311.pyc b/.venv/Lib/site-packages/lark/parsers/__pycache__/xearley.cpython-311.pyc index aa46196..15c67e0 100644 Binary files a/.venv/Lib/site-packages/lark/parsers/__pycache__/xearley.cpython-311.pyc and b/.venv/Lib/site-packages/lark/parsers/__pycache__/xearley.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/tools/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/lark/tools/__pycache__/__init__.cpython-311.pyc index 1e05b06..3d00ec4 100644 Binary files a/.venv/Lib/site-packages/lark/tools/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/lark/tools/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/tools/__pycache__/nearley.cpython-311.pyc b/.venv/Lib/site-packages/lark/tools/__pycache__/nearley.cpython-311.pyc index b094b27..338c0a7 100644 Binary files a/.venv/Lib/site-packages/lark/tools/__pycache__/nearley.cpython-311.pyc and b/.venv/Lib/site-packages/lark/tools/__pycache__/nearley.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/tools/__pycache__/serialize.cpython-311.pyc b/.venv/Lib/site-packages/lark/tools/__pycache__/serialize.cpython-311.pyc index f60cf68..b8290a1 100644 Binary files a/.venv/Lib/site-packages/lark/tools/__pycache__/serialize.cpython-311.pyc and b/.venv/Lib/site-packages/lark/tools/__pycache__/serialize.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/lark/tools/__pycache__/standalone.cpython-311.pyc b/.venv/Lib/site-packages/lark/tools/__pycache__/standalone.cpython-311.pyc index 0a84985..6198b6d 100644 Binary files a/.venv/Lib/site-packages/lark/tools/__pycache__/standalone.cpython-311.pyc and b/.venv/Lib/site-packages/lark/tools/__pycache__/standalone.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/mclang/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/mclang/__pycache__/__init__.cpython-311.pyc index 6b76ad2..961aed9 100644 Binary files a/.venv/Lib/site-packages/mclang/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/mclang/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/mclang/__pycache__/decoder.cpython-311.pyc b/.venv/Lib/site-packages/mclang/__pycache__/decoder.cpython-311.pyc index a00ff86..49c9337 100644 Binary files a/.venv/Lib/site-packages/mclang/__pycache__/decoder.cpython-311.pyc and b/.venv/Lib/site-packages/mclang/__pycache__/decoder.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/mclang/__pycache__/encoder.cpython-311.pyc b/.venv/Lib/site-packages/mclang/__pycache__/encoder.cpython-311.pyc index d08bd43..ab1d1e5 100644 Binary files a/.venv/Lib/site-packages/mclang/__pycache__/encoder.cpython-311.pyc and b/.venv/Lib/site-packages/mclang/__pycache__/encoder.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/molang-0.0.2.dist-info/RECORD b/.venv/Lib/site-packages/molang-0.0.2.dist-info/RECORD index ea5d90f..15a0dbb 100644 --- a/.venv/Lib/site-packages/molang-0.0.2.dist-info/RECORD +++ b/.venv/Lib/site-packages/molang-0.0.2.dist-info/RECORD @@ -1,4 +1,4 @@ -../../Scripts/molang.exe,sha256=ZfiOc1s5s968JLQDyPI2dJbBxEnhZHQcnh17vJaTBfY,108418 +../../Scripts/molang.exe,sha256=4L6nP0StU9xw7U7PIFDUbZ6acYmDT5GBOz4Ze789zgI,108418 molang-0.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 molang-0.0.2.dist-info/LICENSE,sha256=v00lmoXHiwPMD-3f1XtIV3OjxysvTzQ0wvCgPSt2mLc,1088 molang-0.0.2.dist-info/METADATA,sha256=IqL3Oj0OrZYrF4_pjM1bEt-uJNp0TXGM5Hq4XokUFis,2148 diff --git a/.venv/Lib/site-packages/molang/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/molang/__pycache__/__init__.cpython-311.pyc index b3f74f1..9fa0d77 100644 Binary files a/.venv/Lib/site-packages/molang/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/molang/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/molang/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/molang/__pycache__/__main__.cpython-311.pyc index 824686f..cff642c 100644 Binary files a/.venv/Lib/site-packages/molang/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/molang/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/molang/__pycache__/cli.cpython-311.pyc b/.venv/Lib/site-packages/molang/__pycache__/cli.cpython-311.pyc index 726c18c..37b9243 100644 Binary files a/.venv/Lib/site-packages/molang/__pycache__/cli.cpython-311.pyc and b/.venv/Lib/site-packages/molang/__pycache__/cli.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/packaging/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/packaging/__pycache__/__init__.cpython-311.pyc index 5fc2f7a..736ccdc 100644 Binary files a/.venv/Lib/site-packages/packaging/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/packaging/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/packaging/__pycache__/_elffile.cpython-311.pyc b/.venv/Lib/site-packages/packaging/__pycache__/_elffile.cpython-311.pyc index e02b1f0..4b81e06 100644 Binary files a/.venv/Lib/site-packages/packaging/__pycache__/_elffile.cpython-311.pyc and b/.venv/Lib/site-packages/packaging/__pycache__/_elffile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/packaging/__pycache__/_manylinux.cpython-311.pyc b/.venv/Lib/site-packages/packaging/__pycache__/_manylinux.cpython-311.pyc index e0400d8..2cf7694 100644 Binary files a/.venv/Lib/site-packages/packaging/__pycache__/_manylinux.cpython-311.pyc and b/.venv/Lib/site-packages/packaging/__pycache__/_manylinux.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/packaging/__pycache__/_musllinux.cpython-311.pyc b/.venv/Lib/site-packages/packaging/__pycache__/_musllinux.cpython-311.pyc index a24bb7e..98dc025 100644 Binary files a/.venv/Lib/site-packages/packaging/__pycache__/_musllinux.cpython-311.pyc and b/.venv/Lib/site-packages/packaging/__pycache__/_musllinux.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/packaging/__pycache__/_parser.cpython-311.pyc b/.venv/Lib/site-packages/packaging/__pycache__/_parser.cpython-311.pyc index 3ff44ba..d247597 100644 Binary files a/.venv/Lib/site-packages/packaging/__pycache__/_parser.cpython-311.pyc and b/.venv/Lib/site-packages/packaging/__pycache__/_parser.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/packaging/__pycache__/_structures.cpython-311.pyc b/.venv/Lib/site-packages/packaging/__pycache__/_structures.cpython-311.pyc index 13b2888..a0bd5b7 100644 Binary files a/.venv/Lib/site-packages/packaging/__pycache__/_structures.cpython-311.pyc and b/.venv/Lib/site-packages/packaging/__pycache__/_structures.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/packaging/__pycache__/_tokenizer.cpython-311.pyc b/.venv/Lib/site-packages/packaging/__pycache__/_tokenizer.cpython-311.pyc index e90d253..bd37ea7 100644 Binary files a/.venv/Lib/site-packages/packaging/__pycache__/_tokenizer.cpython-311.pyc and b/.venv/Lib/site-packages/packaging/__pycache__/_tokenizer.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/packaging/__pycache__/markers.cpython-311.pyc b/.venv/Lib/site-packages/packaging/__pycache__/markers.cpython-311.pyc index 6ba610f..d06ff34 100644 Binary files a/.venv/Lib/site-packages/packaging/__pycache__/markers.cpython-311.pyc and b/.venv/Lib/site-packages/packaging/__pycache__/markers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/packaging/__pycache__/metadata.cpython-311.pyc b/.venv/Lib/site-packages/packaging/__pycache__/metadata.cpython-311.pyc index f4c8d5d..58d255f 100644 Binary files a/.venv/Lib/site-packages/packaging/__pycache__/metadata.cpython-311.pyc and b/.venv/Lib/site-packages/packaging/__pycache__/metadata.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/packaging/__pycache__/requirements.cpython-311.pyc b/.venv/Lib/site-packages/packaging/__pycache__/requirements.cpython-311.pyc index e25071a..0f5f759 100644 Binary files a/.venv/Lib/site-packages/packaging/__pycache__/requirements.cpython-311.pyc and b/.venv/Lib/site-packages/packaging/__pycache__/requirements.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/packaging/__pycache__/specifiers.cpython-311.pyc b/.venv/Lib/site-packages/packaging/__pycache__/specifiers.cpython-311.pyc index 4aa8c20..eb5e561 100644 Binary files a/.venv/Lib/site-packages/packaging/__pycache__/specifiers.cpython-311.pyc and b/.venv/Lib/site-packages/packaging/__pycache__/specifiers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/packaging/__pycache__/tags.cpython-311.pyc b/.venv/Lib/site-packages/packaging/__pycache__/tags.cpython-311.pyc index 3f1113a..d693528 100644 Binary files a/.venv/Lib/site-packages/packaging/__pycache__/tags.cpython-311.pyc and b/.venv/Lib/site-packages/packaging/__pycache__/tags.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/packaging/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/packaging/__pycache__/utils.cpython-311.pyc index 1d01876..09e9d3b 100644 Binary files a/.venv/Lib/site-packages/packaging/__pycache__/utils.cpython-311.pyc and b/.venv/Lib/site-packages/packaging/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/packaging/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/packaging/__pycache__/version.cpython-311.pyc index 57c434c..21306c3 100644 Binary files a/.venv/Lib/site-packages/packaging/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/packaging/__pycache__/version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pathspec/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pathspec/__pycache__/__init__.cpython-311.pyc index bcc89bb..af55b9f 100644 Binary files a/.venv/Lib/site-packages/pathspec/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pathspec/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pathspec/__pycache__/_meta.cpython-311.pyc b/.venv/Lib/site-packages/pathspec/__pycache__/_meta.cpython-311.pyc index 7d3145f..76f6587 100644 Binary files a/.venv/Lib/site-packages/pathspec/__pycache__/_meta.cpython-311.pyc and b/.venv/Lib/site-packages/pathspec/__pycache__/_meta.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pathspec/__pycache__/gitignore.cpython-311.pyc b/.venv/Lib/site-packages/pathspec/__pycache__/gitignore.cpython-311.pyc index a9b149e..c66abb0 100644 Binary files a/.venv/Lib/site-packages/pathspec/__pycache__/gitignore.cpython-311.pyc and b/.venv/Lib/site-packages/pathspec/__pycache__/gitignore.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pathspec/__pycache__/pathspec.cpython-311.pyc b/.venv/Lib/site-packages/pathspec/__pycache__/pathspec.cpython-311.pyc index d735a81..407e6e4 100644 Binary files a/.venv/Lib/site-packages/pathspec/__pycache__/pathspec.cpython-311.pyc and b/.venv/Lib/site-packages/pathspec/__pycache__/pathspec.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pathspec/__pycache__/pattern.cpython-311.pyc b/.venv/Lib/site-packages/pathspec/__pycache__/pattern.cpython-311.pyc index 8b39644..089aedf 100644 Binary files a/.venv/Lib/site-packages/pathspec/__pycache__/pattern.cpython-311.pyc and b/.venv/Lib/site-packages/pathspec/__pycache__/pattern.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pathspec/__pycache__/util.cpython-311.pyc b/.venv/Lib/site-packages/pathspec/__pycache__/util.cpython-311.pyc index 1d05126..bbd1eb0 100644 Binary files a/.venv/Lib/site-packages/pathspec/__pycache__/util.cpython-311.pyc and b/.venv/Lib/site-packages/pathspec/__pycache__/util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pathspec/patterns/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pathspec/patterns/__pycache__/__init__.cpython-311.pyc index ba47bc1..e91b516 100644 Binary files a/.venv/Lib/site-packages/pathspec/patterns/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pathspec/patterns/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pathspec/patterns/__pycache__/gitwildmatch.cpython-311.pyc b/.venv/Lib/site-packages/pathspec/patterns/__pycache__/gitwildmatch.cpython-311.pyc index d909b6d..e5b9c6f 100644 Binary files a/.venv/Lib/site-packages/pathspec/patterns/__pycache__/gitwildmatch.cpython-311.pyc and b/.venv/Lib/site-packages/pathspec/patterns/__pycache__/gitwildmatch.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip-23.2.1.dist-info/AUTHORS.txt b/.venv/Lib/site-packages/pip-23.2.1.dist-info/AUTHORS.txt deleted file mode 100644 index 77eb39a..0000000 --- a/.venv/Lib/site-packages/pip-23.2.1.dist-info/AUTHORS.txt +++ /dev/null @@ -1,738 +0,0 @@ -@Switch01 -A_Rog -Aakanksha Agrawal -Abhinav Sagar -ABHYUDAY PRATAP SINGH -abs51295 -AceGentile -Adam Chainz -Adam Tse -Adam Wentz -admin -Adrien Morison -ahayrapetyan -Ahilya -AinsworthK -Akash Srivastava -Alan Yee -Albert Tugushev -Albert-Guan -albertg -Alberto Sottile -Aleks Bunin -Alethea Flowers -Alex Gaynor -Alex Grönholm -Alex Hedges -Alex Loosley -Alex Morega -Alex Stachowiak -Alexander Shtyrov -Alexandre Conrad -Alexey Popravka -Alli -Ami Fischman -Ananya Maiti -Anatoly Techtonik -Anders Kaseorg -Andre Aguiar -Andreas Lutro -Andrei Geacar -Andrew Gaul -Andrew Shymanel -Andrey Bienkowski -Andrey Bulgakov -Andrés Delfino -Andy Freeland -Andy Kluger -Ani Hayrapetyan -Aniruddha Basak -Anish Tambe -Anrs Hu -Anthony Sottile -Antoine Musso -Anton Ovchinnikov -Anton Patrushev -Antonio Alvarado Hernandez -Antony Lee -Antti Kaihola -Anubhav Patel -Anudit Nagar -Anuj Godase -AQNOUCH Mohammed -AraHaan -Arindam Choudhury -Armin Ronacher -Artem -Arun Babu Neelicattu -Ashley Manton -Ashwin Ramaswami -atse -Atsushi Odagiri -Avinash Karhana -Avner Cohen -Awit (Ah-Wit) Ghirmai -Baptiste Mispelon -Barney Gale -barneygale -Bartek Ogryczak -Bastian Venthur -Ben Bodenmiller -Ben Darnell -Ben Hoyt -Ben Mares -Ben Rosser -Bence Nagy -Benjamin Peterson -Benjamin VanEvery -Benoit Pierre -Berker Peksag -Bernard -Bernard Tyers -Bernardo B. Marques -Bernhard M. Wiedemann -Bertil Hatt -Bhavam Vidyarthi -Blazej Michalik -Bogdan Opanchuk -BorisZZZ -Brad Erickson -Bradley Ayers -Brandon L. Reiss -Brandt Bucher -Brett Randall -Brett Rosen -Brian Cristante -Brian Rosner -briantracy -BrownTruck -Bruno Oliveira -Bruno Renié -Bruno S -Bstrdsmkr -Buck Golemon -burrows -Bussonnier Matthias -bwoodsend -c22 -Caleb Martinez -Calvin Smith -Carl Meyer -Carlos Liam -Carol Willing -Carter Thayer -Cass -Chandrasekhar Atina -Chih-Hsuan Yen -Chris Brinker -Chris Hunt -Chris Jerdonek -Chris Kuehl -Chris McDonough -Chris Pawley -Chris Pryer -Chris Wolfe -Christian Clauss -Christian Heimes -Christian Oudard -Christoph Reiter -Christopher Hunt -Christopher Snyder -cjc7373 -Clark Boylan -Claudio Jolowicz -Clay McClure -Cody -Cody Soyland -Colin Watson -Collin Anderson -Connor Osborn -Cooper Lees -Cooper Ry Lees -Cory Benfield -Cory Wright -Craig Kerstiens -Cristian Sorinel -Cristina -Cristina Muñoz -Curtis Doty -cytolentino -Daan De Meyer -Damian -Damian Quiroga -Damian Shaw -Dan Black -Dan Savilonis -Dan Sully -Dane Hillard -daniel -Daniel Collins -Daniel Hahler -Daniel Holth -Daniel Jost -Daniel Katz -Daniel Shaulov -Daniele Esposti -Daniele Nicolodi -Daniele Procida -Daniil Konovalenko -Danny Hermes -Danny McClanahan -Darren Kavanagh -Dav Clark -Dave Abrahams -Dave Jones -David Aguilar -David Black -David Bordeynik -David Caro -David D Lowe -David Evans -David Hewitt -David Linke -David Poggi -David Pursehouse -David Runge -David Tucker -David Wales -Davidovich -Deepak Sharma -Deepyaman Datta -Denise Yu -derwolfe -Desetude -Devesh Kumar Singh -Diego Caraballo -Diego Ramirez -DiegoCaraballo -Dimitri Merejkowsky -Dimitri Papadopoulos -Dirk Stolle -Dmitry Gladkov -Dmitry Volodin -Domen Kožar -Dominic Davis-Foster -Donald Stufft -Dongweiming -doron zarhi -Dos Moonen -Douglas Thor -DrFeathers -Dustin Ingram -Dwayne Bailey -Ed Morley -Edgar Ramírez -Ee Durbin -Eitan Adler -ekristina -elainechan -Eli Schwartz -Elisha Hollander -Ellen Marie Dash -Emil Burzo -Emil Styrke -Emmanuel Arias -Endoh Takanao -enoch -Erdinc Mutlu -Eric Cousineau -Eric Gillingham -Eric Hanchrow -Eric Hopper -Erik M. Bray -Erik Rose -Erwin Janssen -Eugene Vereshchagin -everdimension -Federico -Felipe Peter -Felix Yan -fiber-space -Filip Kokosiński -Filipe Laíns -Finn Womack -finnagin -Florian Briand -Florian Rathgeber -Francesco -Francesco Montesano -Frost Ming -Gabriel Curio -Gabriel de Perthuis -Garry Polley -gavin -gdanielson -Geoffrey Sneddon -George Song -Georgi Valkov -Georgy Pchelkin -ghost -Giftlin Rajaiah -gizmoguy1 -gkdoc -Godefroid Chapelle -Gopinath M -GOTO Hayato -gousaiyang -gpiks -Greg Roodt -Greg Ward -Guilherme Espada -Guillaume Seguin -gutsytechster -Guy Rozendorn -Guy Tuval -gzpan123 -Hanjun Kim -Hari Charan -Harsh Vardhan -harupy -Harutaka Kawamura -hauntsaninja -Henrich Hartzer -Henry Schreiner -Herbert Pfennig -Holly Stotelmyer -Honnix -Hsiaoming Yang -Hugo Lopes Tavares -Hugo van Kemenade -Hugues Bruant -Hynek Schlawack -Ian Bicking -Ian Cordasco -Ian Lee -Ian Stapleton Cordasco -Ian Wienand -Igor Kuzmitshov -Igor Sobreira -Ilan Schnell -Illia Volochii -Ilya Baryshev -Inada Naoki -Ionel Cristian Mărieș -Ionel Maries Cristian -Ivan Pozdeev -Jacob Kim -Jacob Walls -Jaime Sanz -jakirkham -Jakub Kuczys -Jakub Stasiak -Jakub Vysoky -Jakub Wilk -James Cleveland -James Curtin -James Firth -James Gerity -James Polley -Jan Pokorný -Jannis Leidel -Jarek Potiuk -jarondl -Jason Curtis -Jason R. Coombs -JasonMo -JasonMo1 -Jay Graves -Jean-Christophe Fillion-Robin -Jeff Barber -Jeff Dairiki -Jelmer Vernooij -jenix21 -Jeremy Stanley -Jeremy Zafran -Jesse Rittner -Jiashuo Li -Jim Fisher -Jim Garrison -Jiun Bae -Jivan Amara -Joe Bylund -Joe Michelini -John Paton -John T. Wodder II -John-Scott Atlakson -johnthagen -Jon Banafato -Jon Dufresne -Jon Parise -Jonas Nockert -Jonathan Herbert -Joonatan Partanen -Joost Molenaar -Jorge Niedbalski -Joseph Bylund -Joseph Long -Josh Bronson -Josh Hansen -Josh Schneier -Juan Luis Cano Rodríguez -Juanjo Bazán -Judah Rand -Julian Berman -Julian Gethmann -Julien Demoor -Jussi Kukkonen -jwg4 -Jyrki Pulliainen -Kai Chen -Kai Mueller -Kamal Bin Mustafa -kasium -kaustav haldar -keanemind -Keith Maxwell -Kelsey Hightower -Kenneth Belitzky -Kenneth Reitz -Kevin Burke -Kevin Carter -Kevin Frommelt -Kevin R Patterson -Kexuan Sun -Kit Randel -Klaas van Schelven -KOLANICH -kpinc -Krishna Oza -Kumar McMillan -Kyle Persohn -lakshmanaram -Laszlo Kiss-Kollar -Laurent Bristiel -Laurent LAPORTE -Laurie O -Laurie Opperman -layday -Leon Sasson -Lev Givon -Lincoln de Sousa -Lipis -lorddavidiii -Loren Carvalho -Lucas Cimon -Ludovic Gasc -Lukas Juhrich -Luke Macken -Luo Jiebin -luojiebin -luz.paz -László Kiss Kollár -M00nL1ght -Marc Abramowitz -Marc Tamlyn -Marcus Smith -Mariatta -Mark Kohler -Mark Williams -Markus Hametner -Martey Dodoo -Martin Fischer -Martin Häcker -Martin Pavlasek -Masaki -Masklinn -Matej Stuchlik -Mathew Jennings -Mathieu Bridon -Mathieu Kniewallner -Matt Bacchi -Matt Good -Matt Maker -Matt Robenolt -matthew -Matthew Einhorn -Matthew Feickert -Matthew Gilliard -Matthew Iversen -Matthew Treinish -Matthew Trumbell -Matthew Willson -Matthias Bussonnier -mattip -Maurits van Rees -Max W Chase -Maxim Kurnikov -Maxime Rouyrre -mayeut -mbaluna -mdebi -memoselyk -meowmeowcat -Michael -Michael Aquilina -Michael E. Karpeles -Michael Klich -Michael Mintz -Michael Williamson -michaelpacer -Michał Górny -Mickaël Schoentgen -Miguel Araujo Perez -Mihir Singh -Mike -Mike Hendricks -Min RK -MinRK -Miro Hrončok -Monica Baluna -montefra -Monty Taylor -Muha Ajjan‮ -Nadav Wexler -Nahuel Ambrosini -Nate Coraor -Nate Prewitt -Nathan Houghton -Nathaniel J. Smith -Nehal J Wani -Neil Botelho -Nguyễn Gia Phong -Nicholas Serra -Nick Coghlan -Nick Stenning -Nick Timkovich -Nicolas Bock -Nicole Harris -Nikhil Benesch -Nikhil Ladha -Nikita Chepanov -Nikolay Korolev -Nipunn Koorapati -Nitesh Sharma -Niyas Sait -Noah -Noah Gorny -Nowell Strite -NtaleGrey -nvdv -OBITORASU -Ofek Lev -ofrinevo -Oliver Freund -Oliver Jeeves -Oliver Mannion -Oliver Tonnhofer -Olivier Girardot -Olivier Grisel -Ollie Rutherfurd -OMOTO Kenji -Omry Yadan -onlinejudge95 -Oren Held -Oscar Benjamin -Oz N Tiram -Pachwenko -Patrick Dubroy -Patrick Jenkins -Patrick Lawson -patricktokeeffe -Patrik Kopkan -Paul Kehrer -Paul Moore -Paul Nasrat -Paul Oswald -Paul van der Linden -Paulus Schoutsen -Pavel Safronov -Pavithra Eswaramoorthy -Pawel Jasinski -Paweł Szramowski -Pekka Klärck -Peter Gessler -Peter Lisák -Peter Waller -petr-tik -Phaneendra Chiruvella -Phil Elson -Phil Freo -Phil Pennock -Phil Whelan -Philip Jägenstedt -Philip Molloy -Philippe Ombredanne -Pi Delport -Pierre-Yves Rofes -Pieter Degroote -pip -Prabakaran Kumaresshan -Prabhjyotsing Surjit Singh Sodhi -Prabhu Marappan -Pradyun Gedam -Prashant Sharma -Pratik Mallya -pre-commit-ci[bot] -Preet Thakkar -Preston Holmes -Przemek Wrzos -Pulkit Goyal -q0w -Qiangning Hong -Quentin Lee -Quentin Pradet -R. David Murray -Rafael Caricio -Ralf Schmitt -Razzi Abuissa -rdb -Reece Dunham -Remi Rampin -Rene Dudfield -Riccardo Magliocchetti -Riccardo Schirone -Richard Jones -Richard Si -Ricky Ng-Adam -Rishi -RobberPhex -Robert Collins -Robert McGibbon -Robert Pollak -Robert T. McGibbon -robin elisha robinson -Roey Berman -Rohan Jain -Roman Bogorodskiy -Roman Donchenko -Romuald Brunet -ronaudinho -Ronny Pfannschmidt -Rory McCann -Ross Brattain -Roy Wellington Ⅳ -Ruairidh MacLeod -Russell Keith-Magee -Ryan Shepherd -Ryan Wooden -ryneeverett -Sachi King -Salvatore Rinchiera -sandeepkiran-js -Savio Jomton -schlamar -Scott Kitterman -Sean -seanj -Sebastian Jordan -Sebastian Schaetz -Segev Finer -SeongSoo Cho -Sergey Vasilyev -Seth Michael Larson -Seth Woodworth -Shantanu -shireenrao -Shivansh-007 -Shlomi Fish -Shovan Maity -Simeon Visser -Simon Cross -Simon Pichugin -sinoroc -sinscary -snook92 -socketubs -Sorin Sbarnea -Srinivas Nyayapati -Stavros Korokithakis -Stefan Scherfke -Stefano Rivera -Stephan Erb -Stephen Rosen -stepshal -Steve (Gadget) Barnes -Steve Barnes -Steve Dower -Steve Kowalik -Steven Myint -Steven Silvester -stonebig -Stéphane Bidoul -Stéphane Bidoul (ACSONE) -Stéphane Klein -Sumana Harihareswara -Surbhi Sharma -Sviatoslav Sydorenko -Swat009 -Sylvain -Takayuki SHIMIZUKAWA -Taneli Hukkinen -tbeswick -Thiago -Thijs Triemstra -Thomas Fenzl -Thomas Grainger -Thomas Guettler -Thomas Johansson -Thomas Kluyver -Thomas Smith -Thomas VINCENT -Tim D. Smith -Tim Gates -Tim Harder -Tim Heap -tim smith -tinruufu -Tobias Hermann -Tom Forbes -Tom Freudenheim -Tom V -Tomas Hrnciar -Tomas Orsava -Tomer Chachamu -Tommi Enenkel | AnB -Tomáš Hrnčiar -Tony Beswick -Tony Narlock -Tony Zhaocheng Tan -TonyBeswick -toonarmycaptain -Toshio Kuratomi -toxinu -Travis Swicegood -Tushar Sadhwani -Tzu-ping Chung -Valentin Haenel -Victor Stinner -victorvpaulo -Vikram - Google -Viktor Szépe -Ville Skyttä -Vinay Sajip -Vincent Philippon -Vinicyus Macedo -Vipul Kumar -Vitaly Babiy -Vladimir Rutsky -W. Trevor King -Wil Tan -Wilfred Hughes -William Edwards -William ML Leslie -William T Olson -William Woodruff -Wilson Mo -wim glenn -Winson Luk -Wolfgang Maier -Wu Zhenyu -XAMES3 -Xavier Fernandez -xoviat -xtreak -YAMAMOTO Takashi -Yen Chi Hsuan -Yeray Diaz Diaz -Yoval P -Yu Jian -Yuan Jing Vincent Yan -Yusuke Hayashi -Zearin -Zhiping Deng -ziebam -Zvezdan Petkovic -Łukasz Langa -Роман Донченко -Семён Марьясин -‮rekcäH nitraM‮ diff --git a/.venv/Lib/site-packages/pip-23.2.1.dist-info/INSTALLER b/.venv/Lib/site-packages/pip-23.2.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/pip-23.2.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/pip-23.2.1.dist-info/LICENSE.txt b/.venv/Lib/site-packages/pip-23.2.1.dist-info/LICENSE.txt deleted file mode 100644 index 8e7b65e..0000000 --- a/.venv/Lib/site-packages/pip-23.2.1.dist-info/LICENSE.txt +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (c) 2008-present The pip developers (see AUTHORS.txt file) - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/.venv/Lib/site-packages/pip-23.2.1.dist-info/METADATA b/.venv/Lib/site-packages/pip-23.2.1.dist-info/METADATA deleted file mode 100644 index d329358..0000000 --- a/.venv/Lib/site-packages/pip-23.2.1.dist-info/METADATA +++ /dev/null @@ -1,90 +0,0 @@ -Metadata-Version: 2.1 -Name: pip -Version: 23.2.1 -Summary: The PyPA recommended tool for installing Python packages. -Home-page: https://pip.pypa.io/ -Author: The pip developers -Author-email: distutils-sig@python.org -License: MIT -Project-URL: Documentation, https://pip.pypa.io -Project-URL: Source, https://github.com/pypa/pip -Project-URL: Changelog, https://pip.pypa.io/en/stable/news/ -Classifier: Development Status :: 5 - Production/Stable -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Topic :: Software Development :: Build Tools -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: 3 :: Only -Classifier: Programming Language :: Python :: 3.7 -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Requires-Python: >=3.7 -License-File: LICENSE.txt -License-File: AUTHORS.txt - -pip - The Python Package Installer -================================== - -.. image:: https://img.shields.io/pypi/v/pip.svg - :target: https://pypi.org/project/pip/ - -.. image:: https://readthedocs.org/projects/pip/badge/?version=latest - :target: https://pip.pypa.io/en/latest - -pip is the `package installer`_ for Python. You can use pip to install packages from the `Python Package Index`_ and other indexes. - -Please take a look at our documentation for how to install and use pip: - -* `Installation`_ -* `Usage`_ - -We release updates regularly, with a new version every 3 months. Find more details in our documentation: - -* `Release notes`_ -* `Release process`_ - -In pip 20.3, we've `made a big improvement to the heart of pip`_; `learn more`_. We want your input, so `sign up for our user experience research studies`_ to help us do it right. - -**Note**: pip 21.0, in January 2021, removed Python 2 support, per pip's `Python 2 support policy`_. Please migrate to Python 3. - -If you find bugs, need help, or want to talk to the developers, please use our mailing lists or chat rooms: - -* `Issue tracking`_ -* `Discourse channel`_ -* `User IRC`_ - -If you want to get involved head over to GitHub to get the source code, look at our development documentation and feel free to jump on the developer mailing lists and chat rooms: - -* `GitHub page`_ -* `Development documentation`_ -* `Development IRC`_ - -Code of Conduct ---------------- - -Everyone interacting in the pip project's codebases, issue trackers, chat -rooms, and mailing lists is expected to follow the `PSF Code of Conduct`_. - -.. _package installer: https://packaging.python.org/guides/tool-recommendations/ -.. _Python Package Index: https://pypi.org -.. _Installation: https://pip.pypa.io/en/stable/installation/ -.. _Usage: https://pip.pypa.io/en/stable/ -.. _Release notes: https://pip.pypa.io/en/stable/news.html -.. _Release process: https://pip.pypa.io/en/latest/development/release-process/ -.. _GitHub page: https://github.com/pypa/pip -.. _Development documentation: https://pip.pypa.io/en/latest/development -.. _made a big improvement to the heart of pip: https://pyfound.blogspot.com/2020/11/pip-20-3-new-resolver.html -.. _learn more: https://pip.pypa.io/en/latest/user_guide/#changes-to-the-pip-dependency-resolver-in-20-3-2020 -.. _sign up for our user experience research studies: https://pyfound.blogspot.com/2020/03/new-pip-resolver-to-roll-out-this-year.html -.. _Python 2 support policy: https://pip.pypa.io/en/latest/development/release-process/#python-2-support -.. _Issue tracking: https://github.com/pypa/pip/issues -.. _Discourse channel: https://discuss.python.org/c/packaging -.. _User IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa -.. _Development IRC: https://kiwiirc.com/nextclient/#ircs://irc.libera.chat:+6697/pypa-dev -.. _PSF Code of Conduct: https://github.com/pypa/.github/blob/main/CODE_OF_CONDUCT.md diff --git a/.venv/Lib/site-packages/pip-23.2.1.dist-info/RECORD b/.venv/Lib/site-packages/pip-23.2.1.dist-info/RECORD deleted file mode 100644 index 5d1a4e3..0000000 --- a/.venv/Lib/site-packages/pip-23.2.1.dist-info/RECORD +++ /dev/null @@ -1,1003 +0,0 @@ -../../Scripts/pip.exe,sha256=7DDq_vtGr3dZytwtpTfP8mXRaeJcBXwFEihg1Ku4jP0,108430 -../../Scripts/pip3.11.exe,sha256=7DDq_vtGr3dZytwtpTfP8mXRaeJcBXwFEihg1Ku4jP0,108430 -../../Scripts/pip3.exe,sha256=7DDq_vtGr3dZytwtpTfP8mXRaeJcBXwFEihg1Ku4jP0,108430 -pip-23.2.1.dist-info/AUTHORS.txt,sha256=Pd_qYtjluu4WDft2A179dPtIvwYVBNtDfccCitVRMQM,10082 -pip-23.2.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip-23.2.1.dist-info/LICENSE.txt,sha256=Y0MApmnUmurmWxLGxIySTFGkzfPR_whtw0VtyLyqIQQ,1093 -pip-23.2.1.dist-info/METADATA,sha256=yHPLQvsD1b6f-zdCQWMibZXbsAjs886JMSh3C0oxRhQ,4239 -pip-23.2.1.dist-info/RECORD,, -pip-23.2.1.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip-23.2.1.dist-info/WHEEL,sha256=pkctZYzUS4AYVn6dJ-7367OJZivF2e8RA9b_ZBjif18,92 -pip-23.2.1.dist-info/entry_points.txt,sha256=xg35gOct0aY8S3ftLtweJ0uw3KBAIVyW4k-0Jx1rkNE,125 -pip-23.2.1.dist-info/top_level.txt,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -pip/__init__.py,sha256=hELWH3UN2ilBntczbn1BJOIzJEoiE8w9H-gsR5TeuEk,357 -pip/__main__.py,sha256=WzbhHXTbSE6gBY19mNN9m4s5o_365LOvTYSgqgbdBhE,854 -pip/__pip-runner__.py,sha256=EnrfKmKMzWAdqg_JicLCOP9Y95Ux7zHh4ObvqLtQcjo,1444 -pip/__pycache__/__init__.cpython-311.pyc,, -pip/__pycache__/__main__.cpython-311.pyc,, -pip/__pycache__/__pip-runner__.cpython-311.pyc,, -pip/_internal/__init__.py,sha256=nnFCuxrPMgALrIDxSoy-H6Zj4W4UY60D-uL1aJyq0pc,573 -pip/_internal/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/__pycache__/build_env.cpython-311.pyc,, -pip/_internal/__pycache__/cache.cpython-311.pyc,, -pip/_internal/__pycache__/configuration.cpython-311.pyc,, -pip/_internal/__pycache__/exceptions.cpython-311.pyc,, -pip/_internal/__pycache__/main.cpython-311.pyc,, -pip/_internal/__pycache__/pyproject.cpython-311.pyc,, -pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc,, -pip/_internal/__pycache__/wheel_builder.cpython-311.pyc,, -pip/_internal/build_env.py,sha256=1ESpqw0iupS_K7phZK5zshVE5Czy9BtGLFU4W6Enva8,10243 -pip/_internal/cache.py,sha256=pMyi1n2nfdo7xzLVhmdOvIy1INt27HbqhJNj7vMcWlI,10429 -pip/_internal/cli/__init__.py,sha256=FkHBgpxxb-_gd6r1FjnNhfMOzAUYyXoXKJ6abijfcFU,132 -pip/_internal/cli/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc,, -pip/_internal/cli/__pycache__/base_command.cpython-311.pyc,, -pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc,, -pip/_internal/cli/__pycache__/command_context.cpython-311.pyc,, -pip/_internal/cli/__pycache__/main.cpython-311.pyc,, -pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc,, -pip/_internal/cli/__pycache__/parser.cpython-311.pyc,, -pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc,, -pip/_internal/cli/__pycache__/req_command.cpython-311.pyc,, -pip/_internal/cli/__pycache__/spinners.cpython-311.pyc,, -pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc,, -pip/_internal/cli/autocompletion.py,sha256=wY2JPZY2Eji1vhR7bVo-yCBPJ9LCy6P80iOAhZD1Vi8,6676 -pip/_internal/cli/base_command.py,sha256=ACUUqWkZMU2O1pmUSpfBV3fwb36JzzTHGrbKXyb5f74,8726 -pip/_internal/cli/cmdoptions.py,sha256=0bXhKutppZLBgAL54iK3tTrj-JRVbUB5M_2pHv_wnKk,30030 -pip/_internal/cli/command_context.py,sha256=RHgIPwtObh5KhMrd3YZTkl8zbVG-6Okml7YbFX4Ehg0,774 -pip/_internal/cli/main.py,sha256=Uzxt_YD1hIvB1AW5mxt6IVcht5G712AtMqdo51UMhmQ,2816 -pip/_internal/cli/main_parser.py,sha256=laDpsuBDl6kyfywp9eMMA9s84jfH2TJJn-vmL0GG90w,4338 -pip/_internal/cli/parser.py,sha256=tWP-K1uSxnJyXu3WE0kkH3niAYRBeuUaxeydhzOdhL4,10817 -pip/_internal/cli/progress_bars.py,sha256=So4mPoSjXkXiSHiTzzquH3VVyVD_njXlHJSExYPXAow,1968 -pip/_internal/cli/req_command.py,sha256=GqS9jkeHktOy6zRzC6uhcRY7SelnAV1LZ6OfS_gNcEk,18440 -pip/_internal/cli/spinners.py,sha256=hIJ83GerdFgFCdobIA23Jggetegl_uC4Sp586nzFbPE,5118 -pip/_internal/cli/status_codes.py,sha256=sEFHUaUJbqv8iArL3HAtcztWZmGOFX01hTesSytDEh0,116 -pip/_internal/commands/__init__.py,sha256=5oRO9O3dM2vGuh0bFw4HOVletryrz5HHMmmPWwJrH9U,3882 -pip/_internal/commands/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/commands/__pycache__/cache.cpython-311.pyc,, -pip/_internal/commands/__pycache__/check.cpython-311.pyc,, -pip/_internal/commands/__pycache__/completion.cpython-311.pyc,, -pip/_internal/commands/__pycache__/configuration.cpython-311.pyc,, -pip/_internal/commands/__pycache__/debug.cpython-311.pyc,, -pip/_internal/commands/__pycache__/download.cpython-311.pyc,, -pip/_internal/commands/__pycache__/freeze.cpython-311.pyc,, -pip/_internal/commands/__pycache__/hash.cpython-311.pyc,, -pip/_internal/commands/__pycache__/help.cpython-311.pyc,, -pip/_internal/commands/__pycache__/index.cpython-311.pyc,, -pip/_internal/commands/__pycache__/inspect.cpython-311.pyc,, -pip/_internal/commands/__pycache__/install.cpython-311.pyc,, -pip/_internal/commands/__pycache__/list.cpython-311.pyc,, -pip/_internal/commands/__pycache__/search.cpython-311.pyc,, -pip/_internal/commands/__pycache__/show.cpython-311.pyc,, -pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc,, -pip/_internal/commands/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/commands/cache.py,sha256=aDR3pKRRX9dHobQ2HzKryf02jgOZnGcnfEmX_288Vcg,7581 -pip/_internal/commands/check.py,sha256=Rb13Q28yoLh0j1gpx5SU0jlResNct21eQCRsnaO9xKA,1782 -pip/_internal/commands/completion.py,sha256=2frgchce-GE5Gh9SjEJV-MTcpxy3G9-Es8mpe66nHts,3986 -pip/_internal/commands/configuration.py,sha256=NB5uf8HIX8-li95YLoZO09nALIWlLCHDF5aifSKcBn8,9815 -pip/_internal/commands/debug.py,sha256=AesEID-4gPFDWTwPiPaGZuD4twdT-imaGuMR5ZfSn8s,6591 -pip/_internal/commands/download.py,sha256=e4hw088zGo26WmJaMIRvCniLlLmoOjqolGyfHjsCkCQ,5335 -pip/_internal/commands/freeze.py,sha256=2qjQrH9KWi5Roav0CuR7vc7hWm4uOi_0l6tp3ESKDHM,3172 -pip/_internal/commands/hash.py,sha256=EVVOuvGtoPEdFi8SNnmdqlCQrhCxV-kJsdwtdcCnXGQ,1703 -pip/_internal/commands/help.py,sha256=gcc6QDkcgHMOuAn5UxaZwAStsRBrnGSn_yxjS57JIoM,1132 -pip/_internal/commands/index.py,sha256=cGQVSA5dAs7caQ9sz4kllYvaI4ZpGiq1WhCgaImXNSA,4793 -pip/_internal/commands/inspect.py,sha256=2wSPt9yfr3r6g-s2S5L6PvRtaHNVyb4TuodMStJ39cw,3188 -pip/_internal/commands/install.py,sha256=sdi44xeJlENfU-ziPl1TbUC3no2-ZGDpwBigmX1JuM0,28934 -pip/_internal/commands/list.py,sha256=LNL6016BPvFpAZVzNoo_DWDzvRFpfw__m9Rp5kw-yUM,12457 -pip/_internal/commands/search.py,sha256=sbBZiARRc050QquOKcCvOr2K3XLsoYebLKZGRi__iUI,5697 -pip/_internal/commands/show.py,sha256=t5jia4zcYJRJZy4U_Von7zMl03hJmmcofj6oDNTnj7Y,6419 -pip/_internal/commands/uninstall.py,sha256=OIqO9tqadY8kM4HwhFf1Q62fUIp7v8KDrTRo8yWMz7Y,3886 -pip/_internal/commands/wheel.py,sha256=CSnX8Pmf1oPCnd7j7bn1_f58G9KHNiAblvVJ5zykN-A,6476 -pip/_internal/configuration.py,sha256=i_dePJKndPAy7hf48Sl6ZuPyl3tFPCE67z0SNatwuwE,13839 -pip/_internal/distributions/__init__.py,sha256=Hq6kt6gXBgjNit5hTTWLAzeCNOKoB-N0pGYSqehrli8,858 -pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/distributions/__pycache__/base.cpython-311.pyc,, -pip/_internal/distributions/__pycache__/installed.cpython-311.pyc,, -pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc,, -pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/distributions/base.py,sha256=jrF1Vi7eGyqFqMHrieh1PIOrGU7KeCxhYPZnbvtmvGY,1221 -pip/_internal/distributions/installed.py,sha256=NI2OgsgH9iBq9l5vB-56vOg5YsybOy-AU4VE5CSCO2I,729 -pip/_internal/distributions/sdist.py,sha256=SQBdkatXSigKGG_SaD0U0p1Jwdfrg26UCNcHgkXZfdA,6494 -pip/_internal/distributions/wheel.py,sha256=m-J4XO-gvFerlYsFzzSXYDvrx8tLZlJFTCgDxctn8ig,1164 -pip/_internal/exceptions.py,sha256=LyTVY2dANx-i_TEk5Yr9YcwUtiy0HOEFCAQq1F_46co,23737 -pip/_internal/index/__init__.py,sha256=vpt-JeTZefh8a-FC22ZeBSXFVbuBcXSGiILhQZJaNpQ,30 -pip/_internal/index/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/index/__pycache__/collector.cpython-311.pyc,, -pip/_internal/index/__pycache__/package_finder.cpython-311.pyc,, -pip/_internal/index/__pycache__/sources.cpython-311.pyc,, -pip/_internal/index/collector.py,sha256=3OmYZ3tCoRPGOrELSgQWG-03M-bQHa2-VCA3R_nJAaU,16504 -pip/_internal/index/package_finder.py,sha256=rrUw4vj7QE_eMt022jw--wQiKznMaUgVBkJ1UCrVUxo,37873 -pip/_internal/index/sources.py,sha256=7jw9XSeeQA5K-H4I5a5034Ks2gkQqm4zPXjrhwnP1S4,6556 -pip/_internal/locations/__init__.py,sha256=Dh8LJWG8LRlDK4JIj9sfRF96TREzE--N_AIlx7Tqoe4,15365 -pip/_internal/locations/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc,, -pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc,, -pip/_internal/locations/__pycache__/base.cpython-311.pyc,, -pip/_internal/locations/_distutils.py,sha256=cmi6h63xYNXhQe7KEWEMaANjHFy5yQOPt_1_RCWyXMY,6100 -pip/_internal/locations/_sysconfig.py,sha256=jyNVtUfMIf0mtyY-Xp1m9yQ8iwECozSVVFmjkN9a2yw,7680 -pip/_internal/locations/base.py,sha256=RQiPi1d4FVM2Bxk04dQhXZ2PqkeljEL2fZZ9SYqIQ78,2556 -pip/_internal/main.py,sha256=r-UnUe8HLo5XFJz8inTcOOTiu_sxNhgHb6VwlGUllOI,340 -pip/_internal/metadata/__init__.py,sha256=84j1dPJaIoz5Q2ZTPi0uB1iaDAHiUNfKtYSGQCfFKpo,4280 -pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/metadata/__pycache__/_json.cpython-311.pyc,, -pip/_internal/metadata/__pycache__/base.cpython-311.pyc,, -pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc,, -pip/_internal/metadata/_json.py,sha256=BTkWfFDrWFwuSodImjtbAh8wCL3isecbnjTb5E6UUDI,2595 -pip/_internal/metadata/base.py,sha256=vIwIo1BtoqegehWMAXhNrpLGYBq245rcaCNkBMPnTU8,25277 -pip/_internal/metadata/importlib/__init__.py,sha256=9ZVO8BoE7NEZPmoHp5Ap_NJo0HgNIezXXg-TFTtt3Z4,107 -pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc,, -pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc,, -pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc,, -pip/_internal/metadata/importlib/_compat.py,sha256=GAe_prIfCE4iUylrnr_2dJRlkkBVRUbOidEoID7LPoE,1882 -pip/_internal/metadata/importlib/_dists.py,sha256=BUV8y6D0PePZrEN3vfJL-m1FDqZ6YPRgAiBeBinHhNg,8181 -pip/_internal/metadata/importlib/_envs.py,sha256=I1DHMyAgZb8jT8CYndWl2aw2dN675p-BKPCuJhvdhrY,7435 -pip/_internal/metadata/pkg_resources.py,sha256=WjwiNdRsvxqxL4MA5Tb5a_q3Q3sUhdpbZF8wGLtPMI0,9773 -pip/_internal/models/__init__.py,sha256=3DHUd_qxpPozfzouoqa9g9ts1Czr5qaHfFxbnxriepM,63 -pip/_internal/models/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/models/__pycache__/candidate.cpython-311.pyc,, -pip/_internal/models/__pycache__/direct_url.cpython-311.pyc,, -pip/_internal/models/__pycache__/format_control.cpython-311.pyc,, -pip/_internal/models/__pycache__/index.cpython-311.pyc,, -pip/_internal/models/__pycache__/installation_report.cpython-311.pyc,, -pip/_internal/models/__pycache__/link.cpython-311.pyc,, -pip/_internal/models/__pycache__/scheme.cpython-311.pyc,, -pip/_internal/models/__pycache__/search_scope.cpython-311.pyc,, -pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc,, -pip/_internal/models/__pycache__/target_python.cpython-311.pyc,, -pip/_internal/models/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/models/candidate.py,sha256=6pcABsaR7CfIHlbJbr2_kMkVJFL_yrYjTx6SVWUnCPQ,990 -pip/_internal/models/direct_url.py,sha256=EepBxI97j7wSZ3AmRETYyVTmR9NoTas15vc8popxVTg,6931 -pip/_internal/models/format_control.py,sha256=DJpMYjxeYKKQdwNcML2_F0vtAh-qnKTYe-CpTxQe-4g,2520 -pip/_internal/models/index.py,sha256=tYnL8oxGi4aSNWur0mG8DAP7rC6yuha_MwJO8xw0crI,1030 -pip/_internal/models/installation_report.py,sha256=ueXv1RiMLAucaTuEvXACXX5R64_Wcm8b1Ztqx4Rd5xI,2609 -pip/_internal/models/link.py,sha256=6OEk3bt41WU7QZoiyuoVPGsKOU-J_BbDDhouKbIXm0Y,20819 -pip/_internal/models/scheme.py,sha256=3EFQp_ICu_shH1-TBqhl0QAusKCPDFOlgHFeN4XowWs,738 -pip/_internal/models/search_scope.py,sha256=ASVyyZxiJILw7bTIVVpJx8J293M3Hk5F33ilGn0e80c,4643 -pip/_internal/models/selection_prefs.py,sha256=KZdi66gsR-_RUXUr9uejssk3rmTHrQVJWeNA2sV-VSY,1907 -pip/_internal/models/target_python.py,sha256=qKpZox7J8NAaPmDs5C_aniwfPDxzvpkrCKqfwndG87k,3858 -pip/_internal/models/wheel.py,sha256=YqazoIZyma_Q1ejFa1C7NHKQRRWlvWkdK96VRKmDBeI,3600 -pip/_internal/network/__init__.py,sha256=jf6Tt5nV_7zkARBrKojIXItgejvoegVJVKUbhAa5Ioc,50 -pip/_internal/network/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/network/__pycache__/auth.cpython-311.pyc,, -pip/_internal/network/__pycache__/cache.cpython-311.pyc,, -pip/_internal/network/__pycache__/download.cpython-311.pyc,, -pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc,, -pip/_internal/network/__pycache__/session.cpython-311.pyc,, -pip/_internal/network/__pycache__/utils.cpython-311.pyc,, -pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc,, -pip/_internal/network/auth.py,sha256=TC-OcW2KU4W6R1hU4qPgQXvVH54adACpZz6sWq-R9NA,20541 -pip/_internal/network/cache.py,sha256=hgXftU-eau4MWxHSLquTMzepYq5BPC2zhCkhN3glBy8,2145 -pip/_internal/network/download.py,sha256=HvDDq9bVqaN3jcS3DyVJHP7uTqFzbShdkf7NFSoHfkw,6096 -pip/_internal/network/lazy_wheel.py,sha256=2PXVduYZPCPZkkQFe1J1GbfHJWeCU--FXonGyIfw9eU,7638 -pip/_internal/network/session.py,sha256=uhovd4J7abd0Yr2g426yC4aC6Uw1VKrQfpzalsEBEMw,18607 -pip/_internal/network/utils.py,sha256=6A5SrUJEEUHxbGtbscwU2NpCyz-3ztiDlGWHpRRhsJ8,4073 -pip/_internal/network/xmlrpc.py,sha256=AzQgG4GgS152_cqmGr_Oz2MIXsCal-xfsis7fA7nmU0,1791 -pip/_internal/operations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/operations/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/operations/__pycache__/check.cpython-311.pyc,, -pip/_internal/operations/__pycache__/freeze.cpython-311.pyc,, -pip/_internal/operations/__pycache__/prepare.cpython-311.pyc,, -pip/_internal/operations/build/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc,, -pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc,, -pip/_internal/operations/build/build_tracker.py,sha256=vf81EwomN3xe9G8qRJED0VGqNikmRQRQoobNsxi5Xrs,4133 -pip/_internal/operations/build/metadata.py,sha256=9S0CUD8U3QqZeXp-Zyt8HxwU90lE4QrnYDgrqZDzBnc,1422 -pip/_internal/operations/build/metadata_editable.py,sha256=VLL7LvntKE8qxdhUdEJhcotFzUsOSI8NNS043xULKew,1474 -pip/_internal/operations/build/metadata_legacy.py,sha256=o-eU21As175hDC7dluM1fJJ_FqokTIShyWpjKaIpHZw,2198 -pip/_internal/operations/build/wheel.py,sha256=sT12FBLAxDC6wyrDorh8kvcZ1jG5qInCRWzzP-UkJiQ,1075 -pip/_internal/operations/build/wheel_editable.py,sha256=yOtoH6zpAkoKYEUtr8FhzrYnkNHQaQBjWQ2HYae1MQg,1417 -pip/_internal/operations/build/wheel_legacy.py,sha256=C9j6rukgQI1n_JeQLoZGuDdfUwzCXShyIdPTp6edbMQ,3064 -pip/_internal/operations/check.py,sha256=LD5BisEdT9vgzS7rLYUuk01z0l4oMj2Q7SsAxVu-pEk,6806 -pip/_internal/operations/freeze.py,sha256=uqoeTAf6HOYVMR2UgAT8N85UZoGEVEoQdan_Ao6SOfk,9816 -pip/_internal/operations/install/__init__.py,sha256=mX7hyD2GNBO2mFGokDQ30r_GXv7Y_PLdtxcUv144e-s,51 -pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc,, -pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/operations/install/editable_legacy.py,sha256=YeR0KadWXw_ZheC1NtAG1qVIEkOgRGHc23x-YtGW7NU,1282 -pip/_internal/operations/install/wheel.py,sha256=8lsVMt_FAuiGNsf_e7C7_cCSOEO7pHyjgVmRNx-WXrw,27475 -pip/_internal/operations/prepare.py,sha256=nxjIiGRSiUUSRFpwN-Qro7N6BE9jqV4mudJ7CIv9qwY,28868 -pip/_internal/pyproject.py,sha256=ltmrXWaMXjiJHbYyzWplTdBvPYPdKk99GjKuQVypGZU,7161 -pip/_internal/req/__init__.py,sha256=TELFgZOof3lhMmaICVWL9U7PlhXo9OufokbMAJ6J2GI,2738 -pip/_internal/req/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/req/__pycache__/constructors.cpython-311.pyc,, -pip/_internal/req/__pycache__/req_file.cpython-311.pyc,, -pip/_internal/req/__pycache__/req_install.cpython-311.pyc,, -pip/_internal/req/__pycache__/req_set.cpython-311.pyc,, -pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc,, -pip/_internal/req/constructors.py,sha256=8YE-eNXMSZ1lgsJZg-HnIo8EdaGfiOM2t3EaLlLD5Og,16610 -pip/_internal/req/req_file.py,sha256=5PCO4GnDEnUENiFj4vD_1QmAMjHNtvN6HXbETZ9UGok,17872 -pip/_internal/req/req_install.py,sha256=hpG29Bm2PAq7G-ogTatZcNUgjwt0zpdTXtxGw4M_MtU,33084 -pip/_internal/req/req_set.py,sha256=pSCcIKURDkGb6JAKsc-cdvnvnAJlYPk-p3vvON9M3DY,4704 -pip/_internal/req/req_uninstall.py,sha256=sGwa_yZ6X2NcRSUJWzUlYkf8bDEjRySAE3aQ5OewIWA,24678 -pip/_internal/resolution/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/resolution/__pycache__/base.cpython-311.pyc,, -pip/_internal/resolution/base.py,sha256=qlmh325SBVfvG6Me9gc5Nsh5sdwHBwzHBq6aEXtKsLA,583 -pip/_internal/resolution/legacy/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc,, -pip/_internal/resolution/legacy/resolver.py,sha256=th-eTPIvbecfJaUsdrbH1aHQvDV2yCE-RhrrpsJhKbE,24128 -pip/_internal/resolution/resolvelib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc,, -pip/_internal/resolution/resolvelib/base.py,sha256=u1O4fkvCO4mhmu5i32xrDv9AX5NgUci_eYVyBDQhTIM,5220 -pip/_internal/resolution/resolvelib/candidates.py,sha256=u5mU96o2lnUy-ODRJv7Wevee0xCYI6IKIXNamSBQnso,18969 -pip/_internal/resolution/resolvelib/factory.py,sha256=y1Q2fsV1GKDKPitoapOLLEs75WNzEpd4l_RezCt927c,27845 -pip/_internal/resolution/resolvelib/found_candidates.py,sha256=hvL3Hoa9VaYo-qEOZkBi2Iqw251UDxPz-uMHVaWmLpE,5705 -pip/_internal/resolution/resolvelib/provider.py,sha256=4t23ivjruqM6hKBX1KpGiTt-M4HGhRcZnGLV0c01K7U,9824 -pip/_internal/resolution/resolvelib/reporter.py,sha256=YFm9hQvz4DFCbjZeFTQ56hTz3Ac-mDBnHkeNRVvMHLY,3100 -pip/_internal/resolution/resolvelib/requirements.py,sha256=zHnERhfubmvKyM3kgdAOs0dYFiqUfzKR-DAt4y0NWOI,5454 -pip/_internal/resolution/resolvelib/resolver.py,sha256=n2Vn9EC5-7JmcRY5erIPQ4hUWnEUngG0oYS3JW3xXZo,11642 -pip/_internal/self_outdated_check.py,sha256=pnqBuKKZQ8OxKP0MaUUiDHl3AtyoMJHHG4rMQ7YcYXY,8167 -pip/_internal/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_internal/utils/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc,, -pip/_internal/utils/__pycache__/_log.cpython-311.pyc,, -pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc,, -pip/_internal/utils/__pycache__/compat.cpython-311.pyc,, -pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc,, -pip/_internal/utils/__pycache__/datetime.cpython-311.pyc,, -pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc,, -pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc,, -pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc,, -pip/_internal/utils/__pycache__/encoding.cpython-311.pyc,, -pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc,, -pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc,, -pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc,, -pip/_internal/utils/__pycache__/glibc.cpython-311.pyc,, -pip/_internal/utils/__pycache__/hashes.cpython-311.pyc,, -pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc,, -pip/_internal/utils/__pycache__/logging.cpython-311.pyc,, -pip/_internal/utils/__pycache__/misc.cpython-311.pyc,, -pip/_internal/utils/__pycache__/models.cpython-311.pyc,, -pip/_internal/utils/__pycache__/packaging.cpython-311.pyc,, -pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc,, -pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc,, -pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc,, -pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc,, -pip/_internal/utils/__pycache__/urls.cpython-311.pyc,, -pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc,, -pip/_internal/utils/__pycache__/wheel.cpython-311.pyc,, -pip/_internal/utils/_jaraco_text.py,sha256=yvDGelTVugRayPaOF2k4ab0Ky4d3uOkAfuOQjASjImY,3351 -pip/_internal/utils/_log.py,sha256=-jHLOE_THaZz5BFcCnoSL9EYAtJ0nXem49s9of4jvKw,1015 -pip/_internal/utils/appdirs.py,sha256=swgcTKOm3daLeXTW6v5BUS2Ti2RvEnGRQYH_yDXklAo,1665 -pip/_internal/utils/compat.py,sha256=ACyBfLgj3_XG-iA5omEDrXqDM0cQKzi8h8HRBInzG6Q,1884 -pip/_internal/utils/compatibility_tags.py,sha256=ydin8QG8BHqYRsPY4OL6cmb44CbqXl1T0xxS97VhHkk,5377 -pip/_internal/utils/datetime.py,sha256=m21Y3wAtQc-ji6Veb6k_M5g6A0ZyFI4egchTdnwh-pQ,242 -pip/_internal/utils/deprecation.py,sha256=NKo8VqLioJ4nnXXGmW4KdasxF90EFHkZaHeX1fT08C8,3627 -pip/_internal/utils/direct_url_helpers.py,sha256=6F1tc2rcKaCZmgfVwsE6ObIe_Pux23mUVYA-2D9wCFc,3206 -pip/_internal/utils/egg_link.py,sha256=ZryCchR_yQSCsdsMkCpxQjjLbQxObA5GDtLG0RR5mGc,2118 -pip/_internal/utils/encoding.py,sha256=qqsXDtiwMIjXMEiIVSaOjwH5YmirCaK-dIzb6-XJsL0,1169 -pip/_internal/utils/entrypoints.py,sha256=YlhLTRl2oHBAuqhc-zmL7USS67TPWVHImjeAQHreZTQ,3064 -pip/_internal/utils/filesystem.py,sha256=RhMIXUaNVMGjc3rhsDahWQ4MavvEQDdqXqgq-F6fpw8,5122 -pip/_internal/utils/filetypes.py,sha256=i8XAQ0eFCog26Fw9yV0Yb1ygAqKYB1w9Cz9n0fj8gZU,716 -pip/_internal/utils/glibc.py,sha256=Mesxxgg3BLxheLZx-dSf30b6gKpOgdVXw6W--uHSszQ,3113 -pip/_internal/utils/hashes.py,sha256=MjOigC75z6qoRMkgHiHqot7eqxfwDZSrEflJMPm-bHE,5118 -pip/_internal/utils/inject_securetransport.py,sha256=o-QRVMGiENrTJxw3fAhA7uxpdEdw6M41TjHYtSVRrcg,795 -pip/_internal/utils/logging.py,sha256=U2q0i1n8hPS2gQh8qcocAg5dovGAa_bR24akmXMzrk4,11632 -pip/_internal/utils/misc.py,sha256=Ds3rSQU7HbdAywwmEBcPnVoLB1Tp_2gL6IbaWcpe8i0,22343 -pip/_internal/utils/models.py,sha256=5GoYU586SrxURMvDn_jBMJInitviJg4O5-iOU-6I0WY,1193 -pip/_internal/utils/packaging.py,sha256=5Wm6_x7lKrlqVjPI5MBN_RurcRHwVYoQ7Ksrs84de7s,2108 -pip/_internal/utils/setuptools_build.py,sha256=ouXpud-jeS8xPyTPsXJ-m34NPvK5os45otAzdSV_IJE,4435 -pip/_internal/utils/subprocess.py,sha256=0EMhgfPGFk8FZn6Qq7Hp9PN6YHuQNWiVby4DXcTCON4,9200 -pip/_internal/utils/temp_dir.py,sha256=aCX489gRa4Nu0dMKRFyGhV6maJr60uEynu5uCbKR4Qg,7702 -pip/_internal/utils/unpacking.py,sha256=SBb2iV1crb89MDRTEKY86R4A_UOWApTQn9VQVcMDOlE,8821 -pip/_internal/utils/urls.py,sha256=AhaesUGl-9it6uvG6fsFPOr9ynFpGaTMk4t5XTX7Z_Q,1759 -pip/_internal/utils/virtualenv.py,sha256=S6f7csYorRpiD6cvn3jISZYc3I8PJC43H5iMFpRAEDU,3456 -pip/_internal/utils/wheel.py,sha256=lXOgZyTlOm5HmK8tw5iw0A3_5A6wRzsXHOaQkIvvloU,4549 -pip/_internal/vcs/__init__.py,sha256=UAqvzpbi0VbZo3Ub6skEeZAw-ooIZR-zX_WpCbxyCoU,596 -pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/git.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc,, -pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc,, -pip/_internal/vcs/bazaar.py,sha256=j0oin0fpGRHcCFCxEcpPCQoFEvA-DMLULKdGP8Nv76o,3519 -pip/_internal/vcs/git.py,sha256=mjhwudCx9WlLNkxZ6_kOKmueF0rLoU2i1xeASKF6yiQ,18116 -pip/_internal/vcs/mercurial.py,sha256=1FG5Zh2ltJZKryO40d2l2Q91FYNazuS16kkpoAVOh0Y,5244 -pip/_internal/vcs/subversion.py,sha256=vhZs8L-TNggXqM1bbhl-FpbxE3TrIB6Tgnx8fh3S2HE,11729 -pip/_internal/vcs/versioncontrol.py,sha256=KUOc-hN51em9jrqxKwUR3JnkgSE-xSOqMiiJcSaL6B8,22811 -pip/_internal/wheel_builder.py,sha256=3UlHfxQi7_AAXI7ur8aPpPbmqHhecCsubmkHEl-00KU,11842 -pip/_vendor/__init__.py,sha256=fNxOSVD0auElsD8fN9tuq5psfgMQ-RFBtD4X5gjlRkg,4966 -pip/_vendor/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/__pycache__/six.cpython-311.pyc,, -pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc,, -pip/_vendor/cachecontrol/__init__.py,sha256=hrxlv3q7upsfyMw8k3gQ9vagBax1pYHSGGqYlZ0Zk0M,465 -pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc,, -pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc,, -pip/_vendor/cachecontrol/_cmd.py,sha256=lxUXqfNTVx84zf6tcWbkLZHA6WVBRtJRpfeA9ZqhaAY,1379 -pip/_vendor/cachecontrol/adapter.py,sha256=ew9OYEQHEOjvGl06ZsuX8W3DAvHWsQKHwWAxISyGug8,5033 -pip/_vendor/cachecontrol/cache.py,sha256=Tty45fOjH40fColTGkqKQvQQmbYsMpk-nCyfLcv2vG4,1535 -pip/_vendor/cachecontrol/caches/__init__.py,sha256=h-1cUmOz6mhLsjTjOrJ8iPejpGdLCyG4lzTftfGZvLg,242 -pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc,, -pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc,, -pip/_vendor/cachecontrol/caches/file_cache.py,sha256=GpexcE29LoY4MaZwPUTcUBZaDdcsjqyLxZFznk8Hbr4,5271 -pip/_vendor/cachecontrol/caches/redis_cache.py,sha256=mp-QWonP40I3xJGK3XVO-Gs9a3UjzlqqEmp9iLJH9F4,1033 -pip/_vendor/cachecontrol/compat.py,sha256=LNx7vqBndYdHU8YuJt53ab_8rzMGTXVrvMb7CZJkxG0,778 -pip/_vendor/cachecontrol/controller.py,sha256=bAYrt7x_VH4toNpI066LQxbHpYGpY1MxxmZAhspplvw,16416 -pip/_vendor/cachecontrol/filewrapper.py,sha256=X4BAQOO26GNOR7nH_fhTzAfeuct2rBQcx_15MyFBpcs,3946 -pip/_vendor/cachecontrol/heuristics.py,sha256=8kAyuZLSCyEIgQr6vbUwfhpqg9ows4mM0IV6DWazevI,4154 -pip/_vendor/cachecontrol/serialize.py,sha256=_U1NU_C-SDgFzkbAxAsPDgMTHeTWZZaHCQnZN_jh0U8,7105 -pip/_vendor/cachecontrol/wrapper.py,sha256=X3-KMZ20Ho3VtqyVaXclpeQpFzokR5NE8tZSfvKVaB8,774 -pip/_vendor/certifi/__init__.py,sha256=q5ePznlfOw-XYIOV6RTnh45yS9haN-Nb1d__4QXc3g0,94 -pip/_vendor/certifi/__main__.py,sha256=1k3Cr95vCxxGRGDljrW3wMdpZdL3Nhf0u1n-k2qdsCY,255 -pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/certifi/__pycache__/core.cpython-311.pyc,, -pip/_vendor/certifi/cacert.pem,sha256=swFTXcpJHZgU6ij6oyCsehnQ9dlCN5lvoKO1qTZDJRQ,278952 -pip/_vendor/certifi/core.py,sha256=ZwiOsv-sD_ouU1ft8wy_xZ3LQ7UbcVzyqj2XNyrsZis,4279 -pip/_vendor/chardet/__init__.py,sha256=57R-HSxj0PWmILMN0GFmUNqEMfrEVSamXyjD-W6_fbs,4797 -pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc,, -pip/_vendor/chardet/__pycache__/version.cpython-311.pyc,, -pip/_vendor/chardet/big5freq.py,sha256=ltcfP-3PjlNHCoo5e4a7C4z-2DhBTXRfY6jbMbB7P30,31274 -pip/_vendor/chardet/big5prober.py,sha256=lPMfwCX6v2AaPgvFh_cSWZcgLDbWiFCHLZ_p9RQ9uxE,1763 -pip/_vendor/chardet/chardistribution.py,sha256=13B8XUG4oXDuLdXvfbIWwLFeR-ZU21AqTS1zcdON8bU,10032 -pip/_vendor/chardet/charsetgroupprober.py,sha256=UKK3SaIZB2PCdKSIS0gnvMtLR9JJX62M-fZJu3OlWyg,3915 -pip/_vendor/chardet/charsetprober.py,sha256=L3t8_wIOov8em-vZWOcbkdsrwe43N6_gqNh5pH7WPd4,5420 -pip/_vendor/chardet/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc,, -pip/_vendor/chardet/cli/chardetect.py,sha256=zibMVg5RpKb-ME9_7EYG4ZM2Sf07NHcQzZ12U-rYJho,3242 -pip/_vendor/chardet/codingstatemachine.py,sha256=K7k69sw3jY5DmTXoSJQVsUtFIQKYPQVOSJJhBuGv_yE,3732 -pip/_vendor/chardet/codingstatemachinedict.py,sha256=0GY3Hi2qIZvDrOOJ3AtqppM1RsYxr_66ER4EHjuMiMc,542 -pip/_vendor/chardet/cp949prober.py,sha256=0jKRV7fECuWI16rNnks0ZECKA1iZYCIEaP8A1ZvjUSI,1860 -pip/_vendor/chardet/enums.py,sha256=TzECiZoCKNMqgwU76cPCeKWFBqaWvAdLMev5_bCkhY8,1683 -pip/_vendor/chardet/escprober.py,sha256=Kho48X65xE0scFylIdeJjM2bcbvRvv0h0WUbMWrJD3A,4006 -pip/_vendor/chardet/escsm.py,sha256=AqyXpA2FQFD7k-buBty_7itGEYkhmVa8X09NLRul3QM,12176 -pip/_vendor/chardet/eucjpprober.py,sha256=5KYaM9fsxkRYzw1b5k0fL-j_-ezIw-ij9r97a9MHxLY,3934 -pip/_vendor/chardet/euckrfreq.py,sha256=3mHuRvXfsq_QcQysDQFb8qSudvTiol71C6Ic2w57tKM,13566 -pip/_vendor/chardet/euckrprober.py,sha256=hiFT6wM174GIwRvqDsIcuOc-dDsq2uPKMKbyV8-1Xnc,1753 -pip/_vendor/chardet/euctwfreq.py,sha256=2alILE1Lh5eqiFJZjzRkMQXolNJRHY5oBQd-vmZYFFM,36913 -pip/_vendor/chardet/euctwprober.py,sha256=NxbpNdBtU0VFI0bKfGfDkpP7S2_8_6FlO87dVH0ogws,1753 -pip/_vendor/chardet/gb2312freq.py,sha256=49OrdXzD-HXqwavkqjo8Z7gvs58hONNzDhAyMENNkvY,20735 -pip/_vendor/chardet/gb2312prober.py,sha256=KPEBueaSLSvBpFeINMu0D6TgHcR90e5PaQawifzF4o0,1759 -pip/_vendor/chardet/hebrewprober.py,sha256=96T_Lj_OmW-fK7JrSHojYjyG3fsGgbzkoTNleZ3kfYE,14537 -pip/_vendor/chardet/jisfreq.py,sha256=mm8tfrwqhpOd3wzZKS4NJqkYBQVcDfTM2JiQ5aW932E,25796 -pip/_vendor/chardet/johabfreq.py,sha256=dBpOYG34GRX6SL8k_LbS9rxZPMjLjoMlgZ03Pz5Hmqc,42498 -pip/_vendor/chardet/johabprober.py,sha256=O1Qw9nVzRnun7vZp4UZM7wvJSv9W941mEU9uDMnY3DU,1752 -pip/_vendor/chardet/jpcntx.py,sha256=uhHrYWkLxE_rF5OkHKInm0HUsrjgKHHVQvtt3UcvotA,27055 -pip/_vendor/chardet/langbulgarianmodel.py,sha256=vmbvYFP8SZkSxoBvLkFqKiH1sjma5ihk3PTpdy71Rr4,104562 -pip/_vendor/chardet/langgreekmodel.py,sha256=JfB7bupjjJH2w3X_mYnQr9cJA_7EuITC2cRW13fUjeI,98484 -pip/_vendor/chardet/langhebrewmodel.py,sha256=3HXHaLQPNAGcXnJjkIJfozNZLTvTJmf4W5Awi6zRRKc,98196 -pip/_vendor/chardet/langhungarianmodel.py,sha256=WxbeQIxkv8YtApiNqxQcvj-tMycsoI4Xy-fwkDHpP_Y,101363 -pip/_vendor/chardet/langrussianmodel.py,sha256=s395bTZ87ESTrZCOdgXbEjZ9P1iGPwCl_8xSsac_DLY,128035 -pip/_vendor/chardet/langthaimodel.py,sha256=7bJlQitRpTnVGABmbSznHnJwOHDy3InkTvtFUx13WQI,102774 -pip/_vendor/chardet/langturkishmodel.py,sha256=XY0eGdTIy4eQ9Xg1LVPZacb-UBhHBR-cq0IpPVHowKc,95372 -pip/_vendor/chardet/latin1prober.py,sha256=p15EEmFbmQUwbKLC7lOJVGHEZwcG45ubEZYTGu01J5g,5380 -pip/_vendor/chardet/macromanprober.py,sha256=9anfzmY6TBfUPDyBDOdY07kqmTHpZ1tK0jL-p1JWcOY,6077 -pip/_vendor/chardet/mbcharsetprober.py,sha256=Wr04WNI4F3X_VxEverNG-H25g7u-MDDKlNt-JGj-_uU,3715 -pip/_vendor/chardet/mbcsgroupprober.py,sha256=iRpaNBjV0DNwYPu_z6TiHgRpwYahiM7ztI_4kZ4Uz9A,2131 -pip/_vendor/chardet/mbcssm.py,sha256=hUtPvDYgWDaA2dWdgLsshbwRfm3Q5YRlRogdmeRUNQw,30391 -pip/_vendor/chardet/metadata/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc,, -pip/_vendor/chardet/metadata/languages.py,sha256=FhvBIdZFxRQ-dTwkb_0madRKgVBCaUMQz9I5xqjE5iQ,13560 -pip/_vendor/chardet/resultdict.py,sha256=ez4FRvN5KaSosJeJ2WzUyKdDdg35HDy_SSLPXKCdt5M,402 -pip/_vendor/chardet/sbcharsetprober.py,sha256=-nd3F90i7GpXLjehLVHqVBE0KlWzGvQUPETLBNn4o6U,6400 -pip/_vendor/chardet/sbcsgroupprober.py,sha256=gcgI0fOfgw_3YTClpbra_MNxwyEyJ3eUXraoLHYb59E,4137 -pip/_vendor/chardet/sjisprober.py,sha256=aqQufMzRw46ZpFlzmYaYeT2-nzmKb-hmcrApppJ862k,4007 -pip/_vendor/chardet/universaldetector.py,sha256=xYBrg4x0dd9WnT8qclfADVD9ondrUNkqPmvte1pa520,14848 -pip/_vendor/chardet/utf1632prober.py,sha256=pw1epGdMj1hDGiCu1AHqqzOEfjX8MVdiW7O1BlT8-eQ,8505 -pip/_vendor/chardet/utf8prober.py,sha256=8m08Ub5490H4jQ6LYXvFysGtgKoKsHUd2zH_i8_TnVw,2812 -pip/_vendor/chardet/version.py,sha256=lGtJcxGM44Qz4Cbk4rbbmrKxnNr1-97U25TameLehZw,244 -pip/_vendor/colorama/__init__.py,sha256=wePQA4U20tKgYARySLEC047ucNX-g8pRLpYBuiHlLb8,266 -pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc,, -pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc,, -pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc,, -pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc,, -pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc,, -pip/_vendor/colorama/ansi.py,sha256=Top4EeEuaQdBWdteKMEcGOTeKeF19Q-Wo_6_Cj5kOzQ,2522 -pip/_vendor/colorama/ansitowin32.py,sha256=vPNYa3OZbxjbuFyaVo0Tmhmy1FZ1lKMWCnT7odXpItk,11128 -pip/_vendor/colorama/initialise.py,sha256=-hIny86ClXo39ixh5iSCfUIa2f_h_bgKRDW7gqs-KLU,3325 -pip/_vendor/colorama/tests/__init__.py,sha256=MkgPAEzGQd-Rq0w0PZXSX2LadRWhUECcisJY8lSrm4Q,75 -pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc,, -pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc,, -pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc,, -pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc,, -pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc,, -pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc,, -pip/_vendor/colorama/tests/ansi_test.py,sha256=FeViDrUINIZcr505PAxvU4AjXz1asEiALs9GXMhwRaE,2839 -pip/_vendor/colorama/tests/ansitowin32_test.py,sha256=RN7AIhMJ5EqDsYaCjVo-o4u8JzDD4ukJbmevWKS70rY,10678 -pip/_vendor/colorama/tests/initialise_test.py,sha256=BbPy-XfyHwJ6zKozuQOvNvQZzsx9vdb_0bYXn7hsBTc,6741 -pip/_vendor/colorama/tests/isatty_test.py,sha256=Pg26LRpv0yQDB5Ac-sxgVXG7hsA1NYvapFgApZfYzZg,1866 -pip/_vendor/colorama/tests/utils.py,sha256=1IIRylG39z5-dzq09R_ngufxyPZxgldNbrxKxUGwGKE,1079 -pip/_vendor/colorama/tests/winterm_test.py,sha256=qoWFPEjym5gm2RuMwpf3pOis3a5r_PJZFCzK254JL8A,3709 -pip/_vendor/colorama/win32.py,sha256=YQOKwMTwtGBbsY4dL5HYTvwTeP9wIQra5MvPNddpxZs,6181 -pip/_vendor/colorama/winterm.py,sha256=XCQFDHjPi6AHYNdZwy0tA02H-Jh48Jp-HvCjeLeLp3U,7134 -pip/_vendor/distlib/__init__.py,sha256=acgfseOC55dNrVAzaBKpUiH3Z6V7Q1CaxsiQ3K7pC-E,581 -pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/database.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/index.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/util.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/version.cpython-311.pyc,, -pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc,, -pip/_vendor/distlib/compat.py,sha256=tfoMrj6tujk7G4UC2owL6ArgDuCKabgBxuJRGZSmpko,41259 -pip/_vendor/distlib/database.py,sha256=o_mw0fAr93NDAHHHfqG54Y1Hi9Rkfrp2BX15XWZYK50,51697 -pip/_vendor/distlib/index.py,sha256=HFiDG7LMoaBs829WuotrfIwcErOOExUOR_AeBtw_TCU,20834 -pip/_vendor/distlib/locators.py,sha256=wNzG-zERzS_XGls-nBPVVyLRHa2skUlkn0-5n0trMWA,51991 -pip/_vendor/distlib/manifest.py,sha256=nQEhYmgoreaBZzyFzwYsXxJARu3fo4EkunU163U16iE,14811 -pip/_vendor/distlib/markers.py,sha256=TpHHHLgkzyT7YHbwj-2i6weRaq-Ivy2-MUnrDkjau-U,5058 -pip/_vendor/distlib/metadata.py,sha256=g_DIiu8nBXRzA-mWPRpatHGbmFZqaFoss7z9TG7QSUU,39801 -pip/_vendor/distlib/resources.py,sha256=LwbPksc0A1JMbi6XnuPdMBUn83X7BPuFNWqPGEKI698,10820 -pip/_vendor/distlib/scripts.py,sha256=BmkTKmiTk4m2cj-iueliatwz3ut_9SsABBW51vnQnZU,18102 -pip/_vendor/distlib/t32.exe,sha256=a0GV5kCoWsMutvliiCKmIgV98eRZ33wXoS-XrqvJQVs,97792 -pip/_vendor/distlib/t64-arm.exe,sha256=68TAa32V504xVBnufojh0PcenpR3U4wAqTqf-MZqbPw,182784 -pip/_vendor/distlib/t64.exe,sha256=gaYY8hy4fbkHYTTnA4i26ct8IQZzkBG2pRdy0iyuBrc,108032 -pip/_vendor/distlib/util.py,sha256=31dPXn3Rfat0xZLeVoFpuniyhe6vsbl9_QN-qd9Lhlk,66262 -pip/_vendor/distlib/version.py,sha256=WG__LyAa2GwmA6qSoEJtvJE8REA1LZpbSizy8WvhJLk,23513 -pip/_vendor/distlib/w32.exe,sha256=R4csx3-OGM9kL4aPIzQKRo5TfmRSHZo6QWyLhDhNBks,91648 -pip/_vendor/distlib/w64-arm.exe,sha256=xdyYhKj0WDcVUOCb05blQYvzdYIKMbmJn2SZvzkcey4,168448 -pip/_vendor/distlib/w64.exe,sha256=ejGf-rojoBfXseGLpya6bFTFPWRG21X5KvU8J5iU-K0,101888 -pip/_vendor/distlib/wheel.py,sha256=Rgqs658VsJ3R2845qwnZD8XQryV2CzWw2mghwLvxxsI,43898 -pip/_vendor/distro/__init__.py,sha256=2fHjF-SfgPvjyNZ1iHh_wjqWdR_Yo5ODHwZC0jLBPhc,981 -pip/_vendor/distro/__main__.py,sha256=bu9d3TifoKciZFcqRBuygV3GSuThnVD_m2IK4cz96Vs,64 -pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/distro/__pycache__/distro.cpython-311.pyc,, -pip/_vendor/distro/distro.py,sha256=UZO1LjIhtFCMdlbiz39gj3raV-Amf3SBwzGzfApiMHw,49330 -pip/_vendor/idna/__init__.py,sha256=KJQN1eQBr8iIK5SKrJ47lXvxG0BJ7Lm38W4zT0v_8lk,849 -pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/codec.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/compat.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/core.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc,, -pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc,, -pip/_vendor/idna/codec.py,sha256=6ly5odKfqrytKT9_7UrlGklHnf1DSK2r9C6cSM4sa28,3374 -pip/_vendor/idna/compat.py,sha256=0_sOEUMT4CVw9doD3vyRhX80X19PwqFoUBs7gWsFME4,321 -pip/_vendor/idna/core.py,sha256=1JxchwKzkxBSn7R_oCE12oBu3eVux0VzdxolmIad24M,12950 -pip/_vendor/idna/idnadata.py,sha256=xUjqKqiJV8Ho_XzBpAtv5JFoVPSupK-SUXvtjygUHqw,44375 -pip/_vendor/idna/intranges.py,sha256=YBr4fRYuWH7kTKS2tXlFjM24ZF1Pdvcir-aywniInqg,1881 -pip/_vendor/idna/package_data.py,sha256=C_jHJzmX8PI4xq0jpzmcTMxpb5lDsq4o5VyxQzlVrZE,21 -pip/_vendor/idna/uts46data.py,sha256=zvjZU24s58_uAS850Mcd0NnD0X7_gCMAMjzWNIeUJdc,206539 -pip/_vendor/msgpack/__init__.py,sha256=hyGhlnmcJkxryJBKC3X5FnEph375kQoL_mG8LZUuXgY,1132 -pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc,, -pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc,, -pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc,, -pip/_vendor/msgpack/exceptions.py,sha256=dCTWei8dpkrMsQDcjQk74ATl9HsIBH0ybt8zOPNqMYc,1081 -pip/_vendor/msgpack/ext.py,sha256=C5MK8JhVYGYFWPvxsORsqZAnvOXefYQ57m1Ym0luW5M,6079 -pip/_vendor/msgpack/fallback.py,sha256=tvNBHyxxFbuVlC8GZShETClJxjLiDMOja4XwwyvNm2g,34544 -pip/_vendor/packaging/__about__.py,sha256=ugASIO2w1oUyH8_COqQ2X_s0rDhjbhQC3yJocD03h2c,661 -pip/_vendor/packaging/__init__.py,sha256=b9Kk5MF7KxhhLgcDmiUWukN-LatWFxPdNug0joPhHSk,497 -pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc,, -pip/_vendor/packaging/__pycache__/version.cpython-311.pyc,, -pip/_vendor/packaging/_manylinux.py,sha256=XcbiXB-qcjv3bcohp6N98TMpOP4_j3m-iOA8ptK2GWY,11488 -pip/_vendor/packaging/_musllinux.py,sha256=_KGgY_qc7vhMGpoqss25n2hiLCNKRtvz9mCrS7gkqyc,4378 -pip/_vendor/packaging/_structures.py,sha256=q3eVNmbWJGG_S0Dit_S3Ao8qQqz_5PYTXFAKBZe5yr4,1431 -pip/_vendor/packaging/markers.py,sha256=AJBOcY8Oq0kYc570KuuPTkvuqjAlhufaE2c9sCUbm64,8487 -pip/_vendor/packaging/requirements.py,sha256=NtDlPBtojpn1IUC85iMjPNsUmufjpSlwnNA-Xb4m5NA,4676 -pip/_vendor/packaging/specifiers.py,sha256=LRQ0kFsHrl5qfcFNEEJrIFYsnIHQUJXY9fIsakTrrqE,30110 -pip/_vendor/packaging/tags.py,sha256=lmsnGNiJ8C4D_Pf9PbM0qgbZvD9kmB9lpZBQUZa3R_Y,15699 -pip/_vendor/packaging/utils.py,sha256=dJjeat3BS-TYn1RrUFVwufUMasbtzLfYRoy_HXENeFQ,4200 -pip/_vendor/packaging/version.py,sha256=_fLRNrFrxYcHVfyo8vk9j8s6JM8N_xsSxVFr6RJyco8,14665 -pip/_vendor/pkg_resources/__init__.py,sha256=hTAeJCNYb7dJseIDVsYK3mPQep_gphj4tQh-bspX8bg,109364 -pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/platformdirs/__init__.py,sha256=SkhEYVyC_HUHC6KX7n4M_6coyRMtEB38QMyOYIAX6Yk,20155 -pip/_vendor/platformdirs/__main__.py,sha256=fVvSiTzr2-RM6IsjWjj4fkaOtDOgDhUWv6sA99do4CQ,1476 -pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc,, -pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc,, -pip/_vendor/platformdirs/android.py,sha256=y_EEMKwYl2-bzYBDovksSn8m76on0Lda8eyJksVQE9U,7211 -pip/_vendor/platformdirs/api.py,sha256=jWtX06jAJytYrkJDOqEls97mCkyHRSZkoqUlbMK5Qew,7132 -pip/_vendor/platformdirs/macos.py,sha256=LueVOoVgGWDBwQb8OFwXkVKfVn33CM1Lkwf1-A86tRQ,3678 -pip/_vendor/platformdirs/unix.py,sha256=22JhR8ZY0aLxSVCFnKrc6f1iz6Gv42K24Daj7aTjfSg,8809 -pip/_vendor/platformdirs/version.py,sha256=mavZTQIJIXfdewEaSTn7EWrNfPZWeRofb-74xqW5f2M,160 -pip/_vendor/platformdirs/windows.py,sha256=4TtbPGoWG2PRgI11uquDa7eRk8TcxvnUNuuMGZItnXc,9573 -pip/_vendor/pygments/__init__.py,sha256=6AuDljQtvf89DTNUyWM7k3oUlP_lq70NU-INKKteOBY,2983 -pip/_vendor/pygments/__main__.py,sha256=es8EKMvXj5yToIfQ-pf3Dv5TnIeeM6sME0LW-n4ecHo,353 -pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/console.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/style.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/token.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc,, -pip/_vendor/pygments/__pycache__/util.cpython-311.pyc,, -pip/_vendor/pygments/cmdline.py,sha256=byxYJp9gnjVeyhRlZ3UTMgo_LhkXh1afvN8wJBtAcc8,23685 -pip/_vendor/pygments/console.py,sha256=2wZ5W-U6TudJD1_NLUwjclMpbomFM91lNv11_60sfGY,1697 -pip/_vendor/pygments/filter.py,sha256=j5aLM9a9wSx6eH1oy473oSkJ02hGWNptBlVo4s1g_30,1938 -pip/_vendor/pygments/filters/__init__.py,sha256=h_koYkUFo-FFUxjs564JHUAz7O3yJpVwI6fKN3MYzG0,40386 -pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/formatter.py,sha256=J9OL9hXLJKZk7moUgKwpjW9HNf4WlJFg_o_-Z_S_tTY,4178 -pip/_vendor/pygments/formatters/__init__.py,sha256=_xgAcdFKr0QNYwh_i98AU9hvfP3X2wAkhElFcRRF3Uo,5424 -pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc,, -pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc,, -pip/_vendor/pygments/formatters/_mapping.py,sha256=1Cw37FuQlNacnxRKmtlPX4nyLoX9_ttko5ZwscNUZZ4,4176 -pip/_vendor/pygments/formatters/bbcode.py,sha256=r1b7wzWTJouADDLh-Z11iRi4iQxD0JKJ1qHl6mOYxsA,3314 -pip/_vendor/pygments/formatters/groff.py,sha256=xy8Zf3tXOo6MWrXh7yPGWx3lVEkg_DhY4CxmsDb0IVo,5094 -pip/_vendor/pygments/formatters/html.py,sha256=PIzAyilNqaTzSSP2slDG2VDLE3qNioWy2rgtSSoviuI,35610 -pip/_vendor/pygments/formatters/img.py,sha256=XKXmg2_XONrR4mtq2jfEU8XCsoln3VSGTw-UYiEokys,21938 -pip/_vendor/pygments/formatters/irc.py,sha256=Ep-m8jd3voFO6Fv57cUGFmz6JVA67IEgyiBOwv0N4a0,4981 -pip/_vendor/pygments/formatters/latex.py,sha256=FGzJ-YqSTE8z_voWPdzvLY5Tq8jE_ygjGjM6dXZJ8-k,19351 -pip/_vendor/pygments/formatters/other.py,sha256=gPxkk5BdAzWTCgbEHg1lpLi-1F6ZPh5A_aotgLXHnzg,5073 -pip/_vendor/pygments/formatters/pangomarkup.py,sha256=6LKnQc8yh49f802bF0sPvbzck4QivMYqqoXAPaYP8uU,2212 -pip/_vendor/pygments/formatters/rtf.py,sha256=aA0v_psW6KZI3N18TKDifxeL6mcF8EDXcPXDWI4vhVQ,5014 -pip/_vendor/pygments/formatters/svg.py,sha256=dQONWypbzfvzGCDtdp3M_NJawScJvM2DiHbx1k-ww7g,7335 -pip/_vendor/pygments/formatters/terminal.py,sha256=FG-rpjRpFmNpiGB4NzIucvxq6sQIXB3HOTo2meTKtrU,4674 -pip/_vendor/pygments/formatters/terminal256.py,sha256=13SJ3D5pFdqZ9zROE6HbWnBDwHvOGE8GlsmqGhprRp4,11753 -pip/_vendor/pygments/lexer.py,sha256=2BpqLlT2ExvOOi7vnjK5nB4Fp-m52ldiPaXMox5uwug,34618 -pip/_vendor/pygments/lexers/__init__.py,sha256=j5KEi5O_VQ5GS59H49l-10gzUOkWKxlwGeVMlGO2MMk,12130 -pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc,, -pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc,, -pip/_vendor/pygments/lexers/_mapping.py,sha256=Hts4r_ZQ8icftGM7gkBPeED5lyVSv4affFgXYE6Ap04,72281 -pip/_vendor/pygments/lexers/python.py,sha256=c7jnmKFU9DLxTJW0UbwXt6Z9FJqbBlVsWA1Qr9xSA_w,53424 -pip/_vendor/pygments/modeline.py,sha256=eF2vO4LpOGoPvIKKkbPfnyut8hT4UiebZPpb-BYGQdI,986 -pip/_vendor/pygments/plugin.py,sha256=j1Fh310RbV2DQ9nvkmkqvlj38gdyuYKllLnGxbc8sJM,2591 -pip/_vendor/pygments/regexopt.py,sha256=jg1ALogcYGU96TQS9isBl6dCrvw5y5--BP_K-uFk_8s,3072 -pip/_vendor/pygments/scanner.py,sha256=b_nu5_f3HCgSdp5S_aNRBQ1MSCm4ZjDwec2OmTRickw,3092 -pip/_vendor/pygments/sphinxext.py,sha256=wBFYm180qea9JKt__UzhRlNRNhczPDFDaqGD21sbuso,6882 -pip/_vendor/pygments/style.py,sha256=C4qyoJrUTkq-OV3iO-8Vz3UtWYpJwSTdh5_vlGCGdNQ,6257 -pip/_vendor/pygments/styles/__init__.py,sha256=he7HjQx7sC0d2kfTVLjUs0J15mtToJM6M1brwIm9--Q,3700 -pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pygments/token.py,sha256=seNsmcch9OEHXYirh8Ool7w8xDhfNTbLj5rHAC-gc_o,6184 -pip/_vendor/pygments/unistring.py,sha256=FaUfG14NBJEKLQoY9qj6JYeXrpYcLmKulghdxOGFaOc,63223 -pip/_vendor/pygments/util.py,sha256=AEVY0qonyyEMgv4Do2dINrrqUAwUk2XYSqHM650uzek,10230 -pip/_vendor/pyparsing/__init__.py,sha256=9m1JbE2JTLdBG0Mb6B0lEaZj181Wx5cuPXZpsbHEYgE,9116 -pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc,, -pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc,, -pip/_vendor/pyparsing/actions.py,sha256=05uaIPOznJPQ7VgRdmGCmG4sDnUPtwgv5qOYIqbL2UY,6567 -pip/_vendor/pyparsing/common.py,sha256=p-3c83E5-DjlkF35G0O9-kjQRpoejP-2_z0hxZ-eol4,13387 -pip/_vendor/pyparsing/core.py,sha256=yvuRlLpXSF8mgk-QhiW3OVLqD9T0rsj9tbibhRH4Yaw,224445 -pip/_vendor/pyparsing/diagram/__init__.py,sha256=nxmDOoYF9NXuLaGYy01tKFjkNReWJlrGFuJNWEiTo84,24215 -pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pyparsing/exceptions.py,sha256=6Jc6W1eDZBzyFu1J0YrcdNFVBC-RINujZmveSnB8Rxw,9523 -pip/_vendor/pyparsing/helpers.py,sha256=BZJHCA8SS0pYio30KGQTc9w2qMOaK4YpZ7hcvHbnTgk,38646 -pip/_vendor/pyparsing/results.py,sha256=9dyqQ-w3MjfmxWbFt8KEPU6IfXeyRdoWp2Og802rUQY,26692 -pip/_vendor/pyparsing/testing.py,sha256=eJncg0p83zm1FTPvM9auNT6oavIvXaibmRFDf1qmwkY,13488 -pip/_vendor/pyparsing/unicode.py,sha256=fAPdsJiARFbkPAih6NkYry0dpj4jPqelGVMlE4wWFW8,10646 -pip/_vendor/pyparsing/util.py,sha256=vTMzTdwSDyV8d_dSgquUTdWgBFoA_W30nfxEJDsshRQ,8670 -pip/_vendor/pyproject_hooks/__init__.py,sha256=kCehmy0UaBa9oVMD7ZIZrnswfnP3LXZ5lvnNJAL5JBM,491 -pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc,, -pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc,, -pip/_vendor/pyproject_hooks/_compat.py,sha256=by6evrYnqkisiM-MQcvOKs5bgDMzlOSgZqRHNqf04zE,138 -pip/_vendor/pyproject_hooks/_impl.py,sha256=61GJxzQip0IInhuO69ZI5GbNQ82XEDUB_1Gg5_KtUoc,11920 -pip/_vendor/pyproject_hooks/_in_process/__init__.py,sha256=9gQATptbFkelkIy0OfWFEACzqxXJMQDWCH9rBOAZVwQ,546 -pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc,, -pip/_vendor/pyproject_hooks/_in_process/_in_process.py,sha256=m2b34c917IW5o-Q_6TYIHlsK9lSUlNiyrITTUH_zwew,10927 -pip/_vendor/requests/__init__.py,sha256=owujob4dk45Siy4EYtbCKR6wcFph7E04a_v_OuAacBA,5169 -pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/api.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/auth.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/certs.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/compat.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/help.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/models.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/packages.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/structures.cpython-311.pyc,, -pip/_vendor/requests/__pycache__/utils.cpython-311.pyc,, -pip/_vendor/requests/__version__.py,sha256=ssI3Ezt7PaxgkOW45GhtwPUclo_SO_ygtIm4A74IOfw,435 -pip/_vendor/requests/_internal_utils.py,sha256=nMQymr4hs32TqVo5AbCrmcJEhvPUh7xXlluyqwslLiQ,1495 -pip/_vendor/requests/adapters.py,sha256=idj6cZcId3L5xNNeJ7ieOLtw3awJk5A64xUfetHwq3M,19697 -pip/_vendor/requests/api.py,sha256=q61xcXq4tmiImrvcSVLTbFyCiD2F-L_-hWKGbz4y8vg,6449 -pip/_vendor/requests/auth.py,sha256=h-HLlVx9j8rKV5hfSAycP2ApOSglTz77R0tz7qCbbEE,10187 -pip/_vendor/requests/certs.py,sha256=PVPooB0jP5hkZEULSCwC074532UFbR2Ptgu0I5zwmCs,575 -pip/_vendor/requests/compat.py,sha256=IhK9quyX0RRuWTNcg6d2JGSAOUbM6mym2p_2XjLTwf4,1286 -pip/_vendor/requests/cookies.py,sha256=kD3kNEcCj-mxbtf5fJsSaT86eGoEYpD3X0CSgpzl7BM,18560 -pip/_vendor/requests/exceptions.py,sha256=FA-_kVwBZ2jhXauRctN_ewHVK25b-fj0Azyz1THQ0Kk,3823 -pip/_vendor/requests/help.py,sha256=FnAAklv8MGm_qb2UilDQgS6l0cUttiCFKUjx0zn2XNA,3879 -pip/_vendor/requests/hooks.py,sha256=CiuysiHA39V5UfcCBXFIx83IrDpuwfN9RcTUgv28ftQ,733 -pip/_vendor/requests/models.py,sha256=dDZ-iThotky-Noq9yy97cUEJhr3wnY6mv-xR_ePg_lk,35288 -pip/_vendor/requests/packages.py,sha256=njJmVifY4aSctuW3PP5EFRCxjEwMRDO6J_feG2dKWsI,695 -pip/_vendor/requests/sessions.py,sha256=-LvTzrPtetSTrR3buxu4XhdgMrJFLB1q5D7P--L2Xhw,30373 -pip/_vendor/requests/status_codes.py,sha256=FvHmT5uH-_uimtRz5hH9VCbt7VV-Nei2J9upbej6j8g,4235 -pip/_vendor/requests/structures.py,sha256=-IbmhVz06S-5aPSZuUthZ6-6D9XOjRuTXHOabY041XM,2912 -pip/_vendor/requests/utils.py,sha256=kOPn0qYD6xRTzaxbqTdYiSInBZHl6379AJsyIgzYGLY,33460 -pip/_vendor/resolvelib/__init__.py,sha256=h509TdEcpb5-44JonaU3ex2TM15GVBLjM9CNCPwnTTs,537 -pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc,, -pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc,, -pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc,, -pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc,, -pip/_vendor/resolvelib/compat/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc,, -pip/_vendor/resolvelib/compat/collections_abc.py,sha256=uy8xUZ-NDEw916tugUXm8HgwCGiMO0f-RcdnpkfXfOs,156 -pip/_vendor/resolvelib/providers.py,sha256=fuuvVrCetu5gsxPB43ERyjfO8aReS3rFQHpDgiItbs4,5871 -pip/_vendor/resolvelib/reporters.py,sha256=TSbRmWzTc26w0ggsV1bxVpeWDB8QNIre6twYl7GIZBE,1601 -pip/_vendor/resolvelib/resolvers.py,sha256=G8rsLZSq64g5VmIq-lB7UcIJ1gjAxIQJmTF4REZleQ0,20511 -pip/_vendor/resolvelib/structs.py,sha256=0_1_XO8z_CLhegP3Vpf9VJ3zJcfLm0NOHRM-i0Ykz3o,4963 -pip/_vendor/rich/__init__.py,sha256=dRxjIL-SbFVY0q3IjSMrfgBTHrm1LZDgLOygVBwiYZc,6090 -pip/_vendor/rich/__main__.py,sha256=TT8sb9PTnsnKhhrGuHkLN0jdN0dtKhtPkEr9CidDbPM,8478 -pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/abc.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/align.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/bar.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/box.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/cells.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/color.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/columns.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/console.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/containers.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/control.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/errors.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/json.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/layout.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/live.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/logging.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/markup.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/measure.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/padding.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/pager.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/palette.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/panel.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/progress.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/region.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/repr.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/rule.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/scope.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/screen.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/segment.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/status.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/style.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/styled.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/table.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/text.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/theme.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/themes.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc,, -pip/_vendor/rich/__pycache__/tree.cpython-311.pyc,, -pip/_vendor/rich/_cell_widths.py,sha256=2n4EiJi3X9sqIq0O16kUZ_zy6UYMd3xFfChlKfnW1Hc,10096 -pip/_vendor/rich/_emoji_codes.py,sha256=hu1VL9nbVdppJrVoijVshRlcRRe_v3dju3Mmd2sKZdY,140235 -pip/_vendor/rich/_emoji_replace.py,sha256=n-kcetsEUx2ZUmhQrfeMNc-teeGhpuSQ5F8VPBsyvDo,1064 -pip/_vendor/rich/_export_format.py,sha256=qxgV3nKnXQu1hfbnRVswPYy-AwIg1X0LSC47cK5s8jk,2100 -pip/_vendor/rich/_extension.py,sha256=Xt47QacCKwYruzjDi-gOBq724JReDj9Cm9xUi5fr-34,265 -pip/_vendor/rich/_fileno.py,sha256=HWZxP5C2ajMbHryvAQZseflVfQoGzsKOHzKGsLD8ynQ,799 -pip/_vendor/rich/_inspect.py,sha256=oZJGw31e64dwXSCmrDnvZbwVb1ZKhWfU8wI3VWohjJk,9695 -pip/_vendor/rich/_log_render.py,sha256=1ByI0PA1ZpxZY3CGJOK54hjlq4X-Bz_boIjIqCd8Kns,3225 -pip/_vendor/rich/_loop.py,sha256=hV_6CLdoPm0va22Wpw4zKqM0RYsz3TZxXj0PoS-9eDQ,1236 -pip/_vendor/rich/_null_file.py,sha256=tGSXk_v-IZmbj1GAzHit8A3kYIQMiCpVsCFfsC-_KJ4,1387 -pip/_vendor/rich/_palettes.py,sha256=cdev1JQKZ0JvlguV9ipHgznTdnvlIzUFDBb0It2PzjI,7063 -pip/_vendor/rich/_pick.py,sha256=evDt8QN4lF5CiwrUIXlOJCntitBCOsI3ZLPEIAVRLJU,423 -pip/_vendor/rich/_ratio.py,sha256=2lLSliL025Y-YMfdfGbutkQDevhcyDqc-DtUYW9mU70,5472 -pip/_vendor/rich/_spinners.py,sha256=U2r1_g_1zSjsjiUdAESc2iAMc3i4ri_S8PYP6kQ5z1I,19919 -pip/_vendor/rich/_stack.py,sha256=-C8OK7rxn3sIUdVwxZBBpeHhIzX0eI-VM3MemYfaXm0,351 -pip/_vendor/rich/_timer.py,sha256=zelxbT6oPFZnNrwWPpc1ktUeAT-Vc4fuFcRZLQGLtMI,417 -pip/_vendor/rich/_win32_console.py,sha256=P0vxI2fcndym1UU1S37XAzQzQnkyY7YqAKmxm24_gug,22820 -pip/_vendor/rich/_windows.py,sha256=dvNl9TmfPzNVxiKk5WDFihErZ5796g2UC9-KGGyfXmk,1926 -pip/_vendor/rich/_windows_renderer.py,sha256=t74ZL3xuDCP3nmTp9pH1L5LiI2cakJuQRQleHCJerlk,2783 -pip/_vendor/rich/_wrap.py,sha256=xfV_9t0Sg6rzimmrDru8fCVmUlalYAcHLDfrJZnbbwQ,1840 -pip/_vendor/rich/abc.py,sha256=ON-E-ZqSSheZ88VrKX2M3PXpFbGEUUZPMa_Af0l-4f0,890 -pip/_vendor/rich/align.py,sha256=Ji-Yokfkhnfe_xMmr4ISjZB07TJXggBCOYoYa-HDAr8,10368 -pip/_vendor/rich/ansi.py,sha256=iD6532QYqnBm6hADulKjrV8l8kFJ-9fEVooHJHH3hMg,6906 -pip/_vendor/rich/bar.py,sha256=a7UD303BccRCrEhGjfMElpv5RFYIinaAhAuqYqhUvmw,3264 -pip/_vendor/rich/box.py,sha256=FJ6nI3jD7h2XNFU138bJUt2HYmWOlRbltoCEuIAZhew,9842 -pip/_vendor/rich/cells.py,sha256=627ztJs9zOL-38HJ7kXBerR-gT8KBfYC8UzEwMJDYYo,4509 -pip/_vendor/rich/color.py,sha256=9Gh958U3f75WVdLTeC0U9nkGTn2n0wnojKpJ6jQEkIE,18224 -pip/_vendor/rich/color_triplet.py,sha256=3lhQkdJbvWPoLDO-AnYImAWmJvV5dlgYNCVZ97ORaN4,1054 -pip/_vendor/rich/columns.py,sha256=HUX0KcMm9dsKNi11fTbiM_h2iDtl8ySCaVcxlalEzq8,7131 -pip/_vendor/rich/console.py,sha256=pDvkbLkvtZIMIwQx_jkZ-seyNl4zGBLviXoWXte9fwg,99218 -pip/_vendor/rich/constrain.py,sha256=1VIPuC8AgtKWrcncQrjBdYqA3JVWysu6jZo1rrh7c7Q,1288 -pip/_vendor/rich/containers.py,sha256=aKgm5UDHn5Nmui6IJaKdsZhbHClh_X7D-_Wg8Ehrr7s,5497 -pip/_vendor/rich/control.py,sha256=DSkHTUQLorfSERAKE_oTAEUFefZnZp4bQb4q8rHbKws,6630 -pip/_vendor/rich/default_styles.py,sha256=-Fe318kMVI_IwciK5POpThcO0-9DYJ67TZAN6DlmlmM,8082 -pip/_vendor/rich/diagnose.py,sha256=an6uouwhKPAlvQhYpNNpGq9EJysfMIOvvCbO3oSoR24,972 -pip/_vendor/rich/emoji.py,sha256=omTF9asaAnsM4yLY94eR_9dgRRSm1lHUszX20D1yYCQ,2501 -pip/_vendor/rich/errors.py,sha256=5pP3Kc5d4QJ_c0KFsxrfyhjiPVe7J1zOqSFbFAzcV-Y,642 -pip/_vendor/rich/file_proxy.py,sha256=Tl9THMDZ-Pk5Wm8sI1gGg_U5DhusmxD-FZ0fUbcU0W0,1683 -pip/_vendor/rich/filesize.py,sha256=9fTLAPCAwHmBXdRv7KZU194jSgNrRb6Wx7RIoBgqeKY,2508 -pip/_vendor/rich/highlighter.py,sha256=p3C1g4QYzezFKdR7NF9EhPbzQDvdPUhGRgSyGGEmPko,9584 -pip/_vendor/rich/json.py,sha256=EYp9ucj-nDjYDkHCV6Mk1ve8nUOpuFLaW76X50Mis2M,5032 -pip/_vendor/rich/jupyter.py,sha256=QyoKoE_8IdCbrtiSHp9TsTSNyTHY0FO5whE7jOTd9UE,3252 -pip/_vendor/rich/layout.py,sha256=RFYL6HdCFsHf9WRpcvi3w-fpj-8O5dMZ8W96VdKNdbI,14007 -pip/_vendor/rich/live.py,sha256=vZzYvu7fqwlv3Gthl2xiw1Dc_O80VlGcCV0DOHwCyDM,14273 -pip/_vendor/rich/live_render.py,sha256=zElm3PrfSIvjOce28zETHMIUf9pFYSUA5o0AflgUP64,3667 -pip/_vendor/rich/logging.py,sha256=uB-cB-3Q4bmXDLLpbOWkmFviw-Fde39zyMV6tKJ2WHQ,11903 -pip/_vendor/rich/markup.py,sha256=xzF4uAafiEeEYDJYt_vUnJOGoTU8RrH-PH7WcWYXjCg,8198 -pip/_vendor/rich/measure.py,sha256=HmrIJX8sWRTHbgh8MxEay_83VkqNW_70s8aKP5ZcYI8,5305 -pip/_vendor/rich/padding.py,sha256=kTFGsdGe0os7tXLnHKpwTI90CXEvrceeZGCshmJy5zw,4970 -pip/_vendor/rich/pager.py,sha256=SO_ETBFKbg3n_AgOzXm41Sv36YxXAyI3_R-KOY2_uSc,828 -pip/_vendor/rich/palette.py,sha256=lInvR1ODDT2f3UZMfL1grq7dY_pDdKHw4bdUgOGaM4Y,3396 -pip/_vendor/rich/panel.py,sha256=wGMe40J8KCGgQoM0LyjRErmGIkv2bsYA71RCXThD0xE,10574 -pip/_vendor/rich/pretty.py,sha256=eLEYN9xVaMNuA6EJVYm4li7HdOHxCqmVKvnOqJpyFt0,35852 -pip/_vendor/rich/progress.py,sha256=n4KF9vky8_5iYeXcyZPEvzyLplWlDvFLkM5JI0Bs08A,59706 -pip/_vendor/rich/progress_bar.py,sha256=cEoBfkc3lLwqba4XKsUpy4vSQKDh2QQ5J2J94-ACFoo,8165 -pip/_vendor/rich/prompt.py,sha256=x0mW-pIPodJM4ry6grgmmLrl8VZp99kqcmdnBe70YYA,11303 -pip/_vendor/rich/protocol.py,sha256=5hHHDDNHckdk8iWH5zEbi-zuIVSF5hbU2jIo47R7lTE,1391 -pip/_vendor/rich/region.py,sha256=rNT9xZrVZTYIXZC0NYn41CJQwYNbR-KecPOxTgQvB8Y,166 -pip/_vendor/rich/repr.py,sha256=9Z8otOmM-tyxnyTodvXlectP60lwahjGiDTrbrxPSTg,4431 -pip/_vendor/rich/rule.py,sha256=0fNaS_aERa3UMRc3T5WMpN_sumtDxfaor2y3of1ftBk,4602 -pip/_vendor/rich/scope.py,sha256=TMUU8qo17thyqQCPqjDLYpg_UU1k5qVd-WwiJvnJVas,2843 -pip/_vendor/rich/screen.py,sha256=YoeReESUhx74grqb0mSSb9lghhysWmFHYhsbMVQjXO8,1591 -pip/_vendor/rich/segment.py,sha256=XLnJEFvcV3bjaVzMNUJiem3n8lvvI9TJ5PTu-IG2uTg,24247 -pip/_vendor/rich/spinner.py,sha256=15koCmF0DQeD8-k28Lpt6X_zJQUlzEhgo_6A6uy47lc,4339 -pip/_vendor/rich/status.py,sha256=gJsIXIZeSo3urOyxRUjs6VrhX5CZrA0NxIQ-dxhCnwo,4425 -pip/_vendor/rich/style.py,sha256=3hiocH_4N8vwRm3-8yFWzM7tSwjjEven69XqWasSQwM,27073 -pip/_vendor/rich/styled.py,sha256=eZNnzGrI4ki_54pgY3Oj0T-x3lxdXTYh4_ryDB24wBU,1258 -pip/_vendor/rich/syntax.py,sha256=jgDiVCK6cpR0NmBOpZmIu-Ud4eaW7fHvjJZkDbjpcSA,35173 -pip/_vendor/rich/table.py,sha256=-WzesL-VJKsaiDU3uyczpJMHy6VCaSewBYJwx8RudI8,39684 -pip/_vendor/rich/terminal_theme.py,sha256=1j5-ufJfnvlAo5Qsi_ACZiXDmwMXzqgmFByObT9-yJY,3370 -pip/_vendor/rich/text.py,sha256=_8JBlSau0c2z8ENOZMi1hJ7M1ZGY408E4-hXjHyyg1A,45525 -pip/_vendor/rich/theme.py,sha256=belFJogzA0W0HysQabKaHOc3RWH2ko3fQAJhoN-AFdo,3777 -pip/_vendor/rich/themes.py,sha256=0xgTLozfabebYtcJtDdC5QkX5IVUEaviqDUJJh4YVFk,102 -pip/_vendor/rich/traceback.py,sha256=yCLVrCtyoFNENd9mkm2xeG3KmqkTwH9xpFOO7p2Bq0A,29604 -pip/_vendor/rich/tree.py,sha256=BMbUYNjS9uodNPfvtY_odmU09GA5QzcMbQ5cJZhllQI,9169 -pip/_vendor/six.py,sha256=TOOfQi7nFGfMrIvtdr6wX4wyHH8M7aknmuLfo2cBBrM,34549 -pip/_vendor/tenacity/__init__.py,sha256=3kvAL6KClq8GFo2KFhmOzskRKSDQI-ubrlfZ8AQEEI0,20493 -pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc,, -pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc,, -pip/_vendor/tenacity/_asyncio.py,sha256=Qi6wgQsGa9MQibYRy3OXqcDQswIZZ00dLOoSUGN-6o8,3551 -pip/_vendor/tenacity/_utils.py,sha256=ubs6a7sxj3JDNRKWCyCU2j5r1CB7rgyONgZzYZq6D_4,2179 -pip/_vendor/tenacity/after.py,sha256=S5NCISScPeIrKwIeXRwdJl3kV9Q4nqZfnNPDx6Hf__g,1682 -pip/_vendor/tenacity/before.py,sha256=dIZE9gmBTffisfwNkK0F1xFwGPV41u5GK70UY4Pi5Kc,1562 -pip/_vendor/tenacity/before_sleep.py,sha256=YmpgN9Y7HGlH97U24vvq_YWb5deaK4_DbiD8ZuFmy-E,2372 -pip/_vendor/tenacity/nap.py,sha256=fRWvnz1aIzbIq9Ap3gAkAZgDH6oo5zxMrU6ZOVByq0I,1383 -pip/_vendor/tenacity/retry.py,sha256=jrzD_mxA5mSTUEdiYB7SHpxltjhPSYZSnSRATb-ggRc,8746 -pip/_vendor/tenacity/stop.py,sha256=YMJs7ZgZfND65PRLqlGB_agpfGXlemx_5Hm4PKnBqpQ,3086 -pip/_vendor/tenacity/tornadoweb.py,sha256=po29_F1Mt8qZpsFjX7EVwAT0ydC_NbVia9gVi7R_wXA,2142 -pip/_vendor/tenacity/wait.py,sha256=3FcBJoCDgym12_dN6xfK8C1gROY0Hn4NSI2u8xv50uE,8024 -pip/_vendor/tomli/__init__.py,sha256=JhUwV66DB1g4Hvt1UQCVMdfCu-IgAV8FXmvDU9onxd4,396 -pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc,, -pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc,, -pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc,, -pip/_vendor/tomli/_parser.py,sha256=g9-ENaALS-B8dokYpCuzUFalWlog7T-SIYMjLZSWrtM,22633 -pip/_vendor/tomli/_re.py,sha256=dbjg5ChZT23Ka9z9DHOXfdtSpPwUfdgMXnj8NOoly-w,2943 -pip/_vendor/tomli/_types.py,sha256=-GTG2VUqkpxwMqzmVO4F7ybKddIbAnuAHXfmWQcTi3Q,254 -pip/_vendor/typing_extensions.py,sha256=EWpcpyQnVmc48E9fSyPGs-vXgHcAk9tQABQIxmMsCGk,111130 -pip/_vendor/urllib3/__init__.py,sha256=iXLcYiJySn0GNbWOOZDDApgBL1JgP44EZ8i1760S8Mc,3333 -pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc,, -pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc,, -pip/_vendor/urllib3/_collections.py,sha256=Rp1mVyBgc_UlAcp6M3at1skJBXR5J43NawRTvW2g_XY,10811 -pip/_vendor/urllib3/_version.py,sha256=6zoYnDykPLfe92fHqXalH8SxhWVl31yYLCP0lDri_SA,64 -pip/_vendor/urllib3/connection.py,sha256=92k9td_y4PEiTIjNufCUa1NzMB3J3w0LEdyokYgXnW8,20300 -pip/_vendor/urllib3/connectionpool.py,sha256=ItVDasDnPRPP9R8bNxY7tPBlC724nJ9nlxVgXG_SLbI,39990 -pip/_vendor/urllib3/contrib/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/_appengine_environ.py,sha256=bDbyOEhW2CKLJcQqAKAyrEHN-aklsyHFKq6vF8ZFsmk,957 -pip/_vendor/urllib3/contrib/_securetransport/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc,, -pip/_vendor/urllib3/contrib/_securetransport/bindings.py,sha256=4Xk64qIkPBt09A5q-RIFUuDhNc9mXilVapm7WnYnzRw,17632 -pip/_vendor/urllib3/contrib/_securetransport/low_level.py,sha256=B2JBB2_NRP02xK6DCa1Pa9IuxrPwxzDzZbixQkb7U9M,13922 -pip/_vendor/urllib3/contrib/appengine.py,sha256=VR68eAVE137lxTgjBDwCna5UiBZTOKa01Aj_-5BaCz4,11036 -pip/_vendor/urllib3/contrib/ntlmpool.py,sha256=NlfkW7WMdW8ziqudopjHoW299og1BTWi0IeIibquFwk,4528 -pip/_vendor/urllib3/contrib/pyopenssl.py,sha256=hDJh4MhyY_p-oKlFcYcQaVQRDv6GMmBGuW9yjxyeejM,17081 -pip/_vendor/urllib3/contrib/securetransport.py,sha256=yhZdmVjY6PI6EeFbp7qYOp6-vp1Rkv2NMuOGaEj7pmc,34448 -pip/_vendor/urllib3/contrib/socks.py,sha256=aRi9eWXo9ZEb95XUxef4Z21CFlnnjbEiAo9HOseoMt4,7097 -pip/_vendor/urllib3/exceptions.py,sha256=0Mnno3KHTNfXRfY7638NufOPkUb6mXOm-Lqj-4x2w8A,8217 -pip/_vendor/urllib3/fields.py,sha256=kvLDCg_JmH1lLjUUEY_FLS8UhY7hBvDPuVETbY8mdrM,8579 -pip/_vendor/urllib3/filepost.py,sha256=5b_qqgRHVlL7uLtdAYBzBh-GHmU5AfJVt_2N0XS3PeY,2440 -pip/_vendor/urllib3/packages/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc,, -pip/_vendor/urllib3/packages/backports/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc,, -pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-311.pyc,, -pip/_vendor/urllib3/packages/backports/makefile.py,sha256=nbzt3i0agPVP07jqqgjhaYjMmuAi_W5E0EywZivVO8E,1417 -pip/_vendor/urllib3/packages/backports/weakref_finalize.py,sha256=tRCal5OAhNSRyb0DhHp-38AtIlCsRP8BxF3NX-6rqIA,5343 -pip/_vendor/urllib3/packages/six.py,sha256=b9LM0wBXv7E7SrbCjAm4wwN-hrH-iNxv18LgWNMMKPo,34665 -pip/_vendor/urllib3/poolmanager.py,sha256=0i8cJgrqupza67IBPZ_u9jXvnSxr5UBlVEiUqdkPtYI,19752 -pip/_vendor/urllib3/request.py,sha256=ZFSIqX0C6WizixecChZ3_okyu7BEv0lZu1VT0s6h4SM,5985 -pip/_vendor/urllib3/response.py,sha256=fmDJAFkG71uFTn-sVSTh2Iw0WmcXQYqkbRjihvwBjU8,30641 -pip/_vendor/urllib3/util/__init__.py,sha256=JEmSmmqqLyaw8P51gUImZh8Gwg9i1zSe-DoqAitn2nc,1155 -pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc,, -pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc,, -pip/_vendor/urllib3/util/connection.py,sha256=5Lx2B1PW29KxBn2T0xkN1CBgRBa3gGVJBKoQoRogEVk,4901 -pip/_vendor/urllib3/util/proxy.py,sha256=zUvPPCJrp6dOF0N4GAVbOcl6o-4uXKSrGiTkkr5vUS4,1605 -pip/_vendor/urllib3/util/queue.py,sha256=nRgX8_eX-_VkvxoX096QWoz8Ps0QHUAExILCY_7PncM,498 -pip/_vendor/urllib3/util/request.py,sha256=C0OUt2tcU6LRiQJ7YYNP9GvPrSvl7ziIBekQ-5nlBZk,3997 -pip/_vendor/urllib3/util/response.py,sha256=GJpg3Egi9qaJXRwBh5wv-MNuRWan5BIu40oReoxWP28,3510 -pip/_vendor/urllib3/util/retry.py,sha256=4laWh0HpwGijLiBmdBIYtbhYekQnNzzhx2W9uys0RHA,22003 -pip/_vendor/urllib3/util/ssl_.py,sha256=X4-AqW91aYPhPx6-xbf66yHFQKbqqfC_5Zt4WkLX1Hc,17177 -pip/_vendor/urllib3/util/ssl_match_hostname.py,sha256=Ir4cZVEjmAk8gUAIHWSi7wtOO83UCYABY2xFD1Ql_WA,5758 -pip/_vendor/urllib3/util/ssltransport.py,sha256=NA-u5rMTrDFDFC8QzRKUEKMG0561hOD4qBTr3Z4pv6E,6895 -pip/_vendor/urllib3/util/timeout.py,sha256=cwq4dMk87mJHSBktK1miYJ-85G-3T3RmT20v7SFCpno,10168 -pip/_vendor/urllib3/util/url.py,sha256=lCAE7M5myA8EDdW0sJuyyZhVB9K_j38ljWhHAnFaWoE,14296 -pip/_vendor/urllib3/util/wait.py,sha256=fOX0_faozG2P7iVojQoE1mbydweNyTcm-hXEfFrTtLI,5403 -pip/_vendor/vendor.txt,sha256=EyWEHCgXKFKiE8Mku6LONUDLF6UwDwjX1NP2ccKLrLo,475 -pip/_vendor/webencodings/__init__.py,sha256=qOBJIuPy_4ByYH6W_bNgJF-qYQ2DoU-dKsDu5yRWCXg,10579 -pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc,, -pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc,, -pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc,, -pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc,, -pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc,, -pip/_vendor/webencodings/labels.py,sha256=4AO_KxTddqGtrL9ns7kAPjb0CcN6xsCIxbK37HY9r3E,8979 -pip/_vendor/webencodings/mklabels.py,sha256=GYIeywnpaLnP0GSic8LFWgd0UVvO_l1Nc6YoF-87R_4,1305 -pip/_vendor/webencodings/tests.py,sha256=OtGLyjhNY1fvkW1GvLJ_FV9ZoqC9Anyjr7q3kxTbzNs,6563 -pip/_vendor/webencodings/x_user_defined.py,sha256=yOqWSdmpytGfUgh_Z6JYgDNhoc-BAHyyeeT15Fr42tM,4307 -pip/py.typed,sha256=EBVvvPRTn_eIpz5e5QztSCdrMX7Qwd7VP93RSoIlZ2I,286 diff --git a/.venv/Lib/site-packages/pip-23.2.1.dist-info/REQUESTED b/.venv/Lib/site-packages/pip-23.2.1.dist-info/REQUESTED deleted file mode 100644 index e69de29..0000000 diff --git a/.venv/Lib/site-packages/pip-23.2.1.dist-info/WHEEL b/.venv/Lib/site-packages/pip-23.2.1.dist-info/WHEEL deleted file mode 100644 index 1f37c02..0000000 --- a/.venv/Lib/site-packages/pip-23.2.1.dist-info/WHEEL +++ /dev/null @@ -1,5 +0,0 @@ -Wheel-Version: 1.0 -Generator: bdist_wheel (0.40.0) -Root-Is-Purelib: true -Tag: py3-none-any - diff --git a/.venv/Lib/site-packages/pip-23.2.1.dist-info/entry_points.txt b/.venv/Lib/site-packages/pip-23.2.1.dist-info/entry_points.txt deleted file mode 100644 index bcf704d..0000000 --- a/.venv/Lib/site-packages/pip-23.2.1.dist-info/entry_points.txt +++ /dev/null @@ -1,4 +0,0 @@ -[console_scripts] -pip = pip._internal.cli.main:main -pip3 = pip._internal.cli.main:main -pip3.11 = pip._internal.cli.main:main diff --git a/.venv/Lib/site-packages/pip-23.2.1.dist-info/top_level.txt b/.venv/Lib/site-packages/pip-23.2.1.dist-info/top_level.txt deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/pip-23.2.1.dist-info/top_level.txt +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/pip/__init__.py b/.venv/Lib/site-packages/pip/__init__.py index 6633ef7..be0e3ed 100644 --- a/.venv/Lib/site-packages/pip/__init__.py +++ b/.venv/Lib/site-packages/pip/__init__.py @@ -1,6 +1,6 @@ from typing import List, Optional -__version__ = "23.2.1" +__version__ = "24.0" def main(args: Optional[List[str]] = None) -> int: diff --git a/.venv/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc index 0df05cd..301b840 100644 Binary files a/.venv/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/pip/__pycache__/__main__.cpython-311.pyc index e3c8644..11dbb4a 100644 Binary files a/.venv/Lib/site-packages/pip/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc b/.venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc index 88ffc99..6512666 100644 Binary files a/.venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/__pycache__/__pip-runner__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__init__.py b/.venv/Lib/site-packages/pip/_internal/__init__.py index 6afb5c6..96c6b88 100644 --- a/.venv/Lib/site-packages/pip/_internal/__init__.py +++ b/.venv/Lib/site-packages/pip/_internal/__init__.py @@ -1,6 +1,5 @@ from typing import List, Optional -import pip._internal.utils.inject_securetransport # noqa from pip._internal.utils import _log # init_logging() must be called before any call to logging.getLogger() diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc index ae35013..c94b1e8 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc index da645e1..5e63275 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc index 6d8e0db..795ac25 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc index 303fec9..c0c4293 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc index 410edca..fe9835c 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc index 7823977..eabc955 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/main.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc index 64af767..8cdedcc 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc index d5dd1ef..28c0ada 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc index 317cc62..c89aa1d 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cache.py b/.venv/Lib/site-packages/pip/_internal/cache.py index 8d3a664..f45ac23 100644 --- a/.venv/Lib/site-packages/pip/_internal/cache.py +++ b/.venv/Lib/site-packages/pip/_internal/cache.py @@ -78,12 +78,10 @@ def _get_candidates(self, link: Link, canonical_package_name: str) -> List[Any]: if can_not_cache: return [] - candidates = [] path = self.get_path_for_link(link) if os.path.isdir(path): - for candidate in os.listdir(path): - candidates.append((candidate, path)) - return candidates + return [(candidate, path) for candidate in os.listdir(path)] + return [] def get_path_for_link(self, link: Link) -> str: """Return a directory to store cached items in for link.""" diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc index 4fdb673..14fbc1a 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc index 7f958e9..353319d 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc index 8fc06cf..02c1753 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc index 93dc4a2..f2327bb 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc index c1e45d5..2e12beb 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc index 6d26427..f105dc1 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc index f6899d3..5280e23 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc index fa39cc3..86ab316 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc index bba49ad..5d65fc3 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc index 5a288d0..5b9e3bc 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc index 0a9e77a..89f0d07 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc index d975f07..0c3eed4 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/cli/autocompletion.py b/.venv/Lib/site-packages/pip/_internal/cli/autocompletion.py index 226fe84..e5950b9 100644 --- a/.venv/Lib/site-packages/pip/_internal/cli/autocompletion.py +++ b/.venv/Lib/site-packages/pip/_internal/cli/autocompletion.py @@ -71,8 +71,9 @@ def autocomplete() -> None: for opt in subcommand.parser.option_list_all: if opt.help != optparse.SUPPRESS_HELP: - for opt_str in opt._long_opts + opt._short_opts: - options.append((opt_str, opt.nargs)) + options += [ + (opt_str, opt.nargs) for opt_str in opt._long_opts + opt._short_opts + ] # filter out previously specified options from available options prev_opts = [x.split("=")[0] for x in cwords[1 : cword - 1]] diff --git a/.venv/Lib/site-packages/pip/_internal/cli/base_command.py b/.venv/Lib/site-packages/pip/_internal/cli/base_command.py index 6a3b8e6..db9d5cc 100644 --- a/.venv/Lib/site-packages/pip/_internal/cli/base_command.py +++ b/.venv/Lib/site-packages/pip/_internal/cli/base_command.py @@ -181,7 +181,7 @@ def exc_logging_wrapper(*args: Any) -> int: assert isinstance(status, int) return status except DiagnosticPipError as exc: - logger.error("[present-rich] %s", exc) + logger.error("%s", exc, extra={"rich": True}) logger.debug("Exception information:", exc_info=True) return ERROR diff --git a/.venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py b/.venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py index 02ba608..d05e502 100644 --- a/.venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py +++ b/.venv/Lib/site-packages/pip/_internal/cli/cmdoptions.py @@ -92,10 +92,10 @@ def check_dist_restriction(options: Values, check_target: bool = False) -> None: ) if check_target: - if dist_restriction_set and not options.target_dir: + if not options.dry_run and dist_restriction_set and not options.target_dir: raise CommandError( "Can not use any platform or abi specific options unless " - "installing via '--target'" + "installing via '--target' or using '--dry-run'" ) @@ -582,10 +582,7 @@ def _handle_python_version( """ version_info, error_msg = _convert_python_version(value) if error_msg is not None: - msg = "invalid --python-version value: {!r}: {}".format( - value, - error_msg, - ) + msg = f"invalid --python-version value: {value!r}: {error_msg}" raise_option_error(parser, option=option, msg=msg) parser.values.python_version = version_info @@ -670,7 +667,10 @@ def prefer_binary() -> Option: dest="prefer_binary", action="store_true", default=False, - help="Prefer older binary packages over newer source packages.", + help=( + "Prefer binary packages over source packages, even if the " + "source packages are newer." + ), ) @@ -823,7 +823,7 @@ def _handle_config_settings( ) -> None: key, sep, val = value.partition("=") if sep != "=": - parser.error(f"Arguments to {opt_str} must be of the form KEY=VAL") # noqa + parser.error(f"Arguments to {opt_str} must be of the form KEY=VAL") dest = getattr(parser.values, option.dest) if dest is None: dest = {} @@ -918,13 +918,13 @@ def _handle_merge_hash( algo, digest = value.split(":", 1) except ValueError: parser.error( - "Arguments to {} must be a hash name " # noqa + f"Arguments to {opt_str} must be a hash name " "followed by a value, like --hash=sha256:" - "abcde...".format(opt_str) + "abcde..." ) if algo not in STRONG_HASHES: parser.error( - "Allowed hash algorithms for {} are {}.".format( # noqa + "Allowed hash algorithms for {} are {}.".format( opt_str, ", ".join(STRONG_HASHES) ) ) diff --git a/.venv/Lib/site-packages/pip/_internal/cli/parser.py b/.venv/Lib/site-packages/pip/_internal/cli/parser.py index c762cf2..ae554b2 100644 --- a/.venv/Lib/site-packages/pip/_internal/cli/parser.py +++ b/.venv/Lib/site-packages/pip/_internal/cli/parser.py @@ -229,9 +229,9 @@ def _update_defaults(self, defaults: Dict[str, Any]) -> Dict[str, Any]: val = strtobool(val) except ValueError: self.error( - "{} is not a valid value for {} option, " # noqa + f"{val} is not a valid value for {key} option, " "please specify a boolean value like yes/no, " - "true/false or 1/0 instead.".format(val, key) + "true/false or 1/0 instead." ) elif option.action == "count": with suppress(ValueError): @@ -240,10 +240,10 @@ def _update_defaults(self, defaults: Dict[str, Any]) -> Dict[str, Any]: val = int(val) if not isinstance(val, int) or val < 0: self.error( - "{} is not a valid value for {} option, " # noqa + f"{val} is not a valid value for {key} option, " "please instead specify either a non-negative integer " "or a boolean value like yes/no or false/true " - "which is equivalent to 1/0.".format(val, key) + "which is equivalent to 1/0." ) elif option.action == "append": val = val.split() diff --git a/.venv/Lib/site-packages/pip/_internal/cli/req_command.py b/.venv/Lib/site-packages/pip/_internal/cli/req_command.py index 86070f1..6f2f79c 100644 --- a/.venv/Lib/site-packages/pip/_internal/cli/req_command.py +++ b/.venv/Lib/site-packages/pip/_internal/cli/req_command.py @@ -58,12 +58,9 @@ def _create_truststore_ssl_context() -> Optional["SSLContext"]: return None try: - import truststore - except ImportError: - raise CommandError( - "To use the truststore feature, 'truststore' must be installed into " - "pip's current environment." - ) + from pip._vendor import truststore + except ImportError as e: + raise CommandError(f"The truststore feature is unavailable: {e}") return truststore.SSLContext(ssl.PROTOCOL_TLS_CLIENT) @@ -123,7 +120,7 @@ def _build_session( ssl_context = None session = PipSession( - cache=os.path.join(cache_dir, "http") if cache_dir else None, + cache=os.path.join(cache_dir, "http-v2") if cache_dir else None, retries=retries if retries is not None else options.retries, trusted_hosts=options.trusted_hosts, index_urls=self._get_index_urls(options), @@ -268,7 +265,7 @@ def determine_resolver_variant(options: Values) -> str: if "legacy-resolver" in options.deprecated_features_enabled: return "legacy" - return "2020-resolver" + return "resolvelib" @classmethod def make_requirement_preparer( @@ -290,7 +287,7 @@ def make_requirement_preparer( legacy_resolver = False resolver_variant = cls.determine_resolver_variant(options) - if resolver_variant == "2020-resolver": + if resolver_variant == "resolvelib": lazy_wheel = "fast-deps" in options.features_enabled if lazy_wheel: logger.warning( @@ -352,7 +349,7 @@ def make_resolver( # The long import name and duplicated invocation is needed to convince # Mypy into correctly typechecking. Otherwise it would complain the # "Resolver" class being redefined. - if resolver_variant == "2020-resolver": + if resolver_variant == "resolvelib": import pip._internal.resolution.resolvelib.resolver return pip._internal.resolution.resolvelib.resolver.Resolver( diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc index 965acae..aca0d1b 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc index 54028fc..6f6e3bf 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc index 52c22e4..c2534d1 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc index 0635547..c31c4ae 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc index a9fecc7..e2d414f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc index bf8c1db..ee9ef44 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc index d72e662..44101e1 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc index c899368..4762750 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc index 40d2d9d..c6a9ff6 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc index 6af38c7..bb2bb40 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc index 3d9f6ec..684d7a9 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc index 0b3553a..50998dd 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/inspect.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc index eea6196..39707ef 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc index a1644b7..d030f9e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc index 4097b7f..82c9ab6 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc index 51ffb87..52763e2 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc index ba0f8d7..84a7d60 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc index 96b7d39..9b0d457 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/commands/cache.py b/.venv/Lib/site-packages/pip/_internal/commands/cache.py index e96d2b4..3283361 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/cache.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/cache.py @@ -3,10 +3,10 @@ from optparse import Values from typing import Any, List -import pip._internal.utils.filesystem as filesystem from pip._internal.cli.base_command import Command from pip._internal.cli.status_codes import ERROR, SUCCESS from pip._internal.exceptions import CommandError, PipError +from pip._internal.utils import filesystem from pip._internal.utils.logging import getLogger logger = getLogger(__name__) @@ -93,24 +93,30 @@ def get_cache_info(self, options: Values, args: List[Any]) -> None: num_http_files = len(self._find_http_files(options)) num_packages = len(self._find_wheels(options, "*")) - http_cache_location = self._cache_dir(options, "http") + http_cache_location = self._cache_dir(options, "http-v2") + old_http_cache_location = self._cache_dir(options, "http") wheels_cache_location = self._cache_dir(options, "wheels") - http_cache_size = filesystem.format_directory_size(http_cache_location) + http_cache_size = filesystem.format_size( + filesystem.directory_size(http_cache_location) + + filesystem.directory_size(old_http_cache_location) + ) wheels_cache_size = filesystem.format_directory_size(wheels_cache_location) message = ( textwrap.dedent( """ - Package index page cache location: {http_cache_location} + Package index page cache location (pip v23.3+): {http_cache_location} + Package index page cache location (older pips): {old_http_cache_location} Package index page cache size: {http_cache_size} Number of HTTP files: {num_http_files} Locally built wheels location: {wheels_cache_location} Locally built wheels size: {wheels_cache_size} Number of locally built wheels: {package_count} - """ + """ # noqa: E501 ) .format( http_cache_location=http_cache_location, + old_http_cache_location=old_http_cache_location, http_cache_size=http_cache_size, num_http_files=num_http_files, wheels_cache_location=wheels_cache_location, @@ -151,14 +157,8 @@ def format_for_human(self, files: List[str]) -> None: logger.info("\n".join(sorted(results))) def format_for_abspath(self, files: List[str]) -> None: - if not files: - return - - results = [] - for filename in files: - results.append(filename) - - logger.info("\n".join(sorted(results))) + if files: + logger.info("\n".join(sorted(files))) def remove_cache_items(self, options: Values, args: List[Any]) -> None: if len(args) > 1: @@ -175,7 +175,7 @@ def remove_cache_items(self, options: Values, args: List[Any]) -> None: files += self._find_http_files(options) else: # Add the pattern to the log message - no_matching_msg += ' for pattern "{}"'.format(args[0]) + no_matching_msg += f' for pattern "{args[0]}"' if not files: logger.warning(no_matching_msg) @@ -195,8 +195,11 @@ def _cache_dir(self, options: Values, subdir: str) -> str: return os.path.join(options.cache_dir, subdir) def _find_http_files(self, options: Values) -> List[str]: - http_dir = self._cache_dir(options, "http") - return filesystem.find_files(http_dir, "*") + old_http_dir = self._cache_dir(options, "http") + new_http_dir = self._cache_dir(options, "http-v2") + return filesystem.find_files(old_http_dir, "*") + filesystem.find_files( + new_http_dir, "*" + ) def _find_wheels(self, options: Values, pattern: str) -> List[str]: wheel_dir = self._cache_dir(options, "wheels") diff --git a/.venv/Lib/site-packages/pip/_internal/commands/completion.py b/.venv/Lib/site-packages/pip/_internal/commands/completion.py index 30233fc..9e89e27 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/completion.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/completion.py @@ -23,9 +23,18 @@ """, "zsh": """ #compdef -P pip[0-9.]# - compadd $( COMP_WORDS="$words[*]" \\ - COMP_CWORD=$((CURRENT-1)) \\ - PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null ) + __pip() {{ + compadd $( COMP_WORDS="$words[*]" \\ + COMP_CWORD=$((CURRENT-1)) \\ + PIP_AUTO_COMPLETE=1 $words[1] 2>/dev/null ) + }} + if [[ $zsh_eval_context[-1] == loadautofunc ]]; then + # autoload from fpath, call function directly + __pip "$@" + else + # eval/source/. command, register function for later + compdef __pip -P 'pip[0-9.]#' + fi """, "fish": """ function __fish_complete_pip diff --git a/.venv/Lib/site-packages/pip/_internal/commands/configuration.py b/.venv/Lib/site-packages/pip/_internal/commands/configuration.py index 84b134e..1a1dc6b 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/configuration.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/configuration.py @@ -242,17 +242,15 @@ def open_in_editor(self, options: Values, args: List[str]) -> None: e.filename = editor raise except subprocess.CalledProcessError as e: - raise PipError( - "Editor Subprocess exited with exit code {}".format(e.returncode) - ) + raise PipError(f"Editor Subprocess exited with exit code {e.returncode}") def _get_n_args(self, args: List[str], example: str, n: int) -> Any: """Helper to make sure the command got the right number of arguments""" if len(args) != n: msg = ( - "Got unexpected number of arguments, expected {}. " - '(example: "{} config {}")' - ).format(n, get_prog(), example) + f"Got unexpected number of arguments, expected {n}. " + f'(example: "{get_prog()} config {example}")' + ) raise PipError(msg) if n == 1: diff --git a/.venv/Lib/site-packages/pip/_internal/commands/debug.py b/.venv/Lib/site-packages/pip/_internal/commands/debug.py index 2a3e7d2..7e5271c 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/debug.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/debug.py @@ -46,22 +46,29 @@ def create_vendor_txt_map() -> Dict[str, str]: return dict(line.split("==", 1) for line in lines) -def get_module_from_module_name(module_name: str) -> ModuleType: +def get_module_from_module_name(module_name: str) -> Optional[ModuleType]: # Module name can be uppercase in vendor.txt for some reason... module_name = module_name.lower().replace("-", "_") # PATCH: setuptools is actually only pkg_resources. if module_name == "setuptools": module_name = "pkg_resources" - __import__(f"pip._vendor.{module_name}", globals(), locals(), level=0) - return getattr(pip._vendor, module_name) + try: + __import__(f"pip._vendor.{module_name}", globals(), locals(), level=0) + return getattr(pip._vendor, module_name) + except ImportError: + # We allow 'truststore' to fail to import due + # to being unavailable on Python 3.9 and earlier. + if module_name == "truststore" and sys.version_info < (3, 10): + return None + raise def get_vendor_version_from_module(module_name: str) -> Optional[str]: module = get_module_from_module_name(module_name) version = getattr(module, "__version__", None) - if not version: + if module and not version: # Try to find version in debundled module info. assert module.__file__ is not None env = get_environment([os.path.dirname(module.__file__)]) @@ -88,7 +95,7 @@ def show_actual_vendor_versions(vendor_txt_versions: Dict[str, str]) -> None: elif parse_version(actual_version) != parse_version(expected_version): extra_message = ( " (CONFLICT: vendor.txt suggests version should" - " be {})".format(expected_version) + f" be {expected_version})" ) logger.info("%s==%s%s", module_name, actual_version, extra_message) @@ -105,7 +112,7 @@ def show_tags(options: Values) -> None: tag_limit = 10 target_python = make_target_python(options) - tags = target_python.get_tags() + tags = target_python.get_sorted_tags() # Display the target options that were explicitly provided. formatted_target = target_python.format_given() @@ -113,7 +120,7 @@ def show_tags(options: Values) -> None: if formatted_target: suffix = f" (target: {formatted_target})" - msg = "Compatible tags: {}{}".format(len(tags), suffix) + msg = f"Compatible tags: {len(tags)}{suffix}" logger.info(msg) if options.verbose < 1 and len(tags) > tag_limit: @@ -127,17 +134,12 @@ def show_tags(options: Values) -> None: logger.info(str(tag)) if tags_limited: - msg = ( - "...\n[First {tag_limit} tags shown. Pass --verbose to show all.]" - ).format(tag_limit=tag_limit) + msg = f"...\n[First {tag_limit} tags shown. Pass --verbose to show all.]" logger.info(msg) def ca_bundle_info(config: Configuration) -> str: - levels = set() - for key, _ in config.items(): - levels.add(key.split(".")[0]) - + levels = {key.split(".", 1)[0] for key, _ in config.items()} if not levels: return "Not specified" diff --git a/.venv/Lib/site-packages/pip/_internal/commands/index.py b/.venv/Lib/site-packages/pip/_internal/commands/index.py index 7267eff..f55e9e4 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/index.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/index.py @@ -128,12 +128,12 @@ def get_available_package_versions(self, options: Values, args: List[Any]) -> No if not versions: raise DistributionNotFound( - "No matching distribution found for {}".format(query) + f"No matching distribution found for {query}" ) formatted_versions = [str(ver) for ver in sorted(versions, reverse=True)] latest = formatted_versions[0] - write_output("{} ({})".format(query, latest)) + write_output(f"{query} ({latest})") write_output("Available versions: {}".format(", ".join(formatted_versions))) print_dist_installation_info(query, latest) diff --git a/.venv/Lib/site-packages/pip/_internal/commands/install.py b/.venv/Lib/site-packages/pip/_internal/commands/install.py index f6a3008..e944bb9 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/install.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/install.py @@ -501,7 +501,7 @@ def run(self, options: Values, args: List[str]) -> int: show_traceback, options.use_user_site, ) - logger.error(message, exc_info=show_traceback) # noqa + logger.error(message, exc_info=show_traceback) return ERROR @@ -595,7 +595,7 @@ def _warn_about_conflicts( "source of the following dependency conflicts." ) else: - assert resolver_variant == "2020-resolver" + assert resolver_variant == "resolvelib" parts.append( "pip's dependency resolver does not currently take into account " "all the packages that are installed. This behaviour is the " @@ -607,12 +607,8 @@ def _warn_about_conflicts( version = package_set[project_name][0] for dependency in missing[project_name]: message = ( - "{name} {version} requires {requirement}, " + f"{project_name} {version} requires {dependency[1]}, " "which is not installed." - ).format( - name=project_name, - version=version, - requirement=dependency[1], ) parts.append(message) @@ -628,7 +624,7 @@ def _warn_about_conflicts( requirement=req, dep_name=dep_name, dep_version=dep_version, - you=("you" if resolver_variant == "2020-resolver" else "you'll"), + you=("you" if resolver_variant == "resolvelib" else "you'll"), ) parts.append(message) diff --git a/.venv/Lib/site-packages/pip/_internal/commands/list.py b/.venv/Lib/site-packages/pip/_internal/commands/list.py index ac10353..e551dda 100644 --- a/.venv/Lib/site-packages/pip/_internal/commands/list.py +++ b/.venv/Lib/site-packages/pip/_internal/commands/list.py @@ -297,7 +297,7 @@ def output_package_listing_columns( # Create and add a separator. if len(data) > 0: - pkg_strings.insert(1, " ".join(map(lambda x: "-" * x, sizes))) + pkg_strings.insert(1, " ".join("-" * x for x in sizes)) for val in pkg_strings: write_output(val) diff --git a/.venv/Lib/site-packages/pip/_internal/configuration.py b/.venv/Lib/site-packages/pip/_internal/configuration.py index 96f8249..c25273d 100644 --- a/.venv/Lib/site-packages/pip/_internal/configuration.py +++ b/.venv/Lib/site-packages/pip/_internal/configuration.py @@ -59,8 +59,8 @@ def _disassemble_key(name: str) -> List[str]: if "." not in name: error_message = ( "Key does not contain dot separated section and key. " - "Perhaps you wanted to use 'global.{}' instead?" - ).format(name) + f"Perhaps you wanted to use 'global.{name}' instead?" + ) raise ConfigurationError(error_message) return name.split(".", 1) @@ -327,33 +327,35 @@ def get_environ_vars(self) -> Iterable[Tuple[str, str]]: def iter_config_files(self) -> Iterable[Tuple[Kind, List[str]]]: """Yields variant and configuration files associated with it. - This should be treated like items of a dictionary. + This should be treated like items of a dictionary. The order + here doesn't affect what gets overridden. That is controlled + by OVERRIDE_ORDER. However this does control the order they are + displayed to the user. It's probably most ergononmic to display + things in the same order as OVERRIDE_ORDER """ # SMELL: Move the conditions out of this function - # environment variables have the lowest priority - config_file = os.environ.get("PIP_CONFIG_FILE", None) - if config_file is not None: - yield kinds.ENV, [config_file] - else: - yield kinds.ENV, [] - + env_config_file = os.environ.get("PIP_CONFIG_FILE", None) config_files = get_configuration_files() - # at the base we have any global configuration yield kinds.GLOBAL, config_files[kinds.GLOBAL] - # per-user configuration next + # per-user config is not loaded when env_config_file exists should_load_user_config = not self.isolated and not ( - config_file and os.path.exists(config_file) + env_config_file and os.path.exists(env_config_file) ) if should_load_user_config: # The legacy config file is overridden by the new config file yield kinds.USER, config_files[kinds.USER] - # finally virtualenv configuration first trumping others + # virtualenv config yield kinds.SITE, config_files[kinds.SITE] + if env_config_file is not None: + yield kinds.ENV, [env_config_file] + else: + yield kinds.ENV, [] + def get_values_in_config(self, variant: Kind) -> Dict[str, Any]: """Get values present in a config file""" return self._config[variant] diff --git a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc index 4f10c89..5a9fe4f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc index b3b9108..e139f68 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc index f5f8702..a5d13f0 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc index f914864..4edd0a2 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc index 8eae917..edface9 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/distributions/base.py b/.venv/Lib/site-packages/pip/_internal/distributions/base.py index 75ce2dc..6fb0d7b 100644 --- a/.venv/Lib/site-packages/pip/_internal/distributions/base.py +++ b/.venv/Lib/site-packages/pip/_internal/distributions/base.py @@ -1,4 +1,5 @@ import abc +from typing import Optional from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata.base import BaseDistribution @@ -19,12 +20,23 @@ class AbstractDistribution(metaclass=abc.ABCMeta): - we must be able to create a Distribution object exposing the above metadata. + + - if we need to do work in the build tracker, we must be able to generate a unique + string to identify the requirement in the build tracker. """ def __init__(self, req: InstallRequirement) -> None: super().__init__() self.req = req + @abc.abstractproperty + def build_tracker_id(self) -> Optional[str]: + """A string that uniquely identifies this requirement to the build tracker. + + If None, then this dist has no work to do in the build tracker, and + ``.prepare_distribution_metadata()`` will not be called.""" + raise NotImplementedError() + @abc.abstractmethod def get_metadata_distribution(self) -> BaseDistribution: raise NotImplementedError() diff --git a/.venv/Lib/site-packages/pip/_internal/distributions/installed.py b/.venv/Lib/site-packages/pip/_internal/distributions/installed.py index edb38aa..ab8d53b 100644 --- a/.venv/Lib/site-packages/pip/_internal/distributions/installed.py +++ b/.venv/Lib/site-packages/pip/_internal/distributions/installed.py @@ -1,3 +1,5 @@ +from typing import Optional + from pip._internal.distributions.base import AbstractDistribution from pip._internal.index.package_finder import PackageFinder from pip._internal.metadata import BaseDistribution @@ -10,6 +12,10 @@ class InstalledDistribution(AbstractDistribution): been computed. """ + @property + def build_tracker_id(self) -> Optional[str]: + return None + def get_metadata_distribution(self) -> BaseDistribution: assert self.req.satisfied_by is not None, "not actually installed" return self.req.satisfied_by diff --git a/.venv/Lib/site-packages/pip/_internal/distributions/sdist.py b/.venv/Lib/site-packages/pip/_internal/distributions/sdist.py index 4c25647..15ff42b 100644 --- a/.venv/Lib/site-packages/pip/_internal/distributions/sdist.py +++ b/.venv/Lib/site-packages/pip/_internal/distributions/sdist.py @@ -1,5 +1,5 @@ import logging -from typing import Iterable, Set, Tuple +from typing import Iterable, Optional, Set, Tuple from pip._internal.build_env import BuildEnvironment from pip._internal.distributions.base import AbstractDistribution @@ -18,6 +18,12 @@ class SourceDistribution(AbstractDistribution): generated, either using PEP 517 or using the legacy `setup.py egg_info`. """ + @property + def build_tracker_id(self) -> Optional[str]: + """Identify this requirement uniquely by its link.""" + assert self.req.link + return self.req.link.url_without_fragment + def get_metadata_distribution(self) -> BaseDistribution: return self.req.get_dist() diff --git a/.venv/Lib/site-packages/pip/_internal/distributions/wheel.py b/.venv/Lib/site-packages/pip/_internal/distributions/wheel.py index 03aac77..eb16e25 100644 --- a/.venv/Lib/site-packages/pip/_internal/distributions/wheel.py +++ b/.venv/Lib/site-packages/pip/_internal/distributions/wheel.py @@ -1,3 +1,5 @@ +from typing import Optional + from pip._vendor.packaging.utils import canonicalize_name from pip._internal.distributions.base import AbstractDistribution @@ -15,6 +17,10 @@ class WheelDistribution(AbstractDistribution): This does not need any preparation as wheels can be directly unpacked. """ + @property + def build_tracker_id(self) -> Optional[str]: + return None + def get_metadata_distribution(self) -> BaseDistribution: """Loads the metadata from the wheel file into memory and returns a Distribution that uses it, not relying on the wheel file or diff --git a/.venv/Lib/site-packages/pip/_internal/exceptions.py b/.venv/Lib/site-packages/pip/_internal/exceptions.py index d95fe44..5007a62 100644 --- a/.venv/Lib/site-packages/pip/_internal/exceptions.py +++ b/.venv/Lib/site-packages/pip/_internal/exceptions.py @@ -247,10 +247,7 @@ def __init__( def __str__(self) -> str: # Use `dist` in the error message because its stringification # includes more information, like the version and location. - return "None {} metadata found for distribution: {}".format( - self.metadata_name, - self.dist, - ) + return f"None {self.metadata_name} metadata found for distribution: {self.dist}" class UserInstallationInvalid(InstallationError): @@ -594,7 +591,7 @@ def __init__(self, allowed: Dict[str, List[str]], gots: Dict[str, "_Hash"]) -> N self.gots = gots def body(self) -> str: - return " {}:\n{}".format(self._requirement_name(), self._hash_comparison()) + return f" {self._requirement_name()}:\n{self._hash_comparison()}" def _hash_comparison(self) -> str: """ @@ -616,11 +613,9 @@ def hash_then_or(hash_name: str) -> "chain[str]": lines: List[str] = [] for hash_name, expecteds in self.allowed.items(): prefix = hash_then_or(hash_name) - lines.extend( - (" Expected {} {}".format(next(prefix), e)) for e in expecteds - ) + lines.extend((f" Expected {next(prefix)} {e}") for e in expecteds) lines.append( - " Got {}\n".format(self.gots[hash_name].hexdigest()) + f" Got {self.gots[hash_name].hexdigest()}\n" ) return "\n".join(lines) diff --git a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc index 7c3b61b..e2f9bf7 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc index 90e81be..af0b362 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc index 3d6818b..f0e7455 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc index 70ea743..a936e94 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/index/collector.py b/.venv/Lib/site-packages/pip/_internal/index/collector.py index b3e293e..08c8bdd 100644 --- a/.venv/Lib/site-packages/pip/_internal/index/collector.py +++ b/.venv/Lib/site-packages/pip/_internal/index/collector.py @@ -473,6 +473,7 @@ def collect_sources( page_validator=self.session.is_secure_origin, expand_dir=False, cache_link_parsing=False, + project_name=project_name, ) for loc in self.search_scope.get_index_urls_locations(project_name) ).values() @@ -483,6 +484,7 @@ def collect_sources( page_validator=self.session.is_secure_origin, expand_dir=True, cache_link_parsing=True, + project_name=project_name, ) for loc in self.find_links ).values() diff --git a/.venv/Lib/site-packages/pip/_internal/index/package_finder.py b/.venv/Lib/site-packages/pip/_internal/index/package_finder.py index b6f8d57..ec9ebc3 100644 --- a/.venv/Lib/site-packages/pip/_internal/index/package_finder.py +++ b/.venv/Lib/site-packages/pip/_internal/index/package_finder.py @@ -198,7 +198,7 @@ def evaluate_link(self, link: Link) -> Tuple[LinkType, str]: reason = f"wrong project name (not {self.project_name})" return (LinkType.different_project, reason) - supported_tags = self._target_python.get_tags() + supported_tags = self._target_python.get_unsorted_tags() if not wheel.supported(supported_tags): # Include the wheel's tags in the reason string to # simplify troubleshooting compatibility issues. @@ -414,7 +414,7 @@ def create( if specifier is None: specifier = specifiers.SpecifierSet() - supported_tags = target_python.get_tags() + supported_tags = target_python.get_sorted_tags() return cls( project_name=project_name, @@ -533,8 +533,8 @@ def _sort_key(self, candidate: InstallationCandidate) -> CandidateSortingKey: ) except ValueError: raise UnsupportedWheel( - "{} is not a supported wheel for this platform. It " - "can't be sorted.".format(wheel.filename) + f"{wheel.filename} is not a supported wheel for this platform. It " + "can't be sorted." ) if self._prefer_binary: binary_preference = 1 @@ -939,9 +939,7 @@ def _format_versions(cand_iter: Iterable[InstallationCandidate]) -> str: _format_versions(best_candidate_result.iter_all()), ) - raise DistributionNotFound( - "No matching distribution found for {}".format(req) - ) + raise DistributionNotFound(f"No matching distribution found for {req}") def _should_install_candidate( candidate: Optional[InstallationCandidate], diff --git a/.venv/Lib/site-packages/pip/_internal/index/sources.py b/.venv/Lib/site-packages/pip/_internal/index/sources.py index cd9cb8d..f4626d7 100644 --- a/.venv/Lib/site-packages/pip/_internal/index/sources.py +++ b/.venv/Lib/site-packages/pip/_internal/index/sources.py @@ -1,8 +1,17 @@ import logging import mimetypes import os -import pathlib -from typing import Callable, Iterable, Optional, Tuple +from collections import defaultdict +from typing import Callable, Dict, Iterable, List, Optional, Tuple + +from pip._vendor.packaging.utils import ( + InvalidSdistFilename, + InvalidVersion, + InvalidWheelFilename, + canonicalize_name, + parse_sdist_filename, + parse_wheel_filename, +) from pip._internal.models.candidate import InstallationCandidate from pip._internal.models.link import Link @@ -36,6 +45,53 @@ def _is_html_file(file_url: str) -> bool: return mimetypes.guess_type(file_url, strict=False)[0] == "text/html" +class _FlatDirectoryToUrls: + """Scans directory and caches results""" + + def __init__(self, path: str) -> None: + self._path = path + self._page_candidates: List[str] = [] + self._project_name_to_urls: Dict[str, List[str]] = defaultdict(list) + self._scanned_directory = False + + def _scan_directory(self) -> None: + """Scans directory once and populates both page_candidates + and project_name_to_urls at the same time + """ + for entry in os.scandir(self._path): + url = path_to_url(entry.path) + if _is_html_file(url): + self._page_candidates.append(url) + continue + + # File must have a valid wheel or sdist name, + # otherwise not worth considering as a package + try: + project_filename = parse_wheel_filename(entry.name)[0] + except (InvalidWheelFilename, InvalidVersion): + try: + project_filename = parse_sdist_filename(entry.name)[0] + except (InvalidSdistFilename, InvalidVersion): + continue + + self._project_name_to_urls[project_filename].append(url) + self._scanned_directory = True + + @property + def page_candidates(self) -> List[str]: + if not self._scanned_directory: + self._scan_directory() + + return self._page_candidates + + @property + def project_name_to_urls(self) -> Dict[str, List[str]]: + if not self._scanned_directory: + self._scan_directory() + + return self._project_name_to_urls + + class _FlatDirectorySource(LinkSource): """Link source specified by ``--find-links=``. @@ -45,30 +101,34 @@ class _FlatDirectorySource(LinkSource): * ``file_candidates``: Archives in the directory. """ + _paths_to_urls: Dict[str, _FlatDirectoryToUrls] = {} + def __init__( self, candidates_from_page: CandidatesFromPage, path: str, + project_name: str, ) -> None: self._candidates_from_page = candidates_from_page - self._path = pathlib.Path(os.path.realpath(path)) + self._project_name = canonicalize_name(project_name) + + # Get existing instance of _FlatDirectoryToUrls if it exists + if path in self._paths_to_urls: + self._path_to_urls = self._paths_to_urls[path] + else: + self._path_to_urls = _FlatDirectoryToUrls(path=path) + self._paths_to_urls[path] = self._path_to_urls @property def link(self) -> Optional[Link]: return None def page_candidates(self) -> FoundCandidates: - for path in self._path.iterdir(): - url = path_to_url(str(path)) - if not _is_html_file(url): - continue + for url in self._path_to_urls.page_candidates: yield from self._candidates_from_page(Link(url)) def file_links(self) -> FoundLinks: - for path in self._path.iterdir(): - url = path_to_url(str(path)) - if _is_html_file(url): - continue + for url in self._path_to_urls.project_name_to_urls[self._project_name]: yield Link(url) @@ -170,6 +230,7 @@ def build_source( page_validator: PageValidator, expand_dir: bool, cache_link_parsing: bool, + project_name: str, ) -> Tuple[Optional[str], Optional[LinkSource]]: path: Optional[str] = None url: Optional[str] = None @@ -203,6 +264,7 @@ def build_source( source = _FlatDirectorySource( candidates_from_page=candidates_from_page, path=path, + project_name=project_name, ) else: source = _IndexDirectorySource( diff --git a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc index e210371..8bf28ec 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc index dcdefa1..794515d 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc index 0a8edbe..b079b29 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc index 2b4cb34..5dcc332 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/locations/_distutils.py b/.venv/Lib/site-packages/pip/_internal/locations/_distutils.py index 92bd931..0e18c6e 100644 --- a/.venv/Lib/site-packages/pip/_internal/locations/_distutils.py +++ b/.venv/Lib/site-packages/pip/_internal/locations/_distutils.py @@ -56,8 +56,7 @@ def distutils_scheme( try: d.parse_config_files() except UnicodeDecodeError: - # Typeshed does not include find_config_files() for some reason. - paths = d.find_config_files() # type: ignore + paths = d.find_config_files() logger.warning( "Ignore distutils configs in %s due to encoding errors.", ", ".join(os.path.basename(p) for p in paths), @@ -89,7 +88,7 @@ def distutils_scheme( # finalize_options(); we only want to override here if the user # has explicitly requested it hence going back to the config if "install_lib" in d.get_option_dict("install"): - scheme.update(dict(purelib=i.install_lib, platlib=i.install_lib)) + scheme.update({"purelib": i.install_lib, "platlib": i.install_lib}) if running_under_virtualenv(): if home: diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/__init__.py b/.venv/Lib/site-packages/pip/_internal/metadata/__init__.py index 9f73ca7..aa232b6 100644 --- a/.venv/Lib/site-packages/pip/_internal/metadata/__init__.py +++ b/.venv/Lib/site-packages/pip/_internal/metadata/__init__.py @@ -9,7 +9,7 @@ from .base import BaseDistribution, BaseEnvironment, FilesystemWheel, MemoryWheel, Wheel if TYPE_CHECKING: - from typing import Protocol + from typing import Literal, Protocol else: Protocol = object @@ -50,6 +50,7 @@ def _should_use_importlib_metadata() -> bool: class Backend(Protocol): + NAME: 'Literal["importlib", "pkg_resources"]' Distribution: Type[BaseDistribution] Environment: Type[BaseEnvironment] diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc index 26466e0..c84860f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc index 6fdee46..0350dd4 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/_json.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc index 24ad0bf..e1ad511 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc index 1fdba64..b1f7861 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/_json.py b/.venv/Lib/site-packages/pip/_internal/metadata/_json.py index 336b52f..27362fc 100644 --- a/.venv/Lib/site-packages/pip/_internal/metadata/_json.py +++ b/.venv/Lib/site-packages/pip/_internal/metadata/_json.py @@ -64,10 +64,10 @@ def sanitise_header(h: Union[Header, str]) -> str: key = json_name(field) if multi: value: Union[str, List[str]] = [ - sanitise_header(v) for v in msg.get_all(field) + sanitise_header(v) for v in msg.get_all(field) # type: ignore ] else: - value = sanitise_header(msg.get(field)) + value = sanitise_header(msg.get(field)) # type: ignore if key == "keywords": # Accept both comma-separated and space-separated # forms, for better compatibility with old data. diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/base.py b/.venv/Lib/site-packages/pip/_internal/metadata/base.py index cafb79f..9249124 100644 --- a/.venv/Lib/site-packages/pip/_internal/metadata/base.py +++ b/.venv/Lib/site-packages/pip/_internal/metadata/base.py @@ -24,7 +24,7 @@ from pip._vendor.packaging.requirements import Requirement from pip._vendor.packaging.specifiers import InvalidSpecifier, SpecifierSet -from pip._vendor.packaging.utils import NormalizedName +from pip._vendor.packaging.utils import NormalizedName, canonicalize_name from pip._vendor.packaging.version import LegacyVersion, Version from pip._internal.exceptions import NoneMetadataError @@ -37,7 +37,6 @@ from pip._internal.utils.compat import stdlib_pkgs # TODO: Move definition here. from pip._internal.utils.egg_link import egg_link_path_from_sys_path from pip._internal.utils.misc import is_local, normalize_path -from pip._internal.utils.packaging import safe_extra from pip._internal.utils.urls import url_to_path from ._json import msg_to_json @@ -460,6 +459,19 @@ def iter_provided_extras(self) -> Iterable[str]: For modern .dist-info distributions, this is the collection of "Provides-Extra:" entries in distribution metadata. + + The return value of this function is not particularly useful other than + display purposes due to backward compatibility issues and the extra + names being poorly normalized prior to PEP 685. If you want to perform + logic operations on extras, use :func:`is_extra_provided` instead. + """ + raise NotImplementedError() + + def is_extra_provided(self, extra: str) -> bool: + """Check whether an extra is provided by this distribution. + + This is needed mostly for compatibility issues with pkg_resources not + following the extra normalization rules defined in PEP 685. """ raise NotImplementedError() @@ -537,10 +549,11 @@ def _iter_egg_info_extras(self) -> Iterable[str]: """Get extras from the egg-info directory.""" known_extras = {""} for entry in self._iter_requires_txt_entries(): - if entry.extra in known_extras: + extra = canonicalize_name(entry.extra) + if extra in known_extras: continue - known_extras.add(entry.extra) - yield entry.extra + known_extras.add(extra) + yield extra def _iter_egg_info_dependencies(self) -> Iterable[str]: """Get distribution dependencies from the egg-info directory. @@ -556,10 +569,11 @@ def _iter_egg_info_dependencies(self) -> Iterable[str]: all currently available PEP 517 backends, although not standardized. """ for entry in self._iter_requires_txt_entries(): - if entry.extra and entry.marker: - marker = f'({entry.marker}) and extra == "{safe_extra(entry.extra)}"' - elif entry.extra: - marker = f'extra == "{safe_extra(entry.extra)}"' + extra = canonicalize_name(entry.extra) + if extra and entry.marker: + marker = f'({entry.marker}) and extra == "{extra}"' + elif extra: + marker = f'extra == "{extra}"' elif entry.marker: marker = entry.marker else: diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py index 5e7af9f..a779138 100644 --- a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py +++ b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__init__.py @@ -1,4 +1,6 @@ from ._dists import Distribution from ._envs import Environment -__all__ = ["Distribution", "Environment"] +__all__ = ["NAME", "Distribution", "Environment"] + +NAME = "importlib" diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc index 7acf670..d3f18d1 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc index afc6f3d..54ede9a 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc index d79010d..a3132fd 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_dists.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc index 6c43666..a71e528 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/__pycache__/_envs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py index 65c043c..26370fa 100644 --- a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py +++ b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/_dists.py @@ -27,7 +27,6 @@ Wheel, ) from pip._internal.utils.misc import normalize_path -from pip._internal.utils.packaging import safe_extra from pip._internal.utils.temp_dir import TempDirectory from pip._internal.utils.wheel import parse_wheel, read_wheel_metadata_file @@ -208,12 +207,16 @@ def _metadata_impl(self) -> email.message.Message: return cast(email.message.Message, self._dist.metadata) def iter_provided_extras(self) -> Iterable[str]: - return ( - safe_extra(extra) for extra in self.metadata.get_all("Provides-Extra", []) + return self.metadata.get_all("Provides-Extra", []) + + def is_extra_provided(self, extra: str) -> bool: + return any( + canonicalize_name(provided_extra) == canonicalize_name(extra) + for provided_extra in self.metadata.get_all("Provides-Extra", []) ) def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: - contexts: Sequence[Dict[str, str]] = [{"extra": safe_extra(e)} for e in extras] + contexts: Sequence[Dict[str, str]] = [{"extra": e} for e in extras] for req_string in self.metadata.get_all("Requires-Dist", []): req = Requirement(req_string) if not req.marker: diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py index 3850dda..048dc55 100644 --- a/.venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py +++ b/.venv/Lib/site-packages/pip/_internal/metadata/importlib/_envs.py @@ -151,7 +151,8 @@ def _emit_egg_deprecation(location: Optional[str]) -> None: deprecated( reason=f"Loading egg at {location} is deprecated.", replacement="to use pip for package installation.", - gone_in="23.3", + gone_in="24.3", + issue=12330, ) diff --git a/.venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py b/.venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py index f330ef1..bb11e5b 100644 --- a/.venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py +++ b/.venv/Lib/site-packages/pip/_internal/metadata/pkg_resources.py @@ -24,8 +24,12 @@ Wheel, ) +__all__ = ["NAME", "Distribution", "Environment"] + logger = logging.getLogger(__name__) +NAME = "pkg_resources" + class EntryPoint(NamedTuple): name: str @@ -212,12 +216,16 @@ def _metadata_impl(self) -> email.message.Message: def iter_dependencies(self, extras: Collection[str] = ()) -> Iterable[Requirement]: if extras: # pkg_resources raises on invalid extras, so we sanitize. - extras = frozenset(extras).intersection(self._dist.extras) + extras = frozenset(pkg_resources.safe_extra(e) for e in extras) + extras = extras.intersection(self._dist.extras) return self._dist.requires(extras) def iter_provided_extras(self) -> Iterable[str]: return self._dist.extras + def is_extra_provided(self, extra: str) -> bool: + return pkg_resources.safe_extra(extra) in self._dist.extras + class Environment(BaseEnvironment): def __init__(self, ws: pkg_resources.WorkingSet) -> None: diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc index f5330e0..a4e72de 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc index 6107885..2a1acf1 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc index 84217f1..3be86bd 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc index ac12df2..1611a22 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc index ebfa803..ba072f3 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc index e031018..313d9e7 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/installation_report.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc index 9b269c1..5c9b701 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc index 5e64f1f..ed26cf7 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc index f7bdd9f..f614584 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc index a4fb65b..9d15d55 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc index c468cd3..74bb0b8 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc index 10c654c..685d175 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/models/candidate.py b/.venv/Lib/site-packages/pip/_internal/models/candidate.py index a4963ae..9184a90 100644 --- a/.venv/Lib/site-packages/pip/_internal/models/candidate.py +++ b/.venv/Lib/site-packages/pip/_internal/models/candidate.py @@ -27,8 +27,4 @@ def __repr__(self) -> str: ) def __str__(self) -> str: - return "{!r} candidate (version {} at {})".format( - self.name, - self.version, - self.link, - ) + return f"{self.name!r} candidate (version {self.version} at {self.link})" diff --git a/.venv/Lib/site-packages/pip/_internal/models/direct_url.py b/.venv/Lib/site-packages/pip/_internal/models/direct_url.py index e219d73..0af884b 100644 --- a/.venv/Lib/site-packages/pip/_internal/models/direct_url.py +++ b/.venv/Lib/site-packages/pip/_internal/models/direct_url.py @@ -31,9 +31,7 @@ def _get( value = d[key] if not isinstance(value, expected_type): raise DirectUrlValidationError( - "{!r} has unexpected type for {} (expected {})".format( - value, key, expected_type - ) + f"{value!r} has unexpected type for {key} (expected {expected_type})" ) return value diff --git a/.venv/Lib/site-packages/pip/_internal/models/format_control.py b/.venv/Lib/site-packages/pip/_internal/models/format_control.py index db3995e..ccd1127 100644 --- a/.venv/Lib/site-packages/pip/_internal/models/format_control.py +++ b/.venv/Lib/site-packages/pip/_internal/models/format_control.py @@ -33,9 +33,7 @@ def __eq__(self, other: object) -> bool: return all(getattr(self, k) == getattr(other, k) for k in self.__slots__) def __repr__(self) -> str: - return "{}({}, {})".format( - self.__class__.__name__, self.no_binary, self.only_binary - ) + return f"{self.__class__.__name__}({self.no_binary}, {self.only_binary})" @staticmethod def handle_mutual_excludes(value: str, target: Set[str], other: Set[str]) -> None: diff --git a/.venv/Lib/site-packages/pip/_internal/models/installation_report.py b/.venv/Lib/site-packages/pip/_internal/models/installation_report.py index 7f001f3..b9c6330 100644 --- a/.venv/Lib/site-packages/pip/_internal/models/installation_report.py +++ b/.venv/Lib/site-packages/pip/_internal/models/installation_report.py @@ -23,6 +23,9 @@ def _install_req_to_dict(cls, ireq: InstallRequirement) -> Dict[str, Any]: # includes editable requirements), and false if the requirement was # downloaded from a PEP 503 index or --find-links. "is_direct": ireq.is_direct, + # is_yanked is true if the requirement was yanked from the index, but + # was still selected by pip to conform to PEP 592. + "is_yanked": ireq.link.is_yanked if ireq.link else False, # requested is true if the requirement was specified by the user (aka # top level requirement), and false if it was installed as a dependency of a # requirement. https://peps.python.org/pep-0376/#requested @@ -33,7 +36,7 @@ def _install_req_to_dict(cls, ireq: InstallRequirement) -> Dict[str, Any]: } if ireq.user_supplied and ireq.extras: # For top level requirements, the list of requested extras, if any. - res["requested_extras"] = list(sorted(ireq.extras)) + res["requested_extras"] = sorted(ireq.extras) return res def to_dict(self) -> Dict[str, Any]: diff --git a/.venv/Lib/site-packages/pip/_internal/models/link.py b/.venv/Lib/site-packages/pip/_internal/models/link.py index 4453519..73041b8 100644 --- a/.venv/Lib/site-packages/pip/_internal/models/link.py +++ b/.venv/Lib/site-packages/pip/_internal/models/link.py @@ -368,9 +368,7 @@ def __str__(self) -> str: else: rp = "" if self.comes_from: - return "{} (from {}){}".format( - redact_auth_from_url(self._url), self.comes_from, rp - ) + return f"{redact_auth_from_url(self._url)} (from {self.comes_from}){rp}" else: return redact_auth_from_url(str(self._url)) diff --git a/.venv/Lib/site-packages/pip/_internal/models/target_python.py b/.venv/Lib/site-packages/pip/_internal/models/target_python.py index 744bd7e..67ea5da 100644 --- a/.venv/Lib/site-packages/pip/_internal/models/target_python.py +++ b/.venv/Lib/site-packages/pip/_internal/models/target_python.py @@ -1,5 +1,5 @@ import sys -from typing import List, Optional, Tuple +from typing import List, Optional, Set, Tuple from pip._vendor.packaging.tags import Tag @@ -22,6 +22,7 @@ class TargetPython: "py_version", "py_version_info", "_valid_tags", + "_valid_tags_set", ] def __init__( @@ -61,8 +62,9 @@ def __init__( self.py_version = py_version self.py_version_info = py_version_info - # This is used to cache the return value of get_tags(). + # This is used to cache the return value of get_(un)sorted_tags. self._valid_tags: Optional[List[Tag]] = None + self._valid_tags_set: Optional[Set[Tag]] = None def format_given(self) -> str: """ @@ -84,7 +86,7 @@ def format_given(self) -> str: f"{key}={value!r}" for key, value in key_values if value is not None ) - def get_tags(self) -> List[Tag]: + def get_sorted_tags(self) -> List[Tag]: """ Return the supported PEP 425 tags to check wheel candidates against. @@ -108,3 +110,13 @@ def get_tags(self) -> List[Tag]: self._valid_tags = tags return self._valid_tags + + def get_unsorted_tags(self) -> Set[Tag]: + """Exactly the same as get_sorted_tags, but returns a set. + + This is important for performance. + """ + if self._valid_tags_set is None: + self._valid_tags_set = set(self.get_sorted_tags()) + + return self._valid_tags_set diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc index 46e5ec6..911cdb3 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc index 54d401c..8b0b216 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc index edfbcfb..83773d8 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc index 466724f..05a15fd 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc index 2148563..a853f38 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc index d511b65..9619d9b 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc index caf7f2a..9e35403 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc index 3636926..2741dca 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/network/cache.py b/.venv/Lib/site-packages/pip/_internal/network/cache.py index a81a239..4d0fb54 100644 --- a/.venv/Lib/site-packages/pip/_internal/network/cache.py +++ b/.venv/Lib/site-packages/pip/_internal/network/cache.py @@ -3,10 +3,11 @@ import os from contextlib import contextmanager -from typing import Generator, Optional +from datetime import datetime +from typing import BinaryIO, Generator, Optional, Union -from pip._vendor.cachecontrol.cache import BaseCache -from pip._vendor.cachecontrol.caches import FileCache +from pip._vendor.cachecontrol.cache import SeparateBodyBaseCache +from pip._vendor.cachecontrol.caches import SeparateBodyFileCache from pip._vendor.requests.models import Response from pip._internal.utils.filesystem import adjacent_tmp_file, replace @@ -28,10 +29,22 @@ def suppressed_cache_errors() -> Generator[None, None, None]: pass -class SafeFileCache(BaseCache): +class SafeFileCache(SeparateBodyBaseCache): """ A file based cache which is safe to use even when the target directory may not be accessible or writable. + + There is a race condition when two processes try to write and/or read the + same entry at the same time, since each entry consists of two separate + files (https://github.com/psf/cachecontrol/issues/324). We therefore have + additional logic that makes sure that both files to be present before + returning an entry; this fixes the read side of the race condition. + + For the write side, we assume that the server will only ever return the + same data for the same URL, which ought to be the case for files pip is + downloading. PyPI does not have a mechanism to swap out a wheel for + another wheel, for example. If this assumption is not true, the + CacheControl issue will need to be fixed. """ def __init__(self, directory: str) -> None: @@ -43,27 +56,51 @@ def _get_cache_path(self, name: str) -> str: # From cachecontrol.caches.file_cache.FileCache._fn, brought into our # class for backwards-compatibility and to avoid using a non-public # method. - hashed = FileCache.encode(name) + hashed = SeparateBodyFileCache.encode(name) parts = list(hashed[:5]) + [hashed] return os.path.join(self.directory, *parts) def get(self, key: str) -> Optional[bytes]: - path = self._get_cache_path(key) + # The cache entry is only valid if both metadata and body exist. + metadata_path = self._get_cache_path(key) + body_path = metadata_path + ".body" + if not (os.path.exists(metadata_path) and os.path.exists(body_path)): + return None with suppressed_cache_errors(): - with open(path, "rb") as f: + with open(metadata_path, "rb") as f: return f.read() - def set(self, key: str, value: bytes, expires: Optional[int] = None) -> None: - path = self._get_cache_path(key) + def _write(self, path: str, data: bytes) -> None: with suppressed_cache_errors(): ensure_dir(os.path.dirname(path)) with adjacent_tmp_file(path) as f: - f.write(value) + f.write(data) replace(f.name, path) + def set( + self, key: str, value: bytes, expires: Union[int, datetime, None] = None + ) -> None: + path = self._get_cache_path(key) + self._write(path, value) + def delete(self, key: str) -> None: path = self._get_cache_path(key) with suppressed_cache_errors(): os.remove(path) + with suppressed_cache_errors(): + os.remove(path + ".body") + + def get_body(self, key: str) -> Optional[BinaryIO]: + # The cache entry is only valid if both metadata and body exist. + metadata_path = self._get_cache_path(key) + body_path = metadata_path + ".body" + if not (os.path.exists(metadata_path) and os.path.exists(body_path)): + return None + with suppressed_cache_errors(): + return open(body_path, "rb") + + def set_body(self, key: str, body: bytes) -> None: + path = self._get_cache_path(key) + ".body" + self._write(path, body) diff --git a/.venv/Lib/site-packages/pip/_internal/network/download.py b/.venv/Lib/site-packages/pip/_internal/network/download.py index 79b82a5..d1d4354 100644 --- a/.venv/Lib/site-packages/pip/_internal/network/download.py +++ b/.venv/Lib/site-packages/pip/_internal/network/download.py @@ -42,7 +42,7 @@ def _prepare_download( logged_url = redact_auth_from_url(url) if total_length: - logged_url = "{} ({})".format(logged_url, format_size(total_length)) + logged_url = f"{logged_url} ({format_size(total_length)})" if is_from_cache(resp): logger.info("Using cached %s", logged_url) diff --git a/.venv/Lib/site-packages/pip/_internal/network/session.py b/.venv/Lib/site-packages/pip/_internal/network/session.py index 887dc14..f17efc5 100644 --- a/.venv/Lib/site-packages/pip/_internal/network/session.py +++ b/.venv/Lib/site-packages/pip/_internal/network/session.py @@ -355,8 +355,9 @@ def __init__( # is typically considered a transient error so we'll go ahead and # retry it. # A 500 may indicate transient error in Amazon S3 + # A 502 may be a transient error from a CDN like CloudFlare or CloudFront # A 520 or 527 - may indicate transient error in CloudFlare - status_forcelist=[500, 503, 520, 527], + status_forcelist=[500, 502, 503, 520, 527], # Add a small amount of back off between failed requests in # order to prevent hammering the service. backoff_factor=0.25, diff --git a/.venv/Lib/site-packages/pip/_internal/network/xmlrpc.py b/.venv/Lib/site-packages/pip/_internal/network/xmlrpc.py index 4a7d55d..22ec8d2 100644 --- a/.venv/Lib/site-packages/pip/_internal/network/xmlrpc.py +++ b/.venv/Lib/site-packages/pip/_internal/network/xmlrpc.py @@ -13,6 +13,8 @@ if TYPE_CHECKING: from xmlrpc.client import _HostType, _Marshallable + from _typeshed import SizedBuffer + logger = logging.getLogger(__name__) @@ -33,7 +35,7 @@ def request( self, host: "_HostType", handler: str, - request_body: bytes, + request_body: "SizedBuffer", verbose: bool = False, ) -> Tuple["_Marshallable", ...]: assert isinstance(host, str) diff --git a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc index 8056ff7..7c6ce4f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc index 54d5311..0bc6986 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc index de86cb7..8032633 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc index aa6885d..067051e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc index 9cac15a..8215102 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc index da6dbbe..02cbe59 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/build_tracker.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc index e8a6eb0..aefe323 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc index cfc7a72..fc5e73e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc index 01b76c1..3abef1c 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc index 4527324..f620023 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc index 4c6fc74..f58e675 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc index 16bb737..eabb709 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py b/.venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py index 6621549..3791932 100644 --- a/.venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py +++ b/.venv/Lib/site-packages/pip/_internal/operations/build/build_tracker.py @@ -51,10 +51,22 @@ def get_build_tracker() -> Generator["BuildTracker", None, None]: yield tracker +class TrackerId(str): + """Uniquely identifying string provided to the build tracker.""" + + class BuildTracker: + """Ensure that an sdist cannot request itself as a setup requirement. + + When an sdist is prepared, it identifies its setup requirements in the + context of ``BuildTracker.track()``. If a requirement shows up recursively, this + raises an exception. + + This stops fork bombs embedded in malicious packages.""" + def __init__(self, root: str) -> None: self._root = root - self._entries: Set[InstallRequirement] = set() + self._entries: Dict[TrackerId, InstallRequirement] = {} logger.debug("Created build tracker: %s", self._root) def __enter__(self) -> "BuildTracker": @@ -69,16 +81,15 @@ def __exit__( ) -> None: self.cleanup() - def _entry_path(self, link: Link) -> str: - hashed = hashlib.sha224(link.url_without_fragment.encode()).hexdigest() + def _entry_path(self, key: TrackerId) -> str: + hashed = hashlib.sha224(key.encode()).hexdigest() return os.path.join(self._root, hashed) - def add(self, req: InstallRequirement) -> None: + def add(self, req: InstallRequirement, key: TrackerId) -> None: """Add an InstallRequirement to build tracking.""" - assert req.link # Get the file to write information about this requirement. - entry_path = self._entry_path(req.link) + entry_path = self._entry_path(key) # Try reading from the file. If it exists and can be read from, a build # is already in progress, so a LookupError is raised. @@ -92,33 +103,37 @@ def add(self, req: InstallRequirement) -> None: raise LookupError(message) # If we're here, req should really not be building already. - assert req not in self._entries + assert key not in self._entries # Start tracking this requirement. with open(entry_path, "w", encoding="utf-8") as fp: fp.write(str(req)) - self._entries.add(req) + self._entries[key] = req logger.debug("Added %s to build tracker %r", req, self._root) - def remove(self, req: InstallRequirement) -> None: + def remove(self, req: InstallRequirement, key: TrackerId) -> None: """Remove an InstallRequirement from build tracking.""" - assert req.link - # Delete the created file and the corresponding entries. - os.unlink(self._entry_path(req.link)) - self._entries.remove(req) + # Delete the created file and the corresponding entry. + os.unlink(self._entry_path(key)) + del self._entries[key] logger.debug("Removed %s from build tracker %r", req, self._root) def cleanup(self) -> None: - for req in set(self._entries): - self.remove(req) + for key, req in list(self._entries.items()): + self.remove(req, key) logger.debug("Removed build tracker: %r", self._root) @contextlib.contextmanager - def track(self, req: InstallRequirement) -> Generator[None, None, None]: - self.add(req) + def track(self, req: InstallRequirement, key: str) -> Generator[None, None, None]: + """Ensure that `key` cannot install itself as a setup requirement. + + :raises LookupError: If `key` was already provided in a parent invocation of + the context introduced by this method.""" + tracker_id = TrackerId(key) + self.add(req, tracker_id) yield - self.remove(req) + self.remove(req, tracker_id) diff --git a/.venv/Lib/site-packages/pip/_internal/operations/check.py b/.venv/Lib/site-packages/pip/_internal/operations/check.py index 2610459..90c6a58 100644 --- a/.venv/Lib/site-packages/pip/_internal/operations/check.py +++ b/.venv/Lib/site-packages/pip/_internal/operations/check.py @@ -168,7 +168,7 @@ def warn_legacy_versions_and_specifiers(package_set: PackageSet) -> None: f"release a version with a conforming version number" ), issue=12063, - gone_in="23.3", + gone_in="24.1", ) for dep in package_details.dependencies: if any(isinstance(spec, LegacySpecifier) for spec in dep.specifier): @@ -183,5 +183,5 @@ def warn_legacy_versions_and_specifiers(package_set: PackageSet) -> None: f"release a version with a conforming dependency specifiers" ), issue=12063, - gone_in="23.3", + gone_in="24.1", ) diff --git a/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc index 71c8320..d019d3e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc index c745c3d..86c7cf6 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc index 06f8dd3..bb949ce 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/operations/install/wheel.py b/.venv/Lib/site-packages/pip/_internal/operations/install/wheel.py index a8cd133..f67180c 100644 --- a/.venv/Lib/site-packages/pip/_internal/operations/install/wheel.py +++ b/.venv/Lib/site-packages/pip/_internal/operations/install/wheel.py @@ -164,16 +164,14 @@ def message_about_scripts_not_on_PATH(scripts: Sequence[str]) -> Optional[str]: for parent_dir, dir_scripts in warn_for.items(): sorted_scripts: List[str] = sorted(dir_scripts) if len(sorted_scripts) == 1: - start_text = "script {} is".format(sorted_scripts[0]) + start_text = f"script {sorted_scripts[0]} is" else: start_text = "scripts {} are".format( ", ".join(sorted_scripts[:-1]) + " and " + sorted_scripts[-1] ) msg_lines.append( - "The {} installed in '{}' which is not on PATH.".format( - start_text, parent_dir - ) + f"The {start_text} installed in '{parent_dir}' which is not on PATH." ) last_line_fmt = ( @@ -267,9 +265,9 @@ def get_csv_rows_for_installed( path = _fs_to_record_path(f, lib_dir) digest, length = rehash(f) installed_rows.append((path, digest, length)) - for installed_record_path in installed.values(): - installed_rows.append((installed_record_path, "", "")) - return installed_rows + return installed_rows + [ + (installed_record_path, "", "") for installed_record_path in installed.values() + ] def get_console_script_specs(console: Dict[str, str]) -> List[str]: @@ -321,9 +319,7 @@ def get_console_script_specs(console: Dict[str, str]) -> List[str]: scripts_to_generate.append("pip = " + pip_script) if os.environ.get("ENSUREPIP_OPTIONS", "") != "altinstall": - scripts_to_generate.append( - "pip{} = {}".format(sys.version_info[0], pip_script) - ) + scripts_to_generate.append(f"pip{sys.version_info[0]} = {pip_script}") scripts_to_generate.append(f"pip{get_major_minor_version()} = {pip_script}") # Delete any other versioned pip entry points @@ -336,9 +332,7 @@ def get_console_script_specs(console: Dict[str, str]) -> List[str]: scripts_to_generate.append("easy_install = " + easy_install_script) scripts_to_generate.append( - "easy_install-{} = {}".format( - get_major_minor_version(), easy_install_script - ) + f"easy_install-{get_major_minor_version()} = {easy_install_script}" ) # Delete any other versioned easy_install entry points easy_install_ep = [ @@ -408,10 +402,10 @@ def save(self) -> None: class MissingCallableSuffix(InstallationError): def __init__(self, entry_point: str) -> None: super().__init__( - "Invalid script entry point: {} - A callable " + f"Invalid script entry point: {entry_point} - A callable " "suffix is required. Cf https://packaging.python.org/" "specifications/entry-points/#use-for-scripts for more " - "information.".format(entry_point) + "information." ) @@ -712,7 +706,7 @@ def req_error_context(req_description: str) -> Generator[None, None, None]: try: yield except InstallationError as e: - message = "For req: {}. {}".format(req_description, e.args[0]) + message = f"For req: {req_description}. {e.args[0]}" raise InstallationError(message) from e diff --git a/.venv/Lib/site-packages/pip/_internal/operations/prepare.py b/.venv/Lib/site-packages/pip/_internal/operations/prepare.py index cb121bc..956717d 100644 --- a/.venv/Lib/site-packages/pip/_internal/operations/prepare.py +++ b/.venv/Lib/site-packages/pip/_internal/operations/prepare.py @@ -4,10 +4,10 @@ # The following comment should be removed at some point in the future. # mypy: strict-optional=False -import logging import mimetypes import os import shutil +from pathlib import Path from typing import Dict, Iterable, List, Optional from pip._vendor.packaging.utils import canonicalize_name @@ -21,7 +21,6 @@ InstallationError, MetadataInconsistent, NetworkConnectionError, - PreviousBuildDirError, VcsHashUnsupported, ) from pip._internal.index.package_finder import PackageFinder @@ -37,6 +36,7 @@ from pip._internal.network.session import PipSession from pip._internal.operations.build.build_tracker import BuildTracker from pip._internal.req.req_install import InstallRequirement +from pip._internal.utils._log import getLogger from pip._internal.utils.direct_url_helpers import ( direct_url_for_editable, direct_url_from_link, @@ -47,13 +47,13 @@ display_path, hash_file, hide_url, - is_installable_dir, + redact_auth_from_requirement, ) from pip._internal.utils.temp_dir import TempDirectory from pip._internal.utils.unpacking import unpack_file from pip._internal.vcs import vcs -logger = logging.getLogger(__name__) +logger = getLogger(__name__) def _get_prepared_distribution( @@ -65,10 +65,12 @@ def _get_prepared_distribution( ) -> BaseDistribution: """Prepare a distribution for installation.""" abstract_dist = make_distribution_for_install_requirement(req) - with build_tracker.track(req): - abstract_dist.prepare_distribution_metadata( - finder, build_isolation, check_build_deps - ) + tracker_id = abstract_dist.build_tracker_id + if tracker_id is not None: + with build_tracker.track(req, tracker_id): + abstract_dist.prepare_distribution_metadata( + finder, build_isolation, check_build_deps + ) return abstract_dist.get_metadata_distribution() @@ -276,7 +278,7 @@ def _log_preparing_link(self, req: InstallRequirement) -> None: information = str(display_path(req.link.file_path)) else: message = "Collecting %s" - information = str(req.req or req) + information = redact_auth_from_requirement(req.req) if req.req else str(req) # If we used req.req, inject requirement source if available (this # would already be included if we used req directly) @@ -317,21 +319,7 @@ def _ensure_link_req_src_dir( autodelete=True, parallel_builds=parallel_builds, ) - - # If a checkout exists, it's unwise to keep going. version - # inconsistencies are logged later, but do not fail the - # installation. - # FIXME: this won't upgrade when there's an existing - # package unpacked in `req.source_dir` - # TODO: this check is now probably dead code - if is_installable_dir(req.source_dir): - raise PreviousBuildDirError( - "pip can't proceed with requirements '{}' due to a" - "pre-existing build directory ({}). This is likely " - "due to a previous installation that failed . pip is " - "being responsible and not assuming it can delete this. " - "Please delete it and try again.".format(req, req.source_dir) - ) + req.ensure_pristine_source_checkout() def _get_linked_req_hashes(self, req: InstallRequirement) -> Hashes: # By the time this is called, the requirement's link should have @@ -394,7 +382,7 @@ def _fetch_metadata_using_link_data_attr( if metadata_link is None: return None assert req.req is not None - logger.info( + logger.verbose( "Obtaining dependency information for %s from %s", req.req, metadata_link, @@ -479,20 +467,19 @@ def _complete_partial_requirements( for link, (filepath, _) in batch_download: logger.debug("Downloading link %s to %s", link, filepath) req = links_to_fully_download[link] + # Record the downloaded file path so wheel reqs can extract a Distribution + # in .get_dist(). req.local_file_path = filepath - # TODO: This needs fixing for sdists - # This is an emergency fix for #11847, which reports that - # distributions get downloaded twice when metadata is loaded - # from a PEP 658 standalone metadata file. Setting _downloaded - # fixes this for wheels, but breaks the sdist case (tests - # test_download_metadata). As PyPI is currently only serving - # metadata for wheels, this is not an immediate issue. - # Fixing the problem properly looks like it will require a - # complete refactoring of the `prepare_linked_requirements_more` - # logic, and I haven't a clue where to start on that, so for now - # I have fixed the issue *just* for wheels. - if req.is_wheel: - self._downloaded[req.link.url] = filepath + # Record that the file is downloaded so we don't do it again in + # _prepare_linked_requirement(). + self._downloaded[req.link.url] = filepath + + # If this is an sdist, we need to unpack it after downloading, but the + # .source_dir won't be set up until we are in _prepare_linked_requirement(). + # Add the downloaded archive to the install requirement to unpack after + # preparing the source dir. + if not req.is_wheel: + req.needs_unpacked_archive(Path(filepath)) # This step is necessary to ensure all lazy wheels are processed # successfully by the 'download', 'wheel', and 'install' commands. @@ -616,8 +603,8 @@ def _prepare_linked_requirement( ) except NetworkConnectionError as exc: raise InstallationError( - "Could not install requirement {} because of HTTP " - "error {} for URL {}".format(req, exc, link) + f"Could not install requirement {req} because of HTTP " + f"error {exc} for URL {link}" ) else: file_path = self._downloaded[link.url] @@ -697,9 +684,9 @@ def prepare_editable_requirement( with indent_log(): if self.require_hashes: raise InstallationError( - "The editable requirement {} cannot be installed when " + f"The editable requirement {req} cannot be installed when " "requiring hashes, because there is no single file to " - "hash.".format(req) + "hash." ) req.ensure_has_source_dir(self.src_dir) req.update_editable() @@ -727,7 +714,7 @@ def prepare_installed_requirement( assert req.satisfied_by, "req should have been satisfied but isn't" assert skip_reason is not None, ( "did not get skip reason skipped but req.satisfied_by " - "is set to {}".format(req.satisfied_by) + f"is set to {req.satisfied_by}" ) logger.info( "Requirement %s: %s (%s)", skip_reason, req, req.satisfied_by.version diff --git a/.venv/Lib/site-packages/pip/_internal/pyproject.py b/.venv/Lib/site-packages/pip/_internal/pyproject.py index eb8e12b..8de36b8 100644 --- a/.venv/Lib/site-packages/pip/_internal/pyproject.py +++ b/.venv/Lib/site-packages/pip/_internal/pyproject.py @@ -123,7 +123,7 @@ def load_pyproject_toml( # a version of setuptools that supports that backend. build_system = { - "requires": ["setuptools>=40.8.0", "wheel"], + "requires": ["setuptools>=40.8.0"], "build-backend": "setuptools.build_meta:__legacy__", } diff --git a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc index f10afcf..eac818d 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc index 9d1417d..8f63298 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc index 94ad84b..1a4adcc 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc index db5c055..7eeade0 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc index d56857f..c2d708d 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc index 3726ea8..694c9b2 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/req/constructors.py b/.venv/Lib/site-packages/pip/_internal/req/constructors.py index c5ca2d8..7e2d0e5 100644 --- a/.venv/Lib/site-packages/pip/_internal/req/constructors.py +++ b/.venv/Lib/site-packages/pip/_internal/req/constructors.py @@ -8,10 +8,11 @@ InstallRequirement. """ +import copy import logging import os import re -from typing import Dict, List, Optional, Set, Tuple, Union +from typing import Collection, Dict, List, Optional, Set, Tuple, Union from pip._vendor.packaging.markers import Marker from pip._vendor.packaging.requirements import InvalidRequirement, Requirement @@ -57,6 +58,31 @@ def convert_extras(extras: Optional[str]) -> Set[str]: return get_requirement("placeholder" + extras.lower()).extras +def _set_requirement_extras(req: Requirement, new_extras: Set[str]) -> Requirement: + """ + Returns a new requirement based on the given one, with the supplied extras. If the + given requirement already has extras those are replaced (or dropped if no new extras + are given). + """ + match: Optional[re.Match[str]] = re.fullmatch( + # see https://peps.python.org/pep-0508/#complete-grammar + r"([\w\t .-]+)(\[[^\]]*\])?(.*)", + str(req), + flags=re.ASCII, + ) + # ireq.req is a valid requirement so the regex should always match + assert ( + match is not None + ), f"regex match on requirement {req} failed, this should never happen" + pre: Optional[str] = match.group(1) + post: Optional[str] = match.group(3) + assert ( + pre is not None and post is not None + ), f"regex group selection for requirement {req} failed, this should never happen" + extras: str = "[%s]" % ",".join(sorted(new_extras)) if new_extras else "" + return Requirement(f"{pre}{extras}{post}") + + def parse_editable(editable_req: str) -> Tuple[Optional[str], str, Set[str]]: """Parses an editable requirement into: - a requirement name @@ -436,7 +462,7 @@ def install_req_from_req_string( raise InstallationError( "Packages installed from PyPI cannot depend on packages " "which are not also hosted on PyPI.\n" - "{} depends on {} ".format(comes_from.name, req) + f"{comes_from.name} depends on {req} " ) return InstallRequirement( @@ -504,3 +530,47 @@ def install_req_from_link_and_ireq( config_settings=ireq.config_settings, user_supplied=ireq.user_supplied, ) + + +def install_req_drop_extras(ireq: InstallRequirement) -> InstallRequirement: + """ + Creates a new InstallationRequirement using the given template but without + any extras. Sets the original requirement as the new one's parent + (comes_from). + """ + return InstallRequirement( + req=( + _set_requirement_extras(ireq.req, set()) if ireq.req is not None else None + ), + comes_from=ireq, + editable=ireq.editable, + link=ireq.link, + markers=ireq.markers, + use_pep517=ireq.use_pep517, + isolated=ireq.isolated, + global_options=ireq.global_options, + hash_options=ireq.hash_options, + constraint=ireq.constraint, + extras=[], + config_settings=ireq.config_settings, + user_supplied=ireq.user_supplied, + permit_editable_wheels=ireq.permit_editable_wheels, + ) + + +def install_req_extend_extras( + ireq: InstallRequirement, + extras: Collection[str], +) -> InstallRequirement: + """ + Returns a copy of an installation requirement with some additional extras. + Makes a shallow copy of the ireq object. + """ + result = copy.copy(ireq) + result.extras = {*ireq.extras, *extras} + result.req = ( + _set_requirement_extras(ireq.req, result.extras) + if ireq.req is not None + else None + ) + return result diff --git a/.venv/Lib/site-packages/pip/_internal/req/req_file.py b/.venv/Lib/site-packages/pip/_internal/req/req_file.py index f717c1c..1ef3d5e 100644 --- a/.venv/Lib/site-packages/pip/_internal/req/req_file.py +++ b/.venv/Lib/site-packages/pip/_internal/req/req_file.py @@ -75,8 +75,16 @@ cmdoptions.config_settings, ] +SUPPORTED_OPTIONS_EDITABLE_REQ: List[Callable[..., optparse.Option]] = [ + cmdoptions.config_settings, +] + + # the 'dest' string values SUPPORTED_OPTIONS_REQ_DEST = [str(o().dest) for o in SUPPORTED_OPTIONS_REQ] +SUPPORTED_OPTIONS_EDITABLE_REQ_DEST = [ + str(o().dest) for o in SUPPORTED_OPTIONS_EDITABLE_REQ +] logger = logging.getLogger(__name__) @@ -178,31 +186,25 @@ def handle_requirement_line( assert line.is_requirement + # get the options that apply to requirements if line.is_editable: - # For editable requirements, we don't support per-requirement - # options, so just return the parsed requirement. - return ParsedRequirement( - requirement=line.requirement, - is_editable=line.is_editable, - comes_from=line_comes_from, - constraint=line.constraint, - ) + supported_dest = SUPPORTED_OPTIONS_EDITABLE_REQ_DEST else: - # get the options that apply to requirements - req_options = {} - for dest in SUPPORTED_OPTIONS_REQ_DEST: - if dest in line.opts.__dict__ and line.opts.__dict__[dest]: - req_options[dest] = line.opts.__dict__[dest] - - line_source = f"line {line.lineno} of {line.filename}" - return ParsedRequirement( - requirement=line.requirement, - is_editable=line.is_editable, - comes_from=line_comes_from, - constraint=line.constraint, - options=req_options, - line_source=line_source, - ) + supported_dest = SUPPORTED_OPTIONS_REQ_DEST + req_options = {} + for dest in supported_dest: + if dest in line.opts.__dict__ and line.opts.__dict__[dest]: + req_options[dest] = line.opts.__dict__[dest] + + line_source = f"line {line.lineno} of {line.filename}" + return ParsedRequirement( + requirement=line.requirement, + is_editable=line.is_editable, + comes_from=line_comes_from, + constraint=line.constraint, + options=req_options, + line_source=line_source, + ) def handle_option_line( diff --git a/.venv/Lib/site-packages/pip/_internal/req/req_install.py b/.venv/Lib/site-packages/pip/_internal/req/req_install.py index 1f47971..a65611c 100644 --- a/.venv/Lib/site-packages/pip/_internal/req/req_install.py +++ b/.venv/Lib/site-packages/pip/_internal/req/req_install.py @@ -1,6 +1,3 @@ -# The following comment should be removed at some point in the future. -# mypy: strict-optional=False - import functools import logging import os @@ -9,6 +6,7 @@ import uuid import zipfile from optparse import Values +from pathlib import Path from typing import Any, Collection, Dict, Iterable, List, Optional, Sequence, Union from pip._vendor.packaging.markers import Marker @@ -20,7 +18,7 @@ from pip._vendor.pyproject_hooks import BuildBackendHookCaller from pip._internal.build_env import BuildEnvironment, NoOpBuildEnvironment -from pip._internal.exceptions import InstallationError +from pip._internal.exceptions import InstallationError, PreviousBuildDirError from pip._internal.locations import get_scheme from pip._internal.metadata import ( BaseDistribution, @@ -50,11 +48,14 @@ backup_dir, display_path, hide_url, + is_installable_dir, + redact_auth_from_requirement, redact_auth_from_url, ) from pip._internal.utils.packaging import safe_extra from pip._internal.utils.subprocess import runner_with_spinner_message from pip._internal.utils.temp_dir import TempDirectory, tempdir_kinds +from pip._internal.utils.unpacking import unpack_file from pip._internal.utils.virtualenv import running_under_virtualenv from pip._internal.vcs import vcs @@ -128,7 +129,7 @@ def __init__( if extras: self.extras = extras elif req: - self.extras = {safe_extra(extra) for extra in req.extras} + self.extras = req.extras else: self.extras = set() if markers is None and req: @@ -180,14 +181,27 @@ def __init__( # but after loading this flag should be treated as read only. self.use_pep517 = use_pep517 + # If config settings are provided, enforce PEP 517. + if self.config_settings: + if self.use_pep517 is False: + logger.warning( + "--no-use-pep517 ignored for %s " + "because --config-settings are specified.", + self, + ) + self.use_pep517 = True + # This requirement needs more preparation before it can be built self.needs_more_preparation = False + # This requirement needs to be unpacked before it can be installed. + self._archive_source: Optional[Path] = None + def __str__(self) -> str: if self.req: - s = str(self.req) + s = redact_auth_from_requirement(self.req) if self.link: - s += " from {}".format(redact_auth_from_url(self.link.url)) + s += f" from {redact_auth_from_url(self.link.url)}" elif self.link: s = redact_auth_from_url(self.link.url) else: @@ -217,7 +231,7 @@ def format_debug(self) -> str: attributes = vars(self) names = sorted(attributes) - state = ("{}={!r}".format(attr, attributes[attr]) for attr in sorted(names)) + state = (f"{attr}={attributes[attr]!r}" for attr in sorted(names)) return "<{name} object: {{{state}}}>".format( name=self.__class__.__name__, state=", ".join(state), @@ -244,6 +258,7 @@ def supports_pyproject_editable(self) -> bool: @property def specifier(self) -> SpecifierSet: + assert self.req is not None return self.req.specifier @property @@ -257,7 +272,8 @@ def is_pinned(self) -> bool: For example, some-package==1.2 is pinned; some-package>1.2 is not. """ - specifiers = self.specifier + assert self.req is not None + specifiers = self.req.specifier return len(specifiers) == 1 and next(iter(specifiers)).operator in {"==", "==="} def match_markers(self, extras_requested: Optional[Iterable[str]] = None) -> bool: @@ -267,7 +283,12 @@ def match_markers(self, extras_requested: Optional[Iterable[str]] = None) -> boo extras_requested = ("",) if self.markers is not None: return any( - self.markers.evaluate({"extra": extra}) for extra in extras_requested + self.markers.evaluate({"extra": extra}) + # TODO: Remove these two variants when packaging is upgraded to + # support the marker comparison logic specified in PEP 685. + or self.markers.evaluate({"extra": safe_extra(extra)}) + or self.markers.evaluate({"extra": canonicalize_name(extra)}) + for extra in extras_requested ) else: return True @@ -305,6 +326,7 @@ def hashes(self, trust_internet: bool = True) -> Hashes: else: link = None if link and link.hash: + assert link.hash_name is not None good_hashes.setdefault(link.hash_name, []).append(link.hash) return Hashes(good_hashes) @@ -314,6 +336,7 @@ def from_path(self) -> Optional[str]: return None s = str(self.req) if self.comes_from: + comes_from: Optional[str] if isinstance(self.comes_from, str): comes_from = self.comes_from else: @@ -345,7 +368,7 @@ def ensure_build_location( # When parallel builds are enabled, add a UUID to the build directory # name so multiple builds do not interfere with each other. - dir_name: str = canonicalize_name(self.name) + dir_name: str = canonicalize_name(self.req.name) if parallel_builds: dir_name = f"{dir_name}_{uuid.uuid4().hex}" @@ -388,6 +411,7 @@ def _set_requirement(self) -> None: ) def warn_on_mismatching_name(self) -> None: + assert self.req is not None metadata_name = canonicalize_name(self.metadata["Name"]) if canonicalize_name(self.req.name) == metadata_name: # Everything is fine. @@ -457,6 +481,7 @@ def is_wheel_from_cache(self) -> bool: # Things valid for sdists @property def unpacked_source_directory(self) -> str: + assert self.source_dir, f"No source dir for {self}" return os.path.join( self.source_dir, self.link and self.link.subdirectory_fragment or "" ) @@ -493,15 +518,7 @@ def load_pyproject_toml(self) -> None: ) if pyproject_toml_data is None: - if self.config_settings: - deprecated( - reason=f"Config settings are ignored for project {self}.", - replacement=( - "to use --use-pep517 or add a " - "pyproject.toml file to the project" - ), - gone_in="23.3", - ) + assert not self.config_settings self.use_pep517 = False return @@ -543,7 +560,7 @@ def prepare_metadata(self) -> None: Under PEP 517 and PEP 660, call the backend hook to prepare the metadata. Under legacy processing, call setup.py egg-info. """ - assert self.source_dir + assert self.source_dir, f"No source dir for {self}" details = self.name or f"from {self.link}" if self.use_pep517: @@ -592,8 +609,10 @@ def get_dist(self) -> BaseDistribution: if self.metadata_directory: return get_directory_distribution(self.metadata_directory) elif self.local_file_path and self.is_wheel: + assert self.req is not None return get_wheel_distribution( - FilesystemWheel(self.local_file_path), canonicalize_name(self.name) + FilesystemWheel(self.local_file_path), + canonicalize_name(self.req.name), ) raise AssertionError( f"InstallRequirement {self} has no metadata directory and no wheel: " @@ -601,9 +620,9 @@ def get_dist(self) -> BaseDistribution: ) def assert_source_matches_version(self) -> None: - assert self.source_dir + assert self.source_dir, f"No source dir for {self}" version = self.metadata["version"] - if self.req.specifier and version not in self.req.specifier: + if self.req and self.req.specifier and version not in self.req.specifier: logger.warning( "Requested %s, but installing version %s", self, @@ -640,6 +659,27 @@ def ensure_has_source_dir( parallel_builds=parallel_builds, ) + def needs_unpacked_archive(self, archive_source: Path) -> None: + assert self._archive_source is None + self._archive_source = archive_source + + def ensure_pristine_source_checkout(self) -> None: + """Ensure the source directory has not yet been built in.""" + assert self.source_dir is not None + if self._archive_source is not None: + unpack_file(str(self._archive_source), self.source_dir) + elif is_installable_dir(self.source_dir): + # If a checkout exists, it's unwise to keep going. + # version inconsistencies are logged later, but do not fail + # the installation. + raise PreviousBuildDirError( + f"pip can't proceed with requirements '{self}' due to a " + f"pre-existing build directory ({self.source_dir}). This is likely " + "due to a previous installation that failed . pip is " + "being responsible and not assuming it can delete this. " + "Please delete it and try again." + ) + # For editable installations def update_editable(self) -> None: if not self.link: @@ -696,9 +736,10 @@ def _clean_zip_name(name: str, prefix: str) -> str: name = name.replace(os.path.sep, "/") return name + assert self.req is not None path = os.path.join(parentdir, path) name = _clean_zip_name(path, rootdir) - return self.name + "/" + name + return self.req.name + "/" + name def archive(self, build_dir: Optional[str]) -> None: """Saves archive to provided build_dir. @@ -715,8 +756,8 @@ def archive(self, build_dir: Optional[str]) -> None: if os.path.exists(archive_path): response = ask_path_exists( - "The file {} exists. (i)gnore, (w)ipe, " - "(b)ackup, (a)bort ".format(display_path(archive_path)), + f"The file {display_path(archive_path)} exists. (i)gnore, (w)ipe, " + "(b)ackup, (a)bort ", ("i", "w", "b", "a"), ) if response == "i": @@ -777,8 +818,9 @@ def install( use_user_site: bool = False, pycompile: bool = True, ) -> None: + assert self.req is not None scheme = get_scheme( - self.name, + self.req.name, user=use_user_site, home=home, root=root, @@ -787,12 +829,19 @@ def install( ) if self.editable and not self.is_wheel: + if self.config_settings: + logger.warning( + "--config-settings ignored for legacy editable install of %s. " + "Consider upgrading to a version of setuptools " + "that supports PEP 660 (>= 64).", + self, + ) install_editable_legacy( global_options=global_options if global_options is not None else [], prefix=prefix, home=home, use_user_site=use_user_site, - name=self.name, + name=self.req.name, setup_py_path=self.setup_py_path, isolated=self.isolated, build_env=self.build_env, @@ -805,7 +854,7 @@ def install( assert self.local_file_path install_wheel( - self.name, + self.req.name, self.local_file_path, scheme=scheme, req_description=str(self.req), @@ -865,7 +914,7 @@ def check_legacy_setup_py_options( reason="--build-option and --global-option are deprecated.", issue=11859, replacement="to use --config-settings", - gone_in="23.3", + gone_in="24.2", ) logger.warning( "Implying --no-binary=:all: due to the presence of " diff --git a/.venv/Lib/site-packages/pip/_internal/req/req_set.py b/.venv/Lib/site-packages/pip/_internal/req/req_set.py index cff6760..bf36114 100644 --- a/.venv/Lib/site-packages/pip/_internal/req/req_set.py +++ b/.venv/Lib/site-packages/pip/_internal/req/req_set.py @@ -99,7 +99,7 @@ def warn_legacy_versions_and_specifiers(self) -> None: "or contact the package author to fix the version number" ), issue=12063, - gone_in="23.3", + gone_in="24.1", ) for dep in req.get_dist().iter_dependencies(): if any(isinstance(spec, LegacySpecifier) for spec in dep.specifier): @@ -115,5 +115,5 @@ def warn_legacy_versions_and_specifiers(self) -> None: "or contact the package author to fix the version number" ), issue=12063, - gone_in="23.3", + gone_in="24.1", ) diff --git a/.venv/Lib/site-packages/pip/_internal/req/req_uninstall.py b/.venv/Lib/site-packages/pip/_internal/req/req_uninstall.py index ad5178e..707fde1 100644 --- a/.venv/Lib/site-packages/pip/_internal/req/req_uninstall.py +++ b/.venv/Lib/site-packages/pip/_internal/req/req_uninstall.py @@ -71,16 +71,16 @@ def uninstallation_paths(dist: BaseDistribution) -> Generator[str, None, None]: entries = dist.iter_declared_entries() if entries is None: - msg = "Cannot uninstall {dist}, RECORD file not found.".format(dist=dist) + msg = f"Cannot uninstall {dist}, RECORD file not found." installer = dist.installer if not installer or installer == "pip": - dep = "{}=={}".format(dist.raw_name, dist.version) + dep = f"{dist.raw_name}=={dist.version}" msg += ( " You might be able to recover from this via: " - "'pip install --force-reinstall --no-deps {}'.".format(dep) + f"'pip install --force-reinstall --no-deps {dep}'." ) else: - msg += " Hint: The package was installed by {}.".format(installer) + msg += f" Hint: The package was installed by {installer}." raise UninstallationError(msg) for entry in entries: @@ -172,8 +172,7 @@ def compress_for_output_listing(paths: Iterable[str]) -> Tuple[Set[str], Set[str folders.add(os.path.dirname(path)) files.add(path) - # probably this one https://github.com/python/mypy/issues/390 - _normcased_files = set(map(os.path.normcase, files)) # type: ignore + _normcased_files = set(map(os.path.normcase, files)) folders = compact(folders) @@ -274,7 +273,7 @@ def stash(self, path: str) -> str: def commit(self) -> None: """Commits the uninstall by removing stashed files.""" - for _, save_dir in self._save_dirs.items(): + for save_dir in self._save_dirs.values(): save_dir.cleanup() self._moves = [] self._save_dirs = {} diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc index 2853ce6..f489e59 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc index 9cfd7f8..1fa2ba2 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc index e6662ec..b4ebb60 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc index d17e592..52cca2b 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py b/.venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py index b17b7e4..5ddb848 100644 --- a/.venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py +++ b/.venv/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py @@ -231,9 +231,7 @@ def _add_requirement_to_set( tags = compatibility_tags.get_supported() if requirement_set.check_supported_wheels and not wheel.supported(tags): raise InstallationError( - "{} is not a supported wheel on this platform.".format( - wheel.filename - ) + f"{wheel.filename} is not a supported wheel on this platform." ) # This next bit is really a sanity check. @@ -287,9 +285,9 @@ def _add_requirement_to_set( ) if does_not_satisfy_constraint: raise InstallationError( - "Could not satisfy constraints for '{}': " + f"Could not satisfy constraints for '{install_req.name}': " "installation from path or url cannot be " - "constrained to a version".format(install_req.name) + "constrained to a version" ) # If we're now installing a constraint, mark the existing # object for real installation. @@ -398,9 +396,9 @@ def _find_requirement_link(self, req: InstallRequirement) -> Optional[Link]: # "UnicodeEncodeError: 'ascii' codec can't encode character" # in Python 2 when the reason contains non-ascii characters. "The candidate selected for download or install is a " - "yanked version: {candidate}\n" - "Reason for being yanked: {reason}" - ).format(candidate=best_candidate, reason=reason) + f"yanked version: {best_candidate}\n" + f"Reason for being yanked: {reason}" + ) logger.warning(msg) return link diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc index 7eba3ca..d330d4c 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc index b29cf82..0139f0c 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc index 59d86af..dd956bf 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc index c56f948..373e161 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc index 83ca796..b939977 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc index d675ae2..f05b5fd 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc index 617028d..e8161d5 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc index 90acb94..e5e888f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc index ceea3fc..53d7224 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py index b206692..9c0ef5c 100644 --- a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py +++ b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py @@ -1,7 +1,7 @@ from typing import FrozenSet, Iterable, Optional, Tuple, Union from pip._vendor.packaging.specifiers import SpecifierSet -from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._vendor.packaging.utils import NormalizedName from pip._vendor.packaging.version import LegacyVersion, Version from pip._internal.models.link import Link, links_equivalent @@ -12,11 +12,11 @@ CandidateVersion = Union[LegacyVersion, Version] -def format_name(project: str, extras: FrozenSet[str]) -> str: +def format_name(project: NormalizedName, extras: FrozenSet[NormalizedName]) -> str: if not extras: return project - canonical_extras = sorted(canonicalize_name(e) for e in extras) - return "{}[{}]".format(project, ",".join(canonical_extras)) + extras_expr = ",".join(sorted(extras)) + return f"{project}[{extras_expr}]" class Constraint: diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py index de04e1d..4125cda 100644 --- a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py +++ b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py @@ -159,10 +159,7 @@ def __str__(self) -> str: return f"{self.name} {self.version}" def __repr__(self) -> str: - return "{class_name}({link!r})".format( - class_name=self.__class__.__name__, - link=str(self._link), - ) + return f"{self.__class__.__name__}({str(self._link)!r})" def __hash__(self) -> int: return hash((self.__class__, self._link)) @@ -240,7 +237,7 @@ def _prepare(self) -> BaseDistribution: def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: requires = self.dist.iter_dependencies() if with_requires else () for r in requires: - yield self._factory.make_requirement_from_spec(str(r), self._ireq) + yield from self._factory.make_requirements_from_spec(str(r), self._ireq) yield self._factory.make_requires_python_requirement(self.dist.requires_python) def get_install_requirement(self) -> Optional[InstallRequirement]: @@ -354,10 +351,7 @@ def __str__(self) -> str: return str(self.dist) def __repr__(self) -> str: - return "{class_name}({distribution!r})".format( - class_name=self.__class__.__name__, - distribution=self.dist, - ) + return f"{self.__class__.__name__}({self.dist!r})" def __hash__(self) -> int: return hash((self.__class__, self.name, self.version)) @@ -392,7 +386,7 @@ def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requiremen if not with_requires: return for r in self.dist.iter_dependencies(): - yield self._factory.make_requirement_from_spec(str(r), self._ireq) + yield from self._factory.make_requirements_from_spec(str(r), self._ireq) def get_install_requirement(self) -> Optional[InstallRequirement]: return None @@ -427,20 +421,35 @@ def __init__( self, base: BaseCandidate, extras: FrozenSet[str], + *, + comes_from: Optional[InstallRequirement] = None, ) -> None: + """ + :param comes_from: the InstallRequirement that led to this candidate if it + differs from the base's InstallRequirement. This will often be the + case in the sense that this candidate's requirement has the extras + while the base's does not. Unlike the InstallRequirement backed + candidates, this requirement is used solely for reporting purposes, + it does not do any leg work. + """ self.base = base - self.extras = extras + self.extras = frozenset(canonicalize_name(e) for e in extras) + # If any extras are requested in their non-normalized forms, keep track + # of their raw values. This is needed when we look up dependencies + # since PEP 685 has not been implemented for marker-matching, and using + # the non-normalized extra for lookup ensures the user can select a + # non-normalized extra in a package with its non-normalized form. + # TODO: Remove this attribute when packaging is upgraded to support the + # marker comparison logic specified in PEP 685. + self._unnormalized_extras = extras.difference(self.extras) + self._comes_from = comes_from if comes_from is not None else self.base._ireq def __str__(self) -> str: name, rest = str(self.base).split(" ", 1) return "{}[{}] {}".format(name, ",".join(self.extras), rest) def __repr__(self) -> str: - return "{class_name}(base={base!r}, extras={extras!r})".format( - class_name=self.__class__.__name__, - base=self.base, - extras=self.extras, - ) + return f"{self.__class__.__name__}(base={self.base!r}, extras={self.extras!r})" def __hash__(self) -> int: return hash((self.base, self.extras)) @@ -480,6 +489,50 @@ def is_editable(self) -> bool: def source_link(self) -> Optional[Link]: return self.base.source_link + def _warn_invalid_extras( + self, + requested: FrozenSet[str], + valid: FrozenSet[str], + ) -> None: + """Emit warnings for invalid extras being requested. + + This emits a warning for each requested extra that is not in the + candidate's ``Provides-Extra`` list. + """ + invalid_extras_to_warn = frozenset( + extra + for extra in requested + if extra not in valid + # If an extra is requested in an unnormalized form, skip warning + # about the normalized form being missing. + and extra in self.extras + ) + if not invalid_extras_to_warn: + return + for extra in sorted(invalid_extras_to_warn): + logger.warning( + "%s %s does not provide the extra '%s'", + self.base.name, + self.version, + extra, + ) + + def _calculate_valid_requested_extras(self) -> FrozenSet[str]: + """Get a list of valid extras requested by this candidate. + + The user (or upstream dependant) may have specified extras that the + candidate doesn't support. Any unsupported extras are dropped, and each + cause a warning to be logged here. + """ + requested_extras = self.extras.union(self._unnormalized_extras) + valid_extras = frozenset( + extra + for extra in requested_extras + if self.base.dist.is_extra_provided(extra) + ) + self._warn_invalid_extras(requested_extras, valid_extras) + return valid_extras + def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requirement]]: factory = self.base._factory @@ -489,24 +542,13 @@ def iter_dependencies(self, with_requires: bool) -> Iterable[Optional[Requiremen if not with_requires: return - # The user may have specified extras that the candidate doesn't - # support. We ignore any unsupported extras here. - valid_extras = self.extras.intersection(self.base.dist.iter_provided_extras()) - invalid_extras = self.extras.difference(self.base.dist.iter_provided_extras()) - for extra in sorted(invalid_extras): - logger.warning( - "%s %s does not provide the extra '%s'", - self.base.name, - self.version, - extra, - ) - + valid_extras = self._calculate_valid_requested_extras() for r in self.base.dist.iter_dependencies(valid_extras): - requirement = factory.make_requirement_from_spec( - str(r), self.base._ireq, valid_extras + yield from factory.make_requirements_from_spec( + str(r), + self._comes_from, + valid_extras, ) - if requirement: - yield requirement def get_install_requirement(self) -> Optional[InstallRequirement]: # We don't return anything here, because we always diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py index 0331297..4adeb43 100644 --- a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py +++ b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py @@ -36,7 +36,10 @@ from pip._internal.models.link import Link from pip._internal.models.wheel import Wheel from pip._internal.operations.prepare import RequirementPreparer -from pip._internal.req.constructors import install_req_from_link_and_ireq +from pip._internal.req.constructors import ( + install_req_drop_extras, + install_req_from_link_and_ireq, +) from pip._internal.req.req_install import ( InstallRequirement, check_invalid_constraint_type, @@ -62,6 +65,7 @@ ExplicitRequirement, RequiresPythonRequirement, SpecifierRequirement, + SpecifierWithoutExtrasRequirement, UnsatisfiableRequirement, ) @@ -112,7 +116,7 @@ def __init__( self._editable_candidate_cache: Cache[EditableCandidate] = {} self._installed_candidate_cache: Dict[str, AlreadyInstalledCandidate] = {} self._extras_candidate_cache: Dict[ - Tuple[int, FrozenSet[str]], ExtrasCandidate + Tuple[int, FrozenSet[NormalizedName]], ExtrasCandidate ] = {} if not ignore_installed: @@ -132,19 +136,23 @@ def _fail_if_link_is_unsupported_wheel(self, link: Link) -> None: if not link.is_wheel: return wheel = Wheel(link.filename) - if wheel.supported(self._finder.target_python.get_tags()): + if wheel.supported(self._finder.target_python.get_unsorted_tags()): return msg = f"{link.filename} is not a supported wheel on this platform." raise UnsupportedWheel(msg) def _make_extras_candidate( - self, base: BaseCandidate, extras: FrozenSet[str] + self, + base: BaseCandidate, + extras: FrozenSet[str], + *, + comes_from: Optional[InstallRequirement] = None, ) -> ExtrasCandidate: - cache_key = (id(base), extras) + cache_key = (id(base), frozenset(canonicalize_name(e) for e in extras)) try: candidate = self._extras_candidate_cache[cache_key] except KeyError: - candidate = ExtrasCandidate(base, extras) + candidate = ExtrasCandidate(base, extras, comes_from=comes_from) self._extras_candidate_cache[cache_key] = candidate return candidate @@ -161,7 +169,7 @@ def _make_candidate_from_dist( self._installed_candidate_cache[dist.canonical_name] = base if not extras: return base - return self._make_extras_candidate(base, extras) + return self._make_extras_candidate(base, extras, comes_from=template) def _make_candidate_from_link( self, @@ -171,6 +179,20 @@ def _make_candidate_from_link( name: Optional[NormalizedName], version: Optional[CandidateVersion], ) -> Optional[Candidate]: + base: Optional[BaseCandidate] = self._make_base_candidate_from_link( + link, template, name, version + ) + if not extras or base is None: + return base + return self._make_extras_candidate(base, extras, comes_from=template) + + def _make_base_candidate_from_link( + self, + link: Link, + template: InstallRequirement, + name: Optional[NormalizedName], + version: Optional[CandidateVersion], + ) -> Optional[BaseCandidate]: # TODO: Check already installed candidate, and use it if the link and # editable flag match. @@ -199,7 +221,7 @@ def _make_candidate_from_link( self._build_failures[link] = e return None - base: BaseCandidate = self._editable_candidate_cache[link] + return self._editable_candidate_cache[link] else: if link not in self._link_candidate_cache: try: @@ -219,11 +241,7 @@ def _make_candidate_from_link( ) self._build_failures[link] = e return None - base = self._link_candidate_cache[link] - - if not extras: - return base - return self._make_extras_candidate(base, extras) + return self._link_candidate_cache[link] def _iter_found_candidates( self, @@ -357,9 +375,8 @@ def _iter_candidates_from_constraints( """ for link in constraint.links: self._fail_if_link_is_unsupported_wheel(link) - candidate = self._make_candidate_from_link( + candidate = self._make_base_candidate_from_link( link, - extras=frozenset(), template=install_req_from_link_and_ireq(link, template), name=canonicalize_name(identifier), version=None, @@ -385,16 +402,21 @@ def find_candidates( if ireq is not None: ireqs.append(ireq) - # If the current identifier contains extras, add explicit candidates - # from entries from extra-less identifier. + # If the current identifier contains extras, add requires and explicit + # candidates from entries from extra-less identifier. with contextlib.suppress(InvalidRequirement): parsed_requirement = get_requirement(identifier) - explicit_candidates.update( - self._iter_explicit_candidates_from_base( - requirements.get(parsed_requirement.name, ()), - frozenset(parsed_requirement.extras), - ), - ) + if parsed_requirement.name != identifier: + explicit_candidates.update( + self._iter_explicit_candidates_from_base( + requirements.get(parsed_requirement.name, ()), + frozenset(parsed_requirement.extras), + ), + ) + for req in requirements.get(parsed_requirement.name, []): + _, ireq = req.get_candidate_lookup() + if ireq is not None: + ireqs.append(ireq) # Add explicit candidates from constraints. We only do this if there are # known ireqs, which represent requirements not already explicit. If @@ -437,37 +459,58 @@ def find_candidates( and all(req.is_satisfied_by(c) for req in requirements[identifier]) ) - def _make_requirement_from_install_req( + def _make_requirements_from_install_req( self, ireq: InstallRequirement, requested_extras: Iterable[str] - ) -> Optional[Requirement]: + ) -> Iterator[Requirement]: + """ + Returns requirement objects associated with the given InstallRequirement. In + most cases this will be a single object but the following special cases exist: + - the InstallRequirement has markers that do not apply -> result is empty + - the InstallRequirement has both a constraint (or link) and extras + -> result is split in two requirement objects: one with the constraint + (or link) and one with the extra. This allows centralized constraint + handling for the base, resulting in fewer candidate rejections. + """ if not ireq.match_markers(requested_extras): logger.info( "Ignoring %s: markers '%s' don't match your environment", ireq.name, ireq.markers, ) - return None - if not ireq.link: - return SpecifierRequirement(ireq) - self._fail_if_link_is_unsupported_wheel(ireq.link) - cand = self._make_candidate_from_link( - ireq.link, - extras=frozenset(ireq.extras), - template=ireq, - name=canonicalize_name(ireq.name) if ireq.name else None, - version=None, - ) - if cand is None: - # There's no way we can satisfy a URL requirement if the underlying - # candidate fails to build. An unnamed URL must be user-supplied, so - # we fail eagerly. If the URL is named, an unsatisfiable requirement - # can make the resolver do the right thing, either backtrack (and - # maybe find some other requirement that's buildable) or raise a - # ResolutionImpossible eventually. - if not ireq.name: - raise self._build_failures[ireq.link] - return UnsatisfiableRequirement(canonicalize_name(ireq.name)) - return self.make_requirement_from_candidate(cand) + elif not ireq.link: + if ireq.extras and ireq.req is not None and ireq.req.specifier: + yield SpecifierWithoutExtrasRequirement(ireq) + yield SpecifierRequirement(ireq) + else: + self._fail_if_link_is_unsupported_wheel(ireq.link) + # Always make the link candidate for the base requirement to make it + # available to `find_candidates` for explicit candidate lookup for any + # set of extras. + # The extras are required separately via a second requirement. + cand = self._make_base_candidate_from_link( + ireq.link, + template=install_req_drop_extras(ireq) if ireq.extras else ireq, + name=canonicalize_name(ireq.name) if ireq.name else None, + version=None, + ) + if cand is None: + # There's no way we can satisfy a URL requirement if the underlying + # candidate fails to build. An unnamed URL must be user-supplied, so + # we fail eagerly. If the URL is named, an unsatisfiable requirement + # can make the resolver do the right thing, either backtrack (and + # maybe find some other requirement that's buildable) or raise a + # ResolutionImpossible eventually. + if not ireq.name: + raise self._build_failures[ireq.link] + yield UnsatisfiableRequirement(canonicalize_name(ireq.name)) + else: + # require the base from the link + yield self.make_requirement_from_candidate(cand) + if ireq.extras: + # require the extras on top of the base candidate + yield self.make_requirement_from_candidate( + self._make_extras_candidate(cand, frozenset(ireq.extras)) + ) def collect_root_requirements( self, root_ireqs: List[InstallRequirement] @@ -488,15 +531,27 @@ def collect_root_requirements( else: collected.constraints[name] = Constraint.from_ireq(ireq) else: - req = self._make_requirement_from_install_req( - ireq, - requested_extras=(), + reqs = list( + self._make_requirements_from_install_req( + ireq, + requested_extras=(), + ) ) - if req is None: + if not reqs: continue - if ireq.user_supplied and req.name not in collected.user_requested: - collected.user_requested[req.name] = i - collected.requirements.append(req) + template = reqs[0] + if ireq.user_supplied and template.name not in collected.user_requested: + collected.user_requested[template.name] = i + collected.requirements.extend(reqs) + # Put requirements with extras at the end of the root requires. This does not + # affect resolvelib's picking preference but it does affect its initial criteria + # population: by putting extras at the end we enable the candidate finder to + # present resolvelib with a smaller set of candidates to resolvelib, already + # taking into account any non-transient constraints on the associated base. This + # means resolvelib will have fewer candidates to visit and reject. + # Python's list sort is stable, meaning relative order is kept for objects with + # the same key. + collected.requirements.sort(key=lambda r: r.name != r.project_name) return collected def make_requirement_from_candidate( @@ -504,14 +559,23 @@ def make_requirement_from_candidate( ) -> ExplicitRequirement: return ExplicitRequirement(candidate) - def make_requirement_from_spec( + def make_requirements_from_spec( self, specifier: str, comes_from: Optional[InstallRequirement], requested_extras: Iterable[str] = (), - ) -> Optional[Requirement]: + ) -> Iterator[Requirement]: + """ + Returns requirement objects associated with the given specifier. In most cases + this will be a single object but the following special cases exist: + - the specifier has markers that do not apply -> result is empty + - the specifier has both a constraint and extras -> result is split + in two requirement objects: one with the constraint and one with the + extra. This allows centralized constraint handling for the base, + resulting in fewer candidate rejections. + """ ireq = self._make_install_req_from_spec(specifier, comes_from) - return self._make_requirement_from_install_req(ireq, requested_extras) + return self._make_requirements_from_install_req(ireq, requested_extras) def make_requires_python_requirement( self, @@ -603,8 +667,26 @@ def _report_single_requirement_conflict( cands = self._finder.find_all_candidates(req.project_name) skipped_by_requires_python = self._finder.requires_python_skipped_reasons() - versions = [str(v) for v in sorted({c.version for c in cands})] + versions_set: Set[CandidateVersion] = set() + yanked_versions_set: Set[CandidateVersion] = set() + for c in cands: + is_yanked = c.link.is_yanked if c.link else False + if is_yanked: + yanked_versions_set.add(c.version) + else: + versions_set.add(c.version) + + versions = [str(v) for v in sorted(versions_set)] + yanked_versions = [str(v) for v in sorted(yanked_versions_set)] + + if yanked_versions: + # Saying "version X is yanked" isn't entirely accurate. + # https://github.com/pypa/pip/issues/11745#issuecomment-1402805842 + logger.critical( + "Ignored the following yanked versions: %s", + ", ".join(yanked_versions) or "none", + ) if skipped_by_requires_python: logger.critical( "Ignored the following versions that require a different python " @@ -692,8 +774,8 @@ def describe_trigger(parent: Candidate) -> str: info = "the requested packages" msg = ( - "Cannot install {} because these package versions " - "have conflicting dependencies.".format(info) + f"Cannot install {info} because these package versions " + "have conflicting dependencies." ) logger.critical(msg) msg = "\nThe conflict is caused by:" diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py index 06addc0..4af4a9f 100644 --- a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py +++ b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py @@ -1,6 +1,7 @@ from pip._vendor.packaging.specifiers import SpecifierSet from pip._vendor.packaging.utils import NormalizedName, canonicalize_name +from pip._internal.req.constructors import install_req_drop_extras from pip._internal.req.req_install import InstallRequirement from .base import Candidate, CandidateLookup, Requirement, format_name @@ -14,10 +15,7 @@ def __str__(self) -> str: return str(self.candidate) def __repr__(self) -> str: - return "{class_name}({candidate!r})".format( - class_name=self.__class__.__name__, - candidate=self.candidate, - ) + return f"{self.__class__.__name__}({self.candidate!r})" @property def project_name(self) -> NormalizedName: @@ -43,16 +41,13 @@ class SpecifierRequirement(Requirement): def __init__(self, ireq: InstallRequirement) -> None: assert ireq.link is None, "This is a link, not a specifier" self._ireq = ireq - self._extras = frozenset(ireq.extras) + self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras) def __str__(self) -> str: return str(self._ireq.req) def __repr__(self) -> str: - return "{class_name}({requirement!r})".format( - class_name=self.__class__.__name__, - requirement=str(self._ireq.req), - ) + return f"{self.__class__.__name__}({str(self._ireq.req)!r})" @property def project_name(self) -> NormalizedName: @@ -92,6 +87,18 @@ def is_satisfied_by(self, candidate: Candidate) -> bool: return spec.contains(candidate.version, prereleases=True) +class SpecifierWithoutExtrasRequirement(SpecifierRequirement): + """ + Requirement backed by an install requirement on a base package. + Trims extras from its install requirement if there are any. + """ + + def __init__(self, ireq: InstallRequirement) -> None: + assert ireq.link is None, "This is a link, not a specifier" + self._ireq = install_req_drop_extras(ireq) + self._extras = frozenset(canonicalize_name(e) for e in self._ireq.extras) + + class RequiresPythonRequirement(Requirement): """A requirement representing Requires-Python metadata.""" @@ -103,10 +110,7 @@ def __str__(self) -> str: return f"Python {self.specifier}" def __repr__(self) -> str: - return "{class_name}({specifier!r})".format( - class_name=self.__class__.__name__, - specifier=str(self.specifier), - ) + return f"{self.__class__.__name__}({str(self.specifier)!r})" @property def project_name(self) -> NormalizedName: @@ -142,10 +146,7 @@ def __str__(self) -> str: return f"{self._name} (unavailable)" def __repr__(self) -> str: - return "{class_name}({name!r})".format( - class_name=self.__class__.__name__, - name=str(self._name), - ) + return f"{self.__class__.__name__}({str(self._name)!r})" @property def project_name(self) -> NormalizedName: diff --git a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py index d5b2386..c12beef 100644 --- a/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py +++ b/.venv/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py @@ -1,3 +1,4 @@ +import contextlib import functools import logging import os @@ -11,6 +12,7 @@ from pip._internal.cache import WheelCache from pip._internal.index.package_finder import PackageFinder from pip._internal.operations.prepare import RequirementPreparer +from pip._internal.req.constructors import install_req_extend_extras from pip._internal.req.req_install import InstallRequirement from pip._internal.req.req_set import RequirementSet from pip._internal.resolution.base import BaseResolver, InstallRequirementProvider @@ -19,6 +21,7 @@ PipDebuggingReporter, PipReporter, ) +from pip._internal.utils.packaging import get_requirement from .base import Candidate, Requirement from .factory import Factory @@ -101,9 +104,24 @@ def resolve( raise error from e req_set = RequirementSet(check_supported_wheels=check_supported_wheels) - for candidate in result.mapping.values(): + # process candidates with extras last to ensure their base equivalent is + # already in the req_set if appropriate. + # Python's sort is stable so using a binary key function keeps relative order + # within both subsets. + for candidate in sorted( + result.mapping.values(), key=lambda c: c.name != c.project_name + ): ireq = candidate.get_install_requirement() if ireq is None: + if candidate.name != candidate.project_name: + # extend existing req's extras + with contextlib.suppress(KeyError): + req = req_set.get_requirement(candidate.project_name) + req_set.add_named_requirement( + install_req_extend_extras( + req, get_requirement(candidate.name).extras + ) + ) continue # Check if there is already an installation under the same name, diff --git a/.venv/Lib/site-packages/pip/_internal/self_outdated_check.py b/.venv/Lib/site-packages/pip/_internal/self_outdated_check.py index 41cc42c..0f64ae0 100644 --- a/.venv/Lib/site-packages/pip/_internal/self_outdated_check.py +++ b/.venv/Lib/site-packages/pip/_internal/self_outdated_check.py @@ -28,8 +28,7 @@ from pip._internal.utils.filesystem import adjacent_tmp_file, check_path_owner, replace from pip._internal.utils.misc import ensure_dir -_DATE_FMT = "%Y-%m-%dT%H:%M:%SZ" - +_WEEK = datetime.timedelta(days=7) logger = logging.getLogger(__name__) @@ -40,6 +39,15 @@ def _get_statefile_name(key: str) -> str: return name +def _convert_date(isodate: str) -> datetime.datetime: + """Convert an ISO format string to a date. + + Handles the format 2020-01-22T14:24:01Z (trailing Z) + which is not supported by older versions of fromisoformat. + """ + return datetime.datetime.fromisoformat(isodate.replace("Z", "+00:00")) + + class SelfCheckState: def __init__(self, cache_dir: str) -> None: self._state: Dict[str, Any] = {} @@ -73,12 +81,10 @@ def get(self, current_time: datetime.datetime) -> Optional[str]: if "pypi_version" not in self._state: return None - seven_days_in_seconds = 7 * 24 * 60 * 60 - # Determine if we need to refresh the state - last_check = datetime.datetime.strptime(self._state["last_check"], _DATE_FMT) - seconds_since_last_check = (current_time - last_check).total_seconds() - if seconds_since_last_check > seven_days_in_seconds: + last_check = _convert_date(self._state["last_check"]) + time_since_last_check = current_time - last_check + if time_since_last_check > _WEEK: return None return self._state["pypi_version"] @@ -100,7 +106,7 @@ def set(self, pypi_version: str, current_time: datetime.datetime) -> None: # Include the key so it's easy to tell which pip wrote the # file. "key": self.key, - "last_check": current_time.strftime(_DATE_FMT), + "last_check": current_time.isoformat(), "pypi_version": pypi_version, } @@ -229,14 +235,14 @@ def pip_self_version_check(session: PipSession, options: optparse.Values) -> Non try: upgrade_prompt = _self_version_check_logic( state=SelfCheckState(cache_dir=options.cache_dir), - current_time=datetime.datetime.utcnow(), + current_time=datetime.datetime.now(datetime.timezone.utc), local_version=installed_dist.version, get_remote_version=functools.partial( _get_current_remote_pip_version, session, options ), ) if upgrade_prompt is not None: - logger.warning("[present-rich] %s", upgrade_prompt) + logger.warning("%s", upgrade_prompt, extra={"rich": True}) except Exception: logger.warning("There was an error checking the latest version of pip.") logger.debug("See below for error", exc_info=True) diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc index 9b8b813..c917088 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc index e42c874..aaa825e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_jaraco_text.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc index 3f8e694..37de1ef 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc index 40c5f68..cad1398 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc index 0158427..3ffc819 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc index f228f5e..eba2157 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc index 3b95bc8..42db135 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc index 15188e8..60afb91 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc index 54dc81d..5a017de 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc index 0025a87..b92e771 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc index 59e8cd6..55076c9 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc index 031e9ce..31f918b 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc index 11880a3..9a68dc2 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc index fb497df..9dc3c63 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc index 5f4fe70..8215773 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc index 91c2895..dc2e4ea 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc deleted file mode 100644 index 3e9c76e..0000000 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc index d98028c..84b37e2 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc index 132f03d..050f455 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc index 69a8509..4925170 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc index 3edf27a..679630f 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc index e8ca1ce..7eaee33 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc index 7fe108c..638fc53 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc index 5fc7453..8aae821 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc index ac0f17a..b200459 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc index 57a9ba1..e91c39a 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc index 5abc1de..7a5abb2 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc index 57a9cf1..7d020dc 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/utils/egg_link.py b/.venv/Lib/site-packages/pip/_internal/utils/egg_link.py index eb57ed1..4a384a6 100644 --- a/.venv/Lib/site-packages/pip/_internal/utils/egg_link.py +++ b/.venv/Lib/site-packages/pip/_internal/utils/egg_link.py @@ -15,24 +15,31 @@ ] -def _egg_link_name(raw_name: str) -> str: +def _egg_link_names(raw_name: str) -> List[str]: """ Convert a Name metadata value to a .egg-link name, by applying the same substitution as pkg_resources's safe_name function. Note: we cannot use canonicalize_name because it has a different logic. + + We also look for the raw name (without normalization) as setuptools 69 changed + the way it names .egg-link files (https://github.com/pypa/setuptools/issues/4167). """ - return re.sub("[^A-Za-z0-9.]+", "-", raw_name) + ".egg-link" + return [ + re.sub("[^A-Za-z0-9.]+", "-", raw_name) + ".egg-link", + f"{raw_name}.egg-link", + ] def egg_link_path_from_sys_path(raw_name: str) -> Optional[str]: """ Look for a .egg-link file for project name, by walking sys.path. """ - egg_link_name = _egg_link_name(raw_name) + egg_link_names = _egg_link_names(raw_name) for path_item in sys.path: - egg_link = os.path.join(path_item, egg_link_name) - if os.path.isfile(egg_link): - return egg_link + for egg_link_name in egg_link_names: + egg_link = os.path.join(path_item, egg_link_name) + if os.path.isfile(egg_link): + return egg_link return None @@ -64,9 +71,10 @@ def egg_link_path_from_location(raw_name: str) -> Optional[str]: sites.append(user_site) sites.append(site_packages) - egg_link_name = _egg_link_name(raw_name) + egg_link_names = _egg_link_names(raw_name) for site in sites: - egglink = os.path.join(site, egg_link_name) - if os.path.isfile(egglink): - return egglink + for egg_link_name in egg_link_names: + egglink = os.path.join(site, egg_link_name) + if os.path.isfile(egglink): + return egglink return None diff --git a/.venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py b/.venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py deleted file mode 100644 index 276aa79..0000000 --- a/.venv/Lib/site-packages/pip/_internal/utils/inject_securetransport.py +++ /dev/null @@ -1,35 +0,0 @@ -"""A helper module that injects SecureTransport, on import. - -The import should be done as early as possible, to ensure all requests and -sessions (or whatever) are created after injecting SecureTransport. - -Note that we only do the injection on macOS, when the linked OpenSSL is too -old to handle TLSv1.2. -""" - -import sys - - -def inject_securetransport() -> None: - # Only relevant on macOS - if sys.platform != "darwin": - return - - try: - import ssl - except ImportError: - return - - # Checks for OpenSSL 1.0.1 - if ssl.OPENSSL_VERSION_NUMBER >= 0x1000100F: - return - - try: - from pip._vendor.urllib3.contrib import securetransport - except (ImportError, OSError): - return - - securetransport.inject_into_urllib3() - - -inject_securetransport() diff --git a/.venv/Lib/site-packages/pip/_internal/utils/logging.py b/.venv/Lib/site-packages/pip/_internal/utils/logging.py index c10e1f4..95982df 100644 --- a/.venv/Lib/site-packages/pip/_internal/utils/logging.py +++ b/.venv/Lib/site-packages/pip/_internal/utils/logging.py @@ -155,8 +155,8 @@ def emit(self, record: logging.LogRecord) -> None: # If we are given a diagnostic error to present, present it with indentation. assert isinstance(record.args, tuple) - if record.msg == "[present-rich] %s" and len(record.args) == 1: - rich_renderable = record.args[0] + if getattr(record, "rich", False): + (rich_renderable,) = record.args assert isinstance( rich_renderable, (ConsoleRenderable, RichCast, str) ), f"{rich_renderable} is not rich-console-renderable" diff --git a/.venv/Lib/site-packages/pip/_internal/utils/misc.py b/.venv/Lib/site-packages/pip/_internal/utils/misc.py index bd191c4..1ad3f61 100644 --- a/.venv/Lib/site-packages/pip/_internal/utils/misc.py +++ b/.venv/Lib/site-packages/pip/_internal/utils/misc.py @@ -11,9 +11,11 @@ import sys import sysconfig import urllib.parse +from functools import partial from io import StringIO from itertools import filterfalse, tee, zip_longest -from types import TracebackType +from pathlib import Path +from types import FunctionType, TracebackType from typing import ( Any, BinaryIO, @@ -33,6 +35,7 @@ cast, ) +from pip._vendor.packaging.requirements import Requirement from pip._vendor.pyproject_hooks import BuildBackendHookCaller from pip._vendor.tenacity import retry, stop_after_delay, wait_fixed @@ -66,17 +69,15 @@ ExcInfo = Tuple[Type[BaseException], BaseException, TracebackType] VersionInfo = Tuple[int, int, int] NetlocTuple = Tuple[str, Tuple[Optional[str], Optional[str]]] +OnExc = Callable[[FunctionType, Path, BaseException], Any] +OnErr = Callable[[FunctionType, Path, ExcInfo], Any] def get_pip_version() -> str: pip_pkg_dir = os.path.join(os.path.dirname(__file__), "..", "..") pip_pkg_dir = os.path.abspath(pip_pkg_dir) - return "pip {} from {} (python {})".format( - __version__, - pip_pkg_dir, - get_major_minor_version(), - ) + return f"pip {__version__} from {pip_pkg_dir} (python {get_major_minor_version()})" def normalize_version_info(py_version_info: Tuple[int, ...]) -> Tuple[int, int, int]: @@ -123,33 +124,75 @@ def get_prog() -> str: # Retry every half second for up to 3 seconds # Tenacity raises RetryError by default, explicitly raise the original exception @retry(reraise=True, stop=stop_after_delay(3), wait=wait_fixed(0.5)) -def rmtree(dir: str, ignore_errors: bool = False) -> None: +def rmtree( + dir: str, + ignore_errors: bool = False, + onexc: Optional[OnExc] = None, +) -> None: + if ignore_errors: + onexc = _onerror_ignore + if onexc is None: + onexc = _onerror_reraise + handler: OnErr = partial( + # `[func, path, Union[ExcInfo, BaseException]] -> Any` is equivalent to + # `Union[([func, path, ExcInfo] -> Any), ([func, path, BaseException] -> Any)]`. + cast(Union[OnExc, OnErr], rmtree_errorhandler), + onexc=onexc, + ) if sys.version_info >= (3, 12): - shutil.rmtree(dir, ignore_errors=ignore_errors, onexc=rmtree_errorhandler) + # See https://docs.python.org/3.12/whatsnew/3.12.html#shutil. + shutil.rmtree(dir, onexc=handler) # type: ignore else: - shutil.rmtree(dir, ignore_errors=ignore_errors, onerror=rmtree_errorhandler) + shutil.rmtree(dir, onerror=handler) # type: ignore + + +def _onerror_ignore(*_args: Any) -> None: + pass + + +def _onerror_reraise(*_args: Any) -> None: + raise def rmtree_errorhandler( - func: Callable[..., Any], path: str, exc_info: Union[ExcInfo, BaseException] + func: FunctionType, + path: Path, + exc_info: Union[ExcInfo, BaseException], + *, + onexc: OnExc = _onerror_reraise, ) -> None: - """On Windows, the files in .svn are read-only, so when rmtree() tries to - remove them, an exception is thrown. We catch that here, remove the - read-only attribute, and hopefully continue without problems.""" + """ + `rmtree` error handler to 'force' a file remove (i.e. like `rm -f`). + + * If a file is readonly then it's write flag is set and operation is + retried. + + * `onerror` is the original callback from `rmtree(... onerror=onerror)` + that is chained at the end if the "rm -f" still fails. + """ try: - has_attr_readonly = not (os.stat(path).st_mode & stat.S_IWRITE) + st_mode = os.stat(path).st_mode except OSError: # it's equivalent to os.path.exists return - if has_attr_readonly: + if not st_mode & stat.S_IWRITE: # convert to read/write - os.chmod(path, stat.S_IWRITE) - # use the original function to repeat the operation - func(path) - return - else: - raise + try: + os.chmod(path, st_mode | stat.S_IWRITE) + except OSError: + pass + else: + # use the original function to repeat the operation + try: + func(path) + return + except OSError: + pass + + if not isinstance(exc_info, BaseException): + _, exc_info, _ = exc_info + onexc(func, path, exc_info) def display_path(path: str) -> str: @@ -232,13 +275,13 @@ def strtobool(val: str) -> int: def format_size(bytes: float) -> str: if bytes > 1000 * 1000: - return "{:.1f} MB".format(bytes / 1000.0 / 1000) + return f"{bytes / 1000.0 / 1000:.1f} MB" elif bytes > 10 * 1000: - return "{} kB".format(int(bytes / 1000)) + return f"{int(bytes / 1000)} kB" elif bytes > 1000: - return "{:.1f} kB".format(bytes / 1000.0) + return f"{bytes / 1000.0:.1f} kB" else: - return "{} bytes".format(int(bytes)) + return f"{int(bytes)} bytes" def tabulate(rows: Iterable[Iterable[Any]]) -> Tuple[List[str], List[int]]: @@ -475,9 +518,7 @@ def redact_netloc(netloc: str) -> str: else: user = urllib.parse.quote(user) password = ":****" - return "{user}{password}@{netloc}".format( - user=user, password=password, netloc=netloc - ) + return f"{user}{password}@{netloc}" def _transform_url( @@ -532,13 +573,20 @@ def redact_auth_from_url(url: str) -> str: return _transform_url(url, _redact_netloc)[0] +def redact_auth_from_requirement(req: Requirement) -> str: + """Replace the password in a given requirement url with ****.""" + if not req.url: + return str(req) + return str(req).replace(req.url, redact_auth_from_url(req.url)) + + class HiddenText: def __init__(self, secret: str, redacted: str) -> None: self.secret = secret self.redacted = redacted def __repr__(self) -> str: - return "".format(str(self)) + return f"" def __str__(self) -> str: return self.redacted diff --git a/.venv/Lib/site-packages/pip/_internal/utils/subprocess.py b/.venv/Lib/site-packages/pip/_internal/utils/subprocess.py index 1e8ff50..79580b0 100644 --- a/.venv/Lib/site-packages/pip/_internal/utils/subprocess.py +++ b/.venv/Lib/site-packages/pip/_internal/utils/subprocess.py @@ -209,7 +209,7 @@ def call_subprocess( output_lines=all_output if not showing_subprocess else None, ) if log_failed_cmd: - subprocess_logger.error("[present-rich] %s", error) + subprocess_logger.error("%s", error, extra={"rich": True}) subprocess_logger.verbose( "[bold magenta]full command[/]: [blue]%s[/]", escape(format_command_args(cmd)), diff --git a/.venv/Lib/site-packages/pip/_internal/utils/temp_dir.py b/.venv/Lib/site-packages/pip/_internal/utils/temp_dir.py index 8ee8a1c..4eec5f3 100644 --- a/.venv/Lib/site-packages/pip/_internal/utils/temp_dir.py +++ b/.venv/Lib/site-packages/pip/_internal/utils/temp_dir.py @@ -3,8 +3,19 @@ import logging import os.path import tempfile +import traceback from contextlib import ExitStack, contextmanager -from typing import Any, Dict, Generator, Optional, TypeVar, Union +from pathlib import Path +from typing import ( + Any, + Callable, + Dict, + Generator, + List, + Optional, + TypeVar, + Union, +) from pip._internal.utils.misc import enum, rmtree @@ -106,6 +117,7 @@ def __init__( delete: Union[bool, None, _Default] = _default, kind: str = "temp", globally_managed: bool = False, + ignore_cleanup_errors: bool = True, ): super().__init__() @@ -128,6 +140,7 @@ def __init__( self._deleted = False self.delete = delete self.kind = kind + self.ignore_cleanup_errors = ignore_cleanup_errors if globally_managed: assert _tempdir_manager is not None @@ -170,7 +183,44 @@ def cleanup(self) -> None: self._deleted = True if not os.path.exists(self._path): return - rmtree(self._path) + + errors: List[BaseException] = [] + + def onerror( + func: Callable[..., Any], + path: Path, + exc_val: BaseException, + ) -> None: + """Log a warning for a `rmtree` error and continue""" + formatted_exc = "\n".join( + traceback.format_exception_only(type(exc_val), exc_val) + ) + formatted_exc = formatted_exc.rstrip() # remove trailing new line + if func in (os.unlink, os.remove, os.rmdir): + logger.debug( + "Failed to remove a temporary file '%s' due to %s.\n", + path, + formatted_exc, + ) + else: + logger.debug("%s failed with %s.", func.__qualname__, formatted_exc) + errors.append(exc_val) + + if self.ignore_cleanup_errors: + try: + # first try with tenacity; retrying to handle ephemeral errors + rmtree(self._path, ignore_errors=False) + except OSError: + # last pass ignore/log all errors + rmtree(self._path, onexc=onerror) + if errors: + logger.warning( + "Failed to remove contents in a temporary directory '%s'.\n" + "You can safely remove it manually.", + self._path, + ) + else: + rmtree(self._path) class AdjacentTempDirectory(TempDirectory): diff --git a/.venv/Lib/site-packages/pip/_internal/utils/wheel.py b/.venv/Lib/site-packages/pip/_internal/utils/wheel.py index e5e3f34..3551f8f 100644 --- a/.venv/Lib/site-packages/pip/_internal/utils/wheel.py +++ b/.venv/Lib/site-packages/pip/_internal/utils/wheel.py @@ -28,7 +28,7 @@ def parse_wheel(wheel_zip: ZipFile, name: str) -> Tuple[str, Message]: metadata = wheel_metadata(wheel_zip, info_dir) version = wheel_version(metadata) except UnsupportedWheel as e: - raise UnsupportedWheel("{} has an invalid wheel, {}".format(name, str(e))) + raise UnsupportedWheel(f"{name} has an invalid wheel, {str(e)}") check_compatibility(version, name) @@ -60,9 +60,7 @@ def wheel_dist_info_dir(source: ZipFile, name: str) -> str: canonical_name = canonicalize_name(name) if not info_dir_name.startswith(canonical_name): raise UnsupportedWheel( - ".dist-info directory {!r} does not start with {!r}".format( - info_dir, canonical_name - ) + f".dist-info directory {info_dir!r} does not start with {canonical_name!r}" ) return info_dir diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc index f219e28..0082239 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc index bb98a4f..d624b9e 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc index 1634c64..62f44d2 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc index dbc4767..9841e3a 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc index daa5a42..b940662 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc index 7c60d1c..adab6d8 100644 Binary files a/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/git.py b/.venv/Lib/site-packages/pip/_internal/vcs/git.py index 8d1d499..8c242cf 100644 --- a/.venv/Lib/site-packages/pip/_internal/vcs/git.py +++ b/.venv/Lib/site-packages/pip/_internal/vcs/git.py @@ -101,7 +101,7 @@ def get_git_version(self) -> Tuple[int, ...]: if not match: logger.warning("Can't parse git version: %s", version) return () - return tuple(int(c) for c in match.groups()) + return (int(match.group(1)), int(match.group(2))) @classmethod def get_current_branch(cls, location: str) -> Optional[str]: diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/mercurial.py b/.venv/Lib/site-packages/pip/_internal/vcs/mercurial.py index 4595960..c183d41 100644 --- a/.venv/Lib/site-packages/pip/_internal/vcs/mercurial.py +++ b/.venv/Lib/site-packages/pip/_internal/vcs/mercurial.py @@ -31,7 +31,7 @@ class Mercurial(VersionControl): @staticmethod def get_base_rev_args(rev: str) -> List[str]: - return ["-r", rev] + return [f"--rev={rev}"] def fetch_new( self, dest: str, url: HiddenText, rev_options: RevOptions, verbosity: int diff --git a/.venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py b/.venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py index 02bbf68..46ca279 100644 --- a/.venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py +++ b/.venv/Lib/site-packages/pip/_internal/vcs/versioncontrol.py @@ -405,9 +405,9 @@ def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: scheme, netloc, path, query, frag = urllib.parse.urlsplit(url) if "+" not in scheme: raise ValueError( - "Sorry, {!r} is a malformed VCS url. " + f"Sorry, {url!r} is a malformed VCS url. " "The format is +://, " - "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp".format(url) + "e.g. svn+http://myrepo/svn/MyApp#egg=MyApp" ) # Remove the vcs prefix. scheme = scheme.split("+", 1)[1] @@ -417,9 +417,9 @@ def get_url_rev_and_auth(cls, url: str) -> Tuple[str, Optional[str], AuthInfo]: path, rev = path.rsplit("@", 1) if not rev: raise InstallationError( - "The URL {!r} has an empty revision (after @) " + f"The URL {url!r} has an empty revision (after @) " "which is not supported. Include a revision after @ " - "or remove @ from the URL.".format(url) + "or remove @ from the URL." ) url = urllib.parse.urlunsplit((scheme, netloc, path, query, "")) return url, rev, user_pass @@ -566,7 +566,7 @@ def obtain(self, dest: str, url: HiddenText, verbosity: int) -> None: self.name, url, ) - response = ask_path_exists("What to do? {}".format(prompt[0]), prompt[1]) + response = ask_path_exists(f"What to do? {prompt[0]}", prompt[1]) if response == "a": sys.exit(-1) diff --git a/.venv/Lib/site-packages/pip/_internal/wheel_builder.py b/.venv/Lib/site-packages/pip/_internal/wheel_builder.py index 60d75dd..b1debe3 100644 --- a/.venv/Lib/site-packages/pip/_internal/wheel_builder.py +++ b/.venv/Lib/site-packages/pip/_internal/wheel_builder.py @@ -140,15 +140,15 @@ def _verify_one(req: InstallRequirement, wheel_path: str) -> None: w = Wheel(os.path.basename(wheel_path)) if canonicalize_name(w.name) != canonical_name: raise InvalidWheelFilename( - "Wheel has unexpected file name: expected {!r}, " - "got {!r}".format(canonical_name, w.name), + f"Wheel has unexpected file name: expected {canonical_name!r}, " + f"got {w.name!r}", ) dist = get_wheel_distribution(FilesystemWheel(wheel_path), canonical_name) dist_verstr = str(dist.version) if canonicalize_version(dist_verstr) != canonicalize_version(w.version): raise InvalidWheelFilename( - "Wheel has unexpected file name: expected {!r}, " - "got {!r}".format(dist_verstr, w.version), + f"Wheel has unexpected file name: expected {dist_verstr!r}, " + f"got {w.version!r}", ) metadata_version_value = dist.metadata_version if metadata_version_value is None: @@ -160,8 +160,7 @@ def _verify_one(req: InstallRequirement, wheel_path: str) -> None: raise UnsupportedWheel(msg) if metadata_version >= Version("1.2") and not isinstance(dist.version, Version): raise UnsupportedWheel( - "Metadata 1.2 mandates PEP 440 version, " - "but {!r} is not".format(dist_verstr) + f"Metadata 1.2 mandates PEP 440 version, but {dist_verstr!r} is not" ) diff --git a/.venv/Lib/site-packages/pip/_vendor/__init__.py b/.venv/Lib/site-packages/pip/_vendor/__init__.py index b22f7ab..c1884ba 100644 --- a/.venv/Lib/site-packages/pip/_vendor/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/__init__.py @@ -117,4 +117,5 @@ def vendored(modulename): vendored("rich.traceback") vendored("tenacity") vendored("tomli") + vendored("truststore") vendored("urllib3") diff --git a/.venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc index 702e553..2e8a9f7 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc index fd276d0..b9dfaa8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc index 7979c76..2353c16 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py index f631ae6..4d20bc9 100644 --- a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py @@ -8,11 +8,21 @@ """ __author__ = "Eric Larson" __email__ = "eric@ionrock.org" -__version__ = "0.12.11" +__version__ = "0.13.1" -from .wrapper import CacheControl -from .adapter import CacheControlAdapter -from .controller import CacheController +from pip._vendor.cachecontrol.adapter import CacheControlAdapter +from pip._vendor.cachecontrol.controller import CacheController +from pip._vendor.cachecontrol.wrapper import CacheControl + +__all__ = [ + "__author__", + "__email__", + "__version__", + "CacheControlAdapter", + "CacheController", + "CacheControl", +] import logging + logging.getLogger(__name__).addHandler(logging.NullHandler()) diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc index 07a58f3..3894a38 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc index f71ec17..abaf31f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc index c62a795..fdfd463 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc index db47cfd..3139d2f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc deleted file mode 100644 index 82ba0a9..0000000 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-311.pyc and /dev/null differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc index 3d6851d..d284a98 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc index 4884ad1..0eb2dad 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc index 1f02397..b22bde6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc index 77fc1a5..829fa52 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc index 3176a94..17e65b1 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py index 4266b5e..2c84208 100644 --- a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py +++ b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py @@ -1,8 +1,11 @@ # SPDX-FileCopyrightText: 2015 Eric Larson # # SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations import logging +from argparse import ArgumentParser +from typing import TYPE_CHECKING from pip._vendor import requests @@ -10,16 +13,19 @@ from pip._vendor.cachecontrol.cache import DictCache from pip._vendor.cachecontrol.controller import logger -from argparse import ArgumentParser +if TYPE_CHECKING: + from argparse import Namespace + from pip._vendor.cachecontrol.controller import CacheController -def setup_logging(): + +def setup_logging() -> None: logger.setLevel(logging.DEBUG) handler = logging.StreamHandler() logger.addHandler(handler) -def get_session(): +def get_session() -> requests.Session: adapter = CacheControlAdapter( DictCache(), cache_etags=True, serializer=None, heuristic=None ) @@ -27,17 +33,17 @@ def get_session(): sess.mount("http://", adapter) sess.mount("https://", adapter) - sess.cache_controller = adapter.controller + sess.cache_controller = adapter.controller # type: ignore[attr-defined] return sess -def get_args(): +def get_args() -> Namespace: parser = ArgumentParser() parser.add_argument("url", help="The URL to try and cache") return parser.parse_args() -def main(args=None): +def main() -> None: args = get_args() sess = get_session() @@ -48,10 +54,13 @@ def main(args=None): setup_logging() # try setting the cache - sess.cache_controller.cache_response(resp.request, resp.raw) + cache_controller: CacheController = ( + sess.cache_controller # type: ignore[attr-defined] + ) + cache_controller.cache_response(resp.request, resp.raw) # Now try to get it - if sess.cache_controller.cached_request(resp.request): + if cache_controller.cached_request(resp.request): print("Cached!") else: print("Not cached :(") diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py index 94c75e1..3e83e30 100644 --- a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py +++ b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py @@ -1,16 +1,26 @@ # SPDX-FileCopyrightText: 2015 Eric Larson # # SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations -import types import functools +import types import zlib +from typing import TYPE_CHECKING, Any, Collection, Mapping from pip._vendor.requests.adapters import HTTPAdapter -from .controller import CacheController, PERMANENT_REDIRECT_STATUSES -from .cache import DictCache -from .filewrapper import CallbackFileWrapper +from pip._vendor.cachecontrol.cache import DictCache +from pip._vendor.cachecontrol.controller import PERMANENT_REDIRECT_STATUSES, CacheController +from pip._vendor.cachecontrol.filewrapper import CallbackFileWrapper + +if TYPE_CHECKING: + from pip._vendor.requests import PreparedRequest, Response + from pip._vendor.urllib3 import HTTPResponse + + from pip._vendor.cachecontrol.cache import BaseCache + from pip._vendor.cachecontrol.heuristics import BaseHeuristic + from pip._vendor.cachecontrol.serialize import Serializer class CacheControlAdapter(HTTPAdapter): @@ -18,16 +28,16 @@ class CacheControlAdapter(HTTPAdapter): def __init__( self, - cache=None, - cache_etags=True, - controller_class=None, - serializer=None, - heuristic=None, - cacheable_methods=None, - *args, - **kw - ): - super(CacheControlAdapter, self).__init__(*args, **kw) + cache: BaseCache | None = None, + cache_etags: bool = True, + controller_class: type[CacheController] | None = None, + serializer: Serializer | None = None, + heuristic: BaseHeuristic | None = None, + cacheable_methods: Collection[str] | None = None, + *args: Any, + **kw: Any, + ) -> None: + super().__init__(*args, **kw) self.cache = DictCache() if cache is None else cache self.heuristic = heuristic self.cacheable_methods = cacheable_methods or ("GET",) @@ -37,7 +47,16 @@ def __init__( self.cache, cache_etags=cache_etags, serializer=serializer ) - def send(self, request, cacheable_methods=None, **kw): + def send( + self, + request: PreparedRequest, + stream: bool = False, + timeout: None | float | tuple[float, float] | tuple[float, None] = None, + verify: bool | str = True, + cert: (None | bytes | str | tuple[bytes | str, bytes | str]) = None, + proxies: Mapping[str, str] | None = None, + cacheable_methods: Collection[str] | None = None, + ) -> Response: """ Send a request. Use the request information to see if it exists in the cache and cache the response if we need to and can. @@ -54,13 +73,17 @@ def send(self, request, cacheable_methods=None, **kw): # check for etags and add headers if appropriate request.headers.update(self.controller.conditional_headers(request)) - resp = super(CacheControlAdapter, self).send(request, **kw) + resp = super().send(request, stream, timeout, verify, cert, proxies) return resp def build_response( - self, request, response, from_cache=False, cacheable_methods=None - ): + self, + request: PreparedRequest, + response: HTTPResponse, + from_cache: bool = False, + cacheable_methods: Collection[str] | None = None, + ) -> Response: """ Build a response by making a request or using the cache. @@ -102,36 +125,37 @@ def build_response( else: # Wrap the response file with a wrapper that will cache the # response when the stream has been consumed. - response._fp = CallbackFileWrapper( - response._fp, + response._fp = CallbackFileWrapper( # type: ignore[attr-defined] + response._fp, # type: ignore[attr-defined] functools.partial( self.controller.cache_response, request, response ), ) if response.chunked: - super_update_chunk_length = response._update_chunk_length + super_update_chunk_length = response._update_chunk_length # type: ignore[attr-defined] - def _update_chunk_length(self): + def _update_chunk_length(self: HTTPResponse) -> None: super_update_chunk_length() if self.chunk_left == 0: - self._fp._close() + self._fp._close() # type: ignore[attr-defined] - response._update_chunk_length = types.MethodType( + response._update_chunk_length = types.MethodType( # type: ignore[attr-defined] _update_chunk_length, response ) - resp = super(CacheControlAdapter, self).build_response(request, response) + resp: Response = super().build_response(request, response) # type: ignore[no-untyped-call] # See if we should invalidate the cache. if request.method in self.invalidating_methods and resp.ok: + assert request.url is not None cache_url = self.controller.cache_url(request.url) self.cache.delete(cache_url) # Give the request a from_cache attr to let people use it - resp.from_cache = from_cache + resp.from_cache = from_cache # type: ignore[attr-defined] return resp - def close(self): + def close(self) -> None: self.cache.close() - super(CacheControlAdapter, self).close() + super().close() # type: ignore[no-untyped-call] diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py index 2a965f5..3293b00 100644 --- a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py +++ b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/cache.py @@ -6,38 +6,46 @@ The cache object API for implementing caches. The default is a thread safe in-memory dictionary. """ +from __future__ import annotations + from threading import Lock +from typing import IO, TYPE_CHECKING, MutableMapping +if TYPE_CHECKING: + from datetime import datetime -class BaseCache(object): - def get(self, key): +class BaseCache: + def get(self, key: str) -> bytes | None: raise NotImplementedError() - def set(self, key, value, expires=None): + def set( + self, key: str, value: bytes, expires: int | datetime | None = None + ) -> None: raise NotImplementedError() - def delete(self, key): + def delete(self, key: str) -> None: raise NotImplementedError() - def close(self): + def close(self) -> None: pass class DictCache(BaseCache): - - def __init__(self, init_dict=None): + def __init__(self, init_dict: MutableMapping[str, bytes] | None = None) -> None: self.lock = Lock() self.data = init_dict or {} - def get(self, key): + def get(self, key: str) -> bytes | None: return self.data.get(key, None) - def set(self, key, value, expires=None): + def set( + self, key: str, value: bytes, expires: int | datetime | None = None + ) -> None: with self.lock: self.data.update({key: value}) - def delete(self, key): + def delete(self, key: str) -> None: with self.lock: if key in self.data: self.data.pop(key) @@ -55,10 +63,11 @@ class SeparateBodyBaseCache(BaseCache): Similarly, the body should be loaded separately via ``get_body()``. """ - def set_body(self, key, body): + + def set_body(self, key: str, body: bytes) -> None: raise NotImplementedError() - def get_body(self, key): + def get_body(self, key: str) -> IO[bytes] | None: """ Return the body as file-like object. """ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py index 3782729..24ff469 100644 --- a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py @@ -2,8 +2,7 @@ # # SPDX-License-Identifier: Apache-2.0 -from .file_cache import FileCache, SeparateBodyFileCache -from .redis_cache import RedisCache - +from pip._vendor.cachecontrol.caches.file_cache import FileCache, SeparateBodyFileCache +from pip._vendor.cachecontrol.caches.redis_cache import RedisCache __all__ = ["FileCache", "SeparateBodyFileCache", "RedisCache"] diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc index bc9cf73..f6db2af 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc index bc32894..010301d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc index c7e8177..f88fdab 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py index f1ddb2e..1fd2801 100644 --- a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py +++ b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py @@ -1,22 +1,23 @@ # SPDX-FileCopyrightText: 2015 Eric Larson # # SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations import hashlib import os from textwrap import dedent +from typing import IO, TYPE_CHECKING -from ..cache import BaseCache, SeparateBodyBaseCache -from ..controller import CacheController +from pip._vendor.cachecontrol.cache import BaseCache, SeparateBodyBaseCache +from pip._vendor.cachecontrol.controller import CacheController -try: - FileNotFoundError -except NameError: - # py2.X - FileNotFoundError = (IOError, OSError) +if TYPE_CHECKING: + from datetime import datetime + from filelock import BaseFileLock -def _secure_open_write(filename, fmode): + +def _secure_open_write(filename: str, fmode: int) -> IO[bytes]: # We only want to write to this file, so open it in write only mode flags = os.O_WRONLY @@ -39,7 +40,7 @@ def _secure_open_write(filename, fmode): # there try: os.remove(filename) - except (IOError, OSError): + except OSError: # The file must not exist already, so we can just skip ahead to opening pass @@ -62,37 +63,27 @@ class _FileCacheMixin: def __init__( self, - directory, - forever=False, - filemode=0o0600, - dirmode=0o0700, - use_dir_lock=None, - lock_class=None, - ): - - if use_dir_lock is not None and lock_class is not None: - raise ValueError("Cannot use use_dir_lock and lock_class together") - + directory: str, + forever: bool = False, + filemode: int = 0o0600, + dirmode: int = 0o0700, + lock_class: type[BaseFileLock] | None = None, + ) -> None: try: - from lockfile import LockFile - from lockfile.mkdirlockfile import MkdirLockFile + if lock_class is None: + from filelock import FileLock + + lock_class = FileLock except ImportError: notice = dedent( """ NOTE: In order to use the FileCache you must have - lockfile installed. You can install it via pip: - pip install lockfile + filelock installed. You can install it via pip: + pip install filelock """ ) raise ImportError(notice) - else: - if use_dir_lock: - lock_class = MkdirLockFile - - elif lock_class is None: - lock_class = LockFile - self.directory = directory self.forever = forever self.filemode = filemode @@ -100,17 +91,17 @@ def __init__( self.lock_class = lock_class @staticmethod - def encode(x): + def encode(x: str) -> str: return hashlib.sha224(x.encode()).hexdigest() - def _fn(self, name): + def _fn(self, name: str) -> str: # NOTE: This method should not change as some may depend on it. # See: https://github.com/ionrock/cachecontrol/issues/63 hashed = self.encode(name) parts = list(hashed[:5]) + [hashed] return os.path.join(self.directory, *parts) - def get(self, key): + def get(self, key: str) -> bytes | None: name = self._fn(key) try: with open(name, "rb") as fh: @@ -119,26 +110,28 @@ def get(self, key): except FileNotFoundError: return None - def set(self, key, value, expires=None): + def set( + self, key: str, value: bytes, expires: int | datetime | None = None + ) -> None: name = self._fn(key) self._write(name, value) - def _write(self, path, data: bytes): + def _write(self, path: str, data: bytes) -> None: """ Safely write the data to the given path. """ # Make sure the directory exists try: os.makedirs(os.path.dirname(path), self.dirmode) - except (IOError, OSError): + except OSError: pass - with self.lock_class(path) as lock: + with self.lock_class(path + ".lock"): # Write our actual file - with _secure_open_write(lock.path, self.filemode) as fh: + with _secure_open_write(path, self.filemode) as fh: fh.write(data) - def _delete(self, key, suffix): + def _delete(self, key: str, suffix: str) -> None: name = self._fn(key) + suffix if not self.forever: try: @@ -153,7 +146,7 @@ class FileCache(_FileCacheMixin, BaseCache): downloads. """ - def delete(self, key): + def delete(self, key: str) -> None: self._delete(key, "") @@ -163,23 +156,23 @@ class SeparateBodyFileCache(_FileCacheMixin, SeparateBodyBaseCache): peak memory usage. """ - def get_body(self, key): + def get_body(self, key: str) -> IO[bytes] | None: name = self._fn(key) + ".body" try: return open(name, "rb") except FileNotFoundError: return None - def set_body(self, key, body): + def set_body(self, key: str, body: bytes) -> None: name = self._fn(key) + ".body" self._write(name, body) - def delete(self, key): + def delete(self, key: str) -> None: self._delete(key, "") self._delete(key, ".body") -def url_to_file_path(url, filecache): +def url_to_file_path(url: str, filecache: FileCache) -> str: """Return the file cache path based on the URL. This does not ensure the file exists! diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py index 2cba4b0..f4f68c4 100644 --- a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py +++ b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py @@ -1,39 +1,48 @@ # SPDX-FileCopyrightText: 2015 Eric Larson # # SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations -from __future__ import division -from datetime import datetime +from datetime import datetime, timezone +from typing import TYPE_CHECKING + from pip._vendor.cachecontrol.cache import BaseCache +if TYPE_CHECKING: + from redis import Redis -class RedisCache(BaseCache): - def __init__(self, conn): +class RedisCache(BaseCache): + def __init__(self, conn: Redis[bytes]) -> None: self.conn = conn - def get(self, key): + def get(self, key: str) -> bytes | None: return self.conn.get(key) - def set(self, key, value, expires=None): + def set( + self, key: str, value: bytes, expires: int | datetime | None = None + ) -> None: if not expires: self.conn.set(key, value) elif isinstance(expires, datetime): - expires = expires - datetime.utcnow() - self.conn.setex(key, int(expires.total_seconds()), value) + now_utc = datetime.now(timezone.utc) + if expires.tzinfo is None: + now_utc = now_utc.replace(tzinfo=None) + delta = expires - now_utc + self.conn.setex(key, int(delta.total_seconds()), value) else: self.conn.setex(key, expires, value) - def delete(self, key): + def delete(self, key: str) -> None: self.conn.delete(key) - def clear(self): + def clear(self) -> None: """Helper for clearing all the keys in a database. Use with caution!""" for key in self.conn.keys(): self.conn.delete(key) - def close(self): + def close(self) -> None: """Redis uses connection pooling, no need to close the connection.""" pass diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py deleted file mode 100644 index ccec937..0000000 --- a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/compat.py +++ /dev/null @@ -1,32 +0,0 @@ -# SPDX-FileCopyrightText: 2015 Eric Larson -# -# SPDX-License-Identifier: Apache-2.0 - -try: - from urllib.parse import urljoin -except ImportError: - from urlparse import urljoin - - -try: - import cPickle as pickle -except ImportError: - import pickle - -# Handle the case where the requests module has been patched to not have -# urllib3 bundled as part of its source. -try: - from pip._vendor.requests.packages.urllib3.response import HTTPResponse -except ImportError: - from pip._vendor.urllib3.response import HTTPResponse - -try: - from pip._vendor.requests.packages.urllib3.util import is_fp_closed -except ImportError: - from pip._vendor.urllib3.util import is_fp_closed - -# Replicate some six behaviour -try: - text_type = unicode -except NameError: - text_type = str diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py index 7f23529..586b9f9 100644 --- a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py +++ b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/controller.py @@ -5,17 +5,27 @@ """ The httplib2 algorithms ported for use with requests. """ +from __future__ import annotations + +import calendar import logging import re -import calendar import time from email.utils import parsedate_tz +from typing import TYPE_CHECKING, Collection, Mapping from pip._vendor.requests.structures import CaseInsensitiveDict -from .cache import DictCache, SeparateBodyBaseCache -from .serialize import Serializer +from pip._vendor.cachecontrol.cache import DictCache, SeparateBodyBaseCache +from pip._vendor.cachecontrol.serialize import Serializer + +if TYPE_CHECKING: + from typing import Literal + + from pip._vendor.requests import PreparedRequest + from pip._vendor.urllib3 import HTTPResponse + from pip._vendor.cachecontrol.cache import BaseCache logger = logging.getLogger(__name__) @@ -24,20 +34,26 @@ PERMANENT_REDIRECT_STATUSES = (301, 308) -def parse_uri(uri): +def parse_uri(uri: str) -> tuple[str, str, str, str, str]: """Parses a URI using the regex given in Appendix B of RFC 3986. (scheme, authority, path, query, fragment) = parse_uri(uri) """ - groups = URI.match(uri).groups() + match = URI.match(uri) + assert match is not None + groups = match.groups() return (groups[1], groups[3], groups[4], groups[6], groups[8]) -class CacheController(object): +class CacheController: """An interface to see if request should cached or not.""" def __init__( - self, cache=None, cache_etags=True, serializer=None, status_codes=None + self, + cache: BaseCache | None = None, + cache_etags: bool = True, + serializer: Serializer | None = None, + status_codes: Collection[int] | None = None, ): self.cache = DictCache() if cache is None else cache self.cache_etags = cache_etags @@ -45,7 +61,7 @@ def __init__( self.cacheable_status_codes = status_codes or (200, 203, 300, 301, 308) @classmethod - def _urlnorm(cls, uri): + def _urlnorm(cls, uri: str) -> str: """Normalize the URL to create a safe key for the cache""" (scheme, authority, path, query, fragment) = parse_uri(uri) if not scheme or not authority: @@ -65,10 +81,10 @@ def _urlnorm(cls, uri): return defrag_uri @classmethod - def cache_url(cls, uri): + def cache_url(cls, uri: str) -> str: return cls._urlnorm(uri) - def parse_cache_control(self, headers): + def parse_cache_control(self, headers: Mapping[str, str]) -> dict[str, int | None]: known_directives = { # https://tools.ietf.org/html/rfc7234#section-5.2 "max-age": (int, True), @@ -87,7 +103,7 @@ def parse_cache_control(self, headers): cc_headers = headers.get("cache-control", headers.get("Cache-Control", "")) - retval = {} + retval: dict[str, int | None] = {} for cc_directive in cc_headers.split(","): if not cc_directive.strip(): @@ -122,11 +138,33 @@ def parse_cache_control(self, headers): return retval - def cached_request(self, request): + def _load_from_cache(self, request: PreparedRequest) -> HTTPResponse | None: + """ + Load a cached response, or return None if it's not available. + """ + cache_url = request.url + assert cache_url is not None + cache_data = self.cache.get(cache_url) + if cache_data is None: + logger.debug("No cache entry available") + return None + + if isinstance(self.cache, SeparateBodyBaseCache): + body_file = self.cache.get_body(cache_url) + else: + body_file = None + + result = self.serializer.loads(request, cache_data, body_file) + if result is None: + logger.warning("Cache entry deserialization failed, entry ignored") + return result + + def cached_request(self, request: PreparedRequest) -> HTTPResponse | Literal[False]: """ Return a cached response if it exists in the cache, otherwise return False. """ + assert request.url is not None cache_url = self.cache_url(request.url) logger.debug('Looking up "%s" in the cache', cache_url) cc = self.parse_cache_control(request.headers) @@ -140,21 +178,9 @@ def cached_request(self, request): logger.debug('Request header has "max_age" as 0, cache bypassed') return False - # Request allows serving from the cache, let's see if we find something - cache_data = self.cache.get(cache_url) - if cache_data is None: - logger.debug("No cache entry available") - return False - - if isinstance(self.cache, SeparateBodyBaseCache): - body_file = self.cache.get_body(cache_url) - else: - body_file = None - - # Check whether it can be deserialized - resp = self.serializer.loads(request, cache_data, body_file) + # Check whether we can load the response from the cache: + resp = self._load_from_cache(request) if not resp: - logger.warning("Cache entry deserialization failed, entry ignored") return False # If we have a cached permanent redirect, return it immediately. We @@ -174,7 +200,7 @@ def cached_request(self, request): logger.debug(msg) return resp - headers = CaseInsensitiveDict(resp.headers) + headers: CaseInsensitiveDict[str] = CaseInsensitiveDict(resp.headers) if not headers or "date" not in headers: if "etag" not in headers: # Without date or etag, the cached response can never be used @@ -185,7 +211,9 @@ def cached_request(self, request): return False now = time.time() - date = calendar.timegm(parsedate_tz(headers["date"])) + time_tuple = parsedate_tz(headers["date"]) + assert time_tuple is not None + date = calendar.timegm(time_tuple[:6]) current_age = max(0, now - date) logger.debug("Current age based on date: %i", current_age) @@ -199,28 +227,30 @@ def cached_request(self, request): freshness_lifetime = 0 # Check the max-age pragma in the cache control header - if "max-age" in resp_cc: - freshness_lifetime = resp_cc["max-age"] + max_age = resp_cc.get("max-age") + if max_age is not None: + freshness_lifetime = max_age logger.debug("Freshness lifetime from max-age: %i", freshness_lifetime) # If there isn't a max-age, check for an expires header elif "expires" in headers: expires = parsedate_tz(headers["expires"]) if expires is not None: - expire_time = calendar.timegm(expires) - date + expire_time = calendar.timegm(expires[:6]) - date freshness_lifetime = max(0, expire_time) logger.debug("Freshness lifetime from expires: %i", freshness_lifetime) # Determine if we are setting freshness limit in the # request. Note, this overrides what was in the response. - if "max-age" in cc: - freshness_lifetime = cc["max-age"] + max_age = cc.get("max-age") + if max_age is not None: + freshness_lifetime = max_age logger.debug( "Freshness lifetime from request max-age: %i", freshness_lifetime ) - if "min-fresh" in cc: - min_fresh = cc["min-fresh"] + min_fresh = cc.get("min-fresh") + if min_fresh is not None: # adjust our current age by our min fresh current_age += min_fresh logger.debug("Adjusted current age from min-fresh: %i", current_age) @@ -239,13 +269,12 @@ def cached_request(self, request): # return the original handler return False - def conditional_headers(self, request): - cache_url = self.cache_url(request.url) - resp = self.serializer.loads(request, self.cache.get(cache_url)) + def conditional_headers(self, request: PreparedRequest) -> dict[str, str]: + resp = self._load_from_cache(request) new_headers = {} if resp: - headers = CaseInsensitiveDict(resp.headers) + headers: CaseInsensitiveDict[str] = CaseInsensitiveDict(resp.headers) if "etag" in headers: new_headers["If-None-Match"] = headers["ETag"] @@ -255,7 +284,14 @@ def conditional_headers(self, request): return new_headers - def _cache_set(self, cache_url, request, response, body=None, expires_time=None): + def _cache_set( + self, + cache_url: str, + request: PreparedRequest, + response: HTTPResponse, + body: bytes | None = None, + expires_time: int | None = None, + ) -> None: """ Store the data in the cache. """ @@ -267,7 +303,10 @@ def _cache_set(self, cache_url, request, response, body=None, expires_time=None) self.serializer.dumps(request, response, b""), expires=expires_time, ) - self.cache.set_body(cache_url, body) + # body is None can happen when, for example, we're only updating + # headers, as is the case in update_cached_response(). + if body is not None: + self.cache.set_body(cache_url, body) else: self.cache.set( cache_url, @@ -275,7 +314,13 @@ def _cache_set(self, cache_url, request, response, body=None, expires_time=None) expires=expires_time, ) - def cache_response(self, request, response, body=None, status_codes=None): + def cache_response( + self, + request: PreparedRequest, + response: HTTPResponse, + body: bytes | None = None, + status_codes: Collection[int] | None = None, + ) -> None: """ Algorithm for caching requests. @@ -290,10 +335,14 @@ def cache_response(self, request, response, body=None, status_codes=None): ) return - response_headers = CaseInsensitiveDict(response.headers) + response_headers: CaseInsensitiveDict[str] = CaseInsensitiveDict( + response.headers + ) if "date" in response_headers: - date = calendar.timegm(parsedate_tz(response_headers["date"])) + time_tuple = parsedate_tz(response_headers["date"]) + assert time_tuple is not None + date = calendar.timegm(time_tuple[:6]) else: date = 0 @@ -312,6 +361,7 @@ def cache_response(self, request, response, body=None, status_codes=None): cc_req = self.parse_cache_control(request.headers) cc = self.parse_cache_control(response_headers) + assert request.url is not None cache_url = self.cache_url(request.url) logger.debug('Updating cache with response from "%s"', cache_url) @@ -344,11 +394,11 @@ def cache_response(self, request, response, body=None, status_codes=None): if response_headers.get("expires"): expires = parsedate_tz(response_headers["expires"]) if expires is not None: - expires_time = calendar.timegm(expires) - date + expires_time = calendar.timegm(expires[:6]) - date expires_time = max(expires_time, 14 * 86400) - logger.debug("etag object cached for {0} seconds".format(expires_time)) + logger.debug(f"etag object cached for {expires_time} seconds") logger.debug("Caching due to etag") self._cache_set(cache_url, request, response, body, expires_time) @@ -362,11 +412,14 @@ def cache_response(self, request, response, body=None, status_codes=None): # is no date header then we can't do anything about expiring # the cache. elif "date" in response_headers: - date = calendar.timegm(parsedate_tz(response_headers["date"])) + time_tuple = parsedate_tz(response_headers["date"]) + assert time_tuple is not None + date = calendar.timegm(time_tuple[:6]) # cache when there is a max-age > 0 - if "max-age" in cc and cc["max-age"] > 0: + max_age = cc.get("max-age") + if max_age is not None and max_age > 0: logger.debug("Caching b/c date exists and max-age > 0") - expires_time = cc["max-age"] + expires_time = max_age self._cache_set( cache_url, request, @@ -381,12 +434,12 @@ def cache_response(self, request, response, body=None, status_codes=None): if response_headers["expires"]: expires = parsedate_tz(response_headers["expires"]) if expires is not None: - expires_time = calendar.timegm(expires) - date + expires_time = calendar.timegm(expires[:6]) - date else: expires_time = None logger.debug( - "Caching b/c of expires header. expires in {0} seconds".format( + "Caching b/c of expires header. expires in {} seconds".format( expires_time ) ) @@ -398,16 +451,18 @@ def cache_response(self, request, response, body=None, status_codes=None): expires_time, ) - def update_cached_response(self, request, response): + def update_cached_response( + self, request: PreparedRequest, response: HTTPResponse + ) -> HTTPResponse: """On a 304 we will get a new set of headers that we want to update our cached value with, assuming we have one. This should only ever be called when we've sent an ETag and gotten a 304 as the response. """ + assert request.url is not None cache_url = self.cache_url(request.url) - - cached_response = self.serializer.loads(request, self.cache.get(cache_url)) + cached_response = self._load_from_cache(request) if not cached_response: # we didn't have a cached response @@ -423,11 +478,11 @@ def update_cached_response(self, request, response): excluded_headers = ["content-length"] cached_response.headers.update( - dict( - (k, v) - for k, v in response.headers.items() + { + k: v + for k, v in response.headers.items() # type: ignore[no-untyped-call] if k.lower() not in excluded_headers - ) + } ) # we want a 200 b/c we have content via the cache diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py index f5ed5f6..2514390 100644 --- a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py +++ b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py @@ -1,12 +1,17 @@ # SPDX-FileCopyrightText: 2015 Eric Larson # # SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations -from tempfile import NamedTemporaryFile import mmap +from tempfile import NamedTemporaryFile +from typing import TYPE_CHECKING, Any, Callable + +if TYPE_CHECKING: + from http.client import HTTPResponse -class CallbackFileWrapper(object): +class CallbackFileWrapper: """ Small wrapper around a fp object which will tee everything read into a buffer, and when that file is closed it will execute a callback with the @@ -25,12 +30,14 @@ class CallbackFileWrapper(object): performance impact. """ - def __init__(self, fp, callback): + def __init__( + self, fp: HTTPResponse, callback: Callable[[bytes], None] | None + ) -> None: self.__buf = NamedTemporaryFile("rb+", delete=True) self.__fp = fp self.__callback = callback - def __getattr__(self, name): + def __getattr__(self, name: str) -> Any: # The vaguaries of garbage collection means that self.__fp is # not always set. By using __getattribute__ and the private # name[0] allows looking up the attribute value and raising an @@ -42,7 +49,7 @@ def __getattr__(self, name): fp = self.__getattribute__("_CallbackFileWrapper__fp") return getattr(fp, name) - def __is_fp_closed(self): + def __is_fp_closed(self) -> bool: try: return self.__fp.fp is None @@ -50,7 +57,8 @@ def __is_fp_closed(self): pass try: - return self.__fp.closed + closed: bool = self.__fp.closed + return closed except AttributeError: pass @@ -59,7 +67,7 @@ def __is_fp_closed(self): # TODO: Add some logging here... return False - def _close(self): + def _close(self) -> None: if self.__callback: if self.__buf.tell() == 0: # Empty file: @@ -86,8 +94,8 @@ def _close(self): # Important when caching big files. self.__buf.close() - def read(self, amt=None): - data = self.__fp.read(amt) + def read(self, amt: int | None = None) -> bytes: + data: bytes = self.__fp.read(amt) if data: # We may be dealing with b'', a sign that things are over: # it's passed e.g. after we've already closed self.__buf. @@ -97,8 +105,8 @@ def read(self, amt=None): return data - def _safe_read(self, amt): - data = self.__fp._safe_read(amt) + def _safe_read(self, amt: int) -> bytes: + data: bytes = self.__fp._safe_read(amt) # type: ignore[attr-defined] if amt == 2 and data == b"\r\n": # urllib executes this read to toss the CRLF at the end # of the chunk. diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py index ebe4a96..b9d72ca 100644 --- a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py +++ b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py @@ -1,29 +1,31 @@ # SPDX-FileCopyrightText: 2015 Eric Larson # # SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations import calendar import time - +from datetime import datetime, timedelta, timezone from email.utils import formatdate, parsedate, parsedate_tz +from typing import TYPE_CHECKING, Any, Mapping -from datetime import datetime, timedelta +if TYPE_CHECKING: + from pip._vendor.urllib3 import HTTPResponse TIME_FMT = "%a, %d %b %Y %H:%M:%S GMT" -def expire_after(delta, date=None): - date = date or datetime.utcnow() +def expire_after(delta: timedelta, date: datetime | None = None) -> datetime: + date = date or datetime.now(timezone.utc) return date + delta -def datetime_to_header(dt): +def datetime_to_header(dt: datetime) -> str: return formatdate(calendar.timegm(dt.timetuple())) -class BaseHeuristic(object): - - def warning(self, response): +class BaseHeuristic: + def warning(self, response: HTTPResponse) -> str | None: """ Return a valid 1xx warning header value describing the cache adjustments. @@ -34,7 +36,7 @@ def warning(self, response): """ return '110 - "Response is Stale"' - def update_headers(self, response): + def update_headers(self, response: HTTPResponse) -> dict[str, str]: """Update the response headers with any new headers. NOTE: This SHOULD always include some Warning header to @@ -43,7 +45,7 @@ def update_headers(self, response): """ return {} - def apply(self, response): + def apply(self, response: HTTPResponse) -> HTTPResponse: updated_headers = self.update_headers(response) if updated_headers: @@ -61,12 +63,12 @@ class OneDayCache(BaseHeuristic): future. """ - def update_headers(self, response): + def update_headers(self, response: HTTPResponse) -> dict[str, str]: headers = {} if "expires" not in response.headers: date = parsedate(response.headers["date"]) - expires = expire_after(timedelta(days=1), date=datetime(*date[:6])) + expires = expire_after(timedelta(days=1), date=datetime(*date[:6], tzinfo=timezone.utc)) # type: ignore[misc] headers["expires"] = datetime_to_header(expires) headers["cache-control"] = "public" return headers @@ -77,14 +79,14 @@ class ExpiresAfter(BaseHeuristic): Cache **all** requests for a defined time period. """ - def __init__(self, **kw): + def __init__(self, **kw: Any) -> None: self.delta = timedelta(**kw) - def update_headers(self, response): + def update_headers(self, response: HTTPResponse) -> dict[str, str]: expires = expire_after(self.delta) return {"expires": datetime_to_header(expires), "cache-control": "public"} - def warning(self, response): + def warning(self, response: HTTPResponse) -> str | None: tmpl = "110 - Automatically cached for %s. Response might be stale" return tmpl % self.delta @@ -101,12 +103,23 @@ class LastModified(BaseHeuristic): http://lxr.mozilla.org/mozilla-release/source/netwerk/protocol/http/nsHttpResponseHead.cpp#397 Unlike mozilla we limit this to 24-hr. """ + cacheable_by_default_statuses = { - 200, 203, 204, 206, 300, 301, 404, 405, 410, 414, 501 + 200, + 203, + 204, + 206, + 300, + 301, + 404, + 405, + 410, + 414, + 501, } - def update_headers(self, resp): - headers = resp.headers + def update_headers(self, resp: HTTPResponse) -> dict[str, str]: + headers: Mapping[str, str] = resp.headers if "expires" in headers: return {} @@ -120,9 +133,11 @@ def update_headers(self, resp): if "date" not in headers or "last-modified" not in headers: return {} - date = calendar.timegm(parsedate_tz(headers["date"])) + time_tuple = parsedate_tz(headers["date"]) + assert time_tuple is not None + date = calendar.timegm(time_tuple[:6]) last_modified = parsedate(headers["last-modified"]) - if date is None or last_modified is None: + if last_modified is None: return {} now = time.time() @@ -135,5 +150,5 @@ def update_headers(self, resp): expires = date + freshness_lifetime return {"expires": time.strftime(TIME_FMT, time.gmtime(expires))} - def warning(self, resp): + def warning(self, resp: HTTPResponse) -> str | None: return None diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py index 7fe1a3e..f9e967c 100644 --- a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py +++ b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py @@ -1,78 +1,76 @@ # SPDX-FileCopyrightText: 2015 Eric Larson # # SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations -import base64 import io -import json -import zlib +from typing import IO, TYPE_CHECKING, Any, Mapping, cast from pip._vendor import msgpack from pip._vendor.requests.structures import CaseInsensitiveDict +from pip._vendor.urllib3 import HTTPResponse -from .compat import HTTPResponse, pickle, text_type +if TYPE_CHECKING: + from pip._vendor.requests import PreparedRequest -def _b64_decode_bytes(b): - return base64.b64decode(b.encode("ascii")) +class Serializer: + serde_version = "4" - -def _b64_decode_str(s): - return _b64_decode_bytes(s).decode("utf8") - - -_default_body_read = object() - - -class Serializer(object): - def dumps(self, request, response, body=None): - response_headers = CaseInsensitiveDict(response.headers) + def dumps( + self, + request: PreparedRequest, + response: HTTPResponse, + body: bytes | None = None, + ) -> bytes: + response_headers: CaseInsensitiveDict[str] = CaseInsensitiveDict( + response.headers + ) if body is None: # When a body isn't passed in, we'll read the response. We # also update the response with a new file handler to be # sure it acts as though it was never read. body = response.read(decode_content=False) - response._fp = io.BytesIO(body) - - # NOTE: This is all a bit weird, but it's really important that on - # Python 2.x these objects are unicode and not str, even when - # they contain only ascii. The problem here is that msgpack - # understands the difference between unicode and bytes and we - # have it set to differentiate between them, however Python 2 - # doesn't know the difference. Forcing these to unicode will be - # enough to have msgpack know the difference. + response._fp = io.BytesIO(body) # type: ignore[attr-defined] + response.length_remaining = len(body) + data = { - u"response": { - u"body": body, # Empty bytestring if body is stored separately - u"headers": dict( - (text_type(k), text_type(v)) for k, v in response.headers.items() - ), - u"status": response.status, - u"version": response.version, - u"reason": text_type(response.reason), - u"strict": response.strict, - u"decode_content": response.decode_content, + "response": { + "body": body, # Empty bytestring if body is stored separately + "headers": {str(k): str(v) for k, v in response.headers.items()}, # type: ignore[no-untyped-call] + "status": response.status, + "version": response.version, + "reason": str(response.reason), + "decode_content": response.decode_content, } } # Construct our vary headers - data[u"vary"] = {} - if u"vary" in response_headers: - varied_headers = response_headers[u"vary"].split(",") + data["vary"] = {} + if "vary" in response_headers: + varied_headers = response_headers["vary"].split(",") for header in varied_headers: - header = text_type(header).strip() + header = str(header).strip() header_value = request.headers.get(header, None) if header_value is not None: - header_value = text_type(header_value) - data[u"vary"][header] = header_value + header_value = str(header_value) + data["vary"][header] = header_value + + return b",".join([f"cc={self.serde_version}".encode(), self.serialize(data)]) - return b",".join([b"cc=4", msgpack.dumps(data, use_bin_type=True)]) + def serialize(self, data: dict[str, Any]) -> bytes: + return cast(bytes, msgpack.dumps(data, use_bin_type=True)) - def loads(self, request, data, body_file=None): + def loads( + self, + request: PreparedRequest, + data: bytes, + body_file: IO[bytes] | None = None, + ) -> HTTPResponse | None: # Short circuit if we've been given an empty set of data if not data: - return + return None # Determine what version of the serializer the data was serialized # with @@ -88,18 +86,23 @@ def loads(self, request, data, body_file=None): ver = b"cc=0" # Get the version number out of the cc=N - ver = ver.split(b"=", 1)[-1].decode("ascii") + verstr = ver.split(b"=", 1)[-1].decode("ascii") # Dispatch to the actual load method for the given version try: - return getattr(self, "_loads_v{}".format(ver))(request, data, body_file) + return getattr(self, f"_loads_v{verstr}")(request, data, body_file) # type: ignore[no-any-return] except AttributeError: # This is a version we don't have a loads function for, so we'll # just treat it as a miss and return None - return - - def prepare_response(self, request, cached, body_file=None): + return None + + def prepare_response( + self, + request: PreparedRequest, + cached: Mapping[str, Any], + body_file: IO[bytes] | None = None, + ) -> HTTPResponse | None: """Verify our vary headers match and construct a real urllib3 HTTPResponse object. """ @@ -108,23 +111,26 @@ def prepare_response(self, request, cached, body_file=None): # This case is also handled in the controller code when creating # a cache entry, but is left here for backwards compatibility. if "*" in cached.get("vary", {}): - return + return None # Ensure that the Vary headers for the cached response match our # request for header, value in cached.get("vary", {}).items(): if request.headers.get(header, None) != value: - return + return None body_raw = cached["response"].pop("body") - headers = CaseInsensitiveDict(data=cached["response"]["headers"]) + headers: CaseInsensitiveDict[str] = CaseInsensitiveDict( + data=cached["response"]["headers"] + ) if headers.get("transfer-encoding", "") == "chunked": headers.pop("transfer-encoding") cached["response"]["headers"] = headers try: + body: IO[bytes] if body_file is None: body = io.BytesIO(body_raw) else: @@ -138,53 +144,63 @@ def prepare_response(self, request, cached, body_file=None): # TypeError: 'str' does not support the buffer interface body = io.BytesIO(body_raw.encode("utf8")) + # Discard any `strict` parameter serialized by older version of cachecontrol. + cached["response"].pop("strict", None) + return HTTPResponse(body=body, preload_content=False, **cached["response"]) - def _loads_v0(self, request, data, body_file=None): + def _loads_v0( + self, + request: PreparedRequest, + data: bytes, + body_file: IO[bytes] | None = None, + ) -> None: # The original legacy cache data. This doesn't contain enough # information to construct everything we need, so we'll treat this as # a miss. - return - - def _loads_v1(self, request, data, body_file=None): - try: - cached = pickle.loads(data) - except ValueError: - return - - return self.prepare_response(request, cached, body_file) - - def _loads_v2(self, request, data, body_file=None): - assert body_file is None - try: - cached = json.loads(zlib.decompress(data).decode("utf8")) - except (ValueError, zlib.error): - return - - # We need to decode the items that we've base64 encoded - cached["response"]["body"] = _b64_decode_bytes(cached["response"]["body"]) - cached["response"]["headers"] = dict( - (_b64_decode_str(k), _b64_decode_str(v)) - for k, v in cached["response"]["headers"].items() - ) - cached["response"]["reason"] = _b64_decode_str(cached["response"]["reason"]) - cached["vary"] = dict( - (_b64_decode_str(k), _b64_decode_str(v) if v is not None else v) - for k, v in cached["vary"].items() - ) - - return self.prepare_response(request, cached, body_file) - - def _loads_v3(self, request, data, body_file): + return None + + def _loads_v1( + self, + request: PreparedRequest, + data: bytes, + body_file: IO[bytes] | None = None, + ) -> HTTPResponse | None: + # The "v1" pickled cache format. This is no longer supported + # for security reasons, so we treat it as a miss. + return None + + def _loads_v2( + self, + request: PreparedRequest, + data: bytes, + body_file: IO[bytes] | None = None, + ) -> HTTPResponse | None: + # The "v2" compressed base64 cache format. + # This has been removed due to age and poor size/performance + # characteristics, so we treat it as a miss. + return None + + def _loads_v3( + self, + request: PreparedRequest, + data: bytes, + body_file: IO[bytes] | None = None, + ) -> None: # Due to Python 2 encoding issues, it's impossible to know for sure # exactly how to load v3 entries, thus we'll treat these as a miss so # that they get rewritten out as v4 entries. - return - - def _loads_v4(self, request, data, body_file=None): + return None + + def _loads_v4( + self, + request: PreparedRequest, + data: bytes, + body_file: IO[bytes] | None = None, + ) -> HTTPResponse | None: try: cached = msgpack.loads(data, raw=False) except ValueError: - return + return None return self.prepare_response(request, cached, body_file) diff --git a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py index b6ee7f2..f618bc3 100644 --- a/.venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py +++ b/.venv/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py @@ -1,22 +1,32 @@ # SPDX-FileCopyrightText: 2015 Eric Larson # # SPDX-License-Identifier: Apache-2.0 +from __future__ import annotations -from .adapter import CacheControlAdapter -from .cache import DictCache +from typing import TYPE_CHECKING, Collection +from pip._vendor.cachecontrol.adapter import CacheControlAdapter +from pip._vendor.cachecontrol.cache import DictCache -def CacheControl( - sess, - cache=None, - cache_etags=True, - serializer=None, - heuristic=None, - controller_class=None, - adapter_class=None, - cacheable_methods=None, -): +if TYPE_CHECKING: + from pip._vendor import requests + + from pip._vendor.cachecontrol.cache import BaseCache + from pip._vendor.cachecontrol.controller import CacheController + from pip._vendor.cachecontrol.heuristics import BaseHeuristic + from pip._vendor.cachecontrol.serialize import Serializer + +def CacheControl( + sess: requests.Session, + cache: BaseCache | None = None, + cache_etags: bool = True, + serializer: Serializer | None = None, + heuristic: BaseHeuristic | None = None, + controller_class: type[CacheController] | None = None, + adapter_class: type[CacheControlAdapter] | None = None, + cacheable_methods: Collection[str] | None = None, +) -> requests.Session: cache = DictCache() if cache is None else cache adapter_class = adapter_class or CacheControlAdapter adapter = adapter_class( diff --git a/.venv/Lib/site-packages/pip/_vendor/certifi/__init__.py b/.venv/Lib/site-packages/pip/_vendor/certifi/__init__.py index 705f416..8ce89ce 100644 --- a/.venv/Lib/site-packages/pip/_vendor/certifi/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/certifi/__init__.py @@ -1,4 +1,4 @@ from .core import contents, where __all__ = ["contents", "where"] -__version__ = "2023.05.07" +__version__ = "2023.07.22" diff --git a/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc index aa9593c..43e07b2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc index a9d6ee7..d19251f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc index cdb2947..02f950d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem b/.venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem index 5183934..0212369 100644 --- a/.venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem +++ b/.venv/Lib/site-packages/pip/_vendor/certifi/cacert.pem @@ -791,34 +791,6 @@ uLjbvrW5KfnaNwUASZQDhETnv0Mxz3WLJdH0pmT1kvarBes96aULNmLazAZfNou2 XjG4Kvte9nHfRCaexOYNkbQudZWAUWpLMKawYqGT8ZvYzsRjdT9ZR7E= -----END CERTIFICATE----- -# Issuer: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Subject: CN=Hongkong Post Root CA 1 O=Hongkong Post -# Label: "Hongkong Post Root CA 1" -# Serial: 1000 -# MD5 Fingerprint: a8:0d:6f:39:78:b9:43:6d:77:42:6d:98:5a:cc:23:ca -# SHA1 Fingerprint: d6:da:a8:20:8d:09:d2:15:4d:24:b5:2f:cb:34:6e:b2:58:b2:8a:58 -# SHA256 Fingerprint: f9:e6:7d:33:6c:51:00:2a:c0:54:c6:32:02:2d:66:dd:a2:e7:e3:ff:f1:0a:d0:61:ed:31:d8:bb:b4:10:cf:b2 ------BEGIN CERTIFICATE----- -MIIDMDCCAhigAwIBAgICA+gwDQYJKoZIhvcNAQEFBQAwRzELMAkGA1UEBhMCSEsx -FjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdrb25nIFBvc3Qg -Um9vdCBDQSAxMB4XDTAzMDUxNTA1MTMxNFoXDTIzMDUxNTA0NTIyOVowRzELMAkG -A1UEBhMCSEsxFjAUBgNVBAoTDUhvbmdrb25nIFBvc3QxIDAeBgNVBAMTF0hvbmdr -b25nIFBvc3QgUm9vdCBDQSAxMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKC -AQEArP84tulmAknjorThkPlAj3n54r15/gK97iSSHSL22oVyaf7XPwnU3ZG1ApzQ -jVrhVcNQhrkpJsLj2aDxaQMoIIBFIi1WpztUlVYiWR8o3x8gPW2iNr4joLFutbEn -PzlTCeqrauh0ssJlXI6/fMN4hM2eFvz1Lk8gKgifd/PFHsSaUmYeSF7jEAaPIpjh -ZY4bXSNmO7ilMlHIhqqhqZ5/dpTCpmy3QfDVyAY45tQM4vM7TG1QjMSDJ8EThFk9 -nnV0ttgCXjqQesBCNnLsak3c78QA3xMYV18meMjWCnl3v/evt3a5pQuEF10Q6m/h -q5URX208o1xNg1vysxmKgIsLhwIDAQABoyYwJDASBgNVHRMBAf8ECDAGAQH/AgED -MA4GA1UdDwEB/wQEAwIBxjANBgkqhkiG9w0BAQUFAAOCAQEADkbVPK7ih9legYsC -mEEIjEy82tvuJxuC52pF7BaLT4Wg87JwvVqWuspube5Gi27nKi6Wsxkz67SfqLI3 -7piol7Yutmcn1KZJ/RyTZXaeQi/cImyaT/JaFTmxcdcrUehtHJjA2Sr0oYJ71clB -oiMBdDhViw+5LmeiIAQ32pwL0xch4I+XeTRvhEgCIDMb5jREn5Fw9IBehEPCKdJs -EhTkYY2sEJCehFC78JZvRZ+K88psT/oROhUVRsPNH4NbLUES7VBnQRM9IauUiqpO -fMGx+6fWtScvl6tu4B3i0RwsH0Ti/L6RoZz71ilTc4afU9hDDl3WY4JxHYB0yvbi -AmvZWg== ------END CERTIFICATE----- - # Issuer: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. # Subject: CN=SecureSign RootCA11 O=Japan Certification Services, Inc. # Label: "SecureSign RootCA11" @@ -1676,50 +1648,6 @@ HL/EVlP6Y2XQ8xwOFvVrhlhNGNTkDY6lnVuR3HYkUD/GKvvZt5y11ubQ2egZixVx SK236thZiNSQvxaz2emsWWFUyBy6ysHK4bkgTI86k4mloMy/0/Z1pHWWbVY= -----END CERTIFICATE----- -# Issuer: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Subject: CN=E-Tugra Certification Authority O=E-Tu\u011fra EBG Bili\u015fim Teknolojileri ve Hizmetleri A.\u015e. OU=E-Tugra Sertifikasyon Merkezi -# Label: "E-Tugra Certification Authority" -# Serial: 7667447206703254355 -# MD5 Fingerprint: b8:a1:03:63:b0:bd:21:71:70:8a:6f:13:3a:bb:79:49 -# SHA1 Fingerprint: 51:c6:e7:08:49:06:6e:f3:92:d4:5c:a0:0d:6d:a3:62:8f:c3:52:39 -# SHA256 Fingerprint: b0:bf:d5:2b:b0:d7:d9:bd:92:bf:5d:4d:c1:3d:a2:55:c0:2c:54:2f:37:83:65:ea:89:39:11:f5:5e:55:f2:3c ------BEGIN CERTIFICATE----- -MIIGSzCCBDOgAwIBAgIIamg+nFGby1MwDQYJKoZIhvcNAQELBQAwgbIxCzAJBgNV -BAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+BgNVBAoMN0UtVHXEn3JhIEVCRyBC -aWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhpem1ldGxlcmkgQS7Fni4xJjAkBgNV -BAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBNZXJrZXppMSgwJgYDVQQDDB9FLVR1 -Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MB4XDTEzMDMwNTEyMDk0OFoXDTIz -MDMwMzEyMDk0OFowgbIxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHDAZBbmthcmExQDA+ -BgNVBAoMN0UtVHXEn3JhIEVCRyBCaWxpxZ9pbSBUZWtub2xvamlsZXJpIHZlIEhp -em1ldGxlcmkgQS7Fni4xJjAkBgNVBAsMHUUtVHVncmEgU2VydGlmaWthc3lvbiBN -ZXJrZXppMSgwJgYDVQQDDB9FLVR1Z3JhIENlcnRpZmljYXRpb24gQXV0aG9yaXR5 -MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4vU/kwVRHoViVF56C/UY -B4Oufq9899SKa6VjQzm5S/fDxmSJPZQuVIBSOTkHS0vdhQd2h8y/L5VMzH2nPbxH -D5hw+IyFHnSOkm0bQNGZDbt1bsipa5rAhDGvykPL6ys06I+XawGb1Q5KCKpbknSF -Q9OArqGIW66z6l7LFpp3RMih9lRozt6Plyu6W0ACDGQXwLWTzeHxE2bODHnv0ZEo -q1+gElIwcxmOj+GMB6LDu0rw6h8VqO4lzKRG+Bsi77MOQ7osJLjFLFzUHPhdZL3D -k14opz8n8Y4e0ypQBaNV2cvnOVPAmJ6MVGKLJrD3fY185MaeZkJVgkfnsliNZvcH -fC425lAcP9tDJMW/hkd5s3kc91r0E+xs+D/iWR+V7kI+ua2oMoVJl0b+SzGPWsut -dEcf6ZG33ygEIqDUD13ieU/qbIWGvaimzuT6w+Gzrt48Ue7LE3wBf4QOXVGUnhMM -ti6lTPk5cDZvlsouDERVxcr6XQKj39ZkjFqzAQqptQpHF//vkUAqjqFGOjGY5RH8 -zLtJVor8udBhmm9lbObDyz51Sf6Pp+KJxWfXnUYTTjF2OySznhFlhqt/7x3U+Lzn -rFpct1pHXFXOVbQicVtbC/DP3KBhZOqp12gKY6fgDT+gr9Oq0n7vUaDmUStVkhUX -U8u3Zg5mTPj5dUyQ5xJwx0UCAwEAAaNjMGEwHQYDVR0OBBYEFC7j27JJ0JxUeVz6 -Jyr+zE7S6E5UMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0jBBgwFoAULuPbsknQnFR5 -XPonKv7MTtLoTlQwDgYDVR0PAQH/BAQDAgEGMA0GCSqGSIb3DQEBCwUAA4ICAQAF -Nzr0TbdF4kV1JI+2d1LoHNgQk2Xz8lkGpD4eKexd0dCrfOAKkEh47U6YA5n+KGCR -HTAduGN8qOY1tfrTYXbm1gdLymmasoR6d5NFFxWfJNCYExL/u6Au/U5Mh/jOXKqY -GwXgAEZKgoClM4so3O0409/lPun++1ndYYRP0lSWE2ETPo+Aab6TR7U1Q9Jauz1c -77NCR807VRMGsAnb/WP2OogKmW9+4c4bU2pEZiNRCHu8W1Ki/QY3OEBhj0qWuJA3 -+GbHeJAAFS6LrVE1Uweoa2iu+U48BybNCAVwzDk/dr2l02cmAYamU9JgO3xDf1WK -vJUawSg5TB9D0pH0clmKuVb8P7Sd2nCcdlqMQ1DujjByTd//SffGqWfZbawCEeI6 -FiWnWAjLb1NBnEg4R2gz0dfHj9R0IdTDBZB6/86WiLEVKV0jq9BgoRJP3vQXzTLl -yb/IQ639Lo7xr+L0mPoSHyDYwKcMhcWQ9DstliaxLL5Mq+ux0orJ23gTDx4JnW2P -AJ8C2sH6H3p6CcRK5ogql5+Ji/03X186zjhZhkuvcQu02PJwT58yE+Owp1fl2tpD -y4Q08ijE6m30Ku/Ba3ba+367hTzSU8JNvnHhRdH9I2cNE3X7z2VnIp2usAnRCf8d -NL/+I5c30jn6PQ0GC7TbO6Orb1wdtn7os4I07QZcJA== ------END CERTIFICATE----- - # Issuer: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center # Subject: CN=T-TeleSec GlobalRoot Class 2 O=T-Systems Enterprise Services GmbH OU=T-Systems Trust Center # Label: "T-TeleSec GlobalRoot Class 2" @@ -4397,73 +4325,6 @@ ut6Dacpps6kFtZaSF4fC0urQe87YQVt8rgIwRt7qy12a7DLCZRawTDBcMPPaTnOG BtjOiQRINzf43TNRnXCve1XYAS59BWQOhriR -----END CERTIFICATE----- -# Issuer: CN=E-Tugra Global Root CA RSA v3 O=E-Tugra EBG A.S. OU=E-Tugra Trust Center -# Subject: CN=E-Tugra Global Root CA RSA v3 O=E-Tugra EBG A.S. OU=E-Tugra Trust Center -# Label: "E-Tugra Global Root CA RSA v3" -# Serial: 75951268308633135324246244059508261641472512052 -# MD5 Fingerprint: 22:be:10:f6:c2:f8:03:88:73:5f:33:29:47:28:47:a4 -# SHA1 Fingerprint: e9:a8:5d:22:14:52:1c:5b:aa:0a:b4:be:24:6a:23:8a:c9:ba:e2:a9 -# SHA256 Fingerprint: ef:66:b0:b1:0a:3c:db:9f:2e:36:48:c7:6b:d2:af:18:ea:d2:bf:e6:f1:17:65:5e:28:c4:06:0d:a1:a3:f4:c2 ------BEGIN CERTIFICATE----- -MIIF8zCCA9ugAwIBAgIUDU3FzRYilZYIfrgLfxUGNPt5EDQwDQYJKoZIhvcNAQEL -BQAwgYAxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUt -VHVncmEgRUJHIEEuUy4xHTAbBgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYw -JAYDVQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENBIFJTQSB2MzAeFw0yMDAzMTgw -OTA3MTdaFw00NTAzMTIwOTA3MTdaMIGAMQswCQYDVQQGEwJUUjEPMA0GA1UEBxMG -QW5rYXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1 -Z3JhIFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBD -QSBSU0EgdjMwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCiZvCJt3J7 -7gnJY9LTQ91ew6aEOErxjYG7FL1H6EAX8z3DeEVypi6Q3po61CBxyryfHUuXCscx -uj7X/iWpKo429NEvx7epXTPcMHD4QGxLsqYxYdE0PD0xesevxKenhOGXpOhL9hd8 -7jwH7eKKV9y2+/hDJVDqJ4GohryPUkqWOmAalrv9c/SF/YP9f4RtNGx/ardLAQO/ -rWm31zLZ9Vdq6YaCPqVmMbMWPcLzJmAy01IesGykNz709a/r4d+ABs8qQedmCeFL -l+d3vSFtKbZnwy1+7dZ5ZdHPOrbRsV5WYVB6Ws5OUDGAA5hH5+QYfERaxqSzO8bG -wzrwbMOLyKSRBfP12baqBqG3q+Sx6iEUXIOk/P+2UNOMEiaZdnDpwA+mdPy70Bt4 -znKS4iicvObpCdg604nmvi533wEKb5b25Y08TVJ2Glbhc34XrD2tbKNSEhhw5oBO -M/J+JjKsBY04pOZ2PJ8QaQ5tndLBeSBrW88zjdGUdjXnXVXHt6woq0bM5zshtQoK -5EpZ3IE1S0SVEgpnpaH/WwAH0sDM+T/8nzPyAPiMbIedBi3x7+PmBvrFZhNb/FAH -nnGGstpvdDDPk1Po3CLW3iAfYY2jLqN4MpBs3KwytQXk9TwzDdbgh3cXTJ2w2Amo -DVf3RIXwyAS+XF1a4xeOVGNpf0l0ZAWMowIDAQABo2MwYTAPBgNVHRMBAf8EBTAD -AQH/MB8GA1UdIwQYMBaAFLK0ruYt9ybVqnUtdkvAG1Mh0EjvMB0GA1UdDgQWBBSy -tK7mLfcm1ap1LXZLwBtTIdBI7zAOBgNVHQ8BAf8EBAMCAQYwDQYJKoZIhvcNAQEL -BQADggIBAImocn+M684uGMQQgC0QDP/7FM0E4BQ8Tpr7nym/Ip5XuYJzEmMmtcyQ -6dIqKe6cLcwsmb5FJ+Sxce3kOJUxQfJ9emN438o2Fi+CiJ+8EUdPdk3ILY7r3y18 -Tjvarvbj2l0Upq7ohUSdBm6O++96SmotKygY/r+QLHUWnw/qln0F7psTpURs+APQ -3SPh/QMSEgj0GDSz4DcLdxEBSL9htLX4GdnLTeqjjO/98Aa1bZL0SmFQhO3sSdPk -vmjmLuMxC1QLGpLWgti2omU8ZgT5Vdps+9u1FGZNlIM7zR6mK7L+d0CGq+ffCsn9 -9t2HVhjYsCxVYJb6CH5SkPVLpi6HfMsg2wY+oF0Dd32iPBMbKaITVaA9FCKvb7jQ -mhty3QUBjYZgv6Rn7rWlDdF/5horYmbDB7rnoEgcOMPpRfunf/ztAmgayncSd6YA -VSgU7NbHEqIbZULpkejLPoeJVF3Zr52XnGnnCv8PWniLYypMfUeUP95L6VPQMPHF -9p5J3zugkaOj/s1YzOrfr28oO6Bpm4/srK4rVJ2bBLFHIK+WEj5jlB0E5y67hscM -moi/dkfv97ALl2bSRM9gUgfh1SxKOidhd8rXj+eHDjD/DLsE4mHDosiXYY60MGo8 -bcIHX0pzLz/5FooBZu+6kcpSV3uu1OYP3Qt6f4ueJiDPO++BcYNZ ------END CERTIFICATE----- - -# Issuer: CN=E-Tugra Global Root CA ECC v3 O=E-Tugra EBG A.S. OU=E-Tugra Trust Center -# Subject: CN=E-Tugra Global Root CA ECC v3 O=E-Tugra EBG A.S. OU=E-Tugra Trust Center -# Label: "E-Tugra Global Root CA ECC v3" -# Serial: 218504919822255052842371958738296604628416471745 -# MD5 Fingerprint: 46:bc:81:bb:f1:b5:1e:f7:4b:96:bc:14:e2:e7:27:64 -# SHA1 Fingerprint: 8a:2f:af:57:53:b1:b0:e6:a1:04:ec:5b:6a:69:71:6d:f6:1c:e2:84 -# SHA256 Fingerprint: 87:3f:46:85:fa:7f:56:36:25:25:2e:6d:36:bc:d7:f1:6f:c2:49:51:f2:64:e4:7e:1b:95:4f:49:08:cd:ca:13 ------BEGIN CERTIFICATE----- -MIICpTCCAiqgAwIBAgIUJkYZdzHhT28oNt45UYbm1JeIIsEwCgYIKoZIzj0EAwMw -gYAxCzAJBgNVBAYTAlRSMQ8wDQYDVQQHEwZBbmthcmExGTAXBgNVBAoTEEUtVHVn -cmEgRUJHIEEuUy4xHTAbBgNVBAsTFEUtVHVncmEgVHJ1c3QgQ2VudGVyMSYwJAYD -VQQDEx1FLVR1Z3JhIEdsb2JhbCBSb290IENBIEVDQyB2MzAeFw0yMDAzMTgwOTQ2 -NThaFw00NTAzMTIwOTQ2NThaMIGAMQswCQYDVQQGEwJUUjEPMA0GA1UEBxMGQW5r -YXJhMRkwFwYDVQQKExBFLVR1Z3JhIEVCRyBBLlMuMR0wGwYDVQQLExRFLVR1Z3Jh -IFRydXN0IENlbnRlcjEmMCQGA1UEAxMdRS1UdWdyYSBHbG9iYWwgUm9vdCBDQSBF -Q0MgdjMwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASOmCm/xxAeJ9urA8woLNheSBkQ -KczLWYHMjLiSF4mDKpL2w6QdTGLVn9agRtwcvHbB40fQWxPa56WzZkjnIZpKT4YK -fWzqTTKACrJ6CZtpS5iB4i7sAnCWH/31Rs7K3IKjYzBhMA8GA1UdEwEB/wQFMAMB -Af8wHwYDVR0jBBgwFoAU/4Ixcj75xGZsrTie0bBRiKWQzPUwHQYDVR0OBBYEFP+C -MXI++cRmbK04ntGwUYilkMz1MA4GA1UdDwEB/wQEAwIBBjAKBggqhkjOPQQDAwNp -ADBmAjEA5gVYaWHlLcoNy/EZCL3W/VGSGn5jVASQkZo1kTmZ+gepZpO6yGjUij/6 -7W4WAie3AjEA3VoXK3YdZUKWpqxdinlW2Iob35reX8dQj7FbcQwm32pAAOwzkSFx -vmjkI6TZraE3 ------END CERTIFICATE----- - # Issuer: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD. # Subject: CN=Security Communication RootCA3 O=SECOM Trust Systems CO.,LTD. # Label: "Security Communication RootCA3" @@ -4587,3 +4448,188 @@ AgEGMAoGCCqGSM49BAMDA2gAMGUCMBq8W9f+qdJUDkpd0m2xQNz0Q9XSSpkZElaA 94M04TVOSG0ED1cxMDAtsaqdAzjbBgIxAMvMh1PLet8gUXOQwKhbYdDFUDn9hf7B 43j4ptZLvZuHjw/l1lOWqzzIQNph91Oj9w== -----END CERTIFICATE----- + +# Issuer: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited +# Subject: CN=Sectigo Public Server Authentication Root E46 O=Sectigo Limited +# Label: "Sectigo Public Server Authentication Root E46" +# Serial: 88989738453351742415770396670917916916 +# MD5 Fingerprint: 28:23:f8:b2:98:5c:37:16:3b:3e:46:13:4e:b0:b3:01 +# SHA1 Fingerprint: ec:8a:39:6c:40:f0:2e:bc:42:75:d4:9f:ab:1c:1a:5b:67:be:d2:9a +# SHA256 Fingerprint: c9:0f:26:f0:fb:1b:40:18:b2:22:27:51:9b:5c:a2:b5:3e:2c:a5:b3:be:5c:f1:8e:fe:1b:ef:47:38:0c:53:83 +-----BEGIN CERTIFICATE----- +MIICOjCCAcGgAwIBAgIQQvLM2htpN0RfFf51KBC49DAKBggqhkjOPQQDAzBfMQsw +CQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1T +ZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwHhcN +MjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEYMBYG +A1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1YmxpYyBT +ZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBFNDYwdjAQBgcqhkjOPQIBBgUrgQQA +IgNiAAR2+pmpbiDt+dd34wc7qNs9Xzjoq1WmVk/WSOrsfy2qw7LFeeyZYX8QeccC +WvkEN/U0NSt3zn8gj1KjAIns1aeibVvjS5KToID1AZTc8GgHHs3u/iVStSBDHBv+ +6xnOQ6OjQjBAMB0GA1UdDgQWBBTRItpMWfFLXyY4qp3W7usNw/upYTAOBgNVHQ8B +Af8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zAKBggqhkjOPQQDAwNnADBkAjAn7qRa +qCG76UeXlImldCBteU/IvZNeWBj7LRoAasm4PdCkT0RHlAFWovgzJQxC36oCMB3q +4S6ILuH5px0CMk7yn2xVdOOurvulGu7t0vzCAxHrRVxgED1cf5kDW21USAGKcw== +-----END CERTIFICATE----- + +# Issuer: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited +# Subject: CN=Sectigo Public Server Authentication Root R46 O=Sectigo Limited +# Label: "Sectigo Public Server Authentication Root R46" +# Serial: 156256931880233212765902055439220583700 +# MD5 Fingerprint: 32:10:09:52:00:d5:7e:6c:43:df:15:c0:b1:16:93:e5 +# SHA1 Fingerprint: ad:98:f9:f3:e4:7d:75:3b:65:d4:82:b3:a4:52:17:bb:6e:f5:e4:38 +# SHA256 Fingerprint: 7b:b6:47:a6:2a:ee:ac:88:bf:25:7a:a5:22:d0:1f:fe:a3:95:e0:ab:45:c7:3f:93:f6:56:54:ec:38:f2:5a:06 +-----BEGIN CERTIFICATE----- +MIIFijCCA3KgAwIBAgIQdY39i658BwD6qSWn4cetFDANBgkqhkiG9w0BAQwFADBf +MQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQD +Ey1TZWN0aWdvIFB1YmxpYyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYw +HhcNMjEwMzIyMDAwMDAwWhcNNDYwMzIxMjM1OTU5WjBfMQswCQYDVQQGEwJHQjEY +MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMTYwNAYDVQQDEy1TZWN0aWdvIFB1Ymxp +YyBTZXJ2ZXIgQXV0aGVudGljYXRpb24gUm9vdCBSNDYwggIiMA0GCSqGSIb3DQEB +AQUAA4ICDwAwggIKAoICAQCTvtU2UnXYASOgHEdCSe5jtrch/cSV1UgrJnwUUxDa +ef0rty2k1Cz66jLdScK5vQ9IPXtamFSvnl0xdE8H/FAh3aTPaE8bEmNtJZlMKpnz +SDBh+oF8HqcIStw+KxwfGExxqjWMrfhu6DtK2eWUAtaJhBOqbchPM8xQljeSM9xf +iOefVNlI8JhD1mb9nxc4Q8UBUQvX4yMPFF1bFOdLvt30yNoDN9HWOaEhUTCDsG3X +ME6WW5HwcCSrv0WBZEMNvSE6Lzzpng3LILVCJ8zab5vuZDCQOc2TZYEhMbUjUDM3 +IuM47fgxMMxF/mL50V0yeUKH32rMVhlATc6qu/m1dkmU8Sf4kaWD5QazYw6A3OAS +VYCmO2a0OYctyPDQ0RTp5A1NDvZdV3LFOxxHVp3i1fuBYYzMTYCQNFu31xR13NgE +SJ/AwSiItOkcyqex8Va3e0lMWeUgFaiEAin6OJRpmkkGj80feRQXEgyDet4fsZfu ++Zd4KKTIRJLpfSYFplhym3kT2BFfrsU4YjRosoYwjviQYZ4ybPUHNs2iTG7sijbt +8uaZFURww3y8nDnAtOFr94MlI1fZEoDlSfB1D++N6xybVCi0ITz8fAr/73trdf+L +HaAZBav6+CuBQug4urv7qv094PPK306Xlynt8xhW6aWWrL3DkJiy4Pmi1KZHQ3xt +zwIDAQABo0IwQDAdBgNVHQ4EFgQUVnNYZJX5khqwEioEYnmhQBWIIUkwDgYDVR0P +AQH/BAQDAgGGMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAC9c +mTz8Bl6MlC5w6tIyMY208FHVvArzZJ8HXtXBc2hkeqK5Duj5XYUtqDdFqij0lgVQ +YKlJfp/imTYpE0RHap1VIDzYm/EDMrraQKFz6oOht0SmDpkBm+S8f74TlH7Kph52 +gDY9hAaLMyZlbcp+nv4fjFg4exqDsQ+8FxG75gbMY/qB8oFM2gsQa6H61SilzwZA +Fv97fRheORKkU55+MkIQpiGRqRxOF3yEvJ+M0ejf5lG5Nkc/kLnHvALcWxxPDkjB +JYOcCj+esQMzEhonrPcibCTRAUH4WAP+JWgiH5paPHxsnnVI84HxZmduTILA7rpX +DhjvLpr3Etiga+kFpaHpaPi8TD8SHkXoUsCjvxInebnMMTzD9joiFgOgyY9mpFui +TdaBJQbpdqQACj7LzTWb4OE4y2BThihCQRxEV+ioratF4yUQvNs+ZUH7G6aXD+u5 +dHn5HrwdVw1Hr8Mvn4dGp+smWg9WY7ViYG4A++MnESLn/pmPNPW56MORcr3Ywx65 +LvKRRFHQV80MNNVIIb/bE/FmJUNS0nAiNs2fxBx1IK1jcmMGDw4nztJqDby1ORrp +0XZ60Vzk50lJLVU3aPAaOpg+VBeHVOmmJ1CJeyAvP/+/oYtKR5j/K3tJPsMpRmAY +QqszKbrAKbkTidOIijlBO8n9pu0f9GBj39ItVQGL +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation +# Subject: CN=SSL.com TLS RSA Root CA 2022 O=SSL Corporation +# Label: "SSL.com TLS RSA Root CA 2022" +# Serial: 148535279242832292258835760425842727825 +# MD5 Fingerprint: d8:4e:c6:59:30:d8:fe:a0:d6:7a:5a:2c:2c:69:78:da +# SHA1 Fingerprint: ec:2c:83:40:72:af:26:95:10:ff:0e:f2:03:ee:31:70:f6:78:9d:ca +# SHA256 Fingerprint: 8f:af:7d:2e:2c:b4:70:9b:b8:e0:b3:36:66:bf:75:a5:dd:45:b5:de:48:0f:8e:a8:d4:bf:e6:be:bc:17:f2:ed +-----BEGIN CERTIFICATE----- +MIIFiTCCA3GgAwIBAgIQb77arXO9CEDii02+1PdbkTANBgkqhkiG9w0BAQsFADBO +MQswCQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQD +DBxTU0wuY29tIFRMUyBSU0EgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzQyMloX +DTQ2MDgxOTE2MzQyMVowTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jw +b3JhdGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgUlNBIFJvb3QgQ0EgMjAyMjCC +AiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBANCkCXJPQIgSYT41I57u9nTP +L3tYPc48DRAokC+X94xI2KDYJbFMsBFMF3NQ0CJKY7uB0ylu1bUJPiYYf7ISf5OY +t6/wNr/y7hienDtSxUcZXXTzZGbVXcdotL8bHAajvI9AI7YexoS9UcQbOcGV0ins +S657Lb85/bRi3pZ7QcacoOAGcvvwB5cJOYF0r/c0WRFXCsJbwST0MXMwgsadugL3 +PnxEX4MN8/HdIGkWCVDi1FW24IBydm5MR7d1VVm0U3TZlMZBrViKMWYPHqIbKUBO +L9975hYsLfy/7PO0+r4Y9ptJ1O4Fbtk085zx7AGL0SDGD6C1vBdOSHtRwvzpXGk3 +R2azaPgVKPC506QVzFpPulJwoxJF3ca6TvvC0PeoUidtbnm1jPx7jMEWTO6Af77w +dr5BUxIzrlo4QqvXDz5BjXYHMtWrifZOZ9mxQnUjbvPNQrL8VfVThxc7wDNY8VLS ++YCk8OjwO4s4zKTGkH8PnP2L0aPP2oOnaclQNtVcBdIKQXTbYxE3waWglksejBYS +d66UNHsef8JmAOSqg+qKkK3ONkRN0VHpvB/zagX9wHQfJRlAUW7qglFA35u5CCoG +AtUjHBPW6dvbxrB6y3snm/vg1UYk7RBLY0ulBY+6uB0rpvqR4pJSvezrZ5dtmi2f +gTIFZzL7SAg/2SW4BCUvAgMBAAGjYzBhMA8GA1UdEwEB/wQFMAMBAf8wHwYDVR0j +BBgwFoAU+y437uOEeicuzRk1sTN8/9REQrkwHQYDVR0OBBYEFPsuN+7jhHonLs0Z +NbEzfP/UREK5MA4GA1UdDwEB/wQEAwIBhjANBgkqhkiG9w0BAQsFAAOCAgEAjYlt +hEUY8U+zoO9opMAdrDC8Z2awms22qyIZZtM7QbUQnRC6cm4pJCAcAZli05bg4vsM +QtfhWsSWTVTNj8pDU/0quOr4ZcoBwq1gaAafORpR2eCNJvkLTqVTJXojpBzOCBvf +R4iyrT7gJ4eLSYwfqUdYe5byiB0YrrPRpgqU+tvT5TgKa3kSM/tKWTcWQA673vWJ +DPFs0/dRa1419dvAJuoSc06pkZCmF8NsLzjUo3KUQyxi4U5cMj29TH0ZR6LDSeeW +P4+a0zvkEdiLA9z2tmBVGKaBUfPhqBVq6+AL8BQx1rmMRTqoENjwuSfr98t67wVy +lrXEj5ZzxOhWc5y8aVFjvO9nHEMaX3cZHxj4HCUp+UmZKbaSPaKDN7EgkaibMOlq +bLQjk2UEqxHzDh1TJElTHaE/nUiSEeJ9DU/1172iWD54nR4fK/4huxoTtrEoZP2w +AgDHbICivRZQIA9ygV/MlP+7mea6kMvq+cYMwq7FGc4zoWtcu358NFcXrfA/rs3q +r5nsLFR+jM4uElZI7xc7P0peYNLcdDa8pUNjyw9bowJWCZ4kLOGGgYz+qxcs+sji +Mho6/4UIyYOf8kpIEFR3N+2ivEC+5BB09+Rbu7nzifmPQdjH5FCQNYA+HLhNkNPU +98OwoX6EyneSMSy4kLGCenROmxMmtNVQZlR4rmA= +-----END CERTIFICATE----- + +# Issuer: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation +# Subject: CN=SSL.com TLS ECC Root CA 2022 O=SSL Corporation +# Label: "SSL.com TLS ECC Root CA 2022" +# Serial: 26605119622390491762507526719404364228 +# MD5 Fingerprint: 99:d7:5c:f1:51:36:cc:e9:ce:d9:19:2e:77:71:56:c5 +# SHA1 Fingerprint: 9f:5f:d9:1a:54:6d:f5:0c:71:f0:ee:7a:bd:17:49:98:84:73:e2:39 +# SHA256 Fingerprint: c3:2f:fd:9f:46:f9:36:d1:6c:36:73:99:09:59:43:4b:9a:d6:0a:af:bb:9e:7c:f3:36:54:f1:44:cc:1b:a1:43 +-----BEGIN CERTIFICATE----- +MIICOjCCAcCgAwIBAgIQFAP1q/s3ixdAW+JDsqXRxDAKBggqhkjOPQQDAzBOMQsw +CQYDVQQGEwJVUzEYMBYGA1UECgwPU1NMIENvcnBvcmF0aW9uMSUwIwYDVQQDDBxT +U0wuY29tIFRMUyBFQ0MgUm9vdCBDQSAyMDIyMB4XDTIyMDgyNTE2MzM0OFoXDTQ2 +MDgxOTE2MzM0N1owTjELMAkGA1UEBhMCVVMxGDAWBgNVBAoMD1NTTCBDb3Jwb3Jh +dGlvbjElMCMGA1UEAwwcU1NMLmNvbSBUTFMgRUNDIFJvb3QgQ0EgMjAyMjB2MBAG +ByqGSM49AgEGBSuBBAAiA2IABEUpNXP6wrgjzhR9qLFNoFs27iosU8NgCTWyJGYm +acCzldZdkkAZDsalE3D07xJRKF3nzL35PIXBz5SQySvOkkJYWWf9lCcQZIxPBLFN +SeR7T5v15wj4A4j3p8OSSxlUgaNjMGEwDwYDVR0TAQH/BAUwAwEB/zAfBgNVHSME +GDAWgBSJjy+j6CugFFR781a4Jl9nOAuc0DAdBgNVHQ4EFgQUiY8vo+groBRUe/NW +uCZfZzgLnNAwDgYDVR0PAQH/BAQDAgGGMAoGCCqGSM49BAMDA2gAMGUCMFXjIlbp +15IkWE8elDIPDAI2wv2sdDJO4fscgIijzPvX6yv/N33w7deedWo1dlJF4AIxAMeN +b0Igj762TVntd00pxCAgRWSGOlDGxK0tk/UYfXLtqc/ErFc2KAhl3zx5Zn6g6g== +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos +# Subject: CN=Atos TrustedRoot Root CA ECC TLS 2021 O=Atos +# Label: "Atos TrustedRoot Root CA ECC TLS 2021" +# Serial: 81873346711060652204712539181482831616 +# MD5 Fingerprint: 16:9f:ad:f1:70:ad:79:d6:ed:29:b4:d1:c5:79:70:a8 +# SHA1 Fingerprint: 9e:bc:75:10:42:b3:02:f3:81:f4:f7:30:62:d4:8f:c3:a7:51:b2:dd +# SHA256 Fingerprint: b2:fa:e5:3e:14:cc:d7:ab:92:12:06:47:01:ae:27:9c:1d:89:88:fa:cb:77:5f:a8:a0:08:91:4e:66:39:88:a8 +-----BEGIN CERTIFICATE----- +MIICFTCCAZugAwIBAgIQPZg7pmY9kGP3fiZXOATvADAKBggqhkjOPQQDAzBMMS4w +LAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgRUNDIFRMUyAyMDIxMQ0w +CwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTI2MjNaFw00MTA0 +MTcwOTI2MjJaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBDQSBF +Q0MgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMHYwEAYHKoZI +zj0CAQYFK4EEACIDYgAEloZYKDcKZ9Cg3iQZGeHkBQcfl+3oZIK59sRxUM6KDP/X +tXa7oWyTbIOiaG6l2b4siJVBzV3dscqDY4PMwL502eCdpO5KTlbgmClBk1IQ1SQ4 +AjJn8ZQSb+/Xxd4u/RmAo0IwQDAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBR2 +KCXWfeBmmnoJsmo7jjPXNtNPojAOBgNVHQ8BAf8EBAMCAYYwCgYIKoZIzj0EAwMD +aAAwZQIwW5kp85wxtolrbNa9d+F851F+uDrNozZffPc8dz7kUK2o59JZDCaOMDtu +CCrCp1rIAjEAmeMM56PDr9NJLkaCI2ZdyQAUEv049OGYa3cpetskz2VAv9LcjBHo +9H1/IISpQuQo +-----END CERTIFICATE----- + +# Issuer: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos +# Subject: CN=Atos TrustedRoot Root CA RSA TLS 2021 O=Atos +# Label: "Atos TrustedRoot Root CA RSA TLS 2021" +# Serial: 111436099570196163832749341232207667876 +# MD5 Fingerprint: d4:d3:46:b8:9a:c0:9c:76:5d:9e:3a:c3:b9:99:31:d2 +# SHA1 Fingerprint: 18:52:3b:0d:06:37:e4:d6:3a:df:23:e4:98:fb:5b:16:fb:86:74:48 +# SHA256 Fingerprint: 81:a9:08:8e:a5:9f:b3:64:c5:48:a6:f8:55:59:09:9b:6f:04:05:ef:bf:18:e5:32:4e:c9:f4:57:ba:00:11:2f +-----BEGIN CERTIFICATE----- +MIIFZDCCA0ygAwIBAgIQU9XP5hmTC/srBRLYwiqipDANBgkqhkiG9w0BAQwFADBM +MS4wLAYDVQQDDCVBdG9zIFRydXN0ZWRSb290IFJvb3QgQ0EgUlNBIFRMUyAyMDIx +MQ0wCwYDVQQKDARBdG9zMQswCQYDVQQGEwJERTAeFw0yMTA0MjIwOTIxMTBaFw00 +MTA0MTcwOTIxMDlaMEwxLjAsBgNVBAMMJUF0b3MgVHJ1c3RlZFJvb3QgUm9vdCBD +QSBSU0EgVExTIDIwMjExDTALBgNVBAoMBEF0b3MxCzAJBgNVBAYTAkRFMIICIjAN +BgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAtoAOxHm9BYx9sKOdTSJNy/BBl01Z +4NH+VoyX8te9j2y3I49f1cTYQcvyAh5x5en2XssIKl4w8i1mx4QbZFc4nXUtVsYv +Ye+W/CBGvevUez8/fEc4BKkbqlLfEzfTFRVOvV98r61jx3ncCHvVoOX3W3WsgFWZ +kmGbzSoXfduP9LVq6hdKZChmFSlsAvFr1bqjM9xaZ6cF4r9lthawEO3NUDPJcFDs +GY6wx/J0W2tExn2WuZgIWWbeKQGb9Cpt0xU6kGpn8bRrZtkh68rZYnxGEFzedUln +nkL5/nWpo63/dgpnQOPF943HhZpZnmKaau1Fh5hnstVKPNe0OwANwI8f4UDErmwh +3El+fsqyjW22v5MvoVw+j8rtgI5Y4dtXz4U2OLJxpAmMkokIiEjxQGMYsluMWuPD +0xeqqxmjLBvk1cbiZnrXghmmOxYsL3GHX0WelXOTwkKBIROW1527k2gV+p2kHYzy +geBYBr3JtuP2iV2J+axEoctr+hbxx1A9JNr3w+SH1VbxT5Aw+kUJWdo0zuATHAR8 +ANSbhqRAvNncTFd+rrcztl524WWLZt+NyteYr842mIycg5kDcPOvdO3GDjbnvezB +c6eUWsuSZIKmAMFwoW4sKeFYV+xafJlrJaSQOoD0IJ2azsct+bJLKZWD6TWNp0lI +pw9MGZHQ9b8Q4HECAwEAAaNCMEAwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU +dEmZ0f+0emhFdcN+tNzMzjkz2ggwDgYDVR0PAQH/BAQDAgGGMA0GCSqGSIb3DQEB +DAUAA4ICAQAjQ1MkYlxt/T7Cz1UAbMVWiLkO3TriJQ2VSpfKgInuKs1l+NsW4AmS +4BjHeJi78+xCUvuppILXTdiK/ORO/auQxDh1MoSf/7OwKwIzNsAQkG8dnK/haZPs +o0UvFJ/1TCplQ3IM98P4lYsU84UgYt1UU90s3BiVaU+DR3BAM1h3Egyi61IxHkzJ +qM7F78PRreBrAwA0JrRUITWXAdxfG/F851X6LWh3e9NpzNMOa7pNdkTWwhWaJuyw +xfW70Xp0wmzNxbVe9kzmWy2B27O3Opee7c9GslA9hGCZcbUztVdF5kJHdWoOsAgM +rr3e97sPWD2PAzHoPYJQyi9eDF20l74gNAf0xBLh7tew2VktafcxBPTy+av5EzH4 +AXcOPUIjJsyacmdRIXrMPIWo6iFqO9taPKU0nprALN+AnCng33eU0aKAQv9qTFsR +0PXNor6uzFFcw9VUewyu1rkGd4Di7wcaaMxZUa1+XGdrudviB0JbuAEFWDlN5LuY +o7Ey7Nmj1m+UI/87tyll5gfp77YZ6ufCOB0yiJA8EytuzO+rdwY0d4RPcuSBhPm5 +dDTedk+SKlOxJTnbPP/lPqYO5Wue/9vsL3SD3460s6neFE3/MaNFcyT6lSnMEpcE +oji2jbDwN/zIIX8/syQbPYtuzE2wFg2WHYMfRsCbvUOZ58SWLs5fyQ== +-----END CERTIFICATE----- diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc index b98a225..1f59f45 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc index 395f194..9030bfc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc index 48e38ab..a12ced0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc index b37ed72..d26e0fc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc index 81b6918..d3c164d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc index 4a447c0..4854210 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc index 0409ccc..8a302ec 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc index 3142129..326b467 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachinedict.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc index 4aa9eb4..843ae02 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc index 441e376..62e60b2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc index 3259ed4..2dc9a33 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc index 217e38e..345e34d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc index 5da50e8..42f66ca 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc index 6472d37..3411f5b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc index 929fff5..c74a56b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc index 6d19978..771dd3d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc index fb04b14..1e841f5 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc index eee7089..4b30034 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc index f3107b3..6a425ff 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc index 96d21a9..31ec87b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc index 117d03f..b1f8dcb 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc index 2eac127..0d4ab55 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabfreq.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc index 026dfc5..454faa4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/johabprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc index 76c7c27..6bb77ac 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc index 9b5cb00..fda7c4c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc index bd217cf..18c925f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc index 7080091..c568f3d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc index 9e5c2d2..8198528 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc index f74fd31..54e54fc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc index 792f9e9..618c85b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc index e557bc5..6dced68 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc index d4ed4cb..83a03ab 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc index b6b785e..dd6c1b2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/macromanprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc index c233a1f..e63dc4e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc index a67dba1..9e811f4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc index 76ddc3a..84ccac7 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc index 1e56bf8..4acb7ae 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/resultdict.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc index 01495f4..4a1a329 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc index dec5123..8c05fb4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc index 29dc31f..f99b72e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc index 6dac720..890be54 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc index 5333a68..3ef081c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf1632prober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc index 79ca81d..2128bff 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc index 79ab3f0..d965a16 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc index 3cf7758..9fbb010 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc index 24b9e39..b15c595 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc index abe7970..d83fd6c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc index 45456e6..56bf30d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc index 10d4282..c83ed27 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc index 0cfc7a0..b749672 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc index fa58409..893ad46 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc index 7c32337..b0d3a33 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc index 48cfbf3..89bdc35 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc index 936c308..68d9586 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc index e7bf2cc..c1f8198 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc index 545dc4c..7f8d11b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansi_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc index dd6e15c..d744a09 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/ansitowin32_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc index e294f0e..484ac2c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/initialise_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc index 17dd204..1ff5daa 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/isatty_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc index 4223629..e81d50b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc index b43eeb5..0b28cce 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/colorama/tests/__pycache__/winterm_test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__init__.py b/.venv/Lib/site-packages/pip/_vendor/distlib/__init__.py index 962173c..e999438 100644 --- a/.venv/Lib/site-packages/pip/_vendor/distlib/__init__.py +++ b/.venv/Lib/site-packages/pip/_vendor/distlib/__init__.py @@ -1,23 +1,33 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2012-2022 Vinay Sajip. +# Copyright (C) 2012-2023 Vinay Sajip. # Licensed to the Python Software Foundation under a contributor agreement. # See LICENSE.txt and CONTRIBUTORS.txt. # import logging -__version__ = '0.3.6' +__version__ = '0.3.8' + class DistlibException(Exception): pass + try: from logging import NullHandler -except ImportError: # pragma: no cover +except ImportError: # pragma: no cover + class NullHandler(logging.Handler): - def handle(self, record): pass - def emit(self, record): pass - def createLock(self): self.lock = None + + def handle(self, record): + pass + + def emit(self, record): + pass + + def createLock(self): + self.lock = None + logger = logging.getLogger(__name__) logger.addHandler(NullHandler()) diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc index 70ae7fa..051371d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc index c6359f6..ecc25c0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc index 4ea8ddc..0ac679e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc index cda9f21..15cc55c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc index d6144bc..15357d1 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc index 7065bb9..ee7f751 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc index 933a7b2..334e143 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc index fb45763..f08ba88 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc index b26fbba..3c73d8b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc index 3b1254f..29815c3 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc index a1c4835..3a4b1b5 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc index 416c949..4a92834 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc index 68ab154..ce458c2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/compat.py b/.venv/Lib/site-packages/pip/_vendor/distlib/compat.py index 1fe3d22..e93dc27 100644 --- a/.venv/Lib/site-packages/pip/_vendor/distlib/compat.py +++ b/.venv/Lib/site-packages/pip/_vendor/distlib/compat.py @@ -8,6 +8,7 @@ import os import re +import shutil import sys try: @@ -33,9 +34,8 @@ def quote(s): import urllib2 from urllib2 import (Request, urlopen, URLError, HTTPError, - HTTPBasicAuthHandler, HTTPPasswordMgr, - HTTPHandler, HTTPRedirectHandler, - build_opener) + HTTPBasicAuthHandler, HTTPPasswordMgr, HTTPHandler, + HTTPRedirectHandler, build_opener) if ssl: from urllib2 import HTTPSHandler import httplib @@ -50,15 +50,15 @@ def quote(s): # Leaving this around for now, in case it needs resurrecting in some way # _userprog = None # def splituser(host): - # """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" - # global _userprog - # if _userprog is None: - # import re - # _userprog = re.compile('^(.*)@(.*)$') + # """splituser('user[:passwd]@host[:port]') --> 'user[:passwd]', 'host[:port]'.""" + # global _userprog + # if _userprog is None: + # import re + # _userprog = re.compile('^(.*)@(.*)$') - # match = _userprog.match(host) - # if match: return match.group(1, 2) - # return None, host + # match = _userprog.match(host) + # if match: return match.group(1, 2) + # return None, host else: # pragma: no cover from io import StringIO @@ -67,14 +67,12 @@ def quote(s): from io import TextIOWrapper as file_type import builtins import configparser - import shutil - from urllib.parse import (urlparse, urlunparse, urljoin, quote, - unquote, urlsplit, urlunsplit, splittype) + from urllib.parse import (urlparse, urlunparse, urljoin, quote, unquote, + urlsplit, urlunsplit, splittype) from urllib.request import (urlopen, urlretrieve, Request, url2pathname, - pathname2url, - HTTPBasicAuthHandler, HTTPPasswordMgr, - HTTPHandler, HTTPRedirectHandler, - build_opener) + pathname2url, HTTPBasicAuthHandler, + HTTPPasswordMgr, HTTPHandler, + HTTPRedirectHandler, build_opener) if ssl: from urllib.request import HTTPSHandler from urllib.error import HTTPError, URLError, ContentTooShortError @@ -88,14 +86,13 @@ def quote(s): from itertools import filterfalse filter = filter - try: from ssl import match_hostname, CertificateError -except ImportError: # pragma: no cover +except ImportError: # pragma: no cover + class CertificateError(ValueError): pass - def _dnsname_match(dn, hostname, max_wildcards=1): """Matching according to RFC 6125, section 6.4.3 @@ -145,7 +142,6 @@ def _dnsname_match(dn, hostname, max_wildcards=1): pat = re.compile(r'\A' + r'\.'.join(pats) + r'\Z', re.IGNORECASE) return pat.match(hostname) - def match_hostname(cert, hostname): """Verify that *cert* (in decoded format as returned by SSLSocket.getpeercert()) matches the *hostname*. RFC 2818 and RFC 6125 @@ -178,24 +174,26 @@ def match_hostname(cert, hostname): dnsnames.append(value) if len(dnsnames) > 1: raise CertificateError("hostname %r " - "doesn't match either of %s" - % (hostname, ', '.join(map(repr, dnsnames)))) + "doesn't match either of %s" % + (hostname, ', '.join(map(repr, dnsnames)))) elif len(dnsnames) == 1: raise CertificateError("hostname %r " - "doesn't match %r" - % (hostname, dnsnames[0])) + "doesn't match %r" % + (hostname, dnsnames[0])) else: raise CertificateError("no appropriate commonName or " - "subjectAltName fields were found") + "subjectAltName fields were found") try: from types import SimpleNamespace as Container except ImportError: # pragma: no cover + class Container(object): """ A generic container for when multiple values need to be returned """ + def __init__(self, **kwargs): self.__dict__.update(kwargs) @@ -214,6 +212,7 @@ def which(cmd, mode=os.F_OK | os.X_OK, path=None): path. """ + # Check that a given file can be accessed with the correct mode. # Additionally check that `file` is not a directory, as on Windows # directories pass the os.access check. @@ -237,7 +236,7 @@ def _access_check(fn, mode): if sys.platform == "win32": # The current directory takes precedence on Windows. - if not os.curdir in path: + if os.curdir not in path: path.insert(0, os.curdir) # PATHEXT is necessary to check on Windows. @@ -258,7 +257,7 @@ def _access_check(fn, mode): seen = set() for dir in path: normdir = os.path.normcase(dir) - if not normdir in seen: + if normdir not in seen: seen.add(normdir) for thefile in files: name = os.path.join(dir, thefile) @@ -277,6 +276,7 @@ def _access_check(fn, mode): from zipfile import ZipExtFile as BaseZipExtFile class ZipExtFile(BaseZipExtFile): + def __init__(self, base): self.__dict__.update(base.__dict__) @@ -288,6 +288,7 @@ def __exit__(self, *exc_info): # return None, so if an exception occurred, it will propagate class ZipFile(BaseZipFile): + def __enter__(self): return self @@ -299,9 +300,11 @@ def open(self, *args, **kwargs): base = BaseZipFile.open(self, *args, **kwargs) return ZipExtFile(base) + try: from platform import python_implementation -except ImportError: # pragma: no cover +except ImportError: # pragma: no cover + def python_implementation(): """Return a string identifying the Python implementation.""" if 'PyPy' in sys.version: @@ -312,12 +315,12 @@ def python_implementation(): return 'IronPython' return 'CPython' -import shutil + import sysconfig try: callable = callable -except NameError: # pragma: no cover +except NameError: # pragma: no cover from collections.abc import Callable def callable(obj): @@ -358,11 +361,11 @@ def fsdecode(filename): raise TypeError("expect bytes or str, not %s" % type(filename).__name__) + try: from tokenize import detect_encoding -except ImportError: # pragma: no cover +except ImportError: # pragma: no cover from codecs import BOM_UTF8, lookup - import re cookie_re = re.compile(r"coding[:=]\s*([-\w.]+)") @@ -401,6 +404,7 @@ def detect_encoding(readline): bom_found = False encoding = None default = 'utf-8' + def read_or_stop(): try: return readline() @@ -430,8 +434,8 @@ def find_cookie(line): if filename is None: msg = "unknown encoding: " + encoding else: - msg = "unknown encoding for {!r}: {}".format(filename, - encoding) + msg = "unknown encoding for {!r}: {}".format( + filename, encoding) raise SyntaxError(msg) if bom_found: @@ -440,7 +444,8 @@ def find_cookie(line): if filename is None: msg = 'encoding problem: utf-8' else: - msg = 'encoding problem for {!r}: utf-8'.format(filename) + msg = 'encoding problem for {!r}: utf-8'.format( + filename) raise SyntaxError(msg) encoding += '-sig' return encoding @@ -467,6 +472,7 @@ def find_cookie(line): return default, [first, second] + # For converting & <-> & etc. try: from html import escape @@ -479,12 +485,13 @@ def find_cookie(line): try: from collections import ChainMap -except ImportError: # pragma: no cover +except ImportError: # pragma: no cover from collections import MutableMapping try: from reprlib import recursive_repr as _recursive_repr except ImportError: + def _recursive_repr(fillvalue='...'): ''' Decorator to make a repr function return fillvalue for a recursive @@ -509,13 +516,15 @@ def wrapper(self): wrapper.__module__ = getattr(user_function, '__module__') wrapper.__doc__ = getattr(user_function, '__doc__') wrapper.__name__ = getattr(user_function, '__name__') - wrapper.__annotations__ = getattr(user_function, '__annotations__', {}) + wrapper.__annotations__ = getattr(user_function, + '__annotations__', {}) return wrapper return decorating_function class ChainMap(MutableMapping): - ''' A ChainMap groups multiple dicts (or other mappings) together + ''' + A ChainMap groups multiple dicts (or other mappings) together to create a single, updateable view. The underlying mappings are stored in a list. That list is public and can @@ -524,7 +533,6 @@ class ChainMap(MutableMapping): Lookups search the underlying mappings successively until a key is found. In contrast, writes, updates, and deletions only operate on the first mapping. - ''' def __init__(self, *maps): @@ -532,7 +540,7 @@ def __init__(self, *maps): If no mappings are provided, a single empty dictionary is used. ''' - self.maps = list(maps) or [{}] # always at least one map + self.maps = list(maps) or [{}] # always at least one map def __missing__(self, key): raise KeyError(key) @@ -540,16 +548,19 @@ def __missing__(self, key): def __getitem__(self, key): for mapping in self.maps: try: - return mapping[key] # can't use 'key in mapping' with defaultdict + return mapping[ + key] # can't use 'key in mapping' with defaultdict except KeyError: pass - return self.__missing__(key) # support subclasses that define __missing__ + return self.__missing__( + key) # support subclasses that define __missing__ def get(self, key, default=None): return self[key] if key in self else default def __len__(self): - return len(set().union(*self.maps)) # reuses stored hash values if possible + return len(set().union( + *self.maps)) # reuses stored hash values if possible def __iter__(self): return iter(set().union(*self.maps)) @@ -576,12 +587,12 @@ def copy(self): __copy__ = copy - def new_child(self): # like Django's Context.push() + def new_child(self): # like Django's Context.push() 'New ChainMap with a new dict followed by all previous maps.' return self.__class__({}, *self.maps) @property - def parents(self): # like Django's Context.pop() + def parents(self): # like Django's Context.pop() 'New ChainMap from maps[1:].' return self.__class__(*self.maps[1:]) @@ -592,7 +603,8 @@ def __delitem__(self, key): try: del self.maps[0][key] except KeyError: - raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + raise KeyError( + 'Key not found in the first mapping: {!r}'.format(key)) def popitem(self): 'Remove and return an item pair from maps[0]. Raise KeyError is maps[0] is empty.' @@ -606,15 +618,18 @@ def pop(self, key, *args): try: return self.maps[0].pop(key, *args) except KeyError: - raise KeyError('Key not found in the first mapping: {!r}'.format(key)) + raise KeyError( + 'Key not found in the first mapping: {!r}'.format(key)) def clear(self): 'Clear maps[0], leaving maps[1:] intact.' self.maps[0].clear() + try: from importlib.util import cache_from_source # Python >= 3.4 except ImportError: # pragma: no cover + def cache_from_source(path, debug_override=None): assert path.endswith('.py') if debug_override is None: @@ -625,12 +640,13 @@ def cache_from_source(path, debug_override=None): suffix = 'o' return path + suffix + try: from collections import OrderedDict -except ImportError: # pragma: no cover -## {{{ http://code.activestate.com/recipes/576693/ (r9) -# Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. -# Passes Python2.7's test suite and incorporates all the latest updates. +except ImportError: # pragma: no cover + # {{{ http://code.activestate.com/recipes/576693/ (r9) + # Backport of OrderedDict() class that runs on Python 2.4, 2.5, 2.6, 2.7 and pypy. + # Passes Python2.7's test suite and incorporates all the latest updates. try: from thread import get_ident as _get_ident except ImportError: @@ -641,9 +657,9 @@ def cache_from_source(path, debug_override=None): except ImportError: pass - class OrderedDict(dict): 'Dictionary that remembers insertion order' + # An inherited dict maps keys to values. # The inherited dict provides __getitem__, __len__, __contains__, and get. # The remaining methods are order-aware. @@ -661,11 +677,12 @@ def __init__(self, *args, **kwds): ''' if len(args) > 1: - raise TypeError('expected at most 1 arguments, got %d' % len(args)) + raise TypeError('expected at most 1 arguments, got %d' % + len(args)) try: self.__root except AttributeError: - self.__root = root = [] # sentinel node + self.__root = root = [] # sentinel node root[:] = [root, root, None] self.__map = {} self.__update(*args, **kwds) @@ -779,7 +796,7 @@ def update(*args, **kwds): ''' if len(args) > 2: raise TypeError('update() takes at most 2 positional ' - 'arguments (%d given)' % (len(args),)) + 'arguments (%d given)' % (len(args), )) elif not args: raise TypeError('update() takes at least 1 argument (0 given)') self = args[0] @@ -825,14 +842,15 @@ def setdefault(self, key, default=None): def __repr__(self, _repr_running=None): 'od.__repr__() <==> repr(od)' - if not _repr_running: _repr_running = {} + if not _repr_running: + _repr_running = {} call_key = id(self), _get_ident() if call_key in _repr_running: return '...' _repr_running[call_key] = 1 try: if not self: - return '%s()' % (self.__class__.__name__,) + return '%s()' % (self.__class__.__name__, ) return '%s(%r)' % (self.__class__.__name__, self.items()) finally: del _repr_running[call_key] @@ -844,8 +862,8 @@ def __reduce__(self): for k in vars(OrderedDict()): inst_dict.pop(k, None) if inst_dict: - return (self.__class__, (items,), inst_dict) - return self.__class__, (items,) + return (self.__class__, (items, ), inst_dict) + return self.__class__, (items, ) def copy(self): 'od.copy() -> a shallow copy of od' @@ -868,7 +886,8 @@ def __eq__(self, other): ''' if isinstance(other, OrderedDict): - return len(self)==len(other) and self.items() == other.items() + return len(self) == len( + other) and self.items() == other.items() return dict.__eq__(self, other) def __ne__(self, other): @@ -888,19 +907,18 @@ def viewitems(self): "od.viewitems() -> a set-like object providing a view on od's items" return ItemsView(self) + try: from logging.config import BaseConfigurator, valid_ident -except ImportError: # pragma: no cover +except ImportError: # pragma: no cover IDENTIFIER = re.compile('^[a-z_][a-z0-9_]*$', re.I) - def valid_ident(s): m = IDENTIFIER.match(s) if not m: raise ValueError('Not a valid Python identifier: %r' % s) return True - # The ConvertingXXX classes are wrappers around standard Python containers, # and they serve to convert any suitable values in the container. The # conversion converts base dicts, lists and tuples to their wrapped @@ -916,7 +934,7 @@ class ConvertingDict(dict): def __getitem__(self, key): value = dict.__getitem__(self, key) result = self.configurator.convert(value) - #If the converted value is different, save for next time + # If the converted value is different, save for next time if value is not result: self[key] = result if type(result) in (ConvertingDict, ConvertingList, @@ -928,7 +946,7 @@ def __getitem__(self, key): def get(self, key, default=None): value = dict.get(self, key, default) result = self.configurator.convert(value) - #If the converted value is different, save for next time + # If the converted value is different, save for next time if value is not result: self[key] = result if type(result) in (ConvertingDict, ConvertingList, @@ -949,10 +967,11 @@ def pop(self, key, default=None): class ConvertingList(list): """A converting list wrapper.""" + def __getitem__(self, key): value = list.__getitem__(self, key) result = self.configurator.convert(value) - #If the converted value is different, save for next time + # If the converted value is different, save for next time if value is not result: self[key] = result if type(result) in (ConvertingDict, ConvertingList, @@ -972,6 +991,7 @@ def pop(self, idx=-1): class ConvertingTuple(tuple): """A converting tuple wrapper.""" + def __getitem__(self, key): value = tuple.__getitem__(self, key) result = self.configurator.convert(value) @@ -995,8 +1015,8 @@ class BaseConfigurator(object): DIGIT_PATTERN = re.compile(r'^\d+$') value_converters = { - 'ext' : 'ext_convert', - 'cfg' : 'cfg_convert', + 'ext': 'ext_convert', + 'cfg': 'cfg_convert', } # We might want to use a different one, e.g. importlib @@ -1042,7 +1062,6 @@ def cfg_convert(self, value): else: rest = rest[m.end():] d = self.config[m.groups()[0]] - #print d, rest while rest: m = self.DOT_PATTERN.match(rest) if m: @@ -1055,7 +1074,9 @@ def cfg_convert(self, value): d = d[idx] else: try: - n = int(idx) # try as number first (most likely) + n = int( + idx + ) # try as number first (most likely) d = d[n] except TypeError: d = d[idx] @@ -1064,7 +1085,7 @@ def cfg_convert(self, value): else: raise ValueError('Unable to convert ' '%r at %r' % (value, rest)) - #rest should be empty + # rest should be empty return d def convert(self, value): @@ -1073,14 +1094,15 @@ def convert(self, value): replaced by their converting alternatives. Strings are checked to see if they have a conversion format and are converted if they do. """ - if not isinstance(value, ConvertingDict) and isinstance(value, dict): + if not isinstance(value, ConvertingDict) and isinstance( + value, dict): value = ConvertingDict(value) value.configurator = self - elif not isinstance(value, ConvertingList) and isinstance(value, list): + elif not isinstance(value, ConvertingList) and isinstance( + value, list): value = ConvertingList(value) value.configurator = self - elif not isinstance(value, ConvertingTuple) and\ - isinstance(value, tuple): + elif not isinstance(value, ConvertingTuple) and isinstance(value, tuple): value = ConvertingTuple(value) value.configurator = self elif isinstance(value, string_types): diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/database.py b/.venv/Lib/site-packages/pip/_vendor/distlib/database.py index 5db5d7f..eb3765f 100644 --- a/.venv/Lib/site-packages/pip/_vendor/distlib/database.py +++ b/.venv/Lib/site-packages/pip/_vendor/distlib/database.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2012-2017 The Python Software Foundation. +# Copyright (C) 2012-2023 The Python Software Foundation. # See LICENSE.txt and CONTRIBUTORS.txt. # """PEP 376 implementation.""" @@ -25,11 +25,10 @@ from .util import (parse_requirement, cached_property, parse_name_and_version, read_exports, write_exports, CSVReader, CSVWriter) - -__all__ = ['Distribution', 'BaseInstalledDistribution', - 'InstalledDistribution', 'EggInfoDistribution', - 'DistributionPath'] - +__all__ = [ + 'Distribution', 'BaseInstalledDistribution', 'InstalledDistribution', + 'EggInfoDistribution', 'DistributionPath' +] logger = logging.getLogger(__name__) @@ -46,6 +45,7 @@ class _Cache(object): """ A simple cache mapping names and .dist-info paths to distributions """ + def __init__(self): """ Initialise an instance. There is normally one for each DistributionPath. @@ -76,6 +76,7 @@ class DistributionPath(object): """ Represents a set of distributions installed on a path (typically sys.path). """ + def __init__(self, path=None, include_egg=False): """ Create an instance from a path, optionally including legacy (distutils/ @@ -111,7 +112,6 @@ def clear_cache(self): self._cache.clear() self._cache_egg.clear() - def _yield_distributions(self): """ Yield .dist-info and/or .egg(-info) distributions. @@ -134,11 +134,13 @@ def _yield_distributions(self): continue try: if self._include_dist and entry.endswith(DISTINFO_EXT): - possible_filenames = [METADATA_FILENAME, - WHEEL_METADATA_FILENAME, - LEGACY_METADATA_FILENAME] + possible_filenames = [ + METADATA_FILENAME, WHEEL_METADATA_FILENAME, + LEGACY_METADATA_FILENAME + ] for metadata_filename in possible_filenames: - metadata_path = posixpath.join(entry, metadata_filename) + metadata_path = posixpath.join( + entry, metadata_filename) pydist = finder.find(metadata_path) if pydist: break @@ -146,13 +148,15 @@ def _yield_distributions(self): continue with contextlib.closing(pydist.as_stream()) as stream: - metadata = Metadata(fileobj=stream, scheme='legacy') + metadata = Metadata(fileobj=stream, + scheme='legacy') logger.debug('Found %s', r.path) seen.add(r.path) - yield new_dist_class(r.path, metadata=metadata, + yield new_dist_class(r.path, + metadata=metadata, env=self) - elif self._include_egg and entry.endswith(('.egg-info', - '.egg')): + elif self._include_egg and entry.endswith( + ('.egg-info', '.egg')): logger.debug('Found %s', r.path) seen.add(r.path) yield old_dist_class(r.path, self) @@ -271,7 +275,7 @@ def provides_distribution(self, name, version=None): matcher = self._scheme.matcher('%s (%s)' % (name, version)) except ValueError: raise DistlibException('invalid name or version: %r, %r' % - (name, version)) + (name, version)) for dist in self.get_distributions(): # We hit a problem on Travis where enum34 was installed and doesn't @@ -346,12 +350,12 @@ def __init__(self, metadata): """ self.metadata = metadata self.name = metadata.name - self.key = self.name.lower() # for case-insensitive comparisons + self.key = self.name.lower() # for case-insensitive comparisons self.version = metadata.version self.locator = None self.digest = None - self.extras = None # additional features requested - self.context = None # environment marker overrides + self.extras = None # additional features requested + self.context = None # environment marker overrides self.download_urls = set() self.digests = {} @@ -362,7 +366,7 @@ def source_url(self): """ return self.metadata.source_url - download_url = source_url # Backward compatibility + download_url = source_url # Backward compatibility @property def name_and_version(self): @@ -386,10 +390,10 @@ def provides(self): def _get_requirements(self, req_attr): md = self.metadata reqts = getattr(md, req_attr) - logger.debug('%s: got requirements %r from metadata: %r', self.name, req_attr, - reqts) - return set(md.get_requirements(reqts, extras=self.extras, - env=self.context)) + logger.debug('%s: got requirements %r from metadata: %r', self.name, + req_attr, reqts) + return set( + md.get_requirements(reqts, extras=self.extras, env=self.context)) @property def run_requires(self): @@ -426,12 +430,11 @@ def matches_requirement(self, req): matcher = scheme.matcher(r.requirement) except UnsupportedVersionError: # XXX compat-mode if cannot read the version - logger.warning('could not read version %r - using name only', - req) + logger.warning('could not read version %r - using name only', req) name = req.split()[0] matcher = scheme.matcher(name) - name = matcher.key # case-insensitive + name = matcher.key # case-insensitive result = False for p in self.provides: @@ -466,9 +469,8 @@ def __eq__(self, other): if type(other) is not type(self): result = False else: - result = (self.name == other.name and - self.version == other.version and - self.source_url == other.source_url) + result = (self.name == other.name and self.version == other.version + and self.source_url == other.source_url) return result def __hash__(self): @@ -559,8 +561,8 @@ def __init__(self, path, metadata=None, env=None): if r is None: r = finder.find(LEGACY_METADATA_FILENAME) if r is None: - raise ValueError('no %s found in %s' % (METADATA_FILENAME, - path)) + raise ValueError('no %s found in %s' % + (METADATA_FILENAME, path)) with contextlib.closing(r.as_stream()) as stream: metadata = Metadata(fileobj=stream, scheme='legacy') @@ -571,7 +573,7 @@ def __init__(self, path, metadata=None, env=None): r = finder.find('REQUESTED') self.requested = r is not None - p = os.path.join(path, 'top_level.txt') + p = os.path.join(path, 'top_level.txt') if os.path.exists(p): with open(p, 'rb') as f: data = f.read().decode('utf-8') @@ -596,14 +598,14 @@ def _get_records(self): with contextlib.closing(r.as_stream()) as stream: with CSVReader(stream=stream) as record_reader: # Base location is parent dir of .dist-info dir - #base_location = os.path.dirname(self.path) - #base_location = os.path.abspath(base_location) + # base_location = os.path.dirname(self.path) + # base_location = os.path.abspath(base_location) for row in record_reader: missing = [None for i in range(len(row), 3)] path, checksum, size = row + missing - #if not os.path.isabs(path): - # path = path.replace('/', os.sep) - # path = os.path.join(base_location, path) + # if not os.path.isabs(path): + # path = path.replace('/', os.sep) + # path = os.path.join(base_location, path) results.append((path, checksum, size)) return results @@ -701,8 +703,8 @@ def write_installed_files(self, paths, prefix, dry_run=False): size = '%d' % os.path.getsize(path) with open(path, 'rb') as fp: hash_value = self.get_hash(fp.read()) - if path.startswith(base) or (base_under_prefix and - path.startswith(prefix)): + if path.startswith(base) or (base_under_prefix + and path.startswith(prefix)): path = os.path.relpath(path, base) writer.writerow((path, hash_value, size)) @@ -744,7 +746,8 @@ def check_installed_files(self): with open(path, 'rb') as f: actual_hash = self.get_hash(f.read(), hasher) if actual_hash != hash_value: - mismatches.append((path, 'hash', hash_value, actual_hash)) + mismatches.append( + (path, 'hash', hash_value, actual_hash)) return mismatches @cached_property @@ -791,7 +794,7 @@ def write_shared_locations(self, paths, dry_run=False): for key in ('prefix', 'lib', 'headers', 'scripts', 'data'): path = paths[key] if os.path.isdir(paths[key]): - lines.append('%s=%s' % (key, path)) + lines.append('%s=%s' % (key, path)) for ns in paths.get('namespace', ()): lines.append('namespace=%s' % ns) @@ -854,8 +857,8 @@ def list_distinfo_files(self): yield path def __eq__(self, other): - return (isinstance(other, InstalledDistribution) and - self.path == other.path) + return (isinstance(other, InstalledDistribution) + and self.path == other.path) # See http://docs.python.org/reference/datamodel#object.__hash__ __hash__ = object.__hash__ @@ -867,13 +870,14 @@ class EggInfoDistribution(BaseInstalledDistribution): if the given path happens to be a directory, the metadata is read from the file ``PKG-INFO`` under that directory.""" - requested = True # as we have no way of knowing, assume it was + requested = True # as we have no way of knowing, assume it was shared_locations = {} def __init__(self, path, env=None): + def set_name_and_version(s, n, v): s.name = n - s.key = n.lower() # for case-insensitive comparisons + s.key = n.lower() # for case-insensitive comparisons s.version = v self.path = path @@ -903,15 +907,18 @@ def parse_requires_data(data): lines = data.splitlines() for line in lines: line = line.strip() - if line.startswith('['): - logger.warning('Unexpected line: quitting requirement scan: %r', - line) + # sectioned files have bare newlines (separating sections) + if not line: # pragma: no cover + continue + if line.startswith('['): # pragma: no cover + logger.warning( + 'Unexpected line: quitting requirement scan: %r', line) break r = parse_requirement(line) - if not r: + if not r: # pragma: no cover logger.warning('Not recognised as a requirement: %r', line) continue - if r.extras: + if r.extras: # pragma: no cover logger.warning('extra requirements in requires.txt are ' 'not supported') if not r.constraints: @@ -952,7 +959,8 @@ def parse_requires_path(req_path): metadata = Metadata(fileobj=fileobj, scheme='legacy') try: data = zipf.get_data('EGG-INFO/requires.txt') - tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode('utf-8') + tl_data = zipf.get_data('EGG-INFO/top_level.txt').decode( + 'utf-8') requires = parse_requires_data(data.decode('utf-8')) except IOError: requires = None @@ -982,8 +990,8 @@ def parse_requires_path(req_path): return metadata def __repr__(self): - return '' % ( - self.name, self.version, self.path) + return '' % (self.name, self.version, + self.path) def __str__(self): return "%s %s" % (self.name, self.version) @@ -1039,7 +1047,7 @@ def _size(path): logger.warning('Non-existent file: %s', p) if p.endswith(('.pyc', '.pyo')): continue - #otherwise fall through and fail + # otherwise fall through and fail if not os.path.isdir(p): result.append((p, _md5(p), _size(p))) result.append((record_path, None, None)) @@ -1075,12 +1083,13 @@ def list_distinfo_files(self, absolute=False): yield line def __eq__(self, other): - return (isinstance(other, EggInfoDistribution) and - self.path == other.path) + return (isinstance(other, EggInfoDistribution) + and self.path == other.path) # See http://docs.python.org/reference/datamodel#object.__hash__ __hash__ = object.__hash__ + new_dist_class = InstalledDistribution old_dist_class = EggInfoDistribution @@ -1114,7 +1123,7 @@ def add_distribution(self, distribution): """ self.adjacency_list[distribution] = [] self.reverse_list[distribution] = [] - #self.missing[distribution] = [] + # self.missing[distribution] = [] def add_edge(self, x, y, label=None): """Add an edge from distribution *x* to distribution *y* with the given @@ -1174,7 +1183,7 @@ def to_dot(self, f, skip_disconnected=True): if len(adjs) == 0 and not skip_disconnected: disconnected.append(dist) for other, label in adjs: - if not label is None: + if label is not None: f.write('"%s" -> "%s" [label="%s"]\n' % (dist.name, other.name, label)) else: @@ -1252,8 +1261,8 @@ def make_graph(dists, scheme='default'): # now make the edges for dist in dists: - requires = (dist.run_requires | dist.meta_requires | - dist.build_requires | dist.dev_requires) + requires = (dist.run_requires | dist.meta_requires + | dist.build_requires | dist.dev_requires) for req in requires: try: matcher = scheme.matcher(req) @@ -1264,7 +1273,7 @@ def make_graph(dists, scheme='default'): name = req.split()[0] matcher = scheme.matcher(name) - name = matcher.key # case-insensitive + name = matcher.key # case-insensitive matched = False if name in provided: @@ -1324,7 +1333,7 @@ def get_required_dists(dists, dist): req = set() # required distributions todo = graph.adjacency_list[dist] # list of nodes we should inspect - seen = set(t[0] for t in todo) # already added to todo + seen = set(t[0] for t in todo) # already added to todo while todo: d = todo.pop()[0] diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/index.py b/.venv/Lib/site-packages/pip/_vendor/distlib/index.py index 9b6d129..56cd286 100644 --- a/.venv/Lib/site-packages/pip/_vendor/distlib/index.py +++ b/.venv/Lib/site-packages/pip/_vendor/distlib/index.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2013 Vinay Sajip. +# Copyright (C) 2013-2023 Vinay Sajip. # Licensed to the Python Software Foundation under a contributor agreement. # See LICENSE.txt and CONTRIBUTORS.txt. # @@ -25,6 +25,7 @@ DEFAULT_INDEX = 'https://pypi.org/pypi' DEFAULT_REALM = 'pypi' + class PackageIndex(object): """ This class represents a package index compatible with PyPI, the Python @@ -119,7 +120,7 @@ def register(self, metadata): # pragma: no cover d = metadata.todict() d[':action'] = 'verify' request = self.encode_request(d.items(), []) - response = self.send_request(request) + self.send_request(request) d[':action'] = 'submit' request = self.encode_request(d.items(), []) return self.send_request(request) @@ -358,8 +359,7 @@ def verify_signature(self, signature_filename, data_filename, keystore) rc, stdout, stderr = self.run_command(cmd) if rc not in (0, 1): - raise DistlibException('verify command failed with error ' - 'code %s' % rc) + raise DistlibException('verify command failed with error code %s' % rc) return rc == 0 def download_file(self, url, destfile, digest=None, reporthook=None): diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/locators.py b/.venv/Lib/site-packages/pip/_vendor/distlib/locators.py index 966ebc0..f9f0788 100644 --- a/.venv/Lib/site-packages/pip/_vendor/distlib/locators.py +++ b/.venv/Lib/site-packages/pip/_vendor/distlib/locators.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2012-2015 Vinay Sajip. +# Copyright (C) 2012-2023 Vinay Sajip. # Licensed to the Python Software Foundation under a contributor agreement. # See LICENSE.txt and CONTRIBUTORS.txt. # @@ -38,6 +38,7 @@ HTML_CONTENT_TYPE = re.compile('text/html|application/x(ht)?ml') DEFAULT_INDEX = 'https://pypi.org/pypi' + def get_all_distribution_names(url=None): """ Return all distribution names known by an index. @@ -52,6 +53,7 @@ def get_all_distribution_names(url=None): finally: client('close')() + class RedirectHandler(BaseRedirectHandler): """ A class to work around a bug in some Python 3.2.x releases. @@ -83,6 +85,7 @@ def http_error_302(self, req, fp, code, msg, headers): http_error_301 = http_error_303 = http_error_307 = http_error_302 + class Locator(object): """ A base class for locators - things that locate distributions. @@ -272,7 +275,7 @@ def same_project(name1, name2): 'python-version': ', '.join( ['.'.join(list(v[2:])) for v in wheel.pyver]), } - except Exception as e: # pragma: no cover + except Exception: # pragma: no cover logger.warning('invalid path for wheel: %s', path) elif not path.endswith(self.downloadable_extensions): # pragma: no cover logger.debug('Not downloadable: %s', path) @@ -293,7 +296,6 @@ def same_project(name1, name2): 'filename': filename, 'url': urlunparse((scheme, netloc, origpath, params, query, '')), - #'packagetype': 'sdist', } if pyver: # pragma: no cover result['python-version'] = pyver @@ -382,12 +384,9 @@ def locate(self, requirement, prereleases=False): else: if prereleases or not vcls(k).is_prerelease: slist.append(k) - # else: - # logger.debug('skipping pre-release ' - # 'version %s of %s', k, matcher.name) except Exception: # pragma: no cover logger.warning('error matching %s with %r', matcher, k) - pass # slist.append(k) + pass # slist.append(k) if len(slist) > 1: slist = sorted(slist, key=scheme.key) if slist: @@ -456,6 +455,7 @@ def _get_project(self, name): result['digests'][url] = digest return result + class PyPIJSONLocator(Locator): """ This locator uses PyPI's JSON interface. It's very limited in functionality @@ -476,7 +476,7 @@ def _get_project(self, name): url = urljoin(self.base_url, '%s/json' % quote(name)) try: resp = self.opener.open(url) - data = resp.read().decode() # for now + data = resp.read().decode() # for now d = json.loads(data) md = Metadata(scheme=self.scheme) data = d['info'] @@ -487,7 +487,7 @@ def _get_project(self, name): md.summary = data.get('summary') dist = Distribution(md) dist.locator = self - urls = d['urls'] + # urls = d['urls'] result[md.version] = dist for info in d['urls']: url = info['url'] @@ -745,7 +745,7 @@ def _fetch(self): try: self._seen.add(link) if (not self._process_download(link) and - self._should_queue(link, url, rel)): + self._should_queue(link, url, rel)): logger.debug('Queueing %s from %s', link, url) self._to_fetch.put(link) except MetadataInvalidError: # e.g. invalid versions @@ -756,7 +756,7 @@ def _fetch(self): # always do this, to avoid hangs :-) self._to_fetch.task_done() if not url: - #logger.debug('Sentinel seen, quitting.') + # logger.debug('Sentinel seen, quitting.') break def get_page(self, url): @@ -832,6 +832,7 @@ def get_distribution_names(self): result.add(match.group(1)) return result + class DirectoryLocator(Locator): """ This class locates distributions in a directory tree. @@ -897,6 +898,7 @@ def get_distribution_names(self): break return result + class JSONLocator(Locator): """ This locator uses special extended metadata (not available on PyPI) and is @@ -935,6 +937,7 @@ def _get_project(self, name): result['urls'].setdefault(dist.version, set()).add(info['url']) return result + class DistPathLocator(Locator): """ This locator finds installed distributions in a path. It can be useful for @@ -1245,7 +1248,7 @@ def find(self, requirement, meta_extras=None, prereleases=False): if name not in self.dists_by_name: self.add_distribution(dist) else: - #import pdb; pdb.set_trace() + # import pdb; pdb.set_trace() other = self.dists_by_name[name] if other != dist: self.try_to_replace(dist, other, problems) diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/manifest.py b/.venv/Lib/site-packages/pip/_vendor/distlib/manifest.py index ca0fe44..420dcf1 100644 --- a/.venv/Lib/site-packages/pip/_vendor/distlib/manifest.py +++ b/.venv/Lib/site-packages/pip/_vendor/distlib/manifest.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2012-2013 Python Software Foundation. +# Copyright (C) 2012-2023 Python Software Foundation. # See LICENSE.txt and CONTRIBUTORS.txt. # """ @@ -34,9 +34,11 @@ # _PYTHON_VERSION = sys.version_info[:2] + class Manifest(object): - """A list of files built by on exploring the filesystem and filtered by - applying various patterns to what we find there. + """ + A list of files built by exploring the filesystem and filtered by applying various + patterns to what we find there. """ def __init__(self, base=None): @@ -154,10 +156,7 @@ def process_directive(self, directive): elif action == 'exclude': for pattern in patterns: - found = self._exclude_pattern(pattern, anchor=True) - #if not found: - # logger.warning('no previously-included files ' - # 'found matching %r', pattern) + self._exclude_pattern(pattern, anchor=True) elif action == 'global-include': for pattern in patterns: @@ -167,11 +166,7 @@ def process_directive(self, directive): elif action == 'global-exclude': for pattern in patterns: - found = self._exclude_pattern(pattern, anchor=False) - #if not found: - # logger.warning('no previously-included files ' - # 'matching %r found anywhere in ' - # 'distribution', pattern) + self._exclude_pattern(pattern, anchor=False) elif action == 'recursive-include': for pattern in patterns: @@ -181,11 +176,7 @@ def process_directive(self, directive): elif action == 'recursive-exclude': for pattern in patterns: - found = self._exclude_pattern(pattern, prefix=thedir) - #if not found: - # logger.warning('no previously-included files ' - # 'matching %r found under directory %r', - # pattern, thedir) + self._exclude_pattern(pattern, prefix=thedir) elif action == 'graft': if not self._include_pattern(None, prefix=dirpattern): diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/markers.py b/.venv/Lib/site-packages/pip/_vendor/distlib/markers.py index 9dc6841..1514d46 100644 --- a/.venv/Lib/site-packages/pip/_vendor/distlib/markers.py +++ b/.venv/Lib/site-packages/pip/_vendor/distlib/markers.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2012-2017 Vinay Sajip. +# Copyright (C) 2012-2023 Vinay Sajip. # Licensed to the Python Software Foundation under a contributor agreement. # See LICENSE.txt and CONTRIBUTORS.txt. # @@ -19,26 +19,32 @@ from .compat import string_types from .util import in_venv, parse_marker -from .version import NormalizedVersion as NV +from .version import LegacyVersion as LV __all__ = ['interpret'] -_VERSION_PATTERN = re.compile(r'((\d+(\.\d+)*\w*)|\'(\d+(\.\d+)*\w*)\'|\"(\d+(\.\d+)*\w*)\")') +_VERSION_PATTERN = re.compile( + r'((\d+(\.\d+)*\w*)|\'(\d+(\.\d+)*\w*)\'|\"(\d+(\.\d+)*\w*)\")') +_VERSION_MARKERS = {'python_version', 'python_full_version'} + + +def _is_version_marker(s): + return isinstance(s, string_types) and s in _VERSION_MARKERS + def _is_literal(o): if not isinstance(o, string_types) or not o: return False return o[0] in '\'"' + def _get_versions(s): - result = [] - for m in _VERSION_PATTERN.finditer(s): - result.append(NV(m.groups()[0])) - return set(result) + return {LV(m.groups()[0]) for m in _VERSION_PATTERN.finditer(s)} + class Evaluator(object): """ - This class is used to evaluate marker expessions. + This class is used to evaluate marker expressions. """ operations = { @@ -46,10 +52,10 @@ class Evaluator(object): '===': lambda x, y: x == y, '~=': lambda x, y: x == y or x > y, '!=': lambda x, y: x != y, - '<': lambda x, y: x < y, - '<=': lambda x, y: x == y or x < y, - '>': lambda x, y: x > y, - '>=': lambda x, y: x == y or x > y, + '<': lambda x, y: x < y, + '<=': lambda x, y: x == y or x < y, + '>': lambda x, y: x > y, + '>=': lambda x, y: x == y or x > y, 'and': lambda x, y: x and y, 'or': lambda x, y: x or y, 'in': lambda x, y: x in y, @@ -76,23 +82,27 @@ def evaluate(self, expr, context): elhs = expr['lhs'] erhs = expr['rhs'] if _is_literal(expr['lhs']) and _is_literal(expr['rhs']): - raise SyntaxError('invalid comparison: %s %s %s' % (elhs, op, erhs)) + raise SyntaxError('invalid comparison: %s %s %s' % + (elhs, op, erhs)) lhs = self.evaluate(elhs, context) rhs = self.evaluate(erhs, context) - if ((elhs == 'python_version' or erhs == 'python_version') and - op in ('<', '<=', '>', '>=', '===', '==', '!=', '~=')): - lhs = NV(lhs) - rhs = NV(rhs) - elif elhs == 'python_version' and op in ('in', 'not in'): - lhs = NV(lhs) + if ((_is_version_marker(elhs) or _is_version_marker(erhs)) + and op in ('<', '<=', '>', '>=', '===', '==', '!=', '~=')): + lhs = LV(lhs) + rhs = LV(rhs) + elif _is_version_marker(elhs) and op in ('in', 'not in'): + lhs = LV(lhs) rhs = _get_versions(rhs) result = self.operations[op](lhs, rhs) return result + _DIGITS = re.compile(r'\d+\.\d+') + def default_context(): + def format_full_version(info): version = '%s.%s.%s' % (info.major, info.minor, info.micro) kind = info.releaselevel @@ -101,7 +111,8 @@ def format_full_version(info): return version if hasattr(sys, 'implementation'): - implementation_version = format_full_version(sys.implementation.version) + implementation_version = format_full_version( + sys.implementation.version) implementation_name = sys.implementation.name else: implementation_version = '0' @@ -126,11 +137,13 @@ def format_full_version(info): } return result + DEFAULT_CONTEXT = default_context() del default_context evaluator = Evaluator() + def interpret(marker, execution_context=None): """ Interpret a marker and return a result depending on environment. @@ -143,9 +156,11 @@ def interpret(marker, execution_context=None): try: expr, rest = parse_marker(marker) except Exception as e: - raise SyntaxError('Unable to interpret marker syntax: %s: %s' % (marker, e)) + raise SyntaxError('Unable to interpret marker syntax: %s: %s' % + (marker, e)) if rest and rest[0] != '#': - raise SyntaxError('unexpected trailing data in marker: %s: %s' % (marker, rest)) + raise SyntaxError('unexpected trailing data in marker: %s: %s' % + (marker, rest)) context = dict(DEFAULT_CONTEXT) if execution_context: context.update(execution_context) diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/metadata.py b/.venv/Lib/site-packages/pip/_vendor/distlib/metadata.py index c329e19..7189aee 100644 --- a/.venv/Lib/site-packages/pip/_vendor/distlib/metadata.py +++ b/.venv/Lib/site-packages/pip/_vendor/distlib/metadata.py @@ -136,17 +136,9 @@ def _version2fieldlist(version): def _best_version(fields): """Detect the best version depending on the fields used.""" def _has_marker(keys, markers): - for marker in markers: - if marker in keys: - return True - return False - - keys = [] - for key, value in fields.items(): - if value in ([], 'UNKNOWN', None): - continue - keys.append(key) + return any(marker in keys for marker in markers) + keys = [key for key, value in fields.items() if value not in ([], 'UNKNOWN', None)] possible_versions = ['1.0', '1.1', '1.2', '1.3', '2.1', '2.2'] # 2.0 removed # first let's try to see if a field is not part of one of the version diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/scripts.py b/.venv/Lib/site-packages/pip/_vendor/distlib/scripts.py index d270624..cfa45d2 100644 --- a/.venv/Lib/site-packages/pip/_vendor/distlib/scripts.py +++ b/.venv/Lib/site-packages/pip/_vendor/distlib/scripts.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2013-2015 Vinay Sajip. +# Copyright (C) 2013-2023 Vinay Sajip. # Licensed to the Python Software Foundation under a contributor agreement. # See LICENSE.txt and CONTRIBUTORS.txt. # @@ -65,9 +65,11 @@ def enquote_executable(executable): executable = '"%s"' % executable return executable + # Keep the old name around (for now), as there is at least one project using it! _enquote_executable = enquote_executable + class ScriptMaker(object): """ A class to copy or create scripts from source scripts or callable @@ -77,21 +79,25 @@ class ScriptMaker(object): executable = None # for shebangs - def __init__(self, source_dir, target_dir, add_launchers=True, - dry_run=False, fileop=None): + def __init__(self, + source_dir, + target_dir, + add_launchers=True, + dry_run=False, + fileop=None): self.source_dir = source_dir self.target_dir = target_dir self.add_launchers = add_launchers self.force = False self.clobber = False # It only makes sense to set mode bits on POSIX. - self.set_mode = (os.name == 'posix') or (os.name == 'java' and - os._name == 'posix') + self.set_mode = (os.name == 'posix') or (os.name == 'java' + and os._name == 'posix') self.variants = set(('', 'X.Y')) self._fileop = fileop or FileOperator(dry_run) - self._is_nt = os.name == 'nt' or ( - os.name == 'java' and os._name == 'nt') + self._is_nt = os.name == 'nt' or (os.name == 'java' + and os._name == 'nt') self.version_info = sys.version_info def _get_alternate_executable(self, executable, options): @@ -102,6 +108,7 @@ def _get_alternate_executable(self, executable, options): return executable if sys.platform.startswith('java'): # pragma: no cover + def _is_shell(self, executable): """ Determine if the specified executable is a script @@ -146,8 +153,8 @@ def _build_shebang(self, executable, post_interp): max_shebang_length = 512 else: max_shebang_length = 127 - simple_shebang = ((b' ' not in executable) and - (shebang_length <= max_shebang_length)) + simple_shebang = ((b' ' not in executable) + and (shebang_length <= max_shebang_length)) if simple_shebang: result = b'#!' + executable + post_interp + b'\n' @@ -161,22 +168,25 @@ def _get_shebang(self, encoding, post_interp=b'', options=None): enquote = True if self.executable: executable = self.executable - enquote = False # assume this will be taken care of + enquote = False # assume this will be taken care of elif not sysconfig.is_python_build(): executable = get_executable() elif in_venv(): # pragma: no cover - executable = os.path.join(sysconfig.get_path('scripts'), - 'python%s' % sysconfig.get_config_var('EXE')) - else: # pragma: no cover executable = os.path.join( - sysconfig.get_config_var('BINDIR'), - 'python%s%s' % (sysconfig.get_config_var('VERSION'), - sysconfig.get_config_var('EXE'))) - if not os.path.isfile(executable): + sysconfig.get_path('scripts'), + 'python%s' % sysconfig.get_config_var('EXE')) + else: # pragma: no cover + if os.name == 'nt': # for Python builds from source on Windows, no Python executables with # a version suffix are created, so we use python.exe - executable = os.path.join(sysconfig.get_config_var('BINDIR'), - 'python%s' % (sysconfig.get_config_var('EXE'))) + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s' % (sysconfig.get_config_var('EXE'))) + else: + executable = os.path.join( + sysconfig.get_config_var('BINDIR'), + 'python%s%s' % (sysconfig.get_config_var('VERSION'), + sysconfig.get_config_var('EXE'))) if options: executable = self._get_alternate_executable(executable, options) @@ -201,7 +211,7 @@ def _get_shebang(self, encoding, post_interp=b'', options=None): executable = executable.encode('utf-8') # in case of IronPython, play safe and enable frames support if (sys.platform == 'cli' and '-X:Frames' not in post_interp - and '-X:FullFrames' not in post_interp): # pragma: no cover + and '-X:FullFrames' not in post_interp): # pragma: no cover post_interp += b' -X:Frames' shebang = self._build_shebang(executable, post_interp) # Python parser starts to read a script using UTF-8 until @@ -212,8 +222,8 @@ def _get_shebang(self, encoding, post_interp=b'', options=None): try: shebang.decode('utf-8') except UnicodeDecodeError: # pragma: no cover - raise ValueError( - 'The shebang (%r) is not decodable from utf-8' % shebang) + raise ValueError('The shebang (%r) is not decodable from utf-8' % + shebang) # If the script is encoded to a custom encoding (use a # #coding:xxx cookie), the shebang has to be decodable from # the script encoding too. @@ -221,15 +231,16 @@ def _get_shebang(self, encoding, post_interp=b'', options=None): try: shebang.decode(encoding) except UnicodeDecodeError: # pragma: no cover - raise ValueError( - 'The shebang (%r) is not decodable ' - 'from the script encoding (%r)' % (shebang, encoding)) + raise ValueError('The shebang (%r) is not decodable ' + 'from the script encoding (%r)' % + (shebang, encoding)) return shebang def _get_script_text(self, entry): - return self.script_template % dict(module=entry.prefix, - import_name=entry.suffix.split('.')[0], - func=entry.suffix) + return self.script_template % dict( + module=entry.prefix, + import_name=entry.suffix.split('.')[0], + func=entry.suffix) manifest = _DEFAULT_MANIFEST @@ -254,7 +265,8 @@ def _write_script(self, names, shebang, script_bytes, filenames, ext): source_date_epoch = os.environ.get('SOURCE_DATE_EPOCH') if source_date_epoch: date_time = time.gmtime(int(source_date_epoch))[:6] - zinfo = ZipInfo(filename='__main__.py', date_time=date_time) + zinfo = ZipInfo(filename='__main__.py', + date_time=date_time) zf.writestr(zinfo, script_bytes) else: zf.writestr('__main__.py', script_bytes) @@ -275,7 +287,7 @@ def _write_script(self, names, shebang, script_bytes, filenames, ext): 'use .deleteme logic') dfname = '%s.deleteme' % outname if os.path.exists(dfname): - os.remove(dfname) # Not allowed to fail here + os.remove(dfname) # Not allowed to fail here os.rename(outname, dfname) # nor here self._fileop.write_binary_file(outname, script_bytes) logger.debug('Able to replace executable using ' @@ -283,9 +295,10 @@ def _write_script(self, names, shebang, script_bytes, filenames, ext): try: os.remove(dfname) except Exception: - pass # still in use - ignore error + pass # still in use - ignore error else: - if self._is_nt and not outname.endswith('.' + ext): # pragma: no cover + if self._is_nt and not outname.endswith( + '.' + ext): # pragma: no cover outname = '%s.%s' % (outname, ext) if os.path.exists(outname) and not self.clobber: logger.warning('Skipping existing file %s', outname) @@ -304,8 +317,9 @@ def get_script_filenames(self, name): if 'X' in self.variants: result.add('%s%s' % (name, self.version_info[0])) if 'X.Y' in self.variants: - result.add('%s%s%s.%s' % (name, self.variant_separator, - self.version_info[0], self.version_info[1])) + result.add('%s%s%s.%s' % + (name, self.variant_separator, self.version_info[0], + self.version_info[1])) return result def _make_script(self, entry, filenames, options=None): @@ -383,12 +397,13 @@ def dry_run(self): def dry_run(self, value): self._fileop.dry_run = value - if os.name == 'nt' or (os.name == 'java' and os._name == 'nt'): # pragma: no cover + if os.name == 'nt' or (os.name == 'java' + and os._name == 'nt'): # pragma: no cover # Executable launcher support. # Launchers are from https://bitbucket.org/vinay.sajip/simple_launcher/ def _get_launcher(self, kind): - if struct.calcsize('P') == 8: # 64-bit + if struct.calcsize('P') == 8: # 64-bit bits = '64' else: bits = '32' @@ -399,8 +414,8 @@ def _get_launcher(self, kind): distlib_package = __name__.rsplit('.', 1)[0] resource = finder(distlib_package).find(name) if not resource: - msg = ('Unable to find resource %s in package %s' % (name, - distlib_package)) + msg = ('Unable to find resource %s in package %s' % + (name, distlib_package)) raise ValueError(msg) return resource.bytes diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/util.py b/.venv/Lib/site-packages/pip/_vendor/distlib/util.py index dd01849..ba58858 100644 --- a/.venv/Lib/site-packages/pip/_vendor/distlib/util.py +++ b/.venv/Lib/site-packages/pip/_vendor/distlib/util.py @@ -1,5 +1,5 @@ # -# Copyright (C) 2012-2021 The Python Software Foundation. +# Copyright (C) 2012-2023 The Python Software Foundation. # See LICENSE.txt and CONTRIBUTORS.txt. # import codecs @@ -33,7 +33,7 @@ from . import DistlibException from .compat import (string_types, text_type, shutil, raw_input, StringIO, cache_from_source, urlopen, urljoin, httplib, xmlrpclib, - splittype, HTTPHandler, BaseConfigurator, valid_ident, + HTTPHandler, BaseConfigurator, valid_ident, Container, configparser, URLError, ZipFile, fsdecode, unquote, urlparse) @@ -62,6 +62,7 @@ def parse_marker(marker_string): interpreted as a literal string, and a string not contained in quotes is a variable (such as os_name). """ + def marker_var(remaining): # either identifier, or literal string m = IDENTIFIER.match(remaining) @@ -87,7 +88,8 @@ def marker_var(remaining): else: m = STRING_CHUNK.match(remaining) if not m: - raise SyntaxError('error in string literal: %s' % remaining) + raise SyntaxError('error in string literal: %s' % + remaining) parts.append(m.groups()[0]) remaining = remaining[m.end():] else: @@ -95,7 +97,7 @@ def marker_var(remaining): raise SyntaxError('unterminated string: %s' % s) parts.append(q) result = ''.join(parts) - remaining = remaining[1:].lstrip() # skip past closing quote + remaining = remaining[1:].lstrip() # skip past closing quote return result, remaining def marker_expr(remaining): @@ -208,7 +210,8 @@ def get_versions(ver_remaining): ver_remaining = ver_remaining[m.end():] m = VERSION_IDENTIFIER.match(ver_remaining) if not m: - raise SyntaxError('invalid version: %s' % ver_remaining) + raise SyntaxError('invalid version: %s' % + ver_remaining) v = m.groups()[0] versions.append((op, v)) ver_remaining = ver_remaining[m.end():] @@ -221,7 +224,8 @@ def get_versions(ver_remaining): break m = COMPARE_OP.match(ver_remaining) if not m: - raise SyntaxError('invalid constraint: %s' % ver_remaining) + raise SyntaxError('invalid constraint: %s' % + ver_remaining) if not versions: versions = None return versions, ver_remaining @@ -231,7 +235,8 @@ def get_versions(ver_remaining): else: i = remaining.find(')', 1) if i < 0: - raise SyntaxError('unterminated parenthesis: %s' % remaining) + raise SyntaxError('unterminated parenthesis: %s' % + remaining) s = remaining[1:i] remaining = remaining[i + 1:].lstrip() # As a special diversion from PEP 508, allow a version number @@ -262,9 +267,14 @@ def get_versions(ver_remaining): if not versions: rs = distname else: - rs = '%s %s' % (distname, ', '.join(['%s %s' % con for con in versions])) - return Container(name=distname, extras=extras, constraints=versions, - marker=mark_expr, url=uri, requirement=rs) + rs = '%s %s' % (distname, ', '.join( + ['%s %s' % con for con in versions])) + return Container(name=distname, + extras=extras, + constraints=versions, + marker=mark_expr, + url=uri, + requirement=rs) def get_resources_dests(resources_root, rules): @@ -304,15 +314,15 @@ def in_venv(): def get_executable(): -# The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as -# changes to the stub launcher mean that sys.executable always points -# to the stub on OS X -# if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' -# in os.environ): -# result = os.environ['__PYVENV_LAUNCHER__'] -# else: -# result = sys.executable -# return result + # The __PYVENV_LAUNCHER__ dance is apparently no longer needed, as + # changes to the stub launcher mean that sys.executable always points + # to the stub on OS X + # if sys.platform == 'darwin' and ('__PYVENV_LAUNCHER__' + # in os.environ): + # result = os.environ['__PYVENV_LAUNCHER__'] + # else: + # result = sys.executable + # return result # Avoid normcasing: see issue #143 # result = os.path.normcase(sys.executable) result = sys.executable @@ -346,6 +356,7 @@ def extract_by_key(d, keys): result[key] = d[key] return result + def read_exports(stream): if sys.version_info[0] >= 3: # needs to be a text stream @@ -388,7 +399,7 @@ def read_stream(cp, stream): s = '%s = %s' % (name, value) entry = get_export_entry(s) assert entry is not None - #entry.dist = self + # entry.dist = self entries[name] = entry return result @@ -420,6 +431,7 @@ def tempdir(): finally: shutil.rmtree(td) + @contextlib.contextmanager def chdir(d): cwd = os.getcwd() @@ -441,19 +453,21 @@ def socket_timeout(seconds=15): class cached_property(object): + def __init__(self, func): self.func = func - #for attr in ('__name__', '__module__', '__doc__'): - # setattr(self, attr, getattr(func, attr, None)) + # for attr in ('__name__', '__module__', '__doc__'): + # setattr(self, attr, getattr(func, attr, None)) def __get__(self, obj, cls=None): if obj is None: return self value = self.func(obj) object.__setattr__(obj, self.func.__name__, value) - #obj.__dict__[self.func.__name__] = value = self.func(obj) + # obj.__dict__[self.func.__name__] = value = self.func(obj) return value + def convert_path(pathname): """Return 'pathname' as a name that will work on the native filesystem. @@ -482,6 +496,7 @@ def convert_path(pathname): class FileOperator(object): + def __init__(self, dry_run=False): self.dry_run = dry_run self.ensured = set() @@ -586,7 +601,12 @@ def ensure_dir(self, path): if self.record: self.dirs_created.add(path) - def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_invalidation=False): + def byte_compile(self, + path, + optimize=False, + force=False, + prefix=None, + hashed_invalidation=False): dpath = cache_from_source(path, not optimize) logger.info('Byte-compiling %s to %s', path, dpath) if not self.dry_run: @@ -597,9 +617,12 @@ def byte_compile(self, path, optimize=False, force=False, prefix=None, hashed_in assert path.startswith(prefix) diagpath = path[len(prefix):] compile_kwargs = {} - if hashed_invalidation and hasattr(py_compile, 'PycInvalidationMode'): - compile_kwargs['invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH - py_compile.compile(path, dpath, diagpath, True, **compile_kwargs) # raise error + if hashed_invalidation and hasattr(py_compile, + 'PycInvalidationMode'): + compile_kwargs[ + 'invalidation_mode'] = py_compile.PycInvalidationMode.CHECKED_HASH + py_compile.compile(path, dpath, diagpath, True, + **compile_kwargs) # raise error self.record_as_written(dpath) return dpath @@ -661,9 +684,10 @@ def rollback(self): assert flist == ['__pycache__'] sd = os.path.join(d, flist[0]) os.rmdir(sd) - os.rmdir(d) # should fail if non-empty + os.rmdir(d) # should fail if non-empty self._init_record() + def resolve(module_name, dotted_path): if module_name in sys.modules: mod = sys.modules[module_name] @@ -680,6 +704,7 @@ def resolve(module_name, dotted_path): class ExportEntry(object): + def __init__(self, name, prefix, suffix, flags): self.name = name self.prefix = prefix @@ -698,20 +723,21 @@ def __eq__(self, other): if not isinstance(other, ExportEntry): result = False else: - result = (self.name == other.name and - self.prefix == other.prefix and - self.suffix == other.suffix and - self.flags == other.flags) + result = (self.name == other.name and self.prefix == other.prefix + and self.suffix == other.suffix + and self.flags == other.flags) return result __hash__ = object.__hash__ -ENTRY_RE = re.compile(r'''(?P(\w|[-.+])+) +ENTRY_RE = re.compile( + r'''(?P([^\[]\S*)) \s*=\s*(?P(\w+)([:\.]\w+)*) \s*(\[\s*(?P[\w-]+(=\w+)?(,\s*\w+(=\w+)?)*)\s*\])? ''', re.VERBOSE) + def get_export_entry(specification): m = ENTRY_RE.search(specification) if not m: @@ -827,6 +853,7 @@ def get_process_umask(): os.umask(result) return result + def is_string_sequence(seq): result = True i = None @@ -837,8 +864,10 @@ def is_string_sequence(seq): assert i is not None return result -PROJECT_NAME_AND_VERSION = re.compile('([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' - '([a-z0-9_.+-]+)', re.I) + +PROJECT_NAME_AND_VERSION = re.compile( + '([a-z0-9_]+([.-][a-z_][a-z0-9_]*)*)-' + '([a-z0-9_.+-]+)', re.I) PYTHON_VERSION = re.compile(r'-py(\d\.?\d?)') @@ -866,10 +895,12 @@ def split_filename(filename, project_name=None): result = m.group(1), m.group(3), pyver return result + # Allow spaces in name because of legacy dists like "Twisted Core" NAME_VERSION_RE = re.compile(r'(?P[\w .-]+)\s*' r'\(\s*(?P[^\s)]+)\)$') + def parse_name_and_version(p): """ A utility method used to get name and version from a string. @@ -885,6 +916,7 @@ def parse_name_and_version(p): d = m.groupdict() return d['name'].strip().lower(), d['ver'] + def get_extras(requested, available): result = set() requested = set(requested or []) @@ -906,10 +938,13 @@ def get_extras(requested, available): logger.warning('undeclared extra: %s' % r) result.add(r) return result + + # # Extended metadata functionality # + def _get_external_data(url): result = {} try: @@ -923,21 +958,24 @@ def _get_external_data(url): logger.debug('Unexpected response for JSON request: %s', ct) else: reader = codecs.getreader('utf-8')(resp) - #data = reader.read().decode('utf-8') - #result = json.loads(data) + # data = reader.read().decode('utf-8') + # result = json.loads(data) result = json.load(reader) except Exception as e: logger.exception('Failed to get external data for %s: %s', url, e) return result + _external_data_base_url = 'https://www.red-dove.com/pypi/projects/' + def get_project_data(name): url = '%s/%s/project.json' % (name[0].upper(), name) url = urljoin(_external_data_base_url, url) result = _get_external_data(url) return result + def get_package_data(name, version): url = '%s/%s/package-%s.json' % (name[0].upper(), name, version) url = urljoin(_external_data_base_url, url) @@ -992,6 +1030,7 @@ class EventMixin(object): """ A very simple publish/subscribe system. """ + def __init__(self): self._subscribers = {} @@ -1053,18 +1092,20 @@ def publish(self, event, *args, **kwargs): logger.exception('Exception during event publication') value = None result.append(value) - logger.debug('publish %s: args = %s, kwargs = %s, result = %s', - event, args, kwargs, result) + logger.debug('publish %s: args = %s, kwargs = %s, result = %s', event, + args, kwargs, result) return result + # # Simple sequencing # class Sequencer(object): + def __init__(self): self._preds = {} self._succs = {} - self._nodes = set() # nodes with no preds/succs + self._nodes = set() # nodes with no preds/succs def add_node(self, node): self._nodes.add(node) @@ -1104,8 +1145,8 @@ def remove(self, pred, succ): raise ValueError('%r not a successor of %r' % (succ, pred)) def is_step(self, step): - return (step in self._preds or step in self._succs or - step in self._nodes) + return (step in self._preds or step in self._succs + or step in self._nodes) def get_steps(self, final): if not self.is_step(final): @@ -1134,7 +1175,7 @@ def get_steps(self, final): @property def strong_connections(self): - #http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm + # http://en.wikipedia.org/wiki/Tarjan%27s_strongly_connected_components_algorithm index_counter = [0] stack = [] lowlinks = {} @@ -1159,11 +1200,11 @@ def strongconnect(node): if successor not in lowlinks: # Successor has not yet been visited strongconnect(successor) - lowlinks[node] = min(lowlinks[node],lowlinks[successor]) + lowlinks[node] = min(lowlinks[node], lowlinks[successor]) elif successor in stack: # the successor is in the stack and hence in the current # strongly connected component (SCC) - lowlinks[node] = min(lowlinks[node],index[successor]) + lowlinks[node] = min(lowlinks[node], index[successor]) # If `node` is a root node, pop the stack and generate an SCC if lowlinks[node] == index[node]: @@ -1172,7 +1213,8 @@ def strongconnect(node): while True: successor = stack.pop() connected_component.append(successor) - if successor == node: break + if successor == node: + break component = tuple(connected_component) # storing the result result.append(component) @@ -1195,12 +1237,14 @@ def dot(self): result.append('}') return '\n'.join(result) + # # Unarchiving functionality for zip, tar, tgz, tbz, whl # -ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', - '.tgz', '.tbz', '.whl') +ARCHIVE_EXTENSIONS = ('.tar.gz', '.tar.bz2', '.tar', '.zip', '.tgz', '.tbz', + '.whl') + def unarchive(archive_filename, dest_dir, format=None, check=True): @@ -1249,6 +1293,20 @@ def check_path(path): for tarinfo in archive.getmembers(): if not isinstance(tarinfo.name, text_type): tarinfo.name = tarinfo.name.decode('utf-8') + + # Limit extraction of dangerous items, if this Python + # allows it easily. If not, just trust the input. + # See: https://docs.python.org/3/library/tarfile.html#extraction-filters + def extraction_filter(member, path): + """Run tarfile.tar_filter, but raise the expected ValueError""" + # This is only called if the current Python has tarfile filters + try: + return tarfile.tar_filter(member, path) + except tarfile.FilterError as exc: + raise ValueError(str(exc)) + + archive.extraction_filter = extraction_filter + archive.extractall(dest_dir) finally: @@ -1269,11 +1327,12 @@ def zip_dir(directory): zf.write(full, dest) return result + # # Simple progress bar # -UNITS = ('', 'K', 'M', 'G','T','P') +UNITS = ('', 'K', 'M', 'G', 'T', 'P') class Progress(object): @@ -1328,8 +1387,8 @@ def percentage(self): def format_duration(self, duration): if (duration <= 0) and self.max is None or self.cur == self.min: result = '??:??:??' - #elif duration < 1: - # result = '--:--:--' + # elif duration < 1: + # result = '--:--:--' else: result = time.strftime('%H:%M:%S', time.gmtime(duration)) return result @@ -1339,7 +1398,7 @@ def ETA(self): if self.done: prefix = 'Done' t = self.elapsed - #import pdb; pdb.set_trace() + # import pdb; pdb.set_trace() else: prefix = 'ETA ' if self.max is None: @@ -1347,7 +1406,7 @@ def ETA(self): elif self.elapsed == 0 or (self.cur == self.min): t = 0 else: - #import pdb; pdb.set_trace() + # import pdb; pdb.set_trace() t = float(self.max - self.min) t /= self.cur - self.min t = (t - 1) * self.elapsed @@ -1365,6 +1424,7 @@ def speed(self): result /= 1000.0 return '%d %sB/s' % (result, unit) + # # Glob functionality # @@ -1412,22 +1472,23 @@ def _iglob(path_glob): for fn in _iglob(os.path.join(path, radical)): yield fn + if ssl: from .compat import (HTTPSHandler as BaseHTTPSHandler, match_hostname, CertificateError) - -# -# HTTPSConnection which verifies certificates/matches domains -# + # + # HTTPSConnection which verifies certificates/matches domains + # class HTTPSConnection(httplib.HTTPSConnection): - ca_certs = None # set this to the path to the certs file (.pem) - check_domain = True # only used if ca_certs is not None + ca_certs = None # set this to the path to the certs file (.pem) + check_domain = True # only used if ca_certs is not None # noinspection PyPropertyAccess def connect(self): - sock = socket.create_connection((self.host, self.port), self.timeout) + sock = socket.create_connection((self.host, self.port), + self.timeout) if getattr(self, '_tunnel_host', False): self.sock = sock self._tunnel() @@ -1435,7 +1496,7 @@ def connect(self): context = ssl.SSLContext(ssl.PROTOCOL_SSLv23) if hasattr(ssl, 'OP_NO_SSLv2'): context.options |= ssl.OP_NO_SSLv2 - if self.cert_file: + if getattr(self, 'cert_file', None): context.load_cert_chain(self.cert_file, self.key_file) kwargs = {} if self.ca_certs: @@ -1455,6 +1516,7 @@ def connect(self): raise class HTTPSHandler(BaseHTTPSHandler): + def __init__(self, ca_certs, check_domain=True): BaseHTTPSHandler.__init__(self) self.ca_certs = ca_certs @@ -1481,8 +1543,9 @@ def https_open(self, req): return self.do_open(self._conn_maker, req) except URLError as e: if 'certificate verify failed' in str(e.reason): - raise CertificateError('Unable to verify server certificate ' - 'for %s' % req.host) + raise CertificateError( + 'Unable to verify server certificate ' + 'for %s' % req.host) else: raise @@ -1496,14 +1559,18 @@ def https_open(self, req): # handler for HTTP itself. # class HTTPSOnlyHandler(HTTPSHandler, HTTPHandler): + def http_open(self, req): - raise URLError('Unexpected HTTP request on what should be a secure ' - 'connection: %s' % req) + raise URLError( + 'Unexpected HTTP request on what should be a secure ' + 'connection: %s' % req) + # # XML-RPC with timeouts # class Transport(xmlrpclib.Transport): + def __init__(self, timeout, use_datetime=0): self.timeout = timeout xmlrpclib.Transport.__init__(self, use_datetime) @@ -1515,8 +1582,11 @@ def make_connection(self, host): self._connection = host, httplib.HTTPConnection(h) return self._connection[1] + if ssl: + class SafeTransport(xmlrpclib.SafeTransport): + def __init__(self, timeout, use_datetime=0): self.timeout = timeout xmlrpclib.SafeTransport.__init__(self, use_datetime) @@ -1528,12 +1598,13 @@ def make_connection(self, host): kwargs['timeout'] = self.timeout if not self._connection or host != self._connection[0]: self._extra_headers = eh - self._connection = host, httplib.HTTPSConnection(h, None, - **kwargs) + self._connection = host, httplib.HTTPSConnection( + h, None, **kwargs) return self._connection[1] class ServerProxy(xmlrpclib.ServerProxy): + def __init__(self, uri, **kwargs): self.timeout = timeout = kwargs.pop('timeout', None) # The above classes only come into play if a timeout @@ -1550,11 +1621,13 @@ def __init__(self, uri, **kwargs): self.transport = t xmlrpclib.ServerProxy.__init__(self, uri, **kwargs) + # # CSV functionality. This is provided because on 2.x, the csv module can't # handle Unicode. However, we need to deal with Unicode in e.g. RECORD files. # + def _csv_open(fn, mode, **kwargs): if sys.version_info[0] < 3: mode += 'b' @@ -1568,9 +1641,9 @@ def _csv_open(fn, mode, **kwargs): class CSVBase(object): defaults = { - 'delimiter': str(','), # The strs are used because we need native - 'quotechar': str('"'), # str in the csv API (2.x won't take - 'lineterminator': str('\n') # Unicode) + 'delimiter': str(','), # The strs are used because we need native + 'quotechar': str('"'), # str in the csv API (2.x won't take + 'lineterminator': str('\n') # Unicode) } def __enter__(self): @@ -1581,6 +1654,7 @@ def __exit__(self, *exc_info): class CSVReader(CSVBase): + def __init__(self, **kwargs): if 'stream' in kwargs: stream = kwargs['stream'] @@ -1605,7 +1679,9 @@ def next(self): __next__ = next + class CSVWriter(CSVBase): + def __init__(self, fn, **kwargs): self.stream = _csv_open(fn, 'w') self.writer = csv.writer(self.stream, **self.defaults) @@ -1620,10 +1696,12 @@ def writerow(self, row): row = r self.writer.writerow(row) + # # Configurator functionality # + class Configurator(BaseConfigurator): value_converters = dict(BaseConfigurator.value_converters) @@ -1634,6 +1712,7 @@ def __init__(self, config, base=None): self.base = base or os.getcwd() def configure_custom(self, config): + def convert(o): if isinstance(o, (list, tuple)): result = type(o)([convert(i) for i in o]) @@ -1683,6 +1762,7 @@ class SubprocessMixin(object): """ Mixin for running subprocesses and capturing their output """ + def __init__(self, verbose=False, progress=None): self.verbose = verbose self.progress = progress @@ -1709,8 +1789,10 @@ def reader(self, stream, context): stream.close() def run_command(self, cmd, **kwargs): - p = subprocess.Popen(cmd, stdout=subprocess.PIPE, - stderr=subprocess.PIPE, **kwargs) + p = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + **kwargs) t1 = threading.Thread(target=self.reader, args=(p.stdout, 'stdout')) t1.start() t2 = threading.Thread(target=self.reader, args=(p.stderr, 'stderr')) @@ -1730,15 +1812,17 @@ def normalize_name(name): # https://www.python.org/dev/peps/pep-0503/#normalized-names return re.sub('[-_.]+', '-', name).lower() + # def _get_pypirc_command(): - # """ - # Get the distutils command for interacting with PyPI configurations. - # :return: the command. - # """ - # from distutils.core import Distribution - # from distutils.config import PyPIRCCommand - # d = Distribution() - # return PyPIRCCommand(d) +# """ +# Get the distutils command for interacting with PyPI configurations. +# :return: the command. +# """ +# from distutils.core import Distribution +# from distutils.config import PyPIRCCommand +# d = Distribution() +# return PyPIRCCommand(d) + class PyPIRCFile(object): @@ -1763,9 +1847,10 @@ def read(self): if 'distutils' in sections: # let's get the list of servers index_servers = config.get('distutils', 'index-servers') - _servers = [server.strip() for server in - index_servers.split('\n') - if server.strip() != ''] + _servers = [ + server.strip() for server in index_servers.split('\n') + if server.strip() != '' + ] if _servers == []: # nothing set, let's try to get the default pypi if 'pypi' in sections: @@ -1776,7 +1861,8 @@ def read(self): result['username'] = config.get(server, 'username') # optional params - for key, default in (('repository', self.DEFAULT_REPOSITORY), + for key, default in (('repository', + self.DEFAULT_REPOSITORY), ('realm', self.DEFAULT_REALM), ('password', None)): if config.has_option(server, key): @@ -1787,11 +1873,11 @@ def read(self): # work around people having "repository" for the "pypi" # section of their config set to the HTTP (rather than # HTTPS) URL - if (server == 'pypi' and - repository in (self.DEFAULT_REPOSITORY, 'pypi')): + if (server == 'pypi' and repository + in (self.DEFAULT_REPOSITORY, 'pypi')): result['repository'] = self.DEFAULT_REPOSITORY - elif (result['server'] != repository and - result['repository'] != repository): + elif (result['server'] != repository + and result['repository'] != repository): result = {} elif 'server-login' in sections: # old format @@ -1821,20 +1907,24 @@ def update(self, username, password): with open(fn, 'w') as f: config.write(f) + def _load_pypirc(index): """ Read the PyPI access configuration as supported by distutils. """ return PyPIRCFile(url=index.url).read() + def _store_pypirc(index): PyPIRCFile().update(index.username, index.password) + # # get_platform()/get_host_platform() copied from Python 3.10.a0 source, with some minor # tweaks # + def get_host_platform(): """Return a string that identifies the current platform. This is used mainly to distinguish platform-specific build directories and platform-specific built @@ -1886,16 +1976,16 @@ def get_host_platform(): # At least on Linux/Intel, 'machine' is the processor -- # i386, etc. # XXX what about Alpha, SPARC, etc? - return "%s-%s" % (osname, machine) + return "%s-%s" % (osname, machine) elif osname[:5] == 'sunos': - if release[0] >= '5': # SunOS 5 == Solaris 2 + if release[0] >= '5': # SunOS 5 == Solaris 2 osname = 'solaris' release = '%d.%s' % (int(release[0]) - 3, release[2:]) # We can't use 'platform.architecture()[0]' because a # bootstrap problem. We use a dict to get an error # if some suspicious happens. - bitness = {2147483647:'32bit', 9223372036854775807:'64bit'} + bitness = {2147483647: '32bit', 9223372036854775807: '64bit'} machine += '.%s' % bitness[sys.maxsize] # fall through to standard osname-release-machine representation elif osname[:3] == 'aix': @@ -1903,23 +1993,26 @@ def get_host_platform(): return aix_platform() elif osname[:6] == 'cygwin': osname = 'cygwin' - rel_re = re.compile (r'[\d.]+', re.ASCII) + rel_re = re.compile(r'[\d.]+', re.ASCII) m = rel_re.match(release) if m: release = m.group() elif osname[:6] == 'darwin': - import _osx_support, distutils.sysconfig + import _osx_support + try: + from distutils import sysconfig + except ImportError: + import sysconfig osname, release, machine = _osx_support.get_platform_osx( - distutils.sysconfig.get_config_vars(), - osname, release, machine) + sysconfig.get_config_vars(), osname, release, machine) return '%s-%s-%s' % (osname, release, machine) _TARGET_TO_PLAT = { - 'x86' : 'win32', - 'x64' : 'win-amd64', - 'arm' : 'win-arm32', + 'x86': 'win32', + 'x64': 'win-amd64', + 'arm': 'win-arm32', } diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/version.py b/.venv/Lib/site-packages/pip/_vendor/distlib/version.py index c7c8bb6..14171ac 100644 --- a/.venv/Lib/site-packages/pip/_vendor/distlib/version.py +++ b/.venv/Lib/site-packages/pip/_vendor/distlib/version.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2012-2017 The Python Software Foundation. +# Copyright (C) 2012-2023 The Python Software Foundation. # See LICENSE.txt and CONTRIBUTORS.txt. # """ @@ -176,9 +176,9 @@ def __str__(self): return self._string -PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|b|c|rc)(\d+))?' - r'(\.(post)(\d+))?(\.(dev)(\d+))?' - r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$') +PEP440_VERSION_RE = re.compile(r'^v?(\d+!)?(\d+(\.\d+)*)((a|alpha|b|beta|c|rc|pre|preview)(\d+)?)?' + r'(\.(post|r|rev)(\d+)?)?([._-]?(dev)(\d+)?)?' + r'(\+([a-zA-Z\d]+(\.[a-zA-Z\d]+)?))?$', re.I) def _pep_440_key(s): @@ -202,15 +202,24 @@ def _pep_440_key(s): if pre == (None, None): pre = () else: - pre = pre[0], int(pre[1]) + if pre[1] is None: + pre = pre[0], 0 + else: + pre = pre[0], int(pre[1]) if post == (None, None): post = () else: - post = post[0], int(post[1]) + if post[1] is None: + post = post[0], 0 + else: + post = post[0], int(post[1]) if dev == (None, None): dev = () else: - dev = dev[0], int(dev[1]) + if dev[1] is None: + dev = dev[0], 0 + else: + dev = dev[0], int(dev[1]) if local is None: local = () else: @@ -238,7 +247,6 @@ def _pep_440_key(s): if not dev: dev = ('final',) - #print('%s -> %s' % (s, m.groups())) return epoch, nums, pre, post, dev, local @@ -378,6 +386,7 @@ def _match_compatible(self, version, constraint, prefix): pfx = '.'.join([str(i) for i in release_clause]) return _match_prefix(version, pfx) + _REPLACEMENTS = ( (re.compile('[.+-]$'), ''), # remove trailing puncts (re.compile(r'^[.](\d)'), r'0.\1'), # .N -> 0.N at start @@ -388,7 +397,7 @@ def _match_compatible(self, version, constraint, prefix): (re.compile('[.]{2,}'), '.'), # multiple runs of '.' (re.compile(r'\b(alfa|apha)\b'), 'alpha'), # misspelt alpha (re.compile(r'\b(pre-alpha|prealpha)\b'), - 'pre.alpha'), # standardise + 'pre.alpha'), # standardise (re.compile(r'\(beta\)$'), 'beta'), # remove parentheses ) @@ -416,7 +425,7 @@ def _suggest_semantic_version(s): # Now look for numeric prefix, and separate it out from # the rest. - #import pdb; pdb.set_trace() + # import pdb; pdb.set_trace() m = _NUMERIC_PREFIX.match(result) if not m: prefix = '0.0.0' @@ -434,7 +443,7 @@ def _suggest_semantic_version(s): prefix = '.'.join([str(i) for i in prefix]) suffix = suffix.strip() if suffix: - #import pdb; pdb.set_trace() + # import pdb; pdb.set_trace() # massage the suffix. for pat, repl in _SUFFIX_REPLACEMENTS: suffix = pat.sub(repl, suffix) @@ -504,7 +513,7 @@ def _suggest_normalized_version(s): rs = rs[1:] # Clean leading '0's on numbers. - #TODO: unintended side-effect on, e.g., "2003.05.09" + # TODO: unintended side-effect on, e.g., "2003.05.09" # PyPI stats: 77 (~2%) better rs = re.sub(r"\b0+(\d+)(?!\d)", r"\1", rs) @@ -563,6 +572,7 @@ def _suggest_normalized_version(s): # Legacy version processing (distribute-compatible) # + _VERSION_PART = re.compile(r'([a-z]+|\d+|[\.-])', re.I) _VERSION_REPLACE = { 'pre': 'c', @@ -610,7 +620,7 @@ def is_prerelease(self): result = False for x in self._parts: if (isinstance(x, string_types) and x.startswith('*') and - x < '*final'): + x < '*final'): result = True break return result @@ -641,6 +651,7 @@ def _match_compatible(self, version, constraint, prefix): # Semantic versioning # + _SEMVER_RE = re.compile(r'^(\d+)\.(\d+)\.(\d+)' r'(-[a-z0-9]+(\.[a-z0-9-]+)*)?' r'(\+[a-z0-9]+(\.[a-z0-9-]+)*)?$', re.I) @@ -722,6 +733,7 @@ def suggest(self, s): result = self.suggester(s) return result + _SCHEMES = { 'normalized': VersionScheme(_normalized_key, NormalizedMatcher, _suggest_normalized_version), diff --git a/.venv/Lib/site-packages/pip/_vendor/distlib/wheel.py b/.venv/Lib/site-packages/pip/_vendor/distlib/wheel.py index 028c2d9..4a5a30e 100644 --- a/.venv/Lib/site-packages/pip/_vendor/distlib/wheel.py +++ b/.venv/Lib/site-packages/pip/_vendor/distlib/wheel.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- # -# Copyright (C) 2013-2020 Vinay Sajip. +# Copyright (C) 2013-2023 Vinay Sajip. # Licensed to the Python Software Foundation under a contributor agreement. # See LICENSE.txt and CONTRIBUTORS.txt. # @@ -24,8 +24,7 @@ from . import __version__, DistlibException from .compat import sysconfig, ZipFile, fsdecode, text_type, filter from .database import InstalledDistribution -from .metadata import (Metadata, METADATA_FILENAME, WHEEL_METADATA_FILENAME, - LEGACY_METADATA_FILENAME) +from .metadata import Metadata, WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME from .util import (FileOperator, convert_path, CSVReader, CSVWriter, Cache, cached_property, get_cache_base, read_exports, tempdir, get_platform) @@ -33,7 +32,7 @@ logger = logging.getLogger(__name__) -cache = None # created when needed +cache = None # created when needed if hasattr(sys, 'pypy_version_info'): # pragma: no cover IMP_PREFIX = 'pp' @@ -45,7 +44,7 @@ IMP_PREFIX = 'cp' VER_SUFFIX = sysconfig.get_config_var('py_version_nodot') -if not VER_SUFFIX: # pragma: no cover +if not VER_SUFFIX: # pragma: no cover VER_SUFFIX = '%s%s' % sys.version_info[:2] PYVER = 'py' + VER_SUFFIX IMPVER = IMP_PREFIX + VER_SUFFIX @@ -56,6 +55,7 @@ if ABI and ABI.startswith('cpython-'): ABI = ABI.replace('cpython-', 'cp').split('-')[0] else: + def _derive_abi(): parts = ['cp', VER_SUFFIX] if sysconfig.get_config_var('Py_DEBUG'): @@ -73,10 +73,12 @@ def _derive_abi(): if us == 4 or (us is None and sys.maxunicode == 0x10FFFF): parts.append('u') return ''.join(parts) + ABI = _derive_abi() del _derive_abi -FILENAME_RE = re.compile(r''' +FILENAME_RE = re.compile( + r''' (?P[^-]+) -(?P\d+[^-]*) (-(?P\d+[^-]*))? @@ -86,7 +88,8 @@ def _derive_abi(): \.whl$ ''', re.IGNORECASE | re.VERBOSE) -NAME_VERSION_RE = re.compile(r''' +NAME_VERSION_RE = re.compile( + r''' (?P[^-]+) -(?P\d+[^-]*) (-(?P\d+[^-]*))?$ @@ -109,12 +112,14 @@ def _derive_abi(): import importlib.machinery import importlib.util + def _get_suffixes(): if imp: return [s[0] for s in imp.get_suffixes()] else: return importlib.machinery.EXTENSION_SUFFIXES + def _load_dynamic(name, path): # https://docs.python.org/3/library/importlib.html#importing-a-source-file-directly if imp: @@ -126,7 +131,9 @@ def _load_dynamic(name, path): spec.loader.exec_module(module) return module + class Mounter(object): + def __init__(self): self.impure_wheels = {} self.libs = {} @@ -161,6 +168,7 @@ def load_module(self, fullname): result.__package__ = parts[0] return result + _hook = Mounter() @@ -227,8 +235,8 @@ def filename(self): arch = '.'.join(self.arch) # replace - with _ as a local version separator version = self.version.replace('-', '_') - return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, - pyver, abi, arch) + return '%s-%s%s-%s-%s-%s.whl' % (self.name, version, buildver, pyver, + abi, arch) @property def exists(self): @@ -249,14 +257,14 @@ def metadata(self): info_dir = '%s.dist-info' % name_ver wrapper = codecs.getreader('utf-8') with ZipFile(pathname, 'r') as zf: - wheel_metadata = self.get_wheel_metadata(zf) - wv = wheel_metadata['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) + self.get_wheel_metadata(zf) + # wv = wheel_metadata['Wheel-Version'].split('.', 1) + # file_version = tuple([int(i) for i in wv]) # if file_version < (1, 1): - # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, - # LEGACY_METADATA_FILENAME] + # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME, + # LEGACY_METADATA_FILENAME] # else: - # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] + # fns = [WHEEL_METADATA_FILENAME, METADATA_FILENAME] fns = [WHEEL_METADATA_FILENAME, LEGACY_METADATA_FILENAME] result = None for fn in fns: @@ -326,13 +334,14 @@ def get_hash(self, data, hash_kind=None): try: hasher = getattr(hashlib, hash_kind) except AttributeError: - raise DistlibException('Unsupported hash algorithm: %r' % hash_kind) + raise DistlibException('Unsupported hash algorithm: %r' % + hash_kind) result = hasher(data).digest() result = base64.urlsafe_b64encode(result).rstrip(b'=').decode('ascii') return hash_kind, result def write_record(self, records, record_path, archive_record_path): - records = list(records) # make a copy, as mutated + records = list(records) # make a copy, as mutated records.append((archive_record_path, '', '')) with CSVWriter(record_path) as writer: for row in records: @@ -341,7 +350,7 @@ def write_record(self, records, record_path, archive_record_path): def write_records(self, info, libdir, archive_paths): records = [] distinfo, info_dir = info - hasher = getattr(hashlib, self.hash_kind) + # hasher = getattr(hashlib, self.hash_kind) for ap, p in archive_paths: with open(p, 'rb') as f: data = f.read() @@ -466,6 +475,7 @@ def sorter(t): if '.dist-info' in ap: n += 10000 return (n, ap) + archive_paths = sorted(archive_paths, key=sorter) # Now, at last, RECORD. @@ -512,7 +522,8 @@ def install(self, paths, maker, **kwargs): dry_run = maker.dry_run warner = kwargs.get('warner') lib_only = kwargs.get('lib_only', False) - bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', False) + bc_hashed_invalidation = kwargs.get('bytecode_hashed_invalidation', + False) pathname = os.path.join(self.dirname, self.filename) name_ver = '%s-%s' % (self.name, self.version) @@ -553,11 +564,11 @@ def install(self, paths, maker, **kwargs): # make a new instance rather than a copy of maker's, # as we mutate it fileop = FileOperator(dry_run=dry_run) - fileop.record = True # so we can rollback if needed + fileop.record = True # so we can rollback if needed - bc = not sys.dont_write_bytecode # Double negatives. Lovely! + bc = not sys.dont_write_bytecode # Double negatives. Lovely! - outfiles = [] # for RECORD writing + outfiles = [] # for RECORD writing # for script copying/shebang processing workdir = tempfile.mkdtemp() @@ -611,7 +622,8 @@ def install(self, paths, maker, **kwargs): # So ... manually preserve permission bits as given in zinfo if os.name == 'posix': # just set the normal permission bits - os.chmod(outfile, (zinfo.external_attr >> 16) & 0x1FF) + os.chmod(outfile, + (zinfo.external_attr >> 16) & 0x1FF) outfiles.append(outfile) # Double check the digest of the written file if not dry_run and row[1]: @@ -624,8 +636,9 @@ def install(self, paths, maker, **kwargs): '%s' % outfile) if bc and outfile.endswith('.py'): try: - pyc = fileop.byte_compile(outfile, - hashed_invalidation=bc_hashed_invalidation) + pyc = fileop.byte_compile( + outfile, + hashed_invalidation=bc_hashed_invalidation) outfiles.append(pyc) except Exception: # Don't give up if byte-compilation fails, @@ -700,7 +713,7 @@ def install(self, paths, maker, **kwargs): fileop.set_executable_mode(filenames) if gui_scripts: - options = {'gui': True } + options = {'gui': True} for k, v in gui_scripts.items(): script = '%s = %s' % (k, v) filenames = maker.make(script, options) @@ -710,7 +723,7 @@ def install(self, paths, maker, **kwargs): dist = InstalledDistribution(p) # Write SHARED - paths = dict(paths) # don't change passed in dict + paths = dict(paths) # don't change passed in dict del paths['purelib'] del paths['platlib'] paths['lib'] = libdir @@ -761,7 +774,8 @@ def _get_extensions(self): extract = True else: file_time = os.stat(dest).st_mtime - file_time = datetime.datetime.fromtimestamp(file_time) + file_time = datetime.datetime.fromtimestamp( + file_time) info = zf.getinfo(relpath) wheel_time = datetime.datetime(*info.date_time) extract = wheel_time > file_time @@ -782,7 +796,7 @@ def is_mountable(self): """ Determine if a wheel is asserted as mountable by its metadata. """ - return True # for now - metadata details TBD + return True # for now - metadata details TBD def mount(self, append=False): pathname = os.path.abspath(os.path.join(self.dirname, self.filename)) @@ -820,10 +834,10 @@ def unmount(self): def verify(self): pathname = os.path.join(self.dirname, self.filename) name_ver = '%s-%s' % (self.name, self.version) - data_dir = '%s.data' % name_ver + # data_dir = '%s.data' % name_ver info_dir = '%s.dist-info' % name_ver - metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME) + # metadata_name = posixpath.join(info_dir, LEGACY_METADATA_FILENAME) wheel_metadata_name = posixpath.join(info_dir, 'WHEEL') record_name = posixpath.join(info_dir, 'RECORD') @@ -832,9 +846,9 @@ def verify(self): with ZipFile(pathname, 'r') as zf: with zf.open(wheel_metadata_name) as bwf: wf = wrapper(bwf) - message = message_from_file(wf) - wv = message['Wheel-Version'].split('.', 1) - file_version = tuple([int(i) for i in wv]) + message_from_file(wf) + # wv = message['Wheel-Version'].split('.', 1) + # file_version = tuple([int(i) for i in wv]) # TODO version verification records = {} @@ -903,25 +917,25 @@ def get_version(path_map, info_dir): def update_version(version, path): updated = None try: - v = NormalizedVersion(version) + NormalizedVersion(version) i = version.find('-') if i < 0: updated = '%s+1' % version else: parts = [int(s) for s in version[i + 1:].split('.')] parts[-1] += 1 - updated = '%s+%s' % (version[:i], - '.'.join(str(i) for i in parts)) + updated = '%s+%s' % (version[:i], '.'.join( + str(i) for i in parts)) except UnsupportedVersionError: - logger.debug('Cannot update non-compliant (PEP-440) ' - 'version %r', version) + logger.debug( + 'Cannot update non-compliant (PEP-440) ' + 'version %r', version) if updated: md = Metadata(path=path) md.version = updated legacy = path.endswith(LEGACY_METADATA_FILENAME) md.write(path=path, legacy=legacy) - logger.debug('Version updated from %r to %r', version, - updated) + logger.debug('Version updated from %r to %r', version, updated) pathname = os.path.join(self.dirname, self.filename) name_ver = '%s-%s' % (self.name, self.version) @@ -963,7 +977,8 @@ def update_version(version, path): os.close(fd) else: if not os.path.isdir(dest_dir): - raise DistlibException('Not a directory: %r' % dest_dir) + raise DistlibException('Not a directory: %r' % + dest_dir) newpath = os.path.join(dest_dir, self.filename) archive_paths = list(path_map.items()) distinfo = os.path.join(workdir, info_dir) @@ -974,6 +989,7 @@ def update_version(version, path): shutil.copyfile(newpath, pathname) return modified + def _get_glibc_version(): import platform ver = platform.libc_ver() @@ -984,13 +1000,14 @@ def _get_glibc_version(): result = tuple(result) return result + def compatible_tags(): """ Return (pyver, abi, arch) tuples compatible with this Python. """ versions = [VER_SUFFIX] major = VER_SUFFIX[0] - for minor in range(sys.version_info[1] - 1, - 1, -1): + for minor in range(sys.version_info[1] - 1, -1, -1): versions.append(''.join([major, str(minor)])) abis = [] @@ -1023,7 +1040,7 @@ def compatible_tags(): while minor >= 0: for match in matches: s = '%s_%s_%s_%s' % (name, major, minor, match) - if s != ARCH: # already there + if s != ARCH: # already there arches.append(s) minor -= 1 @@ -1045,9 +1062,9 @@ def compatible_tags(): if parts >= (2, 17): result.append((''.join((IMP_PREFIX, versions[0])), abi, 'manylinux2014_%s' % arch)) - result.append((''.join((IMP_PREFIX, versions[0])), abi, - 'manylinux_%s_%s_%s' % (parts[0], parts[1], - arch))) + result.append( + (''.join((IMP_PREFIX, versions[0])), abi, + 'manylinux_%s_%s_%s' % (parts[0], parts[1], arch))) # where no ABI / arch dependency, but IMP_PREFIX dependency for i, version in enumerate(versions): @@ -1071,7 +1088,7 @@ def compatible_tags(): def is_compatible(wheel, tags=None): if not isinstance(wheel, Wheel): - wheel = Wheel(wheel) # assume it's a filename + wheel = Wheel(wheel) # assume it's a filename result = False if tags is None: tags = COMPATIBLE_TAGS diff --git a/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc index 894d610..05c0aef 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc index 717df24..dc49713 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc index e30f795..4204d28 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/distro/__pycache__/distro.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc index 96cb32b..dd0c8a7 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc index 6ea7a57..df498ef 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc index f5de19e..1daf809 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc index 7ae6f96..af85fdc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc index 1d10473..5dd750f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc index b4a8086..b66e6aa 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc index 68c0741..c24b1e6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc index 2f8c043..9e4acd9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc index 42d5154..c668cef 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc index c08945b..b6721d6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc index 0f54ca8..500059b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc index aea29da..9db22c8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc index d5200b3..885c974 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc index 209979a..863da2b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc index 89871d5..1b813f4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc index a3b3a59..ebb9b1e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc index c8bf790..ae70594 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc index 84529b1..4cbe2c7 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc index 47125a1..56614e4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc index 26d2434..f42b580 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc index a3fb245..4f39d0e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc index 18d005a..3417735 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc index 3af01bf..547d56a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc index d872461..e94a85b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc index 1bfe4f2..94b34a9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc index 693ebd2..80cd7ad 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc index 4a92a48..fc7dda4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc index c9f6708..2d91896 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc index c8c4562..c7a8aab 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc index 661a697..8141e26 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc index 8419e50..10a6271 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc index 2e7dddb..6590348 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc index 6377b60..aaed86f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc index 2d28b43..9d20002 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc index 83ab872..b4ca987 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc index 6860712..d9b9776 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc index 24a481f..c86d34a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc index 9f004be..1f6f11f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc index a476c1c..29db242 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc index 626caa0..4821bc8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc index b1e1f59..f00305f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc index 535d46e..7e0c812 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc index 9384dfa..d03fefc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc index 4444498..8db2875 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc index e39e542..5cf9229 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc index 2d02d97..5b18513 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc index 3349b38..ca3038e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc index 830ec3e..20af630 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc index 6f7e216..b81f6c9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc index 2e1a8ee..85460cc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc index 36a64ea..0c5244d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc index 341e0ac..178adde 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc index 9f1c925..6ea2c8d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc index abce19f..82aee58 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc index 25541d1..0e68191 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc index 8eaea39..f6a457a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc index f87bef6..3e28c7f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc index 0a38de2..ad10368 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc index 2d0c9cf..9b974b0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc index 608416b..ee3c5a9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc index c9afdd3..05b999a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc index 278bd9e..7170ba2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc index d6bc736..e0668ec 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc index 87c810a..e347958 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc index 850606d..cf2f0cd 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc index 18be6ee..090edeb 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc index b737045..7f69adc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc index 5533bf2..09b0669 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc index dad2e1f..5c3a8d4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc index f38793b..e8830d4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc index dd594f0..f52d24f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc index ee86418..4f25c84 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc index 5a5b146..403cd4f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc index 66a1f6f..dc73512 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc index 05888a0..9488916 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc index d781549..71f49f8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc index 14f6fd0..e91a040 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc index ef1acc6..866cd06 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc index 6e5e6f4..f84ec69 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc index a705ca3..9bfaa9d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc index 2d39bf2..2857c07 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/__pycache__/_impl.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc index 185f6ee..d745683 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc index 481bf83..bde9a40 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/pyproject_hooks/_in_process/__pycache__/_in_process.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc index d17f25e..9f93d61 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc index bcaa170..abca016 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc index caf503d..e448b06 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc index 991ff6b..c951081 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc index 24cd20e..8b07513 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc index f4560bd..1502a40 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc index 8ccc57a..81a5729 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc index 237e493..8bba896 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc index 4284080..50c8397 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc index e1d68cd..b6b4005 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc index 7a05778..295eef5 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc index 2620a3a..55a3d98 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc index 8abeb1d..5cbe7a7 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc index 0d07a41..7f437e7 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc index 836e094..ef2266a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc index 418b590..d4a0315 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc index 53570c3..6154578 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc index bf1bdec..ad21908 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc index add191a..87db62a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc index 0f73ffe..d54a7cb 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc index a7fb25f..c38a554 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc index 84ec857..c5178be 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc index 9225f4f..7706586 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc index edb2517..2c49960 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc index 0a1b32d..90d92e1 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc index c46d99d..5720082 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc index 8953bec..ba326d1 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc index 1ccdecb..77cf885 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc index bf25a9e..738f473 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc index a4443b1..be82012 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc index c87470b..b14e697 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_export_format.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc index 51679f7..2f97ffc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc index 0eea88b..d3eed88 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_fileno.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc index be6c4f5..04fe664 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc index 50964fd..7e73f6e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc index d5aea45..1277e55 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc index 44ef3a7..0c325d5 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_null_file.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc index e7f487e..0f68bb5 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc index 638c704..51d3610 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc index 5a4367d..1737187 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc index 47fb919..0146088 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc index 47993c6..b3d5836 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc index f489f89..ce235f8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc index bce3322..92d9309 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_win32_console.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc index b6cea68..07495ff 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc index bbde10f..d7a75e0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows_renderer.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc index 7ad2715..5b125d8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc index f5a1e40..6c364f4 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc index 7a54f32..f8ae43e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc index ce4b0fc..b218e9d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc index 5fbb8dd..09effa0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc index 9642b09..deb82b3 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc index b09a0dd..5793723 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc index 79544c1..c4e13ff 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc index c0b10cf..255b344 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc index 6485889..9d72865 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc index 79f10a2..1bac586 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc index 6efbeed..49a351f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc index b0e2700..f6e60ae 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc index 69966e3..a5064b9 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc index fe727bc..da7fcd0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc index ca14487..3cc9195 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc index eed627e..ba5f992 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc index 93747a5..ce0c540 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc index bc6c94e..1822702 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc index d273851..dd400e8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc index 5c0a279..84b50b2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc index f78f997..f35efab 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc index f32d8e4..4b7cd57 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc index f71cda9..efac08c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc index 99033f7..2cd76d6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc index 9a7e3d4..8dce993 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc index a9c0481..a796dae 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc index 0d5c43b..aa73d97 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc index 6cda1c9..7f4cd81 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc index df9c26f..c8eda1b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc index 46ae5a6..71e4bd5 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc index 7cc94db..518f999 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc index 8c7b457..00a3e0a 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc index 9bb50cd..980703e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc index f601fb9..7665031 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc index 612e18d..98d8b30 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc index dcd5ee7..71aa425 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc index 4636590..1a6d070 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc index 0e97643..8f9d644 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc index 3592165..eddcef2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc index ef3031a..54b7ba1 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc index f598c42..11ab766 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc index abcb4f7..4324096 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc index 7aa10c5..f44fa79 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc index f988df3..36526a3 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc index c84345d..a78ec53 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc index 9bb092e..959b593 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc index a2df4f4..705ff4f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc index f21913f..62c07b1 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc index 8640e85..9829f0d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc index 2f405ef..83ddae6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc index 6efb585..4d39a33 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc index a649071..d683f7f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc index 3f37b6c..647b8f8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc index ce4adec..431d8b1 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc index f3cdf7d..77b5596 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc index 570037c..792906f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc index be36ca2..1264bee 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc index 0422285..4b0899f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc index 8a34977..2e15062 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc index dcee1ef..289db7f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc index 3db711e..aee4c7b 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc index 571fb24..041fbb8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc index 797e18d..9ca79d8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc index 7db030f..6e13e76 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc index e588c11..4f5bb29 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc index 5cd7234..09741e7 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc index 0138e8a..ec98767 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc index 44aed64..cbab180 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc index 7c8af6e..4c3c2a3 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc index 656a3af..c483327 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/tomli/__pycache__/_types.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc index b275775..56b2b63 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc index 0f64752..e5a35fc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc index cc37fa0..3adaff6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc index e4ac447..5dd5c5c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc index a3e2782..2cddf3c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc index 37f2eba..a12282e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc index cd82736..b7ccb78 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc index 59ce267..0d7f4a7 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc index 224d991..cdb431c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc index e4f17d8..dd47041 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc index e4e8843..fd7402d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/_version.py b/.venv/Lib/site-packages/pip/_vendor/urllib3/_version.py index d69ca31..cad75fb 100644 --- a/.venv/Lib/site-packages/pip/_vendor/urllib3/_version.py +++ b/.venv/Lib/site-packages/pip/_vendor/urllib3/_version.py @@ -1,2 +1,2 @@ # This file is protected via CODEOWNERS -__version__ = "1.26.16" +__version__ = "1.26.17" diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc index 4ac9411..433cf10 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc index 888c6d0..202217d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc index 034d013..f6af2d7 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc index e3110a6..c6b59a0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc index 13a418f..9c316e6 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc index 58a8a72..a32ba13 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc index 595e000..8fcc807 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc index 20ec133..1fd133e 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc index fc6e033..aea1593 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc index ce66702..8fd1a88 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc index 0e7ffba..2c41363 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc index ea33f1c..0b75725 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc index 2fb9c43..c6c6f50 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc index 5bc4a7b..5cff7f0 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-311.pyc index 689f494..5a418b2 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/weakref_finalize.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/request.py b/.venv/Lib/site-packages/pip/_vendor/urllib3/request.py index 398386a..3b4cf99 100644 --- a/.venv/Lib/site-packages/pip/_vendor/urllib3/request.py +++ b/.venv/Lib/site-packages/pip/_vendor/urllib3/request.py @@ -1,6 +1,9 @@ from __future__ import absolute_import +import sys + from .filepost import encode_multipart_formdata +from .packages import six from .packages.six.moves.urllib.parse import urlencode __all__ = ["RequestMethods"] @@ -168,3 +171,21 @@ def request_encode_body( extra_kw.update(urlopen_kw) return self.urlopen(method, url, **extra_kw) + + +if not six.PY2: + + class RequestModule(sys.modules[__name__].__class__): + def __call__(self, *args, **kwargs): + """ + If user tries to call this module directly urllib3 v2.x style raise an error to the user + suggesting they may need urllib3 v2 + """ + raise TypeError( + "'module' object is not callable\n" + "urllib3.request() method is not supported in this release, " + "upgrade to urllib3 v2 to use it\n" + "see https://urllib3.readthedocs.io/en/stable/v2-migration-guide.html" + ) + + sys.modules[__name__].__class__ = RequestModule diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc index c0c7d64..47a3ba1 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc index 8b24ddd..c7c315c 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc index d5bbf24..fff46e8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc index 4c890b4..cb045a7 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc index 6830960..df6acc1 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc index 4c18a23..16663b7 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc index b8806af..34d2cab 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc index 87c1f72..47bb3fc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc index 58efa53..d8b542f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc index 5681635..b7a0901 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc index f75e2b9..a05be8d 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc index 53551dc..a1ff833 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc index 1ae7270..87d264f 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py index 2490d5e..60ef6c4 100644 --- a/.venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py +++ b/.venv/Lib/site-packages/pip/_vendor/urllib3/util/retry.py @@ -235,7 +235,7 @@ class Retry(object): RETRY_AFTER_STATUS_CODES = frozenset([413, 429, 503]) #: Default headers to be used for ``remove_headers_on_redirect`` - DEFAULT_REMOVE_HEADERS_ON_REDIRECT = frozenset(["Authorization"]) + DEFAULT_REMOVE_HEADERS_ON_REDIRECT = frozenset(["Cookie", "Authorization"]) #: Maximum backoff time. DEFAULT_BACKOFF_MAX = 120 diff --git a/.venv/Lib/site-packages/pip/_vendor/vendor.txt b/.venv/Lib/site-packages/pip/_vendor/vendor.txt index 4ab2915..5554c38 100644 --- a/.venv/Lib/site-packages/pip/_vendor/vendor.txt +++ b/.venv/Lib/site-packages/pip/_vendor/vendor.txt @@ -1,6 +1,6 @@ -CacheControl==0.12.11 # Make sure to update the license in pyproject.toml for this. +CacheControl==0.13.1 # Make sure to update the license in pyproject.toml for this. colorama==0.4.6 -distlib==0.3.6 +distlib==0.3.8 distro==1.8.0 msgpack==1.0.5 packaging==21.3 @@ -8,10 +8,10 @@ platformdirs==3.8.1 pyparsing==3.1.0 pyproject-hooks==1.0.0 requests==2.31.0 - certifi==2023.5.7 + certifi==2023.7.22 chardet==5.1.0 idna==3.4 - urllib3==1.26.16 + urllib3==1.26.17 rich==13.4.2 pygments==2.15.1 typing_extensions==4.7.1 @@ -20,4 +20,5 @@ setuptools==68.0.0 six==1.16.0 tenacity==8.2.2 tomli==2.0.1 +truststore==0.8.0 webencodings==0.5.1 diff --git a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc index 977d9d4..b2f3a19 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc index ed84f18..39b1ff8 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc index 2ae2594..e3c25cc 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc index 884e807..7f31265 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc index 057dbe0..6785dfb 100644 Binary files a/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc and b/.venv/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-311.pyc index 77d64ac..80a889e 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-311.pyc index b8ce821..aa76107 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-311.pyc index 149b43f..9b2a284 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-311.pyc index c3fc3f1..f80fa81 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/__pycache__/zipp.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc index 3947697..2cc6fca 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc index 3e71f7c..d3084d2 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc index abcdd64..d0fb45e 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc index cf43e75..c665e3a 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc index 8fae222..92e94d4 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc index 6875d96..4e020bf 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc index e7b6afe..62b2411 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc index 4b764fb..21d9f9c 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc index c2bdcc0..ce9c65d 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc index 874655b..14baebc 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-311.pyc index 796aea4..6e7df7a 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/context.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-311.pyc index c499490..bb81670 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/__pycache__/functools.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc index 5f39b30..e7942ee 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc index b34a31a..4a0b70f 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-311.pyc index 19e4918..0bce224 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/more.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc index 00bad99..52c518b 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-311.pyc index 56f3b6c..ca24f65 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-311.pyc index bbdba99..a490c33 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc index f061419..d813d53 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc index 881520d..321446c 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-311.pyc index d2c954d..ee070ce 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-311.pyc index cb9ea8c..d41b18a 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-311.pyc index deb6523..0c905c8 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc index 2d179d8..7ceabd7 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-311.pyc index 262bbfb..6873cd5 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-311.pyc index ab44591..a0efaa3 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-311.pyc index 74648e4..fa30686 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc index 95a500f..b278ab3 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc index a049b60..171dd62 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/common.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/common.cpython-311.pyc index 4a01363..0004c72 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/common.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/common.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/core.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/core.cpython-311.pyc index 43748c4..062f7ad 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/core.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/core.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc index 6305680..132ed2c 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc index 836f26c..d8fae2a 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/results.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/results.cpython-311.pyc index 51812ae..e108445 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/results.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/results.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc index 2576c62..d9f5fc7 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc index f64554c..6a43cc2 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/util.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/util.cpython-311.pyc index 2f85f85..3064868 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/util.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/__pycache__/util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc index 53fc8c5..6450402 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-311.pyc index 9f0e826..ddf8123 100644 Binary files a/.venv/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/platformdirs/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/platformdirs/__pycache__/__init__.cpython-311.pyc index d6f67ee..3dbd3c9 100644 Binary files a/.venv/Lib/site-packages/platformdirs/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/platformdirs/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/platformdirs/__pycache__/__main__.cpython-311.pyc b/.venv/Lib/site-packages/platformdirs/__pycache__/__main__.cpython-311.pyc index aa33e65..6003b5c 100644 Binary files a/.venv/Lib/site-packages/platformdirs/__pycache__/__main__.cpython-311.pyc and b/.venv/Lib/site-packages/platformdirs/__pycache__/__main__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/platformdirs/__pycache__/android.cpython-311.pyc b/.venv/Lib/site-packages/platformdirs/__pycache__/android.cpython-311.pyc index 38cd1b2..525bde6 100644 Binary files a/.venv/Lib/site-packages/platformdirs/__pycache__/android.cpython-311.pyc and b/.venv/Lib/site-packages/platformdirs/__pycache__/android.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/platformdirs/__pycache__/api.cpython-311.pyc b/.venv/Lib/site-packages/platformdirs/__pycache__/api.cpython-311.pyc index a3aaa2a..7ede7ca 100644 Binary files a/.venv/Lib/site-packages/platformdirs/__pycache__/api.cpython-311.pyc and b/.venv/Lib/site-packages/platformdirs/__pycache__/api.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/platformdirs/__pycache__/macos.cpython-311.pyc b/.venv/Lib/site-packages/platformdirs/__pycache__/macos.cpython-311.pyc index ebda878..789f8fa 100644 Binary files a/.venv/Lib/site-packages/platformdirs/__pycache__/macos.cpython-311.pyc and b/.venv/Lib/site-packages/platformdirs/__pycache__/macos.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/platformdirs/__pycache__/unix.cpython-311.pyc b/.venv/Lib/site-packages/platformdirs/__pycache__/unix.cpython-311.pyc index 5c32434..2fc8482 100644 Binary files a/.venv/Lib/site-packages/platformdirs/__pycache__/unix.cpython-311.pyc and b/.venv/Lib/site-packages/platformdirs/__pycache__/unix.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/platformdirs/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/platformdirs/__pycache__/version.cpython-311.pyc index ffc814e..c66f31f 100644 Binary files a/.venv/Lib/site-packages/platformdirs/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/platformdirs/__pycache__/version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/platformdirs/__pycache__/windows.cpython-311.pyc b/.venv/Lib/site-packages/platformdirs/__pycache__/windows.cpython-311.pyc index 0c7728a..a7ee882 100644 Binary files a/.venv/Lib/site-packages/platformdirs/__pycache__/windows.cpython-311.pyc and b/.venv/Lib/site-packages/platformdirs/__pycache__/windows.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/referencing-0.32.1.dist-info/INSTALLER b/.venv/Lib/site-packages/referencing-0.32.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/referencing-0.32.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/referencing-0.32.1.dist-info/METADATA b/.venv/Lib/site-packages/referencing-0.32.1.dist-info/METADATA deleted file mode 100644 index 18ea296..0000000 --- a/.venv/Lib/site-packages/referencing-0.32.1.dist-info/METADATA +++ /dev/null @@ -1,64 +0,0 @@ -Metadata-Version: 2.1 -Name: referencing -Version: 0.32.1 -Summary: JSON Referencing + Python -Project-URL: Documentation, https://referencing.readthedocs.io/ -Project-URL: Homepage, https://github.com/python-jsonschema/referencing -Project-URL: Issues, https://github.com/python-jsonschema/referencing/issues/ -Project-URL: Funding, https://github.com/sponsors/Julian -Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-referencing?utm_source=pypi-referencing&utm_medium=referral&utm_campaign=pypi-link -Project-URL: Source, https://github.com/python-jsonschema/referencing -Author: Julian Berman -Author-email: Julian+referencing@GrayVines.com -License: MIT -License-File: COPYING -Keywords: asyncapi,json,jsonschema,openapi,referencing -Classifier: Development Status :: 3 - Alpha -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Python -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -Classifier: Topic :: File Formats :: JSON -Classifier: Topic :: File Formats :: JSON :: JSON Schema -Requires-Python: >=3.8 -Requires-Dist: attrs>=22.2.0 -Requires-Dist: rpds-py>=0.7.0 -Description-Content-Type: text/x-rst - -=============== -``referencing`` -=============== - -|PyPI| |Pythons| |CI| |ReadTheDocs| |pre-commit| - -.. |PyPI| image:: https://img.shields.io/pypi/v/referencing.svg - :alt: PyPI version - :target: https://pypi.org/project/referencing/ - -.. |Pythons| image:: https://img.shields.io/pypi/pyversions/referencing.svg - :alt: Supported Python versions - :target: https://pypi.org/project/referencing/ - -.. |CI| image:: https://github.com/python-jsonschema/referencing/workflows/CI/badge.svg - :alt: Build status - :target: https://github.com/python-jsonschema/referencing/actions?query=workflow%3ACI - -.. |ReadTheDocs| image:: https://readthedocs.org/projects/referencing/badge/?version=stable&style=flat - :alt: ReadTheDocs status - :target: https://referencing.readthedocs.io/en/stable/ - -.. |pre-commit| image:: https://results.pre-commit.ci/badge/github/python-jsonschema/referencing/main.svg - :alt: pre-commit.ci status - :target: https://results.pre-commit.ci/latest/github/python-jsonschema/referencing/main - - -An implementation-agnostic implementation of JSON reference resolution. - -See `the documentation `_ for more details. diff --git a/.venv/Lib/site-packages/referencing-0.32.1.dist-info/RECORD b/.venv/Lib/site-packages/referencing-0.32.1.dist-info/RECORD deleted file mode 100644 index 2314827..0000000 --- a/.venv/Lib/site-packages/referencing-0.32.1.dist-info/RECORD +++ /dev/null @@ -1,33 +0,0 @@ -referencing-0.32.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -referencing-0.32.1.dist-info/METADATA,sha256=ihHz_cGZp8ajs5TxU4Wlx9R_x22hR1MVVmyon9STXJI,2745 -referencing-0.32.1.dist-info/RECORD,, -referencing-0.32.1.dist-info/WHEEL,sha256=mRYSEL3Ih6g5a_CVMIcwiF__0Ae4_gLYh01YFNwiq1k,87 -referencing-0.32.1.dist-info/licenses/COPYING,sha256=QtzWNJX4e063x3V6-jebtVpT-Ur9el9lfZrfVyNuUVw,1057 -referencing/__init__.py,sha256=QQIDdzthSSd3_viHR6Z-5QOTiJnvLd0pBajsmq0Q_Co,206 -referencing/__pycache__/__init__.cpython-311.pyc,, -referencing/__pycache__/_attrs.cpython-311.pyc,, -referencing/__pycache__/_core.cpython-311.pyc,, -referencing/__pycache__/exceptions.cpython-311.pyc,, -referencing/__pycache__/jsonschema.cpython-311.pyc,, -referencing/__pycache__/retrieval.cpython-311.pyc,, -referencing/__pycache__/typing.cpython-311.pyc,, -referencing/_attrs.py,sha256=bgT-KMhDVLeGtWxM_SGKYeLaZBFzT2kUVFdAkOcXi8g,791 -referencing/_attrs.pyi,sha256=J6StMUKqixO4H7Eii9-TXNfCOfS8aHm-1ewimOA-8oo,559 -referencing/_core.py,sha256=AHt-AhByuqCUnHRN0VZWco-Ld2Kmh0KVdun1Sznsxfc,24742 -referencing/exceptions.py,sha256=RhEv1OwZ4Ie4UwEdfBrnSGdqlYEUJBwkaxd3Rj3TdYM,4175 -referencing/jsonschema.py,sha256=aq59x2Ecwt3d1NnVqlM0Ggy8TAJJ9fwO77UYAj3uoa0,18776 -referencing/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -referencing/retrieval.py,sha256=jK801plrr9MQ2PuyS7SyNXjvvMuK_EnX4Ou_IX1MD3c,2573 -referencing/tests/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -referencing/tests/__pycache__/__init__.cpython-311.pyc,, -referencing/tests/__pycache__/test_core.cpython-311.pyc,, -referencing/tests/__pycache__/test_exceptions.cpython-311.pyc,, -referencing/tests/__pycache__/test_jsonschema.cpython-311.pyc,, -referencing/tests/__pycache__/test_referencing_suite.cpython-311.pyc,, -referencing/tests/__pycache__/test_retrieval.cpython-311.pyc,, -referencing/tests/test_core.py,sha256=ePZUYA6YdDmod54n_0LmiE-zs9dRTHY9BPKjEEmwbrM,37358 -referencing/tests/test_exceptions.py,sha256=7eOdHyobXMt7-h5AnnH7u8iw2uHPaH7U4Bs9JhLgjWo,934 -referencing/tests/test_jsonschema.py,sha256=4QnjUWOAMAn5yeA8ZtldJkhI54vwKWJWB0LDzNdx5xc,11687 -referencing/tests/test_referencing_suite.py,sha256=zfJg162dsrBksqK_XKo7BjBwxMFFkBFWyRXA6Wni9uQ,2208 -referencing/tests/test_retrieval.py,sha256=vcbnfA4TqVeqUzW073wO-nLeqVIv0rQZWNWv0z9km48,3719 -referencing/typing.py,sha256=mCriziQaU2wMPP7_FJBVn43dCYBMm_CnUvV6S-kchQc,1430 diff --git a/.venv/Lib/site-packages/referencing-0.32.1.dist-info/WHEEL b/.venv/Lib/site-packages/referencing-0.32.1.dist-info/WHEEL deleted file mode 100644 index 2860816..0000000 --- a/.venv/Lib/site-packages/referencing-0.32.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: hatchling 1.21.0 -Root-Is-Purelib: true -Tag: py3-none-any diff --git a/.venv/Lib/site-packages/referencing-0.32.1.dist-info/licenses/COPYING b/.venv/Lib/site-packages/referencing-0.32.1.dist-info/licenses/COPYING deleted file mode 100644 index a9f853e..0000000 --- a/.venv/Lib/site-packages/referencing-0.32.1.dist-info/licenses/COPYING +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2022 Julian Berman - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/.venv/Lib/site-packages/referencing/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/referencing/__pycache__/__init__.cpython-311.pyc index fa3c646..671e4d6 100644 Binary files a/.venv/Lib/site-packages/referencing/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/referencing/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/referencing/__pycache__/_attrs.cpython-311.pyc b/.venv/Lib/site-packages/referencing/__pycache__/_attrs.cpython-311.pyc index 404b184..8521f5b 100644 Binary files a/.venv/Lib/site-packages/referencing/__pycache__/_attrs.cpython-311.pyc and b/.venv/Lib/site-packages/referencing/__pycache__/_attrs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/referencing/__pycache__/_core.cpython-311.pyc b/.venv/Lib/site-packages/referencing/__pycache__/_core.cpython-311.pyc index 702a527..2297022 100644 Binary files a/.venv/Lib/site-packages/referencing/__pycache__/_core.cpython-311.pyc and b/.venv/Lib/site-packages/referencing/__pycache__/_core.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/referencing/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/referencing/__pycache__/exceptions.cpython-311.pyc index 6ec8d52..98d5a66 100644 Binary files a/.venv/Lib/site-packages/referencing/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/referencing/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/referencing/__pycache__/jsonschema.cpython-311.pyc b/.venv/Lib/site-packages/referencing/__pycache__/jsonschema.cpython-311.pyc index 3082f77..b160c37 100644 Binary files a/.venv/Lib/site-packages/referencing/__pycache__/jsonschema.cpython-311.pyc and b/.venv/Lib/site-packages/referencing/__pycache__/jsonschema.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/referencing/__pycache__/retrieval.cpython-311.pyc b/.venv/Lib/site-packages/referencing/__pycache__/retrieval.cpython-311.pyc index e961555..b7509bd 100644 Binary files a/.venv/Lib/site-packages/referencing/__pycache__/retrieval.cpython-311.pyc and b/.venv/Lib/site-packages/referencing/__pycache__/retrieval.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/referencing/__pycache__/typing.cpython-311.pyc b/.venv/Lib/site-packages/referencing/__pycache__/typing.cpython-311.pyc index 9b0a0f4..db8554c 100644 Binary files a/.venv/Lib/site-packages/referencing/__pycache__/typing.cpython-311.pyc and b/.venv/Lib/site-packages/referencing/__pycache__/typing.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/referencing/jsonschema.py b/.venv/Lib/site-packages/referencing/jsonschema.py index ece049a..564f4d2 100644 --- a/.venv/Lib/site-packages/referencing/jsonschema.py +++ b/.venv/Lib/site-packages/referencing/jsonschema.py @@ -20,6 +20,9 @@ #: A JSON Schema of any kind Schema = Union[bool, ObjectSchema] +#: A Resource whose contents are JSON Schemas +SchemaResource = Resource[Schema] + #: A JSON Schema Registry SchemaRegistry = Registry[Schema] @@ -588,7 +591,7 @@ class DynamicAnchor: """ name: str - resource: Resource[Schema] + resource: SchemaResource def resolve(self, resolver: _Resolver[Schema]) -> _Resolved[Schema]: """ diff --git a/.venv/Lib/site-packages/referencing/tests/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/referencing/tests/__pycache__/__init__.cpython-311.pyc index b316f8d..dfe6b79 100644 Binary files a/.venv/Lib/site-packages/referencing/tests/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/referencing/tests/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/referencing/tests/__pycache__/test_core.cpython-311.pyc b/.venv/Lib/site-packages/referencing/tests/__pycache__/test_core.cpython-311.pyc index f62a046..44333f1 100644 Binary files a/.venv/Lib/site-packages/referencing/tests/__pycache__/test_core.cpython-311.pyc and b/.venv/Lib/site-packages/referencing/tests/__pycache__/test_core.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/referencing/tests/__pycache__/test_exceptions.cpython-311.pyc b/.venv/Lib/site-packages/referencing/tests/__pycache__/test_exceptions.cpython-311.pyc index ee1bf73..09b37b4 100644 Binary files a/.venv/Lib/site-packages/referencing/tests/__pycache__/test_exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/referencing/tests/__pycache__/test_exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/referencing/tests/__pycache__/test_jsonschema.cpython-311.pyc b/.venv/Lib/site-packages/referencing/tests/__pycache__/test_jsonschema.cpython-311.pyc index 170f7ce..2137577 100644 Binary files a/.venv/Lib/site-packages/referencing/tests/__pycache__/test_jsonschema.cpython-311.pyc and b/.venv/Lib/site-packages/referencing/tests/__pycache__/test_jsonschema.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/referencing/tests/__pycache__/test_referencing_suite.cpython-311.pyc b/.venv/Lib/site-packages/referencing/tests/__pycache__/test_referencing_suite.cpython-311.pyc index 95eb073..0fc8281 100644 Binary files a/.venv/Lib/site-packages/referencing/tests/__pycache__/test_referencing_suite.cpython-311.pyc and b/.venv/Lib/site-packages/referencing/tests/__pycache__/test_referencing_suite.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/referencing/tests/__pycache__/test_retrieval.cpython-311.pyc b/.venv/Lib/site-packages/referencing/tests/__pycache__/test_retrieval.cpython-311.pyc index 39efda1..d25e73e 100644 Binary files a/.venv/Lib/site-packages/referencing/tests/__pycache__/test_retrieval.cpython-311.pyc and b/.venv/Lib/site-packages/referencing/tests/__pycache__/test_retrieval.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/rpds/__init__.pyi b/.venv/Lib/site-packages/rpds/__init__.pyi index 0125868..5af0e32 100644 --- a/.venv/Lib/site-packages/rpds/__init__.pyi +++ b/.venv/Lib/site-packages/rpds/__init__.pyi @@ -11,6 +11,8 @@ from typing import ( _T = TypeVar("_T") _KT_co = TypeVar("_KT_co", covariant=True) _VT_co = TypeVar("_VT_co", covariant=True) +_KU_co = TypeVar("_KU_co", covariant=True) +_VU_co = TypeVar("_VU_co", covariant=True) class HashTrieMap(Mapping[_KT_co, _VT_co]): def __init__( @@ -31,7 +33,10 @@ class HashTrieMap(Mapping[_KT_co, _VT_co]): key: _KT_co, val: _VT_co, ) -> HashTrieMap[_KT_co, _VT_co]: ... - def update(self, *args: Mapping): ... + def update( + self, + *args: Mapping[_KU_co, _VU_co] | Iterable[tuple[_KU_co, _VU_co]], + ) -> HashTrieMap[_KT_co | _KU_co, _VT_co | _VU_co]: ... @classmethod def convert( cls, diff --git a/.venv/Lib/site-packages/rpds/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/rpds/__pycache__/__init__.cpython-311.pyc index ca6e671..7563297 100644 Binary files a/.venv/Lib/site-packages/rpds/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/rpds/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/rpds/rpds.cp311-win_amd64.pyd b/.venv/Lib/site-packages/rpds/rpds.cp311-win_amd64.pyd index ce4bd52..ad936a1 100644 Binary files a/.venv/Lib/site-packages/rpds/rpds.cp311-win_amd64.pyd and b/.venv/Lib/site-packages/rpds/rpds.cp311-win_amd64.pyd differ diff --git a/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/INSTALLER b/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/INSTALLER deleted file mode 100644 index a1b589e..0000000 --- a/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/INSTALLER +++ /dev/null @@ -1 +0,0 @@ -pip diff --git a/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/METADATA b/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/METADATA deleted file mode 100644 index 256a7ae..0000000 --- a/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/METADATA +++ /dev/null @@ -1,100 +0,0 @@ -Metadata-Version: 2.1 -Name: rpds-py -Version: 0.17.1 -Classifier: Development Status :: 3 - Alpha -Classifier: Intended Audience :: Developers -Classifier: License :: OSI Approved :: MIT License -Classifier: Operating System :: OS Independent -Classifier: Programming Language :: Rust -Classifier: Programming Language :: Python :: 3.8 -Classifier: Programming Language :: Python :: 3.9 -Classifier: Programming Language :: Python :: 3.10 -Classifier: Programming Language :: Python :: 3.11 -Classifier: Programming Language :: Python :: 3.12 -Classifier: Programming Language :: Python :: 3 -Classifier: Programming Language :: Python :: Implementation :: CPython -Classifier: Programming Language :: Python :: Implementation :: PyPy -License-File: LICENSE -Summary: Python bindings to Rust's persistent data structures (rpds) -Keywords: data structures,rust,persistent -Author: Julian Berman -Author-email: Julian+rpds@GrayVines.com -License: MIT -Requires-Python: >=3.8 -Description-Content-Type: text/x-rst; charset=UTF-8 -Project-URL: Documentation, https://rpds.readthedocs.io/ -Project-URL: Homepage, https://github.com/crate-py/rpds -Project-URL: Issues, https://github.com/crate-py/rpds/issues/ -Project-URL: Funding, https://github.com/sponsors/Julian -Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-rpds-py?utm_source=pypi-rpds-py&utm_medium=referral&utm_campaign=pypi-link -Project-URL: Source, https://github.com/crate-py/rpds - -=========== -``rpds.py`` -=========== - -|PyPI| |Pythons| |CI| - -.. |PyPI| image:: https://img.shields.io/pypi/v/rpds-py.svg - :alt: PyPI version - :target: https://pypi.org/project/rpds-py/ - -.. |Pythons| image:: https://img.shields.io/pypi/pyversions/rpds-py.svg - :alt: Supported Python versions - :target: https://pypi.org/project/rpds-py/ - -.. |CI| image:: https://github.com/crate-py/rpds/workflows/CI/badge.svg - :alt: Build status - :target: https://github.com/crate-py/rpds/actions?query=workflow%3ACI - -.. |ReadTheDocs| image:: https://readthedocs.org/projects/referencing/badge/?version=stable&style=flat - :alt: ReadTheDocs status - :target: https://referencing.readthedocs.io/en/stable/ - - -Python bindings to the `Rust rpds crate `_ for persistent data structures. - -What's here is quite minimal (in transparency, it was written initially to support replacing ``pyrsistent`` in the `referencing library `_). -If you see something missing (which is very likely), a PR is definitely welcome to add it. - -Installation ------------- - -The distribution on PyPI is named ``rpds.py`` (equivalently ``rpds-py``), and thus can be installed via e.g.: - -.. code:: sh - - $ pip install rpds-py - -Note that if you install ``rpds-py`` from source, you will need a Rust toolchain installed, as it is a build-time dependency. -An example of how to do so in a ``Dockerfile`` can be found `here `_. - -If you believe you are on a common platform which should have wheels built (i.e. and not need to compile from source), feel free to file an issue or pull request modifying the GitHub action used here to build wheels via ``maturin``. - -Usage ------ - -Methods in general are named similarly to their ``rpds`` counterparts (rather than ``pyrsistent``\ 's conventions, though probably a full drop-in ``pyrsistent``\ -compatible wrapper module is a good addition at some point). - -.. code:: python - - >>> from rpds import HashTrieMap, HashTrieSet, List - - >>> m = HashTrieMap({"foo": "bar", "baz": "quux"}) - >>> m.insert("spam", 37) == HashTrieMap({"foo": "bar", "baz": "quux", "spam": 37}) - True - >>> m.remove("foo") == HashTrieMap({"baz": "quux"}) - True - - >>> s = HashTrieSet({"foo", "bar", "baz", "quux"}) - >>> s.insert("spam") == HashTrieSet({"foo", "bar", "baz", "quux", "spam"}) - True - >>> s.remove("foo") == HashTrieSet({"bar", "baz", "quux"}) - True - - >>> L = List([1, 3, 5]) - >>> L.push_front(-1) == List([-1, 1, 3, 5]) - True - >>> L.rest == List([3, 5]) - True - diff --git a/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/RECORD b/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/RECORD deleted file mode 100644 index ffe6659..0000000 --- a/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/RECORD +++ /dev/null @@ -1,10 +0,0 @@ -rpds/__init__.py,sha256=w3MgXW7lpTCICw0KXbw20QX573_kbsEnWIeMsCAugvM,99 -rpds/__init__.pyi,sha256=C8DWV1NrWEcFLxGCHD1v98Y3mdpLMunt7HKaX-BnnOk,2434 -rpds/__pycache__/__init__.cpython-311.pyc,, -rpds/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 -rpds/rpds.cp311-win_amd64.pyd,sha256=r2GBmRovt8l52SKcSynh4EAbcH-N-SRs9MgxdPi0SJQ,528896 -rpds_py-0.17.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 -rpds_py-0.17.1.dist-info/METADATA,sha256=aGakoHnk7ehqoLddYyMlrG68R-n-Y5Gzp1wpy8T5g7k,4203 -rpds_py-0.17.1.dist-info/RECORD,, -rpds_py-0.17.1.dist-info/WHEEL,sha256=QWeP2iNVclb1lqJMYxkB3S_jGRNF2KI-alH1eOqR1Tk,95 -rpds_py-0.17.1.dist-info/license_files/LICENSE,sha256=i8tyyC6ornSAIpPEHZOtfVFDQAGwrkWmA6WvD1B67go,1076 diff --git a/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/WHEEL b/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/WHEEL deleted file mode 100644 index 531ee13..0000000 --- a/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/WHEEL +++ /dev/null @@ -1,4 +0,0 @@ -Wheel-Version: 1.0 -Generator: maturin (1.4.0) -Root-Is-Purelib: false -Tag: cp311-none-win_amd64 diff --git a/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/license_files/LICENSE b/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/license_files/LICENSE deleted file mode 100644 index 119a1f2..0000000 --- a/.venv/Lib/site-packages/rpds_py-0.17.1.dist-info/license_files/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -Copyright (c) 2023 Julian Berman - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/__init__.cpython-311.pyc index bdab6a4..b4f83f0 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-311.pyc index 04bc15e..f0458b8 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/_entry_points.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/_entry_points.cpython-311.pyc index e9ca4a6..591fe70 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/_entry_points.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/_entry_points.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/_imp.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/_imp.cpython-311.pyc index 26807ef..e7806ac 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/_imp.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/_imp.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/_importlib.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/_importlib.cpython-311.pyc index 5dda800..d0bff4e 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/_importlib.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/_importlib.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/_itertools.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/_itertools.cpython-311.pyc index 677e79c..1706a59 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/_itertools.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/_itertools.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/_path.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/_path.cpython-311.pyc index 6ca1c9f..caabb50 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/_path.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/_path.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/_reqs.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/_reqs.cpython-311.pyc index 0bf92b7..7c26bdc 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/_reqs.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/_reqs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/archive_util.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/archive_util.cpython-311.pyc index f5a9341..6c1bc13 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/archive_util.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/archive_util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/build_meta.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/build_meta.cpython-311.pyc index 445f9a2..e4f3ed3 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/build_meta.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/build_meta.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/dep_util.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/dep_util.cpython-311.pyc index 8a73781..885272f 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/dep_util.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/dep_util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/depends.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/depends.cpython-311.pyc index 60a319d..c17367e 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/depends.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/depends.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/discovery.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/discovery.cpython-311.pyc index 0c5ba33..16a7038 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/discovery.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/discovery.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/dist.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/dist.cpython-311.pyc index 4a97b4a..e010a7b 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/dist.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/dist.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/errors.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/errors.cpython-311.pyc index 05a4ab8..ececbfe 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/errors.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/errors.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/extension.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/extension.cpython-311.pyc index 63521ee..c3ae83b 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/extension.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/extension.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/glob.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/glob.cpython-311.pyc index ab25004..96d79e7 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/glob.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/glob.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/installer.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/installer.cpython-311.pyc index f039c38..bc36f60 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/installer.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/installer.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/launch.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/launch.cpython-311.pyc index 00468fe..f992aba 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/launch.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/launch.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/logging.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/logging.cpython-311.pyc index c5eae11..8ad6e1a 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/logging.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/logging.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/monkey.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/monkey.cpython-311.pyc index fec5250..9d64f9b 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/monkey.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/monkey.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/msvc.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/msvc.cpython-311.pyc index 7db769b..549830f 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/msvc.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/msvc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/namespaces.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/namespaces.cpython-311.pyc index d333468..6991002 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/namespaces.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/namespaces.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/package_index.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/package_index.cpython-311.pyc index cc84b7d..526ca69 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/package_index.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/package_index.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/py34compat.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/py34compat.cpython-311.pyc index 2fd45bd..867c24a 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/py34compat.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/py34compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/sandbox.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/sandbox.cpython-311.pyc index dd48a7a..aec9d1c 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/sandbox.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/sandbox.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-311.pyc index bcdb213..4050fd5 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/version.cpython-311.pyc index b02665e..a08fefd 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/wheel.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/wheel.cpython-311.pyc index 7db07f2..967d760 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/wheel.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/__pycache__/windows_support.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/__pycache__/windows_support.cpython-311.pyc index 8ab1fbe..7392aa2 100644 Binary files a/.venv/Lib/site-packages/setuptools/__pycache__/windows_support.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/__pycache__/windows_support.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-311.pyc index 8f64d62..8332e0c 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-311.pyc index 591879f..74d2604 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_collections.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-311.pyc index 2bf20de..80803bd 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_functools.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-311.pyc index 41a7f26..07c9ac9 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_macos_compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-311.pyc index af7d1fe..d80d5fc 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-311.pyc index d0d6e60..a9a20f1 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-311.pyc index 5759c2e..1a3c725 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-311.pyc index 789fa76..d413e0c 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-311.pyc index efa8135..d3d4f05 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/config.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/config.cpython-311.pyc index cee86f0..32f596c 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/config.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/config.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/core.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/core.cpython-311.pyc index 8d065bf..5bade27 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/core.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/core.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-311.pyc index 67c1cfd..d9c5e47 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/debug.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/debug.cpython-311.pyc index ecfaa67..a91d654 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/debug.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/debug.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-311.pyc index 5ad39ff..eb5e220 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-311.pyc index a05317d..c8be45f 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/dist.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/dist.cpython-311.pyc index 7407e25..f85299c 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/dist.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/dist.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/errors.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/errors.cpython-311.pyc index 6e75434..f0dd557 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/errors.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/errors.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/extension.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/extension.cpython-311.pyc index c461aa2..88ae4df 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/extension.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/extension.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-311.pyc index da67259..d375bbd 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-311.pyc index 4bcd957..938e983 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-311.pyc index 9c9d025..db23f32 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/log.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/log.cpython-311.pyc index c322328..ae26a2f 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/log.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/log.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-311.pyc index bb73e51..67b5454 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-311.pyc index f2c46ea..760a1da 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-311.pyc index b55f8fa..d4e6cde 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-311.pyc index 5d22e48..ffe4ac3 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/py39compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-311.pyc index c388f55..555cdf0 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-311.pyc index eab52ad..798a48c 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-311.pyc index d2e6693..72f2e6a 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-311.pyc index 6111a58..85f3c5e 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/util.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/util.cpython-311.pyc index aad2e82..566c720 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/util.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/version.cpython-311.pyc index b4580e9..f2b92d2 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-311.pyc index 54bd782..996d148 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-311.pyc index ef330e4..7ca7cd6 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-311.pyc index 642720c..6ceec26 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/_framework_compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-311.pyc index f0a607b..b63b509 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-311.pyc index 390eb91..15eaed5 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-311.pyc index 034e4a5..251bd06 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-311.pyc index 3d9a1e4..e5cd712 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-311.pyc index 0e42436..e5e46a1 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-311.pyc index 9342f73..8d04670 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-311.pyc index 4952ffc..24cce4f 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-311.pyc index 974d20e..cffc981 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-311.pyc index 9fe19e8..52251a9 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-311.pyc index 66557f4..c5e3137 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-311.pyc index 16b6a0e..b1c038a 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-311.pyc index e4f8b49..20c4a99 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-311.pyc index 5862e47..21ca20b 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-311.pyc index 71ba56c..482b946 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-311.pyc index 5084e80..2034dc3 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-311.pyc index 0f229ce..7faf8a3 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-311.pyc index 5bbd943..a2598e9 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-311.pyc index 432fabd..9fc7d81 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-311.pyc index ba6d905..85cbfc1 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-311.pyc index 2b9c110..9b88876 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-311.pyc index a820b18..8d9ba32 100644 Binary files a/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-311.pyc index e5c6ac6..1c5c764 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-311.pyc index dbef4ad..5966c96 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-311.pyc index 7c523d3..1820189 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/typing_extensions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-311.pyc index bb0c2c6..3bf9556 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/__pycache__/zipp.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-311.pyc index f62ab2e..3f1bfc4 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-311.pyc index 2a881df..c337290 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_adapters.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-311.pyc index 85f00cc..9c78005 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_collections.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-311.pyc index f33249e..3775ff0 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-311.pyc index f8b6df4..afece84 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_functools.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-311.pyc index a236453..b0c9e1f 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_itertools.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-311.pyc index 121225b..706c295 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_meta.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-311.pyc index 3ec163b..4f240bd 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_metadata/__pycache__/_text.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc index 06765c1..f061327 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc index 110f20d..86cc196 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_adapters.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc index 4593106..cb9fb27 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_common.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc index a6c2484..05fa854 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc index c5ffd37..e13a6ce 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_itertools.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc index fff02b7..a021b6e 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/_legacy.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc index f7148a5..8558816 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/abc.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc index 00321ab..d65e959 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/readers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc index a1dd440..a2a688b 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/importlib_resources/__pycache__/simple.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc index d25164b..06b47a0 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-311.pyc index f9d330f..38af39a 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/context.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-311.pyc index 71254f7..7de5f6e 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/jaraco/__pycache__/functools.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc index bd58383..6cd8bd8 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/jaraco/text/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc index 81c9e86..f8c527a 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-311.pyc index 66c1d66..5de98b3 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc index 249bad4..5d94b55 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-311.pyc index 0818f6b..d2b499f 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-311.pyc index b286602..e31f075 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc index a9e7ce9..ebab7c3 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_manylinux.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc index 5b069be..2a5976b 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_musllinux.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-311.pyc index 2c40380..4e2d8fa 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-311.pyc index 4a3e878..ce93e78 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-311.pyc index fa355ac..85a3117 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc index e07ccb3..d8cee2a 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-311.pyc index 4c702ce..93004eb 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-311.pyc index 0b9cf80..3927d2b 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-311.pyc index f8a090c..b4c34aa 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc index cc596d4..08d3042 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc index 98235d3..09e48d6 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/actions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/common.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/common.cpython-311.pyc index ce5f539..b111592 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/common.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/common.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-311.pyc index 99a85ee..86cf352 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/core.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc index 4f718cd..f2a0d7b 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc index a34444d..60ac6e8 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/helpers.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/results.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/results.cpython-311.pyc index c870234..3a51263 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/results.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/results.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc index 4597860..caaa4c1 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/testing.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc index cf847d0..0cab824 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/unicode.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/util.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/util.cpython-311.pyc index ac20778..b0e2e7c 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/util.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/__pycache__/util.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc index fa7b2a0..684e316 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-311.pyc index fd633f3..7579cc9 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-311.pyc index b0b76b9..6d02d79 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_parser.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-311.pyc index 893fd61..eb65b7b 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_re.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-311.pyc index 88d7f70..1da2594 100644 Binary files a/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/_vendor/tomli/__pycache__/_types.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/__init__.cpython-311.pyc index 581506f..a927d31 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/alias.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/alias.cpython-311.pyc index 402b437..1a59eb8 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/alias.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/alias.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-311.pyc index dba09fb..25362af 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-311.pyc index d707d66..df34491 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/build.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/build.cpython-311.pyc index 2586660..ba969f4 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/build.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/build.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/build_clib.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/build_clib.cpython-311.pyc index 51eb60f..f9d6373 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/build_clib.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/build_clib.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/build_ext.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/build_ext.cpython-311.pyc index e36c82a..329d723 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/build_ext.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/build_ext.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-311.pyc index 0a73b77..b44fdc4 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/develop.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/develop.cpython-311.pyc index 80eade8..8509fab 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/develop.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/develop.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/dist_info.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/dist_info.cpython-311.pyc index 2c880e2..f8b492b 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/dist_info.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/dist_info.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-311.pyc index 97acbef..3199092 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/editable_wheel.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/editable_wheel.cpython-311.pyc index 80d5515..9ef5bdc 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/editable_wheel.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/editable_wheel.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-311.pyc index eaade7c..7701536 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/install.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/install.cpython-311.pyc index 1fc882d..726b104 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/install.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/install.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-311.pyc index 44bf768..48435da 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/install_lib.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/install_lib.cpython-311.pyc index 4dcb3e4..3d5a338 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/install_lib.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/install_lib.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/install_scripts.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/install_scripts.cpython-311.pyc index f7d1298..2e4c1ff 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/install_scripts.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/install_scripts.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/py36compat.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/py36compat.cpython-311.pyc index dd1c544..4526c87 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/py36compat.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/py36compat.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/register.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/register.cpython-311.pyc index b8adb92..8daad11 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/register.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/register.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/rotate.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/rotate.cpython-311.pyc index 2822b57..0787a16 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/rotate.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/rotate.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/saveopts.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/saveopts.cpython-311.pyc index ab12a29..eb1328c 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/saveopts.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/saveopts.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/sdist.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/sdist.cpython-311.pyc index 313347d..e219a13 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/sdist.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/sdist.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-311.pyc index d824532..cfed12f 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/test.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/test.cpython-311.pyc index b673148..44c0b3d 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/test.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/test.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/upload.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/upload.cpython-311.pyc index 55f673d..f50437b 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/upload.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/upload.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/command/__pycache__/upload_docs.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/command/__pycache__/upload_docs.cpython-311.pyc index a5083bd..0e4da59 100644 Binary files a/.venv/Lib/site-packages/setuptools/command/__pycache__/upload_docs.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/command/__pycache__/upload_docs.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/config/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/config/__pycache__/__init__.cpython-311.pyc index afe8023..14eeffb 100644 Binary files a/.venv/Lib/site-packages/setuptools/config/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/config/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-311.pyc index 843f1e1..ee0b345 100644 Binary files a/.venv/Lib/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/config/__pycache__/_apply_pyprojecttoml.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/config/__pycache__/expand.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/config/__pycache__/expand.cpython-311.pyc index a0312ea..9d0cefd 100644 Binary files a/.venv/Lib/site-packages/setuptools/config/__pycache__/expand.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/config/__pycache__/expand.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-311.pyc index 2fc5501..e9f7e1a 100644 Binary files a/.venv/Lib/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/config/__pycache__/pyprojecttoml.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/config/__pycache__/setupcfg.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/config/__pycache__/setupcfg.cpython-311.pyc index 965b80a..e6b983a 100644 Binary files a/.venv/Lib/site-packages/setuptools/config/__pycache__/setupcfg.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/config/__pycache__/setupcfg.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-311.pyc index 890659f..b4cbb27 100644 Binary files a/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-311.pyc index 7a53be1..e6da216 100644 Binary files a/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/error_reporting.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-311.pyc index ae83c76..6769e9b 100644 Binary files a/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/extra_validations.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pyc index 1bd1bce..3417710 100644 Binary files a/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_exceptions.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pyc index 698af3a..6ac13aa 100644 Binary files a/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/fastjsonschema_validations.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-311.pyc index bd0e433..dbc1c83 100644 Binary files a/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/config/_validate_pyproject/__pycache__/formats.cpython-311.pyc differ diff --git a/.venv/Lib/site-packages/setuptools/extern/__pycache__/__init__.cpython-311.pyc b/.venv/Lib/site-packages/setuptools/extern/__pycache__/__init__.cpython-311.pyc index a61f593..3af6ec9 100644 Binary files a/.venv/Lib/site-packages/setuptools/extern/__pycache__/__init__.cpython-311.pyc and b/.venv/Lib/site-packages/setuptools/extern/__pycache__/__init__.cpython-311.pyc differ diff --git a/.venv/Scripts/Activate.ps1 b/.venv/Scripts/Activate.ps1 index f694cda..dd1fc1c 100644 --- a/.venv/Scripts/Activate.ps1 +++ b/.venv/Scripts/Activate.ps1 @@ -362,23 +362,23 @@ $Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" # AwQCAQUAoIHIMBkGCSqGSIb3DQEJAzEMBgorBgEEAYI3AgEEMBwGCisGAQQBgjcC # AQsxDjAMBgorBgEEAYI3AgEVMC8GCSqGSIb3DQEJBDEiBCBnAZ6P7YvTwq0fbF62 # o7E75R0LxsW5OtyYiFESQckLhjBcBgorBgEEAYI3AgEMMU4wTKBGgEQAQgB1AGkA -# bAB0ADoAIABSAGUAbABlAGEAcwBlAF8AdgAzAC4AMQAxAC4ANwBfADIAMAAyADMA -# MQAyADAANAAuADAAMqECgAAwDQYJKoZIhvcNAQEBBQAEggIAVhZsoG5v92/dDgEz -# lrJSMsrzIVN/bHXzuCTiIZXcrKukESZFLhnBOQ7L61vUqsExhu99fyJdyYscjtgF -# qxpYm/mAbfUbX0pthvogoYsps1CZVt1MiQmZo/JqRZhcNmJnSvebLtbbsNMAsjaP -# k4MatEx/cpIz8NfwMpN2bhS9sbgNDDgtUcvJHFAFwx8JcKGFdP3eEnDsVPZLoeNG -# T0UZbfAfeHdyyaBfUJPKZ1gHrwX/vdDoF2gU+kbnwhQkEFPsJ3RKkcOkK8XFloH1 -# rHhSKubObSMmiMwvaV8lpZv3atB1ZMrIu+ACASWGLzcC5hAPjti+kDCL69gm82Ad -# tGvZJTbZeu5w8Z8xuwbbJoe4AdjtPfQXDhwTtAvMHxXHf1dNciXq+vcYSibsGCx1 -# Z0GPW8Aab1h3VcJR40TGn+UxuDjKX/CJMpq/Xec0EVjmjn/ciZMedNLm8TXgERrO -# JsgPv6r4ftmK1mZ//kViv5kQPGkYmJwcjqwY6J1FaJPhTRxm+kBgJQw664isc0Pa -# 9Tpf3gVpIDoVpA4pdh5FxZoQbfFN5hZeyuBU7qGq2edSaod2tmfynQiojG7X09oE -# UCyhdoEgQEJbXTI4tviyPCUfcLGnY8hFmkUPbDfR+NPYz4ARyNlMYvu1gFnH0m9u -# 7HR0bM2+B6TBAFXOT6T92MU3yQOhghdAMIIXPAYKKwYBBAGCNwMDATGCFywwghco +# bAB0ADoAIABSAGUAbABlAGEAcwBlAF8AdgAzAC4AMQAxAC4AOABfADIAMAAyADQA +# MAAyADAANgAuADAAMaECgAAwDQYJKoZIhvcNAQEBBQAEggIADnAr0mBnpSQshcvb +# heUYhuL+Zw+As+KzbU0/onLW+f2snIyPi0L8M+ivZDE0eEkEK4s5gCigAnLy3gLI +# dJobJ8LDzJutQ/Oy22PNdfLTZPDKBXmDePJF7yAJ3dYTcmVey/DW056gM2gNk9Rs +# MINw01Q0FnWq2EdZ1mFHqhKhrucNIH5YxiDRUC1/khyrO40Vm5Byux/dSIlik4Rm +# TVKnl+atMtC1MJsccvQHOH5NeqO4huuWWIDzaQqq1DXeZITZvNHANqJ9oqiENy5v +# R3i+tjQX8aQreVFcIFAXSU2JGw0SZJCtQ6phm6/uMV11PVLr1pN8NgNfVwhNAHaX +# xnDbRTUh3E+zoNd8+aN60Vm/JzaREjwaMRMGjQ97ntREKbuRb8R+0cbfzRF2Pp9k +# 1ypb2gXPl8jAP0w0J8lzoZV28qb39AoP/uanYLB59vKlUxdNB3mGyGlWfu3SEJw5 +# ha7Pbc8uYMBu7Zn3lM/ZTrbx5P0ay1xngifWEoVSQTfB9TVeSKqUIrUw92oEMRA4 +# ezVSNGs0w1SALmCkOHIGNW/ynA7FF7rj1lGe71OR8B5DlHe9fsg/a7+JqTqY87ua +# SK4oaONbyZhjAZm1Epv47ZT/wvV3BGY033UzBqBjn0ZTDkJzDJ+01q6LX4EDfSkd +# TKma4k0EiRn/j97yiQkvyrWqOmehghdAMIIXPAYKKwYBBAGCNwMDATGCFywwghco # BgkqhkiG9w0BBwKgghcZMIIXFQIBAzEPMA0GCWCGSAFlAwQCAQUAMHgGCyqGSIb3 -# DQEJEAEEoGkEZzBlAgEBBglghkgBhv1sBwEwMTANBglghkgBZQMEAgEFAAQg4yfn -# AAT1AOjfUsocX8KGhYms2ESpJ87/a8nFQw74k+UCEQDIaFDp6S7W9z0moWf/D7d4 -# GA8yMDIzMTIwNDE5NDM0OFqgghMJMIIGwjCCBKqgAwIBAgIQBUSv85SdCDmmv9s/ +# DQEJEAEEoGkEZzBlAgEBBglghkgBhv1sBwEwMTANBglghkgBZQMEAgEFAAQgqV0Q +# MCSfxogSBrE/2Jtt0SbA9y8jfJrkQeSm3dNpsXcCEQCJ9ksSNefY1I5FCP7QplMI +# GA8yMDI0MDIwNjIyMzcwMFqgghMJMIIGwjCCBKqgAwIBAgIQBUSv85SdCDmmv9s/ # X+VhFjANBgkqhkiG9w0BAQsFADBjMQswCQYDVQQGEwJVUzEXMBUGA1UEChMORGln # aUNlcnQsIEluYy4xOzA5BgNVBAMTMkRpZ2lDZXJ0IFRydXN0ZWQgRzQgUlNBNDA5 # NiBTSEEyNTYgVGltZVN0YW1waW5nIENBMB4XDTIzMDcxNDAwMDAwMFoXDTM0MTAx @@ -484,19 +484,19 @@ $Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH" # bmMuMTswOQYDVQQDEzJEaWdpQ2VydCBUcnVzdGVkIEc0IFJTQTQwOTYgU0hBMjU2 # IFRpbWVTdGFtcGluZyBDQQIQBUSv85SdCDmmv9s/X+VhFjANBglghkgBZQMEAgEF # AKCB0TAaBgkqhkiG9w0BCQMxDQYLKoZIhvcNAQkQAQQwHAYJKoZIhvcNAQkFMQ8X -# DTIzMTIwNDE5NDM0OFowKwYLKoZIhvcNAQkQAgwxHDAaMBgwFgQUZvArMsLCyQ+C -# Xc6qisnGTxmcz0AwLwYJKoZIhvcNAQkEMSIEIEry/+xjYMB4r/ZqFW2ejwy1FFPr -# q1ugQZH8TRrV9+DDMDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEINL25G3tdCLM0dRA -# V2hBNm+CitpVmq4zFq9NGprUDHgoMA0GCSqGSIb3DQEBAQUABIICABaD5RTtfVJC -# Cq1t4TVHDYnu+jceKL3iWD+ZjYKkCmzDAuuhMB0V+0CME5dRCVdlrChAEDPj+eG4 -# z9OGw0RqZpjHU3ZCa92R4dfER+b1S2pZbu4UyL/Hl93Cm9/dL80OggBbx2WmB1cH -# FLa1uf9MHT+/kQBC/+gt9IOstcdoJyT2CzNDUD3xTSa4Y5QGM0VrqO2tRLsTIf7V -# sKKzjv/57sdjsiaL94K6xwtOV4m6vjCtWdkgjwuf99uSoMZBo4s0H4/xvkYupqWd -# F8FBITmO3yKyjR34o+XFpx8iwqgT7Jaotsoj/33X1n7kreaAxZHw9aJOpKh8P52j -# uZgmtSQTcv9sXFeCuZ0TWio3sa1pTiaVzmZH4i2pHylNEWczfopaoAMsWHHFmixU -# qitVn/ed6okrpRgZ0e94LeQmmrhLU0A6m7uVpLIcLe/vRk1x8CripLQylnCWBDT7 -# vY371u0vxxGTaVVDptZ2j/YAP81VJzpL3aB8ZVFWoDOi5HvZrE4L14gkL5osZy+G -# VJtWxweOU/XFeUpQPIi2hkCo6DYayfOuAPBebBSFiowVzVEMS+EpsS4KfJ9qbOKd -# Jx94AicvTSUHfxNkVmkMN9ruAbwAHxA40v0c+fyuc0ErQqb5nyfk6r1Cp0royUGg -# kMDPbdMASNA2ZjAQ93slib/UPx+77W3V +# DTI0MDIwNjIyMzcwMFowKwYLKoZIhvcNAQkQAgwxHDAaMBgwFgQUZvArMsLCyQ+C +# Xc6qisnGTxmcz0AwLwYJKoZIhvcNAQkEMSIEIP3CVflgfyYCpuc6KYJIRj93U8EY +# Y31YCwfzWAlsRsj8MDcGCyqGSIb3DQEJEAIvMSgwJjAkMCIEINL25G3tdCLM0dRA +# V2hBNm+CitpVmq4zFq9NGprUDHgoMA0GCSqGSIb3DQEBAQUABIICACy9XR4vL0AD +# nXdZ3nkMxqSLbMDznrzCsJ2lg8tZpdyrr2cfzBv8oSoR0LIfj1l/4AvghwQOnBQY +# peAi4htRIBph93IsDTBmzry1pUt25ZQVGL4bH8oNCdbNjYusrHiFsmHb9awCZ83Y +# Z/qJkC3M1tmg7RDeddQ0MXzeYoXzN6Xf+TqbRj8Ti4y8luPDi6PUO4Qz1TRznTYj +# ULRQJ8DHPaIF+XWMvEA4CFZQTeNej2aJg0TSC9fRWHRVc0TJ7HKQBJT9sDdf9EO7 +# iw0wd4j5TjLYdl5yxIkKkgVkqCZgmwSAPumb7q2e1B/PGjJPnWcydJRxtH5t6ZZh +# u0R916vYMrjpI3qgPUL/kYuiXnJ4VefN64ocB7SqdBp+LDXPXYU01SVbim/OPjxN +# KSJRoGn1/6CBbT/22xWjj3O9ebIEeZivM5utRitsePPE81vIQ9Zc5j2DxMYUwxHg +# C3cBv6eoqruDbzi6xKpGtVsJxXgIfYidg6m5VZFk7BgNJCiyGDfCl3+OsG3lSt6Z +# /Ed1P5wE4LHwp1tAzvwZ/kWfL1Vilq2/UJtfivxR863/wHSr9n6Pzq63mfcdKxH7 +# 6rMakA2CXnKZrCcmeqh6c1dsAJRH3UE2jtAF7Ckei7OxJyxcr1IUjYynqKUObDK1 +# eorpTzvx7xgHeYHRMQvZhz2W0c0QQWRZ # SIG # End signature block diff --git a/.venv/Scripts/black.exe b/.venv/Scripts/black.exe index 12f77de..f67cb31 100644 Binary files a/.venv/Scripts/black.exe and b/.venv/Scripts/black.exe differ diff --git a/.venv/Scripts/blackd.exe b/.venv/Scripts/blackd.exe index 46d0213..197b7e5 100644 Binary files a/.venv/Scripts/blackd.exe and b/.venv/Scripts/blackd.exe differ diff --git a/.venv/Scripts/chevron.exe b/.venv/Scripts/chevron.exe index 48905c0..675e6bf 100644 Binary files a/.venv/Scripts/chevron.exe and b/.venv/Scripts/chevron.exe differ diff --git a/.venv/Scripts/jsonschema.exe b/.venv/Scripts/jsonschema.exe index af7c892..675e6bf 100644 Binary files a/.venv/Scripts/jsonschema.exe and b/.venv/Scripts/jsonschema.exe differ diff --git a/.venv/Scripts/molang.exe b/.venv/Scripts/molang.exe index 607c804..675e6bf 100644 Binary files a/.venv/Scripts/molang.exe and b/.venv/Scripts/molang.exe differ diff --git a/.venv/Scripts/pip.exe b/.venv/Scripts/pip.exe index 287f863..edd6717 100644 Binary files a/.venv/Scripts/pip.exe and b/.venv/Scripts/pip.exe differ diff --git a/.venv/Scripts/pip3.11.exe b/.venv/Scripts/pip3.11.exe index 287f863..edd6717 100644 Binary files a/.venv/Scripts/pip3.11.exe and b/.venv/Scripts/pip3.11.exe differ diff --git a/.venv/Scripts/pip3.exe b/.venv/Scripts/pip3.exe index 287f863..edd6717 100644 Binary files a/.venv/Scripts/pip3.exe and b/.venv/Scripts/pip3.exe differ diff --git a/.venv/Scripts/python.exe b/.venv/Scripts/python.exe index 38d286b..09cf583 100644 Binary files a/.venv/Scripts/python.exe and b/.venv/Scripts/python.exe differ diff --git a/.venv/Scripts/pythonw.exe b/.venv/Scripts/pythonw.exe index 95c64ef..b4a8541 100644 Binary files a/.venv/Scripts/pythonw.exe and b/.venv/Scripts/pythonw.exe differ diff --git a/.venv/pyvenv.cfg b/.venv/pyvenv.cfg index e5e4747..8f86d95 100644 --- a/.venv/pyvenv.cfg +++ b/.venv/pyvenv.cfg @@ -1,5 +1,5 @@ home = C:\Users\1589l\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0 include-system-site-packages = false -version = 3.11.7 +version = 3.11.8 executable = C:\Users\1589l\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe command = C:\Users\1589l\AppData\Local\Microsoft\WindowsApps\PythonSoftwareFoundation.Python.3.11_qbz5n2kfra8p0\python.exe -m venv C:\Users\1589l\Documents\GitHub\Python\mcaddon\.venv diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ea4147..086e3f2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,27 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). +## [0.0.3] - 3/15/2024 +### General +- Changed manifest format version to 2 +- Re-wrote code for adding files to packs and add-ons to be dynamic +- The Identifier object should now correctly handle paths that have multiple colons. +- JSON Schemas should now be included in the package. + +### Refactor +- `todo` submodule to `experimental` which contains objects that are still in development. +- `Identifier.parse` method to `Identifier.of` +- `BlockState` object to `BlockProperty` and added new BlockState which describes a block's ID and its block properties. +- Migrated from `__dict__` to `jsonify` for converting classes to JSON-friendly dictionaries. + + +### Added +- Feature +- FeatureRule +- Trading +- Geometry +- BlockCullingRules + ## [0.0.2] - 2/3/2024 ### General - Added schemas to read any format version. See [Format Version](https://github.com/legopitstop/mcaddon/blob/main/FORMAT_VERSION.md) for supported versions diff --git a/FORMAT_VERSION.md b/FORMAT_VERSION.md index d81fd09..e7cadce 100644 --- a/FORMAT_VERSION.md +++ b/FORMAT_VERSION.md @@ -1,25 +1,67 @@ # Supported Format Versions +## Manifest + +| Format | +| ------ | +| `2` | + ## Block | Format | | --------- | -| `1.20.51` | +| `1.20.50` | + +## Camera + +| Format | +| --------- | +| `1.19.50` | +| `1.20.50` | ## Item | Format | | --------- | -| `1.20.51` | +| `1.10` | +| `1.14` | +| `1.16.0` | +| `1.16` | +| `1.20.50` | ## Recipe -| Format | Recipe Type | -| --------- | ----------------------------------------------------------------------------------------------------------------------- | -| `1.20.51` | - furnace
- brewing_container
- brewing_mix
- shaped
- shapeless
- smithing_transform
- smithing_trim | +| Format | Recipe Type | +| --------- | ---------------------------------------------------------------------------------------------------------------- | +| `1.12` | - furnace
- brewing container
- brewing mix
- shapeless
- smithing transform
- smithing trim | +| `1.14` | - shaped
- material reduction | +| `1.16` | - shaped
- shapeless | +| `1.19` | - shapeless | +| `1.20.10` | - furnace
- brewing container
- brewing mix
- shapeless
- smithing transform
- smithing trim | +| `1.20.50` | - furnace
- shapeless
- smithing transform
- smithing trim | ## Volume | Format | | --------- | | `1.20.50` | + +## Feature + +| Format | Feature Type | +| -------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `1.13.0` | - aggregate
- sequence
- beardsandshavers
- cavecarver
- conditionallist
- fossil
- geode
- growingplant
- nethercavecarver
- multiface
- ore
- partiallyexposedblob
- rectlayout
- scansurface
- scatter
- sculkpatch
- search
- singleblock
- snaptosurface
- structuretemplate
- surfacerelativethreshold
- underwatercavecarver
- tree
- vegetationpatch
- weightedrandom
| +| `1.16.0` | - aggregate
- sequence
- beardsandshavers
- cavecarver
- conditionallist
- fossil
- geode
- growingplant
- nethercavecarver
- multiface
- ore
- partiallyexposedblob
- rectlayout
- scansurface
- scatter
- sculkpatch
- search
- singleblock
- snaptosurface
- structuretemplate
- surfacerelativethreshold
- underwatercavecarver
- tree
- vegetationpatch
- weightedrandom
| + +## Feature Rule + +| Format | +| ------ | +| `1.12` | + +## Geometry + +| Format | +| -------- | +| `1.12.0` | +| `1.16.0` | diff --git a/README.md b/README.md index f482f31..c8b0f7b 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,9 @@ Update existing installation: `pip3 install mcaddon --upgrade` | [`commentjson`](https://pypi.org/project/commentjson/) | Add Python and JavaScript style comments in your JSON files. | | [`jsonschema`](https://pypi.org/project/jsonschema/) | An implementation of JSON Schema validation for Python | | [`chevron`](https://pypi.org/project/chevron/) | Mustache templating language renderer | +| [`Pillow`](https://pypi.org/project/pillow/) | Python Imaging Library (Fork) | +| [`numpy`](https://pypi.org/project/numpy/) | Fundamental package for array computing in Python | +| [`PyGLM`](https://pypi.org/project/PyGLM/) | OpenGL Mathematics library for Python | ## Our Goal? @@ -48,7 +51,7 @@ from mcaddon import * blk = Block('test:on_interact_change_state_block') blk.add_component(OnInteractComponent(event='test_event')) -blk.add_event('test_event', SetBlockState({'custom:direction': "1"})) +blk.add_event('test_event', SetBlockProperty({'custom:direction': "1"})) blk.save('block.json') ``` @@ -68,6 +71,13 @@ blk.save('item.json') ## Command-line interface ``` +usage: mcaddon [-h] [-V] [-W []] + +options: + -h, --help show this help message and exit + -V, --version print the mcaddon version number and exit. + -W [], --watch [] + Watches this Python file for changes. ``` ## Road map @@ -77,44 +87,46 @@ blk.save('item.json') - [ ] animations - [ ] attachables - [ ] biomes_client.json - - [ ] blocks.json - - [ ] cameras + - [ ] block models - [ ] entity - [ ] flipbook_textures.json - [ ] font - - [ ] item_textures.json - [ ] materials - - [ ] models - [ ] particles - [ ] pieces - [ ] render_controllers - [ ] sounds - [ ] sounds.json - - [ ] terrain_textures.json - [ ] texture set - - [ ] textures - [ ] ui + - [x] blocks.json + - [x] entity models + - [x] item_textures.json + - [x] terrain_textures.json - [x] texts + - [x] textures - Behavior packs - - [ ] cameras - [ ] entities - - [ ] feature_rules - - [ ] features - [ ] spawn_rules - [ ] structures - - [ ] trading - [x] blocks + - [x] cameras + - [x] feature_rules + - [x] features - [x] items - [x] loot_tables - [x] recipes - [x] texts + - [x] trading - [x] volume + - [x] block_culling - Skin packs - [x] Addons - contents.json - cli - update mcaddon/mcpack -- Support to load all format versions. (At least all versions that are used in vanilla packs) +- [x] Support to load all format versions. (At least all versions that are used in vanilla packs) - Support to import packs. (for both singleplayer and on dedicated server) +- Make Model and Texture support common 3D rendering libraries; pygame, moderngl, etc - Toolchain to load packs - scripting - Convert Python to the Official Minecraft [Scripting and API](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/minecraft-server?view=minecraft-bedrock-stable). diff --git a/TODO.md b/TODO.md index 417bcc6..fe1e227 100644 --- a/TODO.md +++ b/TODO.md @@ -1,7 +1,20 @@ # TODO - Add method to convert an mcaddon to a python script to convert already existing packs to python. (w/ cli) - Cache build UUID's so it can use the same UUID when re-built +- Use js2py to convert Python to JavaScript for Scripting API to create custom components and other custom features. -- For vectors (ex; origin and size in SelectionBoxComponent) should use numpy +- Rename "BlockState" to "BlockPermutation" to match Minecraft API. BlockPermutation('id', {state: value}) + - Could cause conflict issues w/ the minecraft:block.permutations objects + - BlockPermutation.get_state() + - BlockPermutation.add_state() + - BlockPermutation.remove_state() + - BlockPermutation.clear_states() + +- args that use default [] or {} should use None. Create a new {} or [] in the prop if None is passed. + - Migrate dict and list attrs to use util.setattr2 + +## Extensions +- AI Creator + - Block-like interface defining the component's priority ![](https://miro.medium.com/v2/resize:fit:1400/1*EOM__0efT1Dy7_YCvNQ6ow.png) + - Run button at the top corner to simulate the entity behavior (Lights up each Block) -- integrate pytest: https://github.com/pytest-dev/pytest/ diff --git a/__pycache__/setup.cpython-311.pyc b/__pycache__/setup.cpython-311.pyc index 9febbda..36fec2f 100644 Binary files a/__pycache__/setup.cpython-311.pyc and b/__pycache__/setup.cpython-311.pyc differ diff --git a/assets/diamond_upgrade_smithing_template.png b/assets/diamond_upgrade_smithing_template.png deleted file mode 100644 index 8907102..0000000 Binary files a/assets/diamond_upgrade_smithing_template.png and /dev/null differ diff --git a/assets/gold_upgrade_smithing_template.png b/assets/gold_upgrade_smithing_template.png deleted file mode 100644 index 8907102..0000000 Binary files a/assets/gold_upgrade_smithing_template.png and /dev/null differ diff --git a/assets/iron_upgrade_smithing_template.png b/assets/iron_upgrade_smithing_template.png deleted file mode 100644 index 8907102..0000000 Binary files a/assets/iron_upgrade_smithing_template.png and /dev/null differ diff --git a/assets/stone_upgrade_smithing_template.png b/assets/stone_upgrade_smithing_template.png deleted file mode 100644 index 8907102..0000000 Binary files a/assets/stone_upgrade_smithing_template.png and /dev/null differ diff --git a/tests/unit_tests.py b/beh_unit_tests.py similarity index 52% rename from tests/unit_tests.py rename to beh_unit_tests.py index a3074c1..5bfbf4e 100644 --- a/tests/unit_tests.py +++ b/beh_unit_tests.py @@ -1,13 +1,18 @@ import glob import time -from mcaddon import BehaviorPack, ResourcePack +from mcaddon import BehaviorPack, Addon from multiprocessing import Pool def callback(path): - pack = BehaviorPack.load(path) - print(pack) - return pack + try: + pack = BehaviorPack.load(path) + print(pack, path) + return pack + except Exception as err: + import traceback + + print("Error: {}\n{}".format(path, traceback.format_exc())) if __name__ == "__main__": @@ -16,20 +21,20 @@ def callback(path): # BEHAVIOR_PACKS - gofast = False - if gofast: # 5.59 ms + gofast = True + if gofast: # This should be used in Addon class to load packs. - with Pool() as p: + with Pool(20) as p: packs = p.map(callback, glob.glob("tests/units/behavior_packs/*")) - else: # 11.43 ms + else: packs = [] for path in glob.glob("tests/units/behavior_packs/*"): pack = callback(path) packs.append(pack) - # RESOURCE_PACKS - # for path in glob.glob('tests/units/resource_packs/*'): - # pack = ResourcePack.load(path) - # print('RP',pack) print(round(time.time() - start, 2), "ms") + addon = Addon() + addon.extend(packs) + print("Saving...") + addon.save("build/", zipped=False, overwrite=True) diff --git a/build.bat b/build.bat index 805084f..79701d3 100644 --- a/build.bat +++ b/build.bat @@ -1,5 +1,5 @@ -@REM fix for appengine ImportError: pip install urllib3==1.26.15 requests-toolbelt==0.10.1 +@REM Format black . + +@REM Create source distribution python setup.py sdist -python -m twine upload dist/* --config-file %userprofile%\Desktop\Python\.pypirc -pause \ No newline at end of file diff --git a/build_docs.bat b/build_docs.bat index 3ee2eb3..50c00e8 100644 --- a/build_docs.bat +++ b/build_docs.bat @@ -1,4 +1,5 @@ -@REM Make docs +@REM Make docs from doc strings sphinx-apidoc -o docs . + +@REM Convert rst to html .\docs\make.bat html -pause diff --git a/debug.bat b/debug.bat new file mode 100644 index 0000000..ac54876 --- /dev/null +++ b/debug.bat @@ -0,0 +1,5 @@ +@REM Install Python package +python setup.py install + +@REM Run pytest +pytest diff --git a/dist/mcaddon-0.0.2.tar.gz b/dist/mcaddon-0.0.2.tar.gz deleted file mode 100644 index 7d5f179..0000000 Binary files a/dist/mcaddon-0.0.2.tar.gz and /dev/null differ diff --git a/dist/mcaddon-0.0.3.tar.gz b/dist/mcaddon-0.0.3.tar.gz new file mode 100644 index 0000000..2c0ebc4 Binary files /dev/null and b/dist/mcaddon-0.0.3.tar.gz differ diff --git a/docs/_build/doctrees/environment.pickle b/docs/_build/doctrees/environment.pickle index a97c5bd..7a4c7c5 100644 Binary files a/docs/_build/doctrees/environment.pickle and b/docs/_build/doctrees/environment.pickle differ diff --git a/docs/_build/html/_modules/mcpackutils/block.html b/docs/_build/html/_modules/mcpackutils/block.html index a5c8aa4..8f43b9f 100644 --- a/docs/_build/html/_modules/mcpackutils/block.html +++ b/docs/_build/html/_modules/mcpackutils/block.html @@ -270,11 +270,11 @@

Source code for mcpackutils.block

         setattr(self, '_events', value)
 
     @property
-    def states(self) -> dict[Identifier, BlockState]:
+    def states(self) -> dict[Identifier, BlockProperty]:
         return getattr(self, '_states')
 
     @states.setter
-    def states(self, value:dict[Identifier, BlockState]):
+    def states(self, value:dict[Identifier, BlockProperty]):
         if not isinstance(value, dict): raise TypeError(f"Expected dict but got '{value.__class__.__name__}' instead")
         setattr(self, '_states', value)
     
@@ -447,23 +447,23 @@ 

Source code for mcpackutils.block

 
 
[docs] - def add_state(self, state:BlockState) -> BlockState: - if not isinstance(state, BlockState): raise TypeError(f"Expected BlockState but got '{state.__class__.__name__}' instead") + def add_state(self, state:BlockProperty) -> BlockProperty: + if not isinstance(state, BlockProperty): raise TypeError(f"Expected BlockProperty but got '{state.__class__.__name__}' instead") self.states[state.id] = state return state
[docs] - def get_state(self, id:Identifier|str) -> BlockState: - x = id.id if isinstance(id, BlockState) else Identifier(id) + def get_state(self, id:Identifier|str) -> BlockProperty: + x = id.id if isinstance(id, BlockProperty) else Identifier(id) return self.states.get(x)
[docs] - def remove_state(self, id:Identifier|str) -> BlockState: - x = id.id if isinstance(id, BlockState) else Identifier(id) + def remove_state(self, id:Identifier|str) -> BlockProperty: + x = id.id if isinstance(id, BlockProperty) else Identifier(id) return self.states.pop(x)
@@ -492,7 +492,7 @@

Source code for mcpackutils.block

         
         # STATES
 
-        self.shape = self.add_state(BlockState(self.identifier.copy_with_path('shape'), 'single', 'double'))
+        self.shape = self.add_state(BlockProperty(self.identifier.copy_with_path('shape'), 'single', 'double'))
 
         # COMPONENTS
 
@@ -519,7 +519,7 @@ 

Source code for mcpackutils.block

         # EVENTS
 
         self.add_event('on_interact', RunCommand(['playsound use.stone @p'], EventTarget.PLAYER))
-        self.add_event('on_interact', SetBlockState({self.shape.id: "'double'"}))
+ self.add_event('on_interact', SetBlockProperty({self.shape.id: "'double'"}))
@@ -534,7 +534,7 @@

Source code for mcpackutils.block

 
         # STATES
         
-        self.shape = self.add_state(BlockState(self.identifier.copy_with_path('shape'), 'straight', 'inner_left', 'inner_right', 'outer_left', 'outer_right'))
+        self.shape = self.add_state(BlockProperty(self.identifier.copy_with_path('shape'), 'straight', 'inner_left', 'inner_right', 'outer_left', 'outer_right'))
 
         # PERMUTATIONS
         perm1 = BlockPermutation(Molang("q.block_state('minecraft:vertical_half')=='north'&&q.block_state('minecraft:vertical_half')=='bottom'"))
@@ -606,7 +606,7 @@ 

Source code for mcpackutils.block

         self.add_event('bone_meal_growth', Trigger('increase_age'))
         self.add_event('bone_meal_growth', RunCommand(["particle minecraft:crop_growth_emitter ~ ~ ~", "playsound item.bone_meal.use @p ~ ~ ~"]))
 
-        self.add_event('increase_age', IncrementBlockState(self.age.id))
+ self.add_event('increase_age', IncrementBlockProperty(self.age.id))
@@ -630,12 +630,12 @@

Source code for mcpackutils.block

         oi.add_event(0, Trigger('bone_meal_growth'))
         oi.set_condition(1, Molang(f"q.block_state('{ self.age.id }') >= 4 && q.block_state('{ self.age.id }') <= 6 && !q.is_item_name_any('slot.weapon.mainhand','minecraft:bone_meal')"))
         oi.add_event(1, SpawnLoot('loot_tables/morefood/on_interact/coffee_bush_age2.json'))
-        oi.add_event(1, SetBlockState({self.age.id: "'1'"}))
+        oi.add_event(1, SetBlockProperty({self.age.id: "'1'"}))
         oi.add_event(1, PlaySound('block.sweet_berry_bush.pick'))
         
         oi.set_condition(2, Molang(f"q.block_state('{ self.age.id }') == 7 && !q.is_item_name_any('slot.weapon.mainhand','minecraft:bone_meal')"))
         oi.add_event(2, SpawnLoot('loot_tables/morefood/on_interact/coffee_bush_age3.json'))
-        oi.add_event(2, SetBlockState({self.age.id: "'1'"}))
+        oi.add_event(2, SetBlockProperty({self.age.id: "'1'"}))
         oi.add_event(2, PlaySound('block.sweet_berry_bush.pick'))
 
         self.add_event('on_interact', oi)
@@ -679,7 +679,7 @@

Source code for mcpackutils.block

         increase_age.set_condition(0, Molang(f"q.block_state('{ self.stage }')==1"))
         increase_age.add_event(0, Trigger('generate'))
         increase_age.set_condition(1, Molang(f"q.block_state('{ self.stage }')==0"))
-        increase_age.add_event(1, SetBlockState({self.stage.id: "1"}))
+        increase_age.add_event(1, SetBlockProperty({self.stage.id: "1"}))
         self.add_event('increase_stage', increase_age)
 
         generate = Sequence()
@@ -741,7 +741,7 @@ 

Source code for mcpackutils.block

         ic.set_condition(1, Molang(f"q.block_state('{ self.bites.id }')==6"))
         ic.add_event(1, SetBlock('minecraft:air'))
         ic.set_condition(2, Molang(f"q.block_state('{ self.bites.id }')!=6"))
-        ic.add_event(2, IncrementBlockState(self.bites.id))
+        ic.add_event(2, IncrementBlockProperty(self.bites.id))
         self.add_event('increase_bites', ic)
 
         # Convert cake to candle_cake
@@ -820,14 +820,14 @@ 

Source code for mcpackutils.block

         # EVENTS
         oi = Sequence()
         oi.set_condition(0, Molang(f"q.block_state('{ self.lit.id }') == false && q.is_item_name_any('slot.weapon.mainhand','minecraft:flint_and_steel')"))
-        oi.add_event(0, SetBlockState({self.lit.id: 'true'}))
+        oi.add_event(0, SetBlockProperty({self.lit.id: 'true'}))
         oi.add_event(0, Damage('durability', 1, target=EventTarget.ITEM))
         oi.add_event(0, RunCommand('playsound fire.ignite @p ~ ~ ~ 1.0 1', EventTarget.BLOCK))
         oi.add_event(0, Trigger('flame'))
                 
         oi.set_condition(1, Molang(f"q.block_state('{ self.lit.id }') == false && q.is_item_name_any('slot.weapon.mainhand','minecraft:fire_charge')"))
         oi.add_event(1, DecrementStack())
-        oi.add_event(1, SetBlockState({self.lit.id: 'true'}))
+        oi.add_event(1, SetBlockProperty({self.lit.id: 'true'}))
         oi.add_event(1, RunCommand('playsound fire.ignite @p ~ ~ ~ 1.0 1'))
         oi.add_event(1, Trigger('flame'))
         
@@ -836,7 +836,7 @@ 

Source code for mcpackutils.block

         oi.add_event(2, RunCommand([f"setblock ~ ~ ~ {self.cake} [\"{ self.identifier.copy_with_path('bites') }\"=1]","playsound random.burp @p ~ ~ ~ 0.50","effect @s saturation 1 1 true"]))
         
         oi.set_condition(3, Molang(f"q.block_state('{ self.lit.id }') == true && !q.is_item_name_any('slot.weapon.mainhand','minecraft:flint_and_steel') && !q.is_item_name_any('slot.weapon.mainhand','minecraft:fire_charge')"))
-        oi.add_event(3, SetBlockState({self.lit.id: 'false'}))
+        oi.add_event(3, SetBlockProperty({self.lit.id: 'false'}))
         oi.add_event(3, RunCommand('playsound random.fizz @p ~ ~ ~ 0.50', EventTarget.BLOCK))
 
         self.add_event('on_interact', oi)
@@ -855,7 +855,7 @@ 

Source code for mcpackutils.block

         # STATES
 
         self.open = self.add_state(BooleanState(self.identifier.copy_with_path('open')))
-        self.half = self.add_state(BlockState(self.identifier.copy_with_path('half'), 'bottom', 'top'))
+        self.half = self.add_state(BlockProperty(self.identifier.copy_with_path('half'), 'bottom', 'top'))
 
         # COMPONENTS
 
@@ -890,7 +890,7 @@ 

Source code for mcpackutils.block

         self.add_event('on_update', u)
 
         self.add_event('on_interact', RunCommand('playsound use.stone @p', EventTarget.PLAYER))
-        self.add_event('on_interact', SetBlockState({self.open.id: f"!q.block_state('{self.open}')"}))
+        self.add_event('on_interact', SetBlockProperty({self.open.id: f"!q.block_state('{self.open}')"}))
         self.add_event('on_interact', Trigger('on_update'))
 
         self.add_event('on_placed', RunCommand(["execute unless block ~ ~1 ~ air run setblock ~ ~ ~ air destroy"]))
@@ -924,7 +924,7 @@ 

Source code for mcpackutils.block

 
         # EVENTS
         self.add_event('on_interact', RunCommand('playsound use.basalt @p', target=EventTarget.PLAYER))
-        self.add_event('on_interact', SwitchBlockState(self.open.id))
+ self.add_event('on_interact', SwitchBlockProperty(self.open.id))
@@ -968,7 +968,7 @@

Source code for mcpackutils.block

 
         # EVENTS
 
-        self.add_event('on_interact', SwitchBlockState(self.powered.id))
+ self.add_event('on_interact', SwitchBlockProperty(self.powered.id))
@@ -1002,9 +1002,9 @@

Source code for mcpackutils.block

 
         # EVENTS
 
-        self.add_event('on_step_on', SetBlockState({self.powered.id: "true", self.triggered.id: "true"}))
-        self.add_event('on_step_off', SetBlockState({self.triggered.id: "false"}))
-        self.add_event('unpower', SetBlockState({self.powered.id: "false"}))
+ self.add_event('on_step_on', SetBlockProperty({self.powered.id: "true", self.triggered.id: "true"})) + self.add_event('on_step_off', SetBlockProperty({self.triggered.id: "false"})) + self.add_event('unpower', SetBlockProperty({self.powered.id: "false"}))
@@ -1052,12 +1052,12 @@

Source code for mcpackutils.block

         oi.set_condition(0, cond1)
         oi.add_event(0, DecrementStack())
         oi.add_event(0, RunCommand(f'give @s {filled_bucket}', EventTarget.PLAYER))
-        oi.add_event(0, SetBlockState({self.level.id: "0"}))
+        oi.add_event(0, SetBlockProperty({self.level.id: "0"}))
 
         oi.set_condition(1, cond2)
         oi.add_event(1, DecrementStack())
         oi.add_event(1, RunCommand(f'give @s {filled_bottle}', EventTarget.PLAYER))
-        oi.add_event(1, DecrementBlockState(self.level.id))
+        oi.add_event(1, DecrementBlockProperty(self.level.id))
 
         self.add_event('on_interact', oi)
@@ -1101,10 +1101,10 @@

Source code for mcpackutils.block

         i = 0
         for s in self.states.values():
             ou.set_condition(i, Molang(f"q.block_state('{s}')==false&&q.block_neighbor_has_all_tags(0,1,0, '{Identifier('fence')}')"))
-            ou.add_event(i, SetBlockState({s: "true"}))
+            ou.add_event(i, SetBlockProperty({s: "true"}))
 
             ou.set_condition(i+1, Molang(f"q.block_state('{s}')==true&&!q.block_neighbor_has_all_tags(0,1,0, '{Identifier('fence')}')"))
-            ou.add_event(i+1, SetBlockState({s: "false"}))
+            ou.add_event(i+1, SetBlockProperty({s: "false"}))
             i+=2
 
         self.add_event('on_update', ou)
@@ -1156,7 +1156,7 @@

Source code for mcpackutils.block

 
         # EVENTS
 
-        self.add_event('on_interact', SwitchBlockState(self.open.id))
+ self.add_event('on_interact', SwitchBlockProperty(self.open.id))
@@ -1203,10 +1203,10 @@

Source code for mcpackutils.block

         i = 0
         for s in self.states.values():
             ou.set_condition(i, Molang(f"q.block_state('{s}')==false&&q.block_neighbor_has_all_tags(0,1,0, '{Identifier('glass_pane')}')"))
-            ou.add_event(i, SetBlockState({s: "true"}))
+            ou.add_event(i, SetBlockProperty({s: "true"}))
 
             ou.set_condition(i+1, Molang(f"q.block_state('{s}')==true&&!q.block_neighbor_has_all_tags(0,1,0, '{Identifier('glass_pane')}')"))
-            ou.add_event(i+1, SetBlockState({s: "false"}))
+            ou.add_event(i+1, SetBlockProperty({s: "false"}))
             i+=2
 
         self.add_event('on_update', ou)
@@ -1306,10 +1306,10 @@

Source code for mcpackutils.block

         i = 0
         for s in self.states.values():
             ou.set_condition(i, Molang(f"q.block_state('{s}')==false&&q.block_neighbor_has_all_tags(0,1,0, '{Identifier('wall')}')"))
-            ou.add_event(i, SetBlockState({s: "true"}))
+            ou.add_event(i, SetBlockProperty({s: "true"}))
 
             ou.set_condition(i+1, Molang(f"q.block_state('{s}')==true&&!q.block_neighbor_has_all_tags(0,1,0, '{Identifier('wall')}')"))
-            ou.add_event(i+1, SetBlockState({s: "false"}))
+            ou.add_event(i+1, SetBlockProperty({s: "false"}))
             i+=2
 
         self.add_event('on_update', ou)
diff --git a/docs/_build/html/_modules/mcpackutils/block/component.html b/docs/_build/html/_modules/mcpackutils/block/component.html index ea46ba7..0d1997b 100644 --- a/docs/_build/html/_modules/mcpackutils/block/component.html +++ b/docs/_build/html/_modules/mcpackutils/block/component.html @@ -284,7 +284,7 @@

Source code for mcpackutils.block.component

 [docs]
 @component
 class BoneVisabilityComponent(BlockComponent):
-    id = Identifier('bone_visability')
+    id = Identifier('bone_visibility')
     def __init__(self, bones:dict[str, str], **bone):
         """
         Tells whether the bone should be visible or not (value).
diff --git a/docs/_build/html/_modules/mcpackutils/block/state.html b/docs/_build/html/_modules/mcpackutils/block/state.html
index c08b129..2e32f99 100644
--- a/docs/_build/html/_modules/mcpackutils/block/state.html
+++ b/docs/_build/html/_modules/mcpackutils/block/state.html
@@ -78,11 +78,11 @@ 

Source code for mcpackutils.block.state

 
 from ..util import Identifier
 
-# __all__ = ['BlockState', 'STATES', 'state', 'BlockFaceState', 'VerticalHalfState', 'CardinalDirectionState', 'FacingDirectionState']
+# __all__ = ['BlockProperty', 'STATES', 'state', 'BlockFaceState', 'VerticalHalfState', 'CardinalDirectionState', 'FacingDirectionState']
 
-
-[docs] -class BlockState: +
+[docs] +class BlockProperty: def __init__(self, id:Identifier|str=None, *values:str): """ Base state class for blocks @@ -128,8 +128,8 @@

Source code for mcpackutils.block.state

         else:
             raise TypeError(f"Expected list but got '{value.__class__.__name__}' instead")
     
-
-[docs] +
+[docs] @classmethod def from_dict(cls, data:list) -> Self: self = cls.__new__(cls) @@ -145,7 +145,7 @@

Source code for mcpackutils.block.state

     Add this state to the parser
     """
     def wrapper():
-        if not issubclass(cls, BlockState): raise TypeError(f"Expected BlockState but got '{cls.__name__}' instead")
+        if not issubclass(cls, BlockProperty): raise TypeError(f"Expected BlockProperty but got '{cls.__name__}' instead")
         global STATES
         STATES[cls.id] = cls
         return cls
@@ -156,19 +156,19 @@ 

Source code for mcpackutils.block.state

 
 
[docs] -class BooleanState(BlockState): +class BooleanState(BlockProperty): def __init__(self, id:Identifier): """ True or False blockstate. default: True """ - BlockState.__init__(self, id, False, True)
+ BlockProperty.__init__(self, id, False, True)
[docs] -class IntegerState(BlockState): +class IntegerState(BlockProperty): def __init__(self, id:Identifier, stop:int, start:int=0): - BlockState.__init__(self, id, *range(start, stop+1))
+ BlockProperty.__init__(self, id, *range(start, stop+1))
# VANILLA @@ -176,35 +176,35 @@

Source code for mcpackutils.block.state

 
[docs] @state -class BlockFaceState(BlockState): +class BlockFaceState(BlockProperty): id = Identifier('block_face') def __init__(self): - BlockState.__init__(self, "down", "up", "north", "south", "east", "west")
+ BlockProperty.__init__(self, "down", "up", "north", "south", "east", "west")
[docs] @state -class VerticalHalfState(BlockState): +class VerticalHalfState(BlockProperty): id = Identifier('vertical_half') def __init__(self): - BlockState.__init__(self, "bottom", "up")
+ BlockProperty.__init__(self, "bottom", "up")
[docs] @state -class CardinalDirectionState(BlockState): +class CardinalDirectionState(BlockProperty): id = Identifier('cardinal_direction') def __init__(self): - BlockState.__init__(self, "north", "south", "east", "west")
+ BlockProperty.__init__(self, "north", "south", "east", "west")
@state -class FacingDirectionState(BlockState): +class FacingDirectionState(BlockProperty): id = Identifier('facing_direction') def __init__(self): - BlockState.__init__(self, "down", "up", "north", "south", "east", "west") + BlockProperty.__init__(self, "down", "up", "north", "south", "east", "west")
[docs] @@ -218,10 +218,10 @@

Source code for mcpackutils.block.state

 
[docs] @state -class AgeState(BlockState): +class AgeState(BlockProperty): id = Identifier('age') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
+ BlockProperty.__init__(self, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
@@ -254,55 +254,55 @@

Source code for mcpackutils.block.state

 
[docs] @state -class AttachmentState(BlockState): +class AttachmentState(BlockProperty): id = Identifier('attachment') def __init__(self): - BlockState.__init__(self, 'standing', 'hanging', 'side', 'multiple')
+ BlockProperty.__init__(self, 'standing', 'hanging', 'side', 'multiple')
[docs] @state -class BambooLeafSizeState(BlockState): +class BambooLeafSizeState(BlockProperty): id = Identifier('bamboo_leaf_size') def __init__(self): - BlockState.__init__(self, 'no_leaves', 'small_leaves', 'large_leaves')
+ BlockProperty.__init__(self, 'no_leaves', 'small_leaves', 'large_leaves')
[docs] @state -class BambooStalkThicknessState(BlockState): +class BambooStalkThicknessState(BlockProperty): id = Identifier('bamboo_stalk') def __init__(self): - BlockState.__init__(self, 'thin', 'thick')
+ BlockProperty.__init__(self, 'thin', 'thick')
[docs] @state -class BigDripleafTiltState(BlockState): +class BigDripleafTiltState(BlockProperty): id = Identifier('bigt_dripleaf_tilt') def __init__(self): - BlockState.__init__(self, 'none', 'unstable', 'partial_tilt','full_tilt')
+ BlockProperty.__init__(self, 'none', 'unstable', 'partial_tilt','full_tilt')
[docs] @state -class BiteCounterState(BlockState): +class BiteCounterState(BlockProperty): id = Identifier('bite_counter') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5,6)
+ BlockProperty.__init__(self, 0,1,2,3,4,5,6)
[docs] @state -class BooksStoredState(BlockState): +class BooksStoredState(BlockProperty): id = Identifier('books_stored') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5,6)
+ BlockProperty.__init__(self, 0,1,2,3,4,5,6)
@@ -335,10 +335,10 @@

Source code for mcpackutils.block.state

 
[docs] @state -class BrushedProgressState(BlockState): +class BrushedProgressState(BlockProperty): id = Identifier('brushed_progress') def __init__(self): - BlockState.__init__(self, 0,1,2,3)
+ BlockProperty.__init__(self, 0,1,2,3)
@@ -353,55 +353,55 @@

Source code for mcpackutils.block.state

 
[docs] @state -class CandlesState(BlockState): +class CandlesState(BlockProperty): id = Identifier('candles') def __init__(self): - BlockState.__init__(self, 0,1,2,3)
+ BlockProperty.__init__(self, 0,1,2,3)
[docs] @state -class CauldronLiquidState(BlockState): +class CauldronLiquidState(BlockProperty): id = Identifier('cauldron_liquid') def __init__(self): - BlockState.__init__(self, 'water', 'lava')
+ BlockProperty.__init__(self, 'water', 'lava')
[docs] @state -class ChemistryTableTypeState(BlockState): +class ChemistryTableTypeState(BlockProperty): id = Identifier('chemistry_table_type') def __init__(self): - BlockState.__init__(self, 'compound_creator', 'material_reducer', 'element_constructor', 'lab_table')
+ BlockProperty.__init__(self, 'compound_creator', 'material_reducer', 'element_constructor', 'lab_table')
[docs] @state -class ChiselTypeState(BlockState): +class ChiselTypeState(BlockProperty): id = Identifier('chisel_type') def __init__(self): - BlockState.__init__(self, 'default', 'chiseled', 'lines', 'smooth')
+ BlockProperty.__init__(self, 'default', 'chiseled', 'lines', 'smooth')
[docs] @state -class ClusterCountState(BlockState): +class ClusterCountState(BlockProperty): id = Identifier('cluster_count') def __init__(self): - BlockState.__init__(self, 0,1,2,3)
+ BlockProperty.__init__(self, 0,1,2,3)
[docs] @state -class ColorState(BlockState): +class ColorState(BlockProperty): id = Identifier('color') def __init__(self): - BlockState.__init__(self, 'white', 'orange', 'magenta', 'light_blue', 'yellow', 'lime', 'pink', 'gray', 'silver', 'cyan', 'purple', 'blue', 'brown', 'green', 'red', 'black')
+ BlockProperty.__init__(self, 'white', 'orange', 'magenta', 'light_blue', 'yellow', 'lime', 'pink', 'gray', 'silver', 'cyan', 'purple', 'blue', 'brown', 'green', 'red', 'black')
@@ -425,19 +425,19 @@

Source code for mcpackutils.block.state

 
[docs] @state -class CoralColorState(BlockState): +class CoralColorState(BlockProperty): id = Identifier('coral_color') def __init__(self): - BlockState.__init__(self, 'blue', 'pink', 'purple', 'red', 'yellow', 'blue', 'blue dead', 'pink dead', 'red dead', 'yelliow dead')
+ BlockProperty.__init__(self, 'blue', 'pink', 'purple', 'red', 'yellow', 'blue', 'blue dead', 'pink dead', 'red dead', 'yelliow dead')
[docs] @state -class CoralDirectionState(BlockState): +class CoralDirectionState(BlockProperty): id = Identifier('coral_direction') def __init__(self): - BlockState.__init__(self, 0,1,2,3)
+ BlockProperty.__init__(self, 0,1,2,3)
@@ -461,10 +461,10 @@

Source code for mcpackutils.block.state

 
[docs] @state -class CrackedState(BlockState): +class CrackedState(BlockProperty): id = Identifier('cracked_state') def __init__(self): - BlockState.__init__(self, 'no_cracks', 'cracked', 'max_cracked')
+ BlockProperty.__init__(self, 'no_cracks', 'cracked', 'max_cracked')
@@ -479,10 +479,10 @@

Source code for mcpackutils.block.state

 
[docs] @state -class DamageState(BlockState): +class DamageState(BlockProperty): id = Identifier('damage') def __init__(self): - BlockState.__init__(self, 'undamaged', 'slightly_damaged', 'very_damaged', 'broken')
+ BlockProperty.__init__(self, 'undamaged', 'slightly_damaged', 'very_damaged', 'broken')
@@ -497,19 +497,19 @@

Source code for mcpackutils.block.state

 
[docs] @state -class DirectionState(BlockState): +class DirectionState(BlockProperty): id = Identifier('direction') def __init__(self): - BlockState.__init__(self, 0,1,2,3)
+ BlockProperty.__init__(self, 0,1,2,3)
[docs] @state -class DirtTypeState(BlockState): +class DirtTypeState(BlockProperty): id = Identifier('dirt_type') def __init__(self): - BlockState.__init__(self, 'normal', 'coarse')
+ BlockProperty.__init__(self, 'normal', 'coarse')
@@ -533,10 +533,10 @@

Source code for mcpackutils.block.state

 
[docs] @state -class DoublePlantTypeState(BlockState): +class DoublePlantTypeState(BlockProperty): id = Identifier('double_plant_type') def __init__(self): - BlockState.__init__(self, 'sunflower', 'syringa', 'grass', 'fern', 'rose', 'paeonia')
+ BlockProperty.__init__(self, 'sunflower', 'syringa', 'grass', 'fern', 'rose', 'paeonia')
@@ -551,10 +551,10 @@

Source code for mcpackutils.block.state

 
[docs] @state -class DripstoneThicknessState(BlockState): +class DripstoneThicknessState(BlockProperty): id = Identifier('dripstone_thickness') def __init__(self): - BlockState.__init__(self, 'tip', 'frustum', 'base', 'middle', 'merge')
+ BlockProperty.__init__(self, 'tip', 'frustum', 'base', 'middle', 'merge')
@@ -578,46 +578,46 @@

Source code for mcpackutils.block.state

 
[docs] @state -class FacingDirectionState(BlockState): +class FacingDirectionState(BlockProperty): id = Identifier('facing_direction') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5)
+ BlockProperty.__init__(self, 0,1,2,3,4,5)
[docs] @state -class FillLevelState(BlockState): +class FillLevelState(BlockProperty): id = Identifier('fill_level') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5,6)
+ BlockProperty.__init__(self, 0,1,2,3,4,5,6)
[docs] @state -class FlowerTypeState(BlockState): +class FlowerTypeState(BlockProperty): id = Identifier('flower_type') def __init__(self): - BlockState.__init__(self, 'poppy', 'orchid', 'allium', 'houstonia', 'tulip_red', 'tulip_orange', 'tulip_white', 'tulip_pink', 'oxeye', 'cornflower', 'lily_of_the_valley')
+ BlockProperty.__init__(self, 'poppy', 'orchid', 'allium', 'houstonia', 'tulip_red', 'tulip_orange', 'tulip_white', 'tulip_pink', 'oxeye', 'cornflower', 'lily_of_the_valley')
[docs] @state -class GroundSignDirectionState(BlockState): +class GroundSignDirectionState(BlockProperty): id = Identifier('ground_sign_direction') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
+ BlockProperty.__init__(self, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
[docs] @state -class GrowthState(BlockState): +class GrowthState(BlockProperty): id = Identifier('growth') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5,6,7)
+ BlockProperty.__init__(self, 0,1,2,3,4,5,6,7)
@@ -641,19 +641,19 @@

Source code for mcpackutils.block.state

 
[docs] @state -class HeightState(BlockState): +class HeightState(BlockProperty): id = Identifier('height') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5,6,7)
+ BlockProperty.__init__(self, 0,1,2,3,4,5,6,7)
[docs] @state -class HugeMushroomBitsState(BlockState): +class HugeMushroomBitsState(BlockProperty): id = Identifier('huge_mushroom_bit') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
+ BlockProperty.__init__(self, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
@@ -695,46 +695,46 @@

Source code for mcpackutils.block.state

 
[docs] @state -class LiquidDepthState(BlockState): +class LiquidDepthState(BlockProperty): id = Identifier('liquid_depth') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
+ BlockProperty.__init__(self, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
[docs] @state -class MoisturizedAmountState(BlockState): +class MoisturizedAmountState(BlockProperty): id = Identifier('moisturized_amount') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5,6,7)
+ BlockProperty.__init__(self, 0,1,2,3,4,5,6,7)
[docs] @state -class MonsterEggStoneTypeState(BlockState): +class MonsterEggStoneTypeState(BlockProperty): id = Identifier('monster_egg_stone_type') def __init__(self): - BlockState.__init__(self, 'stone', 'cobblestone', 'stone_brick', 'mossy_stone_brick', 'cracked_stone_brick', 'chiseled_stone_brick')
+ BlockProperty.__init__(self, 'stone', 'cobblestone', 'stone_brick', 'mossy_stone_brick', 'cracked_stone_brick', 'chiseled_stone_brick')
[docs] @state -class NewLeafTypeState(BlockState): +class NewLeafTypeState(BlockProperty): id = Identifier('new_leaf_type') def __init__(self): - BlockState.__init__(self, 'acacia', 'dark_oak')
+ BlockProperty.__init__(self, 'acacia', 'dark_oak')
[docs] @state -class NewLogTypeState(BlockState): +class NewLogTypeState(BlockProperty): id = Identifier('new_log_type') def __init__(self): - BlockState.__init__(self, 'acacia', 'dark_oak')
+ BlockProperty.__init__(self, 'acacia', 'dark_oak')
@@ -758,19 +758,19 @@

Source code for mcpackutils.block.state

 
[docs] @state -class OldLeafTypeState(BlockState): +class OldLeafTypeState(BlockProperty): id = Identifier('old_leaf_type') def __init__(self): - BlockState.__init__(self, 'oak', 'spruce', 'birch', 'jungle')
+ BlockProperty.__init__(self, 'oak', 'spruce', 'birch', 'jungle')
[docs] @state -class OldLogTypeState(BlockState): +class OldLogTypeState(BlockProperty): id = Identifier('old_log_type') def __init__(self): - BlockState.__init__(self, 'oak', 'spruce', 'birch', 'jungle')
+ BlockProperty.__init__(self, 'oak', 'spruce', 'birch', 'jungle')
@@ -821,10 +821,10 @@

Source code for mcpackutils.block.state

 
[docs] @state -class PortalAxisState(BlockState): +class PortalAxisState(BlockProperty): id = Identifier('portal_axis') def __init__(self): - BlockState.__init__(self, 'unknown', 'x', 'z')
+ BlockProperty.__init__(self, 'unknown', 'x', 'z')
@@ -848,91 +848,91 @@

Source code for mcpackutils.block.state

 
[docs] @state -class RailDirectionState(BlockState): +class RailDirectionState(BlockProperty): id = Identifier('rail_direction') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5,6,7,8)
+ BlockProperty.__init__(self, 0,1,2,3,4,5,6,7,8)
[docs] @state -class RedstoneSignalState(BlockState): +class RedstoneSignalState(BlockProperty): id = Identifier('redstone_signal') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5,6,7,8,9, 10,11,12,13,14,15)
+ BlockProperty.__init__(self, 0,1,2,3,4,5,6,7,8,9, 10,11,12,13,14,15)
[docs] @state -class RepeaterDelayState(BlockState): +class RepeaterDelayState(BlockProperty): id = Identifier('repeater_delay') def __init__(self): - BlockState.__init__(self, 0,1,2,3)
+ BlockProperty.__init__(self, 0,1,2,3)
[docs] @state -class SandStoneTypeState(BlockState): +class SandStoneTypeState(BlockProperty): id = Identifier('sand_stone_type') def __init__(self): - BlockState.__init__(self, 'default', 'heiroglyphs', 'cut', 'smooth')
+ BlockProperty.__init__(self, 'default', 'heiroglyphs', 'cut', 'smooth')
[docs] @state -class SandTypeState(BlockState): +class SandTypeState(BlockProperty): id = Identifier('sand_type') def __init__(self): - BlockState.__init__(self, 'normal', 'type')
+ BlockProperty.__init__(self, 'normal', 'type')
[docs] @state -class SaplingTypeState(BlockState): +class SaplingTypeState(BlockProperty): id = Identifier('sapling_type') def __init__(self): - BlockState.__init__(self, 'evergreen', 'birch', 'jungle', 'acacia', 'roofed_oak')
+ BlockProperty.__init__(self, 'evergreen', 'birch', 'jungle', 'acacia', 'roofed_oak')
[docs] @state -class SculkSensorPhaseState(BlockState): +class SculkSensorPhaseState(BlockProperty): id = Identifier('sculk_sensor_phase') def __init__(self): - BlockState.__init__(self, 'inactive', 'active', 'cooldown')
+ BlockProperty.__init__(self, 'inactive', 'active', 'cooldown')
[docs] @state -class SeaGrassTypeState(BlockState): +class SeaGrassTypeState(BlockProperty): id = Identifier('sea_grass_type') def __init__(self): - BlockState.__init__(self, 'default', 'double_top', 'double_bot')
+ BlockProperty.__init__(self, 'default', 'double_top', 'double_bot')
[docs] @state -class SpongeTypeState(BlockState): +class SpongeTypeState(BlockProperty): id = Identifier('sponge_type') def __init__(self): - BlockState.__init__(self, 'dry', 'wet')
+ BlockProperty.__init__(self, 'dry', 'wet')
[docs] @state -class StabilityState(BlockState): +class StabilityState(BlockProperty): id = Identifier('stability') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5)
+ BlockProperty.__init__(self, 0,1,2,3,4,5)
@@ -947,55 +947,55 @@

Source code for mcpackutils.block.state

 
[docs] @state -class StoneBrickTypeState(BlockState): +class StoneBrickTypeState(BlockProperty): id = Identifier('stone_brick_type') def __init__(self): - BlockState.__init__(self, 'default', 'mossy', 'cracked', 'chiseled', 'smooth')
+ BlockProperty.__init__(self, 'default', 'mossy', 'cracked', 'chiseled', 'smooth')
[docs] @state -class StoneSlabTypeState(BlockState): +class StoneSlabTypeState(BlockProperty): id = Identifier('stone_slab_type') def __init__(self): - BlockState.__init__(self, 'smooth_stone', 'sandstone', 'wood', 'cobblestone', 'brick', 'stone_brick', 'quartz', 'nether_brick')
+ BlockProperty.__init__(self, 'smooth_stone', 'sandstone', 'wood', 'cobblestone', 'brick', 'stone_brick', 'quartz', 'nether_brick')
[docs] @state -class StoneSlabType2State(BlockState): +class StoneSlabType2State(BlockProperty): id = Identifier('stone_slab_type2') def __init__(self): - BlockState.__init__(self, 'red_sandstone', 'purpur', 'prismarine_rough', 'prismarine_dark', 'prismarine_brick', 'mossy_cobblestone', 'smooth_sandstone', 'red_nether_brick')
+ BlockProperty.__init__(self, 'red_sandstone', 'purpur', 'prismarine_rough', 'prismarine_dark', 'prismarine_brick', 'mossy_cobblestone', 'smooth_sandstone', 'red_nether_brick')
[docs] @state -class StoneSlabType3State(BlockState): +class StoneSlabType3State(BlockProperty): id = Identifier('stone_slab_type3') def __init__(self): - BlockState.__init__(self, 'end_stone_brick', 'smooth_red_sandstone', 'polishe_andesite', 'andesite', 'diorite', 'polished_diorite', 'granite', 'polished_granite')
+ BlockProperty.__init__(self, 'end_stone_brick', 'smooth_red_sandstone', 'polishe_andesite', 'andesite', 'diorite', 'polished_diorite', 'granite', 'polished_granite')
[docs] @state -class StoneSlabType4State(BlockState): +class StoneSlabType4State(BlockProperty): id = Identifier('stone_slab_type_4') def __init__(self): - BlockState.__init__(self, 'mossy_stone_brick', 'smooth_quartz', 'stone', 'cut_sandstone', 'cut_red_sandstone')
+ BlockProperty.__init__(self, 'mossy_stone_brick', 'smooth_quartz', 'stone', 'cut_sandstone', 'cut_red_sandstone')
[docs] @state -class StoneTypeState(BlockState): +class StoneTypeState(BlockProperty): id = Identifier('stone_type') def __init__(self): - BlockState.__init__(self, 'stone', 'granite', 'granite_smooth', 'diorite', 'diorite_smooth', 'andesite', 'andesite_smooth')
+ BlockProperty.__init__(self, 'stone', 'granite', 'granite_smooth', 'diorite', 'diorite_smooth', 'andesite', 'andesite_smooth')
@@ -1010,19 +1010,19 @@

Source code for mcpackutils.block.state

 
[docs] @state -class StructureBlockTypeState(BlockState): +class StructureBlockTypeState(BlockProperty): id = Identifier('structure_block_type') def __init__(self): - BlockState.__init__(self,'data', 'save', 'load', 'corner', 'invalid', 'export' )
+ BlockProperty.__init__(self,'data', 'save', 'load', 'corner', 'invalid', 'export' )
[docs] @state -class StructureVoidTypeState(BlockState): +class StructureVoidTypeState(BlockProperty): id = Identifier('structure_void_type') def __init__(self): - BlockState.__init__(self, 'void', 'air')
+ BlockProperty.__init__(self, 'void', 'air')
@@ -1037,10 +1037,10 @@

Source code for mcpackutils.block.state

 
[docs] @state -class TallGrassTypeState(BlockState): +class TallGrassTypeState(BlockProperty): id = Identifier('tall_grass_type') def __init__(self): - BlockState.__init__(self, 'default', 'tall', 'fern', 'snow')
+ BlockProperty.__init__(self, 'default', 'tall', 'fern', 'snow')
@@ -1064,10 +1064,10 @@

Source code for mcpackutils.block.state

 
[docs] @state -class TorchFacingDirectionState(BlockState): +class TorchFacingDirectionState(BlockProperty): id = Identifier('torch_facing_direction') def __init__(self): - BlockState.__init__(self, 'unknown', 'west', 'east', 'north', 'south', 'top')
+ BlockProperty.__init__(self, 'unknown', 'west', 'east', 'north', 'south', 'top')
@@ -1082,10 +1082,10 @@

Source code for mcpackutils.block.state

 
[docs] @state -class TurtleEggCountState(BlockState): +class TurtleEggCountState(BlockProperty): id = Identifier('turtle_egg_count') def __init__(self): - BlockState.__init__(self, 'one_egg', 'two_egg', 'three_egg', 'four_egg')
+ BlockProperty.__init__(self, 'one_egg', 'two_egg', 'three_egg', 'four_egg')
@@ -1118,55 +1118,55 @@

Source code for mcpackutils.block.state

 
[docs] @state -class VineDirectionBitsState(BlockState): +class VineDirectionBitsState(BlockProperty): id = Identifier('vine_direction_bits') def __init__(self): - BlockState.__init__(self, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
+ BlockProperty.__init__(self, 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)
[docs] @state -class WallBlockTypeState(BlockState): +class WallBlockTypeState(BlockProperty): id = Identifier('wall_block_type') def __init__(self): - BlockState.__init__(self, 'cobblestone', 'mossy_cobblestone', 'granite', 'diorite', 'andesite', 'sandstone', 'brick', 'stone_brick', 'mossy_stone_brick', 'nether_brick', 'end_brick', 'prismarine', 'red_sandstone', 'red_nether_brick')
+ BlockProperty.__init__(self, 'cobblestone', 'mossy_cobblestone', 'granite', 'diorite', 'andesite', 'sandstone', 'brick', 'stone_brick', 'mossy_stone_brick', 'nether_brick', 'end_brick', 'prismarine', 'red_sandstone', 'red_nether_brick')
[docs] @state -class WallConnectionTypEastState(BlockState): +class WallConnectionTypEastState(BlockProperty): id = Identifier('wall_connection_type_east') def __init__(self): - BlockState.__init__(self, 'none', 'short', 'tall')
+ BlockProperty.__init__(self, 'none', 'short', 'tall')
[docs] @state -class WallConnectionTypeNorthState(BlockState): +class WallConnectionTypeNorthState(BlockProperty): id = Identifier('wall_connection_type_north') def __init__(self): - BlockState.__init__(self, 'none', 'short', 'tall')
+ BlockProperty.__init__(self, 'none', 'short', 'tall')
[docs] @state -class WallConnectionTypeSouthState(BlockState): +class WallConnectionTypeSouthState(BlockProperty): id = Identifier('wall_connection_type_south') def __init__(self): - BlockState.__init__(self, 'none', 'short', 'tall')
+ BlockProperty.__init__(self, 'none', 'short', 'tall')
[docs] @state -class WallConnectionTypeWestState(BlockState): +class WallConnectionTypeWestState(BlockProperty): id = Identifier('wall_connection_type_west') def __init__(self): - BlockState.__init__(self, 'none', 'short', 'tall')
+ BlockProperty.__init__(self, 'none', 'short', 'tall')
@@ -1181,19 +1181,19 @@

Source code for mcpackutils.block.state

 
[docs] @state -class WeirdoDirectionState(BlockState): +class WeirdoDirectionState(BlockProperty): id = Identifier('weirdo_direction') def __init__(self): - BlockState.__init__(self, 0,1,2,3)
+ BlockProperty.__init__(self, 0,1,2,3)
[docs] @state -class WoodTypeState(BlockState): +class WoodTypeState(BlockProperty): id = Identifier('wood_type') def __init__(self): - BlockState.__init__(self, 'oak', 'spruce', 'birch', 'jungle', 'acacia', 'dark_oak')
+ BlockProperty.__init__(self, 'oak', 'spruce', 'birch', 'jungle', 'acacia', 'dark_oak')
diff --git a/docs/_build/html/_modules/mcpackutils/block/trait.html b/docs/_build/html/_modules/mcpackutils/block/trait.html index bbeaf92..bdf0fc3 100644 --- a/docs/_build/html/_modules/mcpackutils/block/trait.html +++ b/docs/_build/html/_modules/mcpackutils/block/trait.html @@ -76,7 +76,7 @@

Source code for mcpackutils.block.trait

 from typing import Self
 
-from .state import BlockState, CardinalDirectionState, FacingDirectionState, BlockFaceState, VerticalHalfState
+from .state import BlockProperty, CardinalDirectionState, FacingDirectionState, BlockFaceState, VerticalHalfState
 from ..util import Identifier
 
 __all__ = ['BlockTrait', 'TRAITS', 'trait', 'PlacementDirectionTrait', 'PlacementPositionTrait']
@@ -84,7 +84,7 @@ 

Source code for mcpackutils.block.trait

 
[docs] class BlockTrait: - def __init__(self, enabled_states:list[BlockState]): + def __init__(self, enabled_states:list[BlockProperty]): """ Base trait class for blocks """ @@ -106,17 +106,17 @@

Source code for mcpackutils.block.trait

         setattr(self, '_id', Identifier(value))
 
     @property
-    def enabled_states(self) -> list[BlockState]:
+    def enabled_states(self) -> list[BlockProperty]:
         return getattr(self, '_enabled_states', [])
     
     @enabled_states.setter
-    def enabled_states(self, value:list[BlockState]):
+    def enabled_states(self, value:list[BlockProperty]):
         if value is None: self.enabled_states = []
         elif isinstance(value, list):
             v = []
             for x in value:
-                if not issubclass(x, BlockState):
-                    raise TypeError(f"Expected BlockState but got '{x.__class__.__name__}' instead")
+                if not issubclass(x, BlockProperty):
+                    raise TypeError(f"Expected BlockProperty but got '{x.__class__.__name__}' instead")
                 v.append(x)
             setattr(self, '_enabled_states', v)
         else:
@@ -152,12 +152,12 @@ 

Source code for mcpackutils.block.trait

 @trait
 class PlacementDirectionTrait(BlockTrait):
     id = Identifier('placement_direction')
-    def __init__(self, enabled_states:list[BlockState]=[], y_rotation_offset:float=0.0):
+    def __init__(self, enabled_states:list[BlockProperty]=[], y_rotation_offset:float=0.0):
         """
         Adds the CardinalDirectionState and/or FacingDirectionState states and setter function to the block. The values of these states are set when the block is placed.
 
         :param enabled_states: Which states to enable. Must specify at least one, defaults to []
-        :type enabled_states: list[BlockState], optional
+        :type enabled_states: list[BlockProperty], optional
         :param y_rotation_offset: The y rotation offset to apply to the block. Must be [0.0, 90.0, 180.0, 270.0]. Default is 0, meaning if the player is facing north, the CardinalDirectionState and/or FacingDirectionState state will be north, defaults to 0.0
         :type y_rotation_offset: float, optional
         """
@@ -242,12 +242,12 @@ 

Source code for mcpackutils.block.trait

 @trait
 class PlacementPositionTrait(BlockTrait):
     id = Identifier('placement_position')
-    def __init__(self, enabled_states:list[BlockState]=[]):
+    def __init__(self, enabled_states:list[BlockProperty]=[]):
         """
-        Adds the BlockFaceState and/or VerticalHalfState BlockStates. The value of these state(s) are set when the block is placed.
+        Adds the BlockFaceState and/or VerticalHalfState BlockPropertys. The value of these state(s) are set when the block is placed.
 
         :param enabled_states: Which states to enable. Must specify at least one, defaults to []
-        :type enabled_states: list[BlockState], optional
+        :type enabled_states: list[BlockProperty], optional
         """
         for state in enabled_states:
             if not issubclass(state, (BlockFaceState, VerticalHalfState)): raise TypeError(f"Expected BlockFaceState or VerticalHalfState but got '{state.__class__.__name__}' instead")
diff --git a/docs/_build/html/_modules/mcpackutils/event.html b/docs/_build/html/_modules/mcpackutils/event.html
index 163aa32..70d76a2 100644
--- a/docs/_build/html/_modules/mcpackutils/event.html
+++ b/docs/_build/html/_modules/mcpackutils/event.html
@@ -687,10 +687,10 @@ 

Source code for mcpackutils.event

         setattr(self, '_transform', value)
-
-[docs] +
+[docs] @event('set_block_state') -class SetBlockState(Event): +class SetBlockProperty(Event): def __init__(self, states:dict[str, str]={}, **state:str): """ Sets a block state on this block @@ -876,9 +876,9 @@

Source code for mcpackutils.event

 
 # CUSTOM
 
-
-[docs] -class IncrementBlockState(SetBlockState): +
+[docs] +class IncrementBlockProperty(SetBlockProperty): def __init__(self, name:Identifier, amount:int=1): """ Increase a block state on this block @@ -889,12 +889,12 @@

Source code for mcpackutils.event

         :type amount: int, optional
         """
         id = Identifier(name)
-        SetBlockState.__init__(self, {id: f"q.block_state('{id}')+{amount}"})
+ SetBlockProperty.__init__(self, {id: f"q.block_state('{id}')+{amount}"})
-
-[docs] -class DecrementBlockState(SetBlockState): +
+[docs] +class DecrementBlockProperty(SetBlockProperty): def __init__(self, name:Identifier, amount:int=1): """ Decrease a block state on this block @@ -905,12 +905,12 @@

Source code for mcpackutils.event

         :type amount: int, optional
         """
         id = Identifier(name)
-        SetBlockState.__init__(self, {id: f"q.block_state('{id}')-{amount}"})
+ SetBlockProperty.__init__(self, {id: f"q.block_state('{id}')-{amount}"})
-
-[docs] -class SwitchBlockState(SetBlockState): +
+[docs] +class SwitchBlockProperty(SetBlockProperty): def __init__(self, name:Identifier): """ Switch a boolean block state on this block. (true = false, false = true) @@ -919,7 +919,7 @@

Source code for mcpackutils.event

         :type name: Identifier
         """
         id = Identifier(name)
-        SetBlockState.__init__(self, {id: f"!q.block_state('{id}')"})
+ SetBlockProperty.__init__(self, {id: f"!q.block_state('{id}')"})
diff --git a/docs/_build/html/_modules/mcpackutils/util.html b/docs/_build/html/_modules/mcpackutils/util.html index 0d0747c..7b5df06 100644 --- a/docs/_build/html/_modules/mcpackutils/util.html +++ b/docs/_build/html/_modules/mcpackutils/util.html @@ -181,8 +181,8 @@

Source code for mcpackutils.util

         return res is not None
-
-[docs] +
+[docs] @classmethod def parse(cls, value:str) -> Self: """ diff --git a/docs/_build/html/genindex.html b/docs/_build/html/genindex.html index d14b027..a3c5f1b 100644 --- a/docs/_build/html/genindex.html +++ b/docs/_build/html/genindex.html @@ -376,7 +376,7 @@

B

  • block_offset (mcaddon.event.SetBlockAtPos property)
  • -
  • block_state (mcaddon.loot.RandomBlockStateLootFunction property) +
  • block_state (mcaddon.loot.RandomBlockPropertyLootFunction property)
  • BLOCK_STATE (mcaddon.registry.Registries attribute)
  • @@ -420,7 +420,7 @@

    B

  • BlockSettings (class in mcaddon.block)
  • -
  • BlockState (class in mcaddon.state) +
  • BlockProperty (class in mcaddon.state)
  • BlockTagsComponent (class in mcaddon.block)
  • @@ -428,7 +428,7 @@

    B

  • blue (mcaddon.constant.Color attribute)
  • -
  • bone_visability (mcaddon.block.GeometryComponent property) +
  • bone_visibility (mcaddon.block.GeometryComponent property)
  • bones (mcaddon.block.BoneVisabilityComponent property)
  • @@ -828,7 +828,7 @@

    D

  • DeadBitState (class in mcaddon.state)
  • -
  • DecrementBlockState (class in mcaddon.event) +
  • DecrementBlockProperty (class in mcaddon.event)
  • DecrementStack (class in mcaddon.event)
  • @@ -1249,7 +1249,7 @@

    F

  • (mcaddon.event.SetBlockAtPos class method)
  • -
  • (mcaddon.event.SetBlockState class method) +
  • (mcaddon.event.SetBlockProperty class method)
  • (mcaddon.event.SpawnLoot class method)
  • @@ -1373,7 +1373,7 @@

    F

  • (mcaddon.loot.RandomAuxValueLootFunction class method)
  • -
  • (mcaddon.loot.RandomBlockStateLootFunction class method) +
  • (mcaddon.loot.RandomBlockPropertyLootFunction class method)
  • (mcaddon.loot.RandomChanceLootCondition class method)
  • @@ -1437,7 +1437,7 @@

    F

  • (mcaddon.recipe.SmithingTrimRecipe class method)
  • -
  • (mcaddon.state.BlockState class method) +
  • (mcaddon.state.BlockProperty class method)
  • (mcaddon.util.Box class method)
  • @@ -1777,7 +1777,7 @@

    I

  • (mcaddon.event.SetBlockAtPos attribute)
  • -
  • (mcaddon.event.SetBlockState attribute) +
  • (mcaddon.event.SetBlockProperty attribute)
  • (mcaddon.event.SpawnLoot attribute)
  • @@ -1903,7 +1903,7 @@

    I

  • (mcaddon.loot.RandomAuxValueLootFunction attribute)
  • -
  • (mcaddon.loot.RandomBlockStateLootFunction attribute) +
  • (mcaddon.loot.RandomBlockPropertyLootFunction attribute)
  • (mcaddon.loot.RandomChanceLootCondition attribute)
  • @@ -1983,7 +1983,7 @@

    I

  • (mcaddon.state.BlockFaceState attribute)
  • -
  • (mcaddon.state.BlockState property) +
  • (mcaddon.state.BlockProperty property)
  • (mcaddon.state.BooksStoredState attribute)
  • @@ -2228,7 +2228,7 @@

    I

  • Importable (class in mcaddon.file)
  • -
  • IncrementBlockState (class in mcaddon.event) +
  • IncrementBlockProperty (class in mcaddon.event)
  • InfiniburnBitState (class in mcaddon.state)
  • @@ -3041,10 +3041,10 @@

    P

  • parent (mcaddon.constant.EventTarget attribute)
  • -
  • parse() (mcaddon.util.Identifier class method) +
  • parse() (mcaddon.util.Identifier class method)
  • patch (mcaddon.util.Version property) @@ -3149,7 +3149,7 @@

    R

  • RandomAuxValueLootFunction (class in mcaddon.loot)
  • -
  • RandomBlockStateLootFunction (class in mcaddon.loot) +
  • RandomBlockPropertyLootFunction (class in mcaddon.loot)
  • RandomChanceLootCondition (class in mcaddon.loot)
  • @@ -3481,7 +3481,7 @@

    S

  • SetBlockAtPos (class in mcaddon.event)
  • -
  • SetBlockState (class in mcaddon.event) +
  • SetBlockProperty (class in mcaddon.event)
  • SetBookContentsLootFunction (class in mcaddon.loot)
  • @@ -3612,7 +3612,7 @@

    S

  • StoneBrickTypeState (class in mcaddon.state) @@ -3655,7 +3655,7 @@

    S

  • Swing (class in mcaddon.event)
  • -
  • SwitchBlockState (class in mcaddon.event) +
  • SwitchBlockProperty (class in mcaddon.event)
  • SyntaxError
  • @@ -3858,9 +3858,9 @@

    V

  • values (mcaddon.loot.RandomAuxValueLootFunction property)
  • values() (mcaddon.registry.RegistryKey method) diff --git a/docs/_build/html/mcaddon.html b/docs/_build/html/mcaddon.html index 01ce18f..75b21c0 100644 --- a/docs/_build/html/mcaddon.html +++ b/docs/_build/html/mcaddon.html @@ -129,11 +129,11 @@
  • mcaddon.event module
  • -
  • BlockState
      -
    • BlockState.from_dict()
    • -
    • BlockState.id
    • -
    • BlockState.values
    • +
    • BlockProperty
    • BooksStoredState
        @@ -967,7 +967,7 @@

        Submodules
        -id = 'minecraft:bone_visability'
        +id = 'minecraft:bone_visibility'
        @@ -1506,7 +1506,7 @@

        Submodules
        class mcpackutils.block.state.AgeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:age'
        @@ -1539,7 +1539,7 @@

        Submodules
        class mcpackutils.block.state.AttachmentState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:attachment'
        @@ -1550,7 +1550,7 @@

        Submodules
        class mcpackutils.block.state.BambooLeafSizeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:bamboo_leaf_size'
        @@ -1561,7 +1561,7 @@

        Submodules
        class mcpackutils.block.state.BambooStalkThicknessState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:bamboo_stalk'
        @@ -1572,7 +1572,7 @@

        Submodules
        class mcpackutils.block.state.BigDripleafTiltState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:bigt_dripleaf_tilt'
        @@ -1583,7 +1583,7 @@

        Submodules
        class mcpackutils.block.state.BiteCounterState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:bite_counter'
        @@ -1594,7 +1594,7 @@

        Submodules
        class mcpackutils.block.state.BlockFaceState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:block_face'
        @@ -1603,22 +1603,22 @@

        Submodules -
        -class mcpackutils.block.state.BlockState(id: Identifier | str = None, *values: str)
        +
        +class mcpackutils.block.state.BlockProperty(id: Identifier | str = None, *values: str)

        Bases: object

        -
        -classmethod from_dict(data: list) Self
        +
        +classmethod from_dict(data: list) Self
        -
        -property id: Identifier
        +
        +property id: Identifier
        -
        -property values: list
        +
        +property values: list

        @@ -1626,7 +1626,7 @@

        Submodules
        class mcpackutils.block.state.BooksStoredState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:books_stored'
        @@ -1637,7 +1637,7 @@

        Submodules
        class mcpackutils.block.state.BooleanState(id: Identifier)
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        @@ -1676,7 +1676,7 @@

        Submodules
        class mcpackutils.block.state.BrushedProgressState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:brushed_progress'
        @@ -1698,7 +1698,7 @@

        Submodules
        class mcpackutils.block.state.CandlesState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:candles'
        @@ -1709,7 +1709,7 @@

        Submodules
        class mcpackutils.block.state.CardinalDirectionState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:cardinal_direction'
        @@ -1720,7 +1720,7 @@

        Submodules
        class mcpackutils.block.state.CauldronLiquidState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:cauldron_liquid'
        @@ -1731,7 +1731,7 @@

        Submodules
        class mcpackutils.block.state.ChemistryTableTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:chemistry_table_type'
        @@ -1742,7 +1742,7 @@

        Submodules
        class mcpackutils.block.state.ChiselTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:chisel_type'
        @@ -1753,7 +1753,7 @@

        Submodules
        class mcpackutils.block.state.ClusterCountState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:cluster_count'
        @@ -1775,7 +1775,7 @@

        Submodules
        class mcpackutils.block.state.ColorState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:color'
        @@ -1797,7 +1797,7 @@

        Submodules
        class mcpackutils.block.state.CoralColorState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:coral_color'
        @@ -1808,7 +1808,7 @@

        Submodules
        class mcpackutils.block.state.CoralDirectionState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:coral_direction'
        @@ -1841,7 +1841,7 @@

        Submodules
        class mcpackutils.block.state.CrackedState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:cracked_state'
        @@ -1863,7 +1863,7 @@

        Submodules
        class mcpackutils.block.state.DamageState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:damage'
        @@ -1885,7 +1885,7 @@

        Submodules
        class mcpackutils.block.state.DirectionState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:direction'
        @@ -1896,7 +1896,7 @@

        Submodules
        class mcpackutils.block.state.DirtTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:dirt_type'
        @@ -1929,7 +1929,7 @@

        Submodules
        class mcpackutils.block.state.DoublePlantTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:double_plant_type'
        @@ -1951,7 +1951,7 @@

        Submodules
        class mcpackutils.block.state.DripstoneThicknessState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:dripstone_thickness'
        @@ -1984,7 +1984,7 @@

        Submodules
        class mcpackutils.block.state.FacingDirectionState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:facing_direction'
        @@ -1995,7 +1995,7 @@

        Submodules
        class mcpackutils.block.state.FillLevelState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:fill_level'
        @@ -2006,7 +2006,7 @@

        Submodules
        class mcpackutils.block.state.FlowerTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:flower_type'
        @@ -2017,7 +2017,7 @@

        Submodules
        class mcpackutils.block.state.GroundSignDirectionState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:ground_sign_direction'
        @@ -2028,7 +2028,7 @@

        Submodules
        class mcpackutils.block.state.GrowthState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:growth'
        @@ -2061,7 +2061,7 @@

        Submodules
        class mcpackutils.block.state.HeightState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:height'
        @@ -2072,7 +2072,7 @@

        Submodules
        class mcpackutils.block.state.HugeMushroomBitsState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:huge_mushroom_bit'
        @@ -2105,7 +2105,7 @@

        Submodules
        class mcpackutils.block.state.IntegerState(id: Identifier, stop: int, start: int = 0)
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        @@ -2133,7 +2133,7 @@

        Submodules
        class mcpackutils.block.state.LiquidDepthState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:liquid_depth'
        @@ -2144,7 +2144,7 @@

        Submodules
        class mcpackutils.block.state.MoisturizedAmountState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:moisturized_amount'
        @@ -2155,7 +2155,7 @@

        Submodules
        class mcpackutils.block.state.MonsterEggStoneTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:monster_egg_stone_type'
        @@ -2166,7 +2166,7 @@

        Submodules
        class mcpackutils.block.state.NewLeafTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:new_leaf_type'
        @@ -2177,7 +2177,7 @@

        Submodules
        class mcpackutils.block.state.NewLogTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:new_log_type'
        @@ -2210,7 +2210,7 @@

        Submodules
        class mcpackutils.block.state.OldLeafTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:old_leaf_type'
        @@ -2221,7 +2221,7 @@

        Submodules
        class mcpackutils.block.state.OldLogTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:old_log_type'
        @@ -2287,7 +2287,7 @@

        Submodules
        class mcpackutils.block.state.PortalAxisState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:portal_axis'
        @@ -2320,7 +2320,7 @@

        Submodules
        class mcpackutils.block.state.RailDirectionState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:rail_direction'
        @@ -2331,7 +2331,7 @@

        Submodules
        class mcpackutils.block.state.RedstoneSignalState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:redstone_signal'
        @@ -2342,7 +2342,7 @@

        Submodules
        class mcpackutils.block.state.RepeaterDelayState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:repeater_delay'
        @@ -2353,7 +2353,7 @@

        Submodules
        class mcpackutils.block.state.SandStoneTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:sand_stone_type'
        @@ -2364,7 +2364,7 @@

        Submodules
        class mcpackutils.block.state.SandTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:sand_type'
        @@ -2375,7 +2375,7 @@

        Submodules
        class mcpackutils.block.state.SaplingTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:sapling_type'
        @@ -2386,7 +2386,7 @@

        Submodules
        class mcpackutils.block.state.SculkSensorPhaseState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:sculk_sensor_phase'
        @@ -2397,7 +2397,7 @@

        Submodules
        class mcpackutils.block.state.SeaGrassTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:sea_grass_type'
        @@ -2408,7 +2408,7 @@

        Submodules
        class mcpackutils.block.state.SpongeTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:sponge_type'
        @@ -2430,7 +2430,7 @@

        Submodules
        class mcpackutils.block.state.StabilityState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:stability'
        @@ -2441,7 +2441,7 @@

        Submodules
        class mcpackutils.block.state.StoneBrickTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:stone_brick_type'
        @@ -2452,7 +2452,7 @@

        Submodules
        class mcpackutils.block.state.StoneSlabType2State
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:stone_slab_type2'
        @@ -2463,7 +2463,7 @@

        Submodules
        class mcpackutils.block.state.StoneSlabType3State
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:stone_slab_type3'
        @@ -2474,7 +2474,7 @@

        Submodules
        class mcpackutils.block.state.StoneSlabType4State
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:stone_slab_type_4'
        @@ -2485,7 +2485,7 @@

        Submodules
        class mcpackutils.block.state.StoneSlabTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:stone_slab_type'
        @@ -2496,7 +2496,7 @@

        Submodules
        class mcpackutils.block.state.StoneTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:stone_type'
        @@ -2518,7 +2518,7 @@

        Submodules
        class mcpackutils.block.state.StructureBlockTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:structure_block_type'
        @@ -2529,7 +2529,7 @@

        Submodules
        class mcpackutils.block.state.StructureVoidTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:structure_void_type'
        @@ -2551,7 +2551,7 @@

        Submodules
        class mcpackutils.block.state.TallGrassTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:tall_grass_type'
        @@ -2584,7 +2584,7 @@

        Submodules
        class mcpackutils.block.state.TorchFacingDirectionState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:torch_facing_direction'
        @@ -2606,7 +2606,7 @@

        Submodules
        class mcpackutils.block.state.TurtleEggCountState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:turtle_egg_count'
        @@ -2650,7 +2650,7 @@

        Submodules
        class mcpackutils.block.state.VerticalHalfState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:vertical_half'
        @@ -2661,7 +2661,7 @@

        Submodules
        class mcpackutils.block.state.VineDirectionBitsState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:vine_direction_bits'
        @@ -2672,7 +2672,7 @@

        Submodules
        class mcpackutils.block.state.WallBlockTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:wall_block_type'
        @@ -2683,7 +2683,7 @@

        Submodules
        class mcpackutils.block.state.WallConnectionTypEastState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:wall_connection_type_east'
        @@ -2694,7 +2694,7 @@

        Submodules
        class mcpackutils.block.state.WallConnectionTypeNorthState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:wall_connection_type_north'
        @@ -2705,7 +2705,7 @@

        Submodules
        class mcpackutils.block.state.WallConnectionTypeSouthState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:wall_connection_type_south'
        @@ -2716,7 +2716,7 @@

        Submodules
        class mcpackutils.block.state.WallConnectionTypeWestState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:wall_connection_type_west'
        @@ -2738,7 +2738,7 @@

        Submodules
        class mcpackutils.block.state.WeirdoDirectionState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:weirdo_direction'
        @@ -2749,7 +2749,7 @@

        Submodules
        class mcpackutils.block.state.WoodTypeState
        -

        Bases: BlockState

        +

        Bases: BlockProperty

        id = 'minecraft:wood_type'
        @@ -2768,11 +2768,11 @@

        Submodules

        mcpackutils.block.trait module

        -class mcpackutils.block.trait.BlockTrait(enabled_states: list[BlockState])
        +class mcpackutils.block.trait.BlockTrait(enabled_states: list[BlockProperty])

        Bases: object

        -property enabled_states: list[BlockState]
        +property enabled_states: list[BlockProperty]
        @@ -2789,7 +2789,7 @@

        Submodules
        -class mcpackutils.block.trait.PlacementDirectionTrait(enabled_states: list[BlockState] = [], y_rotation_offset: float = 0.0)
        +class mcpackutils.block.trait.PlacementDirectionTrait(enabled_states: list[BlockProperty] = [], y_rotation_offset: float = 0.0)

        Bases: BlockTrait

        @@ -2828,7 +2828,7 @@

        Submodules
        -class mcpackutils.block.trait.PlacementPositionTrait(enabled_states: list[BlockState] = [])
        +class mcpackutils.block.trait.PlacementPositionTrait(enabled_states: list[BlockProperty] = [])

        Bases: BlockTrait

        @@ -2885,7 +2885,7 @@

        Submodules
        -add_state(state: BlockState) BlockState
        +add_state(state: BlockProperty) BlockProperty

        @@ -2961,7 +2961,7 @@

        Submodules
        -get_state(id: Identifier | str) BlockState
        +get_state(id: Identifier | str) BlockProperty

        @@ -3006,7 +3006,7 @@

        Submodules
        -remove_state(id: Identifier | str) BlockState
        +remove_state(id: Identifier | str) BlockProperty

        @@ -3016,7 +3016,7 @@

        Submodules
        -property states: dict[Identifier, BlockState]
        +property states: dict[Identifier, BlockProperty]

        diff --git a/docs/_build/html/mcpackutils.html b/docs/_build/html/mcpackutils.html index 66ae1a6..bd9d942 100644 --- a/docs/_build/html/mcpackutils.html +++ b/docs/_build/html/mcpackutils.html @@ -68,7 +68,7 @@
      • BlockDescriptor
      • BlockFaceState
      • BlockPermutation
      • -
      • BlockState
      • +
      • BlockProperty
      • BlockTags
      • BlockTrait
      • BoneVisabilityComponent
      • @@ -251,11 +251,11 @@
      • mcpackutils.event module
      • GeometryComponent
      • -
      • DecrementBlockState
      • +
      • DecrementBlockProperty
      • DecrementStack
      • -
      • IncrementBlockState
      • +
      • IncrementBlockProperty
      • PlayEffect
      • -
      • SetBlockState
          -
        • SetBlockState.from_dict()
        • -
        • SetBlockState.id
        • -
        • SetBlockState.states
        • +
        • SetBlockProperty
        • SpawnLoot
        • -
        • SwitchBlockState
        • +
        • SwitchBlockProperty
        • Teleport
        • -
        • RandomBlockStateLootFunction
            -
          • RandomBlockStateLootFunction.block_state
          • -
          • RandomBlockStateLootFunction.from_dict()
          • -
          • RandomBlockStateLootFunction.id
          • -
          • RandomBlockStateLootFunction.values
          • +
          • RandomBlockPropertyLootFunction
          • RandomChanceLootCondition
          • -
          • BlockState
              -
            • BlockState.from_dict()
            • -
            • BlockState.id
            • -
            • BlockState.values
            • +
            • BlockProperty
            • BooksStoredState
                @@ -2308,7 +2308,7 @@

                mcaddon
              • Identifier.is_namespace_valid()
              • Identifier.is_path_valid()
              • Identifier.namespace
              • -
              • Identifier.parse()
              • +
              • Identifier.of()
              • Identifier.path
              • Identifier.replace()
              • Identifier.split()
              • @@ -2324,7 +2324,7 @@

                mcaddon
              • Version
              • diff --git a/docs/_build/html/searchindex.js b/docs/_build/html/searchindex.js index 7d3f4dc..5400c37 100644 --- a/docs/_build/html/searchindex.js +++ b/docs/_build/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["index", "mcaddon", "mcaddon.schemas", "modules", "setup"], "filenames": ["index.rst", "mcaddon.rst", "mcaddon.schemas.rst", "modules.rst", "setup.rst"], "titles": ["Welcome to mcpackutils\u2019s documentation!", "mcaddon package", "mcaddon.schemas package", "mcaddon", "setup module"], "terms": {"packag": [0, 3], "setup": [0, 1, 3], "modul": [0, 3], "index": [0, 1], "search": 0, "page": [0, 1, 3], "block": 3, "compon": [1, 3], "blockcompon": [1, 3], "from_dict": [1, 3], "blockdescriptor": [1, 3], "name": [1, 3], "state": 3, "tag": [1, 3], "blocktag": [], "id": [1, 3], "bonevisabilitycompon": [1, 3], "bone": [1, 3], "box": [1, 3], "cube": [1, 3], "none": [1, 3], "origin": [1, 3], "size": [1, 3], "breathabilitycompon": [1, 3], "valu": [1, 3], "collisionboxcompon": [1, 3], "craftingtablecompon": [1, 3], "crafting_tag": [1, 3], "table_nam": [1, 3], "destructiblebyexplosioncompon": [1, 3], "explosion_resist": [1, 3], "destructiblebyminingcompon": [1, 3], "seconds_to_destori": [], "displaynamecompon": [], "filter": [1, 3], "allowed_fac": [1, 3], "block_filt": [1, 3], "flammablecompon": [1, 3], "catch_chance_modifi": [1, 3], "destroy_chance_modifi": [1, 3], "frictioncompon": [1, 3], "geometrycompon": [1, 3], "lightdampeningcompon": [1, 3], "lightemissioncompon": [1, 3], "lootcompon": [1, 3], "mapcolorcompon": [1, 3], "materi": [1, 3], "ambient_occlus": [1, 3], "face_dim": [1, 3], "render_method": [1, 3], "textur": [1, 3], "materialinstancescompon": [1, 3], "add_materi": [1, 3], "get_materi": [1, 3], "remove_materi": [1, 3], "onfalloncompon": [1, 3], "min_fall_dist": [1, 3], "oninteractcompon": [1, 3], "onplacedcompon": [1, 3], "onplayerdestroyedcompon": [1, 3], "onplayerplacingcompon": [1, 3], "onstepoffcompon": [1, 3], "onsteponcompon": [1, 3], "placementfiltercompon": [1, 3], "condit": [1, 3], "queuedtickingcompon": [1, 3], "interval_rang": [1, 3], "loop": [1, 3], "on_tick": [1, 3], "randomtickingcompon": [1, 3], "selectionboxcompon": [1, 3], "transformationcompon": [1, 3], "rotat": [1, 3], "scale": [1, 3], "translat": [1, 3], "unitcubecompon": [1, 3], "activest": [1, 3], "agebitst": [1, 3], "agest": [1, 3], "allowunderwaterbitst": [1, 3], "attachedbitst": [1, 3], "attachmentst": [1, 3], "bambooleafsizest": [1, 3], "bamboostalkthicknessst": [1, 3], "bigdripleaftiltst": [1, 3], "bitecounterst": [1, 3], "blockfacest": [1, 3], "blockstat": [1, 3], "booksstoredst": [1, 3], "booleanst": [1, 3], "brewingstandslotabitst": [1, 3], "brewingstandslotbbitst": [1, 3], "brewingstandslotcbitst": [1, 3], "brushedprogressst": [1, 3], "buttonpressedbitst": [1, 3], "candlesst": [1, 3], "cardinaldirectionst": [1, 3], "cauldronliquidst": [1, 3], "chemistrytabletypest": [1, 3], "chiseltypest": [1, 3], "clustercountst": [1, 3], "colorbitst": [1, 3], "colorst": [1, 3], "conditionalbitst": [1, 3], "coralcolorst": [1, 3], "coraldirectionst": [1, 3], "coralhangtypebitst": [1, 3], "coveredbitst": [1, 3], "crackedst": [1, 3], "craftingst": [1, 3], "damagest": [1, 3], "deadbitst": [1, 3], "directionst": [1, 3], "dirttypest": [1, 3], "disarmedbitst": [1, 3], "doorhingebitst": [1, 3], "doubleplanttypest": [1, 3], "dragdownst": [1, 3], "dripstonethicknessst": [1, 3], "endportaleyebitst": [1, 3], "explodebitst": [1, 3], "facingdirectionst": [1, 3], "filllevelst": [1, 3], "flowertypest": [1, 3], "groundsigndirectionst": [1, 3], "growthstat": [1, 3], "hangingst": [1, 3], "headpiecebitst": [1, 3], "heightstat": [1, 3], "hugemushroombitsst": [1, 3], "inwallbitst": [1, 3], "infiniburnbitst": [1, 3], "integerst": [1, 3], "itemframemapbitst": [1, 3], "itemframephotobitst": [1, 3], "liquiddepthst": [1, 3], "moisturizedamountst": [1, 3], "monstereggstonetypest": [1, 3], "newleaftypest": [1, 3], "newlogtypest": [1, 3], "nodropbitst": [1, 3], "occupiedbitst": [1, 3], "oldleaftypest": [1, 3], "oldlogtypest": [1, 3], "openbitst": [1, 3], "orientationst": [1, 3], "outputlitbitst": [1, 3], "outputsubtractbitst": [1, 3], "persistentbitst": [1, 3], "portalaxisst": [1, 3], "poweredbitst": [1, 3], "raildatabitst": [1, 3], "raildirectionst": [1, 3], "redstonesignalst": [1, 3], "repeaterdelayst": [1, 3], "sandstonetypest": [1, 3], "sandtypest": [1, 3], "saplingtypest": [1, 3], "sculksensorphasest": [1, 3], "seagrasstypest": [1, 3], "spongetypest": [1, 3], "stabilitycheckst": [1, 3], "stabilityst": [1, 3], "stonebricktypest": [1, 3], "stoneslabtype2st": [1, 3], "stoneslabtype3st": [1, 3], "stoneslabtype4st": [1, 3], "stoneslabtypest": [1, 3], "stonetypest": [1, 3], "strippedbitst": [1, 3], "structureblocktypest": [1, 3], "structurevoidtypest": [1, 3], "suspendedbitst": [1, 3], "tallgrasstypest": [1, 3], "togglebitst": [1, 3], "topslotbitst": [1, 3], "torchfacingdirectionst": [1, 3], "triggedbitst": [1, 3], "turtleeggcountst": [1, 3], "updatebitst": [1, 3], "upperblockbitst": [1, 3], "upsidedownbitst": [1, 3], "verticalhalfst": [1, 3], "vinedirectionbitsst": [1, 3], "wallblocktypest": [1, 3], "wallconnectiontypeastst": [1, 3], "wallconnectiontypenorthst": [1, 3], "wallconnectiontypesouthst": [1, 3], "wallconnectiontypewestst": [1, 3], "wallpostbitst": [1, 3], "weirdodirectionst": [1, 3], "woodtypest": [1, 3], "trait": [1, 3], "blocktrait": [1, 3], "enabled_st": [1, 3], "placementdirectiontrait": [1, 3], "all": [1, 3], "cardin": [1, 3], "face": [1, 3], "y_rotation_offset": [1, 3], "placementpositiontrait": [1, 3], "block_fac": [1, 3], "vertical_half": [1, 3], "add_compon": [1, 3], "add_ev": [1, 3], "add_permut": [1, 3], "add_stat": [1, 3], "add_trait": [1, 3], "clear_compon": [1, 3], "clear_ev": [1, 3], "clear_permut": [1, 3], "clear_stat": [1, 3], "clear_trait": [1, 3], "format_vers": 1, "get_compon": [1, 3], "get_ev": [1, 3], "get_permut": [1, 3], "get_stat": [1, 3], "get_trait": [1, 3], "identifi": [1, 3], "menu_categori": [1, 3], "permut": [1, 3], "remove_compon": [1, 3], "remove_ev": [1, 3], "remove_permut": [1, 3], "remove_st": [1, 3], "remove_trait": [1, 3], "type": [1, 3], "blockpermut": [1, 3], "bushblock": [], "buttonblock": [], "cakeblock": [], "add_candle_cak": [], "clear_candle_cak": [], "get_candle_cak": [], "remove_candle_cak": [], "candlecakeblock": [], "cauldronblock": [], "cauldronlevelblock": [], "cropblock": [], "doorblock": [], "fenceblock": [], "fencegateblock": [], "glasspan": [], "lanternblock": [], "pressureplateblock": [], "saplingblock": [], "slabblock": [], "stairsblock": [], "torchblock": [], "trapdoorblock": [], "wallblock": [], "entiti": [1, 3], "entitycompon": [], "item": 3, "allowoffhandcompon": [1, 3], "blockplacercompon": [1, 3], "use_on": [1, 3], "candestroyincreativecompon": [1, 3], "cooldowncompon": [1, 3], "categori": [1, 3], "durat": [1, 3], "damagecompon": [1, 3], "durabilitycompon": [1, 3], "damage_ch": [1, 3], "max_dur": [1, 3], "enchantablecompon": [1, 3], "slot": [1, 3], "entityplacercompon": [1, 3], "dispense_on": [1, 3], "foodcompon": [1, 3], "can_always_eat": [1, 3], "nutrit": [1, 3], "saturation_modifi": [1, 3], "using_converts_to": [1, 3], "fuelcompon": [1, 3], "glintcompon": [1, 3], "handequippedcompon": [1, 3], "hovertextcolorcompon": [1, 3], "iconcompon": [1, 3], "interactbuttoncompon": [1, 3], "itemcompon": [1, 3], "json": [1, 2, 3], "itemstoragecompon": [1, 3], "capac": [1, 3], "liquidclippedcompon": [1, 3], "maxstacksizecompon": [1, 3], "projectilecompon": [1, 3], "minimum_critical_pow": [1, 3], "projectile_ent": [1, 3], "recordcompon": [1, 3], "comparator_sign": [1, 3], "sound_ev": [1, 3], "repairitem": [1, 3], "repairablecompon": [1, 3], "repair_item": [1, 3], "shootercompon": [1, 3], "ammunit": [1, 3], "charge_on_draw": [1, 3], "max_draw_dur": [1, 3], "scale_power_by_draw_dur": [1, 3], "shoulddespawncompon": [1, 3], "stackedbydatacompon": [1, 3], "tagscompon": [1, 3], "throwablecompon": [1, 3], "do_swing_anim": [1, 3], "launch_power_scal": [1, 3], "max_launch_pow": [1, 3], "min_draw_dur": [1, 3], "useanimationcompon": [1, 3], "usemodifierscompon": [1, 3], "movement_modifi": [1, 3], "use_dur": [1, 3], "wearablecompon": [1, 3], "destroy_spe": [1, 3], "use_effici": [1, 3], "appleitem": [], "class": [1, 2], "qualnam": 1, "start": 1, "1": 1, "boundari": 1, "base": [1, 2, 3], "enum": 1, "command": [1, 3], "construct": [1, 3], "equip": [1, 3], "natur": [1, 3], "color": [1, 3], "black": [1, 3], "blue": [1, 3], "brown": [1, 3], "cyan": [1, 3], "grai": [1, 3], "green": [1, 3], "light_blu": [1, 3], "light_grai": [1, 3], "lime": [1, 3], "magenta": [1, 3], "orang": [1, 3], "pink": [1, 3], "purpl": [1, 3], "red": [1, 3], "white": [1, 3], "yellow": [1, 3], "eventtarget": [1, 3], "babi": [1, 3], "damag": [1, 3], "holder": [1, 3], "other": [1, 3], "parent": [1, 3], "player": [1, 3], "self": [1, 2, 3], "target": [1, 3], "moduletyp": [1, 3], "client_data": [1, 3], "data": [1, 2, 3], "interfac": [1, 3], "resourc": [1, 3], "world_templ": [1, 3], "recipetag": [1, 3], "brewing_stand": [1, 3], "campfir": [1, 3], "crafting_t": [1, 3], "furnac": [1, 3], "smithing_t": [1, 3], "smoker": [1, 3], "soul_campfir": [1, 3], "stonecutt": [1, 3], "rendermethod": [1, 3], "alpha_test": [1, 3], "blend": [1, 3], "double_sid": [1, 3], "opaqu": [1, 3], "useanim": [1, 3], "camera": 3, "drink": [1, 3], "eat": [1, 3], "addmobeffect": [1, 3], "effect": [1, 3], "str": 1, "amplifi": [1, 3], "int": 1, "0": 1, "float": 1, "properti": 1, "minecraft": 1, "add_mob_effect": 1, "amount": [1, 3], "mob_amount": [1, 3], "decrementblockst": [1, 3], "setblockst": [1, 3], "decrementstack": [1, 3], "decrement_stack": 1, "die": [1, 3], "object": [1, 2], "classmethod": 1, "dict": [1, 2], "incrementblockst": [1, 3], "playeffect": [1, 3], "play_effect": 1, "playsound": [1, 3], "sound": [1, 3], "play_sound": 1, "random": [1, 3], "sequenc": [1, 3], "randomli": 1, "run": 1, "respons": 1, "removemobeffect": [1, 3], "remove_mob_effect": 1, "runcommand": [1, 3], "list": 1, "run_command": 1, "event_exist": [1, 3], "bool": 1, "get_condit": [1, 3], "molang": 1, "remove_condit": [1, 3], "set_condit": [1, 3], "setblock": [1, 3], "block_typ": [1, 3], "set_block": 1, "setblockatpo": [1, 3], "block_offset": [1, 3], "set_block_at_po": 1, "set_block_st": 1, "spawnloot": [1, 3], "tabl": [1, 3], "spawn_loot": 1, "swing": [1, 3], "switchblockst": [1, 3], "teleport": [1, 3], "avoid_wat": [1, 3], "true": 1, "destin": [1, 3], "land_on_block": [1, 3], "max_rang": [1, 3], "8": 1, "transformiiem": [1, 3], "transform": [1, 3], "transform_item": 1, "trigger": [1, 3], "add": [1, 3], "thi": [1, 2], "parser": 1, "paramet": 1, "The": 1, "loottabl": [1, 3], "saveabl": [], "depend": [1, 3], "uuid": [1, 3], "version": [1, 2, 3], "header": [1, 3], "min_engine_vers": [1, 3], "exampl": 1, "descript": [1, 3], "gener": [1, 3], "us": [1, 2], "allow_random_se": [1, 3], "base_game_vers": [1, 3], "lock_template_opt": [1, 3], "description_kei": [1, 3], "name_kei": [1, 3], "metadata": [1, 3], "add_depend": [1, 3], "add_modul": [1, 3], "behavior": [1, 3], "clear_depend": [1, 3], "clear_modul": [1, 3], "get_depend": [1, 3], "get_modul": [1, 3], "remove_depend": [1, 3], "remove_modul": [1, 3], "licens": [1, 3], "url": [1, 3], "add_author": [1, 3], "author": [1, 3], "clear_author": [1, 3], "get_author": [1, 3], "remove_author": [1, 3], "resourcepack": [1, 3], "behaviorpack": [1, 3], "add_block": [1, 3], "add_item": [1, 3], "clear_block": [1, 3], "clear_item": [1, 3], "remove_block": [1, 3], "remove_item": [1, 3], "save": [1, 3], "fp": 1, "save_fold": [], "path": [1, 3], "save_zipfil": [], "__commonpack": [], "kw": 1, "folder": 1, "directori": 2, "writezip": [1, 3], "zip": 1, "zipfil": 1, "file": [2, 3], "namespac": [1, 3], "default_namespac": [1, 3], "seper": [1, 3], "copi": [1, 3], "return": 1, "copy_with_namespac": [1, 3], "new": 1, "copy_with_path": [1, 3], "is_namespace_valid": [1, 3], "valid": [1, 3], "option": 1, "default": 1, "whether": 1, "": 1, "is_path_valid": [1, 3], "pars": [1, 3], "an": 1, "replac": [1, 3], "old": 1, "count": [1, 3], "split": [1, 3], "tupl": 1, "menucategori": [1, 3], "group": [1, 3], "is_hidden_in_command": [1, 3], "fals": 1, "string": 1, "ab": [], "absolut": [], "aco": [], "arcco": [], "b": 1, "and_": [], "append": [], "asin": [], "arcsin": [], "atan": [], "arctan": [], "atan2": [], "y": 1, "x": 1, "note": 1, "order": 1, "argument": 1, "block_stat": [1, 3], "cell": [], "round": [], "up": [1, 3], "nearest": [], "integr": [], "number": 1, "clamp": [], "min": [1, 3], "max": [1, 3], "between": 1, "inclus": 1, "context": [], "variable_nam": [], "read": [], "onli": 1, "storag": 1, "provid": 1, "game": 1, "certain": 1, "scenario": [], "variabl": [], "co": [], "cosin": [], "degre": [], "die_rol": [], "num": [], "low": [], "high": [], "sum": [], "each": [1, 2], "from": [1, 2], "ar": 1, "integ": [], "like": 1, "normal": 1, "dice": [], "For": 1, "math": [], "die_roll_integ": [], "div": [], "exp": [], "calcul": [], "e": [], "th": [], "power": 1, "floor": [], "down": [1, 3], "geometri": [1, 3], "texture_nam": 1, "A": 1, "refer": 1, "definit": 1, "gt": [], "gteq": [], "has_block_st": [], "hermite_blend": [], "simpl": [], "smooth": [], "curv": [], "interpol": [], "one": 1, "hermit": [], "basi": [], "function": [1, 3], "3t": [], "2": 1, "2t": [], "3": [], "while": 1, "ani": 1, "i": 1, "input": [1, 3], "work": [], "best": [], "rang": 1, "lerp": [], "zero_to_on": [], "end": [], "via": [], "0_to_1": [], "lerprot": [], "shortest": [], "direct": 1, "around": 1, "circl": [], "ln": [], "logarithm": [], "lt": [], "lteq": [], "highest": [], "lowest": [], "min_angl": [], "minim": 1, "angl": [], "magnitud": [], "180": 1, "mod": [], "denomin": [], "remaind": [], "mul": [], "not_": [], "or_": [], "paren": [], "lang": 1, "pi": [], "represent": [], "pow": [], "expon": [], "elev": [], "prepend": [], "queri": 1, "function_nam": [], "arg": 1, "access": [], "random_integ": [], "sin": [], "sine": [], "sqrt": [], "squar": [], "root": [], "sub": [], "temp": [], "write": [1, 3], "temporari": [], "trunc": [], "toward": [], "zero": [], "actor": 1, "load": [1, 2, 3], "convert": [1, 2], "format": [1, 2], "stringifi": [1, 3], "indent": 1, "level": [1, 3], "desc": [], "bone_vis": [1, 3], "16": 1, "breathabl": 1, "collision_box": 1, "destructible_by_explos": 1, "destructible_by_min": 1, "display_nam": 1, "blockfac": [1, 3], "flammabl": 1, "friction": 1, "light_dampen": 1, "light_emiss": 1, "loot": 3, "map_color": [1, 3], "instance_nam": 1, "material_inst": 1, "event": 3, "on_fall_on": 1, "on_interact": 1, "on_plac": 1, "on_player_destori": [], "on_player_plac": 1, "on_step_off": 1, "on_step_on": 1, "placement_filt": 1, "queued_tick": 1, "random_tick": 1, "selection_box": 1, "unit_cub": 1, "cl": 1, "activ": 1, "age_bit": 1, "ag": 1, "allow_underwater_bit": 1, "attached_bit": 1, "attach": 1, "bamboo_leaf_s": 1, "bamboo_stalk": 1, "bigt_dripleaf_tilt": 1, "bite_count": 1, "books_stor": 1, "brewing_stand_slot_a_bit": 1, "brewing_stand_slot_b_bit": 1, "brewing_stand_slot_c_bit": 1, "brushed_progress": 1, "button_pressed_bit": 1, "candl": 1, "cardinal_direct": 1, "cauldron_liquid": 1, "chemistry_table_typ": 1, "chisel_typ": 1, "cluster_count": 1, "color_bit": 1, "conditional_bit": 1, "coral_color": 1, "coral_direct": 1, "coral_hang_type_bit": 1, "coverted_bit": 1, "cracked_st": 1, "craft": 1, "dead_bit": 1, "dirt_typ": 1, "disarmed_bit": 1, "door_hinge_bit": 1, "double_plant_typ": 1, "drag_down": 1, "dripstone_thick": 1, "end_portal_eye_bit": 1, "explode_bit": 1, "facing_direct": 1, "fill_level": 1, "flower_typ": 1, "ground_sign_direct": 1, "growth": 1, "hang": 1, "head_piece_bit": 1, "height": 1, "huge_mushroom_bit": 1, "in_wall_bit": 1, "infiniburn_bit": 1, "stop": 1, "item_frame_map_bit": 1, "item_frame_photo_bit": 1, "liquid_depth": 1, "moisturized_amount": 1, "monster_egg_stone_typ": 1, "new_leaf_typ": 1, "new_log_typ": 1, "no_drop_bit": 1, "occupied_bit": 1, "old_leaf_typ": 1, "old_log_typ": 1, "open_bit": 1, "orient": 1, "output_lit_bit": 1, "output_subtract_bit": 1, "persistent_bit": 1, "portal_axi": 1, "powered_bit": 1, "rail_data_bit": 1, "rail_direct": 1, "redstone_sign": 1, "repeater_delai": 1, "sand_stone_typ": 1, "sand_typ": 1, "sapling_typ": 1, "sculk_sensor_phas": 1, "sea_grass_typ": 1, "sponge_typ": 1, "stability_check": 1, "stabil": 1, "stone_brick_typ": 1, "stone_slab_type2": 1, "stone_slab_type3": 1, "stone_slab_type_4": 1, "stone_slab_typ": 1, "stone_typ": 1, "stripped_bit": 1, "structure_block_typ": 1, "structure_void_typ": 1, "suspended_bit": 1, "tall_grass_typ": 1, "toggle_bit": 1, "top_slot_bit": 1, "torch_facing_direct": 1, "triggered_bit": 1, "turtle_egg_count": 1, "update_bit": 1, "upper_block_bit": 1, "upside_down_bit": 1, "vine_direction_bit": 1, "wall_block_typ": 1, "wall_connection_type_east": 1, "wall_connection_type_north": 1, "wall_connection_type_south": 1, "wall_connection_type_west": 1, "wall_post_bit": 1, "weirdo_direct": 1, "wood_typ": 1, "equival": 1, "placement_direct": 1, "placement_posit": 1, "20": 1, "51": [], "bush": [], "button": 1, "cake": [], "candle_cak": [], "empty_bucket": [], "bucket": [], "filled_bucket": [], "lava_bucket": [], "cauldron": [], "water_bucket": [], "empty_bottl": [], "glass_bottl": [], "filled_bottl": [], "water_bottl": [], "cauldron_level": [], "crop": 1, "door": [], "fenc": [], "fence_g": [], "glass_pan": [], "lantern": [], "pressure_pl": [], "structur": [], "sapl": [], "slab": [], "stair": [], "torch": [], "trapdoor": [], "wall": [], "allow_off_hand": 1, "block_plac": 1, "can_destroy_in_cr": 1, "cooldown": 1, "durabl": [1, 3], "enchant": [1, 3], "entity_plac": 1, "food": 1, "fuel": 1, "glint": 1, "hand_equip": 1, "hover_text_color": 1, "icon": 1, "interact_button": 1, "item_storag": 1, "liquid_clip": 1, "max_stack_s": 1, "projectil": 1, "record": 1, "repair": 1, "shooter": 1, "should_despawn": 1, "stacked_by_data": 1, "throwabl": 1, "use_anim": 1, "use_modifi": 1, "digger": 1, "subpackag": 3, "submodul": 3, "content": 3, "addon": [1, 3], "anim": 1, "biom": [], "constant": 3, "featur": [], "fog": 1, "manifest": 3, "pack": 3, "particl": 1, "recip": 3, "texture_set": [], "util": 3, "volum": 3, "mcaddon": 0, "mcpackutil": [], "filenam": [1, 3], "from_fileobj": [1, 3], "fileobj": 1, "textiowrapp": 1, "mode": [], "from_ast": [], "ast_nod": [], "schema": [1, 3], "schemafil": [1, 3], "getattr2": [1, 3], "o": 1, "getattr": 1, "defin": 1, "setattr": 1, "my_funct": [], "east": [1, 3], "north": [1, 3], "side": [1, 3], "south": [1, 3], "west": [1, 3], "cameralisten": [1, 3], "buriedtreasur": [1, 3], "endciti": [1, 3], "fortress": [1, 3], "mansion": [1, 3], "mineshaft": [1, 3], "monument": [1, 3], "pillageroutpost": [1, 3], "ruin": [1, 3], "shipwreck": [1, 3], "stronghold": [1, 3], "templ": [1, 3], "villag": [1, 3], "edit": [1, 3], "bedrock": [1, 3], "educ": [1, 3], "preview": [1, 3], "lootcontexttyp": [1, 3], "advancement_ent": [1, 3], "advancement_loc": [1, 3], "advancement_reward": [1, 3], "archaeologi": [1, 3], "barter": [1, 3], "chest": [1, 3], "empti": [1, 3], "fish": [1, 3], "gift": [1, 3], "selector": [1, 3], "oxidationlevel": [1, 3], "expos": [1, 3], "oxid": [1, 3], "unaffect": [1, 3], "weather": [1, 3], "texturetyp": [1, 3], "terrain": [1, 3], "is_cub": [1, 3], "is_non": [1, 3], "alia": 1, "major": [1, 3], "minor": [1, 3], "patch": [1, 3], "componentnotfounderror": [1, 3], "error": [1, 3], "eventnotfounderror": [1, 3], "manifestnotfounderror": [1, 3], "minecraftnotfounderror": [1, 3], "recipetypenotfounderror": [1, 3], "registryerror": [1, 3], "schemanotfounderror": [1, 3], "syntaxerror": [1, 3], "typenotfounderror": [1, 3], "block_component_typ": [1, 3], "block_trait": [1, 3], "event_typ": [1, 3], "item_component_typ": [1, 3], "loot_condition_typ": [1, 3], "loot_function_typ": [1, 3], "pool_entry_typ": [1, 3], "recipe_typ": [1, 3], "volume_component_typ": [1, 3], "create_registri": [1, 3], "get_registri": [1, 3], "registrykei": [1, 3], "regist": [1, 3], "obj": 1, "get": [1, 3], "kei": [1, 3], "cli": 3, "except": 3, "registri": 3, "resrouc": 3, "text": 3, "blockschema1": [1, 2], "camerapresetschem1": [1, 2], "itemschema1": [1, 2], "itemschema2": [1, 2], "manifestschema1": [1, 2], "brewingcontainerschem1": [1, 2], "brewingmixschem1": [1, 2], "furnaceschem1": [1, 2], "materialreductionschem1": [1, 2], "shapedschem1": [1, 2], "shapelessschem1": [1, 2], "smithingtransformschem1": [1, 2], "smithingtransformschem2": [1, 2], "smithingtrimschem1": [1, 2], "volumeschema1": [1, 2], "sound_group": [1, 3], "jsonfil": [1, 3], "dirnam": [1, 3], "extens": [1, 3], "from_set": [1, 3], "set": 1, "blockset": [1, 3], "get_collision_shap": [1, 3], "overrid": 1, "method": 1, "custom": 1, "collis": 1, "shape": 1, "get_selection_shap": [1, 3], "select": 1, "hard": [1, 3], "resist": [1, 3], "stack": [1, 3], "translation_kei": [1, 3], "blockdisplaynamecompon": [1, 3], "simpleblockcompon": [1, 3], "clazz": [1, 3], "blockload": [1, 3], "loader": [1, 3], "collid": [1, 3], "slipperi": [1, 3], "loot_tabl": [1, 3], "burnabl": [1, 3], "lumin": [1, 3], "configur": 1, "common": 1, "breakinstantli": [1, 3], "dropslik": [1, 3], "sourc": 1, "dropsnoth": [1, 3], "is_burn": [1, 3], "no_collis": [1, 3], "set_hard": [1, 3], "set_lumin": [1, 3], "set_resist": [1, 3], "set_slipperi": [1, 3], "strength": [1, 3], "blocktagscompon": [1, 3], "add_tag": [1, 3], "clear_tag": [1, 3], "get_tag": [1, 3], "remove_tag": [1, 3], "add_bon": [1, 3], "clear_bon": [1, 3], "get_bon": [1, 3], "remove_bon": [1, 3], "add_crafting_tag": [1, 3], "clear_crafting_tag": [1, 3], "get_crafting_tag": [1, 3], "remove_crafting_tag": [1, 3], "seconds_to_destroi": [1, 3], "add_fac": [1, 3], "add_filt": [1, 3], "clear_fac": [1, 3], "clear_filt": [1, 3], "get_fac": [1, 3], "get_filt": [1, 3], "remove_fac": [1, 3], "remove_filt": [1, 3], "on_player_destroi": 1, "add_condit": [1, 3], "clear_condit": [1, 3], "bottom": 1, "offset": [1, 3], "z": 1, "camerapreset": [1, 2, 3], "inherit_from": [1, 3], "player_effect": [1, 3], "pos_x": [1, 3], "pos_i": [1, 3], "pos_z": [1, 3], "rot_x": [1, 3], "rot_i": [1, 3], "listen": [1, 3], "camera_preset": 1, "camerapresetload": [1, 3], "main": [1, 3], "archivefil": [1, 3], "getvalu": [1, 3], "byte": 1, "has_filenam": [1, 3], "readdir": [1, 3], "readzip": [1, 3], "overwrit": 1, "writedir": [1, 3], "import": [1, 3], "import_to": [1, 3], "dev": 1, "correct": 1, "when": 1, "place": 1, "develop": 1, "startfil": [1, 3], "you": [1, 2], "doubl": 1, "click": 1, "mcpack": 1, "filepath": 1, "built": 1, "ha": 1, "been": 1, "pass": 1, "chevron": 1, "render": 1, "_description_": 1, "add_schema": [1, 3], "loaderschema": 1, "clear_schema": [1, 3], "get_schema": [1, 3], "If": 1, "rais": 1, "invalid": 1, "pngfile": [1, 3], "imag": [1, 3], "pil": [], "imagefil": 1, "simpleitemcompon": [1, 3], "blockcomponent2": [1, 3], "cameracompon": [1, 3], "black_bars_dur": [1, 3], "black_bars_screen_ratio": [1, 3], "shutter_dur": [1, 3], "shutter_screen_ratio": [1, 3], "picture_dur": [1, 3], "slide_away_dur": [1, 3], "diggercompon": [1, 3], "emptyitemcompon": [1, 3], "foilcompon": [1, 3], "foil": 1, "ignorespermissioncompon": [1, 3], "ignores_permiss": 1, "itemset": [1, 3], "max_count": [1, 3], "max_damag": [1, 3], "recipe_remaind": [1, 3], "itemdisplaynamecompon": [1, 3], "itemload": [1, 3], "rariti": [1, 3], "set_count": [1, 3], "set_damag": [1, 3], "set_recipe_remaind": [1, 3], "itemstack": [1, 3], "maxdamagecompon": [1, 3], "portfoliocompon": [1, 3], "portfolio": 1, "seedcompon": [1, 3], "crop_result": [1, 3], "seed": 1, "add_ammunit": [1, 3], "clear_ammunit": [1, 3], "remove_ammunit": [1, 3], "usedurationcompon": [1, 3], "protect": [1, 3], "wearabl": 1, "lootnumberprovid": [1, 3], "enchantbookfortradinglootfunct": [1, 3], "base_cost": [1, 3], "base_random_cost": [1, 3], "per_level_random_cost": [1, 3], "per_level_cost": [1, 3], "lootfunct": [1, 3], "enchant_book_for_trad": 1, "enchantrandomgearlootfunct": [1, 3], "chanc": [1, 3], "enchant_random_gear": 1, "enchantrandomlylootfunct": [1, 3], "treasur": [1, 3], "enchant_randomli": 1, "enchantwithlevelslootfunct": [1, 3], "enchant_with_level": 1, "explorationmaplootfunct": [1, 3], "exploration_map": 1, "fillcontainerlootfunct": [1, 3], "fill_contain": 1, "furnacesmeltlootfunct": [1, 3], "furnace_smelt": 1, "hasmarkvariantlootcondit": [1, 3], "lootcondit": [1, 3], "has_mark_vari": 1, "itementri": [1, 3], "weight": [1, 3], "qualiti": [1, 3], "leafentri": [1, 3], "killedbyentitylootcondit": [1, 3], "entity_typ": [1, 3], "killed_by_ent": 1, "killedbyplayerlootcondit": [1, 3], "killed_by_play": 1, "killedbyplayerorpetslootcondit": [1, 3], "killed_by_player_or_pet": 1, "lootpoolentri": [1, 3], "add_funct": [1, 3], "clear_funct": [1, 3], "get_funct": [1, 3], "remove_funct": [1, 3], "lootentri": [1, 3], "lootpool": [1, 3], "roll": [1, 3], "bonus_rol": [1, 3], "tier": [1, 3], "loottier": [1, 3], "entri": [1, 3], "add_entri": [1, 3], "clear_entri": [1, 3], "get_entri": [1, 3], "remove_entri": [1, 3], "pool": [1, 3], "add_pool": [1, 3], "clear_pool": [1, 3], "get_pool": [1, 3], "remove_pool": [1, 3], "initial_rang": [1, 3], "bonus_ch": [1, 3], "lootingenchantlootfunct": [1, 3], "looting_ench": 1, "matchtoollootcondit": [1, 3], "match_tool": 1, "randomauxvaluelootfunct": [1, 3], "random_aux_valu": 1, "randomblockstatelootfunct": [1, 3], "random_block_st": 1, "randomchancelootcondit": [1, 3], "random_ch": 1, "randomchancewithlootinglootcondit": [1, 3], "looting_multipli": [1, 3], "random_chance_with_loot": 1, "randomdifficultychancelootcondit": [1, 3], "default_ch": [1, 3], "peac": [1, 3], "random_difficulty_ch": 1, "randomdyelootfunct": [1, 3], "random_dy": 1, "randomregionaldifficultychancelootcondit": [1, 3], "max_chanc": [1, 3], "random_regional_difficulty_ch": 1, "setactoridlootfunct": [1, 3], "actor_id": [1, 3], "set_actor_id": 1, "setbannerdetailslootfunct": [1, 3], "set_banner_detail": 1, "setbookcontentslootfunct": [1, 3], "titl": [1, 3], "set_book_cont": 1, "setcountlootfunct": [1, 3], "setdamagelootfunct": [1, 3], "setdatafromcolorindexlootfunct": [1, 3], "set_data_from_color_index": 1, "setdatalootfunct": [1, 3], "set_data": 1, "setlorelootfunct": [1, 3], "lore": [1, 3], "set_lor": 1, "setnamelootfunct": [1, 3], "set_nam": 1, "specificenchantslootfunct": [1, 3], "specific_ench": 1, "tradermaterialtypelootfunct": [1, 3], "trader_material_typ": 1, "loot_condit": [1, 3], "loot_funct": [1, 3], "pool_entri": [1, 3], "set_modul": [1, 3], "set_uuid": [1, 3], "header_uuid": 1, "module_uuid": 1, "manifestload": [1, 3], "untitl": 1, "add_item_textur": [1, 3], "atla": 1, "itematla": [1, 3], "add_loot_t": [1, 3], "add_pack": [1, 3], "add_recip": [1, 3], "add_terrain_textur": [1, 3], "terrainatla": [1, 3], "add_volum": [1, 3], "clear_pack": [1, 3], "get_pack": [1, 3], "remove_pack": [1, 3], "behavior_pack": 1, "clear_recip": [1, 3], "clear_volum": [1, 3], "get_block": [1, 3], "get_item": [1, 3], "get_recip": [1, 3], "get_volum": [1, 3], "merg": [1, 3], "remove_recip": [1, 3], "remove_volum": [1, 3], "suffix": [1, 3], "_bp": 1, "add_fil": [1, 3], "clear_fil": [1, 3], "file_typ": [1, 3], "get_fil": [1, 3], "remove_fil": [1, 3], "set_detail": [1, 3], "resource_pack": 1, "clear_item_textur": [1, 3], "clear_terrain_textur": [1, 3], "get_item_textur": [1, 3], "get_terrain_textur": [1, 3], "remove_item_textur": [1, 3], "remove_terrain_textur": [1, 3], "_rp": 1, "brewingcontainerrecip": [1, 3], "reagent": [1, 3], "output": [1, 3], "recipe_brewing_contain": 1, "brewingcontainerrecipeload": [1, 3], "brew": 1, "contain": [1, 2], "brewingmixrecip": [1, 3], "recipe_brewing_mix": 1, "brewingmixrecipeload": [1, 3], "mix": 1, "furnacerecip": [1, 3], "recipe_furnac": 1, "ingredi": [1, 3], "furnacerecipeload": [1, 3], "materialreductionrecip": [1, 3], "recipe_material_reduct": 1, "materialreductionrecipeload": [1, 3], "mame": [1, 3], "reduct": 1, "result": [1, 3], "material_reduc": [1, 3], "shapedrecip": [1, 3], "pattern": [1, 3], "add_kei": [1, 3], "clear_kei": [1, 3], "recipe_shap": 1, "remove_kei": [1, 3], "shapedrecipeload": [1, 3], "shapelessrecip": [1, 3], "add_ingredi": [1, 3], "clear_ingredi": [1, 3], "recipe_shapeless": 1, "remove_ingredi": [1, 3], "shapelessrecipeload": [1, 3], "shapeless": 1, "smithingtransformrecip": [1, 3], "templat": [1, 3], "addit": [1, 3], "recipe_smithing_transform": 1, "smithingtransformrecipeload": [1, 3], "smith": 1, "smithingtrimrecip": [1, 3], "recipe_smithing_trim": 1, "smithingtrimrecipeload": [1, 3], "trim": 1, "stonecuttingrecip": [1, 3], "flipbooktextur": [1, 3], "flipbook_textur": 1, "atlas_til": [1, 3], "atlas_index": [1, 3], "atlas_tile_vari": [1, 3], "ticks_per_fram": [1, 3], "frame": [1, 3], "replic": [1, 3], "blend_fram": [1, 3], "resource_pack_nam": 1, "texture_data": 1, "_atla": 1, "item_textur": 1, "itemtextur": [1, 3], "_texturedef": 1, "pad": [1, 3], "num_mip_level": [1, 3], "terrain_textur": 1, "terraintextur": [1, 3], "png": 1, "fogcompon": [1, 3], "fog_identifi": [1, 3], "prioriti": [1, 3], "volumecompon": [1, 3], "onactorentercompon": [1, 3], "on_ent": [1, 3], "on_actor_ent": 1, "onactorleavecompon": [1, 3], "on_leav": [1, 3], "on_actor_leav": 1, "volumeload": [1, 3], "kit": 1, "must": [1, 2], "includ": [1, 2], "your": [1, 2], "app": 2, "otherwis": 2, "thing": 2, "break": [1, 2], "both": 2, "python": 2, "specifi": [1, 2], "remov": 1, "creat": 1, "unless": [], "vanilla": 1, "creativ": 1, "allow": 1, "off": 1, "hand": 1, "determin": 1, "can": 1, "inventori": 1, "placer": 1, "destroi": 1, "cool": 1, "time": 1, "after": 1, "same": 1, "becom": 1, "unus": 1, "how": 1, "much": 1, "extra": 1, "doe": 1, "attack": 1, "quickli": 1, "dig": 1, "specif": 1, "take": 1, "befor": 1, "combin": 1, "what": 1, "appli": 1, "Not": 1, "have": 1, "specifii": 1, "restrict": 1, "edibl": 1, "properli": 1, "cook": 1, "tool": 1, "hover": 1, "over": 1, "repres": 1, "ui": 1, "elsewher": 1, "boolean": 1, "interact": 1, "shown": 1, "touch": 1, "control": 1, "displai": 1, "whenev": 1, "ex": 1, "store": 1, "within": 1, "user": 1, "liquid": 1, "clip": 1, "mani": 1, "togeth": 1, "shoot": 1, "out": 1, "arrow": 1, "plai": 1, "music": 1, "along": 1, "thei": 1, "should": 1, "despawn": 1, "eventu": 1, "world": 1, "differ": 1, "aux": 1, "also": 1, "which": 1, "snowbal": 1, "modifi": 1, "long": 1, "speed": 1, "tell": 1, "visibl": 1, "area": 1, "disabl": 1, "omit": 1, "make": 1, "enabl": 1, "abil": 1, "support": 1, "two": 1, "book": 1, "pick": 1, "first": 1, "wa": 1, "mai": 1, "assert": 1, "vari": 1, "describ": 1, "destruct": 1, "explos": 1, "indestruct": 1, "mine": 1, "second": 1, "where": 1, "surviv": 1, "abl": 1, "catch": 1, "fire": 1, "neighbor": 1, "still": 1, "directli": 1, "ignit": 1, "match": 1, "exist": 1, "current": 1, "instanc": 1, "map": 1, "don": 1, "t": 1, "actual": 1, "assign": 1, "give": 1, "choos": 1, "my_inst": 1, "do": 1, "setter": 1, "rule": 1, "under": 1, "either": 1, "onc": 1, "regular": 1, "interv": 1, "equal": 1, "tick": 1, "chosen": 1, "gamerul": 1, "often": 1, "updat": 1, "some": 1, "mechan": 1, "spread": 1, "cursor": 1, "respect": 1, "center": 1, "its": 1, "posit": 1, "unit": 1, "tessel": 1, "preset": 1, "express": 1, "pair": 1, "languag": 1, "hotbar": 1, "given": 1, "resolv": 1, "loc": 1, "raw": 1, "least": 1, "limit": 1, "64": 1, "charact": 1, "field": 1, "greater": 1, "neg": 1, "mean": 1, "easili": 1, "explod": 1, "larger": 1, "increas": 1, "follow": 1, "6": 1, "against": 1, "multipl": 1, "affect": 1, "flame": 1, "next": 1, "than": 1, "higher": 1, "more": 1, "continu": 1, "burn": 1, "until": 1, "forev": 1, "without": 1, "5": 1, "plank": 1, "never": 1, "9": 1, "movement": 1, "travel": 1, "light": 1, "dampen": 1, "through": 1, "15": 1, "emit": 1, "rel": 1, "256": 1, "hex": 1, "rrggbb": 1, "arrai": 1, "r": 1, "g": 1, "255": 1, "show": 1, "ambient": 1, "occlus": 1, "shadow": 1, "underneath": 1, "dim": 1, "alpha": 1, "layer": 1, "transpar": 1, "transluc": 1, "complet": 1, "backfac": 1, "cull": 1, "stain": 1, "glass": 1, "slightli": 1, "unstain": 1, "fulli": 1, "execut": 1, "90": 1, "270": 1, "decid": 1, "so": 1, "alwai": 1, "delai": 1, "mob": 1, "deal": 1, "decreas": 1, "decrement": 1, "kill": 1, "spawn": 1, "slash": 1, "aspect": 1, "met": 1, "anoth": 1, "caus": 1, "switch": 1, "point": 1, "bound": 1, "descriptor": 1, "left": 1, "put": 1, "spend": 1, "usabl": 1, "again": 1, "correl": 1, "impact": 1, "effici": 1, "percentag": 1, "lose": 1, "100": 1, "requir": 1, "minimum": 1, "bow": 1, "would": 1, "were": 1, "dispens": 1, "even": 1, "hungri": 1, "ad": 1, "satur": 1, "formula": 1, "buff": 1, "associ": 1, "charg": 1, "critic": 1, "hit": 1, "signal": 1, "compar": 1, "13": 1, "cat": 1, "chirp": 1, "far": 1, "mall": 1, "mellohi": 1, "stal": 1, "strad": 1, "ward": 1, "11": 1, "wait": 1, "pigstep": 1, "othersid": 1, "relic": 1, "need": 1, "repair_amount": 1, "draw": 1, "thrown": 1, "throw": 1, "maximum": 1, "launch": 1, "worn": 1, "non": 1, "uniqu": 1, "It": 1, "form": 1, "cannot": 1, "enter": 1, "receiv": 1, "feedback": 1, "smaller": 1, "happen": 1, "leav": 1, "archiv": 1, "potion": 1, "stand": 1, "singl": 1, "space": 1, "reserv": 1, "patten": 1, "retain": 1, "perform": 1, "oper": 1, "In": 1, "case": 1, "stackabl": 1, "consum": 1, "accept": 1, "netherite_ingot": 1, "transform_materi": 1, "Its": 1, "armor": 1, "transformable_item": 1, "transform_templ": 1, "preserv": 1, "trim_materi": 1, "trimmable_armor": 1, "trim_templ": 1, "flipbook": 1, "locat": [], "air": [], "first_person": [], "free": [], "third_person": [], "third_person_front": [], "appl": [], "ext": []}, "objects": {"": [[1, 0, 0, "-", "mcaddon"]], "mcaddon": [[1, 0, 0, "-", "block"], [1, 0, 0, "-", "camera"], [1, 0, 0, "-", "cli"], [1, 0, 0, "-", "constant"], [1, 0, 0, "-", "event"], [1, 0, 0, "-", "exception"], [1, 0, 0, "-", "file"], [1, 0, 0, "-", "item"], [1, 0, 0, "-", "loot"], [1, 0, 0, "-", "manifest"], [1, 0, 0, "-", "pack"], [1, 0, 0, "-", "recipe"], [1, 0, 0, "-", "registry"], [1, 0, 0, "-", "resrouce"], [2, 0, 0, "-", "schemas"], [1, 0, 0, "-", "state"], [1, 0, 0, "-", "text"], [1, 0, 0, "-", "util"], [1, 0, 0, "-", "volume"]], "mcaddon.block": [[1, 1, 1, "", "Block"], [1, 1, 1, "", "BlockComponent"], [1, 1, 1, "", "BlockDescriptor"], [1, 1, 1, "", "BlockDisplayNameComponent"], [1, 1, 1, "", "BlockLoader"], [1, 1, 1, "", "BlockPermutation"], [1, 1, 1, "", "BlockSettings"], [1, 1, 1, "", "BlockTagsComponent"], [1, 1, 1, "", "BlockTrait"], [1, 1, 1, "", "BoneVisabilityComponent"], [1, 1, 1, "", "BreathabilityComponent"], [1, 1, 1, "", "CollisionBoxComponent"], [1, 1, 1, "", "CraftingTableComponent"], [1, 1, 1, "", "DestructibleByExplosionComponent"], [1, 1, 1, "", "DestructibleByMiningComponent"], [1, 1, 1, "", "Filter"], [1, 1, 1, "", "FlammableComponent"], [1, 1, 1, "", "FrictionComponent"], [1, 1, 1, "", "GeometryComponent"], [1, 1, 1, "", "LightDampeningComponent"], [1, 1, 1, "", "LightEmissionComponent"], [1, 1, 1, "", "LootComponent"], [1, 1, 1, "", "MapColorComponent"], [1, 1, 1, "", "Material"], [1, 1, 1, "", "MaterialInstancesComponent"], [1, 1, 1, "", "OnFallOnComponent"], [1, 1, 1, "", "OnInteractComponent"], [1, 1, 1, "", "OnPlacedComponent"], [1, 1, 1, "", "OnPlayerDestroyedComponent"], [1, 1, 1, "", "OnPlayerPlacingComponent"], [1, 1, 1, "", "OnStepOffComponent"], [1, 1, 1, "", "OnStepOnComponent"], [1, 1, 1, "", "PlacementDirectionTrait"], [1, 1, 1, "", "PlacementFilterComponent"], [1, 1, 1, "", "PlacementPositionTrait"], [1, 1, 1, "", "QueuedTickingComponent"], [1, 1, 1, "", "RandomTickingComponent"], [1, 1, 1, "", "SelectionBoxComponent"], [1, 1, 1, "", "SimpleBlockComponent"], [1, 1, 1, "", "TransformationComponent"], [1, 1, 1, "", "UnitCubeComponent"], [1, 5, 1, "", "block_component_type"], [1, 5, 1, "", "block_trait"], [1, 5, 1, "", "block_type"]], "mcaddon.block.Block": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "add_component"], [1, 3, 1, "", "add_event"], [1, 3, 1, "", "add_permutation"], [1, 3, 1, "", "add_state"], [1, 3, 1, "", "add_trait"], [1, 3, 1, "", "clear_components"], [1, 3, 1, "", "clear_events"], [1, 3, 1, "", "clear_permutation"], [1, 3, 1, "", "clear_state"], [1, 3, 1, "", "clear_trait"], [1, 4, 1, "", "components"], [1, 4, 1, "", "events"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "from_settings"], [1, 3, 1, "", "get_collision_shape"], [1, 3, 1, "", "get_component"], [1, 3, 1, "", "get_event"], [1, 3, 1, "", "get_permutation"], [1, 3, 1, "", "get_selection_shape"], [1, 3, 1, "", "get_state"], [1, 3, 1, "", "get_trait"], [1, 4, 1, "", "hardness"], [1, 2, 1, "", "id"], [1, 4, 1, "", "map_color"], [1, 4, 1, "", "menu_category"], [1, 4, 1, "", "permutations"], [1, 3, 1, "", "remove_component"], [1, 3, 1, "", "remove_event"], [1, 3, 1, "", "remove_permutation"], [1, 3, 1, "", "remove_state"], [1, 3, 1, "", "remove_trait"], [1, 4, 1, "", "resistance"], [1, 4, 1, "", "sound_group"], [1, 3, 1, "", "stack"], [1, 4, 1, "", "states"], [1, 4, 1, "", "traits"], [1, 3, 1, "", "translation_key"], [1, 4, 1, "", "type"]], "mcaddon.block.BlockComponent": [[1, 3, 1, "", "from_dict"]], "mcaddon.block.BlockDescriptor": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "name"], [1, 4, 1, "", "states"], [1, 4, 1, "", "tags"]], "mcaddon.block.BlockDisplayNameComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.block.BlockLoader": [[1, 2, 1, "", "name"]], "mcaddon.block.BlockPermutation": [[1, 3, 1, "", "add_component"], [1, 3, 1, "", "clear_components"], [1, 4, 1, "", "components"], [1, 4, 1, "", "condition"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_component"], [1, 3, 1, "", "remove_component"]], "mcaddon.block.BlockSettings": [[1, 3, 1, "", "breakInstantly"], [1, 2, 1, "", "burnable"], [1, 2, 1, "", "collidable"], [1, 3, 1, "", "color"], [1, 3, 1, "", "dropsLike"], [1, 3, 1, "", "dropsNothing"], [1, 2, 1, "", "hardness"], [1, 3, 1, "", "is_burnable"], [1, 2, 1, "", "loot_table"], [1, 2, 1, "", "luminance"], [1, 2, 1, "", "map_color"], [1, 3, 1, "", "no_collision"], [1, 2, 1, "", "resistance"], [1, 3, 1, "", "set_hardness"], [1, 3, 1, "", "set_luminance"], [1, 3, 1, "", "set_resistance"], [1, 3, 1, "", "set_slipperiness"], [1, 2, 1, "", "slipperiness"], [1, 2, 1, "", "sound_group"], [1, 3, 1, "", "sounds"], [1, 3, 1, "", "strength"]], "mcaddon.block.BlockTagsComponent": [[1, 3, 1, "", "add_tag"], [1, 3, 1, "", "clear_tags"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_tag"], [1, 2, 1, "", "id"], [1, 3, 1, "", "remove_tag"], [1, 4, 1, "", "tags"]], "mcaddon.block.BlockTrait": [[1, 4, 1, "", "enabled_states"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "id"]], "mcaddon.block.BoneVisabilityComponent": [[1, 3, 1, "", "add_bone"], [1, 4, 1, "", "bones"], [1, 3, 1, "", "clear_bones"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_bone"], [1, 2, 1, "", "id"], [1, 3, 1, "", "remove_bone"]], "mcaddon.block.BreathabilityComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.block.CollisionBoxComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.block.CraftingTableComponent": [[1, 3, 1, "", "add_crafting_tag"], [1, 3, 1, "", "clear_crafting_tags"], [1, 4, 1, "", "crafting_tags"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_crafting_tag"], [1, 2, 1, "", "id"], [1, 3, 1, "", "remove_crafting_tag"], [1, 4, 1, "", "table_name"]], "mcaddon.block.DestructibleByExplosionComponent": [[1, 4, 1, "", "explosion_resistance"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.block.DestructibleByMiningComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "seconds_to_destroy"]], "mcaddon.block.Filter": [[1, 3, 1, "", "add_face"], [1, 3, 1, "", "add_filter"], [1, 4, 1, "", "allowed_faces"], [1, 4, 1, "", "block_filter"], [1, 3, 1, "", "clear_faces"], [1, 3, 1, "", "clear_filters"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_face"], [1, 3, 1, "", "get_filter"], [1, 3, 1, "", "remove_face"], [1, 3, 1, "", "remove_filter"]], "mcaddon.block.FlammableComponent": [[1, 4, 1, "", "catch_chance_modifier"], [1, 4, 1, "", "destroy_chance_modifier"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.block.FrictionComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "value"]], "mcaddon.block.GeometryComponent": [[1, 4, 1, "", "bone_visability"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "geometry"], [1, 2, 1, "", "id"]], "mcaddon.block.LightDampeningComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.block.LightEmissionComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.block.LootComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "empty"], [1, 2, 1, "", "id"]], "mcaddon.block.MapColorComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.block.Material": [[1, 4, 1, "", "ambient_occlusion"], [1, 4, 1, "", "face_dimming"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "render_method"], [1, 4, 1, "", "texture"]], "mcaddon.block.MaterialInstancesComponent": [[1, 3, 1, "", "add_material"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_material"], [1, 2, 1, "", "id"], [1, 4, 1, "", "materials"], [1, 3, 1, "", "remove_material"]], "mcaddon.block.OnFallOnComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "min_fall_distance"]], "mcaddon.block.OnInteractComponent": [[1, 2, 1, "", "id"]], "mcaddon.block.OnPlacedComponent": [[1, 2, 1, "", "id"]], "mcaddon.block.OnPlayerDestroyedComponent": [[1, 2, 1, "", "id"]], "mcaddon.block.OnPlayerPlacingComponent": [[1, 2, 1, "", "id"]], "mcaddon.block.OnStepOffComponent": [[1, 2, 1, "", "id"]], "mcaddon.block.OnStepOnComponent": [[1, 2, 1, "", "id"]], "mcaddon.block.PlacementDirectionTrait": [[1, 3, 1, "", "all"], [1, 3, 1, "", "cardinal"], [1, 3, 1, "", "facing"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "y_rotation_offset"]], "mcaddon.block.PlacementFilterComponent": [[1, 3, 1, "", "add_condition"], [1, 3, 1, "", "clear_conditions"], [1, 4, 1, "", "conditions"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 3, 1, "", "remove_condition"]], "mcaddon.block.PlacementPositionTrait": [[1, 3, 1, "", "all"], [1, 3, 1, "", "block_face"], [1, 2, 1, "", "id"], [1, 3, 1, "", "vertical_half"]], "mcaddon.block.QueuedTickingComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "interval_range"], [1, 4, 1, "", "looping"], [1, 4, 1, "", "on_tick"]], "mcaddon.block.RandomTickingComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "on_tick"]], "mcaddon.block.SelectionBoxComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.block.SimpleBlockComponent": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "value"]], "mcaddon.block.TransformationComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 3, 1, "", "offset"], [1, 3, 1, "", "rotate"], [1, 4, 1, "", "rotation"], [1, 4, 1, "", "scale"], [1, 3, 1, "", "scaled"], [1, 4, 1, "", "translation"]], "mcaddon.block.UnitCubeComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.camera": [[1, 1, 1, "", "CameraPreset"], [1, 1, 1, "", "CameraPresetLoader"]], "mcaddon.camera.CameraPreset": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "inherit_from"], [1, 4, 1, "", "listener"], [1, 4, 1, "", "player_effects"], [1, 4, 1, "", "pos_x"], [1, 4, 1, "", "pos_y"], [1, 4, 1, "", "pos_z"], [1, 4, 1, "", "rot_x"], [1, 4, 1, "", "rot_y"]], "mcaddon.camera.CameraPresetLoader": [[1, 2, 1, "", "name"]], "mcaddon.cli": [[1, 5, 1, "", "main"]], "mcaddon.constant": [[1, 1, 1, "", "BlockFace"], [1, 1, 1, "", "CameraListener"], [1, 1, 1, "", "Category"], [1, 1, 1, "", "Color"], [1, 1, 1, "", "Destination"], [1, 1, 1, "", "Edition"], [1, 1, 1, "", "EventTarget"], [1, 1, 1, "", "LootContextType"], [1, 1, 1, "", "ModuleType"], [1, 1, 1, "", "OxidationLevel"], [1, 1, 1, "", "RecipeTag"], [1, 1, 1, "", "RenderMethod"], [1, 1, 1, "", "TextureType"], [1, 1, 1, "", "UseAnimation"]], "mcaddon.constant.BlockFace": [[1, 2, 1, "", "all"], [1, 2, 1, "", "down"], [1, 2, 1, "", "east"], [1, 2, 1, "", "north"], [1, 2, 1, "", "side"], [1, 2, 1, "", "south"], [1, 2, 1, "", "up"], [1, 2, 1, "", "west"]], "mcaddon.constant.CameraListener": [[1, 2, 1, "", "none"], [1, 2, 1, "", "player"]], "mcaddon.constant.Category": [[1, 2, 1, "", "commands"], [1, 2, 1, "", "construction"], [1, 2, 1, "", "equipment"], [1, 2, 1, "", "items"], [1, 2, 1, "", "nature"], [1, 2, 1, "", "none"]], "mcaddon.constant.Color": [[1, 2, 1, "", "black"], [1, 2, 1, "", "blue"], [1, 2, 1, "", "brown"], [1, 2, 1, "", "cyan"], [1, 2, 1, "", "gray"], [1, 2, 1, "", "green"], [1, 2, 1, "", "light_blue"], [1, 2, 1, "", "light_gray"], [1, 2, 1, "", "lime"], [1, 2, 1, "", "magenta"], [1, 2, 1, "", "orange"], [1, 2, 1, "", "pink"], [1, 2, 1, "", "purple"], [1, 2, 1, "", "red"], [1, 2, 1, "", "white"], [1, 2, 1, "", "yellow"]], "mcaddon.constant.Destination": [[1, 2, 1, "", "buriedtreasure"], [1, 2, 1, "", "endcity"], [1, 2, 1, "", "fortress"], [1, 2, 1, "", "mansion"], [1, 2, 1, "", "mineshaft"], [1, 2, 1, "", "monument"], [1, 2, 1, "", "pillageroutpost"], [1, 2, 1, "", "ruins"], [1, 2, 1, "", "shipwreck"], [1, 2, 1, "", "stronghold"], [1, 2, 1, "", "temple"], [1, 2, 1, "", "village"]], "mcaddon.constant.Edition": [[1, 2, 1, "", "bedrock"], [1, 2, 1, "", "education"], [1, 2, 1, "", "preview"]], "mcaddon.constant.EventTarget": [[1, 2, 1, "", "baby"], [1, 2, 1, "", "block"], [1, 2, 1, "", "damager"], [1, 2, 1, "", "holder"], [1, 2, 1, "", "item"], [1, 2, 1, "", "other"], [1, 2, 1, "", "parent"], [1, 2, 1, "", "player"], [1, 2, 1, "", "self"], [1, 2, 1, "", "target"]], "mcaddon.constant.LootContextType": [[1, 2, 1, "", "advancement_entity"], [1, 2, 1, "", "advancement_location"], [1, 2, 1, "", "advancement_reward"], [1, 2, 1, "", "archaeology"], [1, 2, 1, "", "barter"], [1, 2, 1, "", "block"], [1, 2, 1, "", "chest"], [1, 2, 1, "", "command"], [1, 2, 1, "", "empty"], [1, 2, 1, "", "entity"], [1, 2, 1, "", "fishing"], [1, 2, 1, "", "generic"], [1, 2, 1, "", "gift"], [1, 2, 1, "", "selector"]], "mcaddon.constant.ModuleType": [[1, 2, 1, "", "client_data"], [1, 2, 1, "", "data"], [1, 2, 1, "", "interface"], [1, 2, 1, "", "resources"], [1, 2, 1, "", "world_template"]], "mcaddon.constant.OxidationLevel": [[1, 2, 1, "", "exposed"], [1, 2, 1, "", "oxidized"], [1, 2, 1, "", "unaffected"], [1, 2, 1, "", "weathered"]], "mcaddon.constant.RecipeTag": [[1, 2, 1, "", "brewing_stand"], [1, 2, 1, "", "campfire"], [1, 2, 1, "", "crafting_table"], [1, 2, 1, "", "furnace"], [1, 2, 1, "", "material_reducer"], [1, 2, 1, "", "smithing_table"], [1, 2, 1, "", "smoker"], [1, 2, 1, "", "soul_campfire"], [1, 2, 1, "", "stonecutter"]], "mcaddon.constant.RenderMethod": [[1, 2, 1, "", "alpha_test"], [1, 2, 1, "", "blend"], [1, 2, 1, "", "double_sided"], [1, 2, 1, "", "opaque"]], "mcaddon.constant.TextureType": [[1, 2, 1, "", "item"], [1, 2, 1, "", "terrain"]], "mcaddon.constant.UseAnimation": [[1, 2, 1, "", "camera"], [1, 2, 1, "", "drink"], [1, 2, 1, "", "eat"]], "mcaddon.event": [[1, 1, 1, "", "AddMobEffect"], [1, 1, 1, "", "Damage"], [1, 1, 1, "", "DecrementBlockState"], [1, 1, 1, "", "DecrementStack"], [1, 1, 1, "", "Die"], [1, 1, 1, "", "Event"], [1, 1, 1, "", "IncrementBlockState"], [1, 1, 1, "", "PlayEffect"], [1, 1, 1, "", "PlaySound"], [1, 1, 1, "", "Randomize"], [1, 1, 1, "", "RemoveMobEffect"], [1, 1, 1, "", "RunCommand"], [1, 1, 1, "", "Sequence"], [1, 1, 1, "", "SetBlock"], [1, 1, 1, "", "SetBlockAtPos"], [1, 1, 1, "", "SetBlockState"], [1, 1, 1, "", "SpawnLoot"], [1, 1, 1, "", "Swing"], [1, 1, 1, "", "SwitchBlockState"], [1, 1, 1, "", "Teleport"], [1, 1, 1, "", "TransformiIem"], [1, 1, 1, "", "Trigger"], [1, 5, 1, "", "event_type"]], "mcaddon.event.AddMobEffect": [[1, 4, 1, "", "amplifier"], [1, 4, 1, "", "duration"], [1, 4, 1, "", "effect"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.Damage": [[1, 4, 1, "", "amount"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "mob_amount"], [1, 4, 1, "", "type"]], "mcaddon.event.DecrementStack": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.Die": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.Event": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "target"]], "mcaddon.event.PlayEffect": [[1, 4, 1, "", "data"], [1, 4, 1, "", "effect"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.PlaySound": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "sound"]], "mcaddon.event.Randomize": [[1, 2, 1, "", "id"]], "mcaddon.event.RemoveMobEffect": [[1, 4, 1, "", "effect"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.RunCommand": [[1, 4, 1, "", "command"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.Sequence": [[1, 3, 1, "", "add_event"], [1, 3, 1, "", "clear_events"], [1, 3, 1, "", "event_exists"], [1, 4, 1, "", "events"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_condition"], [1, 3, 1, "", "get_event"], [1, 2, 1, "", "id"], [1, 3, 1, "", "remove_condition"], [1, 3, 1, "", "remove_event"], [1, 3, 1, "", "set_condition"]], "mcaddon.event.SetBlock": [[1, 4, 1, "", "block_type"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.SetBlockAtPos": [[1, 4, 1, "", "block_offset"], [1, 4, 1, "", "block_type"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.SetBlockState": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "states"]], "mcaddon.event.SpawnLoot": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "table"]], "mcaddon.event.Swing": [[1, 2, 1, "", "id"]], "mcaddon.event.Teleport": [[1, 4, 1, "", "avoid_water"], [1, 4, 1, "", "destination"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "land_on_block"], [1, 4, 1, "", "max_range"]], "mcaddon.event.TransformiIem": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "transform"]], "mcaddon.event.Trigger": [[1, 4, 1, "", "condition"], [1, 4, 1, "", "event"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "target"]], "mcaddon.exception": [[1, 6, 1, "", "ComponentNotFoundError"], [1, 6, 1, "", "Error"], [1, 6, 1, "", "EventNotFoundError"], [1, 6, 1, "", "ManifestNotFoundError"], [1, 6, 1, "", "MinecraftNotFoundError"], [1, 6, 1, "", "RecipeTypeNotFoundError"], [1, 6, 1, "", "RegistryError"], [1, 6, 1, "", "SchemaNotFoundError"], [1, 6, 1, "", "SyntaxError"], [1, 6, 1, "", "TypeNotFoundError"]], "mcaddon.file": [[1, 1, 1, "", "ArchiveFile"], [1, 1, 1, "", "File"], [1, 1, 1, "", "Importable"], [1, 1, 1, "", "JsonFile"], [1, 1, 1, "", "Loader"], [1, 1, 1, "", "PngFile"], [1, 1, 1, "", "Schema"]], "mcaddon.file.ArchiveFile": [[1, 4, 1, "", "extension"], [1, 4, 1, "", "filename"], [1, 3, 1, "", "getvalue"], [1, 3, 1, "", "has_filename"], [1, 3, 1, "", "load"], [1, 3, 1, "", "readdir"], [1, 3, 1, "", "readzip"], [1, 3, 1, "", "save"], [1, 3, 1, "", "setup"], [1, 3, 1, "", "writedir"], [1, 3, 1, "", "writezip"]], "mcaddon.file.File": [[1, 4, 1, "", "dirname"], [1, 4, 1, "", "extension"], [1, 4, 1, "", "filename"], [1, 3, 1, "", "from_fileobj"], [1, 3, 1, "", "getvalue"], [1, 3, 1, "", "has_filename"], [1, 3, 1, "", "load"], [1, 3, 1, "", "save"], [1, 3, 1, "", "write"]], "mcaddon.file.Importable": [[1, 3, 1, "", "import_to"], [1, 3, 1, "", "startfile"]], "mcaddon.file.JsonFile": [[1, 3, 1, "", "from_dict"], [1, 3, 1, "", "from_fileobj"], [1, 3, 1, "", "json"], [1, 3, 1, "", "write"]], "mcaddon.file.Loader": [[1, 3, 1, "", "add_schema"], [1, 3, 1, "", "clear_schemas"], [1, 3, 1, "", "get_schema"], [1, 4, 1, "", "key"], [1, 3, 1, "", "load"], [1, 4, 1, "", "name"], [1, 4, 1, "", "schemas"], [1, 3, 1, "", "validate"]], "mcaddon.file.PngFile": [[1, 3, 1, "", "from_fileobj"], [1, 2, 1, "", "image"], [1, 3, 1, "", "write"]], "mcaddon.file.Schema": [[1, 3, 1, "", "load"], [1, 3, 1, "", "schema"], [1, 4, 1, "", "schemafile"], [1, 4, 1, "", "version"]], "mcaddon.item": [[1, 1, 1, "", "AllowOffHandComponent"], [1, 1, 1, "", "BlockComponent2"], [1, 1, 1, "", "BlockPlacerComponent"], [1, 1, 1, "", "CameraComponent"], [1, 1, 1, "", "CanDestroyInCreativeComponent"], [1, 1, 1, "", "CooldownComponent"], [1, 1, 1, "", "DamageComponent"], [1, 1, 1, "", "DiggerComponent"], [1, 1, 1, "", "DurabilityComponent"], [1, 1, 1, "", "EmptyItemComponent"], [1, 1, 1, "", "EnchantableComponent"], [1, 1, 1, "", "EntityPlacerComponent"], [1, 1, 1, "", "FoilComponent"], [1, 1, 1, "", "FoodComponent"], [1, 1, 1, "", "FuelComponent"], [1, 1, 1, "", "GlintComponent"], [1, 1, 1, "", "HandEquippedComponent"], [1, 1, 1, "", "HoverTextColorComponent"], [1, 1, 1, "", "IconComponent"], [1, 1, 1, "", "IgnoresPermissionComponent"], [1, 1, 1, "", "InteractButtonComponent"], [1, 1, 1, "", "Item"], [1, 1, 1, "", "ItemComponent"], [1, 1, 1, "", "ItemDisplayNameComponent"], [1, 1, 1, "", "ItemLoader"], [1, 1, 1, "", "ItemSettings"], [1, 1, 1, "", "ItemStack"], [1, 1, 1, "", "ItemStorageComponent"], [1, 1, 1, "", "LiquidClippedComponent"], [1, 1, 1, "", "MaxDamageComponent"], [1, 1, 1, "", "MaxStackSizeComponent"], [1, 1, 1, "", "PortfolioComponent"], [1, 1, 1, "", "ProjectileComponent"], [1, 1, 1, "", "RecordComponent"], [1, 1, 1, "", "RepairItem"], [1, 1, 1, "", "RepairableComponent"], [1, 1, 1, "", "SeedComponent"], [1, 1, 1, "", "ShooterComponent"], [1, 1, 1, "", "ShouldDespawnComponent"], [1, 1, 1, "", "SimpleItemComponent"], [1, 1, 1, "", "StackedByDataComponent"], [1, 1, 1, "", "TagsComponent"], [1, 1, 1, "", "ThrowableComponent"], [1, 1, 1, "", "UseAnimationComponent"], [1, 1, 1, "", "UseDurationComponent"], [1, 1, 1, "", "UseModifiersComponent"], [1, 1, 1, "", "WearableComponent"], [1, 5, 1, "", "item_component_type"]], "mcaddon.item.AllowOffHandComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.BlockComponent2": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.BlockPlacerComponent": [[1, 4, 1, "", "block"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "use_on"]], "mcaddon.item.CameraComponent": [[1, 4, 1, "", "black_bars_duration"], [1, 4, 1, "", "black_bars_screen_ratio"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "picture_duration"], [1, 4, 1, "", "shutter_duration"], [1, 4, 1, "", "shutter_screen_ratio"], [1, 4, 1, "", "slide_away_duration"]], "mcaddon.item.CanDestroyInCreativeComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.CooldownComponent": [[1, 4, 1, "", "category"], [1, 4, 1, "", "duration"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.DamageComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.DiggerComponent": [[1, 4, 1, "", "destroy_speeds"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "use_efficiency"]], "mcaddon.item.DurabilityComponent": [[1, 4, 1, "", "damage_chance"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "max_durability"]], "mcaddon.item.EmptyItemComponent": [[1, 3, 1, "", "from_dict"]], "mcaddon.item.EnchantableComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "slot"], [1, 4, 1, "", "value"]], "mcaddon.item.EntityPlacerComponent": [[1, 4, 1, "", "dispense_on"], [1, 4, 1, "", "entity"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "use_on"]], "mcaddon.item.FoilComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.FoodComponent": [[1, 4, 1, "", "can_always_eat"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "nutrition"], [1, 4, 1, "", "saturation_modifier"], [1, 4, 1, "", "using_converts_to"]], "mcaddon.item.FuelComponent": [[1, 4, 1, "", "duration"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.GlintComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.HandEquippedComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.HoverTextColorComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.IconComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "texture"]], "mcaddon.item.IgnoresPermissionComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.InteractButtonComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.Item": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "add_component"], [1, 3, 1, "", "add_event"], [1, 3, 1, "", "clear_components"], [1, 3, 1, "", "clear_events"], [1, 4, 1, "", "components"], [1, 4, 1, "", "events"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "from_settings"], [1, 3, 1, "", "get_component"], [1, 3, 1, "", "get_event"], [1, 2, 1, "", "id"], [1, 4, 1, "", "max_count"], [1, 4, 1, "", "max_damage"], [1, 4, 1, "", "menu_category"], [1, 4, 1, "", "recipe_remainder"], [1, 3, 1, "", "remove_component"], [1, 3, 1, "", "remove_event"], [1, 3, 1, "", "stack"], [1, 3, 1, "", "translation_key"]], "mcaddon.item.ItemComponent": [[1, 3, 1, "", "from_dict"], [1, 3, 1, "", "json"]], "mcaddon.item.ItemDisplayNameComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "value"]], "mcaddon.item.ItemLoader": [[1, 2, 1, "", "name"]], "mcaddon.item.ItemSettings": [[1, 2, 1, "", "color"], [1, 2, 1, "", "max_count"], [1, 2, 1, "", "max_damage"], [1, 3, 1, "", "rarity"], [1, 2, 1, "", "recipe_remainder"], [1, 3, 1, "", "set_count"], [1, 3, 1, "", "set_damage"], [1, 3, 1, "", "set_recipe_remainder"]], "mcaddon.item.ItemStack": [[1, 4, 1, "", "count"], [1, 4, 1, "", "data"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "item"]], "mcaddon.item.ItemStorageComponent": [[1, 4, 1, "", "capacity"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.LiquidClippedComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.MaxDamageComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.MaxStackSizeComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.PortfolioComponent": [[1, 2, 1, "", "id"]], "mcaddon.item.ProjectileComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "minimum_critical_power"], [1, 4, 1, "", "projectile_entity"]], "mcaddon.item.RecordComponent": [[1, 4, 1, "", "comparator_signal"], [1, 4, 1, "", "duration"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "sound_event"]], "mcaddon.item.RepairableComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "repair_items"]], "mcaddon.item.SeedComponent": [[1, 4, 1, "", "crop_result"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.ShooterComponent": [[1, 3, 1, "", "add_ammunition"], [1, 4, 1, "", "ammunition"], [1, 4, 1, "", "charge_on_draw"], [1, 3, 1, "", "clear_ammunitions"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "max_draw_duration"], [1, 3, 1, "", "remove_ammunition"], [1, 4, 1, "", "scale_power_by_draw_duration"]], "mcaddon.item.ShouldDespawnComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.SimpleItemComponent": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "value"]], "mcaddon.item.StackedByDataComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.TagsComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "tags"]], "mcaddon.item.ThrowableComponent": [[1, 4, 1, "", "do_swing_animation"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "launch_power_scale"], [1, 4, 1, "", "max_draw_duration"], [1, 4, 1, "", "max_launch_power"], [1, 4, 1, "", "min_draw_duration"], [1, 4, 1, "", "scale_power_by_draw_duration"]], "mcaddon.item.UseAnimationComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.UseDurationComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.UseModifiersComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "movement_modifier"], [1, 4, 1, "", "use_duration"]], "mcaddon.item.WearableComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "protection"], [1, 4, 1, "", "slot"]], "mcaddon.loot": [[1, 1, 1, "", "Enchant"], [1, 1, 1, "", "EnchantBookForTradingLootFunction"], [1, 1, 1, "", "EnchantRandomGearLootFunction"], [1, 1, 1, "", "EnchantRandomlyLootFunction"], [1, 1, 1, "", "EnchantWithLevelsLootFunction"], [1, 1, 1, "", "ExplorationMapLootFunction"], [1, 1, 1, "", "FillContainerLootFunction"], [1, 1, 1, "", "FurnaceSmeltLootFunction"], [1, 1, 1, "", "HasMarkvariantLootCondition"], [1, 1, 1, "", "ItemEntry"], [1, 1, 1, "", "KilledByEntityLootCondition"], [1, 1, 1, "", "KilledByPlayerLootCondition"], [1, 1, 1, "", "KilledByPlayerOrPetsLootCondition"], [1, 1, 1, "", "LeafEntry"], [1, 1, 1, "", "LootCondition"], [1, 1, 1, "", "LootEntry"], [1, 1, 1, "", "LootFunction"], [1, 1, 1, "", "LootNumberProvider"], [1, 1, 1, "", "LootPool"], [1, 1, 1, "", "LootPoolEntry"], [1, 1, 1, "", "LootTable"], [1, 1, 1, "", "LootTiers"], [1, 1, 1, "", "LootingEnchantLootFunction"], [1, 1, 1, "", "MatchToolLootCondition"], [1, 1, 1, "", "RandomAuxValueLootFunction"], [1, 1, 1, "", "RandomBlockStateLootFunction"], [1, 1, 1, "", "RandomChanceLootCondition"], [1, 1, 1, "", "RandomChanceWithLootingLootCondition"], [1, 1, 1, "", "RandomDifficultyChanceLootCondition"], [1, 1, 1, "", "RandomDyeLootFunction"], [1, 1, 1, "", "RandomRegionalDifficultyChanceLootCondition"], [1, 1, 1, "", "SetActorIdLootFunction"], [1, 1, 1, "", "SetBannerDetailsLootFunction"], [1, 1, 1, "", "SetBookContentsLootFunction"], [1, 1, 1, "", "SetCountLootFunction"], [1, 1, 1, "", "SetDamageLootFunction"], [1, 1, 1, "", "SetDataFromColorIndexLootFunction"], [1, 1, 1, "", "SetDataLootFunction"], [1, 1, 1, "", "SetLoreLootFunction"], [1, 1, 1, "", "SetNameLootFunction"], [1, 1, 1, "", "SpecificEnchantsLootFunction"], [1, 1, 1, "", "TraderMaterialTypeLootFunction"], [1, 5, 1, "", "loot_condition"], [1, 5, 1, "", "loot_function"], [1, 5, 1, "", "pool_entry"]], "mcaddon.loot.Enchant": [[1, 3, 1, "", "from_dict"]], "mcaddon.loot.EnchantBookForTradingLootFunction": [[1, 4, 1, "", "base_cost"], [1, 4, 1, "", "base_random_cost"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "per_level_cost"], [1, 4, 1, "", "per_level_random_cost"]], "mcaddon.loot.EnchantRandomGearLootFunction": [[1, 4, 1, "", "chance"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.EnchantRandomlyLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "treasure"]], "mcaddon.loot.EnchantWithLevelsLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "levels"], [1, 4, 1, "", "treasure"]], "mcaddon.loot.ExplorationMapLootFunction": [[1, 4, 1, "", "destination"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.FillContainerLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "loot_table"]], "mcaddon.loot.FurnaceSmeltLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.HasMarkvariantLootCondition": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "value"]], "mcaddon.loot.ItemEntry": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "name"]], "mcaddon.loot.KilledByEntityLootCondition": [[1, 4, 1, "", "entity_type"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.KilledByPlayerLootCondition": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.KilledByPlayerOrPetsLootCondition": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.LeafEntry": [[1, 3, 1, "", "add_condition"], [1, 3, 1, "", "add_function"], [1, 3, 1, "", "clear_conditions"], [1, 3, 1, "", "clear_functions"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "functions"], [1, 3, 1, "", "get_condition"], [1, 3, 1, "", "get_function"], [1, 4, 1, "", "quality"], [1, 3, 1, "", "remove_condition"], [1, 3, 1, "", "remove_function"], [1, 4, 1, "", "weight"]], "mcaddon.loot.LootEntry": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "name"]], "mcaddon.loot.LootNumberProvider": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "max"], [1, 4, 1, "", "min"]], "mcaddon.loot.LootPool": [[1, 3, 1, "", "add_condition"], [1, 3, 1, "", "add_entry"], [1, 3, 1, "", "add_function"], [1, 4, 1, "", "bonus_rolls"], [1, 3, 1, "", "clear_conditions"], [1, 3, 1, "", "clear_entries"], [1, 3, 1, "", "clear_functions"], [1, 4, 1, "", "conditions"], [1, 4, 1, "", "entries"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "functions"], [1, 3, 1, "", "get_condition"], [1, 3, 1, "", "get_entry"], [1, 3, 1, "", "get_function"], [1, 3, 1, "", "remove_condition"], [1, 3, 1, "", "remove_entry"], [1, 3, 1, "", "remove_function"], [1, 4, 1, "", "rolls"], [1, 4, 1, "", "tiers"]], "mcaddon.loot.LootPoolEntry": [[1, 4, 1, "", "conditions"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "id"]], "mcaddon.loot.LootTable": [[1, 3, 1, "", "add_function"], [1, 3, 1, "", "add_pool"], [1, 3, 1, "", "block"], [1, 3, 1, "", "clear_functions"], [1, 3, 1, "", "clear_pools"], [1, 2, 1, "", "dirname"], [1, 2, 1, "", "extension"], [1, 2, 1, "", "filename"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "functions"], [1, 3, 1, "", "get_function"], [1, 3, 1, "", "get_pool"], [1, 4, 1, "", "pools"], [1, 3, 1, "", "remove_function"], [1, 3, 1, "", "remove_pool"], [1, 4, 1, "", "type"]], "mcaddon.loot.LootTiers": [[1, 4, 1, "", "bonus_chance"], [1, 4, 1, "", "bonus_rolls"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "initial_range"]], "mcaddon.loot.LootingEnchantLootFunction": [[1, 4, 1, "", "count"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.MatchToolLootCondition": [[1, 4, 1, "", "count"], [1, 4, 1, "", "durability"], [1, 4, 1, "", "enchantments"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "item"]], "mcaddon.loot.RandomAuxValueLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "values"]], "mcaddon.loot.RandomBlockStateLootFunction": [[1, 4, 1, "", "block_state"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "values"]], "mcaddon.loot.RandomChanceLootCondition": [[1, 4, 1, "", "chance"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.RandomChanceWithLootingLootCondition": [[1, 4, 1, "", "chance"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "looting_multiplier"]], "mcaddon.loot.RandomDifficultyChanceLootCondition": [[1, 4, 1, "", "default_chance"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "hard"], [1, 2, 1, "", "id"], [1, 4, 1, "", "peaceful"]], "mcaddon.loot.RandomDyeLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.RandomRegionalDifficultyChanceLootCondition": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "max_chance"]], "mcaddon.loot.SetActorIdLootFunction": [[1, 4, 1, "", "actor_id"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.SetBannerDetailsLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "type"]], "mcaddon.loot.SetBookContentsLootFunction": [[1, 4, 1, "", "author"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "pages"], [1, 4, 1, "", "title"]], "mcaddon.loot.SetCountLootFunction": [[1, 4, 1, "", "count"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.SetDamageLootFunction": [[1, 4, 1, "", "damage"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.SetDataFromColorIndexLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.SetDataLootFunction": [[1, 4, 1, "", "data"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.SetLoreLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "lore"]], "mcaddon.loot.SetNameLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "name"]], "mcaddon.loot.SpecificEnchantsLootFunction": [[1, 4, 1, "", "enchantments"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.TraderMaterialTypeLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.manifest": [[1, 1, 1, "", "Dependency"], [1, 1, 1, "", "Header"], [1, 1, 1, "", "Manifest"], [1, 1, 1, "", "ManifestLoader"], [1, 1, 1, "", "Metadata"], [1, 1, 1, "", "Module"]], "mcaddon.manifest.Dependency": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "uuid"], [1, 4, 1, "", "version"]], "mcaddon.manifest.Header": [[1, 4, 1, "", "allow_random_seed"], [1, 4, 1, "", "base_game_version"], [1, 4, 1, "", "description"], [1, 4, 1, "", "description_key"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "lock_template_options"], [1, 4, 1, "", "min_engine_version"], [1, 4, 1, "", "name"], [1, 4, 1, "", "name_key"], [1, 4, 1, "", "uuid"], [1, 4, 1, "", "version"]], "mcaddon.manifest.Manifest": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "add_dependency"], [1, 3, 1, "", "add_module"], [1, 3, 1, "", "behavior"], [1, 3, 1, "", "clear_dependencies"], [1, 3, 1, "", "clear_modules"], [1, 4, 1, "", "dependencies"], [1, 4, 1, "", "description"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_dependency"], [1, 3, 1, "", "get_module"], [1, 4, 1, "", "header"], [1, 4, 1, "", "metadata"], [1, 4, 1, "", "modules"], [1, 4, 1, "", "name"], [1, 3, 1, "", "remove_dependency"], [1, 3, 1, "", "remove_module"], [1, 3, 1, "", "resource"], [1, 3, 1, "", "set_module"], [1, 3, 1, "", "set_uuids"], [1, 3, 1, "", "world_template"]], "mcaddon.manifest.ManifestLoader": [[1, 2, 1, "", "name"]], "mcaddon.manifest.Metadata": [[1, 3, 1, "", "add_author"], [1, 4, 1, "", "authors"], [1, 3, 1, "", "clear_authors"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_author"], [1, 4, 1, "", "license"], [1, 3, 1, "", "remove_author"], [1, 4, 1, "", "url"]], "mcaddon.manifest.Module": [[1, 3, 1, "", "client_data"], [1, 3, 1, "", "data"], [1, 4, 1, "", "description"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "interface"], [1, 3, 1, "", "resources"], [1, 4, 1, "", "type"], [1, 4, 1, "", "uuid"], [1, 4, 1, "", "version"], [1, 3, 1, "", "world_template"]], "mcaddon.pack": [[1, 1, 1, "", "Addon"], [1, 1, 1, "", "BehaviorPack"], [1, 1, 1, "", "Pack"], [1, 1, 1, "", "ResourcePack"]], "mcaddon.pack.Addon": [[1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "add"], [1, 3, 1, "", "add_block"], [1, 3, 1, "", "add_item"], [1, 3, 1, "", "add_item_texture"], [1, 3, 1, "", "add_loot_table"], [1, 3, 1, "", "add_pack"], [1, 3, 1, "", "add_recipe"], [1, 3, 1, "", "add_terrain_texture"], [1, 3, 1, "", "add_volume"], [1, 3, 1, "", "clear_packs"], [1, 3, 1, "", "get"], [1, 3, 1, "", "get_pack"], [1, 2, 1, "", "id"], [1, 3, 1, "", "import_to"], [1, 3, 1, "", "load"], [1, 4, 1, "", "manifests"], [1, 4, 1, "", "packs"], [1, 3, 1, "", "readdir"], [1, 3, 1, "", "readzip"], [1, 3, 1, "", "remove_pack"], [1, 3, 1, "", "setup"], [1, 3, 1, "", "writedir"], [1, 3, 1, "", "writezip"]], "mcaddon.pack.BehaviorPack": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 4, 1, "", "MANIFEST"], [1, 3, 1, "", "add"], [1, 3, 1, "", "add_block"], [1, 3, 1, "", "add_item"], [1, 3, 1, "", "add_recipe"], [1, 3, 1, "", "add_volume"], [1, 3, 1, "", "clear_blocks"], [1, 3, 1, "", "clear_items"], [1, 3, 1, "", "clear_recipes"], [1, 3, 1, "", "clear_volumes"], [1, 3, 1, "", "get_block"], [1, 3, 1, "", "get_item"], [1, 3, 1, "", "get_recipe"], [1, 3, 1, "", "get_volume"], [1, 2, 1, "", "id"], [1, 3, 1, "", "import_to"], [1, 3, 1, "", "load"], [1, 3, 1, "", "merge"], [1, 3, 1, "", "readdir"], [1, 3, 1, "", "readzip"], [1, 3, 1, "", "remove_block"], [1, 3, 1, "", "remove_item"], [1, 3, 1, "", "remove_recipe"], [1, 3, 1, "", "remove_volume"], [1, 3, 1, "", "setup"], [1, 2, 1, "", "suffix"], [1, 3, 1, "", "writedir"], [1, 3, 1, "", "writezip"]], "mcaddon.pack.Pack": [[1, 3, 1, "", "add_file"], [1, 3, 1, "", "clear_files"], [1, 4, 1, "", "description"], [1, 4, 1, "", "file_types"], [1, 3, 1, "", "get_file"], [1, 4, 1, "", "manifest"], [1, 4, 1, "", "name"], [1, 3, 1, "", "remove_file"], [1, 3, 1, "", "set_details"], [1, 3, 1, "", "set_uuids"], [1, 4, 1, "", "suffix"], [1, 4, 1, "", "texts"], [1, 4, 1, "", "versions"], [1, 3, 1, "", "writedir"], [1, 3, 1, "", "writezip"]], "mcaddon.pack.ResourcePack": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 4, 1, "", "MANIFEST"], [1, 3, 1, "", "add"], [1, 3, 1, "", "add_block"], [1, 3, 1, "", "add_item"], [1, 3, 1, "", "add_item_texture"], [1, 3, 1, "", "add_terrain_texture"], [1, 4, 1, "", "blocks"], [1, 3, 1, "", "clear_block"], [1, 3, 1, "", "clear_item"], [1, 3, 1, "", "clear_item_texture"], [1, 3, 1, "", "clear_terrain_texture"], [1, 3, 1, "", "get_block"], [1, 3, 1, "", "get_item"], [1, 3, 1, "", "get_item_texture"], [1, 3, 1, "", "get_terrain_texture"], [1, 2, 1, "", "id"], [1, 3, 1, "", "import_to"], [1, 4, 1, "", "items"], [1, 3, 1, "", "load"], [1, 3, 1, "", "merge"], [1, 3, 1, "", "readdir"], [1, 3, 1, "", "readzip"], [1, 3, 1, "", "remove_block"], [1, 3, 1, "", "remove_item"], [1, 3, 1, "", "remove_item_texture"], [1, 3, 1, "", "remove_terrain_texture"], [1, 3, 1, "", "setup"], [1, 2, 1, "", "suffix"], [1, 3, 1, "", "writedir"], [1, 3, 1, "", "writezip"]], "mcaddon.recipe": [[1, 1, 1, "", "BrewingContainerRecipe"], [1, 1, 1, "", "BrewingContainerRecipeLoader"], [1, 1, 1, "", "BrewingMixRecipe"], [1, 1, 1, "", "BrewingMixRecipeLoader"], [1, 1, 1, "", "FurnaceRecipe"], [1, 1, 1, "", "FurnaceRecipeLoader"], [1, 1, 1, "", "Ingredient"], [1, 1, 1, "", "MaterialReductionRecipe"], [1, 1, 1, "", "MaterialReductionRecipeLoader"], [1, 1, 1, "", "Recipe"], [1, 1, 1, "", "ShapedRecipe"], [1, 1, 1, "", "ShapedRecipeLoader"], [1, 1, 1, "", "ShapelessRecipe"], [1, 1, 1, "", "ShapelessRecipeLoader"], [1, 1, 1, "", "SmithingTransformRecipe"], [1, 1, 1, "", "SmithingTransformRecipeLoader"], [1, 1, 1, "", "SmithingTrimRecipe"], [1, 1, 1, "", "SmithingTrimRecipeLoader"], [1, 1, 1, "", "StonecuttingRecipe"], [1, 5, 1, "", "recipe_type"]], "mcaddon.recipe.BrewingContainerRecipe": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "input"], [1, 4, 1, "", "output"], [1, 4, 1, "", "reagent"]], "mcaddon.recipe.BrewingContainerRecipeLoader": [[1, 2, 1, "", "name"]], "mcaddon.recipe.BrewingMixRecipe": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "input"], [1, 4, 1, "", "output"], [1, 4, 1, "", "reagent"]], "mcaddon.recipe.BrewingMixRecipeLoader": [[1, 2, 1, "", "name"]], "mcaddon.recipe.FurnaceRecipe": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "input"], [1, 4, 1, "", "output"]], "mcaddon.recipe.FurnaceRecipeLoader": [[1, 2, 1, "", "name"]], "mcaddon.recipe.Ingredient": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "item"], [1, 4, 1, "", "tag"]], "mcaddon.recipe.MaterialReductionRecipe": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "input"], [1, 4, 1, "", "output"]], "mcaddon.recipe.MaterialReductionRecipeLoader": [[1, 2, 1, "", "mame"]], "mcaddon.recipe.Recipe": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "add_tag"], [1, 3, 1, "", "clear_tags"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "id"], [1, 3, 1, "", "remove_tag"], [1, 4, 1, "", "result"], [1, 4, 1, "", "tags"]], "mcaddon.recipe.ShapedRecipe": [[1, 3, 1, "", "add_key"], [1, 3, 1, "", "clear_keys"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "key"], [1, 4, 1, "", "pattern"], [1, 3, 1, "", "remove_key"]], "mcaddon.recipe.ShapedRecipeLoader": [[1, 2, 1, "", "name"]], "mcaddon.recipe.ShapelessRecipe": [[1, 3, 1, "", "add_ingredient"], [1, 3, 1, "", "clear_ingredients"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "ingredients"], [1, 3, 1, "", "remove_ingredient"]], "mcaddon.recipe.ShapelessRecipeLoader": [[1, 2, 1, "", "name"]], "mcaddon.recipe.SmithingTransformRecipe": [[1, 4, 1, "", "addition"], [1, 4, 1, "", "base"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "result"], [1, 4, 1, "", "template"]], "mcaddon.recipe.SmithingTransformRecipeLoader": [[1, 2, 1, "", "name"]], "mcaddon.recipe.SmithingTrimRecipe": [[1, 4, 1, "", "addition"], [1, 4, 1, "", "base"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "template"]], "mcaddon.recipe.SmithingTrimRecipeLoader": [[1, 2, 1, "", "name"]], "mcaddon.registry": [[1, 1, 1, "", "Registries"], [1, 1, 1, "", "Registry"], [1, 1, 1, "", "RegistryKey"]], "mcaddon.registry.Registries": [[1, 2, 1, "", "BLOCK_COMPONENT_TYPE"], [1, 2, 1, "", "BLOCK_STATE"], [1, 2, 1, "", "BLOCK_TRAIT"], [1, 2, 1, "", "BLOCK_TYPE"], [1, 2, 1, "", "EVENT_TYPE"], [1, 2, 1, "", "ITEM_COMPONENT_TYPE"], [1, 2, 1, "", "LOOT_CONDITION_TYPE"], [1, 2, 1, "", "LOOT_FUNCTION_TYPE"], [1, 2, 1, "", "POOL_ENTRY_TYPE"], [1, 2, 1, "", "RECIPE_TYPE"], [1, 2, 1, "", "VOLUME_COMPONENT_TYPE"]], "mcaddon.registry.Registry": [[1, 3, 1, "", "create_registry"], [1, 3, 1, "", "get_registry"], [1, 3, 1, "", "register"]], "mcaddon.registry.RegistryKey": [[1, 3, 1, "", "get"], [1, 3, 1, "", "items"], [1, 3, 1, "", "keys"], [1, 3, 1, "", "register"], [1, 3, 1, "", "values"]], "mcaddon.resrouce": [[1, 1, 1, "", "FlipbookTexture"], [1, 1, 1, "", "ItemAtlas"], [1, 1, 1, "", "ItemTexture"], [1, 1, 1, "", "TerrainAtlas"], [1, 1, 1, "", "TerrainTexture"], [1, 1, 1, "", "Texture"]], "mcaddon.resrouce.FlipbookTexture": [[1, 4, 1, "", "atlas_index"], [1, 4, 1, "", "atlas_tile"], [1, 4, 1, "", "atlas_tile_variant"], [1, 4, 1, "", "blend_frames"], [1, 4, 1, "", "frames"], [1, 4, 1, "", "replicate"], [1, 4, 1, "", "ticks_per_frame"]], "mcaddon.resrouce.ItemAtlas": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 2, 1, "", "identifier"]], "mcaddon.resrouce.ItemTexture": [[1, 2, 1, "", "dirname"]], "mcaddon.resrouce.TerrainAtlas": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 2, 1, "", "identifier"], [1, 4, 1, "", "num_mip_levels"], [1, 4, 1, "", "padding"]], "mcaddon.resrouce.TerrainTexture": [[1, 2, 1, "", "dirname"]], "mcaddon.resrouce.Texture": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "load"], [1, 4, 1, "", "path"], [1, 3, 1, "", "save"]], "mcaddon.schemas": [[2, 0, 0, "-", "block"], [2, 0, 0, "-", "camera"], [2, 0, 0, "-", "item"], [2, 0, 0, "-", "manifest"], [2, 0, 0, "-", "recipe"], [2, 0, 0, "-", "volume"]], "mcaddon.schemas.block": [[2, 1, 1, "", "BlockSchema1"]], "mcaddon.schemas.block.BlockSchema1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.camera": [[2, 1, 1, "", "CameraPresetSchem1"]], "mcaddon.schemas.camera.CameraPresetSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.item": [[2, 1, 1, "", "ItemSchema1"], [2, 1, 1, "", "ItemSchema2"]], "mcaddon.schemas.item.ItemSchema1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.item.ItemSchema2": [[2, 3, 1, "", "load"]], "mcaddon.schemas.manifest": [[2, 1, 1, "", "ManifestSchema1"]], "mcaddon.schemas.manifest.ManifestSchema1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe": [[2, 1, 1, "", "BrewingContainerSchem1"], [2, 1, 1, "", "BrewingMixSchem1"], [2, 1, 1, "", "FurnaceSchem1"], [2, 1, 1, "", "MaterialReductionSchem1"], [2, 1, 1, "", "ShapedSchem1"], [2, 1, 1, "", "ShapelessSchem1"], [2, 1, 1, "", "SmithingTransformSchem1"], [2, 1, 1, "", "SmithingTransformSchem2"], [2, 1, 1, "", "SmithingTrimSchem1"]], "mcaddon.schemas.recipe.BrewingContainerSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.BrewingMixSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.FurnaceSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.MaterialReductionSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.ShapedSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.ShapelessSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.SmithingTransformSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.SmithingTransformSchem2": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.SmithingTrimSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.volume": [[2, 1, 1, "", "VolumeSchema1"]], "mcaddon.schemas.volume.VolumeSchema1": [[2, 3, 1, "", "load"]], "mcaddon.state": [[1, 1, 1, "", "ActiveState"], [1, 1, 1, "", "AgeBitState"], [1, 1, 1, "", "AgeState"], [1, 1, 1, "", "AllowUnderwaterBitState"], [1, 1, 1, "", "AttachedBitState"], [1, 1, 1, "", "AttachmentState"], [1, 1, 1, "", "BambooLeafSizeState"], [1, 1, 1, "", "BambooStalkThicknessState"], [1, 1, 1, "", "BigDripleafTiltState"], [1, 1, 1, "", "BiteCounterState"], [1, 1, 1, "", "BlockFaceState"], [1, 1, 1, "", "BlockState"], [1, 1, 1, "", "BooksStoredState"], [1, 1, 1, "", "BooleanState"], [1, 1, 1, "", "BrewingStandSlotABitState"], [1, 1, 1, "", "BrewingStandSlotBBitState"], [1, 1, 1, "", "BrewingStandSlotCBitState"], [1, 1, 1, "", "BrushedProgressState"], [1, 1, 1, "", "ButtonPressedBitState"], [1, 1, 1, "", "CandlesState"], [1, 1, 1, "", "CardinalDirectionState"], [1, 1, 1, "", "CauldronLiquidState"], [1, 1, 1, "", "ChemistryTableTypeState"], [1, 1, 1, "", "ChiselTypeState"], [1, 1, 1, "", "ClusterCountState"], [1, 1, 1, "", "ColorBitState"], [1, 1, 1, "", "ColorState"], [1, 1, 1, "", "ConditionalBitState"], [1, 1, 1, "", "CoralColorState"], [1, 1, 1, "", "CoralDirectionState"], [1, 1, 1, "", "CoralHangTypeBitState"], [1, 1, 1, "", "CoveredBitState"], [1, 1, 1, "", "CrackedState"], [1, 1, 1, "", "CraftingState"], [1, 1, 1, "", "DamageState"], [1, 1, 1, "", "DeadBitState"], [1, 1, 1, "", "DirectionState"], [1, 1, 1, "", "DirtTypeState"], [1, 1, 1, "", "DisarmedBitState"], [1, 1, 1, "", "DoorHingeBitState"], [1, 1, 1, "", "DoublePlantTypeState"], [1, 1, 1, "", "DragDownState"], [1, 1, 1, "", "DripstoneThicknessState"], [1, 1, 1, "", "EndPortalEyeBitState"], [1, 1, 1, "", "ExplodeBitState"], [1, 1, 1, "", "FacingDirectionState"], [1, 1, 1, "", "FillLevelState"], [1, 1, 1, "", "FlowerTypeState"], [1, 1, 1, "", "GroundSignDirectionState"], [1, 1, 1, "", "GrowthState"], [1, 1, 1, "", "HangingState"], [1, 1, 1, "", "HeadPieceBitState"], [1, 1, 1, "", "HeightState"], [1, 1, 1, "", "HugeMushroomBitsState"], [1, 1, 1, "", "InWallBitState"], [1, 1, 1, "", "InfiniburnBitState"], [1, 1, 1, "", "IntegerState"], [1, 1, 1, "", "ItemFrameMapBitState"], [1, 1, 1, "", "ItemFramePhotoBitState"], [1, 1, 1, "", "LiquidDepthState"], [1, 1, 1, "", "MoisturizedAmountState"], [1, 1, 1, "", "MonsterEggStoneTypeState"], [1, 1, 1, "", "NewLeafTypeState"], [1, 1, 1, "", "NewLogTypeState"], [1, 1, 1, "", "NoDropBitState"], [1, 1, 1, "", "OccupiedBitState"], [1, 1, 1, "", "OldLeafTypeState"], [1, 1, 1, "", "OldLogTypeState"], [1, 1, 1, "", "OpenBitState"], [1, 1, 1, "", "OrientationState"], [1, 1, 1, "", "OutputLitBitState"], [1, 1, 1, "", "OutputSubtractBitState"], [1, 1, 1, "", "PersistentBitState"], [1, 1, 1, "", "PortalAxisState"], [1, 1, 1, "", "PoweredBitState"], [1, 1, 1, "", "RailDataBitState"], [1, 1, 1, "", "RailDirectionState"], [1, 1, 1, "", "RedstoneSignalState"], [1, 1, 1, "", "RepeaterDelayState"], [1, 1, 1, "", "SandStoneTypeState"], [1, 1, 1, "", "SandTypeState"], [1, 1, 1, "", "SaplingTypeState"], [1, 1, 1, "", "SculkSensorPhaseState"], [1, 1, 1, "", "SeaGrassTypeState"], [1, 1, 1, "", "SpongeTypeState"], [1, 1, 1, "", "StabilityCheckState"], [1, 1, 1, "", "StabilityState"], [1, 1, 1, "", "StoneBrickTypeState"], [1, 1, 1, "", "StoneSlabType2State"], [1, 1, 1, "", "StoneSlabType3State"], [1, 1, 1, "", "StoneSlabType4State"], [1, 1, 1, "", "StoneSlabTypeState"], [1, 1, 1, "", "StoneTypeState"], [1, 1, 1, "", "StrippedBitState"], [1, 1, 1, "", "StructureBlockTypeState"], [1, 1, 1, "", "StructureVoidTypeState"], [1, 1, 1, "", "SuspendedBitState"], [1, 1, 1, "", "TallGrassTypeState"], [1, 1, 1, "", "ToggleBitState"], [1, 1, 1, "", "TopSlotBitState"], [1, 1, 1, "", "TorchFacingDirectionState"], [1, 1, 1, "", "TriggedBitState"], [1, 1, 1, "", "TurtleEggCountState"], [1, 1, 1, "", "UpdateBitState"], [1, 1, 1, "", "UpperBlockBitState"], [1, 1, 1, "", "UpsideDownBitState"], [1, 1, 1, "", "VerticalHalfState"], [1, 1, 1, "", "VineDirectionBitsState"], [1, 1, 1, "", "WallBlockTypeState"], [1, 1, 1, "", "WallConnectionTypEastState"], [1, 1, 1, "", "WallConnectionTypeNorthState"], [1, 1, 1, "", "WallConnectionTypeSouthState"], [1, 1, 1, "", "WallConnectionTypeWestState"], [1, 1, 1, "", "WallPostBitState"], [1, 1, 1, "", "WeirdoDirectionState"], [1, 1, 1, "", "WoodTypeState"], [1, 5, 1, "", "state"]], "mcaddon.state.ActiveState": [[1, 2, 1, "", "id"]], "mcaddon.state.AgeBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.AgeState": [[1, 2, 1, "", "id"]], "mcaddon.state.AllowUnderwaterBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.AttachedBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.AttachmentState": [[1, 2, 1, "", "id"]], "mcaddon.state.BambooLeafSizeState": [[1, 2, 1, "", "id"]], "mcaddon.state.BambooStalkThicknessState": [[1, 2, 1, "", "id"]], "mcaddon.state.BigDripleafTiltState": [[1, 2, 1, "", "id"]], "mcaddon.state.BiteCounterState": [[1, 2, 1, "", "id"]], "mcaddon.state.BlockFaceState": [[1, 2, 1, "", "id"]], "mcaddon.state.BlockState": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "id"], [1, 4, 1, "", "values"]], "mcaddon.state.BooksStoredState": [[1, 2, 1, "", "id"]], "mcaddon.state.BrewingStandSlotABitState": [[1, 2, 1, "", "id"]], "mcaddon.state.BrewingStandSlotBBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.BrewingStandSlotCBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.BrushedProgressState": [[1, 2, 1, "", "id"]], "mcaddon.state.ButtonPressedBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.CandlesState": [[1, 2, 1, "", "id"]], "mcaddon.state.CardinalDirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.CauldronLiquidState": [[1, 2, 1, "", "id"]], "mcaddon.state.ChemistryTableTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.ChiselTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.ClusterCountState": [[1, 2, 1, "", "id"]], "mcaddon.state.ColorBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.ColorState": [[1, 2, 1, "", "id"]], "mcaddon.state.ConditionalBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.CoralColorState": [[1, 2, 1, "", "id"]], "mcaddon.state.CoralDirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.CoralHangTypeBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.CoveredBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.CrackedState": [[1, 2, 1, "", "id"]], "mcaddon.state.CraftingState": [[1, 2, 1, "", "id"]], "mcaddon.state.DamageState": [[1, 2, 1, "", "id"]], "mcaddon.state.DeadBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.DirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.DirtTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.DisarmedBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.DoorHingeBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.DoublePlantTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.DragDownState": [[1, 2, 1, "", "id"]], "mcaddon.state.DripstoneThicknessState": [[1, 2, 1, "", "id"]], "mcaddon.state.EndPortalEyeBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.ExplodeBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.FacingDirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.FillLevelState": [[1, 2, 1, "", "id"]], "mcaddon.state.FlowerTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.GroundSignDirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.GrowthState": [[1, 2, 1, "", "id"]], "mcaddon.state.HangingState": [[1, 2, 1, "", "id"]], "mcaddon.state.HeadPieceBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.HeightState": [[1, 2, 1, "", "id"]], "mcaddon.state.HugeMushroomBitsState": [[1, 2, 1, "", "id"]], "mcaddon.state.InWallBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.InfiniburnBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.ItemFrameMapBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.ItemFramePhotoBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.LiquidDepthState": [[1, 2, 1, "", "id"]], "mcaddon.state.MoisturizedAmountState": [[1, 2, 1, "", "id"]], "mcaddon.state.MonsterEggStoneTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.NewLeafTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.NewLogTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.NoDropBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.OccupiedBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.OldLeafTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.OldLogTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.OpenBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.OrientationState": [[1, 2, 1, "", "id"]], "mcaddon.state.OutputLitBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.OutputSubtractBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.PersistentBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.PortalAxisState": [[1, 2, 1, "", "id"]], "mcaddon.state.PoweredBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.RailDataBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.RailDirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.RedstoneSignalState": [[1, 2, 1, "", "id"]], "mcaddon.state.RepeaterDelayState": [[1, 2, 1, "", "id"]], "mcaddon.state.SandStoneTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.SandTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.SaplingTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.SculkSensorPhaseState": [[1, 2, 1, "", "id"]], "mcaddon.state.SeaGrassTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.SpongeTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.StabilityCheckState": [[1, 2, 1, "", "id"]], "mcaddon.state.StabilityState": [[1, 2, 1, "", "id"]], "mcaddon.state.StoneBrickTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.StoneSlabType2State": [[1, 2, 1, "", "id"]], "mcaddon.state.StoneSlabType3State": [[1, 2, 1, "", "id"]], "mcaddon.state.StoneSlabType4State": [[1, 2, 1, "", "id"]], "mcaddon.state.StoneSlabTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.StoneTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.StrippedBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.StructureBlockTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.StructureVoidTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.SuspendedBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.TallGrassTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.ToggleBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.TopSlotBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.TorchFacingDirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.TriggedBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.TurtleEggCountState": [[1, 2, 1, "", "id"]], "mcaddon.state.UpdateBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.UpperBlockBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.UpsideDownBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.VerticalHalfState": [[1, 2, 1, "", "id"]], "mcaddon.state.VineDirectionBitsState": [[1, 2, 1, "", "id"]], "mcaddon.state.WallBlockTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.WallConnectionTypEastState": [[1, 2, 1, "", "id"]], "mcaddon.state.WallConnectionTypeNorthState": [[1, 2, 1, "", "id"]], "mcaddon.state.WallConnectionTypeSouthState": [[1, 2, 1, "", "id"]], "mcaddon.state.WallConnectionTypeWestState": [[1, 2, 1, "", "id"]], "mcaddon.state.WallPostBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.WeirdoDirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.WoodTypeState": [[1, 2, 1, "", "id"]], "mcaddon.text": [[1, 1, 1, "", "Text"]], "mcaddon.util": [[1, 1, 1, "", "Box"], [1, 2, 1, "", "ID"], [1, 1, 1, "", "Identifiable"], [1, 1, 1, "", "Identifier"], [1, 1, 1, "", "MenuCategory"], [1, 1, 1, "", "Version"], [1, 5, 1, "", "getattr2"], [1, 5, 1, "", "stringify"]], "mcaddon.util.Box": [[1, 3, 1, "", "cube"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "is_cube"], [1, 3, 1, "", "is_none"], [1, 3, 1, "", "none"], [1, 4, 1, "", "origin"], [1, 4, 1, "", "size"]], "mcaddon.util.Identifiable": [[1, 4, 1, "", "identifier"]], "mcaddon.util.Identifier": [[1, 2, 1, "", "DEFAULT_NAMESPACE"], [1, 2, 1, "", "SEPERATOR"], [1, 3, 1, "", "copy"], [1, 3, 1, "", "copy_with_namespace"], [1, 3, 1, "", "copy_with_path"], [1, 3, 1, "", "is_namespace_valid"], [1, 3, 1, "", "is_path_valid"], [1, 4, 1, "", "namespace"], [1, 3, 1, "", "parse"], [1, 4, 1, "", "path"], [1, 3, 1, "", "replace"], [1, 3, 1, "", "split"]], "mcaddon.util.MenuCategory": [[1, 4, 1, "", "category"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "group"], [1, 4, 1, "", "is_hidden_in_commands"]], "mcaddon.util.Version": [[1, 4, 1, "", "major"], [1, 4, 1, "", "minor"], [1, 3, 1, "", "parse"], [1, 4, 1, "", "patch"]], "mcaddon.volume": [[1, 1, 1, "", "FogComponent"], [1, 1, 1, "", "OnActorEnterComponent"], [1, 1, 1, "", "OnActorLeaveComponent"], [1, 1, 1, "", "Volume"], [1, 1, 1, "", "VolumeComponent"], [1, 1, 1, "", "VolumeLoader"], [1, 5, 1, "", "volume_component_type"]], "mcaddon.volume.FogComponent": [[1, 4, 1, "", "fog_identifier"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "priority"]], "mcaddon.volume.OnActorEnterComponent": [[1, 3, 1, "", "add_event"], [1, 3, 1, "", "clear_events"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_event"], [1, 2, 1, "", "id"], [1, 4, 1, "", "on_enter"], [1, 3, 1, "", "remove_event"]], "mcaddon.volume.OnActorLeaveComponent": [[1, 3, 1, "", "add_event"], [1, 3, 1, "", "clear_events"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_event"], [1, 2, 1, "", "id"], [1, 4, 1, "", "on_leave"], [1, 3, 1, "", "remove_event"]], "mcaddon.volume.Volume": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "add_component"], [1, 3, 1, "", "add_event"], [1, 3, 1, "", "clear_components"], [1, 3, 1, "", "clear_events"], [1, 4, 1, "", "components"], [1, 4, 1, "", "events"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_component"], [1, 3, 1, "", "get_event"], [1, 2, 1, "", "id"], [1, 3, 1, "", "remove_component"], [1, 3, 1, "", "remove_event"]], "mcaddon.volume.VolumeComponent": [[1, 3, 1, "", "from_dict"], [1, 3, 1, "", "json"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:method", "4": "py:property", "5": "py:function", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "method", "Python method"], "4": ["py", "property", "Python property"], "5": ["py", "function", "Python function"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"welcom": 0, "mcpackutil": 0, "": 0, "document": 0, "content": [0, 1, 2], "indic": 0, "tabl": 0, "packag": [1, 2], "subpackag": 1, "submodul": [1, 2], "addon": [], "modul": [1, 2, 4], "anim": [], "biom": [], "constant": 1, "event": 1, "featur": [], "fog": [], "loot": 1, "manifest": [1, 2], "pack": 1, "particl": [], "recip": [1, 2], "texture_set": [], "util": 1, "volum": [1, 2], "block": [1, 2], "compon": [], "state": 1, "trait": [], "entiti": [], "item": [1, 2], "setup": 4, "mcaddon": [1, 2, 3], "schema": 2, "test": [], "camera": [1, 2], "cli": 1, "except": 1, "file": 1, "registri": 1, "resrouc": 1, "text": 1, "ext": [], "extra": [], "vanilla": [], "item_set": []}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Welcome to mcpackutils\u2019s documentation!": [[0, "welcome-to-mcpackutils-s-documentation"]], "Contents:": [[0, null]], "Indices and tables": [[0, "indices-and-tables"]], "mcaddon package": [[1, "mcaddon-package"]], "Subpackages": [[1, "subpackages"]], "Submodules": [[1, "submodules"], [2, "submodules"]], "mcaddon.block module": [[1, "module-mcaddon.block"]], "mcaddon.camera module": [[1, "module-mcaddon.camera"]], "mcaddon.cli module": [[1, "module-mcaddon.cli"]], "mcaddon.constant module": [[1, "module-mcaddon.constant"]], "mcaddon.event module": [[1, "module-mcaddon.event"]], "mcaddon.exception module": [[1, "module-mcaddon.exception"]], "mcaddon.file module": [[1, "module-mcaddon.file"]], "mcaddon.item module": [[1, "module-mcaddon.item"]], "mcaddon.loot module": [[1, "module-mcaddon.loot"]], "mcaddon.manifest module": [[1, "module-mcaddon.manifest"]], "mcaddon.pack module": [[1, "module-mcaddon.pack"]], "mcaddon.recipe module": [[1, "module-mcaddon.recipe"]], "mcaddon.registry module": [[1, "module-mcaddon.registry"]], "mcaddon.resrouce module": [[1, "module-mcaddon.resrouce"]], "mcaddon.state module": [[1, "module-mcaddon.state"]], "mcaddon.text module": [[1, "module-mcaddon.text"]], "mcaddon.util module": [[1, "module-mcaddon.util"]], "mcaddon.volume module": [[1, "module-mcaddon.volume"]], "Module contents": [[1, "module-mcaddon"], [2, "module-mcaddon.schemas"]], "mcaddon.schemas package": [[2, "mcaddon-schemas-package"]], "mcaddon.schemas.block module": [[2, "module-mcaddon.schemas.block"]], "mcaddon.schemas.camera module": [[2, "module-mcaddon.schemas.camera"]], "mcaddon.schemas.item module": [[2, "module-mcaddon.schemas.item"]], "mcaddon.schemas.manifest module": [[2, "module-mcaddon.schemas.manifest"]], "mcaddon.schemas.recipe module": [[2, "module-mcaddon.schemas.recipe"]], "mcaddon.schemas.volume module": [[2, "module-mcaddon.schemas.volume"]], "mcaddon": [[3, "mcaddon"]], "setup module": [[4, "setup-module"]]}, "indexentries": {"activestate (class in mcaddon.state)": [[1, "mcaddon.state.ActiveState"]], "addmobeffect (class in mcaddon.event)": [[1, "mcaddon.event.AddMobEffect"]], "addon (class in mcaddon.pack)": [[1, "mcaddon.pack.Addon"]], "agebitstate (class in mcaddon.state)": [[1, "mcaddon.state.AgeBitState"]], "agestate (class in mcaddon.state)": [[1, "mcaddon.state.AgeState"]], "allowoffhandcomponent (class in mcaddon.item)": [[1, "mcaddon.item.AllowOffHandComponent"]], "allowunderwaterbitstate (class in mcaddon.state)": [[1, "mcaddon.state.AllowUnderwaterBitState"]], "archivefile (class in mcaddon.file)": [[1, "mcaddon.file.ArchiveFile"]], "attachedbitstate (class in mcaddon.state)": [[1, "mcaddon.state.AttachedBitState"]], "attachmentstate (class in mcaddon.state)": [[1, "mcaddon.state.AttachmentState"]], "block_component_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.BLOCK_COMPONENT_TYPE"]], "block_state (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.BLOCK_STATE"]], "block_trait (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.BLOCK_TRAIT"]], "block_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.BLOCK_TYPE"]], "bambooleafsizestate (class in mcaddon.state)": [[1, "mcaddon.state.BambooLeafSizeState"]], "bamboostalkthicknessstate (class in mcaddon.state)": [[1, "mcaddon.state.BambooStalkThicknessState"]], "behaviorpack (class in mcaddon.pack)": [[1, "mcaddon.pack.BehaviorPack"]], "bigdripleaftiltstate (class in mcaddon.state)": [[1, "mcaddon.state.BigDripleafTiltState"]], "bitecounterstate (class in mcaddon.state)": [[1, "mcaddon.state.BiteCounterState"]], "block (class in mcaddon.block)": [[1, "mcaddon.block.Block"]], "blockcomponent (class in mcaddon.block)": [[1, "mcaddon.block.BlockComponent"]], "blockcomponent2 (class in mcaddon.item)": [[1, "mcaddon.item.BlockComponent2"]], "blockdescriptor (class in mcaddon.block)": [[1, "mcaddon.block.BlockDescriptor"]], "blockdisplaynamecomponent (class in mcaddon.block)": [[1, "mcaddon.block.BlockDisplayNameComponent"]], "blockface (class in mcaddon.constant)": [[1, "mcaddon.constant.BlockFace"]], "blockfacestate (class in mcaddon.state)": [[1, "mcaddon.state.BlockFaceState"]], "blockloader (class in mcaddon.block)": [[1, "mcaddon.block.BlockLoader"]], "blockpermutation (class in mcaddon.block)": [[1, "mcaddon.block.BlockPermutation"]], "blockplacercomponent (class in mcaddon.item)": [[1, "mcaddon.item.BlockPlacerComponent"]], "blocksettings (class in mcaddon.block)": [[1, "mcaddon.block.BlockSettings"]], "blockstate (class in mcaddon.state)": [[1, "mcaddon.state.BlockState"]], "blocktagscomponent (class in mcaddon.block)": [[1, "mcaddon.block.BlockTagsComponent"]], "blocktrait (class in mcaddon.block)": [[1, "mcaddon.block.BlockTrait"]], "bonevisabilitycomponent (class in mcaddon.block)": [[1, "mcaddon.block.BoneVisabilityComponent"]], "booksstoredstate (class in mcaddon.state)": [[1, "mcaddon.state.BooksStoredState"]], "booleanstate (class in mcaddon.state)": [[1, "mcaddon.state.BooleanState"]], "box (class in mcaddon.util)": [[1, "mcaddon.util.Box"]], "breathabilitycomponent (class in mcaddon.block)": [[1, "mcaddon.block.BreathabilityComponent"]], "brewingcontainerrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.BrewingContainerRecipe"]], "brewingcontainerrecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.BrewingContainerRecipeLoader"]], "brewingmixrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.BrewingMixRecipe"]], "brewingmixrecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.BrewingMixRecipeLoader"]], "brewingstandslotabitstate (class in mcaddon.state)": [[1, "mcaddon.state.BrewingStandSlotABitState"]], "brewingstandslotbbitstate (class in mcaddon.state)": [[1, "mcaddon.state.BrewingStandSlotBBitState"]], "brewingstandslotcbitstate (class in mcaddon.state)": [[1, "mcaddon.state.BrewingStandSlotCBitState"]], "brushedprogressstate (class in mcaddon.state)": [[1, "mcaddon.state.BrushedProgressState"]], "buttonpressedbitstate (class in mcaddon.state)": [[1, "mcaddon.state.ButtonPressedBitState"]], "cameracomponent (class in mcaddon.item)": [[1, "mcaddon.item.CameraComponent"]], "cameralistener (class in mcaddon.constant)": [[1, "mcaddon.constant.CameraListener"]], "camerapreset (class in mcaddon.camera)": [[1, "mcaddon.camera.CameraPreset"]], "camerapresetloader (class in mcaddon.camera)": [[1, "mcaddon.camera.CameraPresetLoader"]], "candestroyincreativecomponent (class in mcaddon.item)": [[1, "mcaddon.item.CanDestroyInCreativeComponent"]], "candlesstate (class in mcaddon.state)": [[1, "mcaddon.state.CandlesState"]], "cardinaldirectionstate (class in mcaddon.state)": [[1, "mcaddon.state.CardinalDirectionState"]], "category (class in mcaddon.constant)": [[1, "mcaddon.constant.Category"]], "cauldronliquidstate (class in mcaddon.state)": [[1, "mcaddon.state.CauldronLiquidState"]], "chemistrytabletypestate (class in mcaddon.state)": [[1, "mcaddon.state.ChemistryTableTypeState"]], "chiseltypestate (class in mcaddon.state)": [[1, "mcaddon.state.ChiselTypeState"]], "clustercountstate (class in mcaddon.state)": [[1, "mcaddon.state.ClusterCountState"]], "collisionboxcomponent (class in mcaddon.block)": [[1, "mcaddon.block.CollisionBoxComponent"]], "color (class in mcaddon.constant)": [[1, "mcaddon.constant.Color"]], "colorbitstate (class in mcaddon.state)": [[1, "mcaddon.state.ColorBitState"]], "colorstate (class in mcaddon.state)": [[1, "mcaddon.state.ColorState"]], "componentnotfounderror": [[1, "mcaddon.exception.ComponentNotFoundError"]], "conditionalbitstate (class in mcaddon.state)": [[1, "mcaddon.state.ConditionalBitState"]], "cooldowncomponent (class in mcaddon.item)": [[1, "mcaddon.item.CooldownComponent"]], "coralcolorstate (class in mcaddon.state)": [[1, "mcaddon.state.CoralColorState"]], "coraldirectionstate (class in mcaddon.state)": [[1, "mcaddon.state.CoralDirectionState"]], "coralhangtypebitstate (class in mcaddon.state)": [[1, "mcaddon.state.CoralHangTypeBitState"]], "coveredbitstate (class in mcaddon.state)": [[1, "mcaddon.state.CoveredBitState"]], "crackedstate (class in mcaddon.state)": [[1, "mcaddon.state.CrackedState"]], "craftingstate (class in mcaddon.state)": [[1, "mcaddon.state.CraftingState"]], "craftingtablecomponent (class in mcaddon.block)": [[1, "mcaddon.block.CraftingTableComponent"]], "default_namespace (mcaddon.util.identifier attribute)": [[1, "mcaddon.util.Identifier.DEFAULT_NAMESPACE"]], "dirname (mcaddon.block.block attribute)": [[1, "mcaddon.block.Block.DIRNAME"]], "dirname (mcaddon.camera.camerapreset attribute)": [[1, "mcaddon.camera.CameraPreset.DIRNAME"]], "dirname (mcaddon.item.item attribute)": [[1, "mcaddon.item.Item.DIRNAME"]], "dirname (mcaddon.manifest.manifest attribute)": [[1, "mcaddon.manifest.Manifest.DIRNAME"]], "dirname (mcaddon.pack.behaviorpack attribute)": [[1, "mcaddon.pack.BehaviorPack.DIRNAME"]], "dirname (mcaddon.pack.resourcepack attribute)": [[1, "mcaddon.pack.ResourcePack.DIRNAME"]], "dirname (mcaddon.recipe.recipe attribute)": [[1, "mcaddon.recipe.Recipe.DIRNAME"]], "dirname (mcaddon.resrouce.itematlas attribute)": [[1, "mcaddon.resrouce.ItemAtlas.DIRNAME"]], "dirname (mcaddon.resrouce.terrainatlas attribute)": [[1, "mcaddon.resrouce.TerrainAtlas.DIRNAME"]], "dirname (mcaddon.resrouce.texture attribute)": [[1, "mcaddon.resrouce.Texture.DIRNAME"]], "dirname (mcaddon.volume.volume attribute)": [[1, "mcaddon.volume.Volume.DIRNAME"]], "damage (class in mcaddon.event)": [[1, "mcaddon.event.Damage"]], "damagecomponent (class in mcaddon.item)": [[1, "mcaddon.item.DamageComponent"]], "damagestate (class in mcaddon.state)": [[1, "mcaddon.state.DamageState"]], "deadbitstate (class in mcaddon.state)": [[1, "mcaddon.state.DeadBitState"]], "decrementblockstate (class in mcaddon.event)": [[1, "mcaddon.event.DecrementBlockState"]], "decrementstack (class in mcaddon.event)": [[1, "mcaddon.event.DecrementStack"]], "dependency (class in mcaddon.manifest)": [[1, "mcaddon.manifest.Dependency"]], "destination (class in mcaddon.constant)": [[1, "mcaddon.constant.Destination"]], "destructiblebyexplosioncomponent (class in mcaddon.block)": [[1, "mcaddon.block.DestructibleByExplosionComponent"]], "destructiblebyminingcomponent (class in mcaddon.block)": [[1, "mcaddon.block.DestructibleByMiningComponent"]], "die (class in mcaddon.event)": [[1, "mcaddon.event.Die"]], "diggercomponent (class in mcaddon.item)": [[1, "mcaddon.item.DiggerComponent"]], "directionstate (class in mcaddon.state)": [[1, "mcaddon.state.DirectionState"]], "dirttypestate (class in mcaddon.state)": [[1, "mcaddon.state.DirtTypeState"]], "disarmedbitstate (class in mcaddon.state)": [[1, "mcaddon.state.DisarmedBitState"]], "doorhingebitstate (class in mcaddon.state)": [[1, "mcaddon.state.DoorHingeBitState"]], "doubleplanttypestate (class in mcaddon.state)": [[1, "mcaddon.state.DoublePlantTypeState"]], "dragdownstate (class in mcaddon.state)": [[1, "mcaddon.state.DragDownState"]], "dripstonethicknessstate (class in mcaddon.state)": [[1, "mcaddon.state.DripstoneThicknessState"]], "durabilitycomponent (class in mcaddon.item)": [[1, "mcaddon.item.DurabilityComponent"]], "event_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.EVENT_TYPE"]], "extension (mcaddon.block.block attribute)": [[1, "mcaddon.block.Block.EXTENSION"]], "extension (mcaddon.camera.camerapreset attribute)": [[1, "mcaddon.camera.CameraPreset.EXTENSION"]], "extension (mcaddon.item.item attribute)": [[1, "mcaddon.item.Item.EXTENSION"]], "extension (mcaddon.manifest.manifest attribute)": [[1, "mcaddon.manifest.Manifest.EXTENSION"]], "extension (mcaddon.pack.addon attribute)": [[1, "mcaddon.pack.Addon.EXTENSION"]], "extension (mcaddon.pack.behaviorpack attribute)": [[1, "mcaddon.pack.BehaviorPack.EXTENSION"]], "extension (mcaddon.pack.resourcepack attribute)": [[1, "mcaddon.pack.ResourcePack.EXTENSION"]], "extension (mcaddon.recipe.recipe attribute)": [[1, "mcaddon.recipe.Recipe.EXTENSION"]], "extension (mcaddon.resrouce.itematlas attribute)": [[1, "mcaddon.resrouce.ItemAtlas.EXTENSION"]], "extension (mcaddon.resrouce.terrainatlas attribute)": [[1, "mcaddon.resrouce.TerrainAtlas.EXTENSION"]], "extension (mcaddon.resrouce.texture attribute)": [[1, "mcaddon.resrouce.Texture.EXTENSION"]], "extension (mcaddon.volume.volume attribute)": [[1, "mcaddon.volume.Volume.EXTENSION"]], "edition (class in mcaddon.constant)": [[1, "mcaddon.constant.Edition"]], "emptyitemcomponent (class in mcaddon.item)": [[1, "mcaddon.item.EmptyItemComponent"]], "enchant (class in mcaddon.loot)": [[1, "mcaddon.loot.Enchant"]], "enchantbookfortradinglootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.EnchantBookForTradingLootFunction"]], "enchantrandomgearlootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.EnchantRandomGearLootFunction"]], "enchantrandomlylootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.EnchantRandomlyLootFunction"]], "enchantwithlevelslootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.EnchantWithLevelsLootFunction"]], "enchantablecomponent (class in mcaddon.item)": [[1, "mcaddon.item.EnchantableComponent"]], "endportaleyebitstate (class in mcaddon.state)": [[1, "mcaddon.state.EndPortalEyeBitState"]], "entityplacercomponent (class in mcaddon.item)": [[1, "mcaddon.item.EntityPlacerComponent"]], "error": [[1, "mcaddon.exception.Error"]], "event (class in mcaddon.event)": [[1, "mcaddon.event.Event"]], "eventnotfounderror": [[1, "mcaddon.exception.EventNotFoundError"]], "eventtarget (class in mcaddon.constant)": [[1, "mcaddon.constant.EventTarget"]], "explodebitstate (class in mcaddon.state)": [[1, "mcaddon.state.ExplodeBitState"]], "explorationmaplootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.ExplorationMapLootFunction"]], "filename (mcaddon.block.block attribute)": [[1, "mcaddon.block.Block.FILENAME"]], "filename (mcaddon.camera.camerapreset attribute)": [[1, "mcaddon.camera.CameraPreset.FILENAME"]], "filename (mcaddon.item.item attribute)": [[1, "mcaddon.item.Item.FILENAME"]], "filename (mcaddon.manifest.manifest attribute)": [[1, "mcaddon.manifest.Manifest.FILENAME"]], "filename (mcaddon.pack.addon attribute)": [[1, "mcaddon.pack.Addon.FILENAME"]], "filename (mcaddon.pack.behaviorpack attribute)": [[1, "mcaddon.pack.BehaviorPack.FILENAME"]], "filename (mcaddon.pack.resourcepack attribute)": [[1, "mcaddon.pack.ResourcePack.FILENAME"]], "filename (mcaddon.recipe.recipe attribute)": [[1, "mcaddon.recipe.Recipe.FILENAME"]], "filename (mcaddon.resrouce.itematlas attribute)": [[1, "mcaddon.resrouce.ItemAtlas.FILENAME"]], "filename (mcaddon.resrouce.terrainatlas attribute)": [[1, "mcaddon.resrouce.TerrainAtlas.FILENAME"]], "filename (mcaddon.resrouce.texture attribute)": [[1, "mcaddon.resrouce.Texture.FILENAME"]], "filename (mcaddon.volume.volume attribute)": [[1, "mcaddon.volume.Volume.FILENAME"]], "facingdirectionstate (class in mcaddon.state)": [[1, "mcaddon.state.FacingDirectionState"]], "file (class in mcaddon.file)": [[1, "mcaddon.file.File"]], "fillcontainerlootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.FillContainerLootFunction"]], "filllevelstate (class in mcaddon.state)": [[1, "mcaddon.state.FillLevelState"]], "filter (class in mcaddon.block)": [[1, "mcaddon.block.Filter"]], "flammablecomponent (class in mcaddon.block)": [[1, "mcaddon.block.FlammableComponent"]], "flipbooktexture (class in mcaddon.resrouce)": [[1, "mcaddon.resrouce.FlipbookTexture"]], "flowertypestate (class in mcaddon.state)": [[1, "mcaddon.state.FlowerTypeState"]], "fogcomponent (class in mcaddon.volume)": [[1, "mcaddon.volume.FogComponent"]], "foilcomponent (class in mcaddon.item)": [[1, "mcaddon.item.FoilComponent"]], "foodcomponent (class in mcaddon.item)": [[1, "mcaddon.item.FoodComponent"]], "frictioncomponent (class in mcaddon.block)": [[1, "mcaddon.block.FrictionComponent"]], "fuelcomponent (class in mcaddon.item)": [[1, "mcaddon.item.FuelComponent"]], "furnacerecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.FurnaceRecipe"]], "furnacerecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.FurnaceRecipeLoader"]], "furnacesmeltlootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.FurnaceSmeltLootFunction"]], "geometrycomponent (class in mcaddon.block)": [[1, "mcaddon.block.GeometryComponent"]], "glintcomponent (class in mcaddon.item)": [[1, "mcaddon.item.GlintComponent"]], "groundsigndirectionstate (class in mcaddon.state)": [[1, "mcaddon.state.GroundSignDirectionState"]], "growthstate (class in mcaddon.state)": [[1, "mcaddon.state.GrowthState"]], "handequippedcomponent (class in mcaddon.item)": [[1, "mcaddon.item.HandEquippedComponent"]], "hangingstate (class in mcaddon.state)": [[1, "mcaddon.state.HangingState"]], "hasmarkvariantlootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.HasMarkvariantLootCondition"]], "headpiecebitstate (class in mcaddon.state)": [[1, "mcaddon.state.HeadPieceBitState"]], "header (class in mcaddon.manifest)": [[1, "mcaddon.manifest.Header"]], "heightstate (class in mcaddon.state)": [[1, "mcaddon.state.HeightState"]], "hovertextcolorcomponent (class in mcaddon.item)": [[1, "mcaddon.item.HoverTextColorComponent"]], "hugemushroombitsstate (class in mcaddon.state)": [[1, "mcaddon.state.HugeMushroomBitsState"]], "id (in module mcaddon.util)": [[1, "mcaddon.util.ID"]], "item_component_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.ITEM_COMPONENT_TYPE"]], "iconcomponent (class in mcaddon.item)": [[1, "mcaddon.item.IconComponent"]], "identifiable (class in mcaddon.util)": [[1, "mcaddon.util.Identifiable"]], "identifier (class in mcaddon.util)": [[1, "mcaddon.util.Identifier"]], "ignorespermissioncomponent (class in mcaddon.item)": [[1, "mcaddon.item.IgnoresPermissionComponent"]], "importable (class in mcaddon.file)": [[1, "mcaddon.file.Importable"]], "inwallbitstate (class in mcaddon.state)": [[1, "mcaddon.state.InWallBitState"]], "incrementblockstate (class in mcaddon.event)": [[1, "mcaddon.event.IncrementBlockState"]], "infiniburnbitstate (class in mcaddon.state)": [[1, "mcaddon.state.InfiniburnBitState"]], "ingredient (class in mcaddon.recipe)": [[1, "mcaddon.recipe.Ingredient"]], "integerstate (class in mcaddon.state)": [[1, "mcaddon.state.IntegerState"]], "interactbuttoncomponent (class in mcaddon.item)": [[1, "mcaddon.item.InteractButtonComponent"]], "item (class in mcaddon.item)": [[1, "mcaddon.item.Item"]], "itematlas (class in mcaddon.resrouce)": [[1, "mcaddon.resrouce.ItemAtlas"]], "itemcomponent (class in mcaddon.item)": [[1, "mcaddon.item.ItemComponent"]], "itemdisplaynamecomponent (class in mcaddon.item)": [[1, "mcaddon.item.ItemDisplayNameComponent"]], "itementry (class in mcaddon.loot)": [[1, "mcaddon.loot.ItemEntry"]], "itemframemapbitstate (class in mcaddon.state)": [[1, "mcaddon.state.ItemFrameMapBitState"]], "itemframephotobitstate (class in mcaddon.state)": [[1, "mcaddon.state.ItemFramePhotoBitState"]], "itemloader (class in mcaddon.item)": [[1, "mcaddon.item.ItemLoader"]], "itemsettings (class in mcaddon.item)": [[1, "mcaddon.item.ItemSettings"]], "itemstack (class in mcaddon.item)": [[1, "mcaddon.item.ItemStack"]], "itemstoragecomponent (class in mcaddon.item)": [[1, "mcaddon.item.ItemStorageComponent"]], "itemtexture (class in mcaddon.resrouce)": [[1, "mcaddon.resrouce.ItemTexture"]], "jsonfile (class in mcaddon.file)": [[1, "mcaddon.file.JsonFile"]], "killedbyentitylootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.KilledByEntityLootCondition"]], "killedbyplayerlootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.KilledByPlayerLootCondition"]], "killedbyplayerorpetslootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.KilledByPlayerOrPetsLootCondition"]], "loot_condition_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.LOOT_CONDITION_TYPE"]], "loot_function_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.LOOT_FUNCTION_TYPE"]], "leafentry (class in mcaddon.loot)": [[1, "mcaddon.loot.LeafEntry"]], "lightdampeningcomponent (class in mcaddon.block)": [[1, "mcaddon.block.LightDampeningComponent"]], "lightemissioncomponent (class in mcaddon.block)": [[1, "mcaddon.block.LightEmissionComponent"]], "liquidclippedcomponent (class in mcaddon.item)": [[1, "mcaddon.item.LiquidClippedComponent"]], "liquiddepthstate (class in mcaddon.state)": [[1, "mcaddon.state.LiquidDepthState"]], "loader (class in mcaddon.file)": [[1, "mcaddon.file.Loader"]], "lootcomponent (class in mcaddon.block)": [[1, "mcaddon.block.LootComponent"]], "lootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.LootCondition"]], "lootcontexttype (class in mcaddon.constant)": [[1, "mcaddon.constant.LootContextType"]], "lootentry (class in mcaddon.loot)": [[1, "mcaddon.loot.LootEntry"]], "lootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.LootFunction"]], "lootnumberprovider (class in mcaddon.loot)": [[1, "mcaddon.loot.LootNumberProvider"]], "lootpool (class in mcaddon.loot)": [[1, "mcaddon.loot.LootPool"]], "lootpoolentry (class in mcaddon.loot)": [[1, "mcaddon.loot.LootPoolEntry"]], "loottable (class in mcaddon.loot)": [[1, "mcaddon.loot.LootTable"]], "loottiers (class in mcaddon.loot)": [[1, "mcaddon.loot.LootTiers"]], "lootingenchantlootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.LootingEnchantLootFunction"]], "manifest (mcaddon.pack.behaviorpack property)": [[1, "mcaddon.pack.BehaviorPack.MANIFEST"]], "manifest (mcaddon.pack.resourcepack property)": [[1, "mcaddon.pack.ResourcePack.MANIFEST"]], "manifest (class in mcaddon.manifest)": [[1, "mcaddon.manifest.Manifest"]], "manifestloader (class in mcaddon.manifest)": [[1, "mcaddon.manifest.ManifestLoader"]], "manifestnotfounderror": [[1, "mcaddon.exception.ManifestNotFoundError"]], "mapcolorcomponent (class in mcaddon.block)": [[1, "mcaddon.block.MapColorComponent"]], "matchtoollootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.MatchToolLootCondition"]], "material (class in mcaddon.block)": [[1, "mcaddon.block.Material"]], "materialinstancescomponent (class in mcaddon.block)": [[1, "mcaddon.block.MaterialInstancesComponent"]], "materialreductionrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.MaterialReductionRecipe"]], "materialreductionrecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.MaterialReductionRecipeLoader"]], "maxdamagecomponent (class in mcaddon.item)": [[1, "mcaddon.item.MaxDamageComponent"]], "maxstacksizecomponent (class in mcaddon.item)": [[1, "mcaddon.item.MaxStackSizeComponent"]], "menucategory (class in mcaddon.util)": [[1, "mcaddon.util.MenuCategory"]], "metadata (class in mcaddon.manifest)": [[1, "mcaddon.manifest.Metadata"]], "minecraftnotfounderror": [[1, "mcaddon.exception.MinecraftNotFoundError"]], "module (class in mcaddon.manifest)": [[1, "mcaddon.manifest.Module"]], "moduletype (class in mcaddon.constant)": [[1, "mcaddon.constant.ModuleType"]], "moisturizedamountstate (class in mcaddon.state)": [[1, "mcaddon.state.MoisturizedAmountState"]], "monstereggstonetypestate (class in mcaddon.state)": [[1, "mcaddon.state.MonsterEggStoneTypeState"]], "newleaftypestate (class in mcaddon.state)": [[1, "mcaddon.state.NewLeafTypeState"]], "newlogtypestate (class in mcaddon.state)": [[1, "mcaddon.state.NewLogTypeState"]], "nodropbitstate (class in mcaddon.state)": [[1, "mcaddon.state.NoDropBitState"]], "occupiedbitstate (class in mcaddon.state)": [[1, "mcaddon.state.OccupiedBitState"]], "oldleaftypestate (class in mcaddon.state)": [[1, "mcaddon.state.OldLeafTypeState"]], "oldlogtypestate (class in mcaddon.state)": [[1, "mcaddon.state.OldLogTypeState"]], "onactorentercomponent (class in mcaddon.volume)": [[1, "mcaddon.volume.OnActorEnterComponent"]], "onactorleavecomponent (class in mcaddon.volume)": [[1, "mcaddon.volume.OnActorLeaveComponent"]], "onfalloncomponent (class in mcaddon.block)": [[1, "mcaddon.block.OnFallOnComponent"]], "oninteractcomponent (class in mcaddon.block)": [[1, "mcaddon.block.OnInteractComponent"]], "onplacedcomponent (class in mcaddon.block)": [[1, "mcaddon.block.OnPlacedComponent"]], "onplayerdestroyedcomponent (class in mcaddon.block)": [[1, "mcaddon.block.OnPlayerDestroyedComponent"]], "onplayerplacingcomponent (class in mcaddon.block)": [[1, "mcaddon.block.OnPlayerPlacingComponent"]], "onstepoffcomponent (class in mcaddon.block)": [[1, "mcaddon.block.OnStepOffComponent"]], "onsteponcomponent (class in mcaddon.block)": [[1, "mcaddon.block.OnStepOnComponent"]], "openbitstate (class in mcaddon.state)": [[1, "mcaddon.state.OpenBitState"]], "orientationstate (class in mcaddon.state)": [[1, "mcaddon.state.OrientationState"]], "outputlitbitstate (class in mcaddon.state)": [[1, "mcaddon.state.OutputLitBitState"]], "outputsubtractbitstate (class in mcaddon.state)": [[1, "mcaddon.state.OutputSubtractBitState"]], "oxidationlevel (class in mcaddon.constant)": [[1, "mcaddon.constant.OxidationLevel"]], "pool_entry_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.POOL_ENTRY_TYPE"]], "pack (class in mcaddon.pack)": [[1, "mcaddon.pack.Pack"]], "persistentbitstate (class in mcaddon.state)": [[1, "mcaddon.state.PersistentBitState"]], "placementdirectiontrait (class in mcaddon.block)": [[1, "mcaddon.block.PlacementDirectionTrait"]], "placementfiltercomponent (class in mcaddon.block)": [[1, "mcaddon.block.PlacementFilterComponent"]], "placementpositiontrait (class in mcaddon.block)": [[1, "mcaddon.block.PlacementPositionTrait"]], "playeffect (class in mcaddon.event)": [[1, "mcaddon.event.PlayEffect"]], "playsound (class in mcaddon.event)": [[1, "mcaddon.event.PlaySound"]], "pngfile (class in mcaddon.file)": [[1, "mcaddon.file.PngFile"]], "portalaxisstate (class in mcaddon.state)": [[1, "mcaddon.state.PortalAxisState"]], "portfoliocomponent (class in mcaddon.item)": [[1, "mcaddon.item.PortfolioComponent"]], "poweredbitstate (class in mcaddon.state)": [[1, "mcaddon.state.PoweredBitState"]], "projectilecomponent (class in mcaddon.item)": [[1, "mcaddon.item.ProjectileComponent"]], "queuedtickingcomponent (class in mcaddon.block)": [[1, "mcaddon.block.QueuedTickingComponent"]], "recipe_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.RECIPE_TYPE"]], "raildatabitstate (class in mcaddon.state)": [[1, "mcaddon.state.RailDataBitState"]], "raildirectionstate (class in mcaddon.state)": [[1, "mcaddon.state.RailDirectionState"]], "randomauxvaluelootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.RandomAuxValueLootFunction"]], "randomblockstatelootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.RandomBlockStateLootFunction"]], "randomchancelootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.RandomChanceLootCondition"]], "randomchancewithlootinglootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.RandomChanceWithLootingLootCondition"]], "randomdifficultychancelootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.RandomDifficultyChanceLootCondition"]], "randomdyelootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.RandomDyeLootFunction"]], "randomregionaldifficultychancelootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.RandomRegionalDifficultyChanceLootCondition"]], "randomtickingcomponent (class in mcaddon.block)": [[1, "mcaddon.block.RandomTickingComponent"]], "randomize (class in mcaddon.event)": [[1, "mcaddon.event.Randomize"]], "recipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.Recipe"]], "recipetag (class in mcaddon.constant)": [[1, "mcaddon.constant.RecipeTag"]], "recipetypenotfounderror": [[1, "mcaddon.exception.RecipeTypeNotFoundError"]], "recordcomponent (class in mcaddon.item)": [[1, "mcaddon.item.RecordComponent"]], "redstonesignalstate (class in mcaddon.state)": [[1, "mcaddon.state.RedstoneSignalState"]], "registries (class in mcaddon.registry)": [[1, "mcaddon.registry.Registries"]], "registry (class in mcaddon.registry)": [[1, "mcaddon.registry.Registry"]], "registryerror": [[1, "mcaddon.exception.RegistryError"]], "registrykey (class in mcaddon.registry)": [[1, "mcaddon.registry.RegistryKey"]], "removemobeffect (class in mcaddon.event)": [[1, "mcaddon.event.RemoveMobEffect"]], "rendermethod (class in mcaddon.constant)": [[1, "mcaddon.constant.RenderMethod"]], "repairitem (class in mcaddon.item)": [[1, "mcaddon.item.RepairItem"]], "repairablecomponent (class in mcaddon.item)": [[1, "mcaddon.item.RepairableComponent"]], "repeaterdelaystate (class in mcaddon.state)": [[1, "mcaddon.state.RepeaterDelayState"]], "resourcepack (class in mcaddon.pack)": [[1, "mcaddon.pack.ResourcePack"]], "runcommand (class in mcaddon.event)": [[1, "mcaddon.event.RunCommand"]], "seperator (mcaddon.util.identifier attribute)": [[1, "mcaddon.util.Identifier.SEPERATOR"]], "sandstonetypestate (class in mcaddon.state)": [[1, "mcaddon.state.SandStoneTypeState"]], "sandtypestate (class in mcaddon.state)": [[1, "mcaddon.state.SandTypeState"]], "saplingtypestate (class in mcaddon.state)": [[1, "mcaddon.state.SaplingTypeState"]], "schema (class in mcaddon.file)": [[1, "mcaddon.file.Schema"]], "schemanotfounderror": [[1, "mcaddon.exception.SchemaNotFoundError"]], "sculksensorphasestate (class in mcaddon.state)": [[1, "mcaddon.state.SculkSensorPhaseState"]], "seagrasstypestate (class in mcaddon.state)": [[1, "mcaddon.state.SeaGrassTypeState"]], "seedcomponent (class in mcaddon.item)": [[1, "mcaddon.item.SeedComponent"]], "selectionboxcomponent (class in mcaddon.block)": [[1, "mcaddon.block.SelectionBoxComponent"]], "sequence (class in mcaddon.event)": [[1, "mcaddon.event.Sequence"]], "setactoridlootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetActorIdLootFunction"]], "setbannerdetailslootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetBannerDetailsLootFunction"]], "setblock (class in mcaddon.event)": [[1, "mcaddon.event.SetBlock"]], "setblockatpos (class in mcaddon.event)": [[1, "mcaddon.event.SetBlockAtPos"]], "setblockstate (class in mcaddon.event)": [[1, "mcaddon.event.SetBlockState"]], "setbookcontentslootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetBookContentsLootFunction"]], "setcountlootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetCountLootFunction"]], "setdamagelootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetDamageLootFunction"]], "setdatafromcolorindexlootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetDataFromColorIndexLootFunction"]], "setdatalootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetDataLootFunction"]], "setlorelootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetLoreLootFunction"]], "setnamelootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetNameLootFunction"]], "shapedrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.ShapedRecipe"]], "shapedrecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.ShapedRecipeLoader"]], "shapelessrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.ShapelessRecipe"]], "shapelessrecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.ShapelessRecipeLoader"]], "shootercomponent (class in mcaddon.item)": [[1, "mcaddon.item.ShooterComponent"]], "shoulddespawncomponent (class in mcaddon.item)": [[1, "mcaddon.item.ShouldDespawnComponent"]], "simpleblockcomponent (class in mcaddon.block)": [[1, "mcaddon.block.SimpleBlockComponent"]], "simpleitemcomponent (class in mcaddon.item)": [[1, "mcaddon.item.SimpleItemComponent"]], "smithingtransformrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.SmithingTransformRecipe"]], "smithingtransformrecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.SmithingTransformRecipeLoader"]], "smithingtrimrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.SmithingTrimRecipe"]], "smithingtrimrecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.SmithingTrimRecipeLoader"]], "spawnloot (class in mcaddon.event)": [[1, "mcaddon.event.SpawnLoot"]], "specificenchantslootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SpecificEnchantsLootFunction"]], "spongetypestate (class in mcaddon.state)": [[1, "mcaddon.state.SpongeTypeState"]], "stabilitycheckstate (class in mcaddon.state)": [[1, "mcaddon.state.StabilityCheckState"]], "stabilitystate (class in mcaddon.state)": [[1, "mcaddon.state.StabilityState"]], "stackedbydatacomponent (class in mcaddon.item)": [[1, "mcaddon.item.StackedByDataComponent"]], "stonebricktypestate (class in mcaddon.state)": [[1, "mcaddon.state.StoneBrickTypeState"]], "stoneslabtype2state (class in mcaddon.state)": [[1, "mcaddon.state.StoneSlabType2State"]], "stoneslabtype3state (class in mcaddon.state)": [[1, "mcaddon.state.StoneSlabType3State"]], "stoneslabtype4state (class in mcaddon.state)": [[1, "mcaddon.state.StoneSlabType4State"]], "stoneslabtypestate (class in mcaddon.state)": [[1, "mcaddon.state.StoneSlabTypeState"]], "stonetypestate (class in mcaddon.state)": [[1, "mcaddon.state.StoneTypeState"]], "stonecuttingrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.StonecuttingRecipe"]], "strippedbitstate (class in mcaddon.state)": [[1, "mcaddon.state.StrippedBitState"]], "structureblocktypestate (class in mcaddon.state)": [[1, "mcaddon.state.StructureBlockTypeState"]], "structurevoidtypestate (class in mcaddon.state)": [[1, "mcaddon.state.StructureVoidTypeState"]], "suspendedbitstate (class in mcaddon.state)": [[1, "mcaddon.state.SuspendedBitState"]], "swing (class in mcaddon.event)": [[1, "mcaddon.event.Swing"]], "switchblockstate (class in mcaddon.event)": [[1, "mcaddon.event.SwitchBlockState"]], "syntaxerror": [[1, "mcaddon.exception.SyntaxError"]], "tagscomponent (class in mcaddon.item)": [[1, "mcaddon.item.TagsComponent"]], "tallgrasstypestate (class in mcaddon.state)": [[1, "mcaddon.state.TallGrassTypeState"]], "teleport (class in mcaddon.event)": [[1, "mcaddon.event.Teleport"]], "terrainatlas (class in mcaddon.resrouce)": [[1, "mcaddon.resrouce.TerrainAtlas"]], "terraintexture (class in mcaddon.resrouce)": [[1, "mcaddon.resrouce.TerrainTexture"]], "text (class in mcaddon.text)": [[1, "mcaddon.text.Text"]], "texture (class in mcaddon.resrouce)": [[1, "mcaddon.resrouce.Texture"]], "texturetype (class in mcaddon.constant)": [[1, "mcaddon.constant.TextureType"]], "throwablecomponent (class in mcaddon.item)": [[1, "mcaddon.item.ThrowableComponent"]], "togglebitstate (class in mcaddon.state)": [[1, "mcaddon.state.ToggleBitState"]], "topslotbitstate (class in mcaddon.state)": [[1, "mcaddon.state.TopSlotBitState"]], "torchfacingdirectionstate (class in mcaddon.state)": [[1, "mcaddon.state.TorchFacingDirectionState"]], "tradermaterialtypelootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.TraderMaterialTypeLootFunction"]], "transformationcomponent (class in mcaddon.block)": [[1, "mcaddon.block.TransformationComponent"]], "transformiiem (class in mcaddon.event)": [[1, "mcaddon.event.TransformiIem"]], "triggedbitstate (class in mcaddon.state)": [[1, "mcaddon.state.TriggedBitState"]], "trigger (class in mcaddon.event)": [[1, "mcaddon.event.Trigger"]], "turtleeggcountstate (class in mcaddon.state)": [[1, "mcaddon.state.TurtleEggCountState"]], "typenotfounderror": [[1, "mcaddon.exception.TypeNotFoundError"]], "unitcubecomponent (class in mcaddon.block)": [[1, "mcaddon.block.UnitCubeComponent"]], "updatebitstate (class in mcaddon.state)": [[1, "mcaddon.state.UpdateBitState"]], "upperblockbitstate (class in mcaddon.state)": [[1, "mcaddon.state.UpperBlockBitState"]], "upsidedownbitstate (class in mcaddon.state)": [[1, "mcaddon.state.UpsideDownBitState"]], "useanimation (class in mcaddon.constant)": [[1, "mcaddon.constant.UseAnimation"]], "useanimationcomponent (class in mcaddon.item)": [[1, "mcaddon.item.UseAnimationComponent"]], "usedurationcomponent (class in mcaddon.item)": [[1, "mcaddon.item.UseDurationComponent"]], "usemodifierscomponent (class in mcaddon.item)": [[1, "mcaddon.item.UseModifiersComponent"]], "volume_component_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.VOLUME_COMPONENT_TYPE"]], "version (class in mcaddon.util)": [[1, "mcaddon.util.Version"]], "verticalhalfstate (class in mcaddon.state)": [[1, "mcaddon.state.VerticalHalfState"]], "vinedirectionbitsstate (class in mcaddon.state)": [[1, "mcaddon.state.VineDirectionBitsState"]], "volume (class in mcaddon.volume)": [[1, "mcaddon.volume.Volume"]], "volumecomponent (class in mcaddon.volume)": [[1, "mcaddon.volume.VolumeComponent"]], "volumeloader (class in mcaddon.volume)": [[1, "mcaddon.volume.VolumeLoader"]], "wallblocktypestate (class in mcaddon.state)": [[1, "mcaddon.state.WallBlockTypeState"]], "wallconnectiontypeaststate (class in mcaddon.state)": [[1, "mcaddon.state.WallConnectionTypEastState"]], "wallconnectiontypenorthstate (class in mcaddon.state)": [[1, "mcaddon.state.WallConnectionTypeNorthState"]], "wallconnectiontypesouthstate (class in mcaddon.state)": [[1, "mcaddon.state.WallConnectionTypeSouthState"]], "wallconnectiontypeweststate (class in mcaddon.state)": [[1, "mcaddon.state.WallConnectionTypeWestState"]], "wallpostbitstate (class in mcaddon.state)": [[1, "mcaddon.state.WallPostBitState"]], "wearablecomponent (class in mcaddon.item)": [[1, "mcaddon.item.WearableComponent"]], "weirdodirectionstate (class in mcaddon.state)": [[1, "mcaddon.state.WeirdoDirectionState"]], "woodtypestate (class in mcaddon.state)": [[1, "mcaddon.state.WoodTypeState"]], "actor_id (mcaddon.loot.setactoridlootfunction property)": [[1, "mcaddon.loot.SetActorIdLootFunction.actor_id"]], "add() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add"]], "add() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.add"]], "add() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.add"]], "add_ammunition() (mcaddon.item.shootercomponent method)": [[1, "mcaddon.item.ShooterComponent.add_ammunition"]], "add_author() (mcaddon.manifest.metadata method)": [[1, "mcaddon.manifest.Metadata.add_author"]], "add_block() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_block"]], "add_block() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.add_block"]], "add_block() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.add_block"]], "add_bone() (mcaddon.block.bonevisabilitycomponent method)": [[1, "mcaddon.block.BoneVisabilityComponent.add_bone"]], "add_component() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.add_component"]], "add_component() (mcaddon.block.blockpermutation method)": [[1, "mcaddon.block.BlockPermutation.add_component"]], "add_component() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.add_component"]], "add_component() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.add_component"]], "add_condition() (mcaddon.block.placementfiltercomponent method)": [[1, "mcaddon.block.PlacementFilterComponent.add_condition"]], "add_condition() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.add_condition"]], "add_condition() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.add_condition"]], "add_crafting_tag() (mcaddon.block.craftingtablecomponent method)": [[1, "mcaddon.block.CraftingTableComponent.add_crafting_tag"]], "add_dependency() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.add_dependency"]], "add_entry() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.add_entry"]], "add_event() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.add_event"]], "add_event() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.add_event"]], "add_event() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.add_event"]], "add_event() (mcaddon.volume.onactorentercomponent method)": [[1, "mcaddon.volume.OnActorEnterComponent.add_event"]], "add_event() (mcaddon.volume.onactorleavecomponent method)": [[1, "mcaddon.volume.OnActorLeaveComponent.add_event"]], "add_event() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.add_event"]], "add_face() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.add_face"]], "add_file() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.add_file"]], "add_filter() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.add_filter"]], "add_function() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.add_function"]], "add_function() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.add_function"]], "add_function() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.add_function"]], "add_ingredient() (mcaddon.recipe.shapelessrecipe method)": [[1, "mcaddon.recipe.ShapelessRecipe.add_ingredient"]], "add_item() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_item"]], "add_item() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.add_item"]], "add_item() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.add_item"]], "add_item_texture() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_item_texture"]], "add_item_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.add_item_texture"]], "add_key() (mcaddon.recipe.shapedrecipe method)": [[1, "mcaddon.recipe.ShapedRecipe.add_key"]], "add_loot_table() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_loot_table"]], "add_material() (mcaddon.block.materialinstancescomponent method)": [[1, "mcaddon.block.MaterialInstancesComponent.add_material"]], "add_module() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.add_module"]], "add_pack() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_pack"]], "add_permutation() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.add_permutation"]], "add_pool() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.add_pool"]], "add_recipe() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_recipe"]], "add_recipe() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.add_recipe"]], "add_schema() (mcaddon.file.loader method)": [[1, "mcaddon.file.Loader.add_schema"]], "add_state() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.add_state"]], "add_tag() (mcaddon.block.blocktagscomponent method)": [[1, "mcaddon.block.BlockTagsComponent.add_tag"]], "add_tag() (mcaddon.recipe.recipe method)": [[1, "mcaddon.recipe.Recipe.add_tag"]], "add_terrain_texture() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_terrain_texture"]], "add_terrain_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.add_terrain_texture"]], "add_trait() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.add_trait"]], "add_volume() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_volume"]], "add_volume() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.add_volume"]], "addition (mcaddon.recipe.smithingtransformrecipe property)": [[1, "mcaddon.recipe.SmithingTransformRecipe.addition"]], "addition (mcaddon.recipe.smithingtrimrecipe property)": [[1, "mcaddon.recipe.SmithingTrimRecipe.addition"]], "advancement_entity (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.advancement_entity"]], "advancement_location (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.advancement_location"]], "advancement_reward (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.advancement_reward"]], "all (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.all"]], "all() (mcaddon.block.placementdirectiontrait class method)": [[1, "mcaddon.block.PlacementDirectionTrait.all"]], "all() (mcaddon.block.placementpositiontrait class method)": [[1, "mcaddon.block.PlacementPositionTrait.all"]], "allow_random_seed (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.allow_random_seed"]], "allowed_faces (mcaddon.block.filter property)": [[1, "mcaddon.block.Filter.allowed_faces"]], "alpha_test (mcaddon.constant.rendermethod attribute)": [[1, "mcaddon.constant.RenderMethod.alpha_test"]], "ambient_occlusion (mcaddon.block.material property)": [[1, "mcaddon.block.Material.ambient_occlusion"]], "ammunition (mcaddon.item.shootercomponent property)": [[1, "mcaddon.item.ShooterComponent.ammunition"]], "amount (mcaddon.event.damage property)": [[1, "mcaddon.event.Damage.amount"]], "amplifier (mcaddon.event.addmobeffect property)": [[1, "mcaddon.event.AddMobEffect.amplifier"]], "archaeology (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.archaeology"]], "atlas_index (mcaddon.resrouce.flipbooktexture property)": [[1, "mcaddon.resrouce.FlipbookTexture.atlas_index"]], "atlas_tile (mcaddon.resrouce.flipbooktexture property)": [[1, "mcaddon.resrouce.FlipbookTexture.atlas_tile"]], "atlas_tile_variant (mcaddon.resrouce.flipbooktexture property)": [[1, "mcaddon.resrouce.FlipbookTexture.atlas_tile_variant"]], "author (mcaddon.loot.setbookcontentslootfunction property)": [[1, "mcaddon.loot.SetBookContentsLootFunction.author"]], "authors (mcaddon.manifest.metadata property)": [[1, "mcaddon.manifest.Metadata.authors"]], "avoid_water (mcaddon.event.teleport property)": [[1, "mcaddon.event.Teleport.avoid_water"]], "baby (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.baby"]], "barter (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.barter"]], "base (mcaddon.recipe.smithingtransformrecipe property)": [[1, "mcaddon.recipe.SmithingTransformRecipe.base"]], "base (mcaddon.recipe.smithingtrimrecipe property)": [[1, "mcaddon.recipe.SmithingTrimRecipe.base"]], "base_cost (mcaddon.loot.enchantbookfortradinglootfunction property)": [[1, "mcaddon.loot.EnchantBookForTradingLootFunction.base_cost"]], "base_game_version (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.base_game_version"]], "base_random_cost (mcaddon.loot.enchantbookfortradinglootfunction property)": [[1, "mcaddon.loot.EnchantBookForTradingLootFunction.base_random_cost"]], "bedrock (mcaddon.constant.edition attribute)": [[1, "mcaddon.constant.Edition.bedrock"]], "behavior() (mcaddon.manifest.manifest class method)": [[1, "mcaddon.manifest.Manifest.behavior"]], "black (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.black"]], "black_bars_duration (mcaddon.item.cameracomponent property)": [[1, "mcaddon.item.CameraComponent.black_bars_duration"]], "black_bars_screen_ratio (mcaddon.item.cameracomponent property)": [[1, "mcaddon.item.CameraComponent.black_bars_screen_ratio"]], "blend (mcaddon.constant.rendermethod attribute)": [[1, "mcaddon.constant.RenderMethod.blend"]], "blend_frames (mcaddon.resrouce.flipbooktexture property)": [[1, "mcaddon.resrouce.FlipbookTexture.blend_frames"]], "block (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.block"]], "block (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.block"]], "block (mcaddon.item.blockplacercomponent property)": [[1, "mcaddon.item.BlockPlacerComponent.block"]], "block() (mcaddon.loot.loottable class method)": [[1, "mcaddon.loot.LootTable.block"]], "block_component_type() (in module mcaddon.block)": [[1, "mcaddon.block.block_component_type"]], "block_face() (mcaddon.block.placementpositiontrait class method)": [[1, "mcaddon.block.PlacementPositionTrait.block_face"]], "block_filter (mcaddon.block.filter property)": [[1, "mcaddon.block.Filter.block_filter"]], "block_offset (mcaddon.event.setblockatpos property)": [[1, "mcaddon.event.SetBlockAtPos.block_offset"]], "block_state (mcaddon.loot.randomblockstatelootfunction property)": [[1, "mcaddon.loot.RandomBlockStateLootFunction.block_state"]], "block_trait() (in module mcaddon.block)": [[1, "mcaddon.block.block_trait"]], "block_type (mcaddon.event.setblock property)": [[1, "mcaddon.event.SetBlock.block_type"]], "block_type (mcaddon.event.setblockatpos property)": [[1, "mcaddon.event.SetBlockAtPos.block_type"]], "block_type() (in module mcaddon.block)": [[1, "mcaddon.block.block_type"]], "blocks (mcaddon.pack.resourcepack property)": [[1, "mcaddon.pack.ResourcePack.blocks"]], "blue (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.blue"]], "bone_visability (mcaddon.block.geometrycomponent property)": [[1, "mcaddon.block.GeometryComponent.bone_visability"]], "bones (mcaddon.block.bonevisabilitycomponent property)": [[1, "mcaddon.block.BoneVisabilityComponent.bones"]], "bonus_chance (mcaddon.loot.loottiers property)": [[1, "mcaddon.loot.LootTiers.bonus_chance"]], "bonus_rolls (mcaddon.loot.lootpool property)": [[1, "mcaddon.loot.LootPool.bonus_rolls"]], "bonus_rolls (mcaddon.loot.loottiers property)": [[1, "mcaddon.loot.LootTiers.bonus_rolls"]], "breakinstantly() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.breakInstantly"]], "brewing_stand (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.brewing_stand"]], "brown (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.brown"]], "buriedtreasure (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.buriedtreasure"]], "burnable (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.burnable"]], "camera (mcaddon.constant.useanimation attribute)": [[1, "mcaddon.constant.UseAnimation.camera"]], "campfire (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.campfire"]], "can_always_eat (mcaddon.item.foodcomponent property)": [[1, "mcaddon.item.FoodComponent.can_always_eat"]], "capacity (mcaddon.item.itemstoragecomponent property)": [[1, "mcaddon.item.ItemStorageComponent.capacity"]], "cardinal() (mcaddon.block.placementdirectiontrait class method)": [[1, "mcaddon.block.PlacementDirectionTrait.cardinal"]], "catch_chance_modifier (mcaddon.block.flammablecomponent property)": [[1, "mcaddon.block.FlammableComponent.catch_chance_modifier"]], "category (mcaddon.item.cooldowncomponent property)": [[1, "mcaddon.item.CooldownComponent.category"]], "category (mcaddon.util.menucategory property)": [[1, "mcaddon.util.MenuCategory.category"]], "chance (mcaddon.loot.enchantrandomgearlootfunction property)": [[1, "mcaddon.loot.EnchantRandomGearLootFunction.chance"]], "chance (mcaddon.loot.randomchancelootcondition property)": [[1, "mcaddon.loot.RandomChanceLootCondition.chance"]], "chance (mcaddon.loot.randomchancewithlootinglootcondition property)": [[1, "mcaddon.loot.RandomChanceWithLootingLootCondition.chance"]], "charge_on_draw (mcaddon.item.shootercomponent property)": [[1, "mcaddon.item.ShooterComponent.charge_on_draw"]], "chest (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.chest"]], "clazz (mcaddon.block.blockdisplaynamecomponent attribute)": [[1, "mcaddon.block.BlockDisplayNameComponent.clazz"]], "clazz (mcaddon.block.breathabilitycomponent attribute)": [[1, "mcaddon.block.BreathabilityComponent.clazz"]], "clazz (mcaddon.block.frictioncomponent attribute)": [[1, "mcaddon.block.FrictionComponent.clazz"]], "clazz (mcaddon.block.lightdampeningcomponent attribute)": [[1, "mcaddon.block.LightDampeningComponent.clazz"]], "clazz (mcaddon.block.lightemissioncomponent attribute)": [[1, "mcaddon.block.LightEmissionComponent.clazz"]], "clazz (mcaddon.block.lootcomponent attribute)": [[1, "mcaddon.block.LootComponent.clazz"]], "clazz (mcaddon.block.mapcolorcomponent attribute)": [[1, "mcaddon.block.MapColorComponent.clazz"]], "clazz (mcaddon.item.allowoffhandcomponent attribute)": [[1, "mcaddon.item.AllowOffHandComponent.clazz"]], "clazz (mcaddon.item.blockcomponent2 attribute)": [[1, "mcaddon.item.BlockComponent2.clazz"]], "clazz (mcaddon.item.candestroyincreativecomponent attribute)": [[1, "mcaddon.item.CanDestroyInCreativeComponent.clazz"]], "clazz (mcaddon.item.damagecomponent attribute)": [[1, "mcaddon.item.DamageComponent.clazz"]], "clazz (mcaddon.item.foilcomponent attribute)": [[1, "mcaddon.item.FoilComponent.clazz"]], "clazz (mcaddon.item.glintcomponent attribute)": [[1, "mcaddon.item.GlintComponent.clazz"]], "clazz (mcaddon.item.handequippedcomponent attribute)": [[1, "mcaddon.item.HandEquippedComponent.clazz"]], "clazz (mcaddon.item.hovertextcolorcomponent attribute)": [[1, "mcaddon.item.HoverTextColorComponent.clazz"]], "clazz (mcaddon.item.ignorespermissioncomponent attribute)": [[1, "mcaddon.item.IgnoresPermissionComponent.clazz"]], "clazz (mcaddon.item.interactbuttoncomponent attribute)": [[1, "mcaddon.item.InteractButtonComponent.clazz"]], "clazz (mcaddon.item.liquidclippedcomponent attribute)": [[1, "mcaddon.item.LiquidClippedComponent.clazz"]], "clazz (mcaddon.item.maxdamagecomponent attribute)": [[1, "mcaddon.item.MaxDamageComponent.clazz"]], "clazz (mcaddon.item.maxstacksizecomponent attribute)": [[1, "mcaddon.item.MaxStackSizeComponent.clazz"]], "clazz (mcaddon.item.shoulddespawncomponent attribute)": [[1, "mcaddon.item.ShouldDespawnComponent.clazz"]], "clazz (mcaddon.item.stackedbydatacomponent attribute)": [[1, "mcaddon.item.StackedByDataComponent.clazz"]], "clazz (mcaddon.item.useanimationcomponent attribute)": [[1, "mcaddon.item.UseAnimationComponent.clazz"]], "clazz (mcaddon.item.usedurationcomponent attribute)": [[1, "mcaddon.item.UseDurationComponent.clazz"]], "clear_ammunitions() (mcaddon.item.shootercomponent method)": [[1, "mcaddon.item.ShooterComponent.clear_ammunitions"]], "clear_authors() (mcaddon.manifest.metadata method)": [[1, "mcaddon.manifest.Metadata.clear_authors"]], "clear_block() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.clear_block"]], "clear_blocks() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.clear_blocks"]], "clear_bones() (mcaddon.block.bonevisabilitycomponent method)": [[1, "mcaddon.block.BoneVisabilityComponent.clear_bones"]], "clear_components() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.clear_components"]], "clear_components() (mcaddon.block.blockpermutation method)": [[1, "mcaddon.block.BlockPermutation.clear_components"]], "clear_components() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.clear_components"]], "clear_components() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.clear_components"]], "clear_conditions() (mcaddon.block.placementfiltercomponent method)": [[1, "mcaddon.block.PlacementFilterComponent.clear_conditions"]], "clear_conditions() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.clear_conditions"]], "clear_conditions() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.clear_conditions"]], "clear_crafting_tags() (mcaddon.block.craftingtablecomponent method)": [[1, "mcaddon.block.CraftingTableComponent.clear_crafting_tags"]], "clear_dependencies() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.clear_dependencies"]], "clear_entries() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.clear_entries"]], "clear_events() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.clear_events"]], "clear_events() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.clear_events"]], "clear_events() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.clear_events"]], "clear_events() (mcaddon.volume.onactorentercomponent method)": [[1, "mcaddon.volume.OnActorEnterComponent.clear_events"]], "clear_events() (mcaddon.volume.onactorleavecomponent method)": [[1, "mcaddon.volume.OnActorLeaveComponent.clear_events"]], "clear_events() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.clear_events"]], "clear_faces() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.clear_faces"]], "clear_files() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.clear_files"]], "clear_filters() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.clear_filters"]], "clear_functions() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.clear_functions"]], "clear_functions() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.clear_functions"]], "clear_functions() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.clear_functions"]], "clear_ingredients() (mcaddon.recipe.shapelessrecipe method)": [[1, "mcaddon.recipe.ShapelessRecipe.clear_ingredients"]], "clear_item() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.clear_item"]], "clear_item_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.clear_item_texture"]], "clear_items() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.clear_items"]], "clear_keys() (mcaddon.recipe.shapedrecipe method)": [[1, "mcaddon.recipe.ShapedRecipe.clear_keys"]], "clear_modules() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.clear_modules"]], "clear_packs() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.clear_packs"]], "clear_permutation() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.clear_permutation"]], "clear_pools() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.clear_pools"]], "clear_recipes() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.clear_recipes"]], "clear_schemas() (mcaddon.file.loader method)": [[1, "mcaddon.file.Loader.clear_schemas"]], "clear_state() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.clear_state"]], "clear_tags() (mcaddon.block.blocktagscomponent method)": [[1, "mcaddon.block.BlockTagsComponent.clear_tags"]], "clear_tags() (mcaddon.recipe.recipe method)": [[1, "mcaddon.recipe.Recipe.clear_tags"]], "clear_terrain_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.clear_terrain_texture"]], "clear_trait() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.clear_trait"]], "clear_volumes() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.clear_volumes"]], "client_data (mcaddon.constant.moduletype attribute)": [[1, "mcaddon.constant.ModuleType.client_data"]], "client_data() (mcaddon.manifest.module class method)": [[1, "mcaddon.manifest.Module.client_data"]], "collidable (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.collidable"]], "color (mcaddon.item.itemsettings attribute)": [[1, "mcaddon.item.ItemSettings.color"]], "color() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.color"]], "command (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.command"]], "command (mcaddon.event.runcommand property)": [[1, "mcaddon.event.RunCommand.command"]], "commands (mcaddon.constant.category attribute)": [[1, "mcaddon.constant.Category.commands"]], "comparator_signal (mcaddon.item.recordcomponent property)": [[1, "mcaddon.item.RecordComponent.comparator_signal"]], "components (mcaddon.block.block property)": [[1, "mcaddon.block.Block.components"]], "components (mcaddon.block.blockpermutation property)": [[1, "mcaddon.block.BlockPermutation.components"]], "components (mcaddon.item.item property)": [[1, "mcaddon.item.Item.components"]], "components (mcaddon.volume.volume property)": [[1, "mcaddon.volume.Volume.components"]], "condition (mcaddon.block.blockpermutation property)": [[1, "mcaddon.block.BlockPermutation.condition"]], "condition (mcaddon.event.trigger property)": [[1, "mcaddon.event.Trigger.condition"]], "conditions (mcaddon.block.placementfiltercomponent property)": [[1, "mcaddon.block.PlacementFilterComponent.conditions"]], "conditions (mcaddon.loot.lootpool property)": [[1, "mcaddon.loot.LootPool.conditions"]], "conditions (mcaddon.loot.lootpoolentry property)": [[1, "mcaddon.loot.LootPoolEntry.conditions"]], "construction (mcaddon.constant.category attribute)": [[1, "mcaddon.constant.Category.construction"]], "copy() (mcaddon.util.identifier method)": [[1, "mcaddon.util.Identifier.copy"]], "copy_with_namespace() (mcaddon.util.identifier method)": [[1, "mcaddon.util.Identifier.copy_with_namespace"]], "copy_with_path() (mcaddon.util.identifier method)": [[1, "mcaddon.util.Identifier.copy_with_path"]], "count (mcaddon.item.itemstack property)": [[1, "mcaddon.item.ItemStack.count"]], "count (mcaddon.loot.lootingenchantlootfunction property)": [[1, "mcaddon.loot.LootingEnchantLootFunction.count"]], "count (mcaddon.loot.matchtoollootcondition property)": [[1, "mcaddon.loot.MatchToolLootCondition.count"]], "count (mcaddon.loot.setcountlootfunction property)": [[1, "mcaddon.loot.SetCountLootFunction.count"]], "crafting_table (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.crafting_table"]], "crafting_tags (mcaddon.block.craftingtablecomponent property)": [[1, "mcaddon.block.CraftingTableComponent.crafting_tags"]], "create_registry() (mcaddon.registry.registry method)": [[1, "mcaddon.registry.Registry.create_registry"]], "crop_result (mcaddon.item.seedcomponent property)": [[1, "mcaddon.item.SeedComponent.crop_result"]], "cube() (mcaddon.util.box class method)": [[1, "mcaddon.util.Box.cube"]], "cyan (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.cyan"]], "damage (mcaddon.loot.setdamagelootfunction property)": [[1, "mcaddon.loot.SetDamageLootFunction.damage"]], "damage_chance (mcaddon.item.durabilitycomponent property)": [[1, "mcaddon.item.DurabilityComponent.damage_chance"]], "damager (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.damager"]], "data (mcaddon.constant.moduletype attribute)": [[1, "mcaddon.constant.ModuleType.data"]], "data (mcaddon.event.playeffect property)": [[1, "mcaddon.event.PlayEffect.data"]], "data (mcaddon.item.itemstack property)": [[1, "mcaddon.item.ItemStack.data"]], "data (mcaddon.loot.setdatalootfunction property)": [[1, "mcaddon.loot.SetDataLootFunction.data"]], "data() (mcaddon.manifest.module class method)": [[1, "mcaddon.manifest.Module.data"]], "default_chance (mcaddon.loot.randomdifficultychancelootcondition property)": [[1, "mcaddon.loot.RandomDifficultyChanceLootCondition.default_chance"]], "dependencies (mcaddon.manifest.manifest property)": [[1, "mcaddon.manifest.Manifest.dependencies"]], "description (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.description"]], "description (mcaddon.manifest.manifest property)": [[1, "mcaddon.manifest.Manifest.description"]], "description (mcaddon.manifest.module property)": [[1, "mcaddon.manifest.Module.description"]], "description (mcaddon.pack.pack property)": [[1, "mcaddon.pack.Pack.description"]], "description_key (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.description_key"]], "destination (mcaddon.event.teleport property)": [[1, "mcaddon.event.Teleport.destination"]], "destination (mcaddon.loot.explorationmaplootfunction property)": [[1, "mcaddon.loot.ExplorationMapLootFunction.destination"]], "destroy_chance_modifier (mcaddon.block.flammablecomponent property)": [[1, "mcaddon.block.FlammableComponent.destroy_chance_modifier"]], "destroy_speeds (mcaddon.item.diggercomponent property)": [[1, "mcaddon.item.DiggerComponent.destroy_speeds"]], "dirname (mcaddon.file.file property)": [[1, "mcaddon.file.File.dirname"]], "dirname (mcaddon.loot.loottable attribute)": [[1, "mcaddon.loot.LootTable.dirname"]], "dirname (mcaddon.resrouce.itemtexture attribute)": [[1, "mcaddon.resrouce.ItemTexture.dirname"]], "dirname (mcaddon.resrouce.terraintexture attribute)": [[1, "mcaddon.resrouce.TerrainTexture.dirname"]], "dispense_on (mcaddon.item.entityplacercomponent property)": [[1, "mcaddon.item.EntityPlacerComponent.dispense_on"]], "do_swing_animation (mcaddon.item.throwablecomponent property)": [[1, "mcaddon.item.ThrowableComponent.do_swing_animation"]], "double_sided (mcaddon.constant.rendermethod attribute)": [[1, "mcaddon.constant.RenderMethod.double_sided"]], "down (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.down"]], "drink (mcaddon.constant.useanimation attribute)": [[1, "mcaddon.constant.UseAnimation.drink"]], "dropslike() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.dropsLike"]], "dropsnothing() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.dropsNothing"]], "durability (mcaddon.loot.matchtoollootcondition property)": [[1, "mcaddon.loot.MatchToolLootCondition.durability"]], "duration (mcaddon.event.addmobeffect property)": [[1, "mcaddon.event.AddMobEffect.duration"]], "duration (mcaddon.item.cooldowncomponent property)": [[1, "mcaddon.item.CooldownComponent.duration"]], "duration (mcaddon.item.fuelcomponent property)": [[1, "mcaddon.item.FuelComponent.duration"]], "duration (mcaddon.item.recordcomponent property)": [[1, "mcaddon.item.RecordComponent.duration"]], "east (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.east"]], "eat (mcaddon.constant.useanimation attribute)": [[1, "mcaddon.constant.UseAnimation.eat"]], "education (mcaddon.constant.edition attribute)": [[1, "mcaddon.constant.Edition.education"]], "effect (mcaddon.event.addmobeffect property)": [[1, "mcaddon.event.AddMobEffect.effect"]], "effect (mcaddon.event.playeffect property)": [[1, "mcaddon.event.PlayEffect.effect"]], "effect (mcaddon.event.removemobeffect property)": [[1, "mcaddon.event.RemoveMobEffect.effect"]], "empty (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.empty"]], "empty() (mcaddon.block.lootcomponent class method)": [[1, "mcaddon.block.LootComponent.empty"]], "enabled_states (mcaddon.block.blocktrait property)": [[1, "mcaddon.block.BlockTrait.enabled_states"]], "enchantments (mcaddon.loot.matchtoollootcondition property)": [[1, "mcaddon.loot.MatchToolLootCondition.enchantments"]], "enchantments (mcaddon.loot.specificenchantslootfunction property)": [[1, "mcaddon.loot.SpecificEnchantsLootFunction.enchantments"]], "endcity (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.endcity"]], "entity (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.entity"]], "entity (mcaddon.item.entityplacercomponent property)": [[1, "mcaddon.item.EntityPlacerComponent.entity"]], "entity_type (mcaddon.loot.killedbyentitylootcondition property)": [[1, "mcaddon.loot.KilledByEntityLootCondition.entity_type"]], "entries (mcaddon.loot.lootpool property)": [[1, "mcaddon.loot.LootPool.entries"]], "equipment (mcaddon.constant.category attribute)": [[1, "mcaddon.constant.Category.equipment"]], "event (mcaddon.event.trigger property)": [[1, "mcaddon.event.Trigger.event"]], "event_exists() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.event_exists"]], "event_type() (in module mcaddon.event)": [[1, "mcaddon.event.event_type"]], "events (mcaddon.block.block property)": [[1, "mcaddon.block.Block.events"]], "events (mcaddon.event.sequence property)": [[1, "mcaddon.event.Sequence.events"]], "events (mcaddon.item.item property)": [[1, "mcaddon.item.Item.events"]], "events (mcaddon.volume.volume property)": [[1, "mcaddon.volume.Volume.events"]], "explosion_resistance (mcaddon.block.destructiblebyexplosioncomponent property)": [[1, "mcaddon.block.DestructibleByExplosionComponent.explosion_resistance"]], "exposed (mcaddon.constant.oxidationlevel attribute)": [[1, "mcaddon.constant.OxidationLevel.exposed"]], "extension (mcaddon.file.archivefile property)": [[1, "mcaddon.file.ArchiveFile.extension"]], "extension (mcaddon.file.file property)": [[1, "mcaddon.file.File.extension"]], "extension (mcaddon.loot.loottable attribute)": [[1, "mcaddon.loot.LootTable.extension"]], "face_dimming (mcaddon.block.material property)": [[1, "mcaddon.block.Material.face_dimming"]], "facing() (mcaddon.block.placementdirectiontrait class method)": [[1, "mcaddon.block.PlacementDirectionTrait.facing"]], "file_types (mcaddon.pack.pack property)": [[1, "mcaddon.pack.Pack.file_types"]], "filename (mcaddon.file.archivefile property)": [[1, "mcaddon.file.ArchiveFile.filename"]], "filename (mcaddon.file.file property)": [[1, "mcaddon.file.File.filename"]], "filename (mcaddon.loot.loottable attribute)": [[1, "mcaddon.loot.LootTable.filename"]], "fishing (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.fishing"]], "fog_identifier (mcaddon.volume.fogcomponent property)": [[1, "mcaddon.volume.FogComponent.fog_identifier"]], "fortress (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.fortress"]], "frames (mcaddon.resrouce.flipbooktexture property)": [[1, "mcaddon.resrouce.FlipbookTexture.frames"]], "from_dict() (mcaddon.block.block class method)": [[1, "mcaddon.block.Block.from_dict"]], "from_dict() (mcaddon.block.blockcomponent class method)": [[1, "mcaddon.block.BlockComponent.from_dict"]], "from_dict() (mcaddon.block.blockdescriptor class method)": [[1, "mcaddon.block.BlockDescriptor.from_dict"]], "from_dict() (mcaddon.block.blockpermutation class method)": [[1, "mcaddon.block.BlockPermutation.from_dict"]], "from_dict() (mcaddon.block.blocktagscomponent class method)": [[1, "mcaddon.block.BlockTagsComponent.from_dict"]], "from_dict() (mcaddon.block.blocktrait class method)": [[1, "mcaddon.block.BlockTrait.from_dict"]], "from_dict() (mcaddon.block.bonevisabilitycomponent class method)": [[1, "mcaddon.block.BoneVisabilityComponent.from_dict"]], "from_dict() (mcaddon.block.collisionboxcomponent class method)": [[1, "mcaddon.block.CollisionBoxComponent.from_dict"]], "from_dict() (mcaddon.block.craftingtablecomponent class method)": [[1, "mcaddon.block.CraftingTableComponent.from_dict"]], "from_dict() (mcaddon.block.destructiblebyexplosioncomponent class method)": [[1, "mcaddon.block.DestructibleByExplosionComponent.from_dict"]], "from_dict() (mcaddon.block.destructiblebyminingcomponent class method)": [[1, "mcaddon.block.DestructibleByMiningComponent.from_dict"]], "from_dict() (mcaddon.block.filter class method)": [[1, "mcaddon.block.Filter.from_dict"]], "from_dict() (mcaddon.block.flammablecomponent class method)": [[1, "mcaddon.block.FlammableComponent.from_dict"]], "from_dict() (mcaddon.block.frictioncomponent class method)": [[1, "mcaddon.block.FrictionComponent.from_dict"]], "from_dict() (mcaddon.block.geometrycomponent class method)": [[1, "mcaddon.block.GeometryComponent.from_dict"]], "from_dict() (mcaddon.block.material class method)": [[1, "mcaddon.block.Material.from_dict"]], "from_dict() (mcaddon.block.materialinstancescomponent class method)": [[1, "mcaddon.block.MaterialInstancesComponent.from_dict"]], "from_dict() (mcaddon.block.onfalloncomponent class method)": [[1, "mcaddon.block.OnFallOnComponent.from_dict"]], "from_dict() (mcaddon.block.placementdirectiontrait class method)": [[1, "mcaddon.block.PlacementDirectionTrait.from_dict"]], "from_dict() (mcaddon.block.placementfiltercomponent class method)": [[1, "mcaddon.block.PlacementFilterComponent.from_dict"]], "from_dict() (mcaddon.block.queuedtickingcomponent class method)": [[1, "mcaddon.block.QueuedTickingComponent.from_dict"]], "from_dict() (mcaddon.block.randomtickingcomponent class method)": [[1, "mcaddon.block.RandomTickingComponent.from_dict"]], "from_dict() (mcaddon.block.selectionboxcomponent class method)": [[1, "mcaddon.block.SelectionBoxComponent.from_dict"]], "from_dict() (mcaddon.block.simpleblockcomponent class method)": [[1, "mcaddon.block.SimpleBlockComponent.from_dict"]], "from_dict() (mcaddon.block.transformationcomponent class method)": [[1, "mcaddon.block.TransformationComponent.from_dict"]], "from_dict() (mcaddon.block.unitcubecomponent class method)": [[1, "mcaddon.block.UnitCubeComponent.from_dict"]], "from_dict() (mcaddon.camera.camerapreset class method)": [[1, "mcaddon.camera.CameraPreset.from_dict"]], "from_dict() (mcaddon.event.addmobeffect class method)": [[1, "mcaddon.event.AddMobEffect.from_dict"]], "from_dict() (mcaddon.event.damage class method)": [[1, "mcaddon.event.Damage.from_dict"]], "from_dict() (mcaddon.event.decrementstack class method)": [[1, "mcaddon.event.DecrementStack.from_dict"]], "from_dict() (mcaddon.event.die class method)": [[1, "mcaddon.event.Die.from_dict"]], "from_dict() (mcaddon.event.event class method)": [[1, "mcaddon.event.Event.from_dict"]], "from_dict() (mcaddon.event.playeffect class method)": [[1, "mcaddon.event.PlayEffect.from_dict"]], "from_dict() (mcaddon.event.playsound class method)": [[1, "mcaddon.event.PlaySound.from_dict"]], "from_dict() (mcaddon.event.removemobeffect class method)": [[1, "mcaddon.event.RemoveMobEffect.from_dict"]], "from_dict() (mcaddon.event.runcommand class method)": [[1, "mcaddon.event.RunCommand.from_dict"]], "from_dict() (mcaddon.event.sequence class method)": [[1, "mcaddon.event.Sequence.from_dict"]], "from_dict() (mcaddon.event.setblock class method)": [[1, "mcaddon.event.SetBlock.from_dict"]], "from_dict() (mcaddon.event.setblockatpos class method)": [[1, "mcaddon.event.SetBlockAtPos.from_dict"]], "from_dict() (mcaddon.event.setblockstate class method)": [[1, "mcaddon.event.SetBlockState.from_dict"]], "from_dict() (mcaddon.event.spawnloot class method)": [[1, "mcaddon.event.SpawnLoot.from_dict"]], "from_dict() (mcaddon.event.teleport class method)": [[1, "mcaddon.event.Teleport.from_dict"]], "from_dict() (mcaddon.event.transformiiem class method)": [[1, "mcaddon.event.TransformiIem.from_dict"]], "from_dict() (mcaddon.event.trigger class method)": [[1, "mcaddon.event.Trigger.from_dict"]], "from_dict() (mcaddon.file.jsonfile class method)": [[1, "mcaddon.file.JsonFile.from_dict"]], "from_dict() (mcaddon.item.blockplacercomponent class method)": [[1, "mcaddon.item.BlockPlacerComponent.from_dict"]], "from_dict() (mcaddon.item.cameracomponent class method)": [[1, "mcaddon.item.CameraComponent.from_dict"]], "from_dict() (mcaddon.item.cooldowncomponent class method)": [[1, "mcaddon.item.CooldownComponent.from_dict"]], "from_dict() (mcaddon.item.damagecomponent class method)": [[1, "mcaddon.item.DamageComponent.from_dict"]], "from_dict() (mcaddon.item.diggercomponent class method)": [[1, "mcaddon.item.DiggerComponent.from_dict"]], "from_dict() (mcaddon.item.durabilitycomponent class method)": [[1, "mcaddon.item.DurabilityComponent.from_dict"]], "from_dict() (mcaddon.item.emptyitemcomponent class method)": [[1, "mcaddon.item.EmptyItemComponent.from_dict"]], "from_dict() (mcaddon.item.enchantablecomponent class method)": [[1, "mcaddon.item.EnchantableComponent.from_dict"]], "from_dict() (mcaddon.item.entityplacercomponent class method)": [[1, "mcaddon.item.EntityPlacerComponent.from_dict"]], "from_dict() (mcaddon.item.foodcomponent class method)": [[1, "mcaddon.item.FoodComponent.from_dict"]], "from_dict() (mcaddon.item.fuelcomponent class method)": [[1, "mcaddon.item.FuelComponent.from_dict"]], "from_dict() (mcaddon.item.glintcomponent class method)": [[1, "mcaddon.item.GlintComponent.from_dict"]], "from_dict() (mcaddon.item.hovertextcolorcomponent class method)": [[1, "mcaddon.item.HoverTextColorComponent.from_dict"]], "from_dict() (mcaddon.item.iconcomponent class method)": [[1, "mcaddon.item.IconComponent.from_dict"]], "from_dict() (mcaddon.item.interactbuttoncomponent class method)": [[1, "mcaddon.item.InteractButtonComponent.from_dict"]], "from_dict() (mcaddon.item.item class method)": [[1, "mcaddon.item.Item.from_dict"]], "from_dict() (mcaddon.item.itemcomponent class method)": [[1, "mcaddon.item.ItemComponent.from_dict"]], "from_dict() (mcaddon.item.itemdisplaynamecomponent class method)": [[1, "mcaddon.item.ItemDisplayNameComponent.from_dict"]], "from_dict() (mcaddon.item.itemstack class method)": [[1, "mcaddon.item.ItemStack.from_dict"]], "from_dict() (mcaddon.item.itemstoragecomponent class method)": [[1, "mcaddon.item.ItemStorageComponent.from_dict"]], "from_dict() (mcaddon.item.liquidclippedcomponent class method)": [[1, "mcaddon.item.LiquidClippedComponent.from_dict"]], "from_dict() (mcaddon.item.projectilecomponent class method)": [[1, "mcaddon.item.ProjectileComponent.from_dict"]], "from_dict() (mcaddon.item.recordcomponent class method)": [[1, "mcaddon.item.RecordComponent.from_dict"]], "from_dict() (mcaddon.item.repairablecomponent class method)": [[1, "mcaddon.item.RepairableComponent.from_dict"]], "from_dict() (mcaddon.item.seedcomponent class method)": [[1, "mcaddon.item.SeedComponent.from_dict"]], "from_dict() (mcaddon.item.shootercomponent class method)": [[1, "mcaddon.item.ShooterComponent.from_dict"]], "from_dict() (mcaddon.item.shoulddespawncomponent class method)": [[1, "mcaddon.item.ShouldDespawnComponent.from_dict"]], "from_dict() (mcaddon.item.simpleitemcomponent class method)": [[1, "mcaddon.item.SimpleItemComponent.from_dict"]], "from_dict() (mcaddon.item.tagscomponent class method)": [[1, "mcaddon.item.TagsComponent.from_dict"]], "from_dict() (mcaddon.item.throwablecomponent class method)": [[1, "mcaddon.item.ThrowableComponent.from_dict"]], "from_dict() (mcaddon.item.useanimationcomponent class method)": [[1, "mcaddon.item.UseAnimationComponent.from_dict"]], "from_dict() (mcaddon.item.usemodifierscomponent class method)": [[1, "mcaddon.item.UseModifiersComponent.from_dict"]], "from_dict() (mcaddon.item.wearablecomponent class method)": [[1, "mcaddon.item.WearableComponent.from_dict"]], "from_dict() (mcaddon.loot.enchant class method)": [[1, "mcaddon.loot.Enchant.from_dict"]], "from_dict() (mcaddon.loot.enchantbookfortradinglootfunction class method)": [[1, "mcaddon.loot.EnchantBookForTradingLootFunction.from_dict"]], "from_dict() (mcaddon.loot.enchantrandomgearlootfunction class method)": [[1, "mcaddon.loot.EnchantRandomGearLootFunction.from_dict"]], "from_dict() (mcaddon.loot.enchantrandomlylootfunction class method)": [[1, "mcaddon.loot.EnchantRandomlyLootFunction.from_dict"]], "from_dict() (mcaddon.loot.enchantwithlevelslootfunction class method)": [[1, "mcaddon.loot.EnchantWithLevelsLootFunction.from_dict"]], "from_dict() (mcaddon.loot.explorationmaplootfunction class method)": [[1, "mcaddon.loot.ExplorationMapLootFunction.from_dict"]], "from_dict() (mcaddon.loot.fillcontainerlootfunction class method)": [[1, "mcaddon.loot.FillContainerLootFunction.from_dict"]], "from_dict() (mcaddon.loot.furnacesmeltlootfunction class method)": [[1, "mcaddon.loot.FurnaceSmeltLootFunction.from_dict"]], "from_dict() (mcaddon.loot.hasmarkvariantlootcondition class method)": [[1, "mcaddon.loot.HasMarkvariantLootCondition.from_dict"]], "from_dict() (mcaddon.loot.itementry class method)": [[1, "mcaddon.loot.ItemEntry.from_dict"]], "from_dict() (mcaddon.loot.killedbyentitylootcondition class method)": [[1, "mcaddon.loot.KilledByEntityLootCondition.from_dict"]], "from_dict() (mcaddon.loot.killedbyplayerlootcondition class method)": [[1, "mcaddon.loot.KilledByPlayerLootCondition.from_dict"]], "from_dict() (mcaddon.loot.killedbyplayerorpetslootcondition class method)": [[1, "mcaddon.loot.KilledByPlayerOrPetsLootCondition.from_dict"]], "from_dict() (mcaddon.loot.leafentry class method)": [[1, "mcaddon.loot.LeafEntry.from_dict"]], "from_dict() (mcaddon.loot.lootentry class method)": [[1, "mcaddon.loot.LootEntry.from_dict"]], "from_dict() (mcaddon.loot.lootnumberprovider class method)": [[1, "mcaddon.loot.LootNumberProvider.from_dict"]], "from_dict() (mcaddon.loot.lootpool class method)": [[1, "mcaddon.loot.LootPool.from_dict"]], "from_dict() (mcaddon.loot.lootpoolentry class method)": [[1, "mcaddon.loot.LootPoolEntry.from_dict"]], "from_dict() (mcaddon.loot.loottable class method)": [[1, "mcaddon.loot.LootTable.from_dict"]], "from_dict() (mcaddon.loot.loottiers class method)": [[1, "mcaddon.loot.LootTiers.from_dict"]], "from_dict() (mcaddon.loot.lootingenchantlootfunction class method)": [[1, "mcaddon.loot.LootingEnchantLootFunction.from_dict"]], "from_dict() (mcaddon.loot.matchtoollootcondition class method)": [[1, "mcaddon.loot.MatchToolLootCondition.from_dict"]], "from_dict() (mcaddon.loot.randomauxvaluelootfunction class method)": [[1, "mcaddon.loot.RandomAuxValueLootFunction.from_dict"]], "from_dict() (mcaddon.loot.randomblockstatelootfunction class method)": [[1, "mcaddon.loot.RandomBlockStateLootFunction.from_dict"]], "from_dict() (mcaddon.loot.randomchancelootcondition class method)": [[1, "mcaddon.loot.RandomChanceLootCondition.from_dict"]], "from_dict() (mcaddon.loot.randomchancewithlootinglootcondition class method)": [[1, "mcaddon.loot.RandomChanceWithLootingLootCondition.from_dict"]], "from_dict() (mcaddon.loot.randomdifficultychancelootcondition class method)": [[1, "mcaddon.loot.RandomDifficultyChanceLootCondition.from_dict"]], "from_dict() (mcaddon.loot.randomdyelootfunction class method)": [[1, "mcaddon.loot.RandomDyeLootFunction.from_dict"]], "from_dict() (mcaddon.loot.randomregionaldifficultychancelootcondition class method)": [[1, "mcaddon.loot.RandomRegionalDifficultyChanceLootCondition.from_dict"]], "from_dict() (mcaddon.loot.setactoridlootfunction class method)": [[1, "mcaddon.loot.SetActorIdLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setbannerdetailslootfunction class method)": [[1, "mcaddon.loot.SetBannerDetailsLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setbookcontentslootfunction class method)": [[1, "mcaddon.loot.SetBookContentsLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setcountlootfunction class method)": [[1, "mcaddon.loot.SetCountLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setdamagelootfunction class method)": [[1, "mcaddon.loot.SetDamageLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setdatafromcolorindexlootfunction class method)": [[1, "mcaddon.loot.SetDataFromColorIndexLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setdatalootfunction class method)": [[1, "mcaddon.loot.SetDataLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setlorelootfunction class method)": [[1, "mcaddon.loot.SetLoreLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setnamelootfunction class method)": [[1, "mcaddon.loot.SetNameLootFunction.from_dict"]], "from_dict() (mcaddon.loot.specificenchantslootfunction class method)": [[1, "mcaddon.loot.SpecificEnchantsLootFunction.from_dict"]], "from_dict() (mcaddon.loot.tradermaterialtypelootfunction class method)": [[1, "mcaddon.loot.TraderMaterialTypeLootFunction.from_dict"]], "from_dict() (mcaddon.manifest.dependency class method)": [[1, "mcaddon.manifest.Dependency.from_dict"]], "from_dict() (mcaddon.manifest.header class method)": [[1, "mcaddon.manifest.Header.from_dict"]], "from_dict() (mcaddon.manifest.manifest class method)": [[1, "mcaddon.manifest.Manifest.from_dict"]], "from_dict() (mcaddon.manifest.metadata class method)": [[1, "mcaddon.manifest.Metadata.from_dict"]], "from_dict() (mcaddon.manifest.module class method)": [[1, "mcaddon.manifest.Module.from_dict"]], "from_dict() (mcaddon.recipe.brewingcontainerrecipe class method)": [[1, "mcaddon.recipe.BrewingContainerRecipe.from_dict"]], "from_dict() (mcaddon.recipe.brewingmixrecipe class method)": [[1, "mcaddon.recipe.BrewingMixRecipe.from_dict"]], "from_dict() (mcaddon.recipe.furnacerecipe class method)": [[1, "mcaddon.recipe.FurnaceRecipe.from_dict"]], "from_dict() (mcaddon.recipe.ingredient class method)": [[1, "mcaddon.recipe.Ingredient.from_dict"]], "from_dict() (mcaddon.recipe.materialreductionrecipe class method)": [[1, "mcaddon.recipe.MaterialReductionRecipe.from_dict"]], "from_dict() (mcaddon.recipe.recipe class method)": [[1, "mcaddon.recipe.Recipe.from_dict"]], "from_dict() (mcaddon.recipe.shapedrecipe class method)": [[1, "mcaddon.recipe.ShapedRecipe.from_dict"]], "from_dict() (mcaddon.recipe.shapelessrecipe class method)": [[1, "mcaddon.recipe.ShapelessRecipe.from_dict"]], "from_dict() (mcaddon.recipe.smithingtransformrecipe class method)": [[1, "mcaddon.recipe.SmithingTransformRecipe.from_dict"]], "from_dict() (mcaddon.recipe.smithingtrimrecipe class method)": [[1, "mcaddon.recipe.SmithingTrimRecipe.from_dict"]], "from_dict() (mcaddon.state.blockstate class method)": [[1, "mcaddon.state.BlockState.from_dict"]], "from_dict() (mcaddon.util.box class method)": [[1, "mcaddon.util.Box.from_dict"]], "from_dict() (mcaddon.util.menucategory class method)": [[1, "mcaddon.util.MenuCategory.from_dict"]], "from_dict() (mcaddon.volume.fogcomponent class method)": [[1, "mcaddon.volume.FogComponent.from_dict"]], "from_dict() (mcaddon.volume.onactorentercomponent class method)": [[1, "mcaddon.volume.OnActorEnterComponent.from_dict"]], "from_dict() (mcaddon.volume.onactorleavecomponent class method)": [[1, "mcaddon.volume.OnActorLeaveComponent.from_dict"]], "from_dict() (mcaddon.volume.volume class method)": [[1, "mcaddon.volume.Volume.from_dict"]], "from_dict() (mcaddon.volume.volumecomponent class method)": [[1, "mcaddon.volume.VolumeComponent.from_dict"]], "from_fileobj() (mcaddon.file.file class method)": [[1, "mcaddon.file.File.from_fileobj"]], "from_fileobj() (mcaddon.file.jsonfile class method)": [[1, "mcaddon.file.JsonFile.from_fileobj"]], "from_fileobj() (mcaddon.file.pngfile class method)": [[1, "mcaddon.file.PngFile.from_fileobj"]], "from_settings() (mcaddon.block.block class method)": [[1, "mcaddon.block.Block.from_settings"]], "from_settings() (mcaddon.item.item class method)": [[1, "mcaddon.item.Item.from_settings"]], "functions (mcaddon.loot.leafentry property)": [[1, "mcaddon.loot.LeafEntry.functions"]], "functions (mcaddon.loot.lootpool property)": [[1, "mcaddon.loot.LootPool.functions"]], "functions (mcaddon.loot.loottable property)": [[1, "mcaddon.loot.LootTable.functions"]], "furnace (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.furnace"]], "generic (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.generic"]], "geometry (mcaddon.block.geometrycomponent property)": [[1, "mcaddon.block.GeometryComponent.geometry"]], "get() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.get"]], "get() (mcaddon.registry.registrykey method)": [[1, "mcaddon.registry.RegistryKey.get"]], "get_author() (mcaddon.manifest.metadata method)": [[1, "mcaddon.manifest.Metadata.get_author"]], "get_block() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.get_block"]], "get_block() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.get_block"]], "get_bone() (mcaddon.block.bonevisabilitycomponent method)": [[1, "mcaddon.block.BoneVisabilityComponent.get_bone"]], "get_collision_shape() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.get_collision_shape"]], "get_component() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.get_component"]], "get_component() (mcaddon.block.blockpermutation method)": [[1, "mcaddon.block.BlockPermutation.get_component"]], "get_component() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.get_component"]], "get_component() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.get_component"]], "get_condition() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.get_condition"]], "get_condition() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.get_condition"]], "get_condition() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.get_condition"]], "get_crafting_tag() (mcaddon.block.craftingtablecomponent method)": [[1, "mcaddon.block.CraftingTableComponent.get_crafting_tag"]], "get_dependency() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.get_dependency"]], "get_entry() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.get_entry"]], "get_event() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.get_event"]], "get_event() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.get_event"]], "get_event() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.get_event"]], "get_event() (mcaddon.volume.onactorentercomponent method)": [[1, "mcaddon.volume.OnActorEnterComponent.get_event"]], "get_event() (mcaddon.volume.onactorleavecomponent method)": [[1, "mcaddon.volume.OnActorLeaveComponent.get_event"]], "get_event() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.get_event"]], "get_face() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.get_face"]], "get_file() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.get_file"]], "get_filter() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.get_filter"]], "get_function() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.get_function"]], "get_function() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.get_function"]], "get_function() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.get_function"]], "get_item() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.get_item"]], "get_item() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.get_item"]], "get_item_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.get_item_texture"]], "get_material() (mcaddon.block.materialinstancescomponent method)": [[1, "mcaddon.block.MaterialInstancesComponent.get_material"]], "get_module() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.get_module"]], "get_pack() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.get_pack"]], "get_permutation() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.get_permutation"]], "get_pool() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.get_pool"]], "get_recipe() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.get_recipe"]], "get_registry() (mcaddon.registry.registry method)": [[1, "mcaddon.registry.Registry.get_registry"]], "get_schema() (mcaddon.file.loader method)": [[1, "mcaddon.file.Loader.get_schema"]], "get_selection_shape() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.get_selection_shape"]], "get_state() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.get_state"]], "get_tag() (mcaddon.block.blocktagscomponent method)": [[1, "mcaddon.block.BlockTagsComponent.get_tag"]], "get_terrain_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.get_terrain_texture"]], "get_trait() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.get_trait"]], "get_volume() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.get_volume"]], "getattr2() (in module mcaddon.util)": [[1, "mcaddon.util.getattr2"]], "getvalue() (mcaddon.file.archivefile method)": [[1, "mcaddon.file.ArchiveFile.getvalue"]], "getvalue() (mcaddon.file.file method)": [[1, "mcaddon.file.File.getvalue"]], "gift (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.gift"]], "gray (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.gray"]], "green (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.green"]], "group (mcaddon.util.menucategory property)": [[1, "mcaddon.util.MenuCategory.group"]], "hard (mcaddon.loot.randomdifficultychancelootcondition property)": [[1, "mcaddon.loot.RandomDifficultyChanceLootCondition.hard"]], "hardness (mcaddon.block.block property)": [[1, "mcaddon.block.Block.hardness"]], "hardness (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.hardness"]], "has_filename() (mcaddon.file.archivefile method)": [[1, "mcaddon.file.ArchiveFile.has_filename"]], "has_filename() (mcaddon.file.file method)": [[1, "mcaddon.file.File.has_filename"]], "header (mcaddon.manifest.manifest property)": [[1, "mcaddon.manifest.Manifest.header"]], "holder (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.holder"]], "id (mcaddon.block.block attribute)": [[1, "mcaddon.block.Block.id"]], "id (mcaddon.block.blockdisplaynamecomponent attribute)": [[1, "mcaddon.block.BlockDisplayNameComponent.id"]], "id (mcaddon.block.blocktagscomponent attribute)": [[1, "mcaddon.block.BlockTagsComponent.id"]], "id (mcaddon.block.blocktrait property)": [[1, "mcaddon.block.BlockTrait.id"]], "id (mcaddon.block.bonevisabilitycomponent attribute)": [[1, "mcaddon.block.BoneVisabilityComponent.id"]], "id (mcaddon.block.breathabilitycomponent attribute)": [[1, "mcaddon.block.BreathabilityComponent.id"]], "id (mcaddon.block.collisionboxcomponent attribute)": [[1, "mcaddon.block.CollisionBoxComponent.id"]], "id (mcaddon.block.craftingtablecomponent attribute)": [[1, "mcaddon.block.CraftingTableComponent.id"]], "id (mcaddon.block.destructiblebyexplosioncomponent attribute)": [[1, "mcaddon.block.DestructibleByExplosionComponent.id"]], "id (mcaddon.block.destructiblebyminingcomponent attribute)": [[1, "mcaddon.block.DestructibleByMiningComponent.id"]], "id (mcaddon.block.flammablecomponent attribute)": [[1, "mcaddon.block.FlammableComponent.id"]], "id (mcaddon.block.frictioncomponent attribute)": [[1, "mcaddon.block.FrictionComponent.id"]], "id (mcaddon.block.geometrycomponent attribute)": [[1, "mcaddon.block.GeometryComponent.id"]], "id (mcaddon.block.lightdampeningcomponent attribute)": [[1, "mcaddon.block.LightDampeningComponent.id"]], "id (mcaddon.block.lightemissioncomponent attribute)": [[1, "mcaddon.block.LightEmissionComponent.id"]], "id (mcaddon.block.lootcomponent attribute)": [[1, "mcaddon.block.LootComponent.id"]], "id (mcaddon.block.mapcolorcomponent attribute)": [[1, "mcaddon.block.MapColorComponent.id"]], "id (mcaddon.block.materialinstancescomponent attribute)": [[1, "mcaddon.block.MaterialInstancesComponent.id"]], "id (mcaddon.block.onfalloncomponent attribute)": [[1, "mcaddon.block.OnFallOnComponent.id"]], "id (mcaddon.block.oninteractcomponent attribute)": [[1, "mcaddon.block.OnInteractComponent.id"]], "id (mcaddon.block.onplacedcomponent attribute)": [[1, "mcaddon.block.OnPlacedComponent.id"]], "id (mcaddon.block.onplayerdestroyedcomponent attribute)": [[1, "mcaddon.block.OnPlayerDestroyedComponent.id"]], "id (mcaddon.block.onplayerplacingcomponent attribute)": [[1, "mcaddon.block.OnPlayerPlacingComponent.id"]], "id (mcaddon.block.onstepoffcomponent attribute)": [[1, "mcaddon.block.OnStepOffComponent.id"]], "id (mcaddon.block.onsteponcomponent attribute)": [[1, "mcaddon.block.OnStepOnComponent.id"]], "id (mcaddon.block.placementdirectiontrait attribute)": [[1, "mcaddon.block.PlacementDirectionTrait.id"]], "id (mcaddon.block.placementfiltercomponent attribute)": [[1, "mcaddon.block.PlacementFilterComponent.id"]], "id (mcaddon.block.placementpositiontrait attribute)": [[1, "mcaddon.block.PlacementPositionTrait.id"]], "id (mcaddon.block.queuedtickingcomponent attribute)": [[1, "mcaddon.block.QueuedTickingComponent.id"]], "id (mcaddon.block.randomtickingcomponent attribute)": [[1, "mcaddon.block.RandomTickingComponent.id"]], "id (mcaddon.block.selectionboxcomponent attribute)": [[1, "mcaddon.block.SelectionBoxComponent.id"]], "id (mcaddon.block.transformationcomponent attribute)": [[1, "mcaddon.block.TransformationComponent.id"]], "id (mcaddon.block.unitcubecomponent attribute)": [[1, "mcaddon.block.UnitCubeComponent.id"]], "id (mcaddon.camera.camerapreset attribute)": [[1, "mcaddon.camera.CameraPreset.id"]], "id (mcaddon.event.addmobeffect attribute)": [[1, "mcaddon.event.AddMobEffect.id"]], "id (mcaddon.event.damage attribute)": [[1, "mcaddon.event.Damage.id"]], "id (mcaddon.event.decrementstack attribute)": [[1, "mcaddon.event.DecrementStack.id"]], "id (mcaddon.event.die attribute)": [[1, "mcaddon.event.Die.id"]], "id (mcaddon.event.playeffect attribute)": [[1, "mcaddon.event.PlayEffect.id"]], "id (mcaddon.event.playsound attribute)": [[1, "mcaddon.event.PlaySound.id"]], "id (mcaddon.event.randomize attribute)": [[1, "mcaddon.event.Randomize.id"]], "id (mcaddon.event.removemobeffect attribute)": [[1, "mcaddon.event.RemoveMobEffect.id"]], "id (mcaddon.event.runcommand attribute)": [[1, "mcaddon.event.RunCommand.id"]], "id (mcaddon.event.sequence attribute)": [[1, "mcaddon.event.Sequence.id"]], "id (mcaddon.event.setblock attribute)": [[1, "mcaddon.event.SetBlock.id"]], "id (mcaddon.event.setblockatpos attribute)": [[1, "mcaddon.event.SetBlockAtPos.id"]], "id (mcaddon.event.setblockstate attribute)": [[1, "mcaddon.event.SetBlockState.id"]], "id (mcaddon.event.spawnloot attribute)": [[1, "mcaddon.event.SpawnLoot.id"]], "id (mcaddon.event.swing attribute)": [[1, "mcaddon.event.Swing.id"]], "id (mcaddon.event.teleport attribute)": [[1, "mcaddon.event.Teleport.id"]], "id (mcaddon.event.transformiiem attribute)": [[1, "mcaddon.event.TransformiIem.id"]], "id (mcaddon.event.trigger attribute)": [[1, "mcaddon.event.Trigger.id"]], "id (mcaddon.item.allowoffhandcomponent attribute)": [[1, "mcaddon.item.AllowOffHandComponent.id"]], "id (mcaddon.item.blockcomponent2 attribute)": [[1, "mcaddon.item.BlockComponent2.id"]], "id (mcaddon.item.blockplacercomponent attribute)": [[1, "mcaddon.item.BlockPlacerComponent.id"]], "id (mcaddon.item.cameracomponent attribute)": [[1, "mcaddon.item.CameraComponent.id"]], "id (mcaddon.item.candestroyincreativecomponent attribute)": [[1, "mcaddon.item.CanDestroyInCreativeComponent.id"]], "id (mcaddon.item.cooldowncomponent attribute)": [[1, "mcaddon.item.CooldownComponent.id"]], "id (mcaddon.item.damagecomponent attribute)": [[1, "mcaddon.item.DamageComponent.id"]], "id (mcaddon.item.diggercomponent attribute)": [[1, "mcaddon.item.DiggerComponent.id"]], "id (mcaddon.item.durabilitycomponent attribute)": [[1, "mcaddon.item.DurabilityComponent.id"]], "id (mcaddon.item.enchantablecomponent attribute)": [[1, "mcaddon.item.EnchantableComponent.id"]], "id (mcaddon.item.entityplacercomponent attribute)": [[1, "mcaddon.item.EntityPlacerComponent.id"]], "id (mcaddon.item.foilcomponent attribute)": [[1, "mcaddon.item.FoilComponent.id"]], "id (mcaddon.item.foodcomponent attribute)": [[1, "mcaddon.item.FoodComponent.id"]], "id (mcaddon.item.fuelcomponent attribute)": [[1, "mcaddon.item.FuelComponent.id"]], "id (mcaddon.item.glintcomponent attribute)": [[1, "mcaddon.item.GlintComponent.id"]], "id (mcaddon.item.handequippedcomponent attribute)": [[1, "mcaddon.item.HandEquippedComponent.id"]], "id (mcaddon.item.hovertextcolorcomponent attribute)": [[1, "mcaddon.item.HoverTextColorComponent.id"]], "id (mcaddon.item.iconcomponent attribute)": [[1, "mcaddon.item.IconComponent.id"]], "id (mcaddon.item.ignorespermissioncomponent attribute)": [[1, "mcaddon.item.IgnoresPermissionComponent.id"]], "id (mcaddon.item.interactbuttoncomponent attribute)": [[1, "mcaddon.item.InteractButtonComponent.id"]], "id (mcaddon.item.item attribute)": [[1, "mcaddon.item.Item.id"]], "id (mcaddon.item.itemdisplaynamecomponent attribute)": [[1, "mcaddon.item.ItemDisplayNameComponent.id"]], "id (mcaddon.item.itemstoragecomponent attribute)": [[1, "mcaddon.item.ItemStorageComponent.id"]], "id (mcaddon.item.liquidclippedcomponent attribute)": [[1, "mcaddon.item.LiquidClippedComponent.id"]], "id (mcaddon.item.maxdamagecomponent attribute)": [[1, "mcaddon.item.MaxDamageComponent.id"]], "id (mcaddon.item.maxstacksizecomponent attribute)": [[1, "mcaddon.item.MaxStackSizeComponent.id"]], "id (mcaddon.item.portfoliocomponent attribute)": [[1, "mcaddon.item.PortfolioComponent.id"]], "id (mcaddon.item.projectilecomponent attribute)": [[1, "mcaddon.item.ProjectileComponent.id"]], "id (mcaddon.item.recordcomponent attribute)": [[1, "mcaddon.item.RecordComponent.id"]], "id (mcaddon.item.repairablecomponent attribute)": [[1, "mcaddon.item.RepairableComponent.id"]], "id (mcaddon.item.seedcomponent attribute)": [[1, "mcaddon.item.SeedComponent.id"]], "id (mcaddon.item.shootercomponent attribute)": [[1, "mcaddon.item.ShooterComponent.id"]], "id (mcaddon.item.shoulddespawncomponent attribute)": [[1, "mcaddon.item.ShouldDespawnComponent.id"]], "id (mcaddon.item.stackedbydatacomponent attribute)": [[1, "mcaddon.item.StackedByDataComponent.id"]], "id (mcaddon.item.tagscomponent attribute)": [[1, "mcaddon.item.TagsComponent.id"]], "id (mcaddon.item.throwablecomponent attribute)": [[1, "mcaddon.item.ThrowableComponent.id"]], "id (mcaddon.item.useanimationcomponent attribute)": [[1, "mcaddon.item.UseAnimationComponent.id"]], "id (mcaddon.item.usedurationcomponent attribute)": [[1, "mcaddon.item.UseDurationComponent.id"]], "id (mcaddon.item.usemodifierscomponent attribute)": [[1, "mcaddon.item.UseModifiersComponent.id"]], "id (mcaddon.item.wearablecomponent attribute)": [[1, "mcaddon.item.WearableComponent.id"]], "id (mcaddon.loot.enchantbookfortradinglootfunction attribute)": [[1, "mcaddon.loot.EnchantBookForTradingLootFunction.id"]], "id (mcaddon.loot.enchantrandomgearlootfunction attribute)": [[1, "mcaddon.loot.EnchantRandomGearLootFunction.id"]], "id (mcaddon.loot.enchantrandomlylootfunction attribute)": [[1, "mcaddon.loot.EnchantRandomlyLootFunction.id"]], "id (mcaddon.loot.enchantwithlevelslootfunction attribute)": [[1, "mcaddon.loot.EnchantWithLevelsLootFunction.id"]], "id (mcaddon.loot.explorationmaplootfunction attribute)": [[1, "mcaddon.loot.ExplorationMapLootFunction.id"]], "id (mcaddon.loot.fillcontainerlootfunction attribute)": [[1, "mcaddon.loot.FillContainerLootFunction.id"]], "id (mcaddon.loot.furnacesmeltlootfunction attribute)": [[1, "mcaddon.loot.FurnaceSmeltLootFunction.id"]], "id (mcaddon.loot.hasmarkvariantlootcondition attribute)": [[1, "mcaddon.loot.HasMarkvariantLootCondition.id"]], "id (mcaddon.loot.itementry attribute)": [[1, "mcaddon.loot.ItemEntry.id"]], "id (mcaddon.loot.killedbyentitylootcondition attribute)": [[1, "mcaddon.loot.KilledByEntityLootCondition.id"]], "id (mcaddon.loot.killedbyplayerlootcondition attribute)": [[1, "mcaddon.loot.KilledByPlayerLootCondition.id"]], "id (mcaddon.loot.killedbyplayerorpetslootcondition attribute)": [[1, "mcaddon.loot.KilledByPlayerOrPetsLootCondition.id"]], "id (mcaddon.loot.lootentry attribute)": [[1, "mcaddon.loot.LootEntry.id"]], "id (mcaddon.loot.lootpoolentry property)": [[1, "mcaddon.loot.LootPoolEntry.id"]], "id (mcaddon.loot.lootingenchantlootfunction attribute)": [[1, "mcaddon.loot.LootingEnchantLootFunction.id"]], "id (mcaddon.loot.matchtoollootcondition attribute)": [[1, "mcaddon.loot.MatchToolLootCondition.id"]], "id (mcaddon.loot.randomauxvaluelootfunction attribute)": [[1, "mcaddon.loot.RandomAuxValueLootFunction.id"]], "id (mcaddon.loot.randomblockstatelootfunction attribute)": [[1, "mcaddon.loot.RandomBlockStateLootFunction.id"]], "id (mcaddon.loot.randomchancelootcondition attribute)": [[1, "mcaddon.loot.RandomChanceLootCondition.id"]], "id (mcaddon.loot.randomchancewithlootinglootcondition attribute)": [[1, "mcaddon.loot.RandomChanceWithLootingLootCondition.id"]], "id (mcaddon.loot.randomdifficultychancelootcondition attribute)": [[1, "mcaddon.loot.RandomDifficultyChanceLootCondition.id"]], "id (mcaddon.loot.randomdyelootfunction attribute)": [[1, "mcaddon.loot.RandomDyeLootFunction.id"]], "id (mcaddon.loot.randomregionaldifficultychancelootcondition attribute)": [[1, "mcaddon.loot.RandomRegionalDifficultyChanceLootCondition.id"]], "id (mcaddon.loot.setactoridlootfunction attribute)": [[1, "mcaddon.loot.SetActorIdLootFunction.id"]], "id (mcaddon.loot.setbannerdetailslootfunction attribute)": [[1, "mcaddon.loot.SetBannerDetailsLootFunction.id"]], "id (mcaddon.loot.setbookcontentslootfunction attribute)": [[1, "mcaddon.loot.SetBookContentsLootFunction.id"]], "id (mcaddon.loot.setcountlootfunction attribute)": [[1, "mcaddon.loot.SetCountLootFunction.id"]], "id (mcaddon.loot.setdamagelootfunction attribute)": [[1, "mcaddon.loot.SetDamageLootFunction.id"]], "id (mcaddon.loot.setdatafromcolorindexlootfunction attribute)": [[1, "mcaddon.loot.SetDataFromColorIndexLootFunction.id"]], "id (mcaddon.loot.setdatalootfunction attribute)": [[1, "mcaddon.loot.SetDataLootFunction.id"]], "id (mcaddon.loot.setlorelootfunction attribute)": [[1, "mcaddon.loot.SetLoreLootFunction.id"]], "id (mcaddon.loot.setnamelootfunction attribute)": [[1, "mcaddon.loot.SetNameLootFunction.id"]], "id (mcaddon.loot.specificenchantslootfunction attribute)": [[1, "mcaddon.loot.SpecificEnchantsLootFunction.id"]], "id (mcaddon.loot.tradermaterialtypelootfunction attribute)": [[1, "mcaddon.loot.TraderMaterialTypeLootFunction.id"]], "id (mcaddon.pack.addon attribute)": [[1, "mcaddon.pack.Addon.id"]], "id (mcaddon.pack.behaviorpack attribute)": [[1, "mcaddon.pack.BehaviorPack.id"]], "id (mcaddon.pack.resourcepack attribute)": [[1, "mcaddon.pack.ResourcePack.id"]], "id (mcaddon.recipe.brewingcontainerrecipe attribute)": [[1, "mcaddon.recipe.BrewingContainerRecipe.id"]], "id (mcaddon.recipe.brewingmixrecipe attribute)": [[1, "mcaddon.recipe.BrewingMixRecipe.id"]], "id (mcaddon.recipe.furnacerecipe attribute)": [[1, "mcaddon.recipe.FurnaceRecipe.id"]], "id (mcaddon.recipe.materialreductionrecipe attribute)": [[1, "mcaddon.recipe.MaterialReductionRecipe.id"]], "id (mcaddon.recipe.recipe property)": [[1, "mcaddon.recipe.Recipe.id"]], "id (mcaddon.recipe.shapedrecipe attribute)": [[1, "mcaddon.recipe.ShapedRecipe.id"]], "id (mcaddon.recipe.shapelessrecipe attribute)": [[1, "mcaddon.recipe.ShapelessRecipe.id"]], "id (mcaddon.recipe.smithingtransformrecipe attribute)": [[1, "mcaddon.recipe.SmithingTransformRecipe.id"]], "id (mcaddon.recipe.smithingtrimrecipe attribute)": [[1, "mcaddon.recipe.SmithingTrimRecipe.id"]], "id (mcaddon.state.activestate attribute)": [[1, "mcaddon.state.ActiveState.id"]], "id (mcaddon.state.agebitstate attribute)": [[1, "mcaddon.state.AgeBitState.id"]], "id (mcaddon.state.agestate attribute)": [[1, "mcaddon.state.AgeState.id"]], "id (mcaddon.state.allowunderwaterbitstate attribute)": [[1, "mcaddon.state.AllowUnderwaterBitState.id"]], "id (mcaddon.state.attachedbitstate attribute)": [[1, "mcaddon.state.AttachedBitState.id"]], "id (mcaddon.state.attachmentstate attribute)": [[1, "mcaddon.state.AttachmentState.id"]], "id (mcaddon.state.bambooleafsizestate attribute)": [[1, "mcaddon.state.BambooLeafSizeState.id"]], "id (mcaddon.state.bamboostalkthicknessstate attribute)": [[1, "mcaddon.state.BambooStalkThicknessState.id"]], "id (mcaddon.state.bigdripleaftiltstate attribute)": [[1, "mcaddon.state.BigDripleafTiltState.id"]], "id (mcaddon.state.bitecounterstate attribute)": [[1, "mcaddon.state.BiteCounterState.id"]], "id (mcaddon.state.blockfacestate attribute)": [[1, "mcaddon.state.BlockFaceState.id"]], "id (mcaddon.state.blockstate property)": [[1, "mcaddon.state.BlockState.id"]], "id (mcaddon.state.booksstoredstate attribute)": [[1, "mcaddon.state.BooksStoredState.id"]], "id (mcaddon.state.brewingstandslotabitstate attribute)": [[1, "mcaddon.state.BrewingStandSlotABitState.id"]], "id (mcaddon.state.brewingstandslotbbitstate attribute)": [[1, "mcaddon.state.BrewingStandSlotBBitState.id"]], "id (mcaddon.state.brewingstandslotcbitstate attribute)": [[1, "mcaddon.state.BrewingStandSlotCBitState.id"]], "id (mcaddon.state.brushedprogressstate attribute)": [[1, "mcaddon.state.BrushedProgressState.id"]], "id (mcaddon.state.buttonpressedbitstate attribute)": [[1, "mcaddon.state.ButtonPressedBitState.id"]], "id (mcaddon.state.candlesstate attribute)": [[1, "mcaddon.state.CandlesState.id"]], "id (mcaddon.state.cardinaldirectionstate attribute)": [[1, "mcaddon.state.CardinalDirectionState.id"]], "id (mcaddon.state.cauldronliquidstate attribute)": [[1, "mcaddon.state.CauldronLiquidState.id"]], "id (mcaddon.state.chemistrytabletypestate attribute)": [[1, "mcaddon.state.ChemistryTableTypeState.id"]], "id (mcaddon.state.chiseltypestate attribute)": [[1, "mcaddon.state.ChiselTypeState.id"]], "id (mcaddon.state.clustercountstate attribute)": [[1, "mcaddon.state.ClusterCountState.id"]], "id (mcaddon.state.colorbitstate attribute)": [[1, "mcaddon.state.ColorBitState.id"]], "id (mcaddon.state.colorstate attribute)": [[1, "mcaddon.state.ColorState.id"]], "id (mcaddon.state.conditionalbitstate attribute)": [[1, "mcaddon.state.ConditionalBitState.id"]], "id (mcaddon.state.coralcolorstate attribute)": [[1, "mcaddon.state.CoralColorState.id"]], "id (mcaddon.state.coraldirectionstate attribute)": [[1, "mcaddon.state.CoralDirectionState.id"]], "id (mcaddon.state.coralhangtypebitstate attribute)": [[1, "mcaddon.state.CoralHangTypeBitState.id"]], "id (mcaddon.state.coveredbitstate attribute)": [[1, "mcaddon.state.CoveredBitState.id"]], "id (mcaddon.state.crackedstate attribute)": [[1, "mcaddon.state.CrackedState.id"]], "id (mcaddon.state.craftingstate attribute)": [[1, "mcaddon.state.CraftingState.id"]], "id (mcaddon.state.damagestate attribute)": [[1, "mcaddon.state.DamageState.id"]], "id (mcaddon.state.deadbitstate attribute)": [[1, "mcaddon.state.DeadBitState.id"]], "id (mcaddon.state.directionstate attribute)": [[1, "mcaddon.state.DirectionState.id"]], "id (mcaddon.state.dirttypestate attribute)": [[1, "mcaddon.state.DirtTypeState.id"]], "id (mcaddon.state.disarmedbitstate attribute)": [[1, "mcaddon.state.DisarmedBitState.id"]], "id (mcaddon.state.doorhingebitstate attribute)": [[1, "mcaddon.state.DoorHingeBitState.id"]], "id (mcaddon.state.doubleplanttypestate attribute)": [[1, "mcaddon.state.DoublePlantTypeState.id"]], "id (mcaddon.state.dragdownstate attribute)": [[1, "mcaddon.state.DragDownState.id"]], "id (mcaddon.state.dripstonethicknessstate attribute)": [[1, "mcaddon.state.DripstoneThicknessState.id"]], "id (mcaddon.state.endportaleyebitstate attribute)": [[1, "mcaddon.state.EndPortalEyeBitState.id"]], "id (mcaddon.state.explodebitstate attribute)": [[1, "mcaddon.state.ExplodeBitState.id"]], "id (mcaddon.state.facingdirectionstate attribute)": [[1, "mcaddon.state.FacingDirectionState.id"]], "id (mcaddon.state.filllevelstate attribute)": [[1, "mcaddon.state.FillLevelState.id"]], "id (mcaddon.state.flowertypestate attribute)": [[1, "mcaddon.state.FlowerTypeState.id"]], "id (mcaddon.state.groundsigndirectionstate attribute)": [[1, "mcaddon.state.GroundSignDirectionState.id"]], "id (mcaddon.state.growthstate attribute)": [[1, "mcaddon.state.GrowthState.id"]], "id (mcaddon.state.hangingstate attribute)": [[1, "mcaddon.state.HangingState.id"]], "id (mcaddon.state.headpiecebitstate attribute)": [[1, "mcaddon.state.HeadPieceBitState.id"]], "id (mcaddon.state.heightstate attribute)": [[1, "mcaddon.state.HeightState.id"]], "id (mcaddon.state.hugemushroombitsstate attribute)": [[1, "mcaddon.state.HugeMushroomBitsState.id"]], "id (mcaddon.state.inwallbitstate attribute)": [[1, "mcaddon.state.InWallBitState.id"]], "id (mcaddon.state.infiniburnbitstate attribute)": [[1, "mcaddon.state.InfiniburnBitState.id"]], "id (mcaddon.state.itemframemapbitstate attribute)": [[1, "mcaddon.state.ItemFrameMapBitState.id"]], "id (mcaddon.state.itemframephotobitstate attribute)": [[1, "mcaddon.state.ItemFramePhotoBitState.id"]], "id (mcaddon.state.liquiddepthstate attribute)": [[1, "mcaddon.state.LiquidDepthState.id"]], "id (mcaddon.state.moisturizedamountstate attribute)": [[1, "mcaddon.state.MoisturizedAmountState.id"]], "id (mcaddon.state.monstereggstonetypestate attribute)": [[1, "mcaddon.state.MonsterEggStoneTypeState.id"]], "id (mcaddon.state.newleaftypestate attribute)": [[1, "mcaddon.state.NewLeafTypeState.id"]], "id (mcaddon.state.newlogtypestate attribute)": [[1, "mcaddon.state.NewLogTypeState.id"]], "id (mcaddon.state.nodropbitstate attribute)": [[1, "mcaddon.state.NoDropBitState.id"]], "id (mcaddon.state.occupiedbitstate attribute)": [[1, "mcaddon.state.OccupiedBitState.id"]], "id (mcaddon.state.oldleaftypestate attribute)": [[1, "mcaddon.state.OldLeafTypeState.id"]], "id (mcaddon.state.oldlogtypestate attribute)": [[1, "mcaddon.state.OldLogTypeState.id"]], "id (mcaddon.state.openbitstate attribute)": [[1, "mcaddon.state.OpenBitState.id"]], "id (mcaddon.state.orientationstate attribute)": [[1, "mcaddon.state.OrientationState.id"]], "id (mcaddon.state.outputlitbitstate attribute)": [[1, "mcaddon.state.OutputLitBitState.id"]], "id (mcaddon.state.outputsubtractbitstate attribute)": [[1, "mcaddon.state.OutputSubtractBitState.id"]], "id (mcaddon.state.persistentbitstate attribute)": [[1, "mcaddon.state.PersistentBitState.id"]], "id (mcaddon.state.portalaxisstate attribute)": [[1, "mcaddon.state.PortalAxisState.id"]], "id (mcaddon.state.poweredbitstate attribute)": [[1, "mcaddon.state.PoweredBitState.id"]], "id (mcaddon.state.raildatabitstate attribute)": [[1, "mcaddon.state.RailDataBitState.id"]], "id (mcaddon.state.raildirectionstate attribute)": [[1, "mcaddon.state.RailDirectionState.id"]], "id (mcaddon.state.redstonesignalstate attribute)": [[1, "mcaddon.state.RedstoneSignalState.id"]], "id (mcaddon.state.repeaterdelaystate attribute)": [[1, "mcaddon.state.RepeaterDelayState.id"]], "id (mcaddon.state.sandstonetypestate attribute)": [[1, "mcaddon.state.SandStoneTypeState.id"]], "id (mcaddon.state.sandtypestate attribute)": [[1, "mcaddon.state.SandTypeState.id"]], "id (mcaddon.state.saplingtypestate attribute)": [[1, "mcaddon.state.SaplingTypeState.id"]], "id (mcaddon.state.sculksensorphasestate attribute)": [[1, "mcaddon.state.SculkSensorPhaseState.id"]], "id (mcaddon.state.seagrasstypestate attribute)": [[1, "mcaddon.state.SeaGrassTypeState.id"]], "id (mcaddon.state.spongetypestate attribute)": [[1, "mcaddon.state.SpongeTypeState.id"]], "id (mcaddon.state.stabilitycheckstate attribute)": [[1, "mcaddon.state.StabilityCheckState.id"]], "id (mcaddon.state.stabilitystate attribute)": [[1, "mcaddon.state.StabilityState.id"]], "id (mcaddon.state.stonebricktypestate attribute)": [[1, "mcaddon.state.StoneBrickTypeState.id"]], "id (mcaddon.state.stoneslabtype2state attribute)": [[1, "mcaddon.state.StoneSlabType2State.id"]], "id (mcaddon.state.stoneslabtype3state attribute)": [[1, "mcaddon.state.StoneSlabType3State.id"]], "id (mcaddon.state.stoneslabtype4state attribute)": [[1, "mcaddon.state.StoneSlabType4State.id"]], "id (mcaddon.state.stoneslabtypestate attribute)": [[1, "mcaddon.state.StoneSlabTypeState.id"]], "id (mcaddon.state.stonetypestate attribute)": [[1, "mcaddon.state.StoneTypeState.id"]], "id (mcaddon.state.strippedbitstate attribute)": [[1, "mcaddon.state.StrippedBitState.id"]], "id (mcaddon.state.structureblocktypestate attribute)": [[1, "mcaddon.state.StructureBlockTypeState.id"]], "id (mcaddon.state.structurevoidtypestate attribute)": [[1, "mcaddon.state.StructureVoidTypeState.id"]], "id (mcaddon.state.suspendedbitstate attribute)": [[1, "mcaddon.state.SuspendedBitState.id"]], "id (mcaddon.state.tallgrasstypestate attribute)": [[1, "mcaddon.state.TallGrassTypeState.id"]], "id (mcaddon.state.togglebitstate attribute)": [[1, "mcaddon.state.ToggleBitState.id"]], "id (mcaddon.state.topslotbitstate attribute)": [[1, "mcaddon.state.TopSlotBitState.id"]], "id (mcaddon.state.torchfacingdirectionstate attribute)": [[1, "mcaddon.state.TorchFacingDirectionState.id"]], "id (mcaddon.state.triggedbitstate attribute)": [[1, "mcaddon.state.TriggedBitState.id"]], "id (mcaddon.state.turtleeggcountstate attribute)": [[1, "mcaddon.state.TurtleEggCountState.id"]], "id (mcaddon.state.updatebitstate attribute)": [[1, "mcaddon.state.UpdateBitState.id"]], "id (mcaddon.state.upperblockbitstate attribute)": [[1, "mcaddon.state.UpperBlockBitState.id"]], "id (mcaddon.state.upsidedownbitstate attribute)": [[1, "mcaddon.state.UpsideDownBitState.id"]], "id (mcaddon.state.verticalhalfstate attribute)": [[1, "mcaddon.state.VerticalHalfState.id"]], "id (mcaddon.state.vinedirectionbitsstate attribute)": [[1, "mcaddon.state.VineDirectionBitsState.id"]], "id (mcaddon.state.wallblocktypestate attribute)": [[1, "mcaddon.state.WallBlockTypeState.id"]], "id (mcaddon.state.wallconnectiontypeaststate attribute)": [[1, "mcaddon.state.WallConnectionTypEastState.id"]], "id (mcaddon.state.wallconnectiontypenorthstate attribute)": [[1, "mcaddon.state.WallConnectionTypeNorthState.id"]], "id (mcaddon.state.wallconnectiontypesouthstate attribute)": [[1, "mcaddon.state.WallConnectionTypeSouthState.id"]], "id (mcaddon.state.wallconnectiontypeweststate attribute)": [[1, "mcaddon.state.WallConnectionTypeWestState.id"]], "id (mcaddon.state.wallpostbitstate attribute)": [[1, "mcaddon.state.WallPostBitState.id"]], "id (mcaddon.state.weirdodirectionstate attribute)": [[1, "mcaddon.state.WeirdoDirectionState.id"]], "id (mcaddon.state.woodtypestate attribute)": [[1, "mcaddon.state.WoodTypeState.id"]], "id (mcaddon.volume.fogcomponent attribute)": [[1, "mcaddon.volume.FogComponent.id"]], "id (mcaddon.volume.onactorentercomponent attribute)": [[1, "mcaddon.volume.OnActorEnterComponent.id"]], "id (mcaddon.volume.onactorleavecomponent attribute)": [[1, "mcaddon.volume.OnActorLeaveComponent.id"]], "id (mcaddon.volume.volume attribute)": [[1, "mcaddon.volume.Volume.id"]], "identifier (mcaddon.resrouce.itematlas attribute)": [[1, "mcaddon.resrouce.ItemAtlas.identifier"]], "identifier (mcaddon.resrouce.terrainatlas attribute)": [[1, "mcaddon.resrouce.TerrainAtlas.identifier"]], "identifier (mcaddon.util.identifiable property)": [[1, "mcaddon.util.Identifiable.identifier"]], "image (mcaddon.file.pngfile attribute)": [[1, "mcaddon.file.PngFile.image"]], "import_to() (mcaddon.file.importable method)": [[1, "mcaddon.file.Importable.import_to"]], "import_to() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.import_to"]], "import_to() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.import_to"]], "import_to() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.import_to"]], "ingredients (mcaddon.recipe.shapelessrecipe property)": [[1, "mcaddon.recipe.ShapelessRecipe.ingredients"]], "inherit_from (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.inherit_from"]], "initial_range (mcaddon.loot.loottiers property)": [[1, "mcaddon.loot.LootTiers.initial_range"]], "input (mcaddon.recipe.brewingcontainerrecipe property)": [[1, "mcaddon.recipe.BrewingContainerRecipe.input"]], "input (mcaddon.recipe.brewingmixrecipe property)": [[1, "mcaddon.recipe.BrewingMixRecipe.input"]], "input (mcaddon.recipe.furnacerecipe property)": [[1, "mcaddon.recipe.FurnaceRecipe.input"]], "input (mcaddon.recipe.materialreductionrecipe property)": [[1, "mcaddon.recipe.MaterialReductionRecipe.input"]], "interface (mcaddon.constant.moduletype attribute)": [[1, "mcaddon.constant.ModuleType.interface"]], "interface() (mcaddon.manifest.module class method)": [[1, "mcaddon.manifest.Module.interface"]], "interval_range (mcaddon.block.queuedtickingcomponent property)": [[1, "mcaddon.block.QueuedTickingComponent.interval_range"]], "is_burnable() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.is_burnable"]], "is_cube() (mcaddon.util.box method)": [[1, "mcaddon.util.Box.is_cube"]], "is_hidden_in_commands (mcaddon.util.menucategory property)": [[1, "mcaddon.util.MenuCategory.is_hidden_in_commands"]], "is_namespace_valid() (mcaddon.util.identifier method)": [[1, "mcaddon.util.Identifier.is_namespace_valid"]], "is_none() (mcaddon.util.box method)": [[1, "mcaddon.util.Box.is_none"]], "is_path_valid() (mcaddon.util.identifier method)": [[1, "mcaddon.util.Identifier.is_path_valid"]], "item (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.item"]], "item (mcaddon.constant.texturetype attribute)": [[1, "mcaddon.constant.TextureType.item"]], "item (mcaddon.item.itemstack property)": [[1, "mcaddon.item.ItemStack.item"]], "item (mcaddon.loot.matchtoollootcondition property)": [[1, "mcaddon.loot.MatchToolLootCondition.item"]], "item (mcaddon.recipe.ingredient property)": [[1, "mcaddon.recipe.Ingredient.item"]], "item_component_type() (in module mcaddon.item)": [[1, "mcaddon.item.item_component_type"]], "items (mcaddon.constant.category attribute)": [[1, "mcaddon.constant.Category.items"]], "items (mcaddon.pack.resourcepack property)": [[1, "mcaddon.pack.ResourcePack.items"]], "items() (mcaddon.registry.registrykey method)": [[1, "mcaddon.registry.RegistryKey.items"]], "json() (mcaddon.file.jsonfile method)": [[1, "mcaddon.file.JsonFile.json"]], "json() (mcaddon.item.itemcomponent method)": [[1, "mcaddon.item.ItemComponent.json"]], "json() (mcaddon.volume.volumecomponent method)": [[1, "mcaddon.volume.VolumeComponent.json"]], "key (mcaddon.file.loader property)": [[1, "mcaddon.file.Loader.key"]], "key (mcaddon.recipe.shapedrecipe property)": [[1, "mcaddon.recipe.ShapedRecipe.key"]], "keys() (mcaddon.registry.registrykey method)": [[1, "mcaddon.registry.RegistryKey.keys"]], "land_on_block (mcaddon.event.teleport property)": [[1, "mcaddon.event.Teleport.land_on_block"]], "launch_power_scale (mcaddon.item.throwablecomponent property)": [[1, "mcaddon.item.ThrowableComponent.launch_power_scale"]], "levels (mcaddon.loot.enchantwithlevelslootfunction property)": [[1, "mcaddon.loot.EnchantWithLevelsLootFunction.levels"]], "license (mcaddon.manifest.metadata property)": [[1, "mcaddon.manifest.Metadata.license"]], "light_blue (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.light_blue"]], "light_gray (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.light_gray"]], "lime (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.lime"]], "listener (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.listener"]], "load() (mcaddon.file.archivefile class method)": [[1, "mcaddon.file.ArchiveFile.load"]], "load() (mcaddon.file.file class method)": [[1, "mcaddon.file.File.load"]], "load() (mcaddon.file.loader method)": [[1, "mcaddon.file.Loader.load"]], "load() (mcaddon.file.schema method)": [[1, "mcaddon.file.Schema.load"]], "load() (mcaddon.pack.addon class method)": [[1, "mcaddon.pack.Addon.load"]], "load() (mcaddon.pack.behaviorpack class method)": [[1, "mcaddon.pack.BehaviorPack.load"]], "load() (mcaddon.pack.resourcepack class method)": [[1, "mcaddon.pack.ResourcePack.load"]], "load() (mcaddon.resrouce.texture class method)": [[1, "mcaddon.resrouce.Texture.load"]], "lock_template_options (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.lock_template_options"]], "looping (mcaddon.block.queuedtickingcomponent property)": [[1, "mcaddon.block.QueuedTickingComponent.looping"]], "loot_condition() (in module mcaddon.loot)": [[1, "mcaddon.loot.loot_condition"]], "loot_function() (in module mcaddon.loot)": [[1, "mcaddon.loot.loot_function"]], "loot_table (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.loot_table"]], "loot_table (mcaddon.loot.fillcontainerlootfunction property)": [[1, "mcaddon.loot.FillContainerLootFunction.loot_table"]], "looting_multiplier (mcaddon.loot.randomchancewithlootinglootcondition property)": [[1, "mcaddon.loot.RandomChanceWithLootingLootCondition.looting_multiplier"]], "lore (mcaddon.loot.setlorelootfunction property)": [[1, "mcaddon.loot.SetLoreLootFunction.lore"]], "luminance (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.luminance"]], "magenta (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.magenta"]], "main() (in module mcaddon.cli)": [[1, "mcaddon.cli.main"]], "major (mcaddon.util.version property)": [[1, "mcaddon.util.Version.major"]], "mame (mcaddon.recipe.materialreductionrecipeloader attribute)": [[1, "mcaddon.recipe.MaterialReductionRecipeLoader.mame"]], "manifest (mcaddon.pack.pack property)": [[1, "mcaddon.pack.Pack.manifest"]], "manifests (mcaddon.pack.addon property)": [[1, "mcaddon.pack.Addon.manifests"]], "mansion (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.mansion"]], "map_color (mcaddon.block.block property)": [[1, "mcaddon.block.Block.map_color"]], "map_color (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.map_color"]], "material_reducer (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.material_reducer"]], "materials (mcaddon.block.materialinstancescomponent property)": [[1, "mcaddon.block.MaterialInstancesComponent.materials"]], "max (mcaddon.loot.lootnumberprovider property)": [[1, "mcaddon.loot.LootNumberProvider.max"]], "max_chance (mcaddon.loot.randomregionaldifficultychancelootcondition property)": [[1, "mcaddon.loot.RandomRegionalDifficultyChanceLootCondition.max_chance"]], "max_count (mcaddon.item.item property)": [[1, "mcaddon.item.Item.max_count"]], "max_count (mcaddon.item.itemsettings attribute)": [[1, "mcaddon.item.ItemSettings.max_count"]], "max_damage (mcaddon.item.item property)": [[1, "mcaddon.item.Item.max_damage"]], "max_damage (mcaddon.item.itemsettings attribute)": [[1, "mcaddon.item.ItemSettings.max_damage"]], "max_draw_duration (mcaddon.item.shootercomponent property)": [[1, "mcaddon.item.ShooterComponent.max_draw_duration"]], "max_draw_duration (mcaddon.item.throwablecomponent property)": [[1, "mcaddon.item.ThrowableComponent.max_draw_duration"]], "max_durability (mcaddon.item.durabilitycomponent property)": [[1, "mcaddon.item.DurabilityComponent.max_durability"]], "max_launch_power (mcaddon.item.throwablecomponent property)": [[1, "mcaddon.item.ThrowableComponent.max_launch_power"]], "max_range (mcaddon.event.teleport property)": [[1, "mcaddon.event.Teleport.max_range"]], "mcaddon": [[1, "module-mcaddon"]], "mcaddon.block": [[1, "module-mcaddon.block"]], "mcaddon.camera": [[1, "module-mcaddon.camera"]], "mcaddon.cli": [[1, "module-mcaddon.cli"]], "mcaddon.constant": [[1, "module-mcaddon.constant"]], "mcaddon.event": [[1, "module-mcaddon.event"]], "mcaddon.exception": [[1, "module-mcaddon.exception"]], "mcaddon.file": [[1, "module-mcaddon.file"]], "mcaddon.item": [[1, "module-mcaddon.item"]], "mcaddon.loot": [[1, "module-mcaddon.loot"]], "mcaddon.manifest": [[1, "module-mcaddon.manifest"]], "mcaddon.pack": [[1, "module-mcaddon.pack"]], "mcaddon.recipe": [[1, "module-mcaddon.recipe"]], "mcaddon.registry": [[1, "module-mcaddon.registry"]], "mcaddon.resrouce": [[1, "module-mcaddon.resrouce"]], "mcaddon.state": [[1, "module-mcaddon.state"]], "mcaddon.text": [[1, "module-mcaddon.text"]], "mcaddon.util": [[1, "module-mcaddon.util"]], "mcaddon.volume": [[1, "module-mcaddon.volume"]], "menu_category (mcaddon.block.block property)": [[1, "mcaddon.block.Block.menu_category"]], "menu_category (mcaddon.item.item property)": [[1, "mcaddon.item.Item.menu_category"]], "merge() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.merge"]], "merge() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.merge"]], "metadata (mcaddon.manifest.manifest property)": [[1, "mcaddon.manifest.Manifest.metadata"]], "min (mcaddon.loot.lootnumberprovider property)": [[1, "mcaddon.loot.LootNumberProvider.min"]], "min_draw_duration (mcaddon.item.throwablecomponent property)": [[1, "mcaddon.item.ThrowableComponent.min_draw_duration"]], "min_engine_version (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.min_engine_version"]], "min_fall_distance (mcaddon.block.onfalloncomponent property)": [[1, "mcaddon.block.OnFallOnComponent.min_fall_distance"]], "mineshaft (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.mineshaft"]], "minimum_critical_power (mcaddon.item.projectilecomponent property)": [[1, "mcaddon.item.ProjectileComponent.minimum_critical_power"]], "minor (mcaddon.util.version property)": [[1, "mcaddon.util.Version.minor"]], "mob_amount (mcaddon.event.damage property)": [[1, "mcaddon.event.Damage.mob_amount"]], "module": [[1, "module-mcaddon"], [1, "module-mcaddon.block"], [1, "module-mcaddon.camera"], [1, "module-mcaddon.cli"], [1, "module-mcaddon.constant"], [1, "module-mcaddon.event"], [1, "module-mcaddon.exception"], [1, "module-mcaddon.file"], [1, "module-mcaddon.item"], [1, "module-mcaddon.loot"], [1, "module-mcaddon.manifest"], [1, "module-mcaddon.pack"], [1, "module-mcaddon.recipe"], [1, "module-mcaddon.registry"], [1, "module-mcaddon.resrouce"], [1, "module-mcaddon.state"], [1, "module-mcaddon.text"], [1, "module-mcaddon.util"], [1, "module-mcaddon.volume"], [2, "module-mcaddon.schemas"], [2, "module-mcaddon.schemas.block"], [2, "module-mcaddon.schemas.camera"], [2, "module-mcaddon.schemas.item"], [2, "module-mcaddon.schemas.manifest"], [2, "module-mcaddon.schemas.recipe"], [2, "module-mcaddon.schemas.volume"]], "modules (mcaddon.manifest.manifest property)": [[1, "mcaddon.manifest.Manifest.modules"]], "monument (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.monument"]], "movement_modifier (mcaddon.item.usemodifierscomponent property)": [[1, "mcaddon.item.UseModifiersComponent.movement_modifier"]], "name (mcaddon.block.blockdescriptor property)": [[1, "mcaddon.block.BlockDescriptor.name"]], "name (mcaddon.block.blockloader attribute)": [[1, "mcaddon.block.BlockLoader.name"]], "name (mcaddon.camera.camerapresetloader attribute)": [[1, "mcaddon.camera.CameraPresetLoader.name"]], "name (mcaddon.file.loader property)": [[1, "mcaddon.file.Loader.name"]], "name (mcaddon.item.itemloader attribute)": [[1, "mcaddon.item.ItemLoader.name"]], "name (mcaddon.loot.itementry property)": [[1, "mcaddon.loot.ItemEntry.name"]], "name (mcaddon.loot.lootentry property)": [[1, "mcaddon.loot.LootEntry.name"]], "name (mcaddon.loot.setnamelootfunction property)": [[1, "mcaddon.loot.SetNameLootFunction.name"]], "name (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.name"]], "name (mcaddon.manifest.manifest property)": [[1, "mcaddon.manifest.Manifest.name"]], "name (mcaddon.manifest.manifestloader attribute)": [[1, "mcaddon.manifest.ManifestLoader.name"]], "name (mcaddon.pack.pack property)": [[1, "mcaddon.pack.Pack.name"]], "name (mcaddon.recipe.brewingcontainerrecipeloader attribute)": [[1, "mcaddon.recipe.BrewingContainerRecipeLoader.name"]], "name (mcaddon.recipe.brewingmixrecipeloader attribute)": [[1, "mcaddon.recipe.BrewingMixRecipeLoader.name"]], "name (mcaddon.recipe.furnacerecipeloader attribute)": [[1, "mcaddon.recipe.FurnaceRecipeLoader.name"]], "name (mcaddon.recipe.shapedrecipeloader attribute)": [[1, "mcaddon.recipe.ShapedRecipeLoader.name"]], "name (mcaddon.recipe.shapelessrecipeloader attribute)": [[1, "mcaddon.recipe.ShapelessRecipeLoader.name"]], "name (mcaddon.recipe.smithingtransformrecipeloader attribute)": [[1, "mcaddon.recipe.SmithingTransformRecipeLoader.name"]], "name (mcaddon.recipe.smithingtrimrecipeloader attribute)": [[1, "mcaddon.recipe.SmithingTrimRecipeLoader.name"]], "name_key (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.name_key"]], "namespace (mcaddon.util.identifier property)": [[1, "mcaddon.util.Identifier.namespace"]], "nature (mcaddon.constant.category attribute)": [[1, "mcaddon.constant.Category.nature"]], "no_collision() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.no_collision"]], "none (mcaddon.constant.cameralistener attribute)": [[1, "mcaddon.constant.CameraListener.none"]], "none (mcaddon.constant.category attribute)": [[1, "mcaddon.constant.Category.none"]], "none() (mcaddon.util.box class method)": [[1, "mcaddon.util.Box.none"]], "north (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.north"]], "num_mip_levels (mcaddon.resrouce.terrainatlas property)": [[1, "mcaddon.resrouce.TerrainAtlas.num_mip_levels"]], "nutrition (mcaddon.item.foodcomponent property)": [[1, "mcaddon.item.FoodComponent.nutrition"]], "offset() (mcaddon.block.transformationcomponent class method)": [[1, "mcaddon.block.TransformationComponent.offset"]], "on_enter (mcaddon.volume.onactorentercomponent property)": [[1, "mcaddon.volume.OnActorEnterComponent.on_enter"]], "on_leave (mcaddon.volume.onactorleavecomponent property)": [[1, "mcaddon.volume.OnActorLeaveComponent.on_leave"]], "on_tick (mcaddon.block.queuedtickingcomponent property)": [[1, "mcaddon.block.QueuedTickingComponent.on_tick"]], "on_tick (mcaddon.block.randomtickingcomponent property)": [[1, "mcaddon.block.RandomTickingComponent.on_tick"]], "opaque (mcaddon.constant.rendermethod attribute)": [[1, "mcaddon.constant.RenderMethod.opaque"]], "orange (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.orange"]], "origin (mcaddon.util.box property)": [[1, "mcaddon.util.Box.origin"]], "other (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.other"]], "output (mcaddon.recipe.brewingcontainerrecipe property)": [[1, "mcaddon.recipe.BrewingContainerRecipe.output"]], "output (mcaddon.recipe.brewingmixrecipe property)": [[1, "mcaddon.recipe.BrewingMixRecipe.output"]], "output (mcaddon.recipe.furnacerecipe property)": [[1, "mcaddon.recipe.FurnaceRecipe.output"]], "output (mcaddon.recipe.materialreductionrecipe property)": [[1, "mcaddon.recipe.MaterialReductionRecipe.output"]], "oxidized (mcaddon.constant.oxidationlevel attribute)": [[1, "mcaddon.constant.OxidationLevel.oxidized"]], "packs (mcaddon.pack.addon property)": [[1, "mcaddon.pack.Addon.packs"]], "padding (mcaddon.resrouce.terrainatlas property)": [[1, "mcaddon.resrouce.TerrainAtlas.padding"]], "pages (mcaddon.loot.setbookcontentslootfunction property)": [[1, "mcaddon.loot.SetBookContentsLootFunction.pages"]], "parent (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.parent"]], "parse() (mcaddon.util.identifier class method)": [[1, "mcaddon.util.Identifier.parse"]], "parse() (mcaddon.util.version class method)": [[1, "mcaddon.util.Version.parse"]], "patch (mcaddon.util.version property)": [[1, "mcaddon.util.Version.patch"]], "path (mcaddon.resrouce.texture property)": [[1, "mcaddon.resrouce.Texture.path"]], "path (mcaddon.util.identifier property)": [[1, "mcaddon.util.Identifier.path"]], "pattern (mcaddon.recipe.shapedrecipe property)": [[1, "mcaddon.recipe.ShapedRecipe.pattern"]], "peaceful (mcaddon.loot.randomdifficultychancelootcondition property)": [[1, "mcaddon.loot.RandomDifficultyChanceLootCondition.peaceful"]], "per_level_cost (mcaddon.loot.enchantbookfortradinglootfunction property)": [[1, "mcaddon.loot.EnchantBookForTradingLootFunction.per_level_cost"]], "per_level_random_cost (mcaddon.loot.enchantbookfortradinglootfunction property)": [[1, "mcaddon.loot.EnchantBookForTradingLootFunction.per_level_random_cost"]], "permutations (mcaddon.block.block property)": [[1, "mcaddon.block.Block.permutations"]], "picture_duration (mcaddon.item.cameracomponent property)": [[1, "mcaddon.item.CameraComponent.picture_duration"]], "pillageroutpost (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.pillageroutpost"]], "pink (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.pink"]], "player (mcaddon.constant.cameralistener attribute)": [[1, "mcaddon.constant.CameraListener.player"]], "player (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.player"]], "player_effects (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.player_effects"]], "pool_entry() (in module mcaddon.loot)": [[1, "mcaddon.loot.pool_entry"]], "pools (mcaddon.loot.loottable property)": [[1, "mcaddon.loot.LootTable.pools"]], "pos_x (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.pos_x"]], "pos_y (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.pos_y"]], "pos_z (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.pos_z"]], "preview (mcaddon.constant.edition attribute)": [[1, "mcaddon.constant.Edition.preview"]], "priority (mcaddon.volume.fogcomponent property)": [[1, "mcaddon.volume.FogComponent.priority"]], "projectile_entity (mcaddon.item.projectilecomponent property)": [[1, "mcaddon.item.ProjectileComponent.projectile_entity"]], "protection (mcaddon.item.wearablecomponent property)": [[1, "mcaddon.item.WearableComponent.protection"]], "purple (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.purple"]], "quality (mcaddon.loot.leafentry property)": [[1, "mcaddon.loot.LeafEntry.quality"]], "rarity() (mcaddon.item.itemsettings method)": [[1, "mcaddon.item.ItemSettings.rarity"]], "readdir() (mcaddon.file.archivefile class method)": [[1, "mcaddon.file.ArchiveFile.readdir"]], "readdir() (mcaddon.pack.addon class method)": [[1, "mcaddon.pack.Addon.readdir"]], "readdir() (mcaddon.pack.behaviorpack class method)": [[1, "mcaddon.pack.BehaviorPack.readdir"]], "readdir() (mcaddon.pack.resourcepack class method)": [[1, "mcaddon.pack.ResourcePack.readdir"]], "readzip() (mcaddon.file.archivefile class method)": [[1, "mcaddon.file.ArchiveFile.readzip"]], "readzip() (mcaddon.pack.addon class method)": [[1, "mcaddon.pack.Addon.readzip"]], "readzip() (mcaddon.pack.behaviorpack class method)": [[1, "mcaddon.pack.BehaviorPack.readzip"]], "readzip() (mcaddon.pack.resourcepack class method)": [[1, "mcaddon.pack.ResourcePack.readzip"]], "reagent (mcaddon.recipe.brewingcontainerrecipe property)": [[1, "mcaddon.recipe.BrewingContainerRecipe.reagent"]], "reagent (mcaddon.recipe.brewingmixrecipe property)": [[1, "mcaddon.recipe.BrewingMixRecipe.reagent"]], "recipe_remainder (mcaddon.item.item property)": [[1, "mcaddon.item.Item.recipe_remainder"]], "recipe_remainder (mcaddon.item.itemsettings attribute)": [[1, "mcaddon.item.ItemSettings.recipe_remainder"]], "recipe_type() (in module mcaddon.recipe)": [[1, "mcaddon.recipe.recipe_type"]], "red (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.red"]], "register() (mcaddon.registry.registry method)": [[1, "mcaddon.registry.Registry.register"]], "register() (mcaddon.registry.registrykey method)": [[1, "mcaddon.registry.RegistryKey.register"]], "remove_ammunition() (mcaddon.item.shootercomponent method)": [[1, "mcaddon.item.ShooterComponent.remove_ammunition"]], "remove_author() (mcaddon.manifest.metadata method)": [[1, "mcaddon.manifest.Metadata.remove_author"]], "remove_block() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.remove_block"]], "remove_block() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.remove_block"]], "remove_bone() (mcaddon.block.bonevisabilitycomponent method)": [[1, "mcaddon.block.BoneVisabilityComponent.remove_bone"]], "remove_component() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.remove_component"]], "remove_component() (mcaddon.block.blockpermutation method)": [[1, "mcaddon.block.BlockPermutation.remove_component"]], "remove_component() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.remove_component"]], "remove_component() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.remove_component"]], "remove_condition() (mcaddon.block.placementfiltercomponent method)": [[1, "mcaddon.block.PlacementFilterComponent.remove_condition"]], "remove_condition() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.remove_condition"]], "remove_condition() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.remove_condition"]], "remove_condition() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.remove_condition"]], "remove_crafting_tag() (mcaddon.block.craftingtablecomponent method)": [[1, "mcaddon.block.CraftingTableComponent.remove_crafting_tag"]], "remove_dependency() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.remove_dependency"]], "remove_entry() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.remove_entry"]], "remove_event() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.remove_event"]], "remove_event() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.remove_event"]], "remove_event() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.remove_event"]], "remove_event() (mcaddon.volume.onactorentercomponent method)": [[1, "mcaddon.volume.OnActorEnterComponent.remove_event"]], "remove_event() (mcaddon.volume.onactorleavecomponent method)": [[1, "mcaddon.volume.OnActorLeaveComponent.remove_event"]], "remove_event() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.remove_event"]], "remove_face() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.remove_face"]], "remove_file() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.remove_file"]], "remove_filter() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.remove_filter"]], "remove_function() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.remove_function"]], "remove_function() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.remove_function"]], "remove_function() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.remove_function"]], "remove_ingredient() (mcaddon.recipe.shapelessrecipe method)": [[1, "mcaddon.recipe.ShapelessRecipe.remove_ingredient"]], "remove_item() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.remove_item"]], "remove_item() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.remove_item"]], "remove_item_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.remove_item_texture"]], "remove_key() (mcaddon.recipe.shapedrecipe method)": [[1, "mcaddon.recipe.ShapedRecipe.remove_key"]], "remove_material() (mcaddon.block.materialinstancescomponent method)": [[1, "mcaddon.block.MaterialInstancesComponent.remove_material"]], "remove_module() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.remove_module"]], "remove_pack() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.remove_pack"]], "remove_permutation() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.remove_permutation"]], "remove_pool() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.remove_pool"]], "remove_recipe() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.remove_recipe"]], "remove_state() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.remove_state"]], "remove_tag() (mcaddon.block.blocktagscomponent method)": [[1, "mcaddon.block.BlockTagsComponent.remove_tag"]], "remove_tag() (mcaddon.recipe.recipe method)": [[1, "mcaddon.recipe.Recipe.remove_tag"]], "remove_terrain_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.remove_terrain_texture"]], "remove_trait() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.remove_trait"]], "remove_volume() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.remove_volume"]], "render_method (mcaddon.block.material property)": [[1, "mcaddon.block.Material.render_method"]], "repair_items (mcaddon.item.repairablecomponent property)": [[1, "mcaddon.item.RepairableComponent.repair_items"]], "replace() (mcaddon.util.identifier method)": [[1, "mcaddon.util.Identifier.replace"]], "replicate (mcaddon.resrouce.flipbooktexture property)": [[1, "mcaddon.resrouce.FlipbookTexture.replicate"]], "resistance (mcaddon.block.block property)": [[1, "mcaddon.block.Block.resistance"]], "resistance (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.resistance"]], "resource() (mcaddon.manifest.manifest class method)": [[1, "mcaddon.manifest.Manifest.resource"]], "resources (mcaddon.constant.moduletype attribute)": [[1, "mcaddon.constant.ModuleType.resources"]], "resources() (mcaddon.manifest.module class method)": [[1, "mcaddon.manifest.Module.resources"]], "result (mcaddon.recipe.recipe property)": [[1, "mcaddon.recipe.Recipe.result"]], "result (mcaddon.recipe.smithingtransformrecipe property)": [[1, "mcaddon.recipe.SmithingTransformRecipe.result"]], "rolls (mcaddon.loot.lootpool property)": [[1, "mcaddon.loot.LootPool.rolls"]], "rot_x (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.rot_x"]], "rot_y (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.rot_y"]], "rotate() (mcaddon.block.transformationcomponent class method)": [[1, "mcaddon.block.TransformationComponent.rotate"]], "rotation (mcaddon.block.transformationcomponent property)": [[1, "mcaddon.block.TransformationComponent.rotation"]], "ruins (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.ruins"]], "saturation_modifier (mcaddon.item.foodcomponent property)": [[1, "mcaddon.item.FoodComponent.saturation_modifier"]], "save() (mcaddon.file.archivefile method)": [[1, "mcaddon.file.ArchiveFile.save"]], "save() (mcaddon.file.file method)": [[1, "mcaddon.file.File.save"]], "save() (mcaddon.resrouce.texture method)": [[1, "mcaddon.resrouce.Texture.save"]], "scale (mcaddon.block.transformationcomponent property)": [[1, "mcaddon.block.TransformationComponent.scale"]], "scale_power_by_draw_duration (mcaddon.item.shootercomponent property)": [[1, "mcaddon.item.ShooterComponent.scale_power_by_draw_duration"]], "scale_power_by_draw_duration (mcaddon.item.throwablecomponent property)": [[1, "mcaddon.item.ThrowableComponent.scale_power_by_draw_duration"]], "scaled() (mcaddon.block.transformationcomponent class method)": [[1, "mcaddon.block.TransformationComponent.scaled"]], "schema() (mcaddon.file.schema method)": [[1, "mcaddon.file.Schema.schema"]], "schemafile (mcaddon.file.schema property)": [[1, "mcaddon.file.Schema.schemafile"]], "schemas (mcaddon.file.loader property)": [[1, "mcaddon.file.Loader.schemas"]], "seconds_to_destroy (mcaddon.block.destructiblebyminingcomponent property)": [[1, "mcaddon.block.DestructibleByMiningComponent.seconds_to_destroy"]], "selector (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.selector"]], "self (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.self"]], "set_condition() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.set_condition"]], "set_count() (mcaddon.item.itemsettings method)": [[1, "mcaddon.item.ItemSettings.set_count"]], "set_damage() (mcaddon.item.itemsettings method)": [[1, "mcaddon.item.ItemSettings.set_damage"]], "set_details() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.set_details"]], "set_hardness() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.set_hardness"]], "set_luminance() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.set_luminance"]], "set_module() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.set_module"]], "set_recipe_remainder() (mcaddon.item.itemsettings method)": [[1, "mcaddon.item.ItemSettings.set_recipe_remainder"]], "set_resistance() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.set_resistance"]], "set_slipperiness() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.set_slipperiness"]], "set_uuids() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.set_uuids"]], "set_uuids() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.set_uuids"]], "setup() (mcaddon.file.archivefile method)": [[1, "mcaddon.file.ArchiveFile.setup"]], "setup() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.setup"]], "setup() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.setup"]], "setup() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.setup"]], "shipwreck (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.shipwreck"]], "shutter_duration (mcaddon.item.cameracomponent property)": [[1, "mcaddon.item.CameraComponent.shutter_duration"]], "shutter_screen_ratio (mcaddon.item.cameracomponent property)": [[1, "mcaddon.item.CameraComponent.shutter_screen_ratio"]], "side (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.side"]], "size (mcaddon.util.box property)": [[1, "mcaddon.util.Box.size"]], "slide_away_duration (mcaddon.item.cameracomponent property)": [[1, "mcaddon.item.CameraComponent.slide_away_duration"]], "slipperiness (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.slipperiness"]], "slot (mcaddon.item.enchantablecomponent property)": [[1, "mcaddon.item.EnchantableComponent.slot"]], "slot (mcaddon.item.wearablecomponent property)": [[1, "mcaddon.item.WearableComponent.slot"]], "smithing_table (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.smithing_table"]], "smoker (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.smoker"]], "soul_campfire (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.soul_campfire"]], "sound (mcaddon.event.playsound property)": [[1, "mcaddon.event.PlaySound.sound"]], "sound_event (mcaddon.item.recordcomponent property)": [[1, "mcaddon.item.RecordComponent.sound_event"]], "sound_group (mcaddon.block.block property)": [[1, "mcaddon.block.Block.sound_group"]], "sound_group (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.sound_group"]], "sounds() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.sounds"]], "south (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.south"]], "split() (mcaddon.util.identifier method)": [[1, "mcaddon.util.Identifier.split"]], "stack() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.stack"]], "stack() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.stack"]], "startfile() (mcaddon.file.importable method)": [[1, "mcaddon.file.Importable.startfile"]], "state() (in module mcaddon.state)": [[1, "mcaddon.state.state"]], "states (mcaddon.block.block property)": [[1, "mcaddon.block.Block.states"]], "states (mcaddon.block.blockdescriptor property)": [[1, "mcaddon.block.BlockDescriptor.states"]], "states (mcaddon.event.setblockstate property)": [[1, "mcaddon.event.SetBlockState.states"]], "stonecutter (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.stonecutter"]], "strength() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.strength"]], "stringify() (in module mcaddon.util)": [[1, "mcaddon.util.stringify"]], "stronghold (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.stronghold"]], "suffix (mcaddon.pack.behaviorpack attribute)": [[1, "mcaddon.pack.BehaviorPack.suffix"]], "suffix (mcaddon.pack.pack property)": [[1, "mcaddon.pack.Pack.suffix"]], "suffix (mcaddon.pack.resourcepack attribute)": [[1, "mcaddon.pack.ResourcePack.suffix"]], "table (mcaddon.event.spawnloot property)": [[1, "mcaddon.event.SpawnLoot.table"]], "table_name (mcaddon.block.craftingtablecomponent property)": [[1, "mcaddon.block.CraftingTableComponent.table_name"]], "tag (mcaddon.recipe.ingredient property)": [[1, "mcaddon.recipe.Ingredient.tag"]], "tags (mcaddon.block.blockdescriptor property)": [[1, "mcaddon.block.BlockDescriptor.tags"]], "tags (mcaddon.block.blocktagscomponent property)": [[1, "mcaddon.block.BlockTagsComponent.tags"]], "tags (mcaddon.item.tagscomponent property)": [[1, "mcaddon.item.TagsComponent.tags"]], "tags (mcaddon.recipe.recipe property)": [[1, "mcaddon.recipe.Recipe.tags"]], "target (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.target"]], "target (mcaddon.event.event property)": [[1, "mcaddon.event.Event.target"]], "target (mcaddon.event.trigger property)": [[1, "mcaddon.event.Trigger.target"]], "template (mcaddon.recipe.smithingtransformrecipe property)": [[1, "mcaddon.recipe.SmithingTransformRecipe.template"]], "template (mcaddon.recipe.smithingtrimrecipe property)": [[1, "mcaddon.recipe.SmithingTrimRecipe.template"]], "temple (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.temple"]], "terrain (mcaddon.constant.texturetype attribute)": [[1, "mcaddon.constant.TextureType.terrain"]], "texts (mcaddon.pack.pack property)": [[1, "mcaddon.pack.Pack.texts"]], "texture (mcaddon.block.material property)": [[1, "mcaddon.block.Material.texture"]], "texture (mcaddon.item.iconcomponent property)": [[1, "mcaddon.item.IconComponent.texture"]], "ticks_per_frame (mcaddon.resrouce.flipbooktexture property)": [[1, "mcaddon.resrouce.FlipbookTexture.ticks_per_frame"]], "tiers (mcaddon.loot.lootpool property)": [[1, "mcaddon.loot.LootPool.tiers"]], "title (mcaddon.loot.setbookcontentslootfunction property)": [[1, "mcaddon.loot.SetBookContentsLootFunction.title"]], "traits (mcaddon.block.block property)": [[1, "mcaddon.block.Block.traits"]], "transform (mcaddon.event.transformiiem property)": [[1, "mcaddon.event.TransformiIem.transform"]], "translation (mcaddon.block.transformationcomponent property)": [[1, "mcaddon.block.TransformationComponent.translation"]], "translation_key() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.translation_key"]], "translation_key() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.translation_key"]], "treasure (mcaddon.loot.enchantrandomlylootfunction property)": [[1, "mcaddon.loot.EnchantRandomlyLootFunction.treasure"]], "treasure (mcaddon.loot.enchantwithlevelslootfunction property)": [[1, "mcaddon.loot.EnchantWithLevelsLootFunction.treasure"]], "type (mcaddon.block.block property)": [[1, "mcaddon.block.Block.type"]], "type (mcaddon.event.damage property)": [[1, "mcaddon.event.Damage.type"]], "type (mcaddon.loot.loottable property)": [[1, "mcaddon.loot.LootTable.type"]], "type (mcaddon.loot.setbannerdetailslootfunction property)": [[1, "mcaddon.loot.SetBannerDetailsLootFunction.type"]], "type (mcaddon.manifest.module property)": [[1, "mcaddon.manifest.Module.type"]], "unaffected (mcaddon.constant.oxidationlevel attribute)": [[1, "mcaddon.constant.OxidationLevel.unaffected"]], "up (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.up"]], "url (mcaddon.manifest.metadata property)": [[1, "mcaddon.manifest.Metadata.url"]], "use_duration (mcaddon.item.usemodifierscomponent property)": [[1, "mcaddon.item.UseModifiersComponent.use_duration"]], "use_efficiency (mcaddon.item.diggercomponent property)": [[1, "mcaddon.item.DiggerComponent.use_efficiency"]], "use_on (mcaddon.item.blockplacercomponent property)": [[1, "mcaddon.item.BlockPlacerComponent.use_on"]], "use_on (mcaddon.item.entityplacercomponent property)": [[1, "mcaddon.item.EntityPlacerComponent.use_on"]], "using_converts_to (mcaddon.item.foodcomponent property)": [[1, "mcaddon.item.FoodComponent.using_converts_to"]], "uuid (mcaddon.manifest.dependency property)": [[1, "mcaddon.manifest.Dependency.uuid"]], "uuid (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.uuid"]], "uuid (mcaddon.manifest.module property)": [[1, "mcaddon.manifest.Module.uuid"]], "validate() (mcaddon.file.loader method)": [[1, "mcaddon.file.Loader.validate"]], "value (mcaddon.block.frictioncomponent property)": [[1, "mcaddon.block.FrictionComponent.value"]], "value (mcaddon.block.simpleblockcomponent property)": [[1, "mcaddon.block.SimpleBlockComponent.value"]], "value (mcaddon.item.enchantablecomponent property)": [[1, "mcaddon.item.EnchantableComponent.value"]], "value (mcaddon.item.itemdisplaynamecomponent property)": [[1, "mcaddon.item.ItemDisplayNameComponent.value"]], "value (mcaddon.item.simpleitemcomponent property)": [[1, "mcaddon.item.SimpleItemComponent.value"]], "value (mcaddon.loot.hasmarkvariantlootcondition property)": [[1, "mcaddon.loot.HasMarkvariantLootCondition.value"]], "values (mcaddon.loot.randomauxvaluelootfunction property)": [[1, "mcaddon.loot.RandomAuxValueLootFunction.values"]], "values (mcaddon.loot.randomblockstatelootfunction property)": [[1, "mcaddon.loot.RandomBlockStateLootFunction.values"]], "values (mcaddon.state.blockstate property)": [[1, "mcaddon.state.BlockState.values"]], "values() (mcaddon.registry.registrykey method)": [[1, "mcaddon.registry.RegistryKey.values"]], "version (mcaddon.file.schema property)": [[1, "mcaddon.file.Schema.version"]], "version (mcaddon.manifest.dependency property)": [[1, "mcaddon.manifest.Dependency.version"]], "version (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.version"]], "version (mcaddon.manifest.module property)": [[1, "mcaddon.manifest.Module.version"]], "versions (mcaddon.pack.pack property)": [[1, "mcaddon.pack.Pack.versions"]], "vertical_half() (mcaddon.block.placementpositiontrait class method)": [[1, "mcaddon.block.PlacementPositionTrait.vertical_half"]], "village (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.village"]], "volume_component_type() (in module mcaddon.volume)": [[1, "mcaddon.volume.volume_component_type"]], "weathered (mcaddon.constant.oxidationlevel attribute)": [[1, "mcaddon.constant.OxidationLevel.weathered"]], "weight (mcaddon.loot.leafentry property)": [[1, "mcaddon.loot.LeafEntry.weight"]], "west (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.west"]], "white (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.white"]], "world_template (mcaddon.constant.moduletype attribute)": [[1, "mcaddon.constant.ModuleType.world_template"]], "world_template() (mcaddon.manifest.manifest class method)": [[1, "mcaddon.manifest.Manifest.world_template"]], "world_template() (mcaddon.manifest.module class method)": [[1, "mcaddon.manifest.Module.world_template"]], "write() (mcaddon.file.file method)": [[1, "mcaddon.file.File.write"]], "write() (mcaddon.file.jsonfile method)": [[1, "mcaddon.file.JsonFile.write"]], "write() (mcaddon.file.pngfile method)": [[1, "mcaddon.file.PngFile.write"]], "writedir() (mcaddon.file.archivefile method)": [[1, "mcaddon.file.ArchiveFile.writedir"]], "writedir() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.writedir"]], "writedir() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.writedir"]], "writedir() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.writedir"]], "writedir() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.writedir"]], "writezip() (mcaddon.file.archivefile method)": [[1, "mcaddon.file.ArchiveFile.writezip"]], "writezip() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.writezip"]], "writezip() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.writezip"]], "writezip() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.writezip"]], "writezip() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.writezip"]], "y_rotation_offset (mcaddon.block.placementdirectiontrait property)": [[1, "mcaddon.block.PlacementDirectionTrait.y_rotation_offset"]], "yellow (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.yellow"]], "blockschema1 (class in mcaddon.schemas.block)": [[2, "mcaddon.schemas.block.BlockSchema1"]], "brewingcontainerschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.BrewingContainerSchem1"]], "brewingmixschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.BrewingMixSchem1"]], "camerapresetschem1 (class in mcaddon.schemas.camera)": [[2, "mcaddon.schemas.camera.CameraPresetSchem1"]], "furnaceschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.FurnaceSchem1"]], "itemschema1 (class in mcaddon.schemas.item)": [[2, "mcaddon.schemas.item.ItemSchema1"]], "itemschema2 (class in mcaddon.schemas.item)": [[2, "mcaddon.schemas.item.ItemSchema2"]], "manifestschema1 (class in mcaddon.schemas.manifest)": [[2, "mcaddon.schemas.manifest.ManifestSchema1"]], "materialreductionschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.MaterialReductionSchem1"]], "shapedschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.ShapedSchem1"]], "shapelessschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.ShapelessSchem1"]], "smithingtransformschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.SmithingTransformSchem1"]], "smithingtransformschem2 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.SmithingTransformSchem2"]], "smithingtrimschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.SmithingTrimSchem1"]], "volumeschema1 (class in mcaddon.schemas.volume)": [[2, "mcaddon.schemas.volume.VolumeSchema1"]], "load() (mcaddon.schemas.block.blockschema1 method)": [[2, "mcaddon.schemas.block.BlockSchema1.load"]], "load() (mcaddon.schemas.camera.camerapresetschem1 method)": [[2, "mcaddon.schemas.camera.CameraPresetSchem1.load"]], "load() (mcaddon.schemas.item.itemschema1 method)": [[2, "mcaddon.schemas.item.ItemSchema1.load"]], "load() (mcaddon.schemas.item.itemschema2 method)": [[2, "mcaddon.schemas.item.ItemSchema2.load"]], "load() (mcaddon.schemas.manifest.manifestschema1 method)": [[2, "mcaddon.schemas.manifest.ManifestSchema1.load"]], "load() (mcaddon.schemas.recipe.brewingcontainerschem1 method)": [[2, "mcaddon.schemas.recipe.BrewingContainerSchem1.load"]], "load() (mcaddon.schemas.recipe.brewingmixschem1 method)": [[2, "mcaddon.schemas.recipe.BrewingMixSchem1.load"]], "load() (mcaddon.schemas.recipe.furnaceschem1 method)": [[2, "mcaddon.schemas.recipe.FurnaceSchem1.load"]], "load() (mcaddon.schemas.recipe.materialreductionschem1 method)": [[2, "mcaddon.schemas.recipe.MaterialReductionSchem1.load"]], "load() (mcaddon.schemas.recipe.shapedschem1 method)": [[2, "mcaddon.schemas.recipe.ShapedSchem1.load"]], "load() (mcaddon.schemas.recipe.shapelessschem1 method)": [[2, "mcaddon.schemas.recipe.ShapelessSchem1.load"]], "load() (mcaddon.schemas.recipe.smithingtransformschem1 method)": [[2, "mcaddon.schemas.recipe.SmithingTransformSchem1.load"]], "load() (mcaddon.schemas.recipe.smithingtransformschem2 method)": [[2, "mcaddon.schemas.recipe.SmithingTransformSchem2.load"]], "load() (mcaddon.schemas.recipe.smithingtrimschem1 method)": [[2, "mcaddon.schemas.recipe.SmithingTrimSchem1.load"]], "load() (mcaddon.schemas.volume.volumeschema1 method)": [[2, "mcaddon.schemas.volume.VolumeSchema1.load"]], "mcaddon.schemas": [[2, "module-mcaddon.schemas"]], "mcaddon.schemas.block": [[2, "module-mcaddon.schemas.block"]], "mcaddon.schemas.camera": [[2, "module-mcaddon.schemas.camera"]], "mcaddon.schemas.item": [[2, "module-mcaddon.schemas.item"]], "mcaddon.schemas.manifest": [[2, "module-mcaddon.schemas.manifest"]], "mcaddon.schemas.recipe": [[2, "module-mcaddon.schemas.recipe"]], "mcaddon.schemas.volume": [[2, "module-mcaddon.schemas.volume"]]}}) \ No newline at end of file +Search.setIndex({"docnames": ["index", "mcaddon", "mcaddon.schemas", "modules", "setup"], "filenames": ["index.rst", "mcaddon.rst", "mcaddon.schemas.rst", "modules.rst", "setup.rst"], "titles": ["Welcome to mcpackutils\u2019s documentation!", "mcaddon package", "mcaddon.schemas package", "mcaddon", "setup module"], "terms": {"packag": [0, 3], "setup": [0, 1, 3], "modul": [0, 3], "index": [0, 1], "search": 0, "page": [0, 1, 3], "block": 3, "compon": [1, 3], "blockcompon": [1, 3], "from_dict": [1, 3], "blockdescriptor": [1, 3], "name": [1, 3], "state": 3, "tag": [1, 3], "blocktag": [], "id": [1, 3], "bonevisabilitycompon": [1, 3], "bone": [1, 3], "box": [1, 3], "cube": [1, 3], "none": [1, 3], "origin": [1, 3], "size": [1, 3], "breathabilitycompon": [1, 3], "valu": [1, 3], "collisionboxcompon": [1, 3], "craftingtablecompon": [1, 3], "crafting_tag": [1, 3], "table_nam": [1, 3], "destructiblebyexplosioncompon": [1, 3], "explosion_resist": [1, 3], "destructiblebyminingcompon": [1, 3], "seconds_to_destori": [], "displaynamecompon": [], "filter": [1, 3], "allowed_fac": [1, 3], "block_filt": [1, 3], "flammablecompon": [1, 3], "catch_chance_modifi": [1, 3], "destroy_chance_modifi": [1, 3], "frictioncompon": [1, 3], "geometrycompon": [1, 3], "lightdampeningcompon": [1, 3], "lightemissioncompon": [1, 3], "lootcompon": [1, 3], "mapcolorcompon": [1, 3], "materi": [1, 3], "ambient_occlus": [1, 3], "face_dim": [1, 3], "render_method": [1, 3], "textur": [1, 3], "materialinstancescompon": [1, 3], "add_materi": [1, 3], "get_materi": [1, 3], "remove_materi": [1, 3], "onfalloncompon": [1, 3], "min_fall_dist": [1, 3], "oninteractcompon": [1, 3], "onplacedcompon": [1, 3], "onplayerdestroyedcompon": [1, 3], "onplayerplacingcompon": [1, 3], "onstepoffcompon": [1, 3], "onsteponcompon": [1, 3], "placementfiltercompon": [1, 3], "condit": [1, 3], "queuedtickingcompon": [1, 3], "interval_rang": [1, 3], "loop": [1, 3], "on_tick": [1, 3], "randomtickingcompon": [1, 3], "selectionboxcompon": [1, 3], "transformationcompon": [1, 3], "rotat": [1, 3], "scale": [1, 3], "translat": [1, 3], "unitcubecompon": [1, 3], "activest": [1, 3], "agebitst": [1, 3], "agest": [1, 3], "allowunderwaterbitst": [1, 3], "attachedbitst": [1, 3], "attachmentst": [1, 3], "bambooleafsizest": [1, 3], "bamboostalkthicknessst": [1, 3], "bigdripleaftiltst": [1, 3], "bitecounterst": [1, 3], "blockfacest": [1, 3], "blockstat": [1, 3], "booksstoredst": [1, 3], "booleanst": [1, 3], "brewingstandslotabitst": [1, 3], "brewingstandslotbbitst": [1, 3], "brewingstandslotcbitst": [1, 3], "brushedprogressst": [1, 3], "buttonpressedbitst": [1, 3], "candlesst": [1, 3], "cardinaldirectionst": [1, 3], "cauldronliquidst": [1, 3], "chemistrytabletypest": [1, 3], "chiseltypest": [1, 3], "clustercountst": [1, 3], "colorbitst": [1, 3], "colorst": [1, 3], "conditionalbitst": [1, 3], "coralcolorst": [1, 3], "coraldirectionst": [1, 3], "coralhangtypebitst": [1, 3], "coveredbitst": [1, 3], "crackedst": [1, 3], "craftingst": [1, 3], "damagest": [1, 3], "deadbitst": [1, 3], "directionst": [1, 3], "dirttypest": [1, 3], "disarmedbitst": [1, 3], "doorhingebitst": [1, 3], "doubleplanttypest": [1, 3], "dragdownst": [1, 3], "dripstonethicknessst": [1, 3], "endportaleyebitst": [1, 3], "explodebitst": [1, 3], "facingdirectionst": [1, 3], "filllevelst": [1, 3], "flowertypest": [1, 3], "groundsigndirectionst": [1, 3], "growthstat": [1, 3], "hangingst": [1, 3], "headpiecebitst": [1, 3], "heightstat": [1, 3], "hugemushroombitsst": [1, 3], "inwallbitst": [1, 3], "infiniburnbitst": [1, 3], "integerst": [1, 3], "itemframemapbitst": [1, 3], "itemframephotobitst": [1, 3], "liquiddepthst": [1, 3], "moisturizedamountst": [1, 3], "monstereggstonetypest": [1, 3], "newleaftypest": [1, 3], "newlogtypest": [1, 3], "nodropbitst": [1, 3], "occupiedbitst": [1, 3], "oldleaftypest": [1, 3], "oldlogtypest": [1, 3], "openbitst": [1, 3], "orientationst": [1, 3], "outputlitbitst": [1, 3], "outputsubtractbitst": [1, 3], "persistentbitst": [1, 3], "portalaxisst": [1, 3], "poweredbitst": [1, 3], "raildatabitst": [1, 3], "raildirectionst": [1, 3], "redstonesignalst": [1, 3], "repeaterdelayst": [1, 3], "sandstonetypest": [1, 3], "sandtypest": [1, 3], "saplingtypest": [1, 3], "sculksensorphasest": [1, 3], "seagrasstypest": [1, 3], "spongetypest": [1, 3], "stabilitycheckst": [1, 3], "stabilityst": [1, 3], "stonebricktypest": [1, 3], "stoneslabtype2st": [1, 3], "stoneslabtype3st": [1, 3], "stoneslabtype4st": [1, 3], "stoneslabtypest": [1, 3], "stonetypest": [1, 3], "strippedbitst": [1, 3], "structureblocktypest": [1, 3], "structurevoidtypest": [1, 3], "suspendedbitst": [1, 3], "tallgrasstypest": [1, 3], "togglebitst": [1, 3], "topslotbitst": [1, 3], "torchfacingdirectionst": [1, 3], "triggedbitst": [1, 3], "turtleeggcountst": [1, 3], "updatebitst": [1, 3], "upperblockbitst": [1, 3], "upsidedownbitst": [1, 3], "verticalhalfst": [1, 3], "vinedirectionbitsst": [1, 3], "wallblocktypest": [1, 3], "wallconnectiontypeastst": [1, 3], "wallconnectiontypenorthst": [1, 3], "wallconnectiontypesouthst": [1, 3], "wallconnectiontypewestst": [1, 3], "wallpostbitst": [1, 3], "weirdodirectionst": [1, 3], "woodtypest": [1, 3], "trait": [1, 3], "blocktrait": [1, 3], "enabled_st": [1, 3], "placementdirectiontrait": [1, 3], "all": [1, 3], "cardin": [1, 3], "face": [1, 3], "y_rotation_offset": [1, 3], "placementpositiontrait": [1, 3], "block_fac": [1, 3], "vertical_half": [1, 3], "add_compon": [1, 3], "add_ev": [1, 3], "add_permut": [1, 3], "add_stat": [1, 3], "add_trait": [1, 3], "clear_compon": [1, 3], "clear_ev": [1, 3], "clear_permut": [1, 3], "clear_stat": [1, 3], "clear_trait": [1, 3], "format_vers": 1, "get_compon": [1, 3], "get_ev": [1, 3], "get_permut": [1, 3], "get_stat": [1, 3], "get_trait": [1, 3], "identifi": [1, 3], "menu_categori": [1, 3], "permut": [1, 3], "remove_compon": [1, 3], "remove_ev": [1, 3], "remove_permut": [1, 3], "remove_st": [1, 3], "remove_trait": [1, 3], "type": [1, 3], "blockpermut": [1, 3], "bushblock": [], "buttonblock": [], "cakeblock": [], "add_candle_cak": [], "clear_candle_cak": [], "get_candle_cak": [], "remove_candle_cak": [], "candlecakeblock": [], "cauldronblock": [], "cauldronlevelblock": [], "cropblock": [], "doorblock": [], "fenceblock": [], "fencegateblock": [], "glasspan": [], "lanternblock": [], "pressureplateblock": [], "saplingblock": [], "slabblock": [], "stairsblock": [], "torchblock": [], "trapdoorblock": [], "wallblock": [], "entiti": [1, 3], "entitycompon": [], "item": 3, "allowoffhandcompon": [1, 3], "blockplacercompon": [1, 3], "use_on": [1, 3], "candestroyincreativecompon": [1, 3], "cooldowncompon": [1, 3], "categori": [1, 3], "durat": [1, 3], "damagecompon": [1, 3], "durabilitycompon": [1, 3], "damage_ch": [1, 3], "max_dur": [1, 3], "enchantablecompon": [1, 3], "slot": [1, 3], "entityplacercompon": [1, 3], "dispense_on": [1, 3], "foodcompon": [1, 3], "can_always_eat": [1, 3], "nutrit": [1, 3], "saturation_modifi": [1, 3], "using_converts_to": [1, 3], "fuelcompon": [1, 3], "glintcompon": [1, 3], "handequippedcompon": [1, 3], "hovertextcolorcompon": [1, 3], "iconcompon": [1, 3], "interactbuttoncompon": [1, 3], "itemcompon": [1, 3], "json": [1, 2, 3], "itemstoragecompon": [1, 3], "capac": [1, 3], "liquidclippedcompon": [1, 3], "maxstacksizecompon": [1, 3], "projectilecompon": [1, 3], "minimum_critical_pow": [1, 3], "projectile_ent": [1, 3], "recordcompon": [1, 3], "comparator_sign": [1, 3], "sound_ev": [1, 3], "repairitem": [1, 3], "repairablecompon": [1, 3], "repair_item": [1, 3], "shootercompon": [1, 3], "ammunit": [1, 3], "charge_on_draw": [1, 3], "max_draw_dur": [1, 3], "scale_power_by_draw_dur": [1, 3], "shoulddespawncompon": [1, 3], "stackedbydatacompon": [1, 3], "tagscompon": [1, 3], "throwablecompon": [1, 3], "do_swing_anim": [1, 3], "launch_power_scal": [1, 3], "max_launch_pow": [1, 3], "min_draw_dur": [1, 3], "useanimationcompon": [1, 3], "usemodifierscompon": [1, 3], "movement_modifi": [1, 3], "use_dur": [1, 3], "wearablecompon": [1, 3], "destroy_spe": [1, 3], "use_effici": [1, 3], "appleitem": [], "class": [1, 2], "qualnam": 1, "start": 1, "1": 1, "boundari": 1, "base": [1, 2, 3], "enum": 1, "command": [1, 3], "construct": [1, 3], "equip": [1, 3], "natur": [1, 3], "color": [1, 3], "black": [1, 3], "blue": [1, 3], "brown": [1, 3], "cyan": [1, 3], "grai": [1, 3], "green": [1, 3], "light_blu": [1, 3], "light_grai": [1, 3], "lime": [1, 3], "magenta": [1, 3], "orang": [1, 3], "pink": [1, 3], "purpl": [1, 3], "red": [1, 3], "white": [1, 3], "yellow": [1, 3], "eventtarget": [1, 3], "babi": [1, 3], "damag": [1, 3], "holder": [1, 3], "other": [1, 3], "parent": [1, 3], "player": [1, 3], "self": [1, 2, 3], "target": [1, 3], "moduletyp": [1, 3], "client_data": [1, 3], "data": [1, 2, 3], "interfac": [1, 3], "resourc": [1, 3], "world_templ": [1, 3], "recipetag": [1, 3], "brewing_stand": [1, 3], "campfir": [1, 3], "crafting_t": [1, 3], "furnac": [1, 3], "smithing_t": [1, 3], "smoker": [1, 3], "soul_campfir": [1, 3], "stonecutt": [1, 3], "rendermethod": [1, 3], "alpha_test": [1, 3], "blend": [1, 3], "double_sid": [1, 3], "opaqu": [1, 3], "useanim": [1, 3], "camera": 3, "drink": [1, 3], "eat": [1, 3], "addmobeffect": [1, 3], "effect": [1, 3], "str": 1, "amplifi": [1, 3], "int": 1, "0": 1, "float": 1, "properti": 1, "minecraft": 1, "add_mob_effect": 1, "amount": [1, 3], "mob_amount": [1, 3], "decrementblockst": [1, 3], "setblockst": [1, 3], "decrementstack": [1, 3], "decrement_stack": 1, "die": [1, 3], "object": [1, 2], "classmethod": 1, "dict": [1, 2], "incrementblockst": [1, 3], "playeffect": [1, 3], "play_effect": 1, "playsound": [1, 3], "sound": [1, 3], "play_sound": 1, "random": [1, 3], "sequenc": [1, 3], "randomli": 1, "run": 1, "respons": 1, "removemobeffect": [1, 3], "remove_mob_effect": 1, "runcommand": [1, 3], "list": 1, "run_command": 1, "event_exist": [1, 3], "bool": 1, "get_condit": [1, 3], "molang": 1, "remove_condit": [1, 3], "set_condit": [1, 3], "setblock": [1, 3], "block_typ": [1, 3], "set_block": 1, "setblockatpo": [1, 3], "block_offset": [1, 3], "set_block_at_po": 1, "set_block_st": 1, "spawnloot": [1, 3], "tabl": [1, 3], "spawn_loot": 1, "swing": [1, 3], "switchblockst": [1, 3], "teleport": [1, 3], "avoid_wat": [1, 3], "true": 1, "destin": [1, 3], "land_on_block": [1, 3], "max_rang": [1, 3], "8": 1, "transformiiem": [1, 3], "transform": [1, 3], "transform_item": 1, "trigger": [1, 3], "add": [1, 3], "thi": [1, 2], "parser": 1, "paramet": 1, "The": 1, "loottabl": [1, 3], "saveabl": [], "depend": [1, 3], "uuid": [1, 3], "version": [1, 2, 3], "header": [1, 3], "min_engine_vers": [1, 3], "exampl": 1, "descript": [1, 3], "gener": [1, 3], "us": [1, 2], "allow_random_se": [1, 3], "base_game_vers": [1, 3], "lock_template_opt": [1, 3], "description_kei": [1, 3], "name_kei": [1, 3], "metadata": [1, 3], "add_depend": [1, 3], "add_modul": [1, 3], "behavior": [1, 3], "clear_depend": [1, 3], "clear_modul": [1, 3], "get_depend": [1, 3], "get_modul": [1, 3], "remove_depend": [1, 3], "remove_modul": [1, 3], "licens": [1, 3], "url": [1, 3], "add_author": [1, 3], "author": [1, 3], "clear_author": [1, 3], "get_author": [1, 3], "remove_author": [1, 3], "resourcepack": [1, 3], "behaviorpack": [1, 3], "add_block": [1, 3], "add_item": [1, 3], "clear_block": [1, 3], "clear_item": [1, 3], "remove_block": [1, 3], "remove_item": [1, 3], "save": [1, 3], "fp": 1, "save_fold": [], "path": [1, 3], "save_zipfil": [], "__commonpack": [], "kw": 1, "folder": 1, "directori": 2, "writezip": [1, 3], "zip": 1, "zipfil": 1, "file": [2, 3], "namespac": [1, 3], "default_namespac": [1, 3], "seper": [1, 3], "copi": [1, 3], "return": 1, "copy_with_namespac": [1, 3], "new": 1, "copy_with_path": [1, 3], "is_namespace_valid": [1, 3], "valid": [1, 3], "option": 1, "default": 1, "whether": 1, "": 1, "is_path_valid": [1, 3], "pars": [1, 3], "an": 1, "replac": [1, 3], "old": 1, "count": [1, 3], "split": [1, 3], "tupl": 1, "menucategori": [1, 3], "group": [1, 3], "is_hidden_in_command": [1, 3], "fals": 1, "string": 1, "ab": [], "absolut": [], "aco": [], "arcco": [], "b": 1, "and_": [], "append": [], "asin": [], "arcsin": [], "atan": [], "arctan": [], "atan2": [], "y": 1, "x": 1, "note": 1, "order": 1, "argument": 1, "block_stat": [1, 3], "cell": [], "round": [], "up": [1, 3], "nearest": [], "integr": [], "number": 1, "clamp": [], "min": [1, 3], "max": [1, 3], "between": 1, "inclus": 1, "context": [], "variable_nam": [], "read": [], "onli": 1, "storag": 1, "provid": 1, "game": 1, "certain": 1, "scenario": [], "variabl": [], "co": [], "cosin": [], "degre": [], "die_rol": [], "num": [], "low": [], "high": [], "sum": [], "each": [1, 2], "from": [1, 2], "ar": 1, "integ": [], "like": 1, "normal": 1, "dice": [], "For": 1, "math": [], "die_roll_integ": [], "div": [], "exp": [], "calcul": [], "e": [], "th": [], "power": 1, "floor": [], "down": [1, 3], "geometri": [1, 3], "texture_nam": 1, "A": 1, "refer": 1, "definit": 1, "gt": [], "gteq": [], "has_block_st": [], "hermite_blend": [], "simpl": [], "smooth": [], "curv": [], "interpol": [], "one": 1, "hermit": [], "basi": [], "function": [1, 3], "3t": [], "2": 1, "2t": [], "3": [], "while": 1, "ani": 1, "i": 1, "input": [1, 3], "work": [], "best": [], "rang": 1, "lerp": [], "zero_to_on": [], "end": [], "via": [], "0_to_1": [], "lerprot": [], "shortest": [], "direct": 1, "around": 1, "circl": [], "ln": [], "logarithm": [], "lt": [], "lteq": [], "highest": [], "lowest": [], "min_angl": [], "minim": 1, "angl": [], "magnitud": [], "180": 1, "mod": [], "denomin": [], "remaind": [], "mul": [], "not_": [], "or_": [], "paren": [], "lang": 1, "pi": [], "represent": [], "pow": [], "expon": [], "elev": [], "prepend": [], "queri": 1, "function_nam": [], "arg": 1, "access": [], "random_integ": [], "sin": [], "sine": [], "sqrt": [], "squar": [], "root": [], "sub": [], "temp": [], "write": [1, 3], "temporari": [], "trunc": [], "toward": [], "zero": [], "actor": 1, "load": [1, 2, 3], "convert": [1, 2], "format": [1, 2], "stringifi": [1, 3], "indent": 1, "level": [1, 3], "desc": [], "bone_vis": [1, 3], "16": 1, "breathabl": 1, "collision_box": 1, "destructible_by_explos": 1, "destructible_by_min": 1, "display_nam": 1, "blockfac": [1, 3], "flammabl": 1, "friction": 1, "light_dampen": 1, "light_emiss": 1, "loot": 3, "map_color": [1, 3], "instance_nam": 1, "material_inst": 1, "event": 3, "on_fall_on": 1, "on_interact": 1, "on_plac": 1, "on_player_destori": [], "on_player_plac": 1, "on_step_off": 1, "on_step_on": 1, "placement_filt": 1, "queued_tick": 1, "random_tick": 1, "selection_box": 1, "unit_cub": 1, "cl": 1, "activ": 1, "age_bit": 1, "ag": 1, "allow_underwater_bit": 1, "attached_bit": 1, "attach": 1, "bamboo_leaf_s": 1, "bamboo_stalk": 1, "bigt_dripleaf_tilt": 1, "bite_count": 1, "books_stor": 1, "brewing_stand_slot_a_bit": 1, "brewing_stand_slot_b_bit": 1, "brewing_stand_slot_c_bit": 1, "brushed_progress": 1, "button_pressed_bit": 1, "candl": 1, "cardinal_direct": 1, "cauldron_liquid": 1, "chemistry_table_typ": 1, "chisel_typ": 1, "cluster_count": 1, "color_bit": 1, "conditional_bit": 1, "coral_color": 1, "coral_direct": 1, "coral_hang_type_bit": 1, "coverted_bit": 1, "cracked_st": 1, "craft": 1, "dead_bit": 1, "dirt_typ": 1, "disarmed_bit": 1, "door_hinge_bit": 1, "double_plant_typ": 1, "drag_down": 1, "dripstone_thick": 1, "end_portal_eye_bit": 1, "explode_bit": 1, "facing_direct": 1, "fill_level": 1, "flower_typ": 1, "ground_sign_direct": 1, "growth": 1, "hang": 1, "head_piece_bit": 1, "height": 1, "huge_mushroom_bit": 1, "in_wall_bit": 1, "infiniburn_bit": 1, "stop": 1, "item_frame_map_bit": 1, "item_frame_photo_bit": 1, "liquid_depth": 1, "moisturized_amount": 1, "monster_egg_stone_typ": 1, "new_leaf_typ": 1, "new_log_typ": 1, "no_drop_bit": 1, "occupied_bit": 1, "old_leaf_typ": 1, "old_log_typ": 1, "open_bit": 1, "orient": 1, "output_lit_bit": 1, "output_subtract_bit": 1, "persistent_bit": 1, "portal_axi": 1, "powered_bit": 1, "rail_data_bit": 1, "rail_direct": 1, "redstone_sign": 1, "repeater_delai": 1, "sand_stone_typ": 1, "sand_typ": 1, "sapling_typ": 1, "sculk_sensor_phas": 1, "sea_grass_typ": 1, "sponge_typ": 1, "stability_check": 1, "stabil": 1, "stone_brick_typ": 1, "stone_slab_type2": 1, "stone_slab_type3": 1, "stone_slab_type_4": 1, "stone_slab_typ": 1, "stone_typ": 1, "stripped_bit": 1, "structure_block_typ": 1, "structure_void_typ": 1, "suspended_bit": 1, "tall_grass_typ": 1, "toggle_bit": 1, "top_slot_bit": 1, "torch_facing_direct": 1, "triggered_bit": 1, "turtle_egg_count": 1, "update_bit": 1, "upper_block_bit": 1, "upside_down_bit": 1, "vine_direction_bit": 1, "wall_block_typ": 1, "wall_connection_type_east": 1, "wall_connection_type_north": 1, "wall_connection_type_south": 1, "wall_connection_type_west": 1, "wall_post_bit": 1, "weirdo_direct": 1, "wood_typ": 1, "equival": 1, "placement_direct": 1, "placement_posit": 1, "20": 1, "51": [], "bush": [], "button": 1, "cake": [], "candle_cak": [], "empty_bucket": [], "bucket": [], "filled_bucket": [], "lava_bucket": [], "cauldron": [], "water_bucket": [], "empty_bottl": [], "glass_bottl": [], "filled_bottl": [], "water_bottl": [], "cauldron_level": [], "crop": 1, "door": [], "fenc": [], "fence_g": [], "glass_pan": [], "lantern": [], "pressure_pl": [], "structur": [], "sapl": [], "slab": [], "stair": [], "torch": [], "trapdoor": [], "wall": [], "allow_off_hand": 1, "block_plac": 1, "can_destroy_in_cr": 1, "cooldown": 1, "durabl": [1, 3], "enchant": [1, 3], "entity_plac": 1, "food": 1, "fuel": 1, "glint": 1, "hand_equip": 1, "hover_text_color": 1, "icon": 1, "interact_button": 1, "item_storag": 1, "liquid_clip": 1, "max_stack_s": 1, "projectil": 1, "record": 1, "repair": 1, "shooter": 1, "should_despawn": 1, "stacked_by_data": 1, "throwabl": 1, "use_anim": 1, "use_modifi": 1, "digger": 1, "subpackag": 3, "submodul": 3, "content": 3, "addon": [1, 3], "anim": 1, "biom": [], "constant": 3, "featur": [], "fog": 1, "manifest": 3, "pack": 3, "particl": 1, "recip": 3, "texture_set": [], "util": 3, "volum": 3, "mcaddon": 0, "mcpackutil": [], "filenam": [1, 3], "from_fileobj": [1, 3], "fileobj": 1, "textiowrapp": 1, "mode": [], "from_ast": [], "ast_nod": [], "schema": [1, 3], "schemafil": [1, 3], "getattr2": [1, 3], "o": 1, "getattr": 1, "defin": 1, "setattr": 1, "my_funct": [], "east": [1, 3], "north": [1, 3], "side": [1, 3], "south": [1, 3], "west": [1, 3], "cameralisten": [1, 3], "buriedtreasur": [1, 3], "endciti": [1, 3], "fortress": [1, 3], "mansion": [1, 3], "mineshaft": [1, 3], "monument": [1, 3], "pillageroutpost": [1, 3], "ruin": [1, 3], "shipwreck": [1, 3], "stronghold": [1, 3], "templ": [1, 3], "villag": [1, 3], "edit": [1, 3], "bedrock": [1, 3], "educ": [1, 3], "preview": [1, 3], "lootcontexttyp": [1, 3], "advancement_ent": [1, 3], "advancement_loc": [1, 3], "advancement_reward": [1, 3], "archaeologi": [1, 3], "barter": [1, 3], "chest": [1, 3], "empti": [1, 3], "fish": [1, 3], "gift": [1, 3], "selector": [1, 3], "oxidationlevel": [1, 3], "expos": [1, 3], "oxid": [1, 3], "unaffect": [1, 3], "weather": [1, 3], "texturetyp": [1, 3], "terrain": [1, 3], "is_cub": [1, 3], "is_non": [1, 3], "alia": 1, "major": [1, 3], "minor": [1, 3], "patch": [1, 3], "componentnotfounderror": [1, 3], "error": [1, 3], "eventnotfounderror": [1, 3], "manifestnotfounderror": [1, 3], "minecraftnotfounderror": [1, 3], "recipetypenotfounderror": [1, 3], "registryerror": [1, 3], "schemanotfounderror": [1, 3], "syntaxerror": [1, 3], "typenotfounderror": [1, 3], "block_component_typ": [1, 3], "block_trait": [1, 3], "event_typ": [1, 3], "item_component_typ": [1, 3], "loot_condition_typ": [1, 3], "loot_function_typ": [1, 3], "pool_entry_typ": [1, 3], "recipe_typ": [1, 3], "volume_component_typ": [1, 3], "create_registri": [1, 3], "get_registri": [1, 3], "registrykei": [1, 3], "regist": [1, 3], "obj": 1, "get": [1, 3], "kei": [1, 3], "cli": 3, "except": 3, "registri": 3, "resrouc": 3, "text": 3, "blockschema1": [1, 2], "camerapresetschem1": [1, 2], "itemschema1": [1, 2], "itemschema2": [1, 2], "manifestschema1": [1, 2], "brewingcontainerschem1": [1, 2], "brewingmixschem1": [1, 2], "furnaceschem1": [1, 2], "materialreductionschem1": [1, 2], "shapedschem1": [1, 2], "shapelessschem1": [1, 2], "smithingtransformschem1": [1, 2], "smithingtransformschem2": [1, 2], "smithingtrimschem1": [1, 2], "volumeschema1": [1, 2], "sound_group": [1, 3], "jsonfil": [1, 3], "dirnam": [1, 3], "extens": [1, 3], "from_set": [1, 3], "set": 1, "blockset": [1, 3], "get_collision_shap": [1, 3], "overrid": 1, "method": 1, "custom": 1, "collis": 1, "shape": 1, "get_selection_shap": [1, 3], "select": 1, "hard": [1, 3], "resist": [1, 3], "stack": [1, 3], "translation_kei": [1, 3], "blockdisplaynamecompon": [1, 3], "simpleblockcompon": [1, 3], "clazz": [1, 3], "blockload": [1, 3], "loader": [1, 3], "collid": [1, 3], "slipperi": [1, 3], "loot_tabl": [1, 3], "burnabl": [1, 3], "lumin": [1, 3], "configur": 1, "common": 1, "breakinstantli": [1, 3], "dropslik": [1, 3], "sourc": 1, "dropsnoth": [1, 3], "is_burn": [1, 3], "no_collis": [1, 3], "set_hard": [1, 3], "set_lumin": [1, 3], "set_resist": [1, 3], "set_slipperi": [1, 3], "strength": [1, 3], "blocktagscompon": [1, 3], "add_tag": [1, 3], "clear_tag": [1, 3], "get_tag": [1, 3], "remove_tag": [1, 3], "add_bon": [1, 3], "clear_bon": [1, 3], "get_bon": [1, 3], "remove_bon": [1, 3], "add_crafting_tag": [1, 3], "clear_crafting_tag": [1, 3], "get_crafting_tag": [1, 3], "remove_crafting_tag": [1, 3], "seconds_to_destroi": [1, 3], "add_fac": [1, 3], "add_filt": [1, 3], "clear_fac": [1, 3], "clear_filt": [1, 3], "get_fac": [1, 3], "get_filt": [1, 3], "remove_fac": [1, 3], "remove_filt": [1, 3], "on_player_destroi": 1, "add_condit": [1, 3], "clear_condit": [1, 3], "bottom": 1, "offset": [1, 3], "z": 1, "camerapreset": [1, 2, 3], "inherit_from": [1, 3], "player_effect": [1, 3], "pos_x": [1, 3], "pos_i": [1, 3], "pos_z": [1, 3], "rot_x": [1, 3], "rot_i": [1, 3], "listen": [1, 3], "camera_preset": 1, "camerapresetload": [1, 3], "main": [1, 3], "archivefil": [1, 3], "getvalu": [1, 3], "byte": 1, "has_filenam": [1, 3], "readdir": [1, 3], "readzip": [1, 3], "overwrit": 1, "writedir": [1, 3], "import": [1, 3], "import_to": [1, 3], "dev": 1, "correct": 1, "when": 1, "place": 1, "develop": 1, "startfil": [1, 3], "you": [1, 2], "doubl": 1, "click": 1, "mcpack": 1, "filepath": 1, "built": 1, "ha": 1, "been": 1, "pass": 1, "chevron": 1, "render": 1, "_description_": 1, "add_schema": [1, 3], "loaderschema": 1, "clear_schema": [1, 3], "get_schema": [1, 3], "If": 1, "rais": 1, "invalid": 1, "pngfile": [1, 3], "imag": [1, 3], "pil": [], "imagefil": 1, "simpleitemcompon": [1, 3], "blockcomponent2": [1, 3], "cameracompon": [1, 3], "black_bars_dur": [1, 3], "black_bars_screen_ratio": [1, 3], "shutter_dur": [1, 3], "shutter_screen_ratio": [1, 3], "picture_dur": [1, 3], "slide_away_dur": [1, 3], "diggercompon": [1, 3], "emptyitemcompon": [1, 3], "foilcompon": [1, 3], "foil": 1, "ignorespermissioncompon": [1, 3], "ignores_permiss": 1, "itemset": [1, 3], "max_count": [1, 3], "max_damag": [1, 3], "recipe_remaind": [1, 3], "itemdisplaynamecompon": [1, 3], "itemload": [1, 3], "rariti": [1, 3], "set_count": [1, 3], "set_damag": [1, 3], "set_recipe_remaind": [1, 3], "itemstack": [1, 3], "maxdamagecompon": [1, 3], "portfoliocompon": [1, 3], "portfolio": 1, "seedcompon": [1, 3], "crop_result": [1, 3], "seed": 1, "add_ammunit": [1, 3], "clear_ammunit": [1, 3], "remove_ammunit": [1, 3], "usedurationcompon": [1, 3], "protect": [1, 3], "wearabl": 1, "lootnumberprovid": [1, 3], "enchantbookfortradinglootfunct": [1, 3], "base_cost": [1, 3], "base_random_cost": [1, 3], "per_level_random_cost": [1, 3], "per_level_cost": [1, 3], "lootfunct": [1, 3], "enchant_book_for_trad": 1, "enchantrandomgearlootfunct": [1, 3], "chanc": [1, 3], "enchant_random_gear": 1, "enchantrandomlylootfunct": [1, 3], "treasur": [1, 3], "enchant_randomli": 1, "enchantwithlevelslootfunct": [1, 3], "enchant_with_level": 1, "explorationmaplootfunct": [1, 3], "exploration_map": 1, "fillcontainerlootfunct": [1, 3], "fill_contain": 1, "furnacesmeltlootfunct": [1, 3], "furnace_smelt": 1, "hasmarkvariantlootcondit": [1, 3], "lootcondit": [1, 3], "has_mark_vari": 1, "itementri": [1, 3], "weight": [1, 3], "qualiti": [1, 3], "leafentri": [1, 3], "killedbyentitylootcondit": [1, 3], "entity_typ": [1, 3], "killed_by_ent": 1, "killedbyplayerlootcondit": [1, 3], "killed_by_play": 1, "killedbyplayerorpetslootcondit": [1, 3], "killed_by_player_or_pet": 1, "lootpoolentri": [1, 3], "add_funct": [1, 3], "clear_funct": [1, 3], "get_funct": [1, 3], "remove_funct": [1, 3], "lootentri": [1, 3], "lootpool": [1, 3], "roll": [1, 3], "bonus_rol": [1, 3], "tier": [1, 3], "loottier": [1, 3], "entri": [1, 3], "add_entri": [1, 3], "clear_entri": [1, 3], "get_entri": [1, 3], "remove_entri": [1, 3], "pool": [1, 3], "add_pool": [1, 3], "clear_pool": [1, 3], "get_pool": [1, 3], "remove_pool": [1, 3], "initial_rang": [1, 3], "bonus_ch": [1, 3], "lootingenchantlootfunct": [1, 3], "looting_ench": 1, "matchtoollootcondit": [1, 3], "match_tool": 1, "randomauxvaluelootfunct": [1, 3], "random_aux_valu": 1, "randomblockstatelootfunct": [1, 3], "random_block_st": 1, "randomchancelootcondit": [1, 3], "random_ch": 1, "randomchancewithlootinglootcondit": [1, 3], "looting_multipli": [1, 3], "random_chance_with_loot": 1, "randomdifficultychancelootcondit": [1, 3], "default_ch": [1, 3], "peac": [1, 3], "random_difficulty_ch": 1, "randomdyelootfunct": [1, 3], "random_dy": 1, "randomregionaldifficultychancelootcondit": [1, 3], "max_chanc": [1, 3], "random_regional_difficulty_ch": 1, "setactoridlootfunct": [1, 3], "actor_id": [1, 3], "set_actor_id": 1, "setbannerdetailslootfunct": [1, 3], "set_banner_detail": 1, "setbookcontentslootfunct": [1, 3], "titl": [1, 3], "set_book_cont": 1, "setcountlootfunct": [1, 3], "setdamagelootfunct": [1, 3], "setdatafromcolorindexlootfunct": [1, 3], "set_data_from_color_index": 1, "setdatalootfunct": [1, 3], "set_data": 1, "setlorelootfunct": [1, 3], "lore": [1, 3], "set_lor": 1, "setnamelootfunct": [1, 3], "set_nam": 1, "specificenchantslootfunct": [1, 3], "specific_ench": 1, "tradermaterialtypelootfunct": [1, 3], "trader_material_typ": 1, "loot_condit": [1, 3], "loot_funct": [1, 3], "pool_entri": [1, 3], "set_modul": [1, 3], "set_uuid": [1, 3], "header_uuid": 1, "module_uuid": 1, "manifestload": [1, 3], "untitl": 1, "add_item_textur": [1, 3], "atla": 1, "itematla": [1, 3], "add_loot_t": [1, 3], "add_pack": [1, 3], "add_recip": [1, 3], "add_terrain_textur": [1, 3], "terrainatla": [1, 3], "add_volum": [1, 3], "clear_pack": [1, 3], "get_pack": [1, 3], "remove_pack": [1, 3], "behavior_pack": 1, "clear_recip": [1, 3], "clear_volum": [1, 3], "get_block": [1, 3], "get_item": [1, 3], "get_recip": [1, 3], "get_volum": [1, 3], "merg": [1, 3], "remove_recip": [1, 3], "remove_volum": [1, 3], "suffix": [1, 3], "_bp": 1, "add_fil": [1, 3], "clear_fil": [1, 3], "file_typ": [1, 3], "get_fil": [1, 3], "remove_fil": [1, 3], "set_detail": [1, 3], "resource_pack": 1, "clear_item_textur": [1, 3], "clear_terrain_textur": [1, 3], "get_item_textur": [1, 3], "get_terrain_textur": [1, 3], "remove_item_textur": [1, 3], "remove_terrain_textur": [1, 3], "_rp": 1, "brewingcontainerrecip": [1, 3], "reagent": [1, 3], "output": [1, 3], "recipe_brewing_contain": 1, "brewingcontainerrecipeload": [1, 3], "brew": 1, "contain": [1, 2], "brewingmixrecip": [1, 3], "recipe_brewing_mix": 1, "brewingmixrecipeload": [1, 3], "mix": 1, "furnacerecip": [1, 3], "recipe_furnac": 1, "ingredi": [1, 3], "furnacerecipeload": [1, 3], "materialreductionrecip": [1, 3], "recipe_material_reduct": 1, "materialreductionrecipeload": [1, 3], "mame": [1, 3], "reduct": 1, "result": [1, 3], "material_reduc": [1, 3], "shapedrecip": [1, 3], "pattern": [1, 3], "add_kei": [1, 3], "clear_kei": [1, 3], "recipe_shap": 1, "remove_kei": [1, 3], "shapedrecipeload": [1, 3], "shapelessrecip": [1, 3], "add_ingredi": [1, 3], "clear_ingredi": [1, 3], "recipe_shapeless": 1, "remove_ingredi": [1, 3], "shapelessrecipeload": [1, 3], "shapeless": 1, "smithingtransformrecip": [1, 3], "templat": [1, 3], "addit": [1, 3], "recipe_smithing_transform": 1, "smithingtransformrecipeload": [1, 3], "smith": 1, "smithingtrimrecip": [1, 3], "recipe_smithing_trim": 1, "smithingtrimrecipeload": [1, 3], "trim": 1, "stonecuttingrecip": [1, 3], "flipbooktextur": [1, 3], "flipbook_textur": 1, "atlas_til": [1, 3], "atlas_index": [1, 3], "atlas_tile_vari": [1, 3], "ticks_per_fram": [1, 3], "frame": [1, 3], "replic": [1, 3], "blend_fram": [1, 3], "resource_pack_nam": 1, "texture_data": 1, "_atla": 1, "item_textur": 1, "itemtextur": [1, 3], "_texturedef": 1, "pad": [1, 3], "num_mip_level": [1, 3], "terrain_textur": 1, "terraintextur": [1, 3], "png": 1, "fogcompon": [1, 3], "fog_identifi": [1, 3], "prioriti": [1, 3], "volumecompon": [1, 3], "onactorentercompon": [1, 3], "on_ent": [1, 3], "on_actor_ent": 1, "onactorleavecompon": [1, 3], "on_leav": [1, 3], "on_actor_leav": 1, "volumeload": [1, 3], "kit": 1, "must": [1, 2], "includ": [1, 2], "your": [1, 2], "app": 2, "otherwis": 2, "thing": 2, "break": [1, 2], "both": 2, "python": 2, "specifi": [1, 2], "remov": 1, "creat": 1, "unless": [], "vanilla": 1, "creativ": 1, "allow": 1, "off": 1, "hand": 1, "determin": 1, "can": 1, "inventori": 1, "placer": 1, "destroi": 1, "cool": 1, "time": 1, "after": 1, "same": 1, "becom": 1, "unus": 1, "how": 1, "much": 1, "extra": 1, "doe": 1, "attack": 1, "quickli": 1, "dig": 1, "specif": 1, "take": 1, "befor": 1, "combin": 1, "what": 1, "appli": 1, "Not": 1, "have": 1, "specifii": 1, "restrict": 1, "edibl": 1, "properli": 1, "cook": 1, "tool": 1, "hover": 1, "over": 1, "repres": 1, "ui": 1, "elsewher": 1, "boolean": 1, "interact": 1, "shown": 1, "touch": 1, "control": 1, "displai": 1, "whenev": 1, "ex": 1, "store": 1, "within": 1, "user": 1, "liquid": 1, "clip": 1, "mani": 1, "togeth": 1, "shoot": 1, "out": 1, "arrow": 1, "plai": 1, "music": 1, "along": 1, "thei": 1, "should": 1, "despawn": 1, "eventu": 1, "world": 1, "differ": 1, "aux": 1, "also": 1, "which": 1, "snowbal": 1, "modifi": 1, "long": 1, "speed": 1, "tell": 1, "visibl": 1, "area": 1, "disabl": 1, "omit": 1, "make": 1, "enabl": 1, "abil": 1, "support": 1, "two": 1, "book": 1, "pick": 1, "first": 1, "wa": 1, "mai": 1, "assert": 1, "vari": 1, "describ": 1, "destruct": 1, "explos": 1, "indestruct": 1, "mine": 1, "second": 1, "where": 1, "surviv": 1, "abl": 1, "catch": 1, "fire": 1, "neighbor": 1, "still": 1, "directli": 1, "ignit": 1, "match": 1, "exist": 1, "current": 1, "instanc": 1, "map": 1, "don": 1, "t": 1, "actual": 1, "assign": 1, "give": 1, "choos": 1, "my_inst": 1, "do": 1, "setter": 1, "rule": 1, "under": 1, "either": 1, "onc": 1, "regular": 1, "interv": 1, "equal": 1, "tick": 1, "chosen": 1, "gamerul": 1, "often": 1, "updat": 1, "some": 1, "mechan": 1, "spread": 1, "cursor": 1, "respect": 1, "center": 1, "its": 1, "posit": 1, "unit": 1, "tessel": 1, "preset": 1, "express": 1, "pair": 1, "languag": 1, "hotbar": 1, "given": 1, "resolv": 1, "loc": 1, "raw": 1, "least": 1, "limit": 1, "64": 1, "charact": 1, "field": 1, "greater": 1, "neg": 1, "mean": 1, "easili": 1, "explod": 1, "larger": 1, "increas": 1, "follow": 1, "6": 1, "against": 1, "multipl": 1, "affect": 1, "flame": 1, "next": 1, "than": 1, "higher": 1, "more": 1, "continu": 1, "burn": 1, "until": 1, "forev": 1, "without": 1, "5": 1, "plank": 1, "never": 1, "9": 1, "movement": 1, "travel": 1, "light": 1, "dampen": 1, "through": 1, "15": 1, "emit": 1, "rel": 1, "256": 1, "hex": 1, "rrggbb": 1, "arrai": 1, "r": 1, "g": 1, "255": 1, "show": 1, "ambient": 1, "occlus": 1, "shadow": 1, "underneath": 1, "dim": 1, "alpha": 1, "layer": 1, "transpar": 1, "transluc": 1, "complet": 1, "backfac": 1, "cull": 1, "stain": 1, "glass": 1, "slightli": 1, "unstain": 1, "fulli": 1, "execut": 1, "90": 1, "270": 1, "decid": 1, "so": 1, "alwai": 1, "delai": 1, "mob": 1, "deal": 1, "decreas": 1, "decrement": 1, "kill": 1, "spawn": 1, "slash": 1, "aspect": 1, "met": 1, "anoth": 1, "caus": 1, "switch": 1, "point": 1, "bound": 1, "descriptor": 1, "left": 1, "put": 1, "spend": 1, "usabl": 1, "again": 1, "correl": 1, "impact": 1, "effici": 1, "percentag": 1, "lose": 1, "100": 1, "requir": 1, "minimum": 1, "bow": 1, "would": 1, "were": 1, "dispens": 1, "even": 1, "hungri": 1, "ad": 1, "satur": 1, "formula": 1, "buff": 1, "associ": 1, "charg": 1, "critic": 1, "hit": 1, "signal": 1, "compar": 1, "13": 1, "cat": 1, "chirp": 1, "far": 1, "mall": 1, "mellohi": 1, "stal": 1, "strad": 1, "ward": 1, "11": 1, "wait": 1, "pigstep": 1, "othersid": 1, "relic": 1, "need": 1, "repair_amount": 1, "draw": 1, "thrown": 1, "throw": 1, "maximum": 1, "launch": 1, "worn": 1, "non": 1, "uniqu": 1, "It": 1, "form": 1, "cannot": 1, "enter": 1, "receiv": 1, "feedback": 1, "smaller": 1, "happen": 1, "leav": 1, "archiv": 1, "potion": 1, "stand": 1, "singl": 1, "space": 1, "reserv": 1, "patten": 1, "retain": 1, "perform": 1, "oper": 1, "In": 1, "case": 1, "stackabl": 1, "consum": 1, "accept": 1, "netherite_ingot": 1, "transform_materi": 1, "Its": 1, "armor": 1, "transformable_item": 1, "transform_templ": 1, "preserv": 1, "trim_materi": 1, "trimmable_armor": 1, "trim_templ": 1, "flipbook": 1, "locat": [], "air": [], "first_person": [], "free": [], "third_person": [], "third_person_front": [], "appl": [], "ext": []}, "objects": {"": [[1, 0, 0, "-", "mcaddon"]], "mcaddon": [[1, 0, 0, "-", "block"], [1, 0, 0, "-", "camera"], [1, 0, 0, "-", "cli"], [1, 0, 0, "-", "constant"], [1, 0, 0, "-", "event"], [1, 0, 0, "-", "exception"], [1, 0, 0, "-", "file"], [1, 0, 0, "-", "item"], [1, 0, 0, "-", "loot"], [1, 0, 0, "-", "manifest"], [1, 0, 0, "-", "pack"], [1, 0, 0, "-", "recipe"], [1, 0, 0, "-", "registry"], [1, 0, 0, "-", "resrouce"], [2, 0, 0, "-", "schemas"], [1, 0, 0, "-", "state"], [1, 0, 0, "-", "text"], [1, 0, 0, "-", "util"], [1, 0, 0, "-", "volume"]], "mcaddon.block": [[1, 1, 1, "", "Block"], [1, 1, 1, "", "BlockComponent"], [1, 1, 1, "", "BlockDescriptor"], [1, 1, 1, "", "BlockDisplayNameComponent"], [1, 1, 1, "", "BlockLoader"], [1, 1, 1, "", "BlockPermutation"], [1, 1, 1, "", "BlockSettings"], [1, 1, 1, "", "BlockTagsComponent"], [1, 1, 1, "", "BlockTrait"], [1, 1, 1, "", "BoneVisabilityComponent"], [1, 1, 1, "", "BreathabilityComponent"], [1, 1, 1, "", "CollisionBoxComponent"], [1, 1, 1, "", "CraftingTableComponent"], [1, 1, 1, "", "DestructibleByExplosionComponent"], [1, 1, 1, "", "DestructibleByMiningComponent"], [1, 1, 1, "", "Filter"], [1, 1, 1, "", "FlammableComponent"], [1, 1, 1, "", "FrictionComponent"], [1, 1, 1, "", "GeometryComponent"], [1, 1, 1, "", "LightDampeningComponent"], [1, 1, 1, "", "LightEmissionComponent"], [1, 1, 1, "", "LootComponent"], [1, 1, 1, "", "MapColorComponent"], [1, 1, 1, "", "Material"], [1, 1, 1, "", "MaterialInstancesComponent"], [1, 1, 1, "", "OnFallOnComponent"], [1, 1, 1, "", "OnInteractComponent"], [1, 1, 1, "", "OnPlacedComponent"], [1, 1, 1, "", "OnPlayerDestroyedComponent"], [1, 1, 1, "", "OnPlayerPlacingComponent"], [1, 1, 1, "", "OnStepOffComponent"], [1, 1, 1, "", "OnStepOnComponent"], [1, 1, 1, "", "PlacementDirectionTrait"], [1, 1, 1, "", "PlacementFilterComponent"], [1, 1, 1, "", "PlacementPositionTrait"], [1, 1, 1, "", "QueuedTickingComponent"], [1, 1, 1, "", "RandomTickingComponent"], [1, 1, 1, "", "SelectionBoxComponent"], [1, 1, 1, "", "SimpleBlockComponent"], [1, 1, 1, "", "TransformationComponent"], [1, 1, 1, "", "UnitCubeComponent"], [1, 5, 1, "", "block_component_type"], [1, 5, 1, "", "block_trait"], [1, 5, 1, "", "block_type"]], "mcaddon.block.Block": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "add_component"], [1, 3, 1, "", "add_event"], [1, 3, 1, "", "add_permutation"], [1, 3, 1, "", "add_state"], [1, 3, 1, "", "add_trait"], [1, 3, 1, "", "clear_components"], [1, 3, 1, "", "clear_events"], [1, 3, 1, "", "clear_permutation"], [1, 3, 1, "", "clear_state"], [1, 3, 1, "", "clear_trait"], [1, 4, 1, "", "components"], [1, 4, 1, "", "events"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "from_settings"], [1, 3, 1, "", "get_collision_shape"], [1, 3, 1, "", "get_component"], [1, 3, 1, "", "get_event"], [1, 3, 1, "", "get_permutation"], [1, 3, 1, "", "get_selection_shape"], [1, 3, 1, "", "get_state"], [1, 3, 1, "", "get_trait"], [1, 4, 1, "", "hardness"], [1, 2, 1, "", "id"], [1, 4, 1, "", "map_color"], [1, 4, 1, "", "menu_category"], [1, 4, 1, "", "permutations"], [1, 3, 1, "", "remove_component"], [1, 3, 1, "", "remove_event"], [1, 3, 1, "", "remove_permutation"], [1, 3, 1, "", "remove_state"], [1, 3, 1, "", "remove_trait"], [1, 4, 1, "", "resistance"], [1, 4, 1, "", "sound_group"], [1, 3, 1, "", "stack"], [1, 4, 1, "", "states"], [1, 4, 1, "", "traits"], [1, 3, 1, "", "translation_key"], [1, 4, 1, "", "type"]], "mcaddon.block.BlockComponent": [[1, 3, 1, "", "from_dict"]], "mcaddon.block.BlockDescriptor": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "name"], [1, 4, 1, "", "states"], [1, 4, 1, "", "tags"]], "mcaddon.block.BlockDisplayNameComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.block.BlockLoader": [[1, 2, 1, "", "name"]], "mcaddon.block.BlockPermutation": [[1, 3, 1, "", "add_component"], [1, 3, 1, "", "clear_components"], [1, 4, 1, "", "components"], [1, 4, 1, "", "condition"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_component"], [1, 3, 1, "", "remove_component"]], "mcaddon.block.BlockSettings": [[1, 3, 1, "", "breakInstantly"], [1, 2, 1, "", "burnable"], [1, 2, 1, "", "collidable"], [1, 3, 1, "", "color"], [1, 3, 1, "", "dropsLike"], [1, 3, 1, "", "dropsNothing"], [1, 2, 1, "", "hardness"], [1, 3, 1, "", "is_burnable"], [1, 2, 1, "", "loot_table"], [1, 2, 1, "", "luminance"], [1, 2, 1, "", "map_color"], [1, 3, 1, "", "no_collision"], [1, 2, 1, "", "resistance"], [1, 3, 1, "", "set_hardness"], [1, 3, 1, "", "set_luminance"], [1, 3, 1, "", "set_resistance"], [1, 3, 1, "", "set_slipperiness"], [1, 2, 1, "", "slipperiness"], [1, 2, 1, "", "sound_group"], [1, 3, 1, "", "sounds"], [1, 3, 1, "", "strength"]], "mcaddon.block.BlockTagsComponent": [[1, 3, 1, "", "add_tag"], [1, 3, 1, "", "clear_tags"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_tag"], [1, 2, 1, "", "id"], [1, 3, 1, "", "remove_tag"], [1, 4, 1, "", "tags"]], "mcaddon.block.BlockTrait": [[1, 4, 1, "", "enabled_states"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "id"]], "mcaddon.block.BoneVisabilityComponent": [[1, 3, 1, "", "add_bone"], [1, 4, 1, "", "bones"], [1, 3, 1, "", "clear_bones"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_bone"], [1, 2, 1, "", "id"], [1, 3, 1, "", "remove_bone"]], "mcaddon.block.BreathabilityComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.block.CollisionBoxComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.block.CraftingTableComponent": [[1, 3, 1, "", "add_crafting_tag"], [1, 3, 1, "", "clear_crafting_tags"], [1, 4, 1, "", "crafting_tags"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_crafting_tag"], [1, 2, 1, "", "id"], [1, 3, 1, "", "remove_crafting_tag"], [1, 4, 1, "", "table_name"]], "mcaddon.block.DestructibleByExplosionComponent": [[1, 4, 1, "", "explosion_resistance"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.block.DestructibleByMiningComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "seconds_to_destroy"]], "mcaddon.block.Filter": [[1, 3, 1, "", "add_face"], [1, 3, 1, "", "add_filter"], [1, 4, 1, "", "allowed_faces"], [1, 4, 1, "", "block_filter"], [1, 3, 1, "", "clear_faces"], [1, 3, 1, "", "clear_filters"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_face"], [1, 3, 1, "", "get_filter"], [1, 3, 1, "", "remove_face"], [1, 3, 1, "", "remove_filter"]], "mcaddon.block.FlammableComponent": [[1, 4, 1, "", "catch_chance_modifier"], [1, 4, 1, "", "destroy_chance_modifier"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.block.FrictionComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "value"]], "mcaddon.block.GeometryComponent": [[1, 4, 1, "", "bone_visibility"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "geometry"], [1, 2, 1, "", "id"]], "mcaddon.block.LightDampeningComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.block.LightEmissionComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.block.LootComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "empty"], [1, 2, 1, "", "id"]], "mcaddon.block.MapColorComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.block.Material": [[1, 4, 1, "", "ambient_occlusion"], [1, 4, 1, "", "face_dimming"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "render_method"], [1, 4, 1, "", "texture"]], "mcaddon.block.MaterialInstancesComponent": [[1, 3, 1, "", "add_material"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_material"], [1, 2, 1, "", "id"], [1, 4, 1, "", "materials"], [1, 3, 1, "", "remove_material"]], "mcaddon.block.OnFallOnComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "min_fall_distance"]], "mcaddon.block.OnInteractComponent": [[1, 2, 1, "", "id"]], "mcaddon.block.OnPlacedComponent": [[1, 2, 1, "", "id"]], "mcaddon.block.OnPlayerDestroyedComponent": [[1, 2, 1, "", "id"]], "mcaddon.block.OnPlayerPlacingComponent": [[1, 2, 1, "", "id"]], "mcaddon.block.OnStepOffComponent": [[1, 2, 1, "", "id"]], "mcaddon.block.OnStepOnComponent": [[1, 2, 1, "", "id"]], "mcaddon.block.PlacementDirectionTrait": [[1, 3, 1, "", "all"], [1, 3, 1, "", "cardinal"], [1, 3, 1, "", "facing"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "y_rotation_offset"]], "mcaddon.block.PlacementFilterComponent": [[1, 3, 1, "", "add_condition"], [1, 3, 1, "", "clear_conditions"], [1, 4, 1, "", "conditions"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 3, 1, "", "remove_condition"]], "mcaddon.block.PlacementPositionTrait": [[1, 3, 1, "", "all"], [1, 3, 1, "", "block_face"], [1, 2, 1, "", "id"], [1, 3, 1, "", "vertical_half"]], "mcaddon.block.QueuedTickingComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "interval_range"], [1, 4, 1, "", "looping"], [1, 4, 1, "", "on_tick"]], "mcaddon.block.RandomTickingComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "on_tick"]], "mcaddon.block.SelectionBoxComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.block.SimpleBlockComponent": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "value"]], "mcaddon.block.TransformationComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 3, 1, "", "offset"], [1, 3, 1, "", "rotate"], [1, 4, 1, "", "rotation"], [1, 4, 1, "", "scale"], [1, 3, 1, "", "scaled"], [1, 4, 1, "", "translation"]], "mcaddon.block.UnitCubeComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.camera": [[1, 1, 1, "", "CameraPreset"], [1, 1, 1, "", "CameraPresetLoader"]], "mcaddon.camera.CameraPreset": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "inherit_from"], [1, 4, 1, "", "listener"], [1, 4, 1, "", "player_effects"], [1, 4, 1, "", "pos_x"], [1, 4, 1, "", "pos_y"], [1, 4, 1, "", "pos_z"], [1, 4, 1, "", "rot_x"], [1, 4, 1, "", "rot_y"]], "mcaddon.camera.CameraPresetLoader": [[1, 2, 1, "", "name"]], "mcaddon.cli": [[1, 5, 1, "", "main"]], "mcaddon.constant": [[1, 1, 1, "", "BlockFace"], [1, 1, 1, "", "CameraListener"], [1, 1, 1, "", "Category"], [1, 1, 1, "", "Color"], [1, 1, 1, "", "Destination"], [1, 1, 1, "", "Edition"], [1, 1, 1, "", "EventTarget"], [1, 1, 1, "", "LootContextType"], [1, 1, 1, "", "ModuleType"], [1, 1, 1, "", "OxidationLevel"], [1, 1, 1, "", "RecipeTag"], [1, 1, 1, "", "RenderMethod"], [1, 1, 1, "", "TextureType"], [1, 1, 1, "", "UseAnimation"]], "mcaddon.constant.BlockFace": [[1, 2, 1, "", "all"], [1, 2, 1, "", "down"], [1, 2, 1, "", "east"], [1, 2, 1, "", "north"], [1, 2, 1, "", "side"], [1, 2, 1, "", "south"], [1, 2, 1, "", "up"], [1, 2, 1, "", "west"]], "mcaddon.constant.CameraListener": [[1, 2, 1, "", "none"], [1, 2, 1, "", "player"]], "mcaddon.constant.Category": [[1, 2, 1, "", "commands"], [1, 2, 1, "", "construction"], [1, 2, 1, "", "equipment"], [1, 2, 1, "", "items"], [1, 2, 1, "", "nature"], [1, 2, 1, "", "none"]], "mcaddon.constant.Color": [[1, 2, 1, "", "black"], [1, 2, 1, "", "blue"], [1, 2, 1, "", "brown"], [1, 2, 1, "", "cyan"], [1, 2, 1, "", "gray"], [1, 2, 1, "", "green"], [1, 2, 1, "", "light_blue"], [1, 2, 1, "", "light_gray"], [1, 2, 1, "", "lime"], [1, 2, 1, "", "magenta"], [1, 2, 1, "", "orange"], [1, 2, 1, "", "pink"], [1, 2, 1, "", "purple"], [1, 2, 1, "", "red"], [1, 2, 1, "", "white"], [1, 2, 1, "", "yellow"]], "mcaddon.constant.Destination": [[1, 2, 1, "", "buriedtreasure"], [1, 2, 1, "", "endcity"], [1, 2, 1, "", "fortress"], [1, 2, 1, "", "mansion"], [1, 2, 1, "", "mineshaft"], [1, 2, 1, "", "monument"], [1, 2, 1, "", "pillageroutpost"], [1, 2, 1, "", "ruins"], [1, 2, 1, "", "shipwreck"], [1, 2, 1, "", "stronghold"], [1, 2, 1, "", "temple"], [1, 2, 1, "", "village"]], "mcaddon.constant.Edition": [[1, 2, 1, "", "bedrock"], [1, 2, 1, "", "education"], [1, 2, 1, "", "preview"]], "mcaddon.constant.EventTarget": [[1, 2, 1, "", "baby"], [1, 2, 1, "", "block"], [1, 2, 1, "", "damager"], [1, 2, 1, "", "holder"], [1, 2, 1, "", "item"], [1, 2, 1, "", "other"], [1, 2, 1, "", "parent"], [1, 2, 1, "", "player"], [1, 2, 1, "", "self"], [1, 2, 1, "", "target"]], "mcaddon.constant.LootContextType": [[1, 2, 1, "", "advancement_entity"], [1, 2, 1, "", "advancement_location"], [1, 2, 1, "", "advancement_reward"], [1, 2, 1, "", "archaeology"], [1, 2, 1, "", "barter"], [1, 2, 1, "", "block"], [1, 2, 1, "", "chest"], [1, 2, 1, "", "command"], [1, 2, 1, "", "empty"], [1, 2, 1, "", "entity"], [1, 2, 1, "", "fishing"], [1, 2, 1, "", "generic"], [1, 2, 1, "", "gift"], [1, 2, 1, "", "selector"]], "mcaddon.constant.ModuleType": [[1, 2, 1, "", "client_data"], [1, 2, 1, "", "data"], [1, 2, 1, "", "interface"], [1, 2, 1, "", "resources"], [1, 2, 1, "", "world_template"]], "mcaddon.constant.OxidationLevel": [[1, 2, 1, "", "exposed"], [1, 2, 1, "", "oxidized"], [1, 2, 1, "", "unaffected"], [1, 2, 1, "", "weathered"]], "mcaddon.constant.RecipeTag": [[1, 2, 1, "", "brewing_stand"], [1, 2, 1, "", "campfire"], [1, 2, 1, "", "crafting_table"], [1, 2, 1, "", "furnace"], [1, 2, 1, "", "material_reducer"], [1, 2, 1, "", "smithing_table"], [1, 2, 1, "", "smoker"], [1, 2, 1, "", "soul_campfire"], [1, 2, 1, "", "stonecutter"]], "mcaddon.constant.RenderMethod": [[1, 2, 1, "", "alpha_test"], [1, 2, 1, "", "blend"], [1, 2, 1, "", "double_sided"], [1, 2, 1, "", "opaque"]], "mcaddon.constant.TextureType": [[1, 2, 1, "", "item"], [1, 2, 1, "", "terrain"]], "mcaddon.constant.UseAnimation": [[1, 2, 1, "", "camera"], [1, 2, 1, "", "drink"], [1, 2, 1, "", "eat"]], "mcaddon.event": [[1, 1, 1, "", "AddMobEffect"], [1, 1, 1, "", "Damage"], [1, 1, 1, "", "DecrementBlockProperty"], [1, 1, 1, "", "DecrementStack"], [1, 1, 1, "", "Die"], [1, 1, 1, "", "Event"], [1, 1, 1, "", "IncrementBlockProperty"], [1, 1, 1, "", "PlayEffect"], [1, 1, 1, "", "PlaySound"], [1, 1, 1, "", "Randomize"], [1, 1, 1, "", "RemoveMobEffect"], [1, 1, 1, "", "RunCommand"], [1, 1, 1, "", "Sequence"], [1, 1, 1, "", "SetBlock"], [1, 1, 1, "", "SetBlockAtPos"], [1, 1, 1, "", "SetBlockProperty"], [1, 1, 1, "", "SpawnLoot"], [1, 1, 1, "", "Swing"], [1, 1, 1, "", "SwitchBlockProperty"], [1, 1, 1, "", "Teleport"], [1, 1, 1, "", "TransformiIem"], [1, 1, 1, "", "Trigger"], [1, 5, 1, "", "event_type"]], "mcaddon.event.AddMobEffect": [[1, 4, 1, "", "amplifier"], [1, 4, 1, "", "duration"], [1, 4, 1, "", "effect"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.Damage": [[1, 4, 1, "", "amount"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "mob_amount"], [1, 4, 1, "", "type"]], "mcaddon.event.DecrementStack": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.Die": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.Event": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "target"]], "mcaddon.event.PlayEffect": [[1, 4, 1, "", "data"], [1, 4, 1, "", "effect"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.PlaySound": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "sound"]], "mcaddon.event.Randomize": [[1, 2, 1, "", "id"]], "mcaddon.event.RemoveMobEffect": [[1, 4, 1, "", "effect"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.RunCommand": [[1, 4, 1, "", "command"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.Sequence": [[1, 3, 1, "", "add_event"], [1, 3, 1, "", "clear_events"], [1, 3, 1, "", "event_exists"], [1, 4, 1, "", "events"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_condition"], [1, 3, 1, "", "get_event"], [1, 2, 1, "", "id"], [1, 3, 1, "", "remove_condition"], [1, 3, 1, "", "remove_event"], [1, 3, 1, "", "set_condition"]], "mcaddon.event.SetBlock": [[1, 4, 1, "", "block_type"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.SetBlockAtPos": [[1, 4, 1, "", "block_offset"], [1, 4, 1, "", "block_type"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.event.SetBlockProperty": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "states"]], "mcaddon.event.SpawnLoot": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "table"]], "mcaddon.event.Swing": [[1, 2, 1, "", "id"]], "mcaddon.event.Teleport": [[1, 4, 1, "", "avoid_water"], [1, 4, 1, "", "destination"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "land_on_block"], [1, 4, 1, "", "max_range"]], "mcaddon.event.TransformiIem": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "transform"]], "mcaddon.event.Trigger": [[1, 4, 1, "", "condition"], [1, 4, 1, "", "event"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "target"]], "mcaddon.exception": [[1, 6, 1, "", "ComponentNotFoundError"], [1, 6, 1, "", "Error"], [1, 6, 1, "", "EventNotFoundError"], [1, 6, 1, "", "ManifestNotFoundError"], [1, 6, 1, "", "MinecraftNotFoundError"], [1, 6, 1, "", "RecipeTypeNotFoundError"], [1, 6, 1, "", "RegistryError"], [1, 6, 1, "", "SchemaNotFoundError"], [1, 6, 1, "", "SyntaxError"], [1, 6, 1, "", "TypeNotFoundError"]], "mcaddon.file": [[1, 1, 1, "", "ArchiveFile"], [1, 1, 1, "", "File"], [1, 1, 1, "", "Importable"], [1, 1, 1, "", "JsonFile"], [1, 1, 1, "", "Loader"], [1, 1, 1, "", "PngFile"], [1, 1, 1, "", "Schema"]], "mcaddon.file.ArchiveFile": [[1, 4, 1, "", "extension"], [1, 4, 1, "", "filename"], [1, 3, 1, "", "getvalue"], [1, 3, 1, "", "has_filename"], [1, 3, 1, "", "load"], [1, 3, 1, "", "readdir"], [1, 3, 1, "", "readzip"], [1, 3, 1, "", "save"], [1, 3, 1, "", "setup"], [1, 3, 1, "", "writedir"], [1, 3, 1, "", "writezip"]], "mcaddon.file.File": [[1, 4, 1, "", "dirname"], [1, 4, 1, "", "extension"], [1, 4, 1, "", "filename"], [1, 3, 1, "", "from_fileobj"], [1, 3, 1, "", "getvalue"], [1, 3, 1, "", "has_filename"], [1, 3, 1, "", "load"], [1, 3, 1, "", "save"], [1, 3, 1, "", "write"]], "mcaddon.file.Importable": [[1, 3, 1, "", "import_to"], [1, 3, 1, "", "startfile"]], "mcaddon.file.JsonFile": [[1, 3, 1, "", "from_dict"], [1, 3, 1, "", "from_fileobj"], [1, 3, 1, "", "json"], [1, 3, 1, "", "write"]], "mcaddon.file.Loader": [[1, 3, 1, "", "add_schema"], [1, 3, 1, "", "clear_schemas"], [1, 3, 1, "", "get_schema"], [1, 4, 1, "", "key"], [1, 3, 1, "", "load"], [1, 4, 1, "", "name"], [1, 4, 1, "", "schemas"], [1, 3, 1, "", "validate"]], "mcaddon.file.PngFile": [[1, 3, 1, "", "from_fileobj"], [1, 2, 1, "", "image"], [1, 3, 1, "", "write"]], "mcaddon.file.Schema": [[1, 3, 1, "", "load"], [1, 3, 1, "", "schema"], [1, 4, 1, "", "schemafile"], [1, 4, 1, "", "version"]], "mcaddon.item": [[1, 1, 1, "", "AllowOffHandComponent"], [1, 1, 1, "", "BlockComponent2"], [1, 1, 1, "", "BlockPlacerComponent"], [1, 1, 1, "", "CameraComponent"], [1, 1, 1, "", "CanDestroyInCreativeComponent"], [1, 1, 1, "", "CooldownComponent"], [1, 1, 1, "", "DamageComponent"], [1, 1, 1, "", "DiggerComponent"], [1, 1, 1, "", "DurabilityComponent"], [1, 1, 1, "", "EmptyItemComponent"], [1, 1, 1, "", "EnchantableComponent"], [1, 1, 1, "", "EntityPlacerComponent"], [1, 1, 1, "", "FoilComponent"], [1, 1, 1, "", "FoodComponent"], [1, 1, 1, "", "FuelComponent"], [1, 1, 1, "", "GlintComponent"], [1, 1, 1, "", "HandEquippedComponent"], [1, 1, 1, "", "HoverTextColorComponent"], [1, 1, 1, "", "IconComponent"], [1, 1, 1, "", "IgnoresPermissionComponent"], [1, 1, 1, "", "InteractButtonComponent"], [1, 1, 1, "", "Item"], [1, 1, 1, "", "ItemComponent"], [1, 1, 1, "", "ItemDisplayNameComponent"], [1, 1, 1, "", "ItemLoader"], [1, 1, 1, "", "ItemSettings"], [1, 1, 1, "", "ItemStack"], [1, 1, 1, "", "ItemStorageComponent"], [1, 1, 1, "", "LiquidClippedComponent"], [1, 1, 1, "", "MaxDamageComponent"], [1, 1, 1, "", "MaxStackSizeComponent"], [1, 1, 1, "", "PortfolioComponent"], [1, 1, 1, "", "ProjectileComponent"], [1, 1, 1, "", "RecordComponent"], [1, 1, 1, "", "RepairItem"], [1, 1, 1, "", "RepairableComponent"], [1, 1, 1, "", "SeedComponent"], [1, 1, 1, "", "ShooterComponent"], [1, 1, 1, "", "ShouldDespawnComponent"], [1, 1, 1, "", "SimpleItemComponent"], [1, 1, 1, "", "StackedByDataComponent"], [1, 1, 1, "", "TagsComponent"], [1, 1, 1, "", "ThrowableComponent"], [1, 1, 1, "", "UseAnimationComponent"], [1, 1, 1, "", "UseDurationComponent"], [1, 1, 1, "", "UseModifiersComponent"], [1, 1, 1, "", "WearableComponent"], [1, 5, 1, "", "item_component_type"]], "mcaddon.item.AllowOffHandComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.BlockComponent2": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.BlockPlacerComponent": [[1, 4, 1, "", "block"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "use_on"]], "mcaddon.item.CameraComponent": [[1, 4, 1, "", "black_bars_duration"], [1, 4, 1, "", "black_bars_screen_ratio"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "picture_duration"], [1, 4, 1, "", "shutter_duration"], [1, 4, 1, "", "shutter_screen_ratio"], [1, 4, 1, "", "slide_away_duration"]], "mcaddon.item.CanDestroyInCreativeComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.CooldownComponent": [[1, 4, 1, "", "category"], [1, 4, 1, "", "duration"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.DamageComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.DiggerComponent": [[1, 4, 1, "", "destroy_speeds"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "use_efficiency"]], "mcaddon.item.DurabilityComponent": [[1, 4, 1, "", "damage_chance"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "max_durability"]], "mcaddon.item.EmptyItemComponent": [[1, 3, 1, "", "from_dict"]], "mcaddon.item.EnchantableComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "slot"], [1, 4, 1, "", "value"]], "mcaddon.item.EntityPlacerComponent": [[1, 4, 1, "", "dispense_on"], [1, 4, 1, "", "entity"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "use_on"]], "mcaddon.item.FoilComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.FoodComponent": [[1, 4, 1, "", "can_always_eat"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "nutrition"], [1, 4, 1, "", "saturation_modifier"], [1, 4, 1, "", "using_converts_to"]], "mcaddon.item.FuelComponent": [[1, 4, 1, "", "duration"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.GlintComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.HandEquippedComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.HoverTextColorComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.IconComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "texture"]], "mcaddon.item.IgnoresPermissionComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.InteractButtonComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.Item": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "add_component"], [1, 3, 1, "", "add_event"], [1, 3, 1, "", "clear_components"], [1, 3, 1, "", "clear_events"], [1, 4, 1, "", "components"], [1, 4, 1, "", "events"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "from_settings"], [1, 3, 1, "", "get_component"], [1, 3, 1, "", "get_event"], [1, 2, 1, "", "id"], [1, 4, 1, "", "max_count"], [1, 4, 1, "", "max_damage"], [1, 4, 1, "", "menu_category"], [1, 4, 1, "", "recipe_remainder"], [1, 3, 1, "", "remove_component"], [1, 3, 1, "", "remove_event"], [1, 3, 1, "", "stack"], [1, 3, 1, "", "translation_key"]], "mcaddon.item.ItemComponent": [[1, 3, 1, "", "from_dict"], [1, 3, 1, "", "json"]], "mcaddon.item.ItemDisplayNameComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "value"]], "mcaddon.item.ItemLoader": [[1, 2, 1, "", "name"]], "mcaddon.item.ItemSettings": [[1, 2, 1, "", "color"], [1, 2, 1, "", "max_count"], [1, 2, 1, "", "max_damage"], [1, 3, 1, "", "rarity"], [1, 2, 1, "", "recipe_remainder"], [1, 3, 1, "", "set_count"], [1, 3, 1, "", "set_damage"], [1, 3, 1, "", "set_recipe_remainder"]], "mcaddon.item.ItemStack": [[1, 4, 1, "", "count"], [1, 4, 1, "", "data"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "item"]], "mcaddon.item.ItemStorageComponent": [[1, 4, 1, "", "capacity"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.LiquidClippedComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.MaxDamageComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.MaxStackSizeComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.PortfolioComponent": [[1, 2, 1, "", "id"]], "mcaddon.item.ProjectileComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "minimum_critical_power"], [1, 4, 1, "", "projectile_entity"]], "mcaddon.item.RecordComponent": [[1, 4, 1, "", "comparator_signal"], [1, 4, 1, "", "duration"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "sound_event"]], "mcaddon.item.RepairableComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "repair_items"]], "mcaddon.item.SeedComponent": [[1, 4, 1, "", "crop_result"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.ShooterComponent": [[1, 3, 1, "", "add_ammunition"], [1, 4, 1, "", "ammunition"], [1, 4, 1, "", "charge_on_draw"], [1, 3, 1, "", "clear_ammunitions"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "max_draw_duration"], [1, 3, 1, "", "remove_ammunition"], [1, 4, 1, "", "scale_power_by_draw_duration"]], "mcaddon.item.ShouldDespawnComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.SimpleItemComponent": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "value"]], "mcaddon.item.StackedByDataComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.TagsComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "tags"]], "mcaddon.item.ThrowableComponent": [[1, 4, 1, "", "do_swing_animation"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "launch_power_scale"], [1, 4, 1, "", "max_draw_duration"], [1, 4, 1, "", "max_launch_power"], [1, 4, 1, "", "min_draw_duration"], [1, 4, 1, "", "scale_power_by_draw_duration"]], "mcaddon.item.UseAnimationComponent": [[1, 2, 1, "", "clazz"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.item.UseDurationComponent": [[1, 2, 1, "", "clazz"], [1, 2, 1, "", "id"]], "mcaddon.item.UseModifiersComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "movement_modifier"], [1, 4, 1, "", "use_duration"]], "mcaddon.item.WearableComponent": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "protection"], [1, 4, 1, "", "slot"]], "mcaddon.loot": [[1, 1, 1, "", "Enchant"], [1, 1, 1, "", "EnchantBookForTradingLootFunction"], [1, 1, 1, "", "EnchantRandomGearLootFunction"], [1, 1, 1, "", "EnchantRandomlyLootFunction"], [1, 1, 1, "", "EnchantWithLevelsLootFunction"], [1, 1, 1, "", "ExplorationMapLootFunction"], [1, 1, 1, "", "FillContainerLootFunction"], [1, 1, 1, "", "FurnaceSmeltLootFunction"], [1, 1, 1, "", "HasMarkvariantLootCondition"], [1, 1, 1, "", "ItemEntry"], [1, 1, 1, "", "KilledByEntityLootCondition"], [1, 1, 1, "", "KilledByPlayerLootCondition"], [1, 1, 1, "", "KilledByPlayerOrPetsLootCondition"], [1, 1, 1, "", "LeafEntry"], [1, 1, 1, "", "LootCondition"], [1, 1, 1, "", "LootEntry"], [1, 1, 1, "", "LootFunction"], [1, 1, 1, "", "LootNumberProvider"], [1, 1, 1, "", "LootPool"], [1, 1, 1, "", "LootPoolEntry"], [1, 1, 1, "", "LootTable"], [1, 1, 1, "", "LootTiers"], [1, 1, 1, "", "LootingEnchantLootFunction"], [1, 1, 1, "", "MatchToolLootCondition"], [1, 1, 1, "", "RandomAuxValueLootFunction"], [1, 1, 1, "", "RandomBlockPropertyLootFunction"], [1, 1, 1, "", "RandomChanceLootCondition"], [1, 1, 1, "", "RandomChanceWithLootingLootCondition"], [1, 1, 1, "", "RandomDifficultyChanceLootCondition"], [1, 1, 1, "", "RandomDyeLootFunction"], [1, 1, 1, "", "RandomRegionalDifficultyChanceLootCondition"], [1, 1, 1, "", "SetActorIdLootFunction"], [1, 1, 1, "", "SetBannerDetailsLootFunction"], [1, 1, 1, "", "SetBookContentsLootFunction"], [1, 1, 1, "", "SetCountLootFunction"], [1, 1, 1, "", "SetDamageLootFunction"], [1, 1, 1, "", "SetDataFromColorIndexLootFunction"], [1, 1, 1, "", "SetDataLootFunction"], [1, 1, 1, "", "SetLoreLootFunction"], [1, 1, 1, "", "SetNameLootFunction"], [1, 1, 1, "", "SpecificEnchantsLootFunction"], [1, 1, 1, "", "TraderMaterialTypeLootFunction"], [1, 5, 1, "", "loot_condition"], [1, 5, 1, "", "loot_function"], [1, 5, 1, "", "pool_entry"]], "mcaddon.loot.Enchant": [[1, 3, 1, "", "from_dict"]], "mcaddon.loot.EnchantBookForTradingLootFunction": [[1, 4, 1, "", "base_cost"], [1, 4, 1, "", "base_random_cost"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "per_level_cost"], [1, 4, 1, "", "per_level_random_cost"]], "mcaddon.loot.EnchantRandomGearLootFunction": [[1, 4, 1, "", "chance"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.EnchantRandomlyLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "treasure"]], "mcaddon.loot.EnchantWithLevelsLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "levels"], [1, 4, 1, "", "treasure"]], "mcaddon.loot.ExplorationMapLootFunction": [[1, 4, 1, "", "destination"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.FillContainerLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "loot_table"]], "mcaddon.loot.FurnaceSmeltLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.HasMarkvariantLootCondition": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "value"]], "mcaddon.loot.ItemEntry": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "name"]], "mcaddon.loot.KilledByEntityLootCondition": [[1, 4, 1, "", "entity_type"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.KilledByPlayerLootCondition": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.KilledByPlayerOrPetsLootCondition": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.LeafEntry": [[1, 3, 1, "", "add_condition"], [1, 3, 1, "", "add_function"], [1, 3, 1, "", "clear_conditions"], [1, 3, 1, "", "clear_functions"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "functions"], [1, 3, 1, "", "get_condition"], [1, 3, 1, "", "get_function"], [1, 4, 1, "", "quality"], [1, 3, 1, "", "remove_condition"], [1, 3, 1, "", "remove_function"], [1, 4, 1, "", "weight"]], "mcaddon.loot.LootEntry": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "name"]], "mcaddon.loot.LootNumberProvider": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "max"], [1, 4, 1, "", "min"]], "mcaddon.loot.LootPool": [[1, 3, 1, "", "add_condition"], [1, 3, 1, "", "add_entry"], [1, 3, 1, "", "add_function"], [1, 4, 1, "", "bonus_rolls"], [1, 3, 1, "", "clear_conditions"], [1, 3, 1, "", "clear_entries"], [1, 3, 1, "", "clear_functions"], [1, 4, 1, "", "conditions"], [1, 4, 1, "", "entries"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "functions"], [1, 3, 1, "", "get_condition"], [1, 3, 1, "", "get_entry"], [1, 3, 1, "", "get_function"], [1, 3, 1, "", "remove_condition"], [1, 3, 1, "", "remove_entry"], [1, 3, 1, "", "remove_function"], [1, 4, 1, "", "rolls"], [1, 4, 1, "", "tiers"]], "mcaddon.loot.LootPoolEntry": [[1, 4, 1, "", "conditions"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "id"]], "mcaddon.loot.LootTable": [[1, 3, 1, "", "add_function"], [1, 3, 1, "", "add_pool"], [1, 3, 1, "", "block"], [1, 3, 1, "", "clear_functions"], [1, 3, 1, "", "clear_pools"], [1, 2, 1, "", "dirname"], [1, 2, 1, "", "extension"], [1, 2, 1, "", "filename"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "functions"], [1, 3, 1, "", "get_function"], [1, 3, 1, "", "get_pool"], [1, 4, 1, "", "pools"], [1, 3, 1, "", "remove_function"], [1, 3, 1, "", "remove_pool"], [1, 4, 1, "", "type"]], "mcaddon.loot.LootTiers": [[1, 4, 1, "", "bonus_chance"], [1, 4, 1, "", "bonus_rolls"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "initial_range"]], "mcaddon.loot.LootingEnchantLootFunction": [[1, 4, 1, "", "count"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.MatchToolLootCondition": [[1, 4, 1, "", "count"], [1, 4, 1, "", "durability"], [1, 4, 1, "", "enchantments"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "item"]], "mcaddon.loot.RandomAuxValueLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "values"]], "mcaddon.loot.RandomBlockPropertyLootFunction": [[1, 4, 1, "", "block_state"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "values"]], "mcaddon.loot.RandomChanceLootCondition": [[1, 4, 1, "", "chance"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.RandomChanceWithLootingLootCondition": [[1, 4, 1, "", "chance"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "looting_multiplier"]], "mcaddon.loot.RandomDifficultyChanceLootCondition": [[1, 4, 1, "", "default_chance"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "hard"], [1, 2, 1, "", "id"], [1, 4, 1, "", "peaceful"]], "mcaddon.loot.RandomDyeLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.RandomRegionalDifficultyChanceLootCondition": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "max_chance"]], "mcaddon.loot.SetActorIdLootFunction": [[1, 4, 1, "", "actor_id"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.SetBannerDetailsLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "type"]], "mcaddon.loot.SetBookContentsLootFunction": [[1, 4, 1, "", "author"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "pages"], [1, 4, 1, "", "title"]], "mcaddon.loot.SetCountLootFunction": [[1, 4, 1, "", "count"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.SetDamageLootFunction": [[1, 4, 1, "", "damage"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.SetDataFromColorIndexLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.SetDataLootFunction": [[1, 4, 1, "", "data"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.SetLoreLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "lore"]], "mcaddon.loot.SetNameLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "name"]], "mcaddon.loot.SpecificEnchantsLootFunction": [[1, 4, 1, "", "enchantments"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.loot.TraderMaterialTypeLootFunction": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"]], "mcaddon.manifest": [[1, 1, 1, "", "Dependency"], [1, 1, 1, "", "Header"], [1, 1, 1, "", "Manifest"], [1, 1, 1, "", "ManifestLoader"], [1, 1, 1, "", "Metadata"], [1, 1, 1, "", "Module"]], "mcaddon.manifest.Dependency": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "uuid"], [1, 4, 1, "", "version"]], "mcaddon.manifest.Header": [[1, 4, 1, "", "allow_random_seed"], [1, 4, 1, "", "base_game_version"], [1, 4, 1, "", "description"], [1, 4, 1, "", "description_key"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "lock_template_options"], [1, 4, 1, "", "min_engine_version"], [1, 4, 1, "", "name"], [1, 4, 1, "", "name_key"], [1, 4, 1, "", "uuid"], [1, 4, 1, "", "version"]], "mcaddon.manifest.Manifest": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "add_dependency"], [1, 3, 1, "", "add_module"], [1, 3, 1, "", "behavior"], [1, 3, 1, "", "clear_dependencies"], [1, 3, 1, "", "clear_modules"], [1, 4, 1, "", "dependencies"], [1, 4, 1, "", "description"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_dependency"], [1, 3, 1, "", "get_module"], [1, 4, 1, "", "header"], [1, 4, 1, "", "metadata"], [1, 4, 1, "", "modules"], [1, 4, 1, "", "name"], [1, 3, 1, "", "remove_dependency"], [1, 3, 1, "", "remove_module"], [1, 3, 1, "", "resource"], [1, 3, 1, "", "set_module"], [1, 3, 1, "", "set_uuids"], [1, 3, 1, "", "world_template"]], "mcaddon.manifest.ManifestLoader": [[1, 2, 1, "", "name"]], "mcaddon.manifest.Metadata": [[1, 3, 1, "", "add_author"], [1, 4, 1, "", "authors"], [1, 3, 1, "", "clear_authors"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_author"], [1, 4, 1, "", "license"], [1, 3, 1, "", "remove_author"], [1, 4, 1, "", "url"]], "mcaddon.manifest.Module": [[1, 3, 1, "", "client_data"], [1, 3, 1, "", "data"], [1, 4, 1, "", "description"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "interface"], [1, 3, 1, "", "resources"], [1, 4, 1, "", "type"], [1, 4, 1, "", "uuid"], [1, 4, 1, "", "version"], [1, 3, 1, "", "world_template"]], "mcaddon.pack": [[1, 1, 1, "", "Addon"], [1, 1, 1, "", "BehaviorPack"], [1, 1, 1, "", "Pack"], [1, 1, 1, "", "ResourcePack"]], "mcaddon.pack.Addon": [[1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "add"], [1, 3, 1, "", "add_block"], [1, 3, 1, "", "add_item"], [1, 3, 1, "", "add_item_texture"], [1, 3, 1, "", "add_loot_table"], [1, 3, 1, "", "add_pack"], [1, 3, 1, "", "add_recipe"], [1, 3, 1, "", "add_terrain_texture"], [1, 3, 1, "", "add_volume"], [1, 3, 1, "", "clear_packs"], [1, 3, 1, "", "get"], [1, 3, 1, "", "get_pack"], [1, 2, 1, "", "id"], [1, 3, 1, "", "import_to"], [1, 3, 1, "", "load"], [1, 4, 1, "", "manifests"], [1, 4, 1, "", "packs"], [1, 3, 1, "", "readdir"], [1, 3, 1, "", "readzip"], [1, 3, 1, "", "remove_pack"], [1, 3, 1, "", "setup"], [1, 3, 1, "", "writedir"], [1, 3, 1, "", "writezip"]], "mcaddon.pack.BehaviorPack": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 4, 1, "", "MANIFEST"], [1, 3, 1, "", "add"], [1, 3, 1, "", "add_block"], [1, 3, 1, "", "add_item"], [1, 3, 1, "", "add_recipe"], [1, 3, 1, "", "add_volume"], [1, 3, 1, "", "clear_blocks"], [1, 3, 1, "", "clear_items"], [1, 3, 1, "", "clear_recipes"], [1, 3, 1, "", "clear_volumes"], [1, 3, 1, "", "get_block"], [1, 3, 1, "", "get_item"], [1, 3, 1, "", "get_recipe"], [1, 3, 1, "", "get_volume"], [1, 2, 1, "", "id"], [1, 3, 1, "", "import_to"], [1, 3, 1, "", "load"], [1, 3, 1, "", "merge"], [1, 3, 1, "", "readdir"], [1, 3, 1, "", "readzip"], [1, 3, 1, "", "remove_block"], [1, 3, 1, "", "remove_item"], [1, 3, 1, "", "remove_recipe"], [1, 3, 1, "", "remove_volume"], [1, 3, 1, "", "setup"], [1, 2, 1, "", "suffix"], [1, 3, 1, "", "writedir"], [1, 3, 1, "", "writezip"]], "mcaddon.pack.Pack": [[1, 3, 1, "", "add_file"], [1, 3, 1, "", "clear_files"], [1, 4, 1, "", "description"], [1, 4, 1, "", "file_types"], [1, 3, 1, "", "get_file"], [1, 4, 1, "", "manifest"], [1, 4, 1, "", "name"], [1, 3, 1, "", "remove_file"], [1, 3, 1, "", "set_details"], [1, 3, 1, "", "set_uuids"], [1, 4, 1, "", "suffix"], [1, 4, 1, "", "texts"], [1, 4, 1, "", "versions"], [1, 3, 1, "", "writedir"], [1, 3, 1, "", "writezip"]], "mcaddon.pack.ResourcePack": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 4, 1, "", "MANIFEST"], [1, 3, 1, "", "add"], [1, 3, 1, "", "add_block"], [1, 3, 1, "", "add_item"], [1, 3, 1, "", "add_item_texture"], [1, 3, 1, "", "add_terrain_texture"], [1, 4, 1, "", "blocks"], [1, 3, 1, "", "clear_block"], [1, 3, 1, "", "clear_item"], [1, 3, 1, "", "clear_item_texture"], [1, 3, 1, "", "clear_terrain_texture"], [1, 3, 1, "", "get_block"], [1, 3, 1, "", "get_item"], [1, 3, 1, "", "get_item_texture"], [1, 3, 1, "", "get_terrain_texture"], [1, 2, 1, "", "id"], [1, 3, 1, "", "import_to"], [1, 4, 1, "", "items"], [1, 3, 1, "", "load"], [1, 3, 1, "", "merge"], [1, 3, 1, "", "readdir"], [1, 3, 1, "", "readzip"], [1, 3, 1, "", "remove_block"], [1, 3, 1, "", "remove_item"], [1, 3, 1, "", "remove_item_texture"], [1, 3, 1, "", "remove_terrain_texture"], [1, 3, 1, "", "setup"], [1, 2, 1, "", "suffix"], [1, 3, 1, "", "writedir"], [1, 3, 1, "", "writezip"]], "mcaddon.recipe": [[1, 1, 1, "", "BrewingContainerRecipe"], [1, 1, 1, "", "BrewingContainerRecipeLoader"], [1, 1, 1, "", "BrewingMixRecipe"], [1, 1, 1, "", "BrewingMixRecipeLoader"], [1, 1, 1, "", "FurnaceRecipe"], [1, 1, 1, "", "FurnaceRecipeLoader"], [1, 1, 1, "", "Ingredient"], [1, 1, 1, "", "MaterialReductionRecipe"], [1, 1, 1, "", "MaterialReductionRecipeLoader"], [1, 1, 1, "", "Recipe"], [1, 1, 1, "", "ShapedRecipe"], [1, 1, 1, "", "ShapedRecipeLoader"], [1, 1, 1, "", "ShapelessRecipe"], [1, 1, 1, "", "ShapelessRecipeLoader"], [1, 1, 1, "", "SmithingTransformRecipe"], [1, 1, 1, "", "SmithingTransformRecipeLoader"], [1, 1, 1, "", "SmithingTrimRecipe"], [1, 1, 1, "", "SmithingTrimRecipeLoader"], [1, 1, 1, "", "StonecuttingRecipe"], [1, 5, 1, "", "recipe_type"]], "mcaddon.recipe.BrewingContainerRecipe": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "input"], [1, 4, 1, "", "output"], [1, 4, 1, "", "reagent"]], "mcaddon.recipe.BrewingContainerRecipeLoader": [[1, 2, 1, "", "name"]], "mcaddon.recipe.BrewingMixRecipe": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "input"], [1, 4, 1, "", "output"], [1, 4, 1, "", "reagent"]], "mcaddon.recipe.BrewingMixRecipeLoader": [[1, 2, 1, "", "name"]], "mcaddon.recipe.FurnaceRecipe": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "input"], [1, 4, 1, "", "output"]], "mcaddon.recipe.FurnaceRecipeLoader": [[1, 2, 1, "", "name"]], "mcaddon.recipe.Ingredient": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "item"], [1, 4, 1, "", "tag"]], "mcaddon.recipe.MaterialReductionRecipe": [[1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "input"], [1, 4, 1, "", "output"]], "mcaddon.recipe.MaterialReductionRecipeLoader": [[1, 2, 1, "", "mame"]], "mcaddon.recipe.Recipe": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "add_tag"], [1, 3, 1, "", "clear_tags"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "id"], [1, 3, 1, "", "remove_tag"], [1, 4, 1, "", "result"], [1, 4, 1, "", "tags"]], "mcaddon.recipe.ShapedRecipe": [[1, 3, 1, "", "add_key"], [1, 3, 1, "", "clear_keys"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "key"], [1, 4, 1, "", "pattern"], [1, 3, 1, "", "remove_key"]], "mcaddon.recipe.ShapedRecipeLoader": [[1, 2, 1, "", "name"]], "mcaddon.recipe.ShapelessRecipe": [[1, 3, 1, "", "add_ingredient"], [1, 3, 1, "", "clear_ingredients"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "ingredients"], [1, 3, 1, "", "remove_ingredient"]], "mcaddon.recipe.ShapelessRecipeLoader": [[1, 2, 1, "", "name"]], "mcaddon.recipe.SmithingTransformRecipe": [[1, 4, 1, "", "addition"], [1, 4, 1, "", "base"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "result"], [1, 4, 1, "", "template"]], "mcaddon.recipe.SmithingTransformRecipeLoader": [[1, 2, 1, "", "name"]], "mcaddon.recipe.SmithingTrimRecipe": [[1, 4, 1, "", "addition"], [1, 4, 1, "", "base"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "template"]], "mcaddon.recipe.SmithingTrimRecipeLoader": [[1, 2, 1, "", "name"]], "mcaddon.registry": [[1, 1, 1, "", "Registries"], [1, 1, 1, "", "Registry"], [1, 1, 1, "", "RegistryKey"]], "mcaddon.registry.Registries": [[1, 2, 1, "", "BLOCK_COMPONENT_TYPE"], [1, 2, 1, "", "BLOCK_STATE"], [1, 2, 1, "", "BLOCK_TRAIT"], [1, 2, 1, "", "BLOCK_TYPE"], [1, 2, 1, "", "EVENT_TYPE"], [1, 2, 1, "", "ITEM_COMPONENT_TYPE"], [1, 2, 1, "", "LOOT_CONDITION_TYPE"], [1, 2, 1, "", "LOOT_FUNCTION_TYPE"], [1, 2, 1, "", "POOL_ENTRY_TYPE"], [1, 2, 1, "", "RECIPE_TYPE"], [1, 2, 1, "", "VOLUME_COMPONENT_TYPE"]], "mcaddon.registry.Registry": [[1, 3, 1, "", "create_registry"], [1, 3, 1, "", "get_registry"], [1, 3, 1, "", "register"]], "mcaddon.registry.RegistryKey": [[1, 3, 1, "", "get"], [1, 3, 1, "", "items"], [1, 3, 1, "", "keys"], [1, 3, 1, "", "register"], [1, 3, 1, "", "values"]], "mcaddon.resrouce": [[1, 1, 1, "", "FlipbookTexture"], [1, 1, 1, "", "ItemAtlas"], [1, 1, 1, "", "ItemTexture"], [1, 1, 1, "", "TerrainAtlas"], [1, 1, 1, "", "TerrainTexture"], [1, 1, 1, "", "Texture"]], "mcaddon.resrouce.FlipbookTexture": [[1, 4, 1, "", "atlas_index"], [1, 4, 1, "", "atlas_tile"], [1, 4, 1, "", "atlas_tile_variant"], [1, 4, 1, "", "blend_frames"], [1, 4, 1, "", "frames"], [1, 4, 1, "", "replicate"], [1, 4, 1, "", "ticks_per_frame"]], "mcaddon.resrouce.ItemAtlas": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 2, 1, "", "identifier"]], "mcaddon.resrouce.ItemTexture": [[1, 2, 1, "", "dirname"]], "mcaddon.resrouce.TerrainAtlas": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 2, 1, "", "identifier"], [1, 4, 1, "", "num_mip_levels"], [1, 4, 1, "", "padding"]], "mcaddon.resrouce.TerrainTexture": [[1, 2, 1, "", "dirname"]], "mcaddon.resrouce.Texture": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "load"], [1, 4, 1, "", "path"], [1, 3, 1, "", "save"]], "mcaddon.schemas": [[2, 0, 0, "-", "block"], [2, 0, 0, "-", "camera"], [2, 0, 0, "-", "item"], [2, 0, 0, "-", "manifest"], [2, 0, 0, "-", "recipe"], [2, 0, 0, "-", "volume"]], "mcaddon.schemas.block": [[2, 1, 1, "", "BlockSchema1"]], "mcaddon.schemas.block.BlockSchema1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.camera": [[2, 1, 1, "", "CameraPresetSchem1"]], "mcaddon.schemas.camera.CameraPresetSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.item": [[2, 1, 1, "", "ItemSchema1"], [2, 1, 1, "", "ItemSchema2"]], "mcaddon.schemas.item.ItemSchema1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.item.ItemSchema2": [[2, 3, 1, "", "load"]], "mcaddon.schemas.manifest": [[2, 1, 1, "", "ManifestSchema1"]], "mcaddon.schemas.manifest.ManifestSchema1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe": [[2, 1, 1, "", "BrewingContainerSchem1"], [2, 1, 1, "", "BrewingMixSchem1"], [2, 1, 1, "", "FurnaceSchem1"], [2, 1, 1, "", "MaterialReductionSchem1"], [2, 1, 1, "", "ShapedSchem1"], [2, 1, 1, "", "ShapelessSchem1"], [2, 1, 1, "", "SmithingTransformSchem1"], [2, 1, 1, "", "SmithingTransformSchem2"], [2, 1, 1, "", "SmithingTrimSchem1"]], "mcaddon.schemas.recipe.BrewingContainerSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.BrewingMixSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.FurnaceSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.MaterialReductionSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.ShapedSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.ShapelessSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.SmithingTransformSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.SmithingTransformSchem2": [[2, 3, 1, "", "load"]], "mcaddon.schemas.recipe.SmithingTrimSchem1": [[2, 3, 1, "", "load"]], "mcaddon.schemas.volume": [[2, 1, 1, "", "VolumeSchema1"]], "mcaddon.schemas.volume.VolumeSchema1": [[2, 3, 1, "", "load"]], "mcaddon.state": [[1, 1, 1, "", "ActiveState"], [1, 1, 1, "", "AgeBitState"], [1, 1, 1, "", "AgeState"], [1, 1, 1, "", "AllowUnderwaterBitState"], [1, 1, 1, "", "AttachedBitState"], [1, 1, 1, "", "AttachmentState"], [1, 1, 1, "", "BambooLeafSizeState"], [1, 1, 1, "", "BambooStalkThicknessState"], [1, 1, 1, "", "BigDripleafTiltState"], [1, 1, 1, "", "BiteCounterState"], [1, 1, 1, "", "BlockFaceState"], [1, 1, 1, "", "BlockProperty"], [1, 1, 1, "", "BooksStoredState"], [1, 1, 1, "", "BooleanState"], [1, 1, 1, "", "BrewingStandSlotABitState"], [1, 1, 1, "", "BrewingStandSlotBBitState"], [1, 1, 1, "", "BrewingStandSlotCBitState"], [1, 1, 1, "", "BrushedProgressState"], [1, 1, 1, "", "ButtonPressedBitState"], [1, 1, 1, "", "CandlesState"], [1, 1, 1, "", "CardinalDirectionState"], [1, 1, 1, "", "CauldronLiquidState"], [1, 1, 1, "", "ChemistryTableTypeState"], [1, 1, 1, "", "ChiselTypeState"], [1, 1, 1, "", "ClusterCountState"], [1, 1, 1, "", "ColorBitState"], [1, 1, 1, "", "ColorState"], [1, 1, 1, "", "ConditionalBitState"], [1, 1, 1, "", "CoralColorState"], [1, 1, 1, "", "CoralDirectionState"], [1, 1, 1, "", "CoralHangTypeBitState"], [1, 1, 1, "", "CoveredBitState"], [1, 1, 1, "", "CrackedState"], [1, 1, 1, "", "CraftingState"], [1, 1, 1, "", "DamageState"], [1, 1, 1, "", "DeadBitState"], [1, 1, 1, "", "DirectionState"], [1, 1, 1, "", "DirtTypeState"], [1, 1, 1, "", "DisarmedBitState"], [1, 1, 1, "", "DoorHingeBitState"], [1, 1, 1, "", "DoublePlantTypeState"], [1, 1, 1, "", "DragDownState"], [1, 1, 1, "", "DripstoneThicknessState"], [1, 1, 1, "", "EndPortalEyeBitState"], [1, 1, 1, "", "ExplodeBitState"], [1, 1, 1, "", "FacingDirectionState"], [1, 1, 1, "", "FillLevelState"], [1, 1, 1, "", "FlowerTypeState"], [1, 1, 1, "", "GroundSignDirectionState"], [1, 1, 1, "", "GrowthState"], [1, 1, 1, "", "HangingState"], [1, 1, 1, "", "HeadPieceBitState"], [1, 1, 1, "", "HeightState"], [1, 1, 1, "", "HugeMushroomBitsState"], [1, 1, 1, "", "InWallBitState"], [1, 1, 1, "", "InfiniburnBitState"], [1, 1, 1, "", "IntegerState"], [1, 1, 1, "", "ItemFrameMapBitState"], [1, 1, 1, "", "ItemFramePhotoBitState"], [1, 1, 1, "", "LiquidDepthState"], [1, 1, 1, "", "MoisturizedAmountState"], [1, 1, 1, "", "MonsterEggStoneTypeState"], [1, 1, 1, "", "NewLeafTypeState"], [1, 1, 1, "", "NewLogTypeState"], [1, 1, 1, "", "NoDropBitState"], [1, 1, 1, "", "OccupiedBitState"], [1, 1, 1, "", "OldLeafTypeState"], [1, 1, 1, "", "OldLogTypeState"], [1, 1, 1, "", "OpenBitState"], [1, 1, 1, "", "OrientationState"], [1, 1, 1, "", "OutputLitBitState"], [1, 1, 1, "", "OutputSubtractBitState"], [1, 1, 1, "", "PersistentBitState"], [1, 1, 1, "", "PortalAxisState"], [1, 1, 1, "", "PoweredBitState"], [1, 1, 1, "", "RailDataBitState"], [1, 1, 1, "", "RailDirectionState"], [1, 1, 1, "", "RedstoneSignalState"], [1, 1, 1, "", "RepeaterDelayState"], [1, 1, 1, "", "SandStoneTypeState"], [1, 1, 1, "", "SandTypeState"], [1, 1, 1, "", "SaplingTypeState"], [1, 1, 1, "", "SculkSensorPhaseState"], [1, 1, 1, "", "SeaGrassTypeState"], [1, 1, 1, "", "SpongeTypeState"], [1, 1, 1, "", "StabilityCheckState"], [1, 1, 1, "", "StabilityState"], [1, 1, 1, "", "StoneBrickTypeState"], [1, 1, 1, "", "StoneSlabType2State"], [1, 1, 1, "", "StoneSlabType3State"], [1, 1, 1, "", "StoneSlabType4State"], [1, 1, 1, "", "StoneSlabTypeState"], [1, 1, 1, "", "StoneTypeState"], [1, 1, 1, "", "StrippedBitState"], [1, 1, 1, "", "StructureBlockTypeState"], [1, 1, 1, "", "StructureVoidTypeState"], [1, 1, 1, "", "SuspendedBitState"], [1, 1, 1, "", "TallGrassTypeState"], [1, 1, 1, "", "ToggleBitState"], [1, 1, 1, "", "TopSlotBitState"], [1, 1, 1, "", "TorchFacingDirectionState"], [1, 1, 1, "", "TriggedBitState"], [1, 1, 1, "", "TurtleEggCountState"], [1, 1, 1, "", "UpdateBitState"], [1, 1, 1, "", "UpperBlockBitState"], [1, 1, 1, "", "UpsideDownBitState"], [1, 1, 1, "", "VerticalHalfState"], [1, 1, 1, "", "VineDirectionBitsState"], [1, 1, 1, "", "WallBlockTypeState"], [1, 1, 1, "", "WallConnectionTypEastState"], [1, 1, 1, "", "WallConnectionTypeNorthState"], [1, 1, 1, "", "WallConnectionTypeSouthState"], [1, 1, 1, "", "WallConnectionTypeWestState"], [1, 1, 1, "", "WallPostBitState"], [1, 1, 1, "", "WeirdoDirectionState"], [1, 1, 1, "", "WoodTypeState"], [1, 5, 1, "", "state"]], "mcaddon.state.ActiveState": [[1, 2, 1, "", "id"]], "mcaddon.state.AgeBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.AgeState": [[1, 2, 1, "", "id"]], "mcaddon.state.AllowUnderwaterBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.AttachedBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.AttachmentState": [[1, 2, 1, "", "id"]], "mcaddon.state.BambooLeafSizeState": [[1, 2, 1, "", "id"]], "mcaddon.state.BambooStalkThicknessState": [[1, 2, 1, "", "id"]], "mcaddon.state.BigDripleafTiltState": [[1, 2, 1, "", "id"]], "mcaddon.state.BiteCounterState": [[1, 2, 1, "", "id"]], "mcaddon.state.BlockFaceState": [[1, 2, 1, "", "id"]], "mcaddon.state.BlockProperty": [[1, 3, 1, "", "from_dict"], [1, 4, 1, "", "id"], [1, 4, 1, "", "values"]], "mcaddon.state.BooksStoredState": [[1, 2, 1, "", "id"]], "mcaddon.state.BrewingStandSlotABitState": [[1, 2, 1, "", "id"]], "mcaddon.state.BrewingStandSlotBBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.BrewingStandSlotCBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.BrushedProgressState": [[1, 2, 1, "", "id"]], "mcaddon.state.ButtonPressedBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.CandlesState": [[1, 2, 1, "", "id"]], "mcaddon.state.CardinalDirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.CauldronLiquidState": [[1, 2, 1, "", "id"]], "mcaddon.state.ChemistryTableTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.ChiselTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.ClusterCountState": [[1, 2, 1, "", "id"]], "mcaddon.state.ColorBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.ColorState": [[1, 2, 1, "", "id"]], "mcaddon.state.ConditionalBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.CoralColorState": [[1, 2, 1, "", "id"]], "mcaddon.state.CoralDirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.CoralHangTypeBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.CoveredBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.CrackedState": [[1, 2, 1, "", "id"]], "mcaddon.state.CraftingState": [[1, 2, 1, "", "id"]], "mcaddon.state.DamageState": [[1, 2, 1, "", "id"]], "mcaddon.state.DeadBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.DirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.DirtTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.DisarmedBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.DoorHingeBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.DoublePlantTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.DragDownState": [[1, 2, 1, "", "id"]], "mcaddon.state.DripstoneThicknessState": [[1, 2, 1, "", "id"]], "mcaddon.state.EndPortalEyeBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.ExplodeBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.FacingDirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.FillLevelState": [[1, 2, 1, "", "id"]], "mcaddon.state.FlowerTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.GroundSignDirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.GrowthState": [[1, 2, 1, "", "id"]], "mcaddon.state.HangingState": [[1, 2, 1, "", "id"]], "mcaddon.state.HeadPieceBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.HeightState": [[1, 2, 1, "", "id"]], "mcaddon.state.HugeMushroomBitsState": [[1, 2, 1, "", "id"]], "mcaddon.state.InWallBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.InfiniburnBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.ItemFrameMapBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.ItemFramePhotoBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.LiquidDepthState": [[1, 2, 1, "", "id"]], "mcaddon.state.MoisturizedAmountState": [[1, 2, 1, "", "id"]], "mcaddon.state.MonsterEggStoneTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.NewLeafTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.NewLogTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.NoDropBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.OccupiedBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.OldLeafTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.OldLogTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.OpenBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.OrientationState": [[1, 2, 1, "", "id"]], "mcaddon.state.OutputLitBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.OutputSubtractBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.PersistentBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.PortalAxisState": [[1, 2, 1, "", "id"]], "mcaddon.state.PoweredBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.RailDataBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.RailDirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.RedstoneSignalState": [[1, 2, 1, "", "id"]], "mcaddon.state.RepeaterDelayState": [[1, 2, 1, "", "id"]], "mcaddon.state.SandStoneTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.SandTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.SaplingTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.SculkSensorPhaseState": [[1, 2, 1, "", "id"]], "mcaddon.state.SeaGrassTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.SpongeTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.StabilityCheckState": [[1, 2, 1, "", "id"]], "mcaddon.state.StabilityState": [[1, 2, 1, "", "id"]], "mcaddon.state.StoneBrickTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.StoneSlabType2State": [[1, 2, 1, "", "id"]], "mcaddon.state.StoneSlabType3State": [[1, 2, 1, "", "id"]], "mcaddon.state.StoneSlabType4State": [[1, 2, 1, "", "id"]], "mcaddon.state.StoneSlabTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.StoneTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.StrippedBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.StructureBlockTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.StructureVoidTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.SuspendedBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.TallGrassTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.ToggleBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.TopSlotBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.TorchFacingDirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.TriggedBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.TurtleEggCountState": [[1, 2, 1, "", "id"]], "mcaddon.state.UpdateBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.UpperBlockBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.UpsideDownBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.VerticalHalfState": [[1, 2, 1, "", "id"]], "mcaddon.state.VineDirectionBitsState": [[1, 2, 1, "", "id"]], "mcaddon.state.WallBlockTypeState": [[1, 2, 1, "", "id"]], "mcaddon.state.WallConnectionTypEastState": [[1, 2, 1, "", "id"]], "mcaddon.state.WallConnectionTypeNorthState": [[1, 2, 1, "", "id"]], "mcaddon.state.WallConnectionTypeSouthState": [[1, 2, 1, "", "id"]], "mcaddon.state.WallConnectionTypeWestState": [[1, 2, 1, "", "id"]], "mcaddon.state.WallPostBitState": [[1, 2, 1, "", "id"]], "mcaddon.state.WeirdoDirectionState": [[1, 2, 1, "", "id"]], "mcaddon.state.WoodTypeState": [[1, 2, 1, "", "id"]], "mcaddon.text": [[1, 1, 1, "", "Text"]], "mcaddon.util": [[1, 1, 1, "", "Box"], [1, 2, 1, "", "ID"], [1, 1, 1, "", "Identifiable"], [1, 1, 1, "", "Identifier"], [1, 1, 1, "", "MenuCategory"], [1, 1, 1, "", "Version"], [1, 5, 1, "", "getattr2"], [1, 5, 1, "", "stringify"]], "mcaddon.util.Box": [[1, 3, 1, "", "cube"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "is_cube"], [1, 3, 1, "", "is_none"], [1, 3, 1, "", "none"], [1, 4, 1, "", "origin"], [1, 4, 1, "", "size"]], "mcaddon.util.Identifiable": [[1, 4, 1, "", "identifier"]], "mcaddon.util.Identifier": [[1, 2, 1, "", "DEFAULT_NAMESPACE"], [1, 2, 1, "", "SEPERATOR"], [1, 3, 1, "", "copy"], [1, 3, 1, "", "copy_with_namespace"], [1, 3, 1, "", "copy_with_path"], [1, 3, 1, "", "is_namespace_valid"], [1, 3, 1, "", "is_path_valid"], [1, 4, 1, "", "namespace"], [1, 3, 1, "", "parse"], [1, 4, 1, "", "path"], [1, 3, 1, "", "replace"], [1, 3, 1, "", "split"]], "mcaddon.util.MenuCategory": [[1, 4, 1, "", "category"], [1, 3, 1, "", "from_dict"], [1, 4, 1, "", "group"], [1, 4, 1, "", "is_hidden_in_commands"]], "mcaddon.util.Version": [[1, 4, 1, "", "major"], [1, 4, 1, "", "minor"], [1, 3, 1, "", "parse"], [1, 4, 1, "", "patch"]], "mcaddon.volume": [[1, 1, 1, "", "FogComponent"], [1, 1, 1, "", "OnActorEnterComponent"], [1, 1, 1, "", "OnActorLeaveComponent"], [1, 1, 1, "", "Volume"], [1, 1, 1, "", "VolumeComponent"], [1, 1, 1, "", "VolumeLoader"], [1, 5, 1, "", "volume_component_type"]], "mcaddon.volume.FogComponent": [[1, 4, 1, "", "fog_identifier"], [1, 3, 1, "", "from_dict"], [1, 2, 1, "", "id"], [1, 4, 1, "", "priority"]], "mcaddon.volume.OnActorEnterComponent": [[1, 3, 1, "", "add_event"], [1, 3, 1, "", "clear_events"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_event"], [1, 2, 1, "", "id"], [1, 4, 1, "", "on_enter"], [1, 3, 1, "", "remove_event"]], "mcaddon.volume.OnActorLeaveComponent": [[1, 3, 1, "", "add_event"], [1, 3, 1, "", "clear_events"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_event"], [1, 2, 1, "", "id"], [1, 4, 1, "", "on_leave"], [1, 3, 1, "", "remove_event"]], "mcaddon.volume.Volume": [[1, 2, 1, "", "DIRNAME"], [1, 2, 1, "", "EXTENSION"], [1, 2, 1, "", "FILENAME"], [1, 3, 1, "", "add_component"], [1, 3, 1, "", "add_event"], [1, 3, 1, "", "clear_components"], [1, 3, 1, "", "clear_events"], [1, 4, 1, "", "components"], [1, 4, 1, "", "events"], [1, 3, 1, "", "from_dict"], [1, 3, 1, "", "get_component"], [1, 3, 1, "", "get_event"], [1, 2, 1, "", "id"], [1, 3, 1, "", "remove_component"], [1, 3, 1, "", "remove_event"]], "mcaddon.volume.VolumeComponent": [[1, 3, 1, "", "from_dict"], [1, 3, 1, "", "json"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:method", "4": "py:property", "5": "py:function", "6": "py:exception"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "method", "Python method"], "4": ["py", "property", "Python property"], "5": ["py", "function", "Python function"], "6": ["py", "exception", "Python exception"]}, "titleterms": {"welcom": 0, "mcpackutil": 0, "": 0, "document": 0, "content": [0, 1, 2], "indic": 0, "tabl": 0, "packag": [1, 2], "subpackag": 1, "submodul": [1, 2], "addon": [], "modul": [1, 2, 4], "anim": [], "biom": [], "constant": 1, "event": 1, "featur": [], "fog": [], "loot": 1, "manifest": [1, 2], "pack": 1, "particl": [], "recip": [1, 2], "texture_set": [], "util": 1, "volum": [1, 2], "block": [1, 2], "compon": [], "state": 1, "trait": [], "entiti": [], "item": [1, 2], "setup": 4, "mcaddon": [1, 2, 3], "schema": 2, "test": [], "camera": [1, 2], "cli": 1, "except": 1, "file": 1, "registri": 1, "resrouc": 1, "text": 1, "ext": [], "extra": [], "vanilla": [], "item_set": []}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.todo": 2, "sphinx": 60}, "alltitles": {"Welcome to mcpackutils\u2019s documentation!": [[0, "welcome-to-mcpackutils-s-documentation"]], "Contents:": [[0, null]], "Indices and tables": [[0, "indices-and-tables"]], "mcaddon": [[3, "mcaddon"]], "mcaddon package": [[1, "mcaddon-package"]], "Subpackages": [[1, "subpackages"]], "Submodules": [[1, "submodules"], [2, "submodules"]], "mcaddon.block module": [[1, "module-mcaddon.block"]], "mcaddon.camera module": [[1, "module-mcaddon.camera"]], "mcaddon.cli module": [[1, "module-mcaddon.cli"]], "mcaddon.constant module": [[1, "module-mcaddon.constant"]], "mcaddon.event module": [[1, "module-mcaddon.event"]], "mcaddon.exception module": [[1, "module-mcaddon.exception"]], "mcaddon.file module": [[1, "module-mcaddon.file"]], "mcaddon.item module": [[1, "module-mcaddon.item"]], "mcaddon.loot module": [[1, "module-mcaddon.loot"]], "mcaddon.manifest module": [[1, "module-mcaddon.manifest"]], "mcaddon.pack module": [[1, "module-mcaddon.pack"]], "mcaddon.recipe module": [[1, "module-mcaddon.recipe"]], "mcaddon.registry module": [[1, "module-mcaddon.registry"]], "mcaddon.resrouce module": [[1, "module-mcaddon.resrouce"]], "mcaddon.state module": [[1, "module-mcaddon.state"]], "mcaddon.text module": [[1, "module-mcaddon.text"]], "mcaddon.util module": [[1, "module-mcaddon.util"]], "mcaddon.volume module": [[1, "module-mcaddon.volume"]], "Module contents": [[1, "module-mcaddon"], [2, "module-mcaddon.schemas"]], "mcaddon.schemas package": [[2, "mcaddon-schemas-package"]], "mcaddon.schemas.block module": [[2, "module-mcaddon.schemas.block"]], "mcaddon.schemas.camera module": [[2, "module-mcaddon.schemas.camera"]], "mcaddon.schemas.item module": [[2, "module-mcaddon.schemas.item"]], "mcaddon.schemas.manifest module": [[2, "module-mcaddon.schemas.manifest"]], "mcaddon.schemas.recipe module": [[2, "module-mcaddon.schemas.recipe"]], "mcaddon.schemas.volume module": [[2, "module-mcaddon.schemas.volume"]], "setup module": [[4, "setup-module"]]}, "indexentries": {"activestate (class in mcaddon.state)": [[1, "mcaddon.state.ActiveState"]], "addmobeffect (class in mcaddon.event)": [[1, "mcaddon.event.AddMobEffect"]], "addon (class in mcaddon.pack)": [[1, "mcaddon.pack.Addon"]], "agebitstate (class in mcaddon.state)": [[1, "mcaddon.state.AgeBitState"]], "agestate (class in mcaddon.state)": [[1, "mcaddon.state.AgeState"]], "allowoffhandcomponent (class in mcaddon.item)": [[1, "mcaddon.item.AllowOffHandComponent"]], "allowunderwaterbitstate (class in mcaddon.state)": [[1, "mcaddon.state.AllowUnderwaterBitState"]], "archivefile (class in mcaddon.file)": [[1, "mcaddon.file.ArchiveFile"]], "attachedbitstate (class in mcaddon.state)": [[1, "mcaddon.state.AttachedBitState"]], "attachmentstate (class in mcaddon.state)": [[1, "mcaddon.state.AttachmentState"]], "block_component_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.BLOCK_COMPONENT_TYPE"]], "block_state (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.BLOCK_STATE"]], "block_trait (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.BLOCK_TRAIT"]], "block_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.BLOCK_TYPE"]], "bambooleafsizestate (class in mcaddon.state)": [[1, "mcaddon.state.BambooLeafSizeState"]], "bamboostalkthicknessstate (class in mcaddon.state)": [[1, "mcaddon.state.BambooStalkThicknessState"]], "behaviorpack (class in mcaddon.pack)": [[1, "mcaddon.pack.BehaviorPack"]], "bigdripleaftiltstate (class in mcaddon.state)": [[1, "mcaddon.state.BigDripleafTiltState"]], "bitecounterstate (class in mcaddon.state)": [[1, "mcaddon.state.BiteCounterState"]], "block (class in mcaddon.block)": [[1, "mcaddon.block.Block"]], "blockcomponent (class in mcaddon.block)": [[1, "mcaddon.block.BlockComponent"]], "blockcomponent2 (class in mcaddon.item)": [[1, "mcaddon.item.BlockComponent2"]], "blockdescriptor (class in mcaddon.block)": [[1, "mcaddon.block.BlockDescriptor"]], "blockdisplaynamecomponent (class in mcaddon.block)": [[1, "mcaddon.block.BlockDisplayNameComponent"]], "blockface (class in mcaddon.constant)": [[1, "mcaddon.constant.BlockFace"]], "blockfacestate (class in mcaddon.state)": [[1, "mcaddon.state.BlockFaceState"]], "blockloader (class in mcaddon.block)": [[1, "mcaddon.block.BlockLoader"]], "blockpermutation (class in mcaddon.block)": [[1, "mcaddon.block.BlockPermutation"]], "blockplacercomponent (class in mcaddon.item)": [[1, "mcaddon.item.BlockPlacerComponent"]], "blocksettings (class in mcaddon.block)": [[1, "mcaddon.block.BlockSettings"]], "blockstate (class in mcaddon.state)": [[1, "mcaddon.state.BlockProperty"]], "blocktagscomponent (class in mcaddon.block)": [[1, "mcaddon.block.BlockTagsComponent"]], "blocktrait (class in mcaddon.block)": [[1, "mcaddon.block.BlockTrait"]], "bonevisabilitycomponent (class in mcaddon.block)": [[1, "mcaddon.block.BoneVisabilityComponent"]], "booksstoredstate (class in mcaddon.state)": [[1, "mcaddon.state.BooksStoredState"]], "booleanstate (class in mcaddon.state)": [[1, "mcaddon.state.BooleanState"]], "box (class in mcaddon.util)": [[1, "mcaddon.util.Box"]], "breathabilitycomponent (class in mcaddon.block)": [[1, "mcaddon.block.BreathabilityComponent"]], "brewingcontainerrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.BrewingContainerRecipe"]], "brewingcontainerrecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.BrewingContainerRecipeLoader"]], "brewingmixrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.BrewingMixRecipe"]], "brewingmixrecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.BrewingMixRecipeLoader"]], "brewingstandslotabitstate (class in mcaddon.state)": [[1, "mcaddon.state.BrewingStandSlotABitState"]], "brewingstandslotbbitstate (class in mcaddon.state)": [[1, "mcaddon.state.BrewingStandSlotBBitState"]], "brewingstandslotcbitstate (class in mcaddon.state)": [[1, "mcaddon.state.BrewingStandSlotCBitState"]], "brushedprogressstate (class in mcaddon.state)": [[1, "mcaddon.state.BrushedProgressState"]], "buttonpressedbitstate (class in mcaddon.state)": [[1, "mcaddon.state.ButtonPressedBitState"]], "cameracomponent (class in mcaddon.item)": [[1, "mcaddon.item.CameraComponent"]], "cameralistener (class in mcaddon.constant)": [[1, "mcaddon.constant.CameraListener"]], "camerapreset (class in mcaddon.camera)": [[1, "mcaddon.camera.CameraPreset"]], "camerapresetloader (class in mcaddon.camera)": [[1, "mcaddon.camera.CameraPresetLoader"]], "candestroyincreativecomponent (class in mcaddon.item)": [[1, "mcaddon.item.CanDestroyInCreativeComponent"]], "candlesstate (class in mcaddon.state)": [[1, "mcaddon.state.CandlesState"]], "cardinaldirectionstate (class in mcaddon.state)": [[1, "mcaddon.state.CardinalDirectionState"]], "category (class in mcaddon.constant)": [[1, "mcaddon.constant.Category"]], "cauldronliquidstate (class in mcaddon.state)": [[1, "mcaddon.state.CauldronLiquidState"]], "chemistrytabletypestate (class in mcaddon.state)": [[1, "mcaddon.state.ChemistryTableTypeState"]], "chiseltypestate (class in mcaddon.state)": [[1, "mcaddon.state.ChiselTypeState"]], "clustercountstate (class in mcaddon.state)": [[1, "mcaddon.state.ClusterCountState"]], "collisionboxcomponent (class in mcaddon.block)": [[1, "mcaddon.block.CollisionBoxComponent"]], "color (class in mcaddon.constant)": [[1, "mcaddon.constant.Color"]], "colorbitstate (class in mcaddon.state)": [[1, "mcaddon.state.ColorBitState"]], "colorstate (class in mcaddon.state)": [[1, "mcaddon.state.ColorState"]], "componentnotfounderror": [[1, "mcaddon.exception.ComponentNotFoundError"]], "conditionalbitstate (class in mcaddon.state)": [[1, "mcaddon.state.ConditionalBitState"]], "cooldowncomponent (class in mcaddon.item)": [[1, "mcaddon.item.CooldownComponent"]], "coralcolorstate (class in mcaddon.state)": [[1, "mcaddon.state.CoralColorState"]], "coraldirectionstate (class in mcaddon.state)": [[1, "mcaddon.state.CoralDirectionState"]], "coralhangtypebitstate (class in mcaddon.state)": [[1, "mcaddon.state.CoralHangTypeBitState"]], "coveredbitstate (class in mcaddon.state)": [[1, "mcaddon.state.CoveredBitState"]], "crackedstate (class in mcaddon.state)": [[1, "mcaddon.state.CrackedState"]], "craftingstate (class in mcaddon.state)": [[1, "mcaddon.state.CraftingState"]], "craftingtablecomponent (class in mcaddon.block)": [[1, "mcaddon.block.CraftingTableComponent"]], "default_namespace (mcaddon.util.identifier attribute)": [[1, "mcaddon.util.Identifier.DEFAULT_NAMESPACE"]], "dirname (mcaddon.block.block attribute)": [[1, "mcaddon.block.Block.DIRNAME"]], "dirname (mcaddon.camera.camerapreset attribute)": [[1, "mcaddon.camera.CameraPreset.DIRNAME"]], "dirname (mcaddon.item.item attribute)": [[1, "mcaddon.item.Item.DIRNAME"]], "dirname (mcaddon.manifest.manifest attribute)": [[1, "mcaddon.manifest.Manifest.DIRNAME"]], "dirname (mcaddon.pack.behaviorpack attribute)": [[1, "mcaddon.pack.BehaviorPack.DIRNAME"]], "dirname (mcaddon.pack.resourcepack attribute)": [[1, "mcaddon.pack.ResourcePack.DIRNAME"]], "dirname (mcaddon.recipe.recipe attribute)": [[1, "mcaddon.recipe.Recipe.DIRNAME"]], "dirname (mcaddon.resrouce.itematlas attribute)": [[1, "mcaddon.resrouce.ItemAtlas.DIRNAME"]], "dirname (mcaddon.resrouce.terrainatlas attribute)": [[1, "mcaddon.resrouce.TerrainAtlas.DIRNAME"]], "dirname (mcaddon.resrouce.texture attribute)": [[1, "mcaddon.resrouce.Texture.DIRNAME"]], "dirname (mcaddon.volume.volume attribute)": [[1, "mcaddon.volume.Volume.DIRNAME"]], "damage (class in mcaddon.event)": [[1, "mcaddon.event.Damage"]], "damagecomponent (class in mcaddon.item)": [[1, "mcaddon.item.DamageComponent"]], "damagestate (class in mcaddon.state)": [[1, "mcaddon.state.DamageState"]], "deadbitstate (class in mcaddon.state)": [[1, "mcaddon.state.DeadBitState"]], "decrementblockstate (class in mcaddon.event)": [[1, "mcaddon.event.DecrementBlockProperty"]], "decrementstack (class in mcaddon.event)": [[1, "mcaddon.event.DecrementStack"]], "dependency (class in mcaddon.manifest)": [[1, "mcaddon.manifest.Dependency"]], "destination (class in mcaddon.constant)": [[1, "mcaddon.constant.Destination"]], "destructiblebyexplosioncomponent (class in mcaddon.block)": [[1, "mcaddon.block.DestructibleByExplosionComponent"]], "destructiblebyminingcomponent (class in mcaddon.block)": [[1, "mcaddon.block.DestructibleByMiningComponent"]], "die (class in mcaddon.event)": [[1, "mcaddon.event.Die"]], "diggercomponent (class in mcaddon.item)": [[1, "mcaddon.item.DiggerComponent"]], "directionstate (class in mcaddon.state)": [[1, "mcaddon.state.DirectionState"]], "dirttypestate (class in mcaddon.state)": [[1, "mcaddon.state.DirtTypeState"]], "disarmedbitstate (class in mcaddon.state)": [[1, "mcaddon.state.DisarmedBitState"]], "doorhingebitstate (class in mcaddon.state)": [[1, "mcaddon.state.DoorHingeBitState"]], "doubleplanttypestate (class in mcaddon.state)": [[1, "mcaddon.state.DoublePlantTypeState"]], "dragdownstate (class in mcaddon.state)": [[1, "mcaddon.state.DragDownState"]], "dripstonethicknessstate (class in mcaddon.state)": [[1, "mcaddon.state.DripstoneThicknessState"]], "durabilitycomponent (class in mcaddon.item)": [[1, "mcaddon.item.DurabilityComponent"]], "event_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.EVENT_TYPE"]], "extension (mcaddon.block.block attribute)": [[1, "mcaddon.block.Block.EXTENSION"]], "extension (mcaddon.camera.camerapreset attribute)": [[1, "mcaddon.camera.CameraPreset.EXTENSION"]], "extension (mcaddon.item.item attribute)": [[1, "mcaddon.item.Item.EXTENSION"]], "extension (mcaddon.manifest.manifest attribute)": [[1, "mcaddon.manifest.Manifest.EXTENSION"]], "extension (mcaddon.pack.addon attribute)": [[1, "mcaddon.pack.Addon.EXTENSION"]], "extension (mcaddon.pack.behaviorpack attribute)": [[1, "mcaddon.pack.BehaviorPack.EXTENSION"]], "extension (mcaddon.pack.resourcepack attribute)": [[1, "mcaddon.pack.ResourcePack.EXTENSION"]], "extension (mcaddon.recipe.recipe attribute)": [[1, "mcaddon.recipe.Recipe.EXTENSION"]], "extension (mcaddon.resrouce.itematlas attribute)": [[1, "mcaddon.resrouce.ItemAtlas.EXTENSION"]], "extension (mcaddon.resrouce.terrainatlas attribute)": [[1, "mcaddon.resrouce.TerrainAtlas.EXTENSION"]], "extension (mcaddon.resrouce.texture attribute)": [[1, "mcaddon.resrouce.Texture.EXTENSION"]], "extension (mcaddon.volume.volume attribute)": [[1, "mcaddon.volume.Volume.EXTENSION"]], "edition (class in mcaddon.constant)": [[1, "mcaddon.constant.Edition"]], "emptyitemcomponent (class in mcaddon.item)": [[1, "mcaddon.item.EmptyItemComponent"]], "enchant (class in mcaddon.loot)": [[1, "mcaddon.loot.Enchant"]], "enchantbookfortradinglootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.EnchantBookForTradingLootFunction"]], "enchantrandomgearlootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.EnchantRandomGearLootFunction"]], "enchantrandomlylootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.EnchantRandomlyLootFunction"]], "enchantwithlevelslootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.EnchantWithLevelsLootFunction"]], "enchantablecomponent (class in mcaddon.item)": [[1, "mcaddon.item.EnchantableComponent"]], "endportaleyebitstate (class in mcaddon.state)": [[1, "mcaddon.state.EndPortalEyeBitState"]], "entityplacercomponent (class in mcaddon.item)": [[1, "mcaddon.item.EntityPlacerComponent"]], "error": [[1, "mcaddon.exception.Error"]], "event (class in mcaddon.event)": [[1, "mcaddon.event.Event"]], "eventnotfounderror": [[1, "mcaddon.exception.EventNotFoundError"]], "eventtarget (class in mcaddon.constant)": [[1, "mcaddon.constant.EventTarget"]], "explodebitstate (class in mcaddon.state)": [[1, "mcaddon.state.ExplodeBitState"]], "explorationmaplootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.ExplorationMapLootFunction"]], "filename (mcaddon.block.block attribute)": [[1, "mcaddon.block.Block.FILENAME"]], "filename (mcaddon.camera.camerapreset attribute)": [[1, "mcaddon.camera.CameraPreset.FILENAME"]], "filename (mcaddon.item.item attribute)": [[1, "mcaddon.item.Item.FILENAME"]], "filename (mcaddon.manifest.manifest attribute)": [[1, "mcaddon.manifest.Manifest.FILENAME"]], "filename (mcaddon.pack.addon attribute)": [[1, "mcaddon.pack.Addon.FILENAME"]], "filename (mcaddon.pack.behaviorpack attribute)": [[1, "mcaddon.pack.BehaviorPack.FILENAME"]], "filename (mcaddon.pack.resourcepack attribute)": [[1, "mcaddon.pack.ResourcePack.FILENAME"]], "filename (mcaddon.recipe.recipe attribute)": [[1, "mcaddon.recipe.Recipe.FILENAME"]], "filename (mcaddon.resrouce.itematlas attribute)": [[1, "mcaddon.resrouce.ItemAtlas.FILENAME"]], "filename (mcaddon.resrouce.terrainatlas attribute)": [[1, "mcaddon.resrouce.TerrainAtlas.FILENAME"]], "filename (mcaddon.resrouce.texture attribute)": [[1, "mcaddon.resrouce.Texture.FILENAME"]], "filename (mcaddon.volume.volume attribute)": [[1, "mcaddon.volume.Volume.FILENAME"]], "facingdirectionstate (class in mcaddon.state)": [[1, "mcaddon.state.FacingDirectionState"]], "file (class in mcaddon.file)": [[1, "mcaddon.file.File"]], "fillcontainerlootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.FillContainerLootFunction"]], "filllevelstate (class in mcaddon.state)": [[1, "mcaddon.state.FillLevelState"]], "filter (class in mcaddon.block)": [[1, "mcaddon.block.Filter"]], "flammablecomponent (class in mcaddon.block)": [[1, "mcaddon.block.FlammableComponent"]], "flipbooktexture (class in mcaddon.resrouce)": [[1, "mcaddon.resrouce.FlipbookTexture"]], "flowertypestate (class in mcaddon.state)": [[1, "mcaddon.state.FlowerTypeState"]], "fogcomponent (class in mcaddon.volume)": [[1, "mcaddon.volume.FogComponent"]], "foilcomponent (class in mcaddon.item)": [[1, "mcaddon.item.FoilComponent"]], "foodcomponent (class in mcaddon.item)": [[1, "mcaddon.item.FoodComponent"]], "frictioncomponent (class in mcaddon.block)": [[1, "mcaddon.block.FrictionComponent"]], "fuelcomponent (class in mcaddon.item)": [[1, "mcaddon.item.FuelComponent"]], "furnacerecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.FurnaceRecipe"]], "furnacerecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.FurnaceRecipeLoader"]], "furnacesmeltlootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.FurnaceSmeltLootFunction"]], "geometrycomponent (class in mcaddon.block)": [[1, "mcaddon.block.GeometryComponent"]], "glintcomponent (class in mcaddon.item)": [[1, "mcaddon.item.GlintComponent"]], "groundsigndirectionstate (class in mcaddon.state)": [[1, "mcaddon.state.GroundSignDirectionState"]], "growthstate (class in mcaddon.state)": [[1, "mcaddon.state.GrowthState"]], "handequippedcomponent (class in mcaddon.item)": [[1, "mcaddon.item.HandEquippedComponent"]], "hangingstate (class in mcaddon.state)": [[1, "mcaddon.state.HangingState"]], "hasmarkvariantlootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.HasMarkvariantLootCondition"]], "headpiecebitstate (class in mcaddon.state)": [[1, "mcaddon.state.HeadPieceBitState"]], "header (class in mcaddon.manifest)": [[1, "mcaddon.manifest.Header"]], "heightstate (class in mcaddon.state)": [[1, "mcaddon.state.HeightState"]], "hovertextcolorcomponent (class in mcaddon.item)": [[1, "mcaddon.item.HoverTextColorComponent"]], "hugemushroombitsstate (class in mcaddon.state)": [[1, "mcaddon.state.HugeMushroomBitsState"]], "id (in module mcaddon.util)": [[1, "mcaddon.util.ID"]], "item_component_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.ITEM_COMPONENT_TYPE"]], "iconcomponent (class in mcaddon.item)": [[1, "mcaddon.item.IconComponent"]], "identifiable (class in mcaddon.util)": [[1, "mcaddon.util.Identifiable"]], "identifier (class in mcaddon.util)": [[1, "mcaddon.util.Identifier"]], "ignorespermissioncomponent (class in mcaddon.item)": [[1, "mcaddon.item.IgnoresPermissionComponent"]], "importable (class in mcaddon.file)": [[1, "mcaddon.file.Importable"]], "inwallbitstate (class in mcaddon.state)": [[1, "mcaddon.state.InWallBitState"]], "incrementblockstate (class in mcaddon.event)": [[1, "mcaddon.event.IncrementBlockProperty"]], "infiniburnbitstate (class in mcaddon.state)": [[1, "mcaddon.state.InfiniburnBitState"]], "ingredient (class in mcaddon.recipe)": [[1, "mcaddon.recipe.Ingredient"]], "integerstate (class in mcaddon.state)": [[1, "mcaddon.state.IntegerState"]], "interactbuttoncomponent (class in mcaddon.item)": [[1, "mcaddon.item.InteractButtonComponent"]], "item (class in mcaddon.item)": [[1, "mcaddon.item.Item"]], "itematlas (class in mcaddon.resrouce)": [[1, "mcaddon.resrouce.ItemAtlas"]], "itemcomponent (class in mcaddon.item)": [[1, "mcaddon.item.ItemComponent"]], "itemdisplaynamecomponent (class in mcaddon.item)": [[1, "mcaddon.item.ItemDisplayNameComponent"]], "itementry (class in mcaddon.loot)": [[1, "mcaddon.loot.ItemEntry"]], "itemframemapbitstate (class in mcaddon.state)": [[1, "mcaddon.state.ItemFrameMapBitState"]], "itemframephotobitstate (class in mcaddon.state)": [[1, "mcaddon.state.ItemFramePhotoBitState"]], "itemloader (class in mcaddon.item)": [[1, "mcaddon.item.ItemLoader"]], "itemsettings (class in mcaddon.item)": [[1, "mcaddon.item.ItemSettings"]], "itemstack (class in mcaddon.item)": [[1, "mcaddon.item.ItemStack"]], "itemstoragecomponent (class in mcaddon.item)": [[1, "mcaddon.item.ItemStorageComponent"]], "itemtexture (class in mcaddon.resrouce)": [[1, "mcaddon.resrouce.ItemTexture"]], "jsonfile (class in mcaddon.file)": [[1, "mcaddon.file.JsonFile"]], "killedbyentitylootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.KilledByEntityLootCondition"]], "killedbyplayerlootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.KilledByPlayerLootCondition"]], "killedbyplayerorpetslootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.KilledByPlayerOrPetsLootCondition"]], "loot_condition_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.LOOT_CONDITION_TYPE"]], "loot_function_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.LOOT_FUNCTION_TYPE"]], "leafentry (class in mcaddon.loot)": [[1, "mcaddon.loot.LeafEntry"]], "lightdampeningcomponent (class in mcaddon.block)": [[1, "mcaddon.block.LightDampeningComponent"]], "lightemissioncomponent (class in mcaddon.block)": [[1, "mcaddon.block.LightEmissionComponent"]], "liquidclippedcomponent (class in mcaddon.item)": [[1, "mcaddon.item.LiquidClippedComponent"]], "liquiddepthstate (class in mcaddon.state)": [[1, "mcaddon.state.LiquidDepthState"]], "loader (class in mcaddon.file)": [[1, "mcaddon.file.Loader"]], "lootcomponent (class in mcaddon.block)": [[1, "mcaddon.block.LootComponent"]], "lootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.LootCondition"]], "lootcontexttype (class in mcaddon.constant)": [[1, "mcaddon.constant.LootContextType"]], "lootentry (class in mcaddon.loot)": [[1, "mcaddon.loot.LootEntry"]], "lootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.LootFunction"]], "lootnumberprovider (class in mcaddon.loot)": [[1, "mcaddon.loot.LootNumberProvider"]], "lootpool (class in mcaddon.loot)": [[1, "mcaddon.loot.LootPool"]], "lootpoolentry (class in mcaddon.loot)": [[1, "mcaddon.loot.LootPoolEntry"]], "loottable (class in mcaddon.loot)": [[1, "mcaddon.loot.LootTable"]], "loottiers (class in mcaddon.loot)": [[1, "mcaddon.loot.LootTiers"]], "lootingenchantlootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.LootingEnchantLootFunction"]], "manifest (mcaddon.pack.behaviorpack property)": [[1, "mcaddon.pack.BehaviorPack.MANIFEST"]], "manifest (mcaddon.pack.resourcepack property)": [[1, "mcaddon.pack.ResourcePack.MANIFEST"]], "manifest (class in mcaddon.manifest)": [[1, "mcaddon.manifest.Manifest"]], "manifestloader (class in mcaddon.manifest)": [[1, "mcaddon.manifest.ManifestLoader"]], "manifestnotfounderror": [[1, "mcaddon.exception.ManifestNotFoundError"]], "mapcolorcomponent (class in mcaddon.block)": [[1, "mcaddon.block.MapColorComponent"]], "matchtoollootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.MatchToolLootCondition"]], "material (class in mcaddon.block)": [[1, "mcaddon.block.Material"]], "materialinstancescomponent (class in mcaddon.block)": [[1, "mcaddon.block.MaterialInstancesComponent"]], "materialreductionrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.MaterialReductionRecipe"]], "materialreductionrecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.MaterialReductionRecipeLoader"]], "maxdamagecomponent (class in mcaddon.item)": [[1, "mcaddon.item.MaxDamageComponent"]], "maxstacksizecomponent (class in mcaddon.item)": [[1, "mcaddon.item.MaxStackSizeComponent"]], "menucategory (class in mcaddon.util)": [[1, "mcaddon.util.MenuCategory"]], "metadata (class in mcaddon.manifest)": [[1, "mcaddon.manifest.Metadata"]], "minecraftnotfounderror": [[1, "mcaddon.exception.MinecraftNotFoundError"]], "module (class in mcaddon.manifest)": [[1, "mcaddon.manifest.Module"]], "moduletype (class in mcaddon.constant)": [[1, "mcaddon.constant.ModuleType"]], "moisturizedamountstate (class in mcaddon.state)": [[1, "mcaddon.state.MoisturizedAmountState"]], "monstereggstonetypestate (class in mcaddon.state)": [[1, "mcaddon.state.MonsterEggStoneTypeState"]], "newleaftypestate (class in mcaddon.state)": [[1, "mcaddon.state.NewLeafTypeState"]], "newlogtypestate (class in mcaddon.state)": [[1, "mcaddon.state.NewLogTypeState"]], "nodropbitstate (class in mcaddon.state)": [[1, "mcaddon.state.NoDropBitState"]], "occupiedbitstate (class in mcaddon.state)": [[1, "mcaddon.state.OccupiedBitState"]], "oldleaftypestate (class in mcaddon.state)": [[1, "mcaddon.state.OldLeafTypeState"]], "oldlogtypestate (class in mcaddon.state)": [[1, "mcaddon.state.OldLogTypeState"]], "onactorentercomponent (class in mcaddon.volume)": [[1, "mcaddon.volume.OnActorEnterComponent"]], "onactorleavecomponent (class in mcaddon.volume)": [[1, "mcaddon.volume.OnActorLeaveComponent"]], "onfalloncomponent (class in mcaddon.block)": [[1, "mcaddon.block.OnFallOnComponent"]], "oninteractcomponent (class in mcaddon.block)": [[1, "mcaddon.block.OnInteractComponent"]], "onplacedcomponent (class in mcaddon.block)": [[1, "mcaddon.block.OnPlacedComponent"]], "onplayerdestroyedcomponent (class in mcaddon.block)": [[1, "mcaddon.block.OnPlayerDestroyedComponent"]], "onplayerplacingcomponent (class in mcaddon.block)": [[1, "mcaddon.block.OnPlayerPlacingComponent"]], "onstepoffcomponent (class in mcaddon.block)": [[1, "mcaddon.block.OnStepOffComponent"]], "onsteponcomponent (class in mcaddon.block)": [[1, "mcaddon.block.OnStepOnComponent"]], "openbitstate (class in mcaddon.state)": [[1, "mcaddon.state.OpenBitState"]], "orientationstate (class in mcaddon.state)": [[1, "mcaddon.state.OrientationState"]], "outputlitbitstate (class in mcaddon.state)": [[1, "mcaddon.state.OutputLitBitState"]], "outputsubtractbitstate (class in mcaddon.state)": [[1, "mcaddon.state.OutputSubtractBitState"]], "oxidationlevel (class in mcaddon.constant)": [[1, "mcaddon.constant.OxidationLevel"]], "pool_entry_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.POOL_ENTRY_TYPE"]], "pack (class in mcaddon.pack)": [[1, "mcaddon.pack.Pack"]], "persistentbitstate (class in mcaddon.state)": [[1, "mcaddon.state.PersistentBitState"]], "placementdirectiontrait (class in mcaddon.block)": [[1, "mcaddon.block.PlacementDirectionTrait"]], "placementfiltercomponent (class in mcaddon.block)": [[1, "mcaddon.block.PlacementFilterComponent"]], "placementpositiontrait (class in mcaddon.block)": [[1, "mcaddon.block.PlacementPositionTrait"]], "playeffect (class in mcaddon.event)": [[1, "mcaddon.event.PlayEffect"]], "playsound (class in mcaddon.event)": [[1, "mcaddon.event.PlaySound"]], "pngfile (class in mcaddon.file)": [[1, "mcaddon.file.PngFile"]], "portalaxisstate (class in mcaddon.state)": [[1, "mcaddon.state.PortalAxisState"]], "portfoliocomponent (class in mcaddon.item)": [[1, "mcaddon.item.PortfolioComponent"]], "poweredbitstate (class in mcaddon.state)": [[1, "mcaddon.state.PoweredBitState"]], "projectilecomponent (class in mcaddon.item)": [[1, "mcaddon.item.ProjectileComponent"]], "queuedtickingcomponent (class in mcaddon.block)": [[1, "mcaddon.block.QueuedTickingComponent"]], "recipe_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.RECIPE_TYPE"]], "raildatabitstate (class in mcaddon.state)": [[1, "mcaddon.state.RailDataBitState"]], "raildirectionstate (class in mcaddon.state)": [[1, "mcaddon.state.RailDirectionState"]], "randomauxvaluelootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.RandomAuxValueLootFunction"]], "randomblockstatelootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.RandomBlockPropertyLootFunction"]], "randomchancelootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.RandomChanceLootCondition"]], "randomchancewithlootinglootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.RandomChanceWithLootingLootCondition"]], "randomdifficultychancelootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.RandomDifficultyChanceLootCondition"]], "randomdyelootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.RandomDyeLootFunction"]], "randomregionaldifficultychancelootcondition (class in mcaddon.loot)": [[1, "mcaddon.loot.RandomRegionalDifficultyChanceLootCondition"]], "randomtickingcomponent (class in mcaddon.block)": [[1, "mcaddon.block.RandomTickingComponent"]], "randomize (class in mcaddon.event)": [[1, "mcaddon.event.Randomize"]], "recipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.Recipe"]], "recipetag (class in mcaddon.constant)": [[1, "mcaddon.constant.RecipeTag"]], "recipetypenotfounderror": [[1, "mcaddon.exception.RecipeTypeNotFoundError"]], "recordcomponent (class in mcaddon.item)": [[1, "mcaddon.item.RecordComponent"]], "redstonesignalstate (class in mcaddon.state)": [[1, "mcaddon.state.RedstoneSignalState"]], "registries (class in mcaddon.registry)": [[1, "mcaddon.registry.Registries"]], "registry (class in mcaddon.registry)": [[1, "mcaddon.registry.Registry"]], "registryerror": [[1, "mcaddon.exception.RegistryError"]], "registrykey (class in mcaddon.registry)": [[1, "mcaddon.registry.RegistryKey"]], "removemobeffect (class in mcaddon.event)": [[1, "mcaddon.event.RemoveMobEffect"]], "rendermethod (class in mcaddon.constant)": [[1, "mcaddon.constant.RenderMethod"]], "repairitem (class in mcaddon.item)": [[1, "mcaddon.item.RepairItem"]], "repairablecomponent (class in mcaddon.item)": [[1, "mcaddon.item.RepairableComponent"]], "repeaterdelaystate (class in mcaddon.state)": [[1, "mcaddon.state.RepeaterDelayState"]], "resourcepack (class in mcaddon.pack)": [[1, "mcaddon.pack.ResourcePack"]], "runcommand (class in mcaddon.event)": [[1, "mcaddon.event.RunCommand"]], "seperator (mcaddon.util.identifier attribute)": [[1, "mcaddon.util.Identifier.SEPERATOR"]], "sandstonetypestate (class in mcaddon.state)": [[1, "mcaddon.state.SandStoneTypeState"]], "sandtypestate (class in mcaddon.state)": [[1, "mcaddon.state.SandTypeState"]], "saplingtypestate (class in mcaddon.state)": [[1, "mcaddon.state.SaplingTypeState"]], "schema (class in mcaddon.file)": [[1, "mcaddon.file.Schema"]], "schemanotfounderror": [[1, "mcaddon.exception.SchemaNotFoundError"]], "sculksensorphasestate (class in mcaddon.state)": [[1, "mcaddon.state.SculkSensorPhaseState"]], "seagrasstypestate (class in mcaddon.state)": [[1, "mcaddon.state.SeaGrassTypeState"]], "seedcomponent (class in mcaddon.item)": [[1, "mcaddon.item.SeedComponent"]], "selectionboxcomponent (class in mcaddon.block)": [[1, "mcaddon.block.SelectionBoxComponent"]], "sequence (class in mcaddon.event)": [[1, "mcaddon.event.Sequence"]], "setactoridlootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetActorIdLootFunction"]], "setbannerdetailslootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetBannerDetailsLootFunction"]], "setblock (class in mcaddon.event)": [[1, "mcaddon.event.SetBlock"]], "setblockatpos (class in mcaddon.event)": [[1, "mcaddon.event.SetBlockAtPos"]], "setblockstate (class in mcaddon.event)": [[1, "mcaddon.event.SetBlockProperty"]], "setbookcontentslootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetBookContentsLootFunction"]], "setcountlootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetCountLootFunction"]], "setdamagelootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetDamageLootFunction"]], "setdatafromcolorindexlootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetDataFromColorIndexLootFunction"]], "setdatalootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetDataLootFunction"]], "setlorelootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetLoreLootFunction"]], "setnamelootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SetNameLootFunction"]], "shapedrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.ShapedRecipe"]], "shapedrecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.ShapedRecipeLoader"]], "shapelessrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.ShapelessRecipe"]], "shapelessrecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.ShapelessRecipeLoader"]], "shootercomponent (class in mcaddon.item)": [[1, "mcaddon.item.ShooterComponent"]], "shoulddespawncomponent (class in mcaddon.item)": [[1, "mcaddon.item.ShouldDespawnComponent"]], "simpleblockcomponent (class in mcaddon.block)": [[1, "mcaddon.block.SimpleBlockComponent"]], "simpleitemcomponent (class in mcaddon.item)": [[1, "mcaddon.item.SimpleItemComponent"]], "smithingtransformrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.SmithingTransformRecipe"]], "smithingtransformrecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.SmithingTransformRecipeLoader"]], "smithingtrimrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.SmithingTrimRecipe"]], "smithingtrimrecipeloader (class in mcaddon.recipe)": [[1, "mcaddon.recipe.SmithingTrimRecipeLoader"]], "spawnloot (class in mcaddon.event)": [[1, "mcaddon.event.SpawnLoot"]], "specificenchantslootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.SpecificEnchantsLootFunction"]], "spongetypestate (class in mcaddon.state)": [[1, "mcaddon.state.SpongeTypeState"]], "stabilitycheckstate (class in mcaddon.state)": [[1, "mcaddon.state.StabilityCheckState"]], "stabilitystate (class in mcaddon.state)": [[1, "mcaddon.state.StabilityState"]], "stackedbydatacomponent (class in mcaddon.item)": [[1, "mcaddon.item.StackedByDataComponent"]], "stonebricktypestate (class in mcaddon.state)": [[1, "mcaddon.state.StoneBrickTypeState"]], "stoneslabtype2state (class in mcaddon.state)": [[1, "mcaddon.state.StoneSlabType2State"]], "stoneslabtype3state (class in mcaddon.state)": [[1, "mcaddon.state.StoneSlabType3State"]], "stoneslabtype4state (class in mcaddon.state)": [[1, "mcaddon.state.StoneSlabType4State"]], "stoneslabtypestate (class in mcaddon.state)": [[1, "mcaddon.state.StoneSlabTypeState"]], "stonetypestate (class in mcaddon.state)": [[1, "mcaddon.state.StoneTypeState"]], "stonecuttingrecipe (class in mcaddon.recipe)": [[1, "mcaddon.recipe.StonecuttingRecipe"]], "strippedbitstate (class in mcaddon.state)": [[1, "mcaddon.state.StrippedBitState"]], "structureblocktypestate (class in mcaddon.state)": [[1, "mcaddon.state.StructureBlockTypeState"]], "structurevoidtypestate (class in mcaddon.state)": [[1, "mcaddon.state.StructureVoidTypeState"]], "suspendedbitstate (class in mcaddon.state)": [[1, "mcaddon.state.SuspendedBitState"]], "swing (class in mcaddon.event)": [[1, "mcaddon.event.Swing"]], "switchblockstate (class in mcaddon.event)": [[1, "mcaddon.event.SwitchBlockProperty"]], "syntaxerror": [[1, "mcaddon.exception.SyntaxError"]], "tagscomponent (class in mcaddon.item)": [[1, "mcaddon.item.TagsComponent"]], "tallgrasstypestate (class in mcaddon.state)": [[1, "mcaddon.state.TallGrassTypeState"]], "teleport (class in mcaddon.event)": [[1, "mcaddon.event.Teleport"]], "terrainatlas (class in mcaddon.resrouce)": [[1, "mcaddon.resrouce.TerrainAtlas"]], "terraintexture (class in mcaddon.resrouce)": [[1, "mcaddon.resrouce.TerrainTexture"]], "text (class in mcaddon.text)": [[1, "mcaddon.text.Text"]], "texture (class in mcaddon.resrouce)": [[1, "mcaddon.resrouce.Texture"]], "texturetype (class in mcaddon.constant)": [[1, "mcaddon.constant.TextureType"]], "throwablecomponent (class in mcaddon.item)": [[1, "mcaddon.item.ThrowableComponent"]], "togglebitstate (class in mcaddon.state)": [[1, "mcaddon.state.ToggleBitState"]], "topslotbitstate (class in mcaddon.state)": [[1, "mcaddon.state.TopSlotBitState"]], "torchfacingdirectionstate (class in mcaddon.state)": [[1, "mcaddon.state.TorchFacingDirectionState"]], "tradermaterialtypelootfunction (class in mcaddon.loot)": [[1, "mcaddon.loot.TraderMaterialTypeLootFunction"]], "transformationcomponent (class in mcaddon.block)": [[1, "mcaddon.block.TransformationComponent"]], "transformiiem (class in mcaddon.event)": [[1, "mcaddon.event.TransformiIem"]], "triggedbitstate (class in mcaddon.state)": [[1, "mcaddon.state.TriggedBitState"]], "trigger (class in mcaddon.event)": [[1, "mcaddon.event.Trigger"]], "turtleeggcountstate (class in mcaddon.state)": [[1, "mcaddon.state.TurtleEggCountState"]], "typenotfounderror": [[1, "mcaddon.exception.TypeNotFoundError"]], "unitcubecomponent (class in mcaddon.block)": [[1, "mcaddon.block.UnitCubeComponent"]], "updatebitstate (class in mcaddon.state)": [[1, "mcaddon.state.UpdateBitState"]], "upperblockbitstate (class in mcaddon.state)": [[1, "mcaddon.state.UpperBlockBitState"]], "upsidedownbitstate (class in mcaddon.state)": [[1, "mcaddon.state.UpsideDownBitState"]], "useanimation (class in mcaddon.constant)": [[1, "mcaddon.constant.UseAnimation"]], "useanimationcomponent (class in mcaddon.item)": [[1, "mcaddon.item.UseAnimationComponent"]], "usedurationcomponent (class in mcaddon.item)": [[1, "mcaddon.item.UseDurationComponent"]], "usemodifierscomponent (class in mcaddon.item)": [[1, "mcaddon.item.UseModifiersComponent"]], "volume_component_type (mcaddon.registry.registries attribute)": [[1, "mcaddon.registry.Registries.VOLUME_COMPONENT_TYPE"]], "version (class in mcaddon.util)": [[1, "mcaddon.util.Version"]], "verticalhalfstate (class in mcaddon.state)": [[1, "mcaddon.state.VerticalHalfState"]], "vinedirectionbitsstate (class in mcaddon.state)": [[1, "mcaddon.state.VineDirectionBitsState"]], "volume (class in mcaddon.volume)": [[1, "mcaddon.volume.Volume"]], "volumecomponent (class in mcaddon.volume)": [[1, "mcaddon.volume.VolumeComponent"]], "volumeloader (class in mcaddon.volume)": [[1, "mcaddon.volume.VolumeLoader"]], "wallblocktypestate (class in mcaddon.state)": [[1, "mcaddon.state.WallBlockTypeState"]], "wallconnectiontypeaststate (class in mcaddon.state)": [[1, "mcaddon.state.WallConnectionTypEastState"]], "wallconnectiontypenorthstate (class in mcaddon.state)": [[1, "mcaddon.state.WallConnectionTypeNorthState"]], "wallconnectiontypesouthstate (class in mcaddon.state)": [[1, "mcaddon.state.WallConnectionTypeSouthState"]], "wallconnectiontypeweststate (class in mcaddon.state)": [[1, "mcaddon.state.WallConnectionTypeWestState"]], "wallpostbitstate (class in mcaddon.state)": [[1, "mcaddon.state.WallPostBitState"]], "wearablecomponent (class in mcaddon.item)": [[1, "mcaddon.item.WearableComponent"]], "weirdodirectionstate (class in mcaddon.state)": [[1, "mcaddon.state.WeirdoDirectionState"]], "woodtypestate (class in mcaddon.state)": [[1, "mcaddon.state.WoodTypeState"]], "actor_id (mcaddon.loot.setactoridlootfunction property)": [[1, "mcaddon.loot.SetActorIdLootFunction.actor_id"]], "add() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add"]], "add() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.add"]], "add() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.add"]], "add_ammunition() (mcaddon.item.shootercomponent method)": [[1, "mcaddon.item.ShooterComponent.add_ammunition"]], "add_author() (mcaddon.manifest.metadata method)": [[1, "mcaddon.manifest.Metadata.add_author"]], "add_block() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_block"]], "add_block() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.add_block"]], "add_block() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.add_block"]], "add_bone() (mcaddon.block.bonevisabilitycomponent method)": [[1, "mcaddon.block.BoneVisabilityComponent.add_bone"]], "add_component() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.add_component"]], "add_component() (mcaddon.block.blockpermutation method)": [[1, "mcaddon.block.BlockPermutation.add_component"]], "add_component() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.add_component"]], "add_component() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.add_component"]], "add_condition() (mcaddon.block.placementfiltercomponent method)": [[1, "mcaddon.block.PlacementFilterComponent.add_condition"]], "add_condition() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.add_condition"]], "add_condition() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.add_condition"]], "add_crafting_tag() (mcaddon.block.craftingtablecomponent method)": [[1, "mcaddon.block.CraftingTableComponent.add_crafting_tag"]], "add_dependency() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.add_dependency"]], "add_entry() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.add_entry"]], "add_event() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.add_event"]], "add_event() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.add_event"]], "add_event() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.add_event"]], "add_event() (mcaddon.volume.onactorentercomponent method)": [[1, "mcaddon.volume.OnActorEnterComponent.add_event"]], "add_event() (mcaddon.volume.onactorleavecomponent method)": [[1, "mcaddon.volume.OnActorLeaveComponent.add_event"]], "add_event() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.add_event"]], "add_face() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.add_face"]], "add_file() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.add_file"]], "add_filter() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.add_filter"]], "add_function() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.add_function"]], "add_function() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.add_function"]], "add_function() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.add_function"]], "add_ingredient() (mcaddon.recipe.shapelessrecipe method)": [[1, "mcaddon.recipe.ShapelessRecipe.add_ingredient"]], "add_item() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_item"]], "add_item() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.add_item"]], "add_item() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.add_item"]], "add_item_texture() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_item_texture"]], "add_item_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.add_item_texture"]], "add_key() (mcaddon.recipe.shapedrecipe method)": [[1, "mcaddon.recipe.ShapedRecipe.add_key"]], "add_loot_table() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_loot_table"]], "add_material() (mcaddon.block.materialinstancescomponent method)": [[1, "mcaddon.block.MaterialInstancesComponent.add_material"]], "add_module() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.add_module"]], "add_pack() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_pack"]], "add_permutation() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.add_permutation"]], "add_pool() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.add_pool"]], "add_recipe() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_recipe"]], "add_recipe() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.add_recipe"]], "add_schema() (mcaddon.file.loader method)": [[1, "mcaddon.file.Loader.add_schema"]], "add_state() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.add_state"]], "add_tag() (mcaddon.block.blocktagscomponent method)": [[1, "mcaddon.block.BlockTagsComponent.add_tag"]], "add_tag() (mcaddon.recipe.recipe method)": [[1, "mcaddon.recipe.Recipe.add_tag"]], "add_terrain_texture() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_terrain_texture"]], "add_terrain_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.add_terrain_texture"]], "add_trait() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.add_trait"]], "add_volume() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.add_volume"]], "add_volume() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.add_volume"]], "addition (mcaddon.recipe.smithingtransformrecipe property)": [[1, "mcaddon.recipe.SmithingTransformRecipe.addition"]], "addition (mcaddon.recipe.smithingtrimrecipe property)": [[1, "mcaddon.recipe.SmithingTrimRecipe.addition"]], "advancement_entity (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.advancement_entity"]], "advancement_location (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.advancement_location"]], "advancement_reward (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.advancement_reward"]], "all (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.all"]], "all() (mcaddon.block.placementdirectiontrait class method)": [[1, "mcaddon.block.PlacementDirectionTrait.all"]], "all() (mcaddon.block.placementpositiontrait class method)": [[1, "mcaddon.block.PlacementPositionTrait.all"]], "allow_random_seed (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.allow_random_seed"]], "allowed_faces (mcaddon.block.filter property)": [[1, "mcaddon.block.Filter.allowed_faces"]], "alpha_test (mcaddon.constant.rendermethod attribute)": [[1, "mcaddon.constant.RenderMethod.alpha_test"]], "ambient_occlusion (mcaddon.block.material property)": [[1, "mcaddon.block.Material.ambient_occlusion"]], "ammunition (mcaddon.item.shootercomponent property)": [[1, "mcaddon.item.ShooterComponent.ammunition"]], "amount (mcaddon.event.damage property)": [[1, "mcaddon.event.Damage.amount"]], "amplifier (mcaddon.event.addmobeffect property)": [[1, "mcaddon.event.AddMobEffect.amplifier"]], "archaeology (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.archaeology"]], "atlas_index (mcaddon.resrouce.flipbooktexture property)": [[1, "mcaddon.resrouce.FlipbookTexture.atlas_index"]], "atlas_tile (mcaddon.resrouce.flipbooktexture property)": [[1, "mcaddon.resrouce.FlipbookTexture.atlas_tile"]], "atlas_tile_variant (mcaddon.resrouce.flipbooktexture property)": [[1, "mcaddon.resrouce.FlipbookTexture.atlas_tile_variant"]], "author (mcaddon.loot.setbookcontentslootfunction property)": [[1, "mcaddon.loot.SetBookContentsLootFunction.author"]], "authors (mcaddon.manifest.metadata property)": [[1, "mcaddon.manifest.Metadata.authors"]], "avoid_water (mcaddon.event.teleport property)": [[1, "mcaddon.event.Teleport.avoid_water"]], "baby (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.baby"]], "barter (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.barter"]], "base (mcaddon.recipe.smithingtransformrecipe property)": [[1, "mcaddon.recipe.SmithingTransformRecipe.base"]], "base (mcaddon.recipe.smithingtrimrecipe property)": [[1, "mcaddon.recipe.SmithingTrimRecipe.base"]], "base_cost (mcaddon.loot.enchantbookfortradinglootfunction property)": [[1, "mcaddon.loot.EnchantBookForTradingLootFunction.base_cost"]], "base_game_version (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.base_game_version"]], "base_random_cost (mcaddon.loot.enchantbookfortradinglootfunction property)": [[1, "mcaddon.loot.EnchantBookForTradingLootFunction.base_random_cost"]], "bedrock (mcaddon.constant.edition attribute)": [[1, "mcaddon.constant.Edition.bedrock"]], "behavior() (mcaddon.manifest.manifest class method)": [[1, "mcaddon.manifest.Manifest.behavior"]], "black (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.black"]], "black_bars_duration (mcaddon.item.cameracomponent property)": [[1, "mcaddon.item.CameraComponent.black_bars_duration"]], "black_bars_screen_ratio (mcaddon.item.cameracomponent property)": [[1, "mcaddon.item.CameraComponent.black_bars_screen_ratio"]], "blend (mcaddon.constant.rendermethod attribute)": [[1, "mcaddon.constant.RenderMethod.blend"]], "blend_frames (mcaddon.resrouce.flipbooktexture property)": [[1, "mcaddon.resrouce.FlipbookTexture.blend_frames"]], "block (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.block"]], "block (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.block"]], "block (mcaddon.item.blockplacercomponent property)": [[1, "mcaddon.item.BlockPlacerComponent.block"]], "block() (mcaddon.loot.loottable class method)": [[1, "mcaddon.loot.LootTable.block"]], "block_component_type() (in module mcaddon.block)": [[1, "mcaddon.block.block_component_type"]], "block_face() (mcaddon.block.placementpositiontrait class method)": [[1, "mcaddon.block.PlacementPositionTrait.block_face"]], "block_filter (mcaddon.block.filter property)": [[1, "mcaddon.block.Filter.block_filter"]], "block_offset (mcaddon.event.setblockatpos property)": [[1, "mcaddon.event.SetBlockAtPos.block_offset"]], "block_state (mcaddon.loot.randomblockstatelootfunction property)": [[1, "mcaddon.loot.RandomBlockPropertyLootFunction.block_state"]], "block_trait() (in module mcaddon.block)": [[1, "mcaddon.block.block_trait"]], "block_type (mcaddon.event.setblock property)": [[1, "mcaddon.event.SetBlock.block_type"]], "block_type (mcaddon.event.setblockatpos property)": [[1, "mcaddon.event.SetBlockAtPos.block_type"]], "block_type() (in module mcaddon.block)": [[1, "mcaddon.block.block_type"]], "blocks (mcaddon.pack.resourcepack property)": [[1, "mcaddon.pack.ResourcePack.blocks"]], "blue (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.blue"]], "bone_visibility (mcaddon.block.geometrycomponent property)": [[1, "mcaddon.block.GeometryComponent.bone_visibility"]], "bones (mcaddon.block.bonevisabilitycomponent property)": [[1, "mcaddon.block.BoneVisabilityComponent.bones"]], "bonus_chance (mcaddon.loot.loottiers property)": [[1, "mcaddon.loot.LootTiers.bonus_chance"]], "bonus_rolls (mcaddon.loot.lootpool property)": [[1, "mcaddon.loot.LootPool.bonus_rolls"]], "bonus_rolls (mcaddon.loot.loottiers property)": [[1, "mcaddon.loot.LootTiers.bonus_rolls"]], "breakinstantly() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.breakInstantly"]], "brewing_stand (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.brewing_stand"]], "brown (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.brown"]], "buriedtreasure (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.buriedtreasure"]], "burnable (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.burnable"]], "camera (mcaddon.constant.useanimation attribute)": [[1, "mcaddon.constant.UseAnimation.camera"]], "campfire (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.campfire"]], "can_always_eat (mcaddon.item.foodcomponent property)": [[1, "mcaddon.item.FoodComponent.can_always_eat"]], "capacity (mcaddon.item.itemstoragecomponent property)": [[1, "mcaddon.item.ItemStorageComponent.capacity"]], "cardinal() (mcaddon.block.placementdirectiontrait class method)": [[1, "mcaddon.block.PlacementDirectionTrait.cardinal"]], "catch_chance_modifier (mcaddon.block.flammablecomponent property)": [[1, "mcaddon.block.FlammableComponent.catch_chance_modifier"]], "category (mcaddon.item.cooldowncomponent property)": [[1, "mcaddon.item.CooldownComponent.category"]], "category (mcaddon.util.menucategory property)": [[1, "mcaddon.util.MenuCategory.category"]], "chance (mcaddon.loot.enchantrandomgearlootfunction property)": [[1, "mcaddon.loot.EnchantRandomGearLootFunction.chance"]], "chance (mcaddon.loot.randomchancelootcondition property)": [[1, "mcaddon.loot.RandomChanceLootCondition.chance"]], "chance (mcaddon.loot.randomchancewithlootinglootcondition property)": [[1, "mcaddon.loot.RandomChanceWithLootingLootCondition.chance"]], "charge_on_draw (mcaddon.item.shootercomponent property)": [[1, "mcaddon.item.ShooterComponent.charge_on_draw"]], "chest (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.chest"]], "clazz (mcaddon.block.blockdisplaynamecomponent attribute)": [[1, "mcaddon.block.BlockDisplayNameComponent.clazz"]], "clazz (mcaddon.block.breathabilitycomponent attribute)": [[1, "mcaddon.block.BreathabilityComponent.clazz"]], "clazz (mcaddon.block.frictioncomponent attribute)": [[1, "mcaddon.block.FrictionComponent.clazz"]], "clazz (mcaddon.block.lightdampeningcomponent attribute)": [[1, "mcaddon.block.LightDampeningComponent.clazz"]], "clazz (mcaddon.block.lightemissioncomponent attribute)": [[1, "mcaddon.block.LightEmissionComponent.clazz"]], "clazz (mcaddon.block.lootcomponent attribute)": [[1, "mcaddon.block.LootComponent.clazz"]], "clazz (mcaddon.block.mapcolorcomponent attribute)": [[1, "mcaddon.block.MapColorComponent.clazz"]], "clazz (mcaddon.item.allowoffhandcomponent attribute)": [[1, "mcaddon.item.AllowOffHandComponent.clazz"]], "clazz (mcaddon.item.blockcomponent2 attribute)": [[1, "mcaddon.item.BlockComponent2.clazz"]], "clazz (mcaddon.item.candestroyincreativecomponent attribute)": [[1, "mcaddon.item.CanDestroyInCreativeComponent.clazz"]], "clazz (mcaddon.item.damagecomponent attribute)": [[1, "mcaddon.item.DamageComponent.clazz"]], "clazz (mcaddon.item.foilcomponent attribute)": [[1, "mcaddon.item.FoilComponent.clazz"]], "clazz (mcaddon.item.glintcomponent attribute)": [[1, "mcaddon.item.GlintComponent.clazz"]], "clazz (mcaddon.item.handequippedcomponent attribute)": [[1, "mcaddon.item.HandEquippedComponent.clazz"]], "clazz (mcaddon.item.hovertextcolorcomponent attribute)": [[1, "mcaddon.item.HoverTextColorComponent.clazz"]], "clazz (mcaddon.item.ignorespermissioncomponent attribute)": [[1, "mcaddon.item.IgnoresPermissionComponent.clazz"]], "clazz (mcaddon.item.interactbuttoncomponent attribute)": [[1, "mcaddon.item.InteractButtonComponent.clazz"]], "clazz (mcaddon.item.liquidclippedcomponent attribute)": [[1, "mcaddon.item.LiquidClippedComponent.clazz"]], "clazz (mcaddon.item.maxdamagecomponent attribute)": [[1, "mcaddon.item.MaxDamageComponent.clazz"]], "clazz (mcaddon.item.maxstacksizecomponent attribute)": [[1, "mcaddon.item.MaxStackSizeComponent.clazz"]], "clazz (mcaddon.item.shoulddespawncomponent attribute)": [[1, "mcaddon.item.ShouldDespawnComponent.clazz"]], "clazz (mcaddon.item.stackedbydatacomponent attribute)": [[1, "mcaddon.item.StackedByDataComponent.clazz"]], "clazz (mcaddon.item.useanimationcomponent attribute)": [[1, "mcaddon.item.UseAnimationComponent.clazz"]], "clazz (mcaddon.item.usedurationcomponent attribute)": [[1, "mcaddon.item.UseDurationComponent.clazz"]], "clear_ammunitions() (mcaddon.item.shootercomponent method)": [[1, "mcaddon.item.ShooterComponent.clear_ammunitions"]], "clear_authors() (mcaddon.manifest.metadata method)": [[1, "mcaddon.manifest.Metadata.clear_authors"]], "clear_block() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.clear_block"]], "clear_blocks() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.clear_blocks"]], "clear_bones() (mcaddon.block.bonevisabilitycomponent method)": [[1, "mcaddon.block.BoneVisabilityComponent.clear_bones"]], "clear_components() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.clear_components"]], "clear_components() (mcaddon.block.blockpermutation method)": [[1, "mcaddon.block.BlockPermutation.clear_components"]], "clear_components() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.clear_components"]], "clear_components() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.clear_components"]], "clear_conditions() (mcaddon.block.placementfiltercomponent method)": [[1, "mcaddon.block.PlacementFilterComponent.clear_conditions"]], "clear_conditions() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.clear_conditions"]], "clear_conditions() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.clear_conditions"]], "clear_crafting_tags() (mcaddon.block.craftingtablecomponent method)": [[1, "mcaddon.block.CraftingTableComponent.clear_crafting_tags"]], "clear_dependencies() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.clear_dependencies"]], "clear_entries() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.clear_entries"]], "clear_events() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.clear_events"]], "clear_events() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.clear_events"]], "clear_events() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.clear_events"]], "clear_events() (mcaddon.volume.onactorentercomponent method)": [[1, "mcaddon.volume.OnActorEnterComponent.clear_events"]], "clear_events() (mcaddon.volume.onactorleavecomponent method)": [[1, "mcaddon.volume.OnActorLeaveComponent.clear_events"]], "clear_events() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.clear_events"]], "clear_faces() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.clear_faces"]], "clear_files() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.clear_files"]], "clear_filters() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.clear_filters"]], "clear_functions() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.clear_functions"]], "clear_functions() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.clear_functions"]], "clear_functions() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.clear_functions"]], "clear_ingredients() (mcaddon.recipe.shapelessrecipe method)": [[1, "mcaddon.recipe.ShapelessRecipe.clear_ingredients"]], "clear_item() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.clear_item"]], "clear_item_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.clear_item_texture"]], "clear_items() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.clear_items"]], "clear_keys() (mcaddon.recipe.shapedrecipe method)": [[1, "mcaddon.recipe.ShapedRecipe.clear_keys"]], "clear_modules() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.clear_modules"]], "clear_packs() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.clear_packs"]], "clear_permutation() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.clear_permutation"]], "clear_pools() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.clear_pools"]], "clear_recipes() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.clear_recipes"]], "clear_schemas() (mcaddon.file.loader method)": [[1, "mcaddon.file.Loader.clear_schemas"]], "clear_state() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.clear_state"]], "clear_tags() (mcaddon.block.blocktagscomponent method)": [[1, "mcaddon.block.BlockTagsComponent.clear_tags"]], "clear_tags() (mcaddon.recipe.recipe method)": [[1, "mcaddon.recipe.Recipe.clear_tags"]], "clear_terrain_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.clear_terrain_texture"]], "clear_trait() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.clear_trait"]], "clear_volumes() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.clear_volumes"]], "client_data (mcaddon.constant.moduletype attribute)": [[1, "mcaddon.constant.ModuleType.client_data"]], "client_data() (mcaddon.manifest.module class method)": [[1, "mcaddon.manifest.Module.client_data"]], "collidable (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.collidable"]], "color (mcaddon.item.itemsettings attribute)": [[1, "mcaddon.item.ItemSettings.color"]], "color() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.color"]], "command (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.command"]], "command (mcaddon.event.runcommand property)": [[1, "mcaddon.event.RunCommand.command"]], "commands (mcaddon.constant.category attribute)": [[1, "mcaddon.constant.Category.commands"]], "comparator_signal (mcaddon.item.recordcomponent property)": [[1, "mcaddon.item.RecordComponent.comparator_signal"]], "components (mcaddon.block.block property)": [[1, "mcaddon.block.Block.components"]], "components (mcaddon.block.blockpermutation property)": [[1, "mcaddon.block.BlockPermutation.components"]], "components (mcaddon.item.item property)": [[1, "mcaddon.item.Item.components"]], "components (mcaddon.volume.volume property)": [[1, "mcaddon.volume.Volume.components"]], "condition (mcaddon.block.blockpermutation property)": [[1, "mcaddon.block.BlockPermutation.condition"]], "condition (mcaddon.event.trigger property)": [[1, "mcaddon.event.Trigger.condition"]], "conditions (mcaddon.block.placementfiltercomponent property)": [[1, "mcaddon.block.PlacementFilterComponent.conditions"]], "conditions (mcaddon.loot.lootpool property)": [[1, "mcaddon.loot.LootPool.conditions"]], "conditions (mcaddon.loot.lootpoolentry property)": [[1, "mcaddon.loot.LootPoolEntry.conditions"]], "construction (mcaddon.constant.category attribute)": [[1, "mcaddon.constant.Category.construction"]], "copy() (mcaddon.util.identifier method)": [[1, "mcaddon.util.Identifier.copy"]], "copy_with_namespace() (mcaddon.util.identifier method)": [[1, "mcaddon.util.Identifier.copy_with_namespace"]], "copy_with_path() (mcaddon.util.identifier method)": [[1, "mcaddon.util.Identifier.copy_with_path"]], "count (mcaddon.item.itemstack property)": [[1, "mcaddon.item.ItemStack.count"]], "count (mcaddon.loot.lootingenchantlootfunction property)": [[1, "mcaddon.loot.LootingEnchantLootFunction.count"]], "count (mcaddon.loot.matchtoollootcondition property)": [[1, "mcaddon.loot.MatchToolLootCondition.count"]], "count (mcaddon.loot.setcountlootfunction property)": [[1, "mcaddon.loot.SetCountLootFunction.count"]], "crafting_table (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.crafting_table"]], "crafting_tags (mcaddon.block.craftingtablecomponent property)": [[1, "mcaddon.block.CraftingTableComponent.crafting_tags"]], "create_registry() (mcaddon.registry.registry method)": [[1, "mcaddon.registry.Registry.create_registry"]], "crop_result (mcaddon.item.seedcomponent property)": [[1, "mcaddon.item.SeedComponent.crop_result"]], "cube() (mcaddon.util.box class method)": [[1, "mcaddon.util.Box.cube"]], "cyan (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.cyan"]], "damage (mcaddon.loot.setdamagelootfunction property)": [[1, "mcaddon.loot.SetDamageLootFunction.damage"]], "damage_chance (mcaddon.item.durabilitycomponent property)": [[1, "mcaddon.item.DurabilityComponent.damage_chance"]], "damager (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.damager"]], "data (mcaddon.constant.moduletype attribute)": [[1, "mcaddon.constant.ModuleType.data"]], "data (mcaddon.event.playeffect property)": [[1, "mcaddon.event.PlayEffect.data"]], "data (mcaddon.item.itemstack property)": [[1, "mcaddon.item.ItemStack.data"]], "data (mcaddon.loot.setdatalootfunction property)": [[1, "mcaddon.loot.SetDataLootFunction.data"]], "data() (mcaddon.manifest.module class method)": [[1, "mcaddon.manifest.Module.data"]], "default_chance (mcaddon.loot.randomdifficultychancelootcondition property)": [[1, "mcaddon.loot.RandomDifficultyChanceLootCondition.default_chance"]], "dependencies (mcaddon.manifest.manifest property)": [[1, "mcaddon.manifest.Manifest.dependencies"]], "description (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.description"]], "description (mcaddon.manifest.manifest property)": [[1, "mcaddon.manifest.Manifest.description"]], "description (mcaddon.manifest.module property)": [[1, "mcaddon.manifest.Module.description"]], "description (mcaddon.pack.pack property)": [[1, "mcaddon.pack.Pack.description"]], "description_key (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.description_key"]], "destination (mcaddon.event.teleport property)": [[1, "mcaddon.event.Teleport.destination"]], "destination (mcaddon.loot.explorationmaplootfunction property)": [[1, "mcaddon.loot.ExplorationMapLootFunction.destination"]], "destroy_chance_modifier (mcaddon.block.flammablecomponent property)": [[1, "mcaddon.block.FlammableComponent.destroy_chance_modifier"]], "destroy_speeds (mcaddon.item.diggercomponent property)": [[1, "mcaddon.item.DiggerComponent.destroy_speeds"]], "dirname (mcaddon.file.file property)": [[1, "mcaddon.file.File.dirname"]], "dirname (mcaddon.loot.loottable attribute)": [[1, "mcaddon.loot.LootTable.dirname"]], "dirname (mcaddon.resrouce.itemtexture attribute)": [[1, "mcaddon.resrouce.ItemTexture.dirname"]], "dirname (mcaddon.resrouce.terraintexture attribute)": [[1, "mcaddon.resrouce.TerrainTexture.dirname"]], "dispense_on (mcaddon.item.entityplacercomponent property)": [[1, "mcaddon.item.EntityPlacerComponent.dispense_on"]], "do_swing_animation (mcaddon.item.throwablecomponent property)": [[1, "mcaddon.item.ThrowableComponent.do_swing_animation"]], "double_sided (mcaddon.constant.rendermethod attribute)": [[1, "mcaddon.constant.RenderMethod.double_sided"]], "down (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.down"]], "drink (mcaddon.constant.useanimation attribute)": [[1, "mcaddon.constant.UseAnimation.drink"]], "dropslike() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.dropsLike"]], "dropsnothing() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.dropsNothing"]], "durability (mcaddon.loot.matchtoollootcondition property)": [[1, "mcaddon.loot.MatchToolLootCondition.durability"]], "duration (mcaddon.event.addmobeffect property)": [[1, "mcaddon.event.AddMobEffect.duration"]], "duration (mcaddon.item.cooldowncomponent property)": [[1, "mcaddon.item.CooldownComponent.duration"]], "duration (mcaddon.item.fuelcomponent property)": [[1, "mcaddon.item.FuelComponent.duration"]], "duration (mcaddon.item.recordcomponent property)": [[1, "mcaddon.item.RecordComponent.duration"]], "east (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.east"]], "eat (mcaddon.constant.useanimation attribute)": [[1, "mcaddon.constant.UseAnimation.eat"]], "education (mcaddon.constant.edition attribute)": [[1, "mcaddon.constant.Edition.education"]], "effect (mcaddon.event.addmobeffect property)": [[1, "mcaddon.event.AddMobEffect.effect"]], "effect (mcaddon.event.playeffect property)": [[1, "mcaddon.event.PlayEffect.effect"]], "effect (mcaddon.event.removemobeffect property)": [[1, "mcaddon.event.RemoveMobEffect.effect"]], "empty (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.empty"]], "empty() (mcaddon.block.lootcomponent class method)": [[1, "mcaddon.block.LootComponent.empty"]], "enabled_states (mcaddon.block.blocktrait property)": [[1, "mcaddon.block.BlockTrait.enabled_states"]], "enchantments (mcaddon.loot.matchtoollootcondition property)": [[1, "mcaddon.loot.MatchToolLootCondition.enchantments"]], "enchantments (mcaddon.loot.specificenchantslootfunction property)": [[1, "mcaddon.loot.SpecificEnchantsLootFunction.enchantments"]], "endcity (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.endcity"]], "entity (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.entity"]], "entity (mcaddon.item.entityplacercomponent property)": [[1, "mcaddon.item.EntityPlacerComponent.entity"]], "entity_type (mcaddon.loot.killedbyentitylootcondition property)": [[1, "mcaddon.loot.KilledByEntityLootCondition.entity_type"]], "entries (mcaddon.loot.lootpool property)": [[1, "mcaddon.loot.LootPool.entries"]], "equipment (mcaddon.constant.category attribute)": [[1, "mcaddon.constant.Category.equipment"]], "event (mcaddon.event.trigger property)": [[1, "mcaddon.event.Trigger.event"]], "event_exists() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.event_exists"]], "event_type() (in module mcaddon.event)": [[1, "mcaddon.event.event_type"]], "events (mcaddon.block.block property)": [[1, "mcaddon.block.Block.events"]], "events (mcaddon.event.sequence property)": [[1, "mcaddon.event.Sequence.events"]], "events (mcaddon.item.item property)": [[1, "mcaddon.item.Item.events"]], "events (mcaddon.volume.volume property)": [[1, "mcaddon.volume.Volume.events"]], "explosion_resistance (mcaddon.block.destructiblebyexplosioncomponent property)": [[1, "mcaddon.block.DestructibleByExplosionComponent.explosion_resistance"]], "exposed (mcaddon.constant.oxidationlevel attribute)": [[1, "mcaddon.constant.OxidationLevel.exposed"]], "extension (mcaddon.file.archivefile property)": [[1, "mcaddon.file.ArchiveFile.extension"]], "extension (mcaddon.file.file property)": [[1, "mcaddon.file.File.extension"]], "extension (mcaddon.loot.loottable attribute)": [[1, "mcaddon.loot.LootTable.extension"]], "face_dimming (mcaddon.block.material property)": [[1, "mcaddon.block.Material.face_dimming"]], "facing() (mcaddon.block.placementdirectiontrait class method)": [[1, "mcaddon.block.PlacementDirectionTrait.facing"]], "file_types (mcaddon.pack.pack property)": [[1, "mcaddon.pack.Pack.file_types"]], "filename (mcaddon.file.archivefile property)": [[1, "mcaddon.file.ArchiveFile.filename"]], "filename (mcaddon.file.file property)": [[1, "mcaddon.file.File.filename"]], "filename (mcaddon.loot.loottable attribute)": [[1, "mcaddon.loot.LootTable.filename"]], "fishing (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.fishing"]], "fog_identifier (mcaddon.volume.fogcomponent property)": [[1, "mcaddon.volume.FogComponent.fog_identifier"]], "fortress (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.fortress"]], "frames (mcaddon.resrouce.flipbooktexture property)": [[1, "mcaddon.resrouce.FlipbookTexture.frames"]], "from_dict() (mcaddon.block.block class method)": [[1, "mcaddon.block.Block.from_dict"]], "from_dict() (mcaddon.block.blockcomponent class method)": [[1, "mcaddon.block.BlockComponent.from_dict"]], "from_dict() (mcaddon.block.blockdescriptor class method)": [[1, "mcaddon.block.BlockDescriptor.from_dict"]], "from_dict() (mcaddon.block.blockpermutation class method)": [[1, "mcaddon.block.BlockPermutation.from_dict"]], "from_dict() (mcaddon.block.blocktagscomponent class method)": [[1, "mcaddon.block.BlockTagsComponent.from_dict"]], "from_dict() (mcaddon.block.blocktrait class method)": [[1, "mcaddon.block.BlockTrait.from_dict"]], "from_dict() (mcaddon.block.bonevisabilitycomponent class method)": [[1, "mcaddon.block.BoneVisabilityComponent.from_dict"]], "from_dict() (mcaddon.block.collisionboxcomponent class method)": [[1, "mcaddon.block.CollisionBoxComponent.from_dict"]], "from_dict() (mcaddon.block.craftingtablecomponent class method)": [[1, "mcaddon.block.CraftingTableComponent.from_dict"]], "from_dict() (mcaddon.block.destructiblebyexplosioncomponent class method)": [[1, "mcaddon.block.DestructibleByExplosionComponent.from_dict"]], "from_dict() (mcaddon.block.destructiblebyminingcomponent class method)": [[1, "mcaddon.block.DestructibleByMiningComponent.from_dict"]], "from_dict() (mcaddon.block.filter class method)": [[1, "mcaddon.block.Filter.from_dict"]], "from_dict() (mcaddon.block.flammablecomponent class method)": [[1, "mcaddon.block.FlammableComponent.from_dict"]], "from_dict() (mcaddon.block.frictioncomponent class method)": [[1, "mcaddon.block.FrictionComponent.from_dict"]], "from_dict() (mcaddon.block.geometrycomponent class method)": [[1, "mcaddon.block.GeometryComponent.from_dict"]], "from_dict() (mcaddon.block.material class method)": [[1, "mcaddon.block.Material.from_dict"]], "from_dict() (mcaddon.block.materialinstancescomponent class method)": [[1, "mcaddon.block.MaterialInstancesComponent.from_dict"]], "from_dict() (mcaddon.block.onfalloncomponent class method)": [[1, "mcaddon.block.OnFallOnComponent.from_dict"]], "from_dict() (mcaddon.block.placementdirectiontrait class method)": [[1, "mcaddon.block.PlacementDirectionTrait.from_dict"]], "from_dict() (mcaddon.block.placementfiltercomponent class method)": [[1, "mcaddon.block.PlacementFilterComponent.from_dict"]], "from_dict() (mcaddon.block.queuedtickingcomponent class method)": [[1, "mcaddon.block.QueuedTickingComponent.from_dict"]], "from_dict() (mcaddon.block.randomtickingcomponent class method)": [[1, "mcaddon.block.RandomTickingComponent.from_dict"]], "from_dict() (mcaddon.block.selectionboxcomponent class method)": [[1, "mcaddon.block.SelectionBoxComponent.from_dict"]], "from_dict() (mcaddon.block.simpleblockcomponent class method)": [[1, "mcaddon.block.SimpleBlockComponent.from_dict"]], "from_dict() (mcaddon.block.transformationcomponent class method)": [[1, "mcaddon.block.TransformationComponent.from_dict"]], "from_dict() (mcaddon.block.unitcubecomponent class method)": [[1, "mcaddon.block.UnitCubeComponent.from_dict"]], "from_dict() (mcaddon.camera.camerapreset class method)": [[1, "mcaddon.camera.CameraPreset.from_dict"]], "from_dict() (mcaddon.event.addmobeffect class method)": [[1, "mcaddon.event.AddMobEffect.from_dict"]], "from_dict() (mcaddon.event.damage class method)": [[1, "mcaddon.event.Damage.from_dict"]], "from_dict() (mcaddon.event.decrementstack class method)": [[1, "mcaddon.event.DecrementStack.from_dict"]], "from_dict() (mcaddon.event.die class method)": [[1, "mcaddon.event.Die.from_dict"]], "from_dict() (mcaddon.event.event class method)": [[1, "mcaddon.event.Event.from_dict"]], "from_dict() (mcaddon.event.playeffect class method)": [[1, "mcaddon.event.PlayEffect.from_dict"]], "from_dict() (mcaddon.event.playsound class method)": [[1, "mcaddon.event.PlaySound.from_dict"]], "from_dict() (mcaddon.event.removemobeffect class method)": [[1, "mcaddon.event.RemoveMobEffect.from_dict"]], "from_dict() (mcaddon.event.runcommand class method)": [[1, "mcaddon.event.RunCommand.from_dict"]], "from_dict() (mcaddon.event.sequence class method)": [[1, "mcaddon.event.Sequence.from_dict"]], "from_dict() (mcaddon.event.setblock class method)": [[1, "mcaddon.event.SetBlock.from_dict"]], "from_dict() (mcaddon.event.setblockatpos class method)": [[1, "mcaddon.event.SetBlockAtPos.from_dict"]], "from_dict() (mcaddon.event.setblockstate class method)": [[1, "mcaddon.event.SetBlockProperty.from_dict"]], "from_dict() (mcaddon.event.spawnloot class method)": [[1, "mcaddon.event.SpawnLoot.from_dict"]], "from_dict() (mcaddon.event.teleport class method)": [[1, "mcaddon.event.Teleport.from_dict"]], "from_dict() (mcaddon.event.transformiiem class method)": [[1, "mcaddon.event.TransformiIem.from_dict"]], "from_dict() (mcaddon.event.trigger class method)": [[1, "mcaddon.event.Trigger.from_dict"]], "from_dict() (mcaddon.file.jsonfile class method)": [[1, "mcaddon.file.JsonFile.from_dict"]], "from_dict() (mcaddon.item.blockplacercomponent class method)": [[1, "mcaddon.item.BlockPlacerComponent.from_dict"]], "from_dict() (mcaddon.item.cameracomponent class method)": [[1, "mcaddon.item.CameraComponent.from_dict"]], "from_dict() (mcaddon.item.cooldowncomponent class method)": [[1, "mcaddon.item.CooldownComponent.from_dict"]], "from_dict() (mcaddon.item.damagecomponent class method)": [[1, "mcaddon.item.DamageComponent.from_dict"]], "from_dict() (mcaddon.item.diggercomponent class method)": [[1, "mcaddon.item.DiggerComponent.from_dict"]], "from_dict() (mcaddon.item.durabilitycomponent class method)": [[1, "mcaddon.item.DurabilityComponent.from_dict"]], "from_dict() (mcaddon.item.emptyitemcomponent class method)": [[1, "mcaddon.item.EmptyItemComponent.from_dict"]], "from_dict() (mcaddon.item.enchantablecomponent class method)": [[1, "mcaddon.item.EnchantableComponent.from_dict"]], "from_dict() (mcaddon.item.entityplacercomponent class method)": [[1, "mcaddon.item.EntityPlacerComponent.from_dict"]], "from_dict() (mcaddon.item.foodcomponent class method)": [[1, "mcaddon.item.FoodComponent.from_dict"]], "from_dict() (mcaddon.item.fuelcomponent class method)": [[1, "mcaddon.item.FuelComponent.from_dict"]], "from_dict() (mcaddon.item.glintcomponent class method)": [[1, "mcaddon.item.GlintComponent.from_dict"]], "from_dict() (mcaddon.item.hovertextcolorcomponent class method)": [[1, "mcaddon.item.HoverTextColorComponent.from_dict"]], "from_dict() (mcaddon.item.iconcomponent class method)": [[1, "mcaddon.item.IconComponent.from_dict"]], "from_dict() (mcaddon.item.interactbuttoncomponent class method)": [[1, "mcaddon.item.InteractButtonComponent.from_dict"]], "from_dict() (mcaddon.item.item class method)": [[1, "mcaddon.item.Item.from_dict"]], "from_dict() (mcaddon.item.itemcomponent class method)": [[1, "mcaddon.item.ItemComponent.from_dict"]], "from_dict() (mcaddon.item.itemdisplaynamecomponent class method)": [[1, "mcaddon.item.ItemDisplayNameComponent.from_dict"]], "from_dict() (mcaddon.item.itemstack class method)": [[1, "mcaddon.item.ItemStack.from_dict"]], "from_dict() (mcaddon.item.itemstoragecomponent class method)": [[1, "mcaddon.item.ItemStorageComponent.from_dict"]], "from_dict() (mcaddon.item.liquidclippedcomponent class method)": [[1, "mcaddon.item.LiquidClippedComponent.from_dict"]], "from_dict() (mcaddon.item.projectilecomponent class method)": [[1, "mcaddon.item.ProjectileComponent.from_dict"]], "from_dict() (mcaddon.item.recordcomponent class method)": [[1, "mcaddon.item.RecordComponent.from_dict"]], "from_dict() (mcaddon.item.repairablecomponent class method)": [[1, "mcaddon.item.RepairableComponent.from_dict"]], "from_dict() (mcaddon.item.seedcomponent class method)": [[1, "mcaddon.item.SeedComponent.from_dict"]], "from_dict() (mcaddon.item.shootercomponent class method)": [[1, "mcaddon.item.ShooterComponent.from_dict"]], "from_dict() (mcaddon.item.shoulddespawncomponent class method)": [[1, "mcaddon.item.ShouldDespawnComponent.from_dict"]], "from_dict() (mcaddon.item.simpleitemcomponent class method)": [[1, "mcaddon.item.SimpleItemComponent.from_dict"]], "from_dict() (mcaddon.item.tagscomponent class method)": [[1, "mcaddon.item.TagsComponent.from_dict"]], "from_dict() (mcaddon.item.throwablecomponent class method)": [[1, "mcaddon.item.ThrowableComponent.from_dict"]], "from_dict() (mcaddon.item.useanimationcomponent class method)": [[1, "mcaddon.item.UseAnimationComponent.from_dict"]], "from_dict() (mcaddon.item.usemodifierscomponent class method)": [[1, "mcaddon.item.UseModifiersComponent.from_dict"]], "from_dict() (mcaddon.item.wearablecomponent class method)": [[1, "mcaddon.item.WearableComponent.from_dict"]], "from_dict() (mcaddon.loot.enchant class method)": [[1, "mcaddon.loot.Enchant.from_dict"]], "from_dict() (mcaddon.loot.enchantbookfortradinglootfunction class method)": [[1, "mcaddon.loot.EnchantBookForTradingLootFunction.from_dict"]], "from_dict() (mcaddon.loot.enchantrandomgearlootfunction class method)": [[1, "mcaddon.loot.EnchantRandomGearLootFunction.from_dict"]], "from_dict() (mcaddon.loot.enchantrandomlylootfunction class method)": [[1, "mcaddon.loot.EnchantRandomlyLootFunction.from_dict"]], "from_dict() (mcaddon.loot.enchantwithlevelslootfunction class method)": [[1, "mcaddon.loot.EnchantWithLevelsLootFunction.from_dict"]], "from_dict() (mcaddon.loot.explorationmaplootfunction class method)": [[1, "mcaddon.loot.ExplorationMapLootFunction.from_dict"]], "from_dict() (mcaddon.loot.fillcontainerlootfunction class method)": [[1, "mcaddon.loot.FillContainerLootFunction.from_dict"]], "from_dict() (mcaddon.loot.furnacesmeltlootfunction class method)": [[1, "mcaddon.loot.FurnaceSmeltLootFunction.from_dict"]], "from_dict() (mcaddon.loot.hasmarkvariantlootcondition class method)": [[1, "mcaddon.loot.HasMarkvariantLootCondition.from_dict"]], "from_dict() (mcaddon.loot.itementry class method)": [[1, "mcaddon.loot.ItemEntry.from_dict"]], "from_dict() (mcaddon.loot.killedbyentitylootcondition class method)": [[1, "mcaddon.loot.KilledByEntityLootCondition.from_dict"]], "from_dict() (mcaddon.loot.killedbyplayerlootcondition class method)": [[1, "mcaddon.loot.KilledByPlayerLootCondition.from_dict"]], "from_dict() (mcaddon.loot.killedbyplayerorpetslootcondition class method)": [[1, "mcaddon.loot.KilledByPlayerOrPetsLootCondition.from_dict"]], "from_dict() (mcaddon.loot.leafentry class method)": [[1, "mcaddon.loot.LeafEntry.from_dict"]], "from_dict() (mcaddon.loot.lootentry class method)": [[1, "mcaddon.loot.LootEntry.from_dict"]], "from_dict() (mcaddon.loot.lootnumberprovider class method)": [[1, "mcaddon.loot.LootNumberProvider.from_dict"]], "from_dict() (mcaddon.loot.lootpool class method)": [[1, "mcaddon.loot.LootPool.from_dict"]], "from_dict() (mcaddon.loot.lootpoolentry class method)": [[1, "mcaddon.loot.LootPoolEntry.from_dict"]], "from_dict() (mcaddon.loot.loottable class method)": [[1, "mcaddon.loot.LootTable.from_dict"]], "from_dict() (mcaddon.loot.loottiers class method)": [[1, "mcaddon.loot.LootTiers.from_dict"]], "from_dict() (mcaddon.loot.lootingenchantlootfunction class method)": [[1, "mcaddon.loot.LootingEnchantLootFunction.from_dict"]], "from_dict() (mcaddon.loot.matchtoollootcondition class method)": [[1, "mcaddon.loot.MatchToolLootCondition.from_dict"]], "from_dict() (mcaddon.loot.randomauxvaluelootfunction class method)": [[1, "mcaddon.loot.RandomAuxValueLootFunction.from_dict"]], "from_dict() (mcaddon.loot.randomblockstatelootfunction class method)": [[1, "mcaddon.loot.RandomBlockPropertyLootFunction.from_dict"]], "from_dict() (mcaddon.loot.randomchancelootcondition class method)": [[1, "mcaddon.loot.RandomChanceLootCondition.from_dict"]], "from_dict() (mcaddon.loot.randomchancewithlootinglootcondition class method)": [[1, "mcaddon.loot.RandomChanceWithLootingLootCondition.from_dict"]], "from_dict() (mcaddon.loot.randomdifficultychancelootcondition class method)": [[1, "mcaddon.loot.RandomDifficultyChanceLootCondition.from_dict"]], "from_dict() (mcaddon.loot.randomdyelootfunction class method)": [[1, "mcaddon.loot.RandomDyeLootFunction.from_dict"]], "from_dict() (mcaddon.loot.randomregionaldifficultychancelootcondition class method)": [[1, "mcaddon.loot.RandomRegionalDifficultyChanceLootCondition.from_dict"]], "from_dict() (mcaddon.loot.setactoridlootfunction class method)": [[1, "mcaddon.loot.SetActorIdLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setbannerdetailslootfunction class method)": [[1, "mcaddon.loot.SetBannerDetailsLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setbookcontentslootfunction class method)": [[1, "mcaddon.loot.SetBookContentsLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setcountlootfunction class method)": [[1, "mcaddon.loot.SetCountLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setdamagelootfunction class method)": [[1, "mcaddon.loot.SetDamageLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setdatafromcolorindexlootfunction class method)": [[1, "mcaddon.loot.SetDataFromColorIndexLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setdatalootfunction class method)": [[1, "mcaddon.loot.SetDataLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setlorelootfunction class method)": [[1, "mcaddon.loot.SetLoreLootFunction.from_dict"]], "from_dict() (mcaddon.loot.setnamelootfunction class method)": [[1, "mcaddon.loot.SetNameLootFunction.from_dict"]], "from_dict() (mcaddon.loot.specificenchantslootfunction class method)": [[1, "mcaddon.loot.SpecificEnchantsLootFunction.from_dict"]], "from_dict() (mcaddon.loot.tradermaterialtypelootfunction class method)": [[1, "mcaddon.loot.TraderMaterialTypeLootFunction.from_dict"]], "from_dict() (mcaddon.manifest.dependency class method)": [[1, "mcaddon.manifest.Dependency.from_dict"]], "from_dict() (mcaddon.manifest.header class method)": [[1, "mcaddon.manifest.Header.from_dict"]], "from_dict() (mcaddon.manifest.manifest class method)": [[1, "mcaddon.manifest.Manifest.from_dict"]], "from_dict() (mcaddon.manifest.metadata class method)": [[1, "mcaddon.manifest.Metadata.from_dict"]], "from_dict() (mcaddon.manifest.module class method)": [[1, "mcaddon.manifest.Module.from_dict"]], "from_dict() (mcaddon.recipe.brewingcontainerrecipe class method)": [[1, "mcaddon.recipe.BrewingContainerRecipe.from_dict"]], "from_dict() (mcaddon.recipe.brewingmixrecipe class method)": [[1, "mcaddon.recipe.BrewingMixRecipe.from_dict"]], "from_dict() (mcaddon.recipe.furnacerecipe class method)": [[1, "mcaddon.recipe.FurnaceRecipe.from_dict"]], "from_dict() (mcaddon.recipe.ingredient class method)": [[1, "mcaddon.recipe.Ingredient.from_dict"]], "from_dict() (mcaddon.recipe.materialreductionrecipe class method)": [[1, "mcaddon.recipe.MaterialReductionRecipe.from_dict"]], "from_dict() (mcaddon.recipe.recipe class method)": [[1, "mcaddon.recipe.Recipe.from_dict"]], "from_dict() (mcaddon.recipe.shapedrecipe class method)": [[1, "mcaddon.recipe.ShapedRecipe.from_dict"]], "from_dict() (mcaddon.recipe.shapelessrecipe class method)": [[1, "mcaddon.recipe.ShapelessRecipe.from_dict"]], "from_dict() (mcaddon.recipe.smithingtransformrecipe class method)": [[1, "mcaddon.recipe.SmithingTransformRecipe.from_dict"]], "from_dict() (mcaddon.recipe.smithingtrimrecipe class method)": [[1, "mcaddon.recipe.SmithingTrimRecipe.from_dict"]], "from_dict() (mcaddon.state.blockstate class method)": [[1, "mcaddon.state.BlockProperty.from_dict"]], "from_dict() (mcaddon.util.box class method)": [[1, "mcaddon.util.Box.from_dict"]], "from_dict() (mcaddon.util.menucategory class method)": [[1, "mcaddon.util.MenuCategory.from_dict"]], "from_dict() (mcaddon.volume.fogcomponent class method)": [[1, "mcaddon.volume.FogComponent.from_dict"]], "from_dict() (mcaddon.volume.onactorentercomponent class method)": [[1, "mcaddon.volume.OnActorEnterComponent.from_dict"]], "from_dict() (mcaddon.volume.onactorleavecomponent class method)": [[1, "mcaddon.volume.OnActorLeaveComponent.from_dict"]], "from_dict() (mcaddon.volume.volume class method)": [[1, "mcaddon.volume.Volume.from_dict"]], "from_dict() (mcaddon.volume.volumecomponent class method)": [[1, "mcaddon.volume.VolumeComponent.from_dict"]], "from_fileobj() (mcaddon.file.file class method)": [[1, "mcaddon.file.File.from_fileobj"]], "from_fileobj() (mcaddon.file.jsonfile class method)": [[1, "mcaddon.file.JsonFile.from_fileobj"]], "from_fileobj() (mcaddon.file.pngfile class method)": [[1, "mcaddon.file.PngFile.from_fileobj"]], "from_settings() (mcaddon.block.block class method)": [[1, "mcaddon.block.Block.from_settings"]], "from_settings() (mcaddon.item.item class method)": [[1, "mcaddon.item.Item.from_settings"]], "functions (mcaddon.loot.leafentry property)": [[1, "mcaddon.loot.LeafEntry.functions"]], "functions (mcaddon.loot.lootpool property)": [[1, "mcaddon.loot.LootPool.functions"]], "functions (mcaddon.loot.loottable property)": [[1, "mcaddon.loot.LootTable.functions"]], "furnace (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.furnace"]], "generic (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.generic"]], "geometry (mcaddon.block.geometrycomponent property)": [[1, "mcaddon.block.GeometryComponent.geometry"]], "get() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.get"]], "get() (mcaddon.registry.registrykey method)": [[1, "mcaddon.registry.RegistryKey.get"]], "get_author() (mcaddon.manifest.metadata method)": [[1, "mcaddon.manifest.Metadata.get_author"]], "get_block() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.get_block"]], "get_block() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.get_block"]], "get_bone() (mcaddon.block.bonevisabilitycomponent method)": [[1, "mcaddon.block.BoneVisabilityComponent.get_bone"]], "get_collision_shape() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.get_collision_shape"]], "get_component() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.get_component"]], "get_component() (mcaddon.block.blockpermutation method)": [[1, "mcaddon.block.BlockPermutation.get_component"]], "get_component() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.get_component"]], "get_component() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.get_component"]], "get_condition() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.get_condition"]], "get_condition() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.get_condition"]], "get_condition() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.get_condition"]], "get_crafting_tag() (mcaddon.block.craftingtablecomponent method)": [[1, "mcaddon.block.CraftingTableComponent.get_crafting_tag"]], "get_dependency() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.get_dependency"]], "get_entry() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.get_entry"]], "get_event() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.get_event"]], "get_event() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.get_event"]], "get_event() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.get_event"]], "get_event() (mcaddon.volume.onactorentercomponent method)": [[1, "mcaddon.volume.OnActorEnterComponent.get_event"]], "get_event() (mcaddon.volume.onactorleavecomponent method)": [[1, "mcaddon.volume.OnActorLeaveComponent.get_event"]], "get_event() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.get_event"]], "get_face() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.get_face"]], "get_file() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.get_file"]], "get_filter() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.get_filter"]], "get_function() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.get_function"]], "get_function() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.get_function"]], "get_function() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.get_function"]], "get_item() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.get_item"]], "get_item() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.get_item"]], "get_item_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.get_item_texture"]], "get_material() (mcaddon.block.materialinstancescomponent method)": [[1, "mcaddon.block.MaterialInstancesComponent.get_material"]], "get_module() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.get_module"]], "get_pack() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.get_pack"]], "get_permutation() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.get_permutation"]], "get_pool() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.get_pool"]], "get_recipe() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.get_recipe"]], "get_registry() (mcaddon.registry.registry method)": [[1, "mcaddon.registry.Registry.get_registry"]], "get_schema() (mcaddon.file.loader method)": [[1, "mcaddon.file.Loader.get_schema"]], "get_selection_shape() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.get_selection_shape"]], "get_state() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.get_state"]], "get_tag() (mcaddon.block.blocktagscomponent method)": [[1, "mcaddon.block.BlockTagsComponent.get_tag"]], "get_terrain_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.get_terrain_texture"]], "get_trait() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.get_trait"]], "get_volume() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.get_volume"]], "getattr2() (in module mcaddon.util)": [[1, "mcaddon.util.getattr2"]], "getvalue() (mcaddon.file.archivefile method)": [[1, "mcaddon.file.ArchiveFile.getvalue"]], "getvalue() (mcaddon.file.file method)": [[1, "mcaddon.file.File.getvalue"]], "gift (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.gift"]], "gray (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.gray"]], "green (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.green"]], "group (mcaddon.util.menucategory property)": [[1, "mcaddon.util.MenuCategory.group"]], "hard (mcaddon.loot.randomdifficultychancelootcondition property)": [[1, "mcaddon.loot.RandomDifficultyChanceLootCondition.hard"]], "hardness (mcaddon.block.block property)": [[1, "mcaddon.block.Block.hardness"]], "hardness (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.hardness"]], "has_filename() (mcaddon.file.archivefile method)": [[1, "mcaddon.file.ArchiveFile.has_filename"]], "has_filename() (mcaddon.file.file method)": [[1, "mcaddon.file.File.has_filename"]], "header (mcaddon.manifest.manifest property)": [[1, "mcaddon.manifest.Manifest.header"]], "holder (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.holder"]], "id (mcaddon.block.block attribute)": [[1, "mcaddon.block.Block.id"]], "id (mcaddon.block.blockdisplaynamecomponent attribute)": [[1, "mcaddon.block.BlockDisplayNameComponent.id"]], "id (mcaddon.block.blocktagscomponent attribute)": [[1, "mcaddon.block.BlockTagsComponent.id"]], "id (mcaddon.block.blocktrait property)": [[1, "mcaddon.block.BlockTrait.id"]], "id (mcaddon.block.bonevisabilitycomponent attribute)": [[1, "mcaddon.block.BoneVisabilityComponent.id"]], "id (mcaddon.block.breathabilitycomponent attribute)": [[1, "mcaddon.block.BreathabilityComponent.id"]], "id (mcaddon.block.collisionboxcomponent attribute)": [[1, "mcaddon.block.CollisionBoxComponent.id"]], "id (mcaddon.block.craftingtablecomponent attribute)": [[1, "mcaddon.block.CraftingTableComponent.id"]], "id (mcaddon.block.destructiblebyexplosioncomponent attribute)": [[1, "mcaddon.block.DestructibleByExplosionComponent.id"]], "id (mcaddon.block.destructiblebyminingcomponent attribute)": [[1, "mcaddon.block.DestructibleByMiningComponent.id"]], "id (mcaddon.block.flammablecomponent attribute)": [[1, "mcaddon.block.FlammableComponent.id"]], "id (mcaddon.block.frictioncomponent attribute)": [[1, "mcaddon.block.FrictionComponent.id"]], "id (mcaddon.block.geometrycomponent attribute)": [[1, "mcaddon.block.GeometryComponent.id"]], "id (mcaddon.block.lightdampeningcomponent attribute)": [[1, "mcaddon.block.LightDampeningComponent.id"]], "id (mcaddon.block.lightemissioncomponent attribute)": [[1, "mcaddon.block.LightEmissionComponent.id"]], "id (mcaddon.block.lootcomponent attribute)": [[1, "mcaddon.block.LootComponent.id"]], "id (mcaddon.block.mapcolorcomponent attribute)": [[1, "mcaddon.block.MapColorComponent.id"]], "id (mcaddon.block.materialinstancescomponent attribute)": [[1, "mcaddon.block.MaterialInstancesComponent.id"]], "id (mcaddon.block.onfalloncomponent attribute)": [[1, "mcaddon.block.OnFallOnComponent.id"]], "id (mcaddon.block.oninteractcomponent attribute)": [[1, "mcaddon.block.OnInteractComponent.id"]], "id (mcaddon.block.onplacedcomponent attribute)": [[1, "mcaddon.block.OnPlacedComponent.id"]], "id (mcaddon.block.onplayerdestroyedcomponent attribute)": [[1, "mcaddon.block.OnPlayerDestroyedComponent.id"]], "id (mcaddon.block.onplayerplacingcomponent attribute)": [[1, "mcaddon.block.OnPlayerPlacingComponent.id"]], "id (mcaddon.block.onstepoffcomponent attribute)": [[1, "mcaddon.block.OnStepOffComponent.id"]], "id (mcaddon.block.onsteponcomponent attribute)": [[1, "mcaddon.block.OnStepOnComponent.id"]], "id (mcaddon.block.placementdirectiontrait attribute)": [[1, "mcaddon.block.PlacementDirectionTrait.id"]], "id (mcaddon.block.placementfiltercomponent attribute)": [[1, "mcaddon.block.PlacementFilterComponent.id"]], "id (mcaddon.block.placementpositiontrait attribute)": [[1, "mcaddon.block.PlacementPositionTrait.id"]], "id (mcaddon.block.queuedtickingcomponent attribute)": [[1, "mcaddon.block.QueuedTickingComponent.id"]], "id (mcaddon.block.randomtickingcomponent attribute)": [[1, "mcaddon.block.RandomTickingComponent.id"]], "id (mcaddon.block.selectionboxcomponent attribute)": [[1, "mcaddon.block.SelectionBoxComponent.id"]], "id (mcaddon.block.transformationcomponent attribute)": [[1, "mcaddon.block.TransformationComponent.id"]], "id (mcaddon.block.unitcubecomponent attribute)": [[1, "mcaddon.block.UnitCubeComponent.id"]], "id (mcaddon.camera.camerapreset attribute)": [[1, "mcaddon.camera.CameraPreset.id"]], "id (mcaddon.event.addmobeffect attribute)": [[1, "mcaddon.event.AddMobEffect.id"]], "id (mcaddon.event.damage attribute)": [[1, "mcaddon.event.Damage.id"]], "id (mcaddon.event.decrementstack attribute)": [[1, "mcaddon.event.DecrementStack.id"]], "id (mcaddon.event.die attribute)": [[1, "mcaddon.event.Die.id"]], "id (mcaddon.event.playeffect attribute)": [[1, "mcaddon.event.PlayEffect.id"]], "id (mcaddon.event.playsound attribute)": [[1, "mcaddon.event.PlaySound.id"]], "id (mcaddon.event.randomize attribute)": [[1, "mcaddon.event.Randomize.id"]], "id (mcaddon.event.removemobeffect attribute)": [[1, "mcaddon.event.RemoveMobEffect.id"]], "id (mcaddon.event.runcommand attribute)": [[1, "mcaddon.event.RunCommand.id"]], "id (mcaddon.event.sequence attribute)": [[1, "mcaddon.event.Sequence.id"]], "id (mcaddon.event.setblock attribute)": [[1, "mcaddon.event.SetBlock.id"]], "id (mcaddon.event.setblockatpos attribute)": [[1, "mcaddon.event.SetBlockAtPos.id"]], "id (mcaddon.event.setblockstate attribute)": [[1, "mcaddon.event.SetBlockProperty.id"]], "id (mcaddon.event.spawnloot attribute)": [[1, "mcaddon.event.SpawnLoot.id"]], "id (mcaddon.event.swing attribute)": [[1, "mcaddon.event.Swing.id"]], "id (mcaddon.event.teleport attribute)": [[1, "mcaddon.event.Teleport.id"]], "id (mcaddon.event.transformiiem attribute)": [[1, "mcaddon.event.TransformiIem.id"]], "id (mcaddon.event.trigger attribute)": [[1, "mcaddon.event.Trigger.id"]], "id (mcaddon.item.allowoffhandcomponent attribute)": [[1, "mcaddon.item.AllowOffHandComponent.id"]], "id (mcaddon.item.blockcomponent2 attribute)": [[1, "mcaddon.item.BlockComponent2.id"]], "id (mcaddon.item.blockplacercomponent attribute)": [[1, "mcaddon.item.BlockPlacerComponent.id"]], "id (mcaddon.item.cameracomponent attribute)": [[1, "mcaddon.item.CameraComponent.id"]], "id (mcaddon.item.candestroyincreativecomponent attribute)": [[1, "mcaddon.item.CanDestroyInCreativeComponent.id"]], "id (mcaddon.item.cooldowncomponent attribute)": [[1, "mcaddon.item.CooldownComponent.id"]], "id (mcaddon.item.damagecomponent attribute)": [[1, "mcaddon.item.DamageComponent.id"]], "id (mcaddon.item.diggercomponent attribute)": [[1, "mcaddon.item.DiggerComponent.id"]], "id (mcaddon.item.durabilitycomponent attribute)": [[1, "mcaddon.item.DurabilityComponent.id"]], "id (mcaddon.item.enchantablecomponent attribute)": [[1, "mcaddon.item.EnchantableComponent.id"]], "id (mcaddon.item.entityplacercomponent attribute)": [[1, "mcaddon.item.EntityPlacerComponent.id"]], "id (mcaddon.item.foilcomponent attribute)": [[1, "mcaddon.item.FoilComponent.id"]], "id (mcaddon.item.foodcomponent attribute)": [[1, "mcaddon.item.FoodComponent.id"]], "id (mcaddon.item.fuelcomponent attribute)": [[1, "mcaddon.item.FuelComponent.id"]], "id (mcaddon.item.glintcomponent attribute)": [[1, "mcaddon.item.GlintComponent.id"]], "id (mcaddon.item.handequippedcomponent attribute)": [[1, "mcaddon.item.HandEquippedComponent.id"]], "id (mcaddon.item.hovertextcolorcomponent attribute)": [[1, "mcaddon.item.HoverTextColorComponent.id"]], "id (mcaddon.item.iconcomponent attribute)": [[1, "mcaddon.item.IconComponent.id"]], "id (mcaddon.item.ignorespermissioncomponent attribute)": [[1, "mcaddon.item.IgnoresPermissionComponent.id"]], "id (mcaddon.item.interactbuttoncomponent attribute)": [[1, "mcaddon.item.InteractButtonComponent.id"]], "id (mcaddon.item.item attribute)": [[1, "mcaddon.item.Item.id"]], "id (mcaddon.item.itemdisplaynamecomponent attribute)": [[1, "mcaddon.item.ItemDisplayNameComponent.id"]], "id (mcaddon.item.itemstoragecomponent attribute)": [[1, "mcaddon.item.ItemStorageComponent.id"]], "id (mcaddon.item.liquidclippedcomponent attribute)": [[1, "mcaddon.item.LiquidClippedComponent.id"]], "id (mcaddon.item.maxdamagecomponent attribute)": [[1, "mcaddon.item.MaxDamageComponent.id"]], "id (mcaddon.item.maxstacksizecomponent attribute)": [[1, "mcaddon.item.MaxStackSizeComponent.id"]], "id (mcaddon.item.portfoliocomponent attribute)": [[1, "mcaddon.item.PortfolioComponent.id"]], "id (mcaddon.item.projectilecomponent attribute)": [[1, "mcaddon.item.ProjectileComponent.id"]], "id (mcaddon.item.recordcomponent attribute)": [[1, "mcaddon.item.RecordComponent.id"]], "id (mcaddon.item.repairablecomponent attribute)": [[1, "mcaddon.item.RepairableComponent.id"]], "id (mcaddon.item.seedcomponent attribute)": [[1, "mcaddon.item.SeedComponent.id"]], "id (mcaddon.item.shootercomponent attribute)": [[1, "mcaddon.item.ShooterComponent.id"]], "id (mcaddon.item.shoulddespawncomponent attribute)": [[1, "mcaddon.item.ShouldDespawnComponent.id"]], "id (mcaddon.item.stackedbydatacomponent attribute)": [[1, "mcaddon.item.StackedByDataComponent.id"]], "id (mcaddon.item.tagscomponent attribute)": [[1, "mcaddon.item.TagsComponent.id"]], "id (mcaddon.item.throwablecomponent attribute)": [[1, "mcaddon.item.ThrowableComponent.id"]], "id (mcaddon.item.useanimationcomponent attribute)": [[1, "mcaddon.item.UseAnimationComponent.id"]], "id (mcaddon.item.usedurationcomponent attribute)": [[1, "mcaddon.item.UseDurationComponent.id"]], "id (mcaddon.item.usemodifierscomponent attribute)": [[1, "mcaddon.item.UseModifiersComponent.id"]], "id (mcaddon.item.wearablecomponent attribute)": [[1, "mcaddon.item.WearableComponent.id"]], "id (mcaddon.loot.enchantbookfortradinglootfunction attribute)": [[1, "mcaddon.loot.EnchantBookForTradingLootFunction.id"]], "id (mcaddon.loot.enchantrandomgearlootfunction attribute)": [[1, "mcaddon.loot.EnchantRandomGearLootFunction.id"]], "id (mcaddon.loot.enchantrandomlylootfunction attribute)": [[1, "mcaddon.loot.EnchantRandomlyLootFunction.id"]], "id (mcaddon.loot.enchantwithlevelslootfunction attribute)": [[1, "mcaddon.loot.EnchantWithLevelsLootFunction.id"]], "id (mcaddon.loot.explorationmaplootfunction attribute)": [[1, "mcaddon.loot.ExplorationMapLootFunction.id"]], "id (mcaddon.loot.fillcontainerlootfunction attribute)": [[1, "mcaddon.loot.FillContainerLootFunction.id"]], "id (mcaddon.loot.furnacesmeltlootfunction attribute)": [[1, "mcaddon.loot.FurnaceSmeltLootFunction.id"]], "id (mcaddon.loot.hasmarkvariantlootcondition attribute)": [[1, "mcaddon.loot.HasMarkvariantLootCondition.id"]], "id (mcaddon.loot.itementry attribute)": [[1, "mcaddon.loot.ItemEntry.id"]], "id (mcaddon.loot.killedbyentitylootcondition attribute)": [[1, "mcaddon.loot.KilledByEntityLootCondition.id"]], "id (mcaddon.loot.killedbyplayerlootcondition attribute)": [[1, "mcaddon.loot.KilledByPlayerLootCondition.id"]], "id (mcaddon.loot.killedbyplayerorpetslootcondition attribute)": [[1, "mcaddon.loot.KilledByPlayerOrPetsLootCondition.id"]], "id (mcaddon.loot.lootentry attribute)": [[1, "mcaddon.loot.LootEntry.id"]], "id (mcaddon.loot.lootpoolentry property)": [[1, "mcaddon.loot.LootPoolEntry.id"]], "id (mcaddon.loot.lootingenchantlootfunction attribute)": [[1, "mcaddon.loot.LootingEnchantLootFunction.id"]], "id (mcaddon.loot.matchtoollootcondition attribute)": [[1, "mcaddon.loot.MatchToolLootCondition.id"]], "id (mcaddon.loot.randomauxvaluelootfunction attribute)": [[1, "mcaddon.loot.RandomAuxValueLootFunction.id"]], "id (mcaddon.loot.randomblockstatelootfunction attribute)": [[1, "mcaddon.loot.RandomBlockPropertyLootFunction.id"]], "id (mcaddon.loot.randomchancelootcondition attribute)": [[1, "mcaddon.loot.RandomChanceLootCondition.id"]], "id (mcaddon.loot.randomchancewithlootinglootcondition attribute)": [[1, "mcaddon.loot.RandomChanceWithLootingLootCondition.id"]], "id (mcaddon.loot.randomdifficultychancelootcondition attribute)": [[1, "mcaddon.loot.RandomDifficultyChanceLootCondition.id"]], "id (mcaddon.loot.randomdyelootfunction attribute)": [[1, "mcaddon.loot.RandomDyeLootFunction.id"]], "id (mcaddon.loot.randomregionaldifficultychancelootcondition attribute)": [[1, "mcaddon.loot.RandomRegionalDifficultyChanceLootCondition.id"]], "id (mcaddon.loot.setactoridlootfunction attribute)": [[1, "mcaddon.loot.SetActorIdLootFunction.id"]], "id (mcaddon.loot.setbannerdetailslootfunction attribute)": [[1, "mcaddon.loot.SetBannerDetailsLootFunction.id"]], "id (mcaddon.loot.setbookcontentslootfunction attribute)": [[1, "mcaddon.loot.SetBookContentsLootFunction.id"]], "id (mcaddon.loot.setcountlootfunction attribute)": [[1, "mcaddon.loot.SetCountLootFunction.id"]], "id (mcaddon.loot.setdamagelootfunction attribute)": [[1, "mcaddon.loot.SetDamageLootFunction.id"]], "id (mcaddon.loot.setdatafromcolorindexlootfunction attribute)": [[1, "mcaddon.loot.SetDataFromColorIndexLootFunction.id"]], "id (mcaddon.loot.setdatalootfunction attribute)": [[1, "mcaddon.loot.SetDataLootFunction.id"]], "id (mcaddon.loot.setlorelootfunction attribute)": [[1, "mcaddon.loot.SetLoreLootFunction.id"]], "id (mcaddon.loot.setnamelootfunction attribute)": [[1, "mcaddon.loot.SetNameLootFunction.id"]], "id (mcaddon.loot.specificenchantslootfunction attribute)": [[1, "mcaddon.loot.SpecificEnchantsLootFunction.id"]], "id (mcaddon.loot.tradermaterialtypelootfunction attribute)": [[1, "mcaddon.loot.TraderMaterialTypeLootFunction.id"]], "id (mcaddon.pack.addon attribute)": [[1, "mcaddon.pack.Addon.id"]], "id (mcaddon.pack.behaviorpack attribute)": [[1, "mcaddon.pack.BehaviorPack.id"]], "id (mcaddon.pack.resourcepack attribute)": [[1, "mcaddon.pack.ResourcePack.id"]], "id (mcaddon.recipe.brewingcontainerrecipe attribute)": [[1, "mcaddon.recipe.BrewingContainerRecipe.id"]], "id (mcaddon.recipe.brewingmixrecipe attribute)": [[1, "mcaddon.recipe.BrewingMixRecipe.id"]], "id (mcaddon.recipe.furnacerecipe attribute)": [[1, "mcaddon.recipe.FurnaceRecipe.id"]], "id (mcaddon.recipe.materialreductionrecipe attribute)": [[1, "mcaddon.recipe.MaterialReductionRecipe.id"]], "id (mcaddon.recipe.recipe property)": [[1, "mcaddon.recipe.Recipe.id"]], "id (mcaddon.recipe.shapedrecipe attribute)": [[1, "mcaddon.recipe.ShapedRecipe.id"]], "id (mcaddon.recipe.shapelessrecipe attribute)": [[1, "mcaddon.recipe.ShapelessRecipe.id"]], "id (mcaddon.recipe.smithingtransformrecipe attribute)": [[1, "mcaddon.recipe.SmithingTransformRecipe.id"]], "id (mcaddon.recipe.smithingtrimrecipe attribute)": [[1, "mcaddon.recipe.SmithingTrimRecipe.id"]], "id (mcaddon.state.activestate attribute)": [[1, "mcaddon.state.ActiveState.id"]], "id (mcaddon.state.agebitstate attribute)": [[1, "mcaddon.state.AgeBitState.id"]], "id (mcaddon.state.agestate attribute)": [[1, "mcaddon.state.AgeState.id"]], "id (mcaddon.state.allowunderwaterbitstate attribute)": [[1, "mcaddon.state.AllowUnderwaterBitState.id"]], "id (mcaddon.state.attachedbitstate attribute)": [[1, "mcaddon.state.AttachedBitState.id"]], "id (mcaddon.state.attachmentstate attribute)": [[1, "mcaddon.state.AttachmentState.id"]], "id (mcaddon.state.bambooleafsizestate attribute)": [[1, "mcaddon.state.BambooLeafSizeState.id"]], "id (mcaddon.state.bamboostalkthicknessstate attribute)": [[1, "mcaddon.state.BambooStalkThicknessState.id"]], "id (mcaddon.state.bigdripleaftiltstate attribute)": [[1, "mcaddon.state.BigDripleafTiltState.id"]], "id (mcaddon.state.bitecounterstate attribute)": [[1, "mcaddon.state.BiteCounterState.id"]], "id (mcaddon.state.blockfacestate attribute)": [[1, "mcaddon.state.BlockFaceState.id"]], "id (mcaddon.state.blockstate property)": [[1, "mcaddon.state.BlockProperty.id"]], "id (mcaddon.state.booksstoredstate attribute)": [[1, "mcaddon.state.BooksStoredState.id"]], "id (mcaddon.state.brewingstandslotabitstate attribute)": [[1, "mcaddon.state.BrewingStandSlotABitState.id"]], "id (mcaddon.state.brewingstandslotbbitstate attribute)": [[1, "mcaddon.state.BrewingStandSlotBBitState.id"]], "id (mcaddon.state.brewingstandslotcbitstate attribute)": [[1, "mcaddon.state.BrewingStandSlotCBitState.id"]], "id (mcaddon.state.brushedprogressstate attribute)": [[1, "mcaddon.state.BrushedProgressState.id"]], "id (mcaddon.state.buttonpressedbitstate attribute)": [[1, "mcaddon.state.ButtonPressedBitState.id"]], "id (mcaddon.state.candlesstate attribute)": [[1, "mcaddon.state.CandlesState.id"]], "id (mcaddon.state.cardinaldirectionstate attribute)": [[1, "mcaddon.state.CardinalDirectionState.id"]], "id (mcaddon.state.cauldronliquidstate attribute)": [[1, "mcaddon.state.CauldronLiquidState.id"]], "id (mcaddon.state.chemistrytabletypestate attribute)": [[1, "mcaddon.state.ChemistryTableTypeState.id"]], "id (mcaddon.state.chiseltypestate attribute)": [[1, "mcaddon.state.ChiselTypeState.id"]], "id (mcaddon.state.clustercountstate attribute)": [[1, "mcaddon.state.ClusterCountState.id"]], "id (mcaddon.state.colorbitstate attribute)": [[1, "mcaddon.state.ColorBitState.id"]], "id (mcaddon.state.colorstate attribute)": [[1, "mcaddon.state.ColorState.id"]], "id (mcaddon.state.conditionalbitstate attribute)": [[1, "mcaddon.state.ConditionalBitState.id"]], "id (mcaddon.state.coralcolorstate attribute)": [[1, "mcaddon.state.CoralColorState.id"]], "id (mcaddon.state.coraldirectionstate attribute)": [[1, "mcaddon.state.CoralDirectionState.id"]], "id (mcaddon.state.coralhangtypebitstate attribute)": [[1, "mcaddon.state.CoralHangTypeBitState.id"]], "id (mcaddon.state.coveredbitstate attribute)": [[1, "mcaddon.state.CoveredBitState.id"]], "id (mcaddon.state.crackedstate attribute)": [[1, "mcaddon.state.CrackedState.id"]], "id (mcaddon.state.craftingstate attribute)": [[1, "mcaddon.state.CraftingState.id"]], "id (mcaddon.state.damagestate attribute)": [[1, "mcaddon.state.DamageState.id"]], "id (mcaddon.state.deadbitstate attribute)": [[1, "mcaddon.state.DeadBitState.id"]], "id (mcaddon.state.directionstate attribute)": [[1, "mcaddon.state.DirectionState.id"]], "id (mcaddon.state.dirttypestate attribute)": [[1, "mcaddon.state.DirtTypeState.id"]], "id (mcaddon.state.disarmedbitstate attribute)": [[1, "mcaddon.state.DisarmedBitState.id"]], "id (mcaddon.state.doorhingebitstate attribute)": [[1, "mcaddon.state.DoorHingeBitState.id"]], "id (mcaddon.state.doubleplanttypestate attribute)": [[1, "mcaddon.state.DoublePlantTypeState.id"]], "id (mcaddon.state.dragdownstate attribute)": [[1, "mcaddon.state.DragDownState.id"]], "id (mcaddon.state.dripstonethicknessstate attribute)": [[1, "mcaddon.state.DripstoneThicknessState.id"]], "id (mcaddon.state.endportaleyebitstate attribute)": [[1, "mcaddon.state.EndPortalEyeBitState.id"]], "id (mcaddon.state.explodebitstate attribute)": [[1, "mcaddon.state.ExplodeBitState.id"]], "id (mcaddon.state.facingdirectionstate attribute)": [[1, "mcaddon.state.FacingDirectionState.id"]], "id (mcaddon.state.filllevelstate attribute)": [[1, "mcaddon.state.FillLevelState.id"]], "id (mcaddon.state.flowertypestate attribute)": [[1, "mcaddon.state.FlowerTypeState.id"]], "id (mcaddon.state.groundsigndirectionstate attribute)": [[1, "mcaddon.state.GroundSignDirectionState.id"]], "id (mcaddon.state.growthstate attribute)": [[1, "mcaddon.state.GrowthState.id"]], "id (mcaddon.state.hangingstate attribute)": [[1, "mcaddon.state.HangingState.id"]], "id (mcaddon.state.headpiecebitstate attribute)": [[1, "mcaddon.state.HeadPieceBitState.id"]], "id (mcaddon.state.heightstate attribute)": [[1, "mcaddon.state.HeightState.id"]], "id (mcaddon.state.hugemushroombitsstate attribute)": [[1, "mcaddon.state.HugeMushroomBitsState.id"]], "id (mcaddon.state.inwallbitstate attribute)": [[1, "mcaddon.state.InWallBitState.id"]], "id (mcaddon.state.infiniburnbitstate attribute)": [[1, "mcaddon.state.InfiniburnBitState.id"]], "id (mcaddon.state.itemframemapbitstate attribute)": [[1, "mcaddon.state.ItemFrameMapBitState.id"]], "id (mcaddon.state.itemframephotobitstate attribute)": [[1, "mcaddon.state.ItemFramePhotoBitState.id"]], "id (mcaddon.state.liquiddepthstate attribute)": [[1, "mcaddon.state.LiquidDepthState.id"]], "id (mcaddon.state.moisturizedamountstate attribute)": [[1, "mcaddon.state.MoisturizedAmountState.id"]], "id (mcaddon.state.monstereggstonetypestate attribute)": [[1, "mcaddon.state.MonsterEggStoneTypeState.id"]], "id (mcaddon.state.newleaftypestate attribute)": [[1, "mcaddon.state.NewLeafTypeState.id"]], "id (mcaddon.state.newlogtypestate attribute)": [[1, "mcaddon.state.NewLogTypeState.id"]], "id (mcaddon.state.nodropbitstate attribute)": [[1, "mcaddon.state.NoDropBitState.id"]], "id (mcaddon.state.occupiedbitstate attribute)": [[1, "mcaddon.state.OccupiedBitState.id"]], "id (mcaddon.state.oldleaftypestate attribute)": [[1, "mcaddon.state.OldLeafTypeState.id"]], "id (mcaddon.state.oldlogtypestate attribute)": [[1, "mcaddon.state.OldLogTypeState.id"]], "id (mcaddon.state.openbitstate attribute)": [[1, "mcaddon.state.OpenBitState.id"]], "id (mcaddon.state.orientationstate attribute)": [[1, "mcaddon.state.OrientationState.id"]], "id (mcaddon.state.outputlitbitstate attribute)": [[1, "mcaddon.state.OutputLitBitState.id"]], "id (mcaddon.state.outputsubtractbitstate attribute)": [[1, "mcaddon.state.OutputSubtractBitState.id"]], "id (mcaddon.state.persistentbitstate attribute)": [[1, "mcaddon.state.PersistentBitState.id"]], "id (mcaddon.state.portalaxisstate attribute)": [[1, "mcaddon.state.PortalAxisState.id"]], "id (mcaddon.state.poweredbitstate attribute)": [[1, "mcaddon.state.PoweredBitState.id"]], "id (mcaddon.state.raildatabitstate attribute)": [[1, "mcaddon.state.RailDataBitState.id"]], "id (mcaddon.state.raildirectionstate attribute)": [[1, "mcaddon.state.RailDirectionState.id"]], "id (mcaddon.state.redstonesignalstate attribute)": [[1, "mcaddon.state.RedstoneSignalState.id"]], "id (mcaddon.state.repeaterdelaystate attribute)": [[1, "mcaddon.state.RepeaterDelayState.id"]], "id (mcaddon.state.sandstonetypestate attribute)": [[1, "mcaddon.state.SandStoneTypeState.id"]], "id (mcaddon.state.sandtypestate attribute)": [[1, "mcaddon.state.SandTypeState.id"]], "id (mcaddon.state.saplingtypestate attribute)": [[1, "mcaddon.state.SaplingTypeState.id"]], "id (mcaddon.state.sculksensorphasestate attribute)": [[1, "mcaddon.state.SculkSensorPhaseState.id"]], "id (mcaddon.state.seagrasstypestate attribute)": [[1, "mcaddon.state.SeaGrassTypeState.id"]], "id (mcaddon.state.spongetypestate attribute)": [[1, "mcaddon.state.SpongeTypeState.id"]], "id (mcaddon.state.stabilitycheckstate attribute)": [[1, "mcaddon.state.StabilityCheckState.id"]], "id (mcaddon.state.stabilitystate attribute)": [[1, "mcaddon.state.StabilityState.id"]], "id (mcaddon.state.stonebricktypestate attribute)": [[1, "mcaddon.state.StoneBrickTypeState.id"]], "id (mcaddon.state.stoneslabtype2state attribute)": [[1, "mcaddon.state.StoneSlabType2State.id"]], "id (mcaddon.state.stoneslabtype3state attribute)": [[1, "mcaddon.state.StoneSlabType3State.id"]], "id (mcaddon.state.stoneslabtype4state attribute)": [[1, "mcaddon.state.StoneSlabType4State.id"]], "id (mcaddon.state.stoneslabtypestate attribute)": [[1, "mcaddon.state.StoneSlabTypeState.id"]], "id (mcaddon.state.stonetypestate attribute)": [[1, "mcaddon.state.StoneTypeState.id"]], "id (mcaddon.state.strippedbitstate attribute)": [[1, "mcaddon.state.StrippedBitState.id"]], "id (mcaddon.state.structureblocktypestate attribute)": [[1, "mcaddon.state.StructureBlockTypeState.id"]], "id (mcaddon.state.structurevoidtypestate attribute)": [[1, "mcaddon.state.StructureVoidTypeState.id"]], "id (mcaddon.state.suspendedbitstate attribute)": [[1, "mcaddon.state.SuspendedBitState.id"]], "id (mcaddon.state.tallgrasstypestate attribute)": [[1, "mcaddon.state.TallGrassTypeState.id"]], "id (mcaddon.state.togglebitstate attribute)": [[1, "mcaddon.state.ToggleBitState.id"]], "id (mcaddon.state.topslotbitstate attribute)": [[1, "mcaddon.state.TopSlotBitState.id"]], "id (mcaddon.state.torchfacingdirectionstate attribute)": [[1, "mcaddon.state.TorchFacingDirectionState.id"]], "id (mcaddon.state.triggedbitstate attribute)": [[1, "mcaddon.state.TriggedBitState.id"]], "id (mcaddon.state.turtleeggcountstate attribute)": [[1, "mcaddon.state.TurtleEggCountState.id"]], "id (mcaddon.state.updatebitstate attribute)": [[1, "mcaddon.state.UpdateBitState.id"]], "id (mcaddon.state.upperblockbitstate attribute)": [[1, "mcaddon.state.UpperBlockBitState.id"]], "id (mcaddon.state.upsidedownbitstate attribute)": [[1, "mcaddon.state.UpsideDownBitState.id"]], "id (mcaddon.state.verticalhalfstate attribute)": [[1, "mcaddon.state.VerticalHalfState.id"]], "id (mcaddon.state.vinedirectionbitsstate attribute)": [[1, "mcaddon.state.VineDirectionBitsState.id"]], "id (mcaddon.state.wallblocktypestate attribute)": [[1, "mcaddon.state.WallBlockTypeState.id"]], "id (mcaddon.state.wallconnectiontypeaststate attribute)": [[1, "mcaddon.state.WallConnectionTypEastState.id"]], "id (mcaddon.state.wallconnectiontypenorthstate attribute)": [[1, "mcaddon.state.WallConnectionTypeNorthState.id"]], "id (mcaddon.state.wallconnectiontypesouthstate attribute)": [[1, "mcaddon.state.WallConnectionTypeSouthState.id"]], "id (mcaddon.state.wallconnectiontypeweststate attribute)": [[1, "mcaddon.state.WallConnectionTypeWestState.id"]], "id (mcaddon.state.wallpostbitstate attribute)": [[1, "mcaddon.state.WallPostBitState.id"]], "id (mcaddon.state.weirdodirectionstate attribute)": [[1, "mcaddon.state.WeirdoDirectionState.id"]], "id (mcaddon.state.woodtypestate attribute)": [[1, "mcaddon.state.WoodTypeState.id"]], "id (mcaddon.volume.fogcomponent attribute)": [[1, "mcaddon.volume.FogComponent.id"]], "id (mcaddon.volume.onactorentercomponent attribute)": [[1, "mcaddon.volume.OnActorEnterComponent.id"]], "id (mcaddon.volume.onactorleavecomponent attribute)": [[1, "mcaddon.volume.OnActorLeaveComponent.id"]], "id (mcaddon.volume.volume attribute)": [[1, "mcaddon.volume.Volume.id"]], "identifier (mcaddon.resrouce.itematlas attribute)": [[1, "mcaddon.resrouce.ItemAtlas.identifier"]], "identifier (mcaddon.resrouce.terrainatlas attribute)": [[1, "mcaddon.resrouce.TerrainAtlas.identifier"]], "identifier (mcaddon.util.identifiable property)": [[1, "mcaddon.util.Identifiable.identifier"]], "image (mcaddon.file.pngfile attribute)": [[1, "mcaddon.file.PngFile.image"]], "import_to() (mcaddon.file.importable method)": [[1, "mcaddon.file.Importable.import_to"]], "import_to() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.import_to"]], "import_to() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.import_to"]], "import_to() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.import_to"]], "ingredients (mcaddon.recipe.shapelessrecipe property)": [[1, "mcaddon.recipe.ShapelessRecipe.ingredients"]], "inherit_from (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.inherit_from"]], "initial_range (mcaddon.loot.loottiers property)": [[1, "mcaddon.loot.LootTiers.initial_range"]], "input (mcaddon.recipe.brewingcontainerrecipe property)": [[1, "mcaddon.recipe.BrewingContainerRecipe.input"]], "input (mcaddon.recipe.brewingmixrecipe property)": [[1, "mcaddon.recipe.BrewingMixRecipe.input"]], "input (mcaddon.recipe.furnacerecipe property)": [[1, "mcaddon.recipe.FurnaceRecipe.input"]], "input (mcaddon.recipe.materialreductionrecipe property)": [[1, "mcaddon.recipe.MaterialReductionRecipe.input"]], "interface (mcaddon.constant.moduletype attribute)": [[1, "mcaddon.constant.ModuleType.interface"]], "interface() (mcaddon.manifest.module class method)": [[1, "mcaddon.manifest.Module.interface"]], "interval_range (mcaddon.block.queuedtickingcomponent property)": [[1, "mcaddon.block.QueuedTickingComponent.interval_range"]], "is_burnable() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.is_burnable"]], "is_cube() (mcaddon.util.box method)": [[1, "mcaddon.util.Box.is_cube"]], "is_hidden_in_commands (mcaddon.util.menucategory property)": [[1, "mcaddon.util.MenuCategory.is_hidden_in_commands"]], "is_namespace_valid() (mcaddon.util.identifier method)": [[1, "mcaddon.util.Identifier.is_namespace_valid"]], "is_none() (mcaddon.util.box method)": [[1, "mcaddon.util.Box.is_none"]], "is_path_valid() (mcaddon.util.identifier method)": [[1, "mcaddon.util.Identifier.is_path_valid"]], "item (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.item"]], "item (mcaddon.constant.texturetype attribute)": [[1, "mcaddon.constant.TextureType.item"]], "item (mcaddon.item.itemstack property)": [[1, "mcaddon.item.ItemStack.item"]], "item (mcaddon.loot.matchtoollootcondition property)": [[1, "mcaddon.loot.MatchToolLootCondition.item"]], "item (mcaddon.recipe.ingredient property)": [[1, "mcaddon.recipe.Ingredient.item"]], "item_component_type() (in module mcaddon.item)": [[1, "mcaddon.item.item_component_type"]], "items (mcaddon.constant.category attribute)": [[1, "mcaddon.constant.Category.items"]], "items (mcaddon.pack.resourcepack property)": [[1, "mcaddon.pack.ResourcePack.items"]], "items() (mcaddon.registry.registrykey method)": [[1, "mcaddon.registry.RegistryKey.items"]], "json() (mcaddon.file.jsonfile method)": [[1, "mcaddon.file.JsonFile.json"]], "json() (mcaddon.item.itemcomponent method)": [[1, "mcaddon.item.ItemComponent.json"]], "json() (mcaddon.volume.volumecomponent method)": [[1, "mcaddon.volume.VolumeComponent.json"]], "key (mcaddon.file.loader property)": [[1, "mcaddon.file.Loader.key"]], "key (mcaddon.recipe.shapedrecipe property)": [[1, "mcaddon.recipe.ShapedRecipe.key"]], "keys() (mcaddon.registry.registrykey method)": [[1, "mcaddon.registry.RegistryKey.keys"]], "land_on_block (mcaddon.event.teleport property)": [[1, "mcaddon.event.Teleport.land_on_block"]], "launch_power_scale (mcaddon.item.throwablecomponent property)": [[1, "mcaddon.item.ThrowableComponent.launch_power_scale"]], "levels (mcaddon.loot.enchantwithlevelslootfunction property)": [[1, "mcaddon.loot.EnchantWithLevelsLootFunction.levels"]], "license (mcaddon.manifest.metadata property)": [[1, "mcaddon.manifest.Metadata.license"]], "light_blue (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.light_blue"]], "light_gray (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.light_gray"]], "lime (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.lime"]], "listener (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.listener"]], "load() (mcaddon.file.archivefile class method)": [[1, "mcaddon.file.ArchiveFile.load"]], "load() (mcaddon.file.file class method)": [[1, "mcaddon.file.File.load"]], "load() (mcaddon.file.loader method)": [[1, "mcaddon.file.Loader.load"]], "load() (mcaddon.file.schema method)": [[1, "mcaddon.file.Schema.load"]], "load() (mcaddon.pack.addon class method)": [[1, "mcaddon.pack.Addon.load"]], "load() (mcaddon.pack.behaviorpack class method)": [[1, "mcaddon.pack.BehaviorPack.load"]], "load() (mcaddon.pack.resourcepack class method)": [[1, "mcaddon.pack.ResourcePack.load"]], "load() (mcaddon.resrouce.texture class method)": [[1, "mcaddon.resrouce.Texture.load"]], "lock_template_options (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.lock_template_options"]], "looping (mcaddon.block.queuedtickingcomponent property)": [[1, "mcaddon.block.QueuedTickingComponent.looping"]], "loot_condition() (in module mcaddon.loot)": [[1, "mcaddon.loot.loot_condition"]], "loot_function() (in module mcaddon.loot)": [[1, "mcaddon.loot.loot_function"]], "loot_table (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.loot_table"]], "loot_table (mcaddon.loot.fillcontainerlootfunction property)": [[1, "mcaddon.loot.FillContainerLootFunction.loot_table"]], "looting_multiplier (mcaddon.loot.randomchancewithlootinglootcondition property)": [[1, "mcaddon.loot.RandomChanceWithLootingLootCondition.looting_multiplier"]], "lore (mcaddon.loot.setlorelootfunction property)": [[1, "mcaddon.loot.SetLoreLootFunction.lore"]], "luminance (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.luminance"]], "magenta (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.magenta"]], "main() (in module mcaddon.cli)": [[1, "mcaddon.cli.main"]], "major (mcaddon.util.version property)": [[1, "mcaddon.util.Version.major"]], "mame (mcaddon.recipe.materialreductionrecipeloader attribute)": [[1, "mcaddon.recipe.MaterialReductionRecipeLoader.mame"]], "manifest (mcaddon.pack.pack property)": [[1, "mcaddon.pack.Pack.manifest"]], "manifests (mcaddon.pack.addon property)": [[1, "mcaddon.pack.Addon.manifests"]], "mansion (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.mansion"]], "map_color (mcaddon.block.block property)": [[1, "mcaddon.block.Block.map_color"]], "map_color (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.map_color"]], "material_reducer (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.material_reducer"]], "materials (mcaddon.block.materialinstancescomponent property)": [[1, "mcaddon.block.MaterialInstancesComponent.materials"]], "max (mcaddon.loot.lootnumberprovider property)": [[1, "mcaddon.loot.LootNumberProvider.max"]], "max_chance (mcaddon.loot.randomregionaldifficultychancelootcondition property)": [[1, "mcaddon.loot.RandomRegionalDifficultyChanceLootCondition.max_chance"]], "max_count (mcaddon.item.item property)": [[1, "mcaddon.item.Item.max_count"]], "max_count (mcaddon.item.itemsettings attribute)": [[1, "mcaddon.item.ItemSettings.max_count"]], "max_damage (mcaddon.item.item property)": [[1, "mcaddon.item.Item.max_damage"]], "max_damage (mcaddon.item.itemsettings attribute)": [[1, "mcaddon.item.ItemSettings.max_damage"]], "max_draw_duration (mcaddon.item.shootercomponent property)": [[1, "mcaddon.item.ShooterComponent.max_draw_duration"]], "max_draw_duration (mcaddon.item.throwablecomponent property)": [[1, "mcaddon.item.ThrowableComponent.max_draw_duration"]], "max_durability (mcaddon.item.durabilitycomponent property)": [[1, "mcaddon.item.DurabilityComponent.max_durability"]], "max_launch_power (mcaddon.item.throwablecomponent property)": [[1, "mcaddon.item.ThrowableComponent.max_launch_power"]], "max_range (mcaddon.event.teleport property)": [[1, "mcaddon.event.Teleport.max_range"]], "mcaddon": [[1, "module-mcaddon"]], "mcaddon.block": [[1, "module-mcaddon.block"]], "mcaddon.camera": [[1, "module-mcaddon.camera"]], "mcaddon.cli": [[1, "module-mcaddon.cli"]], "mcaddon.constant": [[1, "module-mcaddon.constant"]], "mcaddon.event": [[1, "module-mcaddon.event"]], "mcaddon.exception": [[1, "module-mcaddon.exception"]], "mcaddon.file": [[1, "module-mcaddon.file"]], "mcaddon.item": [[1, "module-mcaddon.item"]], "mcaddon.loot": [[1, "module-mcaddon.loot"]], "mcaddon.manifest": [[1, "module-mcaddon.manifest"]], "mcaddon.pack": [[1, "module-mcaddon.pack"]], "mcaddon.recipe": [[1, "module-mcaddon.recipe"]], "mcaddon.registry": [[1, "module-mcaddon.registry"]], "mcaddon.resrouce": [[1, "module-mcaddon.resrouce"]], "mcaddon.state": [[1, "module-mcaddon.state"]], "mcaddon.text": [[1, "module-mcaddon.text"]], "mcaddon.util": [[1, "module-mcaddon.util"]], "mcaddon.volume": [[1, "module-mcaddon.volume"]], "menu_category (mcaddon.block.block property)": [[1, "mcaddon.block.Block.menu_category"]], "menu_category (mcaddon.item.item property)": [[1, "mcaddon.item.Item.menu_category"]], "merge() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.merge"]], "merge() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.merge"]], "metadata (mcaddon.manifest.manifest property)": [[1, "mcaddon.manifest.Manifest.metadata"]], "min (mcaddon.loot.lootnumberprovider property)": [[1, "mcaddon.loot.LootNumberProvider.min"]], "min_draw_duration (mcaddon.item.throwablecomponent property)": [[1, "mcaddon.item.ThrowableComponent.min_draw_duration"]], "min_engine_version (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.min_engine_version"]], "min_fall_distance (mcaddon.block.onfalloncomponent property)": [[1, "mcaddon.block.OnFallOnComponent.min_fall_distance"]], "mineshaft (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.mineshaft"]], "minimum_critical_power (mcaddon.item.projectilecomponent property)": [[1, "mcaddon.item.ProjectileComponent.minimum_critical_power"]], "minor (mcaddon.util.version property)": [[1, "mcaddon.util.Version.minor"]], "mob_amount (mcaddon.event.damage property)": [[1, "mcaddon.event.Damage.mob_amount"]], "module": [[1, "module-mcaddon"], [1, "module-mcaddon.block"], [1, "module-mcaddon.camera"], [1, "module-mcaddon.cli"], [1, "module-mcaddon.constant"], [1, "module-mcaddon.event"], [1, "module-mcaddon.exception"], [1, "module-mcaddon.file"], [1, "module-mcaddon.item"], [1, "module-mcaddon.loot"], [1, "module-mcaddon.manifest"], [1, "module-mcaddon.pack"], [1, "module-mcaddon.recipe"], [1, "module-mcaddon.registry"], [1, "module-mcaddon.resrouce"], [1, "module-mcaddon.state"], [1, "module-mcaddon.text"], [1, "module-mcaddon.util"], [1, "module-mcaddon.volume"], [2, "module-mcaddon.schemas"], [2, "module-mcaddon.schemas.block"], [2, "module-mcaddon.schemas.camera"], [2, "module-mcaddon.schemas.item"], [2, "module-mcaddon.schemas.manifest"], [2, "module-mcaddon.schemas.recipe"], [2, "module-mcaddon.schemas.volume"]], "modules (mcaddon.manifest.manifest property)": [[1, "mcaddon.manifest.Manifest.modules"]], "monument (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.monument"]], "movement_modifier (mcaddon.item.usemodifierscomponent property)": [[1, "mcaddon.item.UseModifiersComponent.movement_modifier"]], "name (mcaddon.block.blockdescriptor property)": [[1, "mcaddon.block.BlockDescriptor.name"]], "name (mcaddon.block.blockloader attribute)": [[1, "mcaddon.block.BlockLoader.name"]], "name (mcaddon.camera.camerapresetloader attribute)": [[1, "mcaddon.camera.CameraPresetLoader.name"]], "name (mcaddon.file.loader property)": [[1, "mcaddon.file.Loader.name"]], "name (mcaddon.item.itemloader attribute)": [[1, "mcaddon.item.ItemLoader.name"]], "name (mcaddon.loot.itementry property)": [[1, "mcaddon.loot.ItemEntry.name"]], "name (mcaddon.loot.lootentry property)": [[1, "mcaddon.loot.LootEntry.name"]], "name (mcaddon.loot.setnamelootfunction property)": [[1, "mcaddon.loot.SetNameLootFunction.name"]], "name (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.name"]], "name (mcaddon.manifest.manifest property)": [[1, "mcaddon.manifest.Manifest.name"]], "name (mcaddon.manifest.manifestloader attribute)": [[1, "mcaddon.manifest.ManifestLoader.name"]], "name (mcaddon.pack.pack property)": [[1, "mcaddon.pack.Pack.name"]], "name (mcaddon.recipe.brewingcontainerrecipeloader attribute)": [[1, "mcaddon.recipe.BrewingContainerRecipeLoader.name"]], "name (mcaddon.recipe.brewingmixrecipeloader attribute)": [[1, "mcaddon.recipe.BrewingMixRecipeLoader.name"]], "name (mcaddon.recipe.furnacerecipeloader attribute)": [[1, "mcaddon.recipe.FurnaceRecipeLoader.name"]], "name (mcaddon.recipe.shapedrecipeloader attribute)": [[1, "mcaddon.recipe.ShapedRecipeLoader.name"]], "name (mcaddon.recipe.shapelessrecipeloader attribute)": [[1, "mcaddon.recipe.ShapelessRecipeLoader.name"]], "name (mcaddon.recipe.smithingtransformrecipeloader attribute)": [[1, "mcaddon.recipe.SmithingTransformRecipeLoader.name"]], "name (mcaddon.recipe.smithingtrimrecipeloader attribute)": [[1, "mcaddon.recipe.SmithingTrimRecipeLoader.name"]], "name_key (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.name_key"]], "namespace (mcaddon.util.identifier property)": [[1, "mcaddon.util.Identifier.namespace"]], "nature (mcaddon.constant.category attribute)": [[1, "mcaddon.constant.Category.nature"]], "no_collision() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.no_collision"]], "none (mcaddon.constant.cameralistener attribute)": [[1, "mcaddon.constant.CameraListener.none"]], "none (mcaddon.constant.category attribute)": [[1, "mcaddon.constant.Category.none"]], "none() (mcaddon.util.box class method)": [[1, "mcaddon.util.Box.none"]], "north (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.north"]], "num_mip_levels (mcaddon.resrouce.terrainatlas property)": [[1, "mcaddon.resrouce.TerrainAtlas.num_mip_levels"]], "nutrition (mcaddon.item.foodcomponent property)": [[1, "mcaddon.item.FoodComponent.nutrition"]], "offset() (mcaddon.block.transformationcomponent class method)": [[1, "mcaddon.block.TransformationComponent.offset"]], "on_enter (mcaddon.volume.onactorentercomponent property)": [[1, "mcaddon.volume.OnActorEnterComponent.on_enter"]], "on_leave (mcaddon.volume.onactorleavecomponent property)": [[1, "mcaddon.volume.OnActorLeaveComponent.on_leave"]], "on_tick (mcaddon.block.queuedtickingcomponent property)": [[1, "mcaddon.block.QueuedTickingComponent.on_tick"]], "on_tick (mcaddon.block.randomtickingcomponent property)": [[1, "mcaddon.block.RandomTickingComponent.on_tick"]], "opaque (mcaddon.constant.rendermethod attribute)": [[1, "mcaddon.constant.RenderMethod.opaque"]], "orange (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.orange"]], "origin (mcaddon.util.box property)": [[1, "mcaddon.util.Box.origin"]], "other (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.other"]], "output (mcaddon.recipe.brewingcontainerrecipe property)": [[1, "mcaddon.recipe.BrewingContainerRecipe.output"]], "output (mcaddon.recipe.brewingmixrecipe property)": [[1, "mcaddon.recipe.BrewingMixRecipe.output"]], "output (mcaddon.recipe.furnacerecipe property)": [[1, "mcaddon.recipe.FurnaceRecipe.output"]], "output (mcaddon.recipe.materialreductionrecipe property)": [[1, "mcaddon.recipe.MaterialReductionRecipe.output"]], "oxidized (mcaddon.constant.oxidationlevel attribute)": [[1, "mcaddon.constant.OxidationLevel.oxidized"]], "packs (mcaddon.pack.addon property)": [[1, "mcaddon.pack.Addon.packs"]], "padding (mcaddon.resrouce.terrainatlas property)": [[1, "mcaddon.resrouce.TerrainAtlas.padding"]], "pages (mcaddon.loot.setbookcontentslootfunction property)": [[1, "mcaddon.loot.SetBookContentsLootFunction.pages"]], "parent (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.parent"]], "parse() (mcaddon.util.identifier class method)": [[1, "mcaddon.util.Identifier.of"]], "parse() (mcaddon.util.version class method)": [[1, "mcaddon.util.Version.of"]], "patch (mcaddon.util.version property)": [[1, "mcaddon.util.Version.patch"]], "path (mcaddon.resrouce.texture property)": [[1, "mcaddon.resrouce.Texture.path"]], "path (mcaddon.util.identifier property)": [[1, "mcaddon.util.Identifier.path"]], "pattern (mcaddon.recipe.shapedrecipe property)": [[1, "mcaddon.recipe.ShapedRecipe.pattern"]], "peaceful (mcaddon.loot.randomdifficultychancelootcondition property)": [[1, "mcaddon.loot.RandomDifficultyChanceLootCondition.peaceful"]], "per_level_cost (mcaddon.loot.enchantbookfortradinglootfunction property)": [[1, "mcaddon.loot.EnchantBookForTradingLootFunction.per_level_cost"]], "per_level_random_cost (mcaddon.loot.enchantbookfortradinglootfunction property)": [[1, "mcaddon.loot.EnchantBookForTradingLootFunction.per_level_random_cost"]], "permutations (mcaddon.block.block property)": [[1, "mcaddon.block.Block.permutations"]], "picture_duration (mcaddon.item.cameracomponent property)": [[1, "mcaddon.item.CameraComponent.picture_duration"]], "pillageroutpost (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.pillageroutpost"]], "pink (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.pink"]], "player (mcaddon.constant.cameralistener attribute)": [[1, "mcaddon.constant.CameraListener.player"]], "player (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.player"]], "player_effects (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.player_effects"]], "pool_entry() (in module mcaddon.loot)": [[1, "mcaddon.loot.pool_entry"]], "pools (mcaddon.loot.loottable property)": [[1, "mcaddon.loot.LootTable.pools"]], "pos_x (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.pos_x"]], "pos_y (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.pos_y"]], "pos_z (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.pos_z"]], "preview (mcaddon.constant.edition attribute)": [[1, "mcaddon.constant.Edition.preview"]], "priority (mcaddon.volume.fogcomponent property)": [[1, "mcaddon.volume.FogComponent.priority"]], "projectile_entity (mcaddon.item.projectilecomponent property)": [[1, "mcaddon.item.ProjectileComponent.projectile_entity"]], "protection (mcaddon.item.wearablecomponent property)": [[1, "mcaddon.item.WearableComponent.protection"]], "purple (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.purple"]], "quality (mcaddon.loot.leafentry property)": [[1, "mcaddon.loot.LeafEntry.quality"]], "rarity() (mcaddon.item.itemsettings method)": [[1, "mcaddon.item.ItemSettings.rarity"]], "readdir() (mcaddon.file.archivefile class method)": [[1, "mcaddon.file.ArchiveFile.readdir"]], "readdir() (mcaddon.pack.addon class method)": [[1, "mcaddon.pack.Addon.readdir"]], "readdir() (mcaddon.pack.behaviorpack class method)": [[1, "mcaddon.pack.BehaviorPack.readdir"]], "readdir() (mcaddon.pack.resourcepack class method)": [[1, "mcaddon.pack.ResourcePack.readdir"]], "readzip() (mcaddon.file.archivefile class method)": [[1, "mcaddon.file.ArchiveFile.readzip"]], "readzip() (mcaddon.pack.addon class method)": [[1, "mcaddon.pack.Addon.readzip"]], "readzip() (mcaddon.pack.behaviorpack class method)": [[1, "mcaddon.pack.BehaviorPack.readzip"]], "readzip() (mcaddon.pack.resourcepack class method)": [[1, "mcaddon.pack.ResourcePack.readzip"]], "reagent (mcaddon.recipe.brewingcontainerrecipe property)": [[1, "mcaddon.recipe.BrewingContainerRecipe.reagent"]], "reagent (mcaddon.recipe.brewingmixrecipe property)": [[1, "mcaddon.recipe.BrewingMixRecipe.reagent"]], "recipe_remainder (mcaddon.item.item property)": [[1, "mcaddon.item.Item.recipe_remainder"]], "recipe_remainder (mcaddon.item.itemsettings attribute)": [[1, "mcaddon.item.ItemSettings.recipe_remainder"]], "recipe_type() (in module mcaddon.recipe)": [[1, "mcaddon.recipe.recipe_type"]], "red (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.red"]], "register() (mcaddon.registry.registry method)": [[1, "mcaddon.registry.Registry.register"]], "register() (mcaddon.registry.registrykey method)": [[1, "mcaddon.registry.RegistryKey.register"]], "remove_ammunition() (mcaddon.item.shootercomponent method)": [[1, "mcaddon.item.ShooterComponent.remove_ammunition"]], "remove_author() (mcaddon.manifest.metadata method)": [[1, "mcaddon.manifest.Metadata.remove_author"]], "remove_block() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.remove_block"]], "remove_block() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.remove_block"]], "remove_bone() (mcaddon.block.bonevisabilitycomponent method)": [[1, "mcaddon.block.BoneVisabilityComponent.remove_bone"]], "remove_component() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.remove_component"]], "remove_component() (mcaddon.block.blockpermutation method)": [[1, "mcaddon.block.BlockPermutation.remove_component"]], "remove_component() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.remove_component"]], "remove_component() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.remove_component"]], "remove_condition() (mcaddon.block.placementfiltercomponent method)": [[1, "mcaddon.block.PlacementFilterComponent.remove_condition"]], "remove_condition() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.remove_condition"]], "remove_condition() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.remove_condition"]], "remove_condition() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.remove_condition"]], "remove_crafting_tag() (mcaddon.block.craftingtablecomponent method)": [[1, "mcaddon.block.CraftingTableComponent.remove_crafting_tag"]], "remove_dependency() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.remove_dependency"]], "remove_entry() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.remove_entry"]], "remove_event() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.remove_event"]], "remove_event() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.remove_event"]], "remove_event() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.remove_event"]], "remove_event() (mcaddon.volume.onactorentercomponent method)": [[1, "mcaddon.volume.OnActorEnterComponent.remove_event"]], "remove_event() (mcaddon.volume.onactorleavecomponent method)": [[1, "mcaddon.volume.OnActorLeaveComponent.remove_event"]], "remove_event() (mcaddon.volume.volume method)": [[1, "mcaddon.volume.Volume.remove_event"]], "remove_face() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.remove_face"]], "remove_file() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.remove_file"]], "remove_filter() (mcaddon.block.filter method)": [[1, "mcaddon.block.Filter.remove_filter"]], "remove_function() (mcaddon.loot.leafentry method)": [[1, "mcaddon.loot.LeafEntry.remove_function"]], "remove_function() (mcaddon.loot.lootpool method)": [[1, "mcaddon.loot.LootPool.remove_function"]], "remove_function() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.remove_function"]], "remove_ingredient() (mcaddon.recipe.shapelessrecipe method)": [[1, "mcaddon.recipe.ShapelessRecipe.remove_ingredient"]], "remove_item() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.remove_item"]], "remove_item() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.remove_item"]], "remove_item_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.remove_item_texture"]], "remove_key() (mcaddon.recipe.shapedrecipe method)": [[1, "mcaddon.recipe.ShapedRecipe.remove_key"]], "remove_material() (mcaddon.block.materialinstancescomponent method)": [[1, "mcaddon.block.MaterialInstancesComponent.remove_material"]], "remove_module() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.remove_module"]], "remove_pack() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.remove_pack"]], "remove_permutation() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.remove_permutation"]], "remove_pool() (mcaddon.loot.loottable method)": [[1, "mcaddon.loot.LootTable.remove_pool"]], "remove_recipe() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.remove_recipe"]], "remove_state() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.remove_state"]], "remove_tag() (mcaddon.block.blocktagscomponent method)": [[1, "mcaddon.block.BlockTagsComponent.remove_tag"]], "remove_tag() (mcaddon.recipe.recipe method)": [[1, "mcaddon.recipe.Recipe.remove_tag"]], "remove_terrain_texture() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.remove_terrain_texture"]], "remove_trait() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.remove_trait"]], "remove_volume() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.remove_volume"]], "render_method (mcaddon.block.material property)": [[1, "mcaddon.block.Material.render_method"]], "repair_items (mcaddon.item.repairablecomponent property)": [[1, "mcaddon.item.RepairableComponent.repair_items"]], "replace() (mcaddon.util.identifier method)": [[1, "mcaddon.util.Identifier.replace"]], "replicate (mcaddon.resrouce.flipbooktexture property)": [[1, "mcaddon.resrouce.FlipbookTexture.replicate"]], "resistance (mcaddon.block.block property)": [[1, "mcaddon.block.Block.resistance"]], "resistance (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.resistance"]], "resource() (mcaddon.manifest.manifest class method)": [[1, "mcaddon.manifest.Manifest.resource"]], "resources (mcaddon.constant.moduletype attribute)": [[1, "mcaddon.constant.ModuleType.resources"]], "resources() (mcaddon.manifest.module class method)": [[1, "mcaddon.manifest.Module.resources"]], "result (mcaddon.recipe.recipe property)": [[1, "mcaddon.recipe.Recipe.result"]], "result (mcaddon.recipe.smithingtransformrecipe property)": [[1, "mcaddon.recipe.SmithingTransformRecipe.result"]], "rolls (mcaddon.loot.lootpool property)": [[1, "mcaddon.loot.LootPool.rolls"]], "rot_x (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.rot_x"]], "rot_y (mcaddon.camera.camerapreset property)": [[1, "mcaddon.camera.CameraPreset.rot_y"]], "rotate() (mcaddon.block.transformationcomponent class method)": [[1, "mcaddon.block.TransformationComponent.rotate"]], "rotation (mcaddon.block.transformationcomponent property)": [[1, "mcaddon.block.TransformationComponent.rotation"]], "ruins (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.ruins"]], "saturation_modifier (mcaddon.item.foodcomponent property)": [[1, "mcaddon.item.FoodComponent.saturation_modifier"]], "save() (mcaddon.file.archivefile method)": [[1, "mcaddon.file.ArchiveFile.save"]], "save() (mcaddon.file.file method)": [[1, "mcaddon.file.File.save"]], "save() (mcaddon.resrouce.texture method)": [[1, "mcaddon.resrouce.Texture.save"]], "scale (mcaddon.block.transformationcomponent property)": [[1, "mcaddon.block.TransformationComponent.scale"]], "scale_power_by_draw_duration (mcaddon.item.shootercomponent property)": [[1, "mcaddon.item.ShooterComponent.scale_power_by_draw_duration"]], "scale_power_by_draw_duration (mcaddon.item.throwablecomponent property)": [[1, "mcaddon.item.ThrowableComponent.scale_power_by_draw_duration"]], "scaled() (mcaddon.block.transformationcomponent class method)": [[1, "mcaddon.block.TransformationComponent.scaled"]], "schema() (mcaddon.file.schema method)": [[1, "mcaddon.file.Schema.schema"]], "schemafile (mcaddon.file.schema property)": [[1, "mcaddon.file.Schema.schemafile"]], "schemas (mcaddon.file.loader property)": [[1, "mcaddon.file.Loader.schemas"]], "seconds_to_destroy (mcaddon.block.destructiblebyminingcomponent property)": [[1, "mcaddon.block.DestructibleByMiningComponent.seconds_to_destroy"]], "selector (mcaddon.constant.lootcontexttype attribute)": [[1, "mcaddon.constant.LootContextType.selector"]], "self (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.self"]], "set_condition() (mcaddon.event.sequence method)": [[1, "mcaddon.event.Sequence.set_condition"]], "set_count() (mcaddon.item.itemsettings method)": [[1, "mcaddon.item.ItemSettings.set_count"]], "set_damage() (mcaddon.item.itemsettings method)": [[1, "mcaddon.item.ItemSettings.set_damage"]], "set_details() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.set_details"]], "set_hardness() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.set_hardness"]], "set_luminance() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.set_luminance"]], "set_module() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.set_module"]], "set_recipe_remainder() (mcaddon.item.itemsettings method)": [[1, "mcaddon.item.ItemSettings.set_recipe_remainder"]], "set_resistance() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.set_resistance"]], "set_slipperiness() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.set_slipperiness"]], "set_uuids() (mcaddon.manifest.manifest method)": [[1, "mcaddon.manifest.Manifest.set_uuids"]], "set_uuids() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.set_uuids"]], "setup() (mcaddon.file.archivefile method)": [[1, "mcaddon.file.ArchiveFile.setup"]], "setup() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.setup"]], "setup() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.setup"]], "setup() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.setup"]], "shipwreck (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.shipwreck"]], "shutter_duration (mcaddon.item.cameracomponent property)": [[1, "mcaddon.item.CameraComponent.shutter_duration"]], "shutter_screen_ratio (mcaddon.item.cameracomponent property)": [[1, "mcaddon.item.CameraComponent.shutter_screen_ratio"]], "side (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.side"]], "size (mcaddon.util.box property)": [[1, "mcaddon.util.Box.size"]], "slide_away_duration (mcaddon.item.cameracomponent property)": [[1, "mcaddon.item.CameraComponent.slide_away_duration"]], "slipperiness (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.slipperiness"]], "slot (mcaddon.item.enchantablecomponent property)": [[1, "mcaddon.item.EnchantableComponent.slot"]], "slot (mcaddon.item.wearablecomponent property)": [[1, "mcaddon.item.WearableComponent.slot"]], "smithing_table (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.smithing_table"]], "smoker (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.smoker"]], "soul_campfire (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.soul_campfire"]], "sound (mcaddon.event.playsound property)": [[1, "mcaddon.event.PlaySound.sound"]], "sound_event (mcaddon.item.recordcomponent property)": [[1, "mcaddon.item.RecordComponent.sound_event"]], "sound_group (mcaddon.block.block property)": [[1, "mcaddon.block.Block.sound_group"]], "sound_group (mcaddon.block.blocksettings attribute)": [[1, "mcaddon.block.BlockSettings.sound_group"]], "sounds() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.sounds"]], "south (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.south"]], "split() (mcaddon.util.identifier method)": [[1, "mcaddon.util.Identifier.split"]], "stack() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.stack"]], "stack() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.stack"]], "startfile() (mcaddon.file.importable method)": [[1, "mcaddon.file.Importable.startfile"]], "state() (in module mcaddon.state)": [[1, "mcaddon.state.state"]], "states (mcaddon.block.block property)": [[1, "mcaddon.block.Block.states"]], "states (mcaddon.block.blockdescriptor property)": [[1, "mcaddon.block.BlockDescriptor.states"]], "states (mcaddon.event.setblockstate property)": [[1, "mcaddon.event.SetBlockProperty.states"]], "stonecutter (mcaddon.constant.recipetag attribute)": [[1, "mcaddon.constant.RecipeTag.stonecutter"]], "strength() (mcaddon.block.blocksettings method)": [[1, "mcaddon.block.BlockSettings.strength"]], "stringify() (in module mcaddon.util)": [[1, "mcaddon.util.stringify"]], "stronghold (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.stronghold"]], "suffix (mcaddon.pack.behaviorpack attribute)": [[1, "mcaddon.pack.BehaviorPack.suffix"]], "suffix (mcaddon.pack.pack property)": [[1, "mcaddon.pack.Pack.suffix"]], "suffix (mcaddon.pack.resourcepack attribute)": [[1, "mcaddon.pack.ResourcePack.suffix"]], "table (mcaddon.event.spawnloot property)": [[1, "mcaddon.event.SpawnLoot.table"]], "table_name (mcaddon.block.craftingtablecomponent property)": [[1, "mcaddon.block.CraftingTableComponent.table_name"]], "tag (mcaddon.recipe.ingredient property)": [[1, "mcaddon.recipe.Ingredient.tag"]], "tags (mcaddon.block.blockdescriptor property)": [[1, "mcaddon.block.BlockDescriptor.tags"]], "tags (mcaddon.block.blocktagscomponent property)": [[1, "mcaddon.block.BlockTagsComponent.tags"]], "tags (mcaddon.item.tagscomponent property)": [[1, "mcaddon.item.TagsComponent.tags"]], "tags (mcaddon.recipe.recipe property)": [[1, "mcaddon.recipe.Recipe.tags"]], "target (mcaddon.constant.eventtarget attribute)": [[1, "mcaddon.constant.EventTarget.target"]], "target (mcaddon.event.event property)": [[1, "mcaddon.event.Event.target"]], "target (mcaddon.event.trigger property)": [[1, "mcaddon.event.Trigger.target"]], "template (mcaddon.recipe.smithingtransformrecipe property)": [[1, "mcaddon.recipe.SmithingTransformRecipe.template"]], "template (mcaddon.recipe.smithingtrimrecipe property)": [[1, "mcaddon.recipe.SmithingTrimRecipe.template"]], "temple (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.temple"]], "terrain (mcaddon.constant.texturetype attribute)": [[1, "mcaddon.constant.TextureType.terrain"]], "texts (mcaddon.pack.pack property)": [[1, "mcaddon.pack.Pack.texts"]], "texture (mcaddon.block.material property)": [[1, "mcaddon.block.Material.texture"]], "texture (mcaddon.item.iconcomponent property)": [[1, "mcaddon.item.IconComponent.texture"]], "ticks_per_frame (mcaddon.resrouce.flipbooktexture property)": [[1, "mcaddon.resrouce.FlipbookTexture.ticks_per_frame"]], "tiers (mcaddon.loot.lootpool property)": [[1, "mcaddon.loot.LootPool.tiers"]], "title (mcaddon.loot.setbookcontentslootfunction property)": [[1, "mcaddon.loot.SetBookContentsLootFunction.title"]], "traits (mcaddon.block.block property)": [[1, "mcaddon.block.Block.traits"]], "transform (mcaddon.event.transformiiem property)": [[1, "mcaddon.event.TransformiIem.transform"]], "translation (mcaddon.block.transformationcomponent property)": [[1, "mcaddon.block.TransformationComponent.translation"]], "translation_key() (mcaddon.block.block method)": [[1, "mcaddon.block.Block.translation_key"]], "translation_key() (mcaddon.item.item method)": [[1, "mcaddon.item.Item.translation_key"]], "treasure (mcaddon.loot.enchantrandomlylootfunction property)": [[1, "mcaddon.loot.EnchantRandomlyLootFunction.treasure"]], "treasure (mcaddon.loot.enchantwithlevelslootfunction property)": [[1, "mcaddon.loot.EnchantWithLevelsLootFunction.treasure"]], "type (mcaddon.block.block property)": [[1, "mcaddon.block.Block.type"]], "type (mcaddon.event.damage property)": [[1, "mcaddon.event.Damage.type"]], "type (mcaddon.loot.loottable property)": [[1, "mcaddon.loot.LootTable.type"]], "type (mcaddon.loot.setbannerdetailslootfunction property)": [[1, "mcaddon.loot.SetBannerDetailsLootFunction.type"]], "type (mcaddon.manifest.module property)": [[1, "mcaddon.manifest.Module.type"]], "unaffected (mcaddon.constant.oxidationlevel attribute)": [[1, "mcaddon.constant.OxidationLevel.unaffected"]], "up (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.up"]], "url (mcaddon.manifest.metadata property)": [[1, "mcaddon.manifest.Metadata.url"]], "use_duration (mcaddon.item.usemodifierscomponent property)": [[1, "mcaddon.item.UseModifiersComponent.use_duration"]], "use_efficiency (mcaddon.item.diggercomponent property)": [[1, "mcaddon.item.DiggerComponent.use_efficiency"]], "use_on (mcaddon.item.blockplacercomponent property)": [[1, "mcaddon.item.BlockPlacerComponent.use_on"]], "use_on (mcaddon.item.entityplacercomponent property)": [[1, "mcaddon.item.EntityPlacerComponent.use_on"]], "using_converts_to (mcaddon.item.foodcomponent property)": [[1, "mcaddon.item.FoodComponent.using_converts_to"]], "uuid (mcaddon.manifest.dependency property)": [[1, "mcaddon.manifest.Dependency.uuid"]], "uuid (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.uuid"]], "uuid (mcaddon.manifest.module property)": [[1, "mcaddon.manifest.Module.uuid"]], "validate() (mcaddon.file.loader method)": [[1, "mcaddon.file.Loader.validate"]], "value (mcaddon.block.frictioncomponent property)": [[1, "mcaddon.block.FrictionComponent.value"]], "value (mcaddon.block.simpleblockcomponent property)": [[1, "mcaddon.block.SimpleBlockComponent.value"]], "value (mcaddon.item.enchantablecomponent property)": [[1, "mcaddon.item.EnchantableComponent.value"]], "value (mcaddon.item.itemdisplaynamecomponent property)": [[1, "mcaddon.item.ItemDisplayNameComponent.value"]], "value (mcaddon.item.simpleitemcomponent property)": [[1, "mcaddon.item.SimpleItemComponent.value"]], "value (mcaddon.loot.hasmarkvariantlootcondition property)": [[1, "mcaddon.loot.HasMarkvariantLootCondition.value"]], "values (mcaddon.loot.randomauxvaluelootfunction property)": [[1, "mcaddon.loot.RandomAuxValueLootFunction.values"]], "values (mcaddon.loot.randomblockstatelootfunction property)": [[1, "mcaddon.loot.RandomBlockPropertyLootFunction.values"]], "values (mcaddon.state.blockstate property)": [[1, "mcaddon.state.BlockProperty.values"]], "values() (mcaddon.registry.registrykey method)": [[1, "mcaddon.registry.RegistryKey.values"]], "version (mcaddon.file.schema property)": [[1, "mcaddon.file.Schema.version"]], "version (mcaddon.manifest.dependency property)": [[1, "mcaddon.manifest.Dependency.version"]], "version (mcaddon.manifest.header property)": [[1, "mcaddon.manifest.Header.version"]], "version (mcaddon.manifest.module property)": [[1, "mcaddon.manifest.Module.version"]], "versions (mcaddon.pack.pack property)": [[1, "mcaddon.pack.Pack.versions"]], "vertical_half() (mcaddon.block.placementpositiontrait class method)": [[1, "mcaddon.block.PlacementPositionTrait.vertical_half"]], "village (mcaddon.constant.destination attribute)": [[1, "mcaddon.constant.Destination.village"]], "volume_component_type() (in module mcaddon.volume)": [[1, "mcaddon.volume.volume_component_type"]], "weathered (mcaddon.constant.oxidationlevel attribute)": [[1, "mcaddon.constant.OxidationLevel.weathered"]], "weight (mcaddon.loot.leafentry property)": [[1, "mcaddon.loot.LeafEntry.weight"]], "west (mcaddon.constant.blockface attribute)": [[1, "mcaddon.constant.BlockFace.west"]], "white (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.white"]], "world_template (mcaddon.constant.moduletype attribute)": [[1, "mcaddon.constant.ModuleType.world_template"]], "world_template() (mcaddon.manifest.manifest class method)": [[1, "mcaddon.manifest.Manifest.world_template"]], "world_template() (mcaddon.manifest.module class method)": [[1, "mcaddon.manifest.Module.world_template"]], "write() (mcaddon.file.file method)": [[1, "mcaddon.file.File.write"]], "write() (mcaddon.file.jsonfile method)": [[1, "mcaddon.file.JsonFile.write"]], "write() (mcaddon.file.pngfile method)": [[1, "mcaddon.file.PngFile.write"]], "writedir() (mcaddon.file.archivefile method)": [[1, "mcaddon.file.ArchiveFile.writedir"]], "writedir() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.writedir"]], "writedir() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.writedir"]], "writedir() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.writedir"]], "writedir() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.writedir"]], "writezip() (mcaddon.file.archivefile method)": [[1, "mcaddon.file.ArchiveFile.writezip"]], "writezip() (mcaddon.pack.addon method)": [[1, "mcaddon.pack.Addon.writezip"]], "writezip() (mcaddon.pack.behaviorpack method)": [[1, "mcaddon.pack.BehaviorPack.writezip"]], "writezip() (mcaddon.pack.pack method)": [[1, "mcaddon.pack.Pack.writezip"]], "writezip() (mcaddon.pack.resourcepack method)": [[1, "mcaddon.pack.ResourcePack.writezip"]], "y_rotation_offset (mcaddon.block.placementdirectiontrait property)": [[1, "mcaddon.block.PlacementDirectionTrait.y_rotation_offset"]], "yellow (mcaddon.constant.color attribute)": [[1, "mcaddon.constant.Color.yellow"]], "blockschema1 (class in mcaddon.schemas.block)": [[2, "mcaddon.schemas.block.BlockSchema1"]], "brewingcontainerschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.BrewingContainerSchem1"]], "brewingmixschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.BrewingMixSchem1"]], "camerapresetschem1 (class in mcaddon.schemas.camera)": [[2, "mcaddon.schemas.camera.CameraPresetSchem1"]], "furnaceschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.FurnaceSchem1"]], "itemschema1 (class in mcaddon.schemas.item)": [[2, "mcaddon.schemas.item.ItemSchema1"]], "itemschema2 (class in mcaddon.schemas.item)": [[2, "mcaddon.schemas.item.ItemSchema2"]], "manifestschema1 (class in mcaddon.schemas.manifest)": [[2, "mcaddon.schemas.manifest.ManifestSchema1"]], "materialreductionschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.MaterialReductionSchem1"]], "shapedschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.ShapedSchem1"]], "shapelessschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.ShapelessSchem1"]], "smithingtransformschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.SmithingTransformSchem1"]], "smithingtransformschem2 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.SmithingTransformSchem2"]], "smithingtrimschem1 (class in mcaddon.schemas.recipe)": [[2, "mcaddon.schemas.recipe.SmithingTrimSchem1"]], "volumeschema1 (class in mcaddon.schemas.volume)": [[2, "mcaddon.schemas.volume.VolumeSchema1"]], "load() (mcaddon.schemas.block.blockschema1 method)": [[2, "mcaddon.schemas.block.BlockSchema1.load"]], "load() (mcaddon.schemas.camera.camerapresetschem1 method)": [[2, "mcaddon.schemas.camera.CameraPresetSchem1.load"]], "load() (mcaddon.schemas.item.itemschema1 method)": [[2, "mcaddon.schemas.item.ItemSchema1.load"]], "load() (mcaddon.schemas.item.itemschema2 method)": [[2, "mcaddon.schemas.item.ItemSchema2.load"]], "load() (mcaddon.schemas.manifest.manifestschema1 method)": [[2, "mcaddon.schemas.manifest.ManifestSchema1.load"]], "load() (mcaddon.schemas.recipe.brewingcontainerschem1 method)": [[2, "mcaddon.schemas.recipe.BrewingContainerSchem1.load"]], "load() (mcaddon.schemas.recipe.brewingmixschem1 method)": [[2, "mcaddon.schemas.recipe.BrewingMixSchem1.load"]], "load() (mcaddon.schemas.recipe.furnaceschem1 method)": [[2, "mcaddon.schemas.recipe.FurnaceSchem1.load"]], "load() (mcaddon.schemas.recipe.materialreductionschem1 method)": [[2, "mcaddon.schemas.recipe.MaterialReductionSchem1.load"]], "load() (mcaddon.schemas.recipe.shapedschem1 method)": [[2, "mcaddon.schemas.recipe.ShapedSchem1.load"]], "load() (mcaddon.schemas.recipe.shapelessschem1 method)": [[2, "mcaddon.schemas.recipe.ShapelessSchem1.load"]], "load() (mcaddon.schemas.recipe.smithingtransformschem1 method)": [[2, "mcaddon.schemas.recipe.SmithingTransformSchem1.load"]], "load() (mcaddon.schemas.recipe.smithingtransformschem2 method)": [[2, "mcaddon.schemas.recipe.SmithingTransformSchem2.load"]], "load() (mcaddon.schemas.recipe.smithingtrimschem1 method)": [[2, "mcaddon.schemas.recipe.SmithingTrimSchem1.load"]], "load() (mcaddon.schemas.volume.volumeschema1 method)": [[2, "mcaddon.schemas.volume.VolumeSchema1.load"]], "mcaddon.schemas": [[2, "module-mcaddon.schemas"]], "mcaddon.schemas.block": [[2, "module-mcaddon.schemas.block"]], "mcaddon.schemas.camera": [[2, "module-mcaddon.schemas.camera"]], "mcaddon.schemas.item": [[2, "module-mcaddon.schemas.item"]], "mcaddon.schemas.manifest": [[2, "module-mcaddon.schemas.manifest"]], "mcaddon.schemas.recipe": [[2, "module-mcaddon.schemas.recipe"]], "mcaddon.schemas.volume": [[2, "module-mcaddon.schemas.volume"]]}}) \ No newline at end of file diff --git a/mcaddon.egg-info/PKG-INFO b/mcaddon.egg-info/PKG-INFO index 7e14d95..517bc39 100644 --- a/mcaddon.egg-info/PKG-INFO +++ b/mcaddon.egg-info/PKG-INFO @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: mcaddon -Version: 0.0.2 +Version: 0.0.3 Summary: Minecraft: Bedrock Edition development kit Home-page: https://github.com/legopitstop/mcaddon/ Author: Legopitstop @@ -47,6 +47,9 @@ Update existing installation: `pip3 install mcaddon --upgrade` | [`commentjson`](https://pypi.org/project/commentjson/) | Add Python and JavaScript style comments in your JSON files. | | [`jsonschema`](https://pypi.org/project/jsonschema/) | An implementation of JSON Schema validation for Python | | [`chevron`](https://pypi.org/project/chevron/) | Mustache templating language renderer | +| [`Pillow`](https://pypi.org/project/pillow/) | Python Imaging Library (Fork) | +| [`numpy`](https://pypi.org/project/numpy/) | Fundamental package for array computing in Python | +| [`PyGLM`](https://pypi.org/project/PyGLM/) | OpenGL Mathematics library for Python | ## Our Goal? @@ -65,7 +68,7 @@ from mcaddon import * blk = Block('test:on_interact_change_state_block') blk.add_component(OnInteractComponent(event='test_event')) -blk.add_event('test_event', SetBlockState({'custom:direction': "1"})) +blk.add_event('test_event', SetBlockProperty({'custom:direction': "1"})) blk.save('block.json') ``` @@ -85,6 +88,13 @@ blk.save('item.json') ## Command-line interface ``` +usage: mcaddon [-h] [-V] [-W []] + +options: + -h, --help show this help message and exit + -V, --version print the mcaddon version number and exit. + -W [], --watch [] + Watches this Python file for changes. ``` ## Road map @@ -94,44 +104,46 @@ blk.save('item.json') - [ ] animations - [ ] attachables - [ ] biomes_client.json - - [ ] blocks.json - - [ ] cameras + - [ ] block models - [ ] entity - [ ] flipbook_textures.json - [ ] font - - [ ] item_textures.json - [ ] materials - - [ ] models - [ ] particles - [ ] pieces - [ ] render_controllers - [ ] sounds - [ ] sounds.json - - [ ] terrain_textures.json - [ ] texture set - - [ ] textures - [ ] ui + - [x] blocks.json + - [x] entity models + - [x] item_textures.json + - [x] terrain_textures.json - [x] texts + - [x] textures - Behavior packs - - [ ] cameras - [ ] entities - - [ ] feature_rules - - [ ] features - [ ] spawn_rules - [ ] structures - - [ ] trading - [x] blocks + - [x] cameras + - [x] feature_rules + - [x] features - [x] items - [x] loot_tables - [x] recipes - [x] texts + - [x] trading - [x] volume + - [x] block_culling - Skin packs - [x] Addons - contents.json - cli - update mcaddon/mcpack -- Support to load all format versions. (At least all versions that are used in vanilla packs) +- [x] Support to load all format versions. (At least all versions that are used in vanilla packs) - Support to import packs. (for both singleplayer and on dedicated server) +- Make Model and Texture support common 3D rendering libraries; pygame, moderngl, etc - Toolchain to load packs - scripting - Convert Python to the Official Minecraft [Scripting and API](https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/minecraft-server?view=minecraft-bedrock-stable). diff --git a/mcaddon.egg-info/SOURCES.txt b/mcaddon.egg-info/SOURCES.txt index 3c4565a..047a27e 100644 --- a/mcaddon.egg-info/SOURCES.txt +++ b/mcaddon.egg-info/SOURCES.txt @@ -5,21 +5,28 @@ setup.py mcaddon/__init__.py mcaddon/__main__.py mcaddon/block.py +mcaddon/block_culling.py mcaddon/camera.py mcaddon/cli.py mcaddon/constant.py mcaddon/event.py mcaddon/exception.py +mcaddon/feature.py +mcaddon/feature_rule.py mcaddon/file.py +mcaddon/geometry.py mcaddon/item.py mcaddon/loot.py mcaddon/manifest.py +mcaddon/math.py mcaddon/pack.py +mcaddon/predicate.py mcaddon/recipe.py mcaddon/registry.py mcaddon/resrouce.py mcaddon/state.py mcaddon/text.py +mcaddon/trading.py mcaddon/util.py mcaddon/volume.py mcaddon.egg-info/PKG-INFO @@ -29,10 +36,93 @@ mcaddon.egg-info/entry_points.txt mcaddon.egg-info/not-zip-safe mcaddon.egg-info/requires.txt mcaddon.egg-info/top_level.txt +mcaddon/data/schemas/block1.json +mcaddon/data/schemas/block_culling1.json +mcaddon/data/schemas/camera1.json +mcaddon/data/schemas/common.json +mcaddon/data/schemas/feature_rules1.json +mcaddon/data/schemas/geometry1.json +mcaddon/data/schemas/item1.json +mcaddon/data/schemas/item2.json +mcaddon/data/schemas/manifest1.json +mcaddon/data/schemas/volume1.json +mcaddon/data/schemas/feature/aggregate.json +mcaddon/data/schemas/feature/beards_and_shavers.json +mcaddon/data/schemas/feature/cave_carver.json +mcaddon/data/schemas/feature/conditional_list.json +mcaddon/data/schemas/feature/fossil.json +mcaddon/data/schemas/feature/geode.json +mcaddon/data/schemas/feature/growing_plant.json +mcaddon/data/schemas/feature/multiface.json +mcaddon/data/schemas/feature/nether_cave_carver.json +mcaddon/data/schemas/feature/ore.json +mcaddon/data/schemas/feature/partially_exposed_blob.json +mcaddon/data/schemas/feature/rect_layout.json +mcaddon/data/schemas/feature/scan_surface.json +mcaddon/data/schemas/feature/scatter.json +mcaddon/data/schemas/feature/sculk_patch.json +mcaddon/data/schemas/feature/search.json +mcaddon/data/schemas/feature/sequence.json +mcaddon/data/schemas/feature/single_block.json +mcaddon/data/schemas/feature/snap_to_surface.json +mcaddon/data/schemas/feature/structure_template.json +mcaddon/data/schemas/feature/surface_relative_threshold.json +mcaddon/data/schemas/feature/tree.json +mcaddon/data/schemas/feature/underwater_cave_carver.json +mcaddon/data/schemas/feature/vegetation_patch.json +mcaddon/data/schemas/feature/weighted_random.json +mcaddon/data/schemas/recipe/brewing_container1.json +mcaddon/data/schemas/recipe/brewing_mix1.json +mcaddon/data/schemas/recipe/furnace1.json +mcaddon/data/schemas/recipe/material_reduction1.json +mcaddon/data/schemas/recipe/shaped1.json +mcaddon/data/schemas/recipe/shapeless1.json +mcaddon/data/schemas/recipe/smithing_transform1.json +mcaddon/data/schemas/recipe/smithing_transform2.json +mcaddon/data/schemas/recipe/smithing_trim1.json +mcaddon/experimental/__init__.py +mcaddon/experimental/animation.py +mcaddon/experimental/animation_controller.py +mcaddon/experimental/attachable.py +mcaddon/experimental/biome.py +mcaddon/experimental/client_biome.py +mcaddon/experimental/entity.py +mcaddon/experimental/fog.py +mcaddon/experimental/particle.py +mcaddon/experimental/piece.py +mcaddon/experimental/render_controller.py +mcaddon/experimental/spawn_rule.py +mcaddon/experimental/structure.py +mcaddon/experimental/texture_set.py +mcaddon/experimental/ui.py +mcaddon/ext/__init__.py +mcaddon/ext/extra.py +mcaddon/ext/mgl.py +mcaddon/ext/ui_creator.py mcaddon/schemas/__init__.py mcaddon/schemas/block.py +mcaddon/schemas/block_culling.py mcaddon/schemas/camera.py +mcaddon/schemas/feature.py +mcaddon/schemas/feature_rule.py +mcaddon/schemas/geometry.py mcaddon/schemas/item.py mcaddon/schemas/manifest.py mcaddon/schemas/recipe.py -mcaddon/schemas/volume.py \ No newline at end of file +mcaddon/schemas/volume.py +tests/__init__.py +tests/test_addon.py +tests/test_block.py +tests/test_block_culling.py +tests/test_camera.py +tests/test_feature.py +tests/test_feature_rule.py +tests/test_geometry.py +tests/test_item.py +tests/test_loot.py +tests/test_ops.py +tests/test_read_addon.py +tests/test_read_pack.py +tests/test_recipe.py +tests/test_trading.py +tests/test_volume.py \ No newline at end of file diff --git a/mcaddon.egg-info/requires.txt b/mcaddon.egg-info/requires.txt index b631b6c..eb444e5 100644 --- a/mcaddon.egg-info/requires.txt +++ b/mcaddon.egg-info/requires.txt @@ -4,3 +4,6 @@ commentjson jsonschema chevron Pillow +numpy +PyGLM +watchdog diff --git a/mcaddon.egg-info/top_level.txt b/mcaddon.egg-info/top_level.txt index 46f6218..e5a0566 100644 --- a/mcaddon.egg-info/top_level.txt +++ b/mcaddon.egg-info/top_level.txt @@ -1 +1,2 @@ mcaddon +tests diff --git a/mcaddon/__init__.py b/mcaddon/__init__.py index abbcace..c877540 100644 --- a/mcaddon/__init__.py +++ b/mcaddon/__init__.py @@ -5,7 +5,7 @@ import os import sys -__version__ = "0.0.2" +__version__ = "0.0.4" # Unused for now if sys.platform == "win32": @@ -33,11 +33,17 @@ EDU_APPDATA_PATH = None VERSION = { - "MANIFEST": 1, - "BLOCK": "1.20.51", + "MANIFEST": 2, + "BLOCK": "1.20.50", + "BLOCK_CULLING_RULES": "1.20.60", "BLOCKS": "1.16.220", - "ITEM": "1.20.51", + "ITEM": "1.20.50", "VOLUME": "1.20.50", + "CAMERA": "1.20.50", + "RECIPE": "1.20.50", + "FEATURE": "1.16.0", + "FEATURE_RULE": "1.12", + "GEOMETRY": "1.12.0", "MIN_ENGINE_VERSION": [1, 20, 51], } @@ -45,25 +51,49 @@ from .registry import * from .constant import * from .file import * +from .math import * from .util import * +from .predicate import * -from .manifest import * -from .resrouce import * from .pack import * +from .text import * +from .resrouce import * +from .manifest import * + +# ResourcePack +from .geometry import * + +# from .client_entity import * +# from .particle import * +# from .material import * +# from .render_controller import * +# from .ui import * +# from .client_item import * +# from .piece import * +# from .animation_controllers import * +# from .animation import * +# from .camera_entity import * +# from . import * +# from . import * + +# BehaviorPack from .event import * from .loot import * -from .block import * from .state import * +from .block import * +from .block_culling import * from .item import * from .recipe import * from .volume import * from .camera import * +from .trading import * +from .feature import * +from .feature_rule import * -# from .animation import * -# from .biome import * # from .entity import * -# from .feature import * -# from .fog import * -# from .particle import * -# from .texture_set import * -# from .volume import * +# from .behavior_tree import * +# from .spawn_rule import * +# from .structure import * + +# SkinPack +# from .skin import * diff --git a/mcaddon/__pycache__/__init__.cpython-311.pyc b/mcaddon/__pycache__/__init__.cpython-311.pyc index 3f2babb..9009e60 100644 Binary files a/mcaddon/__pycache__/__init__.cpython-311.pyc and b/mcaddon/__pycache__/__init__.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/block.cpython-311.pyc b/mcaddon/__pycache__/block.cpython-311.pyc index 293ddf7..6a10b51 100644 Binary files a/mcaddon/__pycache__/block.cpython-311.pyc and b/mcaddon/__pycache__/block.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/block_culling.cpython-311.pyc b/mcaddon/__pycache__/block_culling.cpython-311.pyc new file mode 100644 index 0000000..3f1e5a8 Binary files /dev/null and b/mcaddon/__pycache__/block_culling.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/camera.cpython-311.pyc b/mcaddon/__pycache__/camera.cpython-311.pyc index 1a5dc6f..ec3e7b1 100644 Binary files a/mcaddon/__pycache__/camera.cpython-311.pyc and b/mcaddon/__pycache__/camera.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/cli.cpython-311.pyc b/mcaddon/__pycache__/cli.cpython-311.pyc index 47f04c0..17d00a7 100644 Binary files a/mcaddon/__pycache__/cli.cpython-311.pyc and b/mcaddon/__pycache__/cli.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/constant.cpython-311.pyc b/mcaddon/__pycache__/constant.cpython-311.pyc index baad2b6..41c1057 100644 Binary files a/mcaddon/__pycache__/constant.cpython-311.pyc and b/mcaddon/__pycache__/constant.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/event.cpython-311.pyc b/mcaddon/__pycache__/event.cpython-311.pyc index c4585c3..9325fa7 100644 Binary files a/mcaddon/__pycache__/event.cpython-311.pyc and b/mcaddon/__pycache__/event.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/exception.cpython-311.pyc b/mcaddon/__pycache__/exception.cpython-311.pyc index 1ef9c24..39c33e6 100644 Binary files a/mcaddon/__pycache__/exception.cpython-311.pyc and b/mcaddon/__pycache__/exception.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/feature.cpython-311.pyc b/mcaddon/__pycache__/feature.cpython-311.pyc new file mode 100644 index 0000000..41d36c2 Binary files /dev/null and b/mcaddon/__pycache__/feature.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/feature_rule.cpython-311.pyc b/mcaddon/__pycache__/feature_rule.cpython-311.pyc new file mode 100644 index 0000000..a721160 Binary files /dev/null and b/mcaddon/__pycache__/feature_rule.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/file.cpython-311.pyc b/mcaddon/__pycache__/file.cpython-311.pyc index 70339d6..311f27c 100644 Binary files a/mcaddon/__pycache__/file.cpython-311.pyc and b/mcaddon/__pycache__/file.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/geometry.cpython-311.pyc b/mcaddon/__pycache__/geometry.cpython-311.pyc new file mode 100644 index 0000000..ed6d9e4 Binary files /dev/null and b/mcaddon/__pycache__/geometry.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/item.cpython-311.pyc b/mcaddon/__pycache__/item.cpython-311.pyc index f320e32..e5388f8 100644 Binary files a/mcaddon/__pycache__/item.cpython-311.pyc and b/mcaddon/__pycache__/item.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/loot.cpython-311.pyc b/mcaddon/__pycache__/loot.cpython-311.pyc index 025cd9f..7ed08e4 100644 Binary files a/mcaddon/__pycache__/loot.cpython-311.pyc and b/mcaddon/__pycache__/loot.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/manifest.cpython-311.pyc b/mcaddon/__pycache__/manifest.cpython-311.pyc index e4f8b33..123f64c 100644 Binary files a/mcaddon/__pycache__/manifest.cpython-311.pyc and b/mcaddon/__pycache__/manifest.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/math.cpython-311.pyc b/mcaddon/__pycache__/math.cpython-311.pyc new file mode 100644 index 0000000..3eb8c50 Binary files /dev/null and b/mcaddon/__pycache__/math.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/pack.cpython-311.pyc b/mcaddon/__pycache__/pack.cpython-311.pyc index b167276..14038ca 100644 Binary files a/mcaddon/__pycache__/pack.cpython-311.pyc and b/mcaddon/__pycache__/pack.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/predicate.cpython-311.pyc b/mcaddon/__pycache__/predicate.cpython-311.pyc new file mode 100644 index 0000000..92aaaa6 Binary files /dev/null and b/mcaddon/__pycache__/predicate.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/recipe.cpython-311.pyc b/mcaddon/__pycache__/recipe.cpython-311.pyc index 1b8da77..de69e92 100644 Binary files a/mcaddon/__pycache__/recipe.cpython-311.pyc and b/mcaddon/__pycache__/recipe.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/registry.cpython-311.pyc b/mcaddon/__pycache__/registry.cpython-311.pyc index 46b3c36..c40740f 100644 Binary files a/mcaddon/__pycache__/registry.cpython-311.pyc and b/mcaddon/__pycache__/registry.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/resrouce.cpython-311.pyc b/mcaddon/__pycache__/resrouce.cpython-311.pyc index fea37a5..9fb1e14 100644 Binary files a/mcaddon/__pycache__/resrouce.cpython-311.pyc and b/mcaddon/__pycache__/resrouce.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/state.cpython-311.pyc b/mcaddon/__pycache__/state.cpython-311.pyc index 591b46f..bf63009 100644 Binary files a/mcaddon/__pycache__/state.cpython-311.pyc and b/mcaddon/__pycache__/state.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/text.cpython-311.pyc b/mcaddon/__pycache__/text.cpython-311.pyc index 8bcf0b0..655784d 100644 Binary files a/mcaddon/__pycache__/text.cpython-311.pyc and b/mcaddon/__pycache__/text.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/trading.cpython-311.pyc b/mcaddon/__pycache__/trading.cpython-311.pyc new file mode 100644 index 0000000..4739357 Binary files /dev/null and b/mcaddon/__pycache__/trading.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/ui.cpython-311.pyc b/mcaddon/__pycache__/ui.cpython-311.pyc new file mode 100644 index 0000000..28aa693 Binary files /dev/null and b/mcaddon/__pycache__/ui.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/util.cpython-311.pyc b/mcaddon/__pycache__/util.cpython-311.pyc index 466e44e..4adf6a8 100644 Binary files a/mcaddon/__pycache__/util.cpython-311.pyc and b/mcaddon/__pycache__/util.cpython-311.pyc differ diff --git a/mcaddon/__pycache__/volume.cpython-311.pyc b/mcaddon/__pycache__/volume.cpython-311.pyc index cbad471..c448647 100644 Binary files a/mcaddon/__pycache__/volume.cpython-311.pyc and b/mcaddon/__pycache__/volume.cpython-311.pyc differ diff --git a/mcaddon/block.py b/mcaddon/block.py index d0c5130..5096b52 100644 --- a/mcaddon/block.py +++ b/mcaddon/block.py @@ -3,14 +3,28 @@ from dataclasses import dataclass from . import VERSION +from .pack import behavior_pack, resource_pack, ResourcePack from .exception import ComponentNotFoundError -from .item import ItemStack from .registry import INSTANCE, Registries -from .constant import RenderMethod, BlockFace +from .constant import RenderMethod, BlockFace, MapColor from .file import JsonFile, Loader -from .util import getattr2, stringify, Box, Identifier, MenuCategory, Identifiable +from .math import Vector3, Range +from .util import ( + getattr2, + setattr2, + stringify, + clearitems, + removeitem, + getitem, + additem, + Misc, + Box, + Identifier, + MenuCategory, + Identifiable, +) from .state import ( - BlockState, + BlockProperty, CardinalDirectionState, FacingDirectionState, BlockFaceState, @@ -19,32 +33,59 @@ from .event import * -class BlockComponent: +class BlockComponent(Misc): def __repr__(self): - return str(self) + return "BlockComponent{" + str(self.id) + "}" def __str__(self) -> str: - return "BlockComponent{" + str(self.id) + "}" + return str(self.id) - @classmethod - def from_dict(cls, data: dict) -> Self: + def __call__(self, ctx) -> int: + return self.execute(ctx) + + @property + def id(self) -> Identifier: + return getattr(self, "_id") + + @id.setter + def id(self, value: Identifier): + setattr(self, "_id", Identifier.of(value)) + + @staticmethod + def from_dict(data: dict) -> Self: raise NotImplementedError() + def execute(self, ctx) -> int: + return 0 + + def generate(self, ctx) -> None: + """ + Called when this component is added to the Block + + :type ctx: Block + """ + ... + class SimpleBlockComponent(BlockComponent): def __init__(self, value): self.value = value - @property - def __dict__(self): + def jsonify(self): data = self.value return data - @classmethod - def from_dict(cls, data) -> Self: - self = cls.__new__(cls) - self.value = data - return self + @staticmethod + def from_dict(data) -> Self: + return SimpleBlockComponent(data) + + @property + def clazz(self): + return getattr(self, "_clazz", None) + + @clazz.setter + def clazz(self, value): + setattr(self, "_clazz", value) @property def value(self): @@ -52,10 +93,11 @@ def value(self): @value.setter def value(self, value): - if not isinstance(value, self.clazz): + if self.clazz is not None and not isinstance(value, self.clazz): raise TypeError( f"Expected {self.clazz.__name__} but got '{value.__class__.__name__}' instead" ) + self.on_update("value", value) setattr(self, "_value", value) @@ -77,7 +119,7 @@ def wrapper(): @block_component_type class OnFallOnComponent(Trigger, BlockComponent): - """Describes event for this block.""" + """Describes event for this block. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blocktriggers/minecraftblock_on_fall_on?view=minecraft-bedrock-stable)""" id = Identifier("on_fall_on") @@ -91,19 +133,19 @@ def __init__( Trigger.__init__(self, event, condition, target) self.min_fall_distance = min_fall_distance - @property - def __dict__(self): - data = super().__dict__ + def jsonify(self): + data = super().jsonify() if self.min_fall_distance is not None: data["min_fall_distance"] = self.min_fall_distance return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = super().from_dict(data) - if "min_fall_distance" in data: - self.min_fall_distance = data.pop("min_fall_distance") - return self + @staticmethod + def from_dict(data: dict) -> Self: + min_fall_distance = ( + data.pop("min_fall_distance") if "min_fall_distance" in data else 0 + ) + tr = Trigger(**data) + return OnFallOnComponent(tr.event, min_fall_distance, tr.condition, tr.target) @property def min_fall_distance(self) -> float: @@ -113,14 +155,14 @@ def min_fall_distance(self) -> float: @min_fall_distance.setter def min_fall_distance(self, value: float): if value is None: - setattr(self, "_min_fall_distance", None) return + self.on_update("min_fall_distance", float(value)) setattr(self, "_min_fall_distance", float(value)) @block_component_type class OnInteractComponent(Trigger, BlockComponent): - """Describes event for this block.""" + """Describes event for this block. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blocktriggers/minecraftblock_on_interact?view=minecraft-bedrock-stable)""" id = Identifier("on_interact") @@ -132,7 +174,7 @@ def __init__( @block_component_type class OnPlacedComponent(Trigger, BlockComponent): - """Describes event for this block.""" + """Describes event for this block. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blocktriggers/minecraftblock_on_placed?view=minecraft-bedrock-stable)""" id = Identifier("on_placed") @@ -144,7 +186,7 @@ def __init__( @block_component_type class OnPlayerDestroyedComponent(Trigger, BlockComponent): - """Describes event for this block.""" + """Describes event for this block. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blocktriggers/minecraftblock_on_player_destroyed?view=minecraft-bedrock-stable)""" id = Identifier("on_player_destroyed") @@ -159,7 +201,7 @@ def __init__( @block_component_type class OnPlayerPlacingComponent(Trigger, BlockComponent): - """Describes event for this block.""" + """Describes event for this block. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blocktriggers/minecraftblock_on_player_placing?view=minecraft-bedrock-stable)""" id = Identifier("on_player_placing") @@ -174,7 +216,7 @@ def __init__( @block_component_type class OnStepOffComponent(Trigger, BlockComponent): - """Describes event for this block.""" + """Describes event for this block. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blocktriggers/minecraftblock_on_step_off?view=minecraft-bedrock-stable)""" id = Identifier("on_step_off") @@ -186,7 +228,7 @@ def __init__( @block_component_type class OnStepOnComponent(Trigger, BlockComponent): - """Describes event for this block.""" + """Describes event for this block. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blocktriggers/minecraftblock_on_step_on?view=minecraft-bedrock-stable)""" id = Identifier("on_step_on") @@ -200,23 +242,20 @@ def __init__( class BoneVisabilityComponent(BlockComponent): """Tells whether the bone should be visible or not (value).""" - id = Identifier("bone_visability") + id = Identifier("bone_visibility") def __init__(self, bones: dict[str, Molang | bool] = None): self.bones = bones - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"bones": {}} for k, v in self.bones.items(): data["bones"][k] = str(v) return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.bones = data.pop("bones") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return BoneVisabilityComponent(**data) @property def bones(self) -> dict[str, Molang | bool]: @@ -224,131 +263,136 @@ def bones(self) -> dict[str, Molang | bool]: @bones.setter def bones(self, value: dict[str, Molang | bool]): - if value is None: - self.bones = {} - return - if not isinstance(value, dict): - raise TypeError( - f"Expected dict[str, Molang|bool] but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_bones", value) + self.on_update("bones", value) + setattr2(self, "_bones", value, dict) def get_bone(self, bone: str) -> Molang | None: - return self.bones.get(bone) + return getitem(self, "bones", bone) def add_bone(self, bone: str, condition: Molang) -> Molang: - self.bones[bone] = Molang(condition) - return condition + return additem(self, "bones", Molang(condition), bone, Molang) def remove_bone(self, bone: str) -> Molang: - return self.bones.pop(bone) + return removeitem(self, "bones", bone) def clear_bones(self) -> Self: - self.bones = {} - return self + """Remove all bones""" + return clearitems(self, "bones") @block_component_type class BreathabilityComponent(SimpleBlockComponent): + """""" + id = Identifier("breathability") clazz = str @block_component_type class CollisionBoxComponent(BlockComponent, Box): - """Defines the area of the block that collides with entities. If set to true, default values are used. If set to false, the block's collision with entities is disabled. If this component is omitted, default values are used.""" + """Defines the area of the block that collides with entities. If set to true, default values are used. If set to false, the block's collision with entities is disabled. If this component is omitted, default values are used. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_collision_box?view=minecraft-bedrock-stable)""" id = Identifier("collision_box") - def __init__(self, origin: list | bool = None, size: list = None): + def __init__( + self, + origin: Vector3 | bool = Vector3(-8, 0 - 8), + size: Vector3 = Vector3(16, 16, 16), + ): if isinstance(origin, bool): if origin: - origin = [-8, 0, -8] - size = [16, 16, 16] + origin = Vector3(-8, 0, -8) + size = Vector3(16, 16, 16) else: - origin = [0, 0, 0] - size = [0, 0, 0] + origin = Vector3(0, 0, 0) + size = Vector3(0, 0, 0) Box.__init__(self, origin, size) - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().as_dict() if self.is_cube(): return True elif self.is_none(): return False return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) + @staticmethod + def from_dict(data: dict) -> Self: if isinstance(data, bool): - return cls.cube() if data else cls.none() + return ( + CollisionBoxComponent.cube() if data else CollisionBoxComponent.none() + ) + origin = None if "origin" in data: - self.origin = data.pop("origin") + origin = Vector3(*data.pop("origin")) + size = None if "size" in data: - self.size = data.pop("size") - return self + size = Vector3(*data.pop("size")) + return CollisionBoxComponent(origin, size) @block_component_type class SelectionBoxComponent(BlockComponent, Box): - """Defines the area of the block that is selected by the player's cursor. If set to true, default values are used. If set to false, this block is not selectable by the player's cursor. If this component is omitted, default values are used.""" + """Defines the area of the block that is selected by the player's cursor. If set to true, default values are used. If set to false, this block is not selectable by the player's cursor. If this component is omitted, default values are used. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_selection_box?view=minecraft-bedrock-stable)""" id = Identifier("selection_box") - def __init__(self, origin: list | bool = None, size: list = None): + def __init__( + self, + origin: Vector3 | bool = Vector3(-8, 0, -8), + size: Vector3 = Vector3(16, 16, 16), + ): if isinstance(origin, bool): if origin: - origin = [-8, 0, -8] - size = [16, 16, 16] + origin = Vector3(-8, 0, -8) + size = Vector3(16, 16, 16) else: - origin = [0, 0, 0] - size = [0, 0, 0] + origin = Vector3(0, 0, 0) + size = Vector3(0, 0, 0) Box.__init__(self, origin, size) - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().as_dict() if self.is_cube(): return True elif self.is_none(): return False return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) + @staticmethod + def from_dict(data: dict) -> Self: if isinstance(data, bool): - return cls.cube() if data else cls.none() + return ( + SelectionBoxComponent.cube() if data else SelectionBoxComponent.none() + ) + origin = None if "origin" in data: - self.origin = data.pop("origin") + origin = Vector3(*data.pop("origin")) + size = None if "size" in data: - self.size = data.pop("size") - return self + size = Vector3(*data.pop("size")) + return SelectionBoxComponent(origin, size) @block_component_type class CraftingTableComponent(BlockComponent): - """Makes your block into a custom crafting table which enables the crafting table UI and the ability to craft recipes. This component supports only "recipe_shaped" and "recipe_shapeless" typed recipes and not others like "recipe_furnace" or "recipe_brewing_mix". If there are two recipes for one item, the recipe book will pick the first that was parsed. If two input recipes are the same, crafting may assert and the resulting item may vary.""" + """Makes your block into a custom crafting table which enables the crafting table UI and the ability to craft recipes. This component supports only "recipe_shaped" and "recipe_shapeless" typed recipes and not others like "recipe_furnace" or "recipe_brewing_mix". If there are two recipes for one item, the recipe book will pick the first that was parsed. If two input recipes are the same, crafting may assert and the resulting item may vary. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_crafting_table?view=minecraft-bedrock-stable)""" id = Identifier("crafting_table") - def __init__(self, table_name: str, crafting_tags: list[str] = []): + def __init__(self, table_name: str, crafting_tags: list[str] = None): self.table_name = table_name self.crafting_tags = crafting_tags - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"crafting_tags": self.crafting_tags, "table_name": self.table_name} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.crafting_tags = data.pop("crafting_tags") - self.table_name = data.pop("table_name") - return self + @staticmethod + def from_dict(data: dict) -> Self: + table_name = data.pop("table_name") + crafting_tags = data.pop("crafting_tags") + return CraftingTableComponent(table_name, crafting_tags) @property def crafting_tags(self) -> list[str]: @@ -357,14 +401,8 @@ def crafting_tags(self) -> list[str]: @crafting_tags.setter def crafting_tags(self, value: list[str]): - if value is None: - self.crafting_tags = [] - return - if not isinstance(value, list): - raise TypeError( - f"Expected list[str] but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_crafting_tags", value) + self.on_update("crafting_tags", value) + setattr2(self, "_crafting_tags", value, list) @property def table_name(self) -> str: @@ -373,6 +411,7 @@ def table_name(self) -> str: @table_name.setter def table_name(self, value: str): + self.on_update("table_name", str(value)) setattr(self, "_table_name", str(value)) def get_crafting_tag(self, index: int) -> str | None: @@ -392,26 +431,20 @@ def clear_crafting_tags(self) -> Self: @block_component_type class DestructibleByExplosionComponent(BlockComponent): - """Describes the destructible by explosion properties for this block. If set to true, the block will have the default explosion resistance. If set to false, this block is indestructible by explosion. If the component is omitted, the block will have the default explosion resistance""" + """Describes the destructible by explosion properties for this block. If set to true, the block will have the default explosion resistance. If set to false, this block is indestructible by explosion. If the component is omitted, the block will have the default explosion resistance [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_destructible_by_explosion?view=minecraft-bedrock-stable)""" id = Identifier("destructible_by_explosion") def __init__(self, explosion_resistance: float = None): self.explosion_resistance = explosion_resistance - @property - def __dict__(self) -> dict: - data = {} - if self.explosion_resistance is not None: - data["explosion_resistance"] = self.explosion_resistance + def jsonify(self) -> dict: + data = {"explosion_resistance": self.explosion_resistance} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - if "explosion_resistance" in data: - self.explosion_resistance = data.pop("explosion_resistance") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return DestructibleByExplosionComponent(**data) @property def explosion_resistance(self) -> float: @@ -421,37 +454,31 @@ def explosion_resistance(self) -> float: @explosion_resistance.setter def explosion_resistance(self, value: float): if value is None: - setattr(self, "_explosion_resistance", value) return if not isinstance(value, (float, int)): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) + self.on_update("explosion_resistance", value) setattr(self, "_explosion_resistance", value) @block_component_type class DestructibleByMiningComponent(BlockComponent): - """Describes the destructible by mining properties for this block. If set to true, the block will take the default number of seconds to destroy. If set to false, this block is indestructible by mining. If the component is omitted, the block will take the default number of seconds to destroy.""" + """Describes the destructible by mining properties for this block. If set to true, the block will take the default number of seconds to destroy. If set to false, this block is indestructible by mining. If the component is omitted, the block will take the default number of seconds to destroy. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_destructible_by_mining?view=minecraft-bedrock-stable)""" id = Identifier("destructible_by_mining") def __init__(self, seconds_to_destroy: float = None): self.seconds_to_destroy = seconds_to_destroy - @property - def __dict__(self) -> dict: - data = {} - if self.seconds_to_destroy is not None: - data["seconds_to_destroy"] = self.seconds_to_destroy + def jsonify(self) -> dict: + data = {"seconds_to_destroy": self.seconds_to_destroy} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - if "seconds_to_destroy" in data: - self.seconds_to_destroy = data.pop("seconds_to_destroy") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return DestructibleByMiningComponent(**data) @property def seconds_to_destroy(self) -> float: @@ -461,18 +488,18 @@ def seconds_to_destroy(self) -> float: @seconds_to_destroy.setter def seconds_to_destroy(self, value: float): if value is None: - setattr(self, "_seconds_to_destroy", None) return if not isinstance(value, (float, int)): raise TypeError( f"Expected float or int but got '{value.__class__.__name__}' instead" ) + self.on_update("seconds_to_destroy", value) setattr(self, "_seconds_to_destroy", value) @block_component_type class BlockDisplayNameComponent(SimpleBlockComponent): - """Specifies the language file key that maps to what text will be displayed when you hover over the block in your inventory and hotbar. If the string given can not be resolved as a loc string, the raw string given will be displayed. If this component is omitted, the name of the block will be used as the display name.""" + """Specifies the language file key that maps to what text will be displayed when you hover over the block in your inventory and hotbar. If the string given can not be resolved as a loc string, the raw string given will be displayed. If this component is omitted, the name of the block will be used as the display name. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_display_name?view=minecraft-bedrock-stable)""" id = Identifier("display_name") clazz = str @@ -480,7 +507,7 @@ class BlockDisplayNameComponent(SimpleBlockComponent): @block_component_type class FlammableComponent(BlockComponent): - """Describes the flammable properties for this block. If set to true, default values are used. If set to false, or if this component is omitted, the block will not be able to catch on fire naturally from neighbors, but it can still be directly ignited.""" + """Describes the flammable properties for this block. If set to true, default values are used. If set to false, or if this component is omitted, the block will not be able to catch on fire naturally from neighbors, but it can still be directly ignited. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_flammable?view=minecraft-bedrock-stable)""" id = Identifier("flammable") @@ -490,8 +517,7 @@ def __init__( self.catch_chance_modifier = catch_chance_modifier self.destroy_chance_modifier = destroy_chance_modifier - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {} if self.catch_chance_modifier is not None: data["catch_chance_modifier"] = self.catch_chance_modifier @@ -499,14 +525,15 @@ def __dict__(self) -> dict: data["destroy_chance_modifier"] = self.destroy_chance_modifier return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) + @staticmethod + def from_dict(data: dict) -> Self: + catch_chance_modifier = None + destroy_chance_modifier = None if "catch_chance_modifier" in data: - self.catch_chance_modifier = data.pop("catch_chance_modifier") + catch_chance_modifier = data.pop("catch_chance_modifier") if "destroy_chance_modifier" in data: - self.destroy_chance_modifier = data.pop("destroy_chance_modifier") - return self + destroy_chance_modifier = data.pop("destroy_chance_modifier") + return FlammableComponent(catch_chance_modifier, destroy_chance_modifier) @property def catch_chance_modifier(self) -> int: @@ -516,12 +543,12 @@ def catch_chance_modifier(self) -> int: @catch_chance_modifier.setter def catch_chance_modifier(self, value: int): if value is None: - setattr(self, "_catch_chance_modifier", None) return if not isinstance(value, int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("catch_chance_modifier", value) setattr(self, "_catch_chance_modifier", value) @property @@ -532,18 +559,18 @@ def destroy_chance_modifier(self) -> int: @destroy_chance_modifier.setter def destroy_chance_modifier(self, value: int): if value is None: - setattr(self, "_destroy_chance_modifier", None) return if not isinstance(value, int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("destroy_chance_modifier", value) setattr(self, "_destroy_chance_modifier", value) @block_component_type class FrictionComponent(BlockComponent): - """Describes the friction for this block in a range of (0.0-0.9). Friction affects an entity's movement speed when it travels on the block. Greater value results in more friction.""" + """Describes the friction for this block in a range of (0.0-0.9). Friction affects an entity's movement speed when it travels on the block. Greater value results in more friction. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_friction?view=minecraft-bedrock-stable)""" id = Identifier("friction") clazz = float @@ -551,14 +578,11 @@ class FrictionComponent(BlockComponent): def __init__(self, value: float): self.value = value - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.value = data - return self + @staticmethod + def from_dict(data: dict) -> Self: + return FrictionComponent(data) - @property - def __dict__(self) -> int: + def jsonify(self) -> int: data = 0.4 if self.value is None else self.value return data @@ -572,40 +596,49 @@ def value(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) + self.on_update("value", value) setattr(self, "_value", value) @block_component_type class GeometryComponent(BlockComponent): - """The description identifier of the geometry file to use to render this block. This identifier must match an existing geometry identifier in any of the currently loaded resource packs.""" + """The description identifier of the geometry file to use to render this block. This identifier must match an existing geometry identifier in any of the currently loaded resource packs. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_geometry?view=minecraft-bedrock-stable)""" id = Identifier("geometry") - def __init__(self, geometry: str, bone_visability: dict[str, Molang | bool] = {}): + def __init__( + self, + geometry: str, + bone_visibility: dict[str, Molang | bool] = None, + culling: Identifiable = None, + ): self.geometry = geometry - self.bone_visability = bone_visability + self.bone_visibility = bone_visibility + self.culling = culling - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"identifier": self.geometry} - if self.bone_visability: - data["bone_visability"] = {} - for k, v in self.bone_visability.items(): - data["bone_visability"][k] = str(v) - else: + if self.bone_visibility: + data["bone_visibility"] = {} + for k, v in self.bone_visibility.items(): + data["bone_visibility"][k] = str(v) + if self.culling: + data["culling"] = str(self.culling) + if not self.bone_visibility and not self.culling: return str(self.geometry) return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) + @staticmethod + def from_dict(data: dict) -> Self: if isinstance(data, str): - self.geometry = data + return GeometryComponent(data) elif isinstance(data, dict): - self.geometry = data.pop("identifier") - if "bone_visability" in data: - self.bone_visability = data.pop("bone_visability") - return self + geometry = data.pop("identifier") + bone_visibility = ( + data.pop("bone_visibility") if "bone_visibility" in data else {} + ) + culling = data.pop("culling") if "culling" in data else None + return GeometryComponent(geometry, bone_visibility, culling) @property def geometry(self) -> str: @@ -613,53 +646,54 @@ def geometry(self) -> str: @geometry.setter def geometry(self, value: str): + self.on_update("geometry", str(value)) setattr(self, "_geometry", str(value)) @property - def bone_visability(self) -> dict[str, Molang | bool]: - return getattr(self, "_bone_visability", {}) + def bone_visibility(self) -> dict[str, Molang | bool]: + return getattr(self, "_bone_visibility", {}) - @bone_visability.setter - def bone_visability(self, value: dict[str, Molang | bool]): - if value is None: - self.bone_visability = {} - return - if not isinstance(value, dict): - raise TypeError( - f"Expected dict but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_bone_visability", value) + @bone_visibility.setter + def bone_visibility(self, value: dict[str, Molang | bool]): + self.on_update("bone_visibility", value) + setattr2(self, "_bone_visibility", value, dict) + + @property + def culling(self) -> Identifier: + return getattr(self, "_culling") + + @culling.setter + def culling(self, value: Identifiable): + setattr(self, "_culling", Identifiable.of(value)) @block_component_type class LightDampeningComponent(SimpleBlockComponent): - """The amount that light will be dampened when it passes through the block, in a range (0-15). Higher value means the light will be dampened more.""" + """The amount that light will be dampened when it passes through the block, in a range (0-15). Higher value means the light will be dampened more. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_light_dampening?view=minecraft-bedrock-stable)""" id = Identifier("light_dampening") clazz = int - @property - def __dict__(self) -> int: + def jsonify(self) -> int: data = 15 if self.value is None else self.value return data @block_component_type class LightEmissionComponent(SimpleBlockComponent): - """The amount of light this block will emit in a range (0-15). Higher value means more light will be emitted.""" + """The amount of light this block will emit in a range (0-15). Higher value means more light will be emitted. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_light_emission?view=minecraft-bedrock-stable)""" id = Identifier("light_emission") clazz = int - @property - def __dict__(self) -> str: + def jsonify(self) -> str: data = 0 if self.value is None else self.value return data @block_component_type class LootComponent(SimpleBlockComponent): - """The path to the loot table, relative to the behavior pack. Path string is limited to 256 characters.""" + """The path to the loot table, relative to the behavior pack. Path string is limited to 256 characters. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_loot?view=minecraft-bedrock-stable)""" id = Identifier("loot") clazz = str @@ -670,20 +704,46 @@ def empty(cls) -> Self: @block_component_type -class MapColorComponent(SimpleBlockComponent): - """Sets the color of the block when rendered to a map. The color is represented as a hex value in the format "#RRGGBB". May also be expressed as an array of [R, G, B] from 0 to 255. If this component is omitted, the block will not show up on the map.""" +class MapColorComponent(BlockComponent): + """Sets the color of the block when rendered to a map. The color is represented as a hex value in the format "#RRGGBB". May also be expressed as an array of [R, G, B] from 0 to 255. If this component is omitted, the block will not show up on the map. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_map_color?view=minecraft-bedrock-stable)""" id = Identifier("map_color") - clazz = str + def __init__(self, value: MapColor | int): + self.value = value -class Material: + def jsonify(self) -> dict: + return hex(self.value).replace("0x", "#") + + @staticmethod + def from_dict(data: dict) -> Self: + return MapColorComponent(data) + + @property + def value(self) -> int: + return getattr(self, "_value") + + @value.setter + def value(self, value: int | MapColor): + if isinstance(value, MapColor): + value = value._value_ + if isinstance(value, str): + value = int(value.replace("#", "0x"), 16) + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + self.on_update("value", value) + setattr(self, "_value", value) + + +class Material(Misc): """A material instance definition to map to a material instance in a geometry file. The material instance "*" will be used for any materials that don't have a match.""" def __init__( self, - texture: Identifier, - render_method: RenderMethod = RenderMethod.opaque, + texture: Identifiable, + render_method: RenderMethod = RenderMethod.OPAQUE, ambient_occlusion: bool = True, face_dimming: bool = True, ): @@ -692,28 +752,19 @@ def __init__( self.face_dimming = face_dimming self.render_method = render_method - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"texture": str(self.texture)} - if self.render_method not in [None, RenderMethod.opaque]: - data["render_method"] = self.render_method._value_ + if self.render_method not in [None, RenderMethod.OPAQUE]: + data["render_method"] = self.render_method.jsonify() if self.ambient_occlusion not in [None, True]: data["ambient_occlusion"] = self.ambient_occlusion if self.face_dimming not in [None, True]: data["face_dimming"] = self.face_dimming return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.texture = data.pop("texture") - if "ambient_occlusion" in data: - self.ambient_occlusion = data.pop("ambient_occlusion") - if "face_dimming" in data: - self.face_dimming = data.pop("face_dimming") - if "render_method" in data: - self.render_method = data.pop("render_method") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return Material(**data) @property def texture(self) -> Identifier: @@ -721,8 +772,10 @@ def texture(self) -> Identifier: return getattr(self, "_texture") @texture.setter - def texture(self, value: Identifier): - setattr(self, "_texture", Identifier(value)) + def texture(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("texture", id) + setattr(self, "_texture", id) @property def ambient_occlusion(self) -> bool: @@ -738,6 +791,7 @@ def ambient_occlusion(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("ambient_occlusion", value) setattr(self, "_ambient_occlusion", value) @property @@ -754,6 +808,7 @@ def face_dimming(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("face_dimming", value) setattr(self, "_face_dimming", value) @property @@ -774,36 +829,35 @@ def render_method(self) -> RenderMethod: @render_method.setter def render_method(self, value: RenderMethod): if value is None: - setattr(self, "_render_method", None) return if isinstance(value, RenderMethod): + self.on_update("render_method", value) setattr(self, "_render_method", value) else: - self.render_method = RenderMethod[str(value)] + self.render_method = RenderMethod.from_dict(value) @block_component_type class MaterialInstancesComponent(BlockComponent): - """The material instances for a block. Maps face or material_instance names in a geometry file to an actual material instance. You can assign a material instance object to any of these faces: "up", "down", "north", "south", "east", "west", or "*". You can also give an instance the name of your choosing such as "my_instance", and then assign it to a face by doing "north":"my_instance".""" + """The material instances for a block. Maps face or material_instance names in a geometry file to an actual material instance. You can assign a material instance object to any of these faces: "up", "down", "north", "south", "east", "west", or "*". You can also give an instance the name of your choosing such as "my_instance", and then assign it to a face by doing "north":"my_instance". [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_material_instances?view=minecraft-bedrock-stable)""" id = Identifier("material_instances") def __init__(self, materials: dict[str, Material] = None): - self.materials = {} + self.materials = materials - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {} for k, v in self.materials.items(): - data[k] = v.__dict__ + data[k] = v.jsonify() return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) + @staticmethod + def from_dict(data: dict) -> Self: + materials = {} for k, v in data.items(): - self.materials[k] = Material.from_dict(v) - return self + materials[k] = Material.from_dict(v) + return MaterialInstancesComponent(materials) @property def materials(self) -> dict[str, Material]: @@ -811,14 +865,8 @@ def materials(self) -> dict[str, Material]: @materials.setter def materials(self, value: dict[str, Material]): - if value is None: - setattr(self, "_materials", {}) - return - if not isinstance(value, dict): - raise TypeError( - f"Expected dict[str, Material] but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_materials", value) + self.on_update("materials", value) + setattr2(self, "_materials", value, dict) def get_material(self, instance_name: str) -> Material | None: return self.materials.get(instance_name) @@ -841,14 +889,13 @@ def remove_material(self, instance_name: str) -> Material: return m -class BlockDescriptor: - def __init__(self, name: str = None, states: list = None, tags: str = "1"): +class BlockDescriptor(Misc): + def __init__(self, name: Identifiable = None, states: dict = None, tags: str = "1"): self.name = name self.states = states self.tags = tags - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {} if self.name: data["name"] = str(self.name) @@ -860,13 +907,9 @@ def __dict__(self) -> dict: data = data["name"] return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.name = data.pop("name") - self.states = data.pop("states") - self.tags = data.pop("tags") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return BlockDescriptor(**data) @property def name(self) -> Identifier: @@ -874,27 +917,20 @@ def name(self) -> Identifier: return getattr(self, "_name", None) @name.setter - def name(self, value: Identifier): - if value is None: - setattr(self, "_name", None) - return - setattr(self, "_name", Identifier(value)) + def name(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("name", id) + setattr(self, "_name", id) @property def states(self) -> list: """The list of Vanilla block states and their values that the block can have, expressed in key/value pairs.""" - return getattr2(self, "_states", []) + return getattr2(self, "_states", {}) @states.setter - def states(self, value: list): - if value is None: - self.states = [] - return - if not isinstance(value, list): - raise TypeError( - f"Expected list but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_states", value) + def states(self, value: dict): + self.on_update("states", value) + setattr2(self, "_states", value, dict) @property def tags(self) -> Molang: @@ -906,10 +942,12 @@ def tags(self, value: Molang): if value is None: setattr(self, "_tags", None) return - setattr(self, "_tags", Molang(value)) + v = Molang(value) + self.on_update("tags", v) + setattr(self, "_tags", v) -class Filter: +class BlockFilter(Misc): """Sets rules for under what conditions the block can be placed/survive""" def __init__( @@ -920,23 +958,22 @@ def __init__( self.allowed_faces = allowed_faces self.block_filter = block_filter - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = { - "allowed_faces": [x._value_ for x in self.allowed_faces], + "allowed_faces": [x.jsonify() for x in self.allowed_faces], "block_filter": [], } for v in self.block_filter: - data["block_filter"].append(v.__dict__) + data["block_filter"].append(v.jsonify()) return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.allowed_faces = [BlockFace[x] for x in data.pop("allowed_faces")] + @staticmethod + def from_dict(data: dict) -> Self: + allowed_faces = [BlockFace.from_dict(x) for x in data.pop("allowed_faces")] + block_filter = [] for f in data.pop("block_filter"): - self.block_filter.append(BlockDescriptor.from_dict(f)) - return self + block_filter.append(BlockDescriptor.from_dict(f)) + return BlockFilter(allowed_faces, block_filter) @property def allowed_faces(self) -> list[BlockFace]: @@ -945,14 +982,8 @@ def allowed_faces(self) -> list[BlockFace]: @allowed_faces.setter def allowed_faces(self, value: list[BlockFace]): - if value is None: - setattr(self, "_allowed_faces", []) - return - if not isinstance(value, list): - raise TypeError( - f"Expected list[BlockFace] but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_allowed_faces", value) + self.on_update("allowed_faces", value) + setattr2(self, "_allowed_faces", value, list) @property def block_filter(self) -> list[BlockDescriptor]: @@ -961,14 +992,8 @@ def block_filter(self) -> list[BlockDescriptor]: @block_filter.setter def block_filter(self, value: list[BlockDescriptor]): - if value is None: - setattr(self, "_block_filter", []) - return - if not isinstance(value, list): - raise TypeError( - f"Expected list[BlockDescriptor] but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_block_filter", value) + self.on_update("block_filter", value) + setattr2(self, "_block_filter", value, list) # FACE @@ -1013,58 +1038,51 @@ def clear_filters(self) -> Self: @block_component_type class PlacementFilterComponent(BlockComponent): - """Sets rules for under what conditions the block can be placed/survive""" + """Sets rules for under what conditions the block can be placed/survive [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_placement_filter?view=minecraft-bedrock-stable)""" id = Identifier("placement_filter") - def __init__(self, conditions: list[Filter] = None): + def __init__(self, conditions: list[BlockFilter] = None): self.conditions = conditions def __iter__(self): for i in self.conditions: yield i - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"conditions": []} for v in self.conditions: - data["conditions"].append(v.__dict__) + data["conditions"].append(v.jsonify()) return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) + @staticmethod + def from_dict(data: dict) -> Self: + conditions = [] for c in data.pop("conditions"): - self.conditions.append(Filter.from_dict(c)) - return self + conditions.append(BlockFilter.from_dict(c)) + return PlacementFilterComponent(conditions) @property - def conditions(self) -> list[Filter]: + def conditions(self) -> list[BlockFilter]: """List of conditions where the block can be placed/survive. Limited to 64 conditions.""" return getattr2(self, "_conditions", []) @conditions.setter - def conditions(self, value: list[Filter]): - if value is None: - setattr(self, "_conditions", []) - return - if not isinstance(value, list): - raise TypeError( - f"Expected list but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_conditions", value) + def conditions(self, value: list[BlockFilter]): + self.on_update("conditions", value) + setattr2(self, "_conditions", value, list) # CONDITION - def add_condition(self, filter: Filter) -> Filter: - if not isinstance(filter, Filter): + def add_condition(self, filter: BlockFilter) -> BlockFilter: + if not isinstance(filter, BlockFilter): raise TypeError( f"Expected Filter but got '{filter.__class__.__name__}' instead" ) self.conditions.append(filter) return filter - def remove_condition(self, index: int) -> Filter: + def remove_condition(self, index: int) -> BlockFilter: return self.conditions.pop(index) def clear_conditions(self) -> Self: @@ -1074,45 +1092,43 @@ def clear_conditions(self) -> Self: @block_component_type class QueuedTickingComponent(BlockComponent): - """Triggers the specified event, either once, or at a regular interval equal to a number of ticks randomly chosen from the interval_range provided""" + """Triggers the specified event, either once, or at a regular interval equal to a number of ticks randomly chosen from the interval_range provided [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blocktriggers/minecraftblock_queued_ticking?view=minecraft-bedrock-stable)""" id = Identifier("queued_ticking") - def __init__( - self, interval_range: list[int], on_tick: Trigger, looping: bool = None - ): + def __init__(self, interval_range: Range, on_tick: Trigger, looping: bool = None): self.interval_range = interval_range self.on_tick = on_tick self.looping = looping - @property - def __dict__(self) -> dict: - data = {"interval_range": self.interval_range, "on_tick": self.on_tick.__dict__} + def jsonify(self) -> dict: + data = { + "interval_range": self.interval_range.to_list(), + "on_tick": self.on_tick.jsonify(), + } if self.looping is not None: data["looping"] = self.looping return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.interval_range = data.pop("interval_range") - self.on_tick = Trigger.from_dict(data.pop("on_tick")) - return self + @staticmethod + def from_dict(data: dict) -> Self: + interval_range = Range.from_dict(data.pop("interval_range")) + on_tick = Trigger.from_dict(data.pop("on_tick")) + looping = data.pop("looping") if "looping" in data else None + return QueuedTickingComponent(interval_range, on_tick, looping) @property - def interval_range(self) -> list[int]: + def interval_range(self) -> Range: """A range of values, specified in ticks, that will be used to decide the interval between times this event triggers. Each interval will be chosen randomly from the range, so the times between this event triggering will differ given an interval_range of two different values. If the values in the interval_range are the same, the event will always be triggered after that number of ticks.""" return getattr(self, "_interval_range") @interval_range.setter - def interval_range(self, value: list[int]): - if isinstance(value, int): - self.interval_range = [value, value] - return - if not isinstance(value, list): + def interval_range(self, value: Range): + if not isinstance(value, Range): raise TypeError( - f"Expected list but got '{value.__class__.__name__}' instead" + f"Expected Range but got '{value.__class__.__name__}' instead" ) + self.on_update("interval_range", value) setattr(self, "_interval_range", value) @property @@ -1126,6 +1142,7 @@ def on_tick(self, value: Trigger): raise TypeError( f"Expected Trigger but got '{value.__class__.__name__}' instead" ) + self.on_update("on_tick", value) setattr(self, "_on_tick", value) @property @@ -1136,34 +1153,32 @@ def looping(self) -> bool: @looping.setter def looping(self, value: bool): if value is None: - setattr(self, "_looping", None) return if not isinstance(value, bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("looping", value) setattr(self, "_looping", value) @block_component_type class RandomTickingComponent(BlockComponent): - """Triggers the specified event randomly based on the random tick speed gamerule. The random tick speed determines how often blocks are updated. Some other examples of game mechanics that use random ticking are crop growth and fire spreading""" + """Triggers the specified event randomly based on the random tick speed gamerule. The random tick speed determines how often blocks are updated. Some other examples of game mechanics that use random ticking are crop growth and fire spreading [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blocktriggers/minecraftblock_random_ticking?view=minecraft-bedrock-stable)""" id = Identifier("random_ticking") def __init__(self, on_tick: Trigger): self.on_tick = on_tick - @property - def __dict__(self) -> dict: - data = {"on_tick": self.on_tick.__dict__} + def jsonify(self) -> dict: + data = {"on_tick": self.on_tick.jsonify()} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.on_tick = Trigger.from_dict(data.pop("on_tick")) - return self + @staticmethod + def from_dict(data: dict) -> Self: + on_tick = Trigger.from_dict(data.pop("on_tick")) + return RandomTickingComponent(on_tick) @property def on_tick(self) -> Trigger: @@ -1176,20 +1191,21 @@ def on_tick(self, value: Trigger): raise TypeError( f"Expected Trigger but got '{value.__class__.__name__}' instead" ) + self.on_update("on_tick", value) setattr(self, "_on_tick", value) @block_component_type class TransformationComponent(BlockComponent): - """The block's translation, rotation and scale with respect to the center of its world position""" + """The block's translation, rotation and scale with respect to the center of its world position [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockcomponents/minecraftblock_transformation?view=minecraft-bedrock-stable)""" id = Identifier("transformation") def __init__( self, - rotation: list[float] = None, - translation: list[float] = None, - scale: list[float] = None, + rotation: Vector3 = None, + translation: Vector3 = None, + scale: Vector3 = None, ): self.rotation = rotation self.translation = translation @@ -1198,86 +1214,90 @@ def __init__( @classmethod def rotate(cls, x: int, y: int, z: int) -> Self: self = cls.__new__(cls) - self.rotation = [x, y, z] + self.rotation = Vector3(x, y, z) return self @classmethod def offset(cls, x: int, y: int, z: int) -> Self: self = cls.__new__(cls) - self.translation = [x, y, z] + self.translation = Vector3(x, y, z) return self @classmethod def scaled(cls, x: int, y: int, z: int) -> Self: self = cls.__new__(cls) - self.scale = [x, y, z] + self.scale = Vector3(x, y, z) return self - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {} if self.rotation is not None: - data["rotation"] = self.rotation + data["rotation"] = self.rotation.jsonify() if self.translation is not None: - data["translation"] = self.translation + data["translation"] = self.translation.jsonify() if self.scale is not None: - data["scale"] = self.scale + data["scale"] = self.scale.jsonify() return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) + @staticmethod + def from_dict(data: dict) -> Self: + rotation = None + translation = None + scale = None if "rotation" in data: - self.rotation = data.pop("rotation") + rotation = Vector3.from_dict(data.pop("rotation")) if "translation" in data: - self.translation = data.pop("translation") + translation = Vector3.from_dict(data.pop("translation")) if "scale" in data: - self.scale = data.pop("scale") - return self + scale = Vector3.from_dict(data.pop("scale")) + return TransformationComponent(rotation, translation, scale) @property - def rotation(self) -> list[float]: + def rotation(self) -> Vector3: return getattr(self, "_rotation", None) @rotation.setter - def rotation(self, value: list[float]): + def rotation(self, value: Vector3): if value is None: setattr(self, "_rotation", None) return - if not isinstance(value, list): + if not isinstance(value, Vector3): raise TypeError( - f"Expected list but got '{value.__class__.__name__}' instead" + f"Expected Vector3 but got '{value.__class__.__name__}' instead" ) + self.on_update("rotation", value) setattr(self, "_rotation", value) @property - def translation(self) -> list[float]: + def translation(self) -> Vector3: return getattr(self, "_translation", None) @translation.setter - def translation(self, value: list[float]): + def translation(self, value: Vector3): if value is None: setattr(self, "_translation", None) return - if not isinstance(value, list): + if not isinstance(value, Vector3): raise TypeError( - f"Expected list but got '{value.__class__.__name__}' instead" + f"Expected Vector3 but got '{value.__class__.__name__}' instead" ) + self.on_update("translation", value) setattr(self, "_translation", value) @property - def scale(self) -> list[float]: + def scale(self) -> Vector3: return getattr(self, "_scale", None) @scale.setter - def scale(self, value: list[float]): + def scale(self, value: Vector3): if value is None: setattr(self, "_scale", None) return - if not isinstance(value, list): + if not isinstance(value, Vector3): raise TypeError( - f"Expected list but got '{value.__class__.__name__}' instead" + f"Expected Vector3 but got '{value.__class__.__name__}' instead" ) + self.on_update("scale", value) setattr(self, "_scale", value) @@ -1289,69 +1309,64 @@ class UnitCubeComponent(BlockComponent): def __init__(self): ... - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: return {} - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - return self + @staticmethod + def from_dict(data: dict) -> Self: + return UnitCubeComponent() @block_component_type class BlockTagsComponent(BlockComponent): + """desc""" + id = Identifier("tags") def __init__(self, tags: list[Identifier] = None): self.tags = tags - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: return [str(x) for x in self.tags] - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) + @staticmethod + def from_dict(data: dict) -> Self: + tags = [] for tag in data: - self.tags.append(Identifier(tag)) - return self + tags.append(tag) + return BlockTagsComponent(tags) @property def tags(self) -> list[Identifier]: return getattr2(self, "_tags", []) @tags.setter - def tags(self, value: list[Identifier]): + def tags(self, value: list[Identifiable]): if value is None: - self.tags = [] - return - if not isinstance(value, list): - raise TypeError( - f"Expected list but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_tags", value) + value = [] + ids = [Identifiable.of(x) for x in value] + self.on_update("tags", ids) + setattr2(self, "_tags", ids, list) def get_tag(self, index: int) -> Identifier | None: - return self.tags[index] + return getitem(self, "tags", index) - def add_tag(self, tag: Identifier) -> Self: - self.tags.append(Identifier(tag)) - return self + def add_tag(self, tag: Identifiable) -> Self: + return additem(self, "tags", Identifiable.of(tag)) def remove_tag(self, index: int) -> Identifier: - return self.tags.pop(index) + return removeitem(self, "tags", index) def clear_tags(self) -> Self: - self.tags = [] - return self + """Remove all tags""" + return clearitems(self, "tags") # TRAITS -class BlockTrait: - def __init__(self, enabled_states: list[BlockState]): +class BlockTrait(Misc): + def __init__(self, enabled_states: list[BlockProperty]): self.enabled_states = enabled_states def __str__(self) -> str: @@ -1365,8 +1380,7 @@ def __iter__(self): def __getitem__(self, index: int): return self.enabled_states[index] - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"enabled_states": [str(x.id) for x in self.enabled_states]} return data @@ -1376,37 +1390,48 @@ def id(self) -> Identifier: @id.setter def id(self, value: Identifier): - setattr(self, "_id", Identifier(value)) + id = Identifier.of(value) + self.on_update("id", id) + setattr(self, "_id", id) @property - def enabled_states(self) -> list[BlockState]: + def enabled_states(self) -> list[BlockProperty]: """Which states to enable. Must specify at least one.""" return getattr(self, "_enabled_states", []) @enabled_states.setter - def enabled_states(self, value: list[BlockState]): + def enabled_states(self, value: list[BlockProperty]): if value is None: self.enabled_states = [] elif isinstance(value, list): v = [] for x in value: - if not issubclass(x, BlockState): + if not issubclass(x, BlockProperty): raise TypeError( - f"Expected BlockState but got '{x.__class__.__name__}' instead" + f"Expected BlockProperty but got '{x.__class__.__name__}' instead" ) v.append(x()) + self.on_update("enabled_states", v) setattr(self, "_enabled_states", v) else: raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) + @staticmethod + def from_dict(data: dict) -> Self: + enabled_states = None if "enabled_states" in data: - self.enabled_states = data.pop("enabled_states") - return self + enabled_states = data.pop("enabled_states") + return BlockTrait(enabled_states) + + def generate(self, ctx) -> None: + """ + Called when this trait is added to the Block + + :type ctx: Block + """ + ... INSTANCE.create_registry(Registries.BLOCK_TRAIT, BlockTrait) @@ -1432,7 +1457,7 @@ class PlacementDirectionTrait(BlockTrait): id = Identifier("placement_direction") def __init__( - self, enabled_states: list[BlockState] = [], y_rotation_offset: float = 0.0 + self, enabled_states: list[BlockProperty] = [], y_rotation_offset: float = 0.0 ): for state in enabled_states: if not issubclass(state, (CardinalDirectionState, FacingDirectionState)): @@ -1444,9 +1469,8 @@ def __init__( raise ValueError(y_rotation_offset) self.y_rotation_offset = y_rotation_offset - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() if self.y_rotation_offset != 0: data["y_rotation_offset"] = self.y_rotation_offset return data @@ -1460,22 +1484,25 @@ def y_rotation_offset(self) -> float: def y_rotation_offset(self, value: float): if value is None: self.y_rotation_offset = 0.0 - elif isinstance(value, float): - setattr(self, "_y_rotation_offset", value) + elif value in [0.0, 90.0, 180.0, 270.0, 0, 90, 180, 270]: + v = float(value) + self.on_update("y_rotation_offset", v) + setattr(self, "_y_rotation_offset", v) else: raise TypeError( - f"Expected float but got '{value.__class__.__name__}' instead" + f"Expected 0.0, 90.0, 180.0, 270.0 but got '{value.__class__.__name__}' instead" ) - @classmethod - def from_dict(cls, data: dict) -> Self: - self = super().from_dict(data) + @staticmethod + def from_dict(data: dict) -> Self: + enabled_states = BlockTrait.from_dict(data) + y_rotation_offset = None if "y_rotation_offset" in data: - self.y_rotation_offset = data.pop("y_rotation_offset") - return self + y_rotation_offset = data.pop("y_rotation_offset") + return PlacementDirectionTrait(enabled_states, y_rotation_offset) @classmethod - def cardinal(cls) -> Self: + def cardinal(cls, y_rotation_offset: float = 0) -> Self: """ Equivalent to: `PlacementPositionTrait([CardinalDirectionState])` states: ["north", "south", "east", "west"] @@ -1483,11 +1510,11 @@ def cardinal(cls) -> Self: self = cls.__new__(cls) enabled_states = [CardinalDirectionState] BlockTrait.__init__(self, enabled_states) - self.y_rotation_offset = 0.0 + self.y_rotation_offset = y_rotation_offset return self @classmethod - def facing(cls) -> Self: + def facing(cls, y_rotation_offset: float = 0) -> Self: """ Equivalent to: `PlacementPositionTrait([FacingDirectionState])` states: ["down", "up", "north", "south", "east", "west"] @@ -1495,28 +1522,28 @@ def facing(cls) -> Self: self = cls.__new__(cls) enabled_states = [FacingDirectionState] BlockTrait.__init__(self, enabled_states) - self.y_rotation_offset = 0.0 + self.y_rotation_offset = y_rotation_offset return self @classmethod - def all(cls) -> Self: + def all(cls, y_rotation_offset: float = 0) -> Self: """ Equivalent to: `PlacementPositionTrait([CardinalDirectionState, FacingDirectionState])` """ self = cls.__new__(cls) enabled_states = [CardinalDirectionState, FacingDirectionState] BlockTrait.__init__(self, enabled_states) - self.y_rotation_offset = 0.0 + self.y_rotation_offset = y_rotation_offset return self @block_trait class PlacementPositionTrait(BlockTrait): - """Adds the BlockFaceState and/or VerticalHalfState BlockStates. The value of these state(s) are set when the block is placed.""" + """Adds the BlockFaceState and/or VerticalHalfState BlockPropertys. The value of these state(s) are set when the block is placed.""" id = Identifier("placement_position") - def __init__(self, enabled_states: list[BlockState] = []): + def __init__(self, enabled_states: list[BlockProperty] = []): for state in enabled_states: if not issubclass(state, (BlockFaceState, VerticalHalfState)): raise TypeError( @@ -1560,11 +1587,11 @@ def all(cls) -> Self: # BLOCK -class BlockPermutation: +class BlockPermutation(Misc): def __init__( self, condition: Molang | str, - components: dict[Identifier, BlockComponent] = None, + components: dict[Identifiable, BlockComponent] = None, ): self.condition = Molang(condition) self.components: dict[Identifier, BlockComponent] = components @@ -1572,23 +1599,42 @@ def __init__( def __str__(self) -> str: return stringify(self, ["condition"]) - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.condition = Molang(data.pop("condition")) + @staticmethod + def from_dict(data: dict) -> Self: + condition = Molang(data.pop("condition")) + components = {} + tags = BlockTagsComponent() for k, v in data.pop("components").items(): - id = Identifier(k) + id = Identifiable.of(k) + if str(id).startswith("tag:"): + tags.add_tag(id.path) + continue clazz = INSTANCE.get_registry(Registries.BLOCK_COMPONENT_TYPE).get(id) if clazz is None: raise ComponentNotFoundError(repr(id)) - self.components[id] = clazz.from_dict(v) - return self + components[id] = clazz.from_dict(v) - @property - def __dict__(self) -> dict: + # Add tag + if len(tags.tags) >= 1: + components[Identifier("tags")] = tags + return BlockPermutation(condition, components) + + @staticmethod + def blockstate(prop: BlockProperty | BlockTrait, value): + if not isinstance(prop, BlockProperty): + raise TypeError( + f"Expected BlockProperty but got '{prop.__class__.__name__}' instead" + ) + return BlockPermutation(Molang(f"q.block_state('{prop.id}')=={repr(value)}")) + + def jsonify(self) -> dict: data = {"condition": str(self.condition), "components": {}} for k, v in self.components.items(): - data["components"][str(k)] = v.__dict__ + if k == "minecraft:tags": # Override BlockTagsComponent + for tag in v.tags: + data["components"]["tag:" + str(tag)] = {} + else: + data["components"][str(k)] = v.jsonify() return data @property @@ -1601,6 +1647,7 @@ def condition(self, value: Molang): raise TypeError( f"Expected Molang but got '{value.__class__.__name__}' instead" ) + self.on_update("condition", value) setattr(self, "_condition", value) @property @@ -1608,7 +1655,7 @@ def components(self) -> dict[Identifier, BlockComponent]: return getattr2(self, "_components", {}) @components.setter - def components(self, value: dict[Identifier, BlockComponent]): + def components(self, value: dict[Identifiable, BlockComponent]): if value is None: self.components = {} return @@ -1616,29 +1663,33 @@ def components(self, value: dict[Identifier, BlockComponent]): raise TypeError( f"Expected dict but got '{value.__class__.__name__}' instead" ) - setattr(self, "_components", value) + components = {} + for k, v in value.items(): + components[Identifiable.of(k)] = v + self.on_update("components", components) + setattr(self, "_components", components) def add_component(self, component: BlockComponent) -> BlockComponent: - if not isinstance(component, BlockComponent): - raise TypeError( - f"Expected BlockComponent but got '{component.__class__.__name__}' instead" - ) - self.components[component.id] = component - return component + component.generate(self) + return additem(self, "components", component, component.id, BlockComponent) - def get_component(self, id: Identifier | str) -> BlockComponent: - i = Identifier.parse(id) - return self.components[i] + def get_component(self, id: Identifiable) -> BlockComponent: + return getitem(self, "components", Identifiable.of(id)) - def remove_component(self, id: Identifier | str) -> BlockComponent: - i = Identifier.parse(id) - e = self.components[i] - del self.components[i] - return e + def remove_component(self, id: Identifiable) -> BlockComponent: + return removeitem(self, "components", Identifiable.of(id)) def clear_components(self) -> Self: - self.components = {} - return self + """Remove all components""" + return clearitems(self, "components") + + def generate(self, ctx) -> None: + """ + Called when this permutation is added to the Block + + :type ctx: Block + """ + ... @dataclass @@ -1652,12 +1703,20 @@ class BlockSettings: resistance: float = None hardness: float = None slipperiness: float = None - loot_table: Identifier = None + loot_table: Identifiable = None burnable: bool = False luminance: int = None - map_color: str = None - - def color(self, color: str) -> Self: + map_color: int = None + + def color(self, color: int | MapColor) -> Self: + if isinstance(color, MapColor): + color = color._value_ + if isinstance(color, str): + color = int(color.replace("#", "0x"), 16) + if not isinstance(color, int): + raise TypeError( + f"Expected int but got '{color.__class__.__name__}' instead" + ) self.map_color = color return self @@ -1706,26 +1765,223 @@ def set_resistance(self, resistance: float) -> Self: self.resistance = resistance return self + def build(self, block): + if self.collidable is not None: + block.add_component(CollisionBoxComponent(self.collidable)) + + if self.sound_group is not None: + block.sound_group = self.sound_group + + if self.resistance is not None: + block.add_component(DestructibleByExplosionComponent(self.resistance)) + + if self.hardness is not None: + block.add_component(DestructibleByMiningComponent(self.hardness)) + + if self.slipperiness is not None: + block.add_component(FrictionComponent(self.slipperiness)) + + if self.loot_table is not None: + block.add_component(LootComponent(self.loot_table)) + + # use molang? + if self.luminance is not None: + block.add_component(LightEmissionComponent(self.luminance)) + + if self.map_color is not None: + block.add_component(MapColorComponent(self.map_color)) + + if self.burnable: + block.add_component(FlammableComponent(0, 0)) + return block + + +class BlockState(Misc): + """ + Describes a placed block in the world + """ + + def __init__(self, name: Identifiable, states: dict = None): + self.name = name + self.states = states + + def __str__(self) -> str: + return "BlockState{" + str(self.name) + "}" + + @property + def name(self) -> Identifier: + return getattr(self, "_name") + + @name.setter + def name(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("name", id) + setattr(self, "_name", id) + + @property + def states(self) -> dict: + return getattr2(self, "_states", {}) + + @states.setter + def states(self, value: dict[Identifiable, str]): + if value is None: + value = {} + if not isinstance(value, dict): + raise TypeError( + f"Expected dict but got '{value.__class__.__name__}' instead" + ) + states = {} + for k, v in value.items(): + states[Identifiable.of(k)] = v + self.on_update("states", states) + setattr(self, "_states", states) + + @staticmethod + def of(value) -> Self: + if isinstance(value, BlockState): + return value + elif isinstance(value, Block): + return value.defaultstate() + elif isinstance(value, dict): + return BlockState.from_dict(value) + return BlockState(value, {}) + + @staticmethod + def from_dict(data: dict) -> Self: + if isinstance(data, str): + return BlockState(data) + return BlockState(**data) + + def jsonify(self) -> dict: + if not self.has_states(): + return str(self.name) + + states = {} + for k, v in self.states.items(): + states[str(k)] = v + data = {"name": str(self.name), "states": states} + return data + + def has_states(self) -> bool: + return len(self.states) >= 1 + + +class BlockPredicate(Misc): + """ + Describes a block predicate that should match. Similar to BlockState but excepts "tags" + """ + + def __init__(self, name: str = None, states: dict = None, tags: Molang = None): + self.name = name + self.tags = tags + self.states = states + + def __str__(self) -> str: + return "BlockPredicate{" + str(self.name) if self.name else self.tags + "}" + + @property + def name(self) -> Identifier: + return getattr(self, "_name", None) + + @name.setter + def name(self, value: Identifiable): + if value is None: + return + id = Identifiable.of(value) + self.on_update("name", id) + setattr(self, "_name", id) + + @property + def states(self) -> dict: + return getattr2(self, "_states", {}) + + @states.setter + def states(self, value: dict[Identifiable, str]): + if value is None: + value = {} + if not isinstance(value, dict): + raise TypeError( + f"Expected dict but got '{value.__class__.__name__}' instead" + ) + states = {} + for k, v in value.items(): + states[Identifiable.of(k)] = v + self.on_update("states", states) + setattr(self, "_states", states) + + @property + def tags(self) -> Molang: + return getattr(self, "_tags", None) + + @tags.setter + def tags(self, value: Molang): + if value is None: + return + if not isinstance(value, (Molang, str)): + raise TypeError( + f"Expected Molang, str but got '{value.__class__.__name__}' instead" + ) + v = Molang(value) + self.on_update("tags", v) + setattr(self, "_tags", v) + + @staticmethod + def of(value) -> Self: + if isinstance(value, BlockPredicate): + return value + elif isinstance(value, BlockState): + return BlockPredicate(value.name, value.states) + elif isinstance(value, Block): + return BlockPredicate.of(value.defaultstate()) + elif isinstance(value, Molang): + return BlockPredicate(tags=value) + elif isinstance(value, dict): + return BlockPredicate.from_dict(value) + return BlockPredicate(value, {}) + + @staticmethod + def from_dict(data: dict) -> Self: + if isinstance(data, str): + return BlockPredicate(data) + return BlockPredicate(**data) + + def jsonify(self) -> dict: + if not self.has_states(): + return str(self.name) if self.name else str(self.tags) + + states = {} + for k, v in self.states.items(): + states[str(k)] = v + data = {"states": states} + if self.name: + data["name"] = str(self.name) + else: + data["tags"] = str(self.tags) + return data + + def has_states(self) -> bool: + return len(self.states) >= 1 + +@resource_pack +@behavior_pack class Block(JsonFile, Identifiable): """ - Represents a Block. + Represents a data-driven Block. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockjsonfilestructure?view=minecraft-bedrock-stable) """ id = Identifier("block") - EXTENSION = ".json" - FILENAME = "block" - DIRNAME = "blocks" + FILEPATH = "blocks/block.json" def __init__( self, - identifier: Identifier | str, + identifier: Identifiable, menu_category: MenuCategory = None, components: dict[str, BlockComponent] = None, permutations: list[BlockPermutation] = None, - events: dict[Identifier, Event] = None, - traits: dict[Identifier, BlockTrait] = None, - states: dict[Identifier, list[str]] = None, + events: dict[Identifiable, Event] = None, + traits: dict[Identifiable, BlockTrait] = None, + states: dict[Identifiable, list[str]] = None, sound_group: str = None, ): Identifiable.__init__(self, identifier) @@ -1745,55 +2001,15 @@ def __init__( if sel is not None: self.add_component(SelectionBoxComponent(*sel)) - def __str__(self) -> str: - return "Block{" + str(self.identifier) + "}" - - @property - def __dict__(self) -> dict: - block = {"description": {"identifier": str(self.identifier)}} - if self.menu_category: - block["description"]["menu_category"] = self.menu_category.__dict__ - - if self.traits: - block["description"]["traits"] = {} - for k, v in self.traits.items(): - block["description"]["traits"][str(k)] = v.__dict__ - - if self.states: - block["description"]["states"] = {} - for k, v in self.states.items(): - block["description"]["states"].update(v.__dict__) - - if self.components: - block["components"] = {} - for k, v in self.components.items(): - block["components"][str(k)] = v.__dict__ - - if self.permutations: - block["permutations"] = [] - for v in self.permutations: - block["permutations"].append(v.__dict__) - - if self.events: - block["events"] = {} - for key, events in self.events.items(): - d = {} - for k, v in events.items(): - d[k.path] = v.__dict__ - block["events"][str(key)] = d - - data = {"format_version": VERSION["BLOCK"], str(self.id): block} - if self.type: - data["type"] = str(self.type) - return data - @property def type(self) -> Identifier: return getattr(self, "_type", None) @type.setter - def type(self, value: Identifier): - setattr(self, "_type", Identifier(value)) + def type(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("type", id) + setattr(self, "_type", id) @property def menu_category(self) -> MenuCategory: @@ -1808,6 +2024,7 @@ def menu_category(self, value: MenuCategory): raise TypeError( f"Expected MenuCategory but got '{value.__class__.__name__}' instead" ) + self.on_update("menu_category", value) setattr(self, "_menu_category", value) @property @@ -1816,14 +2033,8 @@ def components(self) -> dict[str, BlockComponent]: @components.setter def components(self, value: dict[str, BlockComponent]): - if value is None: - self.components = {} - return - if not isinstance(value, dict): - raise TypeError( - f"Expected dict but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_components", value) + self.on_update("components", value) + setattr2(self, "_components", value, dict) @property def permutations(self) -> list[BlockPermutation]: @@ -1831,21 +2042,15 @@ def permutations(self) -> list[BlockPermutation]: @permutations.setter def permutations(self, value: list[BlockPermutation]): - if value is None: - self.permutation = [] - return - if not isinstance(value, list): - raise TypeError( - f"Expected list but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_permutations", value) + self.on_update("permutations", value) + setattr2(self, "_permutations", value, list) @property def events(self) -> dict[Identifier, Event]: return getattr2(self, "_events", {}) @events.setter - def events(self, value: dict[Identifier, Event]): + def events(self, value: dict[Identifiable, Event]): if value is None: self.events = {} return @@ -1853,14 +2058,18 @@ def events(self, value: dict[Identifier, Event]): raise TypeError( f"Expected dict but got '{value.__class__.__name__}' instead" ) - setattr(self, "_events", value) + events = {} + for k, v in value.items(): + events[Identifiable.of(k)] = v + self.on_update("events", events) + setattr(self, "_events", events) @property - def states(self) -> dict[Identifier, BlockState]: + def states(self) -> dict[Identifier, BlockProperty]: return getattr2(self, "_states", {}) @states.setter - def states(self, value: dict[Identifier, BlockState]): + def states(self, value: dict[Identifiable, BlockProperty]): if value is None: self.states = {} return @@ -1868,14 +2077,18 @@ def states(self, value: dict[Identifier, BlockState]): raise TypeError( f"Expected dict but got '{value.__class__.__name__}' instead" ) - setattr(self, "_states", value) + states = {} + for k, v in value.items(): + states[Identifiable.of(k)] = v + self.on_update("states", states) + setattr(self, "_states", states) @property def traits(self) -> dict[Identifier, BlockTrait]: return getattr2(self, "_traits", {}) @traits.setter - def traits(self, value: dict[Identifier, BlockTrait]): + def traits(self, value: dict[Identifiable, BlockTrait]): if value is None: self.traits = {} return @@ -1883,7 +2096,11 @@ def traits(self, value: dict[Identifier, BlockTrait]): raise TypeError( f"Expected dict but got '{value.__class__.__name__}' instead" ) - setattr(self, "_traits", value) + traits = {} + for k, v in value.items(): + traits[Identifiable.of(k)] = v + self.on_update("traits", traits) + setattr(self, "_traits", traits) @property def sound_group(self) -> str | None: @@ -1894,7 +2111,17 @@ def sound_group(self, value: str | None): if value is None: setattr(self, "_sound_group", None) return - setattr(self, "_sound_group", str(value)) + v = str(value) + self.on_update("sound_group", v) + setattr(self, "_sound_group", v) + + @property + def name(self) -> str | None: + return getattr(self, "_name", None) + + @name.setter + def name(self, value: str): + setattr(self, "_name", str(value)) # Read-Only @@ -1912,19 +2139,19 @@ def resistance(self) -> float: def map_color(self) -> str: return self.get_component("map_color") - @classmethod - def from_dict(cls, data: dict) -> Self: + @staticmethod + def from_dict(data: dict) -> Self: loader = BlockLoader() loader.validate(data) return loader.load(data) @classmethod - def from_settings(cls, identifier: Identifier, settings: BlockSettings) -> Self: + def from_settings(cls, identifier: Identifiable, settings: BlockSettings) -> Self: """ Create a block using block settings :param identifier: The ID of the block - :type identifier: Identifier + :type identifier: Identifiable :param settings: The block settings :type settings: BlockSettings :rtype: Block @@ -1935,41 +2162,76 @@ def from_settings(cls, identifier: Identifier, settings: BlockSettings) -> Self: ) self = cls.__new__(cls) self.identifier = identifier + return settings.build(self) - if settings.collidable is not None: - self.add_component(CollisionBoxComponent(settings.collidable)) - - if settings.sound_group is not None: - self.sound_group = settings.sound_group + def jsonify(self) -> dict: + block = {"description": {"identifier": str(self.identifier)}} + if self.menu_category: + block["description"]["menu_category"] = self.menu_category.jsonify() - if settings.resistance is not None: - self.add_component(DestructibleByExplosionComponent(settings.resistance)) + if self.traits: + block["description"]["traits"] = {} + for k, v in self.traits.items(): + block["description"]["traits"][str(k)] = v.jsonify() - if settings.hardness is not None: - self.add_component(DestructibleByMiningComponent(settings.hardness)) + if self.states: + block["description"]["states"] = {} + for k, v in self.states.items(): + block["description"]["states"].update(v.jsonify()) - if settings.slipperiness is not None: - self.add_component(FrictionComponent(settings.slipperiness)) + if self.components: + block["components"] = {} + for k, v in self.components.items(): + if k == "minecraft:tags": # Override BlockTagsComponent + for tag in v.tags: + block["components"]["tag:" + str(tag)] = {} + else: + block["components"][str(k)] = v.jsonify() - if settings.loot_table is not None: - self.add_component(LootComponent(settings.loot_table)) + if self.permutations: + block["permutations"] = [] + for v in self.permutations: + block["permutations"].append(v.jsonify()) - # use molang? - if settings.luminance is not None: - self.add_component(LightEmissionComponent(settings.luminance)) + if self.events: + block["events"] = {} + for key, events in self.events.items(): + d = {} + for k, v in events.items(): + d[k.path] = v.jsonify() + block["events"][str(key)] = d - if settings.map_color is not None: - self.add_component(MapColorComponent(settings.map_color)) + data = {"format_version": VERSION["BLOCK"], str(self.id): block} + if self.type: + data["type"] = str(self.type) + return data - if settings.burnable: - self.add_component(FlammableComponent(0, 0)) + def display_name(self, text: str) -> Self: + """ + The name of this block in-game. + :rtype: Self + """ + self.name = text return self + def defaultstate(self) -> BlockState: + """ + This blocks default BlockState + + :rtype: BlockState + """ + states = {} + for id, state in self.states.items(): + states[id] = state.default() + return BlockState(self.identifier, states) + def translation_key(self) -> str: - return f"tile.{str(self.id)}.name" + return f"tile.{self.identifier}.name" def stack(self): + from .item import ItemStack + return ItemStack(self.identifier) def get_collision_shape(self) -> tuple[list, list]: @@ -1990,6 +2252,35 @@ def get_selection_shape(self) -> tuple[list, list]: """ return None + def generate(self, ctx) -> None: + """ + Called when this block is added to ResourcePack or BehaviorPack + + :type ctx: ResourcePack | BehaviorPack + """ + for e in self.events.values(): + for et in e.values(): + et.generate(ctx) + for t in self.traits.values(): + t.generate(ctx) + for p in self.permutations: + p.generate(ctx) + for c in self.components.values(): + c.generate(ctx) + if isinstance(ctx, ResourcePack) and self.name is not None: + ctx.texts[self.translation_key()] = self.name + + def item(self, id: Identifiable, icon: Identifiable = None, *args, **kw): + from .item import BlockItem + + return BlockItem( + self.identifier.replace("_block", "") if id is None else id, + self, + self.identifier if icon is None else icon, + *args, + **kw, + ).display_name(self.name) + # COMPONENT def add_component(self, component: BlockComponent) -> BlockComponent: @@ -1999,37 +2290,34 @@ def add_component(self, component: BlockComponent) -> BlockComponent: ) if isinstance(component, Trigger): component.event.namespace = self.identifier.namespace + component.generate(self) self.components[component.id] = component - return component + return additem(self, "components", component, component.id, BlockComponent) - def get_component(self, id: Identifier) -> BlockComponent: - x = id.id if isinstance(id, BlockComponent) else Identifier(id) - return self.components.get(x) + def get_component(self, id: Identifiable) -> BlockComponent: + return getitem(self, "components", Identifiable.of(id)) def remove_component(self, id: str) -> BlockComponent: - x = id.id if isinstance(id, BlockComponent) else Identifier(id) - return self.components.pop(x) + return removeitem(self, "components", Identifiable.of(id)) def clear_components(self) -> Self: - """ - Removes all components - """ - self.components.clear() - return self + """Removes all components""" + return clearitems(self, "components") # EVENT def _event_id(self, id: Identifier | str): if id is None: - return "default" + return Identifier("default") elif isinstance(id, Identifier): return id else: return self.identifier.copy_with_path(id) - def add_event(self, id: Identifier | str, event: Event) -> Event: + def add_event(self, id: Identifiable, event: Event) -> Event: if isinstance(event, Event): k = self._event_id(id) if k in self.events: + event.generate(self) self.events[k][event.id] = event return event self.events[k] = {} @@ -2044,20 +2332,19 @@ def add_event(self, id: Identifier | str, event: Event) -> Event: f"Expected BlockEvent but got '{event.__class__.__name__}' instead" ) - def get_event(self, id: Identifier | str) -> Event: + def add_events(self, id: Identifiable, *events: Event) -> list[Event]: + return [self.add_event(id, e) for e in events] + + def get_event(self, id: Identifiable) -> Event: k = self._event_id(id) return self.events.get(k) - def remove_event(self, id: Identifier | str) -> Event: - i = Identifier.parse(id) - return self.events.pop(i) + def remove_event(self, id: Identifiable) -> Event: + return removeitem(self, "events", Identifiable.of(id)) def clear_events(self) -> Self: - """ - Removes all events - """ - self.events.clear() - return self + """Removes all events""" + return clearitems(self, "events") # PERMUTATION @@ -2066,23 +2353,23 @@ def add_permutation(self, permutation: BlockPermutation) -> BlockPermutation: raise TypeError( f"Expected BlockPermutation but got '{permutation.__class__.__name__}' instead" ) - self.permutations.append(permutation) - return permutation + permutation.generate(self) + return additem(self, "permutations", permutation) + + def add_permutations( + self, *permutations: BlockPermutation + ) -> list[BlockPermutation]: + return [self.add_permutation(perm) for perm in permutations] def get_permutation(self, index: int) -> BlockPermutation: return self.permutations[index] def remove_permutation(self, index: int) -> BlockPermutation: - p = self.get_permutation(index) - del self.permutations[index] - return p + return removeitem(self, "permutations", index) def clear_permutation(self) -> Self: - """ - Removes all permutations - """ - self.permutations.clear() - return self + """Removes all permutations""" + return clearitems(self, "permutations") # TRAIT @@ -2091,48 +2378,42 @@ def add_trait(self, trait: BlockTrait) -> BlockTrait: raise TypeError( f"Expected BlockTrait but got '{trait.__class__.__name__}' instead" ) + trait.generate(self) self.traits[trait.id] = trait return trait - def get_trait(self, id: str) -> BlockTrait: - x = id.id if isinstance(id, BlockTrait) else Identifier(id) - return self.traits.get(x) + def add_traits(self, *traits: BlockTrait) -> list[BlockTrait]: + return [self.add_trait(trait) for trait in traits] + + def get_trait(self, id: Identifiable) -> BlockTrait: + return getitem(self, "traits", Identifiable.of(id)) - def remove_trait(self, id: str) -> BlockTrait: - x = id.id if isinstance(id, BlockTrait) else Identifier(id) - return self.traits.pop(x) + def remove_trait(self, id: Identifiable) -> BlockTrait: + return removeitem(self, "traits", Identifiable.of(id)) def clear_trait(self) -> Self: - """ - Removes all traits - """ - self.traits.clear() - return self + """Removes all traits""" + return clearitems(self, "traits") # STATE - def add_state(self, state: BlockState) -> BlockState: - if not isinstance(state, BlockState): + def add_state(self, state: BlockProperty) -> BlockProperty: + if not isinstance(state, BlockProperty): raise TypeError( - f"Expected BlockState but got '{state.__class__.__name__}' instead" + f"Expected BlockProperty but got '{state.__class__.__name__}' instead" ) self.states[state.id] = state return state - def get_state(self, id: Identifier | str) -> BlockState: - x = id.id if isinstance(id, BlockState) else Identifier(id) - return self.states.get(x) + def get_state(self, id: Identifiable) -> BlockProperty: + return getitem(self, "states", Identifiable.of(id)) - def remove_state(self, id: Identifier | str) -> BlockState: - x = id.id if isinstance(id, BlockState) else Identifier(id) - return self.states.pop(x) + def remove_state(self, id: Identifiable) -> BlockProperty: + return removeitem(self, "states", Identifiable.of(id)) def clear_state(self) -> Self: - """ - Removes all states - """ - self.states.clear() - return self + """Removes all states""" + return clearitems(self, "states") class BlockLoader(Loader): @@ -2142,7 +2423,7 @@ def __init__(self): from .schemas import BlockSchema1 Loader.__init__(self, Block) - self.add_schema(BlockSchema1, "1.20.51") + self.add_schema(BlockSchema1, "1.20.50") # TYPES diff --git a/mcaddon/block_culling.py b/mcaddon/block_culling.py new file mode 100644 index 0000000..49760a3 --- /dev/null +++ b/mcaddon/block_culling.py @@ -0,0 +1,180 @@ +from typing import Self + +from . import VERSION + +from .util import ( + Identifiable, + Identifier, + Misc, + setattr2, + getattr2, + getitem, + additem, + removeitem, + clearitems, +) +from .constant import Direction +from .file import JsonFile, Loader +from .pack import resource_pack + + +class GeometryPart(Misc): + def __init__(self, bone: str, cube: int = None, face: Direction = None): + self.bone = bone + self.cube = cube + self.face = face + + @property + def bone(self) -> str: + return getattr(self, "_bone") + + @bone.setter + def bone(self, value: str): + setattr(self, "_bone", str(value)) + + @property + def cube(self) -> int: + return getattr(self, "_cube", None) + + @cube.setter + def cube(self, value: int): + if value is None: + return + setattr2(self, "_cube", value, int) + + @property + def face(self) -> Direction: + return getattr(self, "_face", None) + + @face.setter + def face(self, value: Direction): + if value is None: + return + setattr2(self, "_face", value, Direction) + + @staticmethod + def from_dict(data: dict) -> Self: + bone = data.pop("bone") if "bone" in data else None + cube = data.pop("cube") if "cube" in data else None + face = Direction.from_dict(data.pop("face")) if "face" in data else None + return GeometryPart(bone, cube, face) + + def jsonify(self) -> dict: + data = {} + if self.bone: + data["bone"] = self.bone + if self.cube is not None: + data["cube"] = self.cube + if self.face: + data["face"] = Direction.jsonify(self.face) + return data + + +class CullingRule(Misc): + def __init__(self, direction: str, geometry_part: GeometryPart): + self.direction = direction + self.geometry_part = geometry_part + + @property + def direction(self) -> Direction: + """Specifies the direction of the neighbor block to check for culling. This direction rotates with a block's Transform component.""" + return getattr(self, "_direction") + + @direction.setter + def direction(self, value: Direction): + if not isinstance(value, Direction): + raise TypeError( + f"Expected Direction but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_direction", value) + + @property + def geometry_part(self) -> GeometryPart: + """Specifies the bone, cube, and face that the block will be culled. The cube and face fields are optional to allow culling a specific face. Omitting these fields will cull the whole bone.""" + return getattr(self, "_geometry_part") + + @geometry_part.setter + def geometry_part(self, value: GeometryPart): + if not isinstance(value, GeometryPart): + raise TypeError( + f"Expected GeometryPart but got '{value.__class__.__name__}' instead" + ) + self.on_update("geometry_part", value) + setattr(self, "_geometry_part", value) + + @staticmethod + def from_dict(data: dict) -> Self: + direction = Direction.from_dict(data.pop("direction")) + geometry_part = GeometryPart.from_dict(data.pop("geometry_part")) + return CullingRule(direction, geometry_part) + + def jsonify(self) -> dict: + data = { + "geometry_part": self.geometry_part.jsonify(), + "direction": self.direction.jsonify(), + } + return data + + +@resource_pack +class BlockCullingRules(JsonFile, Identifiable): + + id = Identifier("block_culling_rules") + FILEPATH = "block_culling/block_culling.json" + + def __init__(self, identifier: Identifiable, rules: list[CullingRule] = None): + Identifiable.__init__(self, identifier) + self.rules = rules + + @property + def rules(self) -> list[CullingRule]: + """List of all components used to identify geometry parts used in culling.""" + return getattr2(self, "_rules", []) + + @rules.setter + def rules(self, value: list[CullingRule]): + self.on_update("rules", value) + setattr2(self, "_rules", value, list) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = BlockCullingRulesLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + cull = {"rules": [x.jsonify() for x in self.rules]} + root = str(self.id) + data = { + "format_version": VERSION["BLOCK_CULLING_RULES"], + root: {"description": {"identifier": str(self.identifier)}}, + } + for k, v in cull.items(): + data[root][k] = v + return data + + def get_rule(self, index: int) -> CullingRule: + return getitem(self, "rules", index) + + def add_rule(self, rule: CullingRule) -> CullingRule: + return additem(self, "rules", rule, type=CullingRule) + + def add_rules(self, *rule: CullingRule) -> list[CullingRule]: + return [self.add_rule(rule) for rule in rule] + + def remove_rule(self, index: int) -> CullingRule: + return removeitem(self, "rules", index) + + def clear_rules(self) -> Self: + """Remove all rules""" + return clearitems(self, "rules") + + +class BlockCullingRulesLoader(Loader): + name = "Block Culling Rules" + + def __init__(self): + from .schemas import BlockCullingRulesSchema1 + + Loader.__init__(self, BlockCullingRules) + self.add_schema(BlockCullingRulesSchema1, "1.20.60") diff --git a/mcaddon/camera.py b/mcaddon/camera.py index bf28a6b..4b6ca65 100644 --- a/mcaddon/camera.py +++ b/mcaddon/camera.py @@ -4,22 +4,22 @@ from .constant import CameraListener from .file import JsonFile, Loader from .util import Identifier, Identifiable +from .pack import behavior_pack +@behavior_pack class CameraPreset(JsonFile, Identifiable): """ Represents a Camera Preset. """ id = Identifier("camera_preset") - EXTENSION = ".json" - FILENAME = "camera_preset" - DIRNAME = "cameras" + FILEPATH = "cameras/presets/camera_preset.json" def __init__( self, - identifier: Identifier | str, - inherit_from: Identifier = None, + identifier: Identifiable, + inherit_from: Identifiable = None, player_effects: bool = False, pos_x: int = None, pos_y: int = None, @@ -41,42 +41,17 @@ def __init__( def __str__(self) -> str: return "CameraPreset{" + str(self.identifier) + "}" - @property - def __dict__(self) -> dict: - camera = {"description": {"identifier": str(self.identifier)}} - if self.inherit_from: - camera["inherit_from"] = self.inherit_from - if self.player_effects: - camera["player_effects"] = self.player_effects - if self.pos_x: - camera["pos_x"] = self.pos_x - if self.pos_y: - camera["pos_y"] = self.pos_y - if self.pos_z: - camera["pos_z"] = self.pos_z - if self.rot_x: - camera["rot_x"] = self.rot_x - if self.rot_y: - camera["rot_y"] = self.rot_y - if self.listener not in [None, CameraListener.none]: - camera["listener"] = self.listener._value_ - data = {"format_version": VERSION["ITEM"], str(self.id): camera} - return data - @property def inherit_from(self) -> Identifier: return getattr(self, "_inherit_from", None) @inherit_from.setter - def inherit_from(self, value: Identifier): + def inherit_from(self, value: Identifiable): if value is None: setattr(self, "_inherit_from", None) return - if not isinstance(value, Identifier): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_inherit_from", value) + self.on_update("inherit_from", value) + setattr(self, "_inherit_from", Identifiable.of(value)) @property def player_effects(self) -> bool: @@ -91,6 +66,7 @@ def player_effects(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("player_effects", value) setattr(self, "_player_effects", value) @property @@ -106,6 +82,7 @@ def pos_x(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("pos_x", value) setattr(self, "_pos_x", value) @property @@ -121,6 +98,7 @@ def pos_y(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("pos_y", value) setattr(self, "_pos_y", value) @property @@ -136,6 +114,7 @@ def pos_z(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("pos_z", value) setattr(self, "_pos_z", value) @property @@ -151,6 +130,7 @@ def rot_x(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("rot_x", value) setattr(self, "_rot_x", value) @property @@ -166,20 +146,22 @@ def rot_y(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("rot_y", value) setattr(self, "_rot_y", value) @property def listener(self) -> CameraListener: - return getattr(self, "_listener", CameraListener.none) + return getattr(self, "_listener", CameraListener.NONE) @listener.setter def listener(self, value: CameraListener): if value is None: - self.listener = CameraListener.none + self.listener = CameraListener.NONE elif isinstance(value, CameraListener): + self.on_update("listener", value) setattr(self, "_listener", value) else: - self.listener = CameraListener[value] + self.listener = CameraListener(value) @classmethod def from_dict(cls, data: dict) -> Self: @@ -187,6 +169,38 @@ def from_dict(cls, data: dict) -> Self: loader.validate(data) return loader.load(data) + def jsonify(self) -> dict: + camera = {"identifier": str(self.identifier)} + if self.inherit_from is not None: + camera["inherit_from"] = str(self.inherit_from) + if self.player_effects is not None: + camera["player_effects"] = self.player_effects + if self.pos_x is not None: + camera["pos_x"] = self.pos_x + if self.pos_y is not None: + camera["pos_y"] = self.pos_y + if self.pos_z is not None: + camera["pos_z"] = self.pos_z + if self.rot_x is not None: + camera["rot_x"] = self.rot_x + if self.rot_y is not None: + camera["rot_y"] = self.rot_y + if self.listener not in [None, CameraListener.NONE]: + camera["listener"] = self.listener.jsonify() + data = {"format_version": VERSION["CAMERA"], str(self.id): camera} + return data + + def position(self, x: int = 0, y: int = 0, z: int = 0) -> Self: + self.pos_x = x + self.pos_y = y + self.pos_z = z + return self + + def rotation(self, x: int = 0, y: int = 0) -> Self: + self.rot_x = x + self.rot_y = y + return self + class CameraPresetLoader(Loader): name = "Camera" @@ -195,4 +209,5 @@ def __init__(self): from .schemas import CameraPresetSchem1 Loader.__init__(self, CameraPreset) - self.add_schema(CameraPresetSchem1, "1.20.51") + self.add_schema(CameraPresetSchem1, "1.20.50") + self.add_schema(CameraPresetSchem1, "1.19.50") diff --git a/mcaddon/cli.py b/mcaddon/cli.py index 4ca1bf2..eb8746b 100644 --- a/mcaddon/cli.py +++ b/mcaddon/cli.py @@ -1,5 +1,11 @@ from argparse import ArgumentParser -from mcaddon import __version__ +from mcaddon import __version__, BehaviorPack, Pack +from watchdog.observers import Observer +from watchdog.events import FileSystemEvent, FileSystemEventHandler +import warnings +import os +import time +import traceback parser = ArgumentParser() parser.add_argument( @@ -9,10 +15,29 @@ help="print the mcaddon version number and exit.", ) +parser.add_argument( + "-W", + "--watch", + metavar="", + nargs="?", + help="Watches this Python file for changes.", +) + + +# outputs = parser.add_mutually_exclusive_group() +# outputs.add_argument( +# "-m", "--merge", metavar="", help="merge mcaddon or mcpack into a file" +# ) +# parser.add_argument("file", metavar="", help="the target file") + # build current project # Add file to mcpack # Add mcpack to mcaddon # Merge mcpack and/or mcaddon +# Open UI creator in current dir +# Watch python file for changes to build automatically + +# mcaddon -m def main(): @@ -20,6 +45,56 @@ def main(): if args.version: print(__version__) + # root = BehaviorPack.load(args.file) + # try: + # if args.merge: + # merge(root, args.merge) + # except Exception as exc: + # parser.error(f"{exc}") + + # Should be at end + if args.watch: + watch(args.watch) + + +def merge(file: Pack, merge: str): + print(file) + with BehaviorPack.open(merge) as fd2: + print(fd2) + + +class FileObserver(FileSystemEventHandler): + def on_modified(self, event: FileSystemEvent) -> None: + if ( + not event.is_directory + and event.event_type == "modified" + and event.src_path.endswith(".py") + ): + print("Executing...") + with open(event.src_path) as fd: + try: + eval(compile(fd.read(), "", "exec")) + except Exception as err: + traceback.print_exception(err) + return super().on_modified(event) + + +def watch(file: str): + # Interface should be similar to flask + warnings.warn("This feature is experimental and requires more testing!") + fp = os.path.abspath(file) + observer = Observer() + observer.schedule(FileObserver(), path=fp, recursive=False) + observer.start() + print(f"Watching {repr(fp)}. Press Ctrl-c to stop") + try: + while True: + time.sleep(1) + except KeyboardInterrupt: + observer.stop() + print("Stopping...") + observer.join() + if __name__ == "__main__": main() diff --git a/mcaddon/constant.py b/mcaddon/constant.py index 17f9e94..178b828 100644 --- a/mcaddon/constant.py +++ b/mcaddon/constant.py @@ -1,153 +1,501 @@ +from typing import Self from enum import Enum -class RecipeTag(Enum): - CRAFTING_TABLE = "crafting_table" - BREWING_STAND = "brewing_stand" - SMITHING_TABLE = "smithing_table" - CAMPFIRE = "campfire" - SOUL_CAMPFIRE = "soul_campfire" - FURNACE = "furnace" - SMOKER = "smoker" - STONECUTTER = "stonecutter" - MATERIAL_REDUCER = "material_reducer" +class Direction(Enum): + NORTH = "north" + SOUTH = "south" + EAST = "east" + WEST = "west" + UP = "up" + DOWN = "down" + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return Direction(data) + except KeyError: + raise ValueError(f"Invalid Direction value: {data}") + + +class PackScope(Enum): + WORLD = "world" + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return PackScope[data] + except KeyError: + raise ValueError(f"Invalid PackScope value: {data}") + + +class ItemGroup(Enum): + SEARCH = "itemGroup.search" + PLANKS = "itemGroup.name.planks" + WALLS = "itemGroup.name.walls" + FENCE = "itemGroup.name.fence" + FENCE_GATE = "itemGroup.name.fenceGate" + STAIRS = "itemGroup.name.stairs" + DOOR = "itemGroup.name.door" + GLASS = "itemGroup.name.glass" + GLASS_PANE = "itemGroup.name.glassPane" + PERMISSION = "itemGroup.name.permission" + SLABS = "itemGroup.name.slab" + STONE_BRICKS = "itemGroup.name.stoneBrick" + SANDSTONE = "itemGroup.name.sandstone" + WOOL = "itemGroup.name.wool" + CARPET = "itemGroup.name.woolCarpet" + CONCRETE_POWDER = "itemGroup.name.concretePowder" + CONCRETE = "itemGroup.name.concrete" + STAINED_TERRACOTTA = "itemGroup.name.stainedClay" + GLAZED_TERRACOTTA = "itemGroup.name.glazedTerracotta" + DYE = "itemGroup.name.dye" + ORE = "itemGroup.name.ore" + STONE = "itemGroup.name.stone" + LOG = "itemGroup.name.log" + LEAVES = "itemGroup.name.leaves" + SAPLINGS = "itemGroup.name.sapling" + SEED = "itemGroup.name.seed" + CROP = "itemGroup.name.crop" + GRASS = "itemGroup.name.grass" + FLOWER = "itemGroup.name.flower" + RAW_FOOD = "itemGroup.name.rawFood" + COOKED_FOOD = "itemGroup.name.cookedFood" + MISC_FOOD = "itemGroup.name.miscFood" + MUSHROOM = "itemGroup.name.mushroom" + MONSTER_STONE_EGG = "itemGroup.name.monsterStoneEgg" + MOB_EGG = "itemGroup.name.mobEgg" + HELMET = "itemGroup.name.helmet" + CHESTPLATE = "itemGroup.name.chestplate" + LEGGINGS = "itemGroup.name.leggings" + BOOTS = "itemGroup.name.boots" + HORSE_ARMOR = "itemGroup.name.horseArmor" + SWORD = "itemGroup.name.sword" + AXE = "itemGroup.name.axe" + PICKAXE = "itemGroup.name.pickaxe" + SHOVEL = "itemGroup.name.shovel" + HOE = "itemGroup.name.hoe" + ARROW = "itemGroup.name.arrow" + POTION = "itemGroup.name.potion" + SPLASH_POTION = "itemGroup.name.splashPotion" + LINGERING_POTION = "itemGroup.name.lingeringPotion" + BED = "itemGroup.name.bed" + CHALKBOARD = "itemGroup.name.chalkboard" + ANVIL = "itemGroup.name.anvil" + CHEST = "itemGroup.name.chest" + SHULKER_BOX = "itemGroup.name.shulkerBox" + RECORD = "itemGroup.name.record" + SKULL = "itemGroup.name.skull" + BOAT = "itemGroup.name.boat" + RAIL = "itemGroup.name.rail" + MINECRART = "itemGroup.name.minecart" + PRESSURE_PLATE = "itemGroup.name.pressurePlate" + TRAPDOOR = "itemGroup.name.trapdoor" + ENCHANTED_BOOK = "itemGroup.name.enchantedBook" + BANNER = "itemGroup.name.banner" + FIREWORK = "itemGroup.name.firework" + FIREWORK_STARS = "itemGroup.name.fireworkStars" + CORAL = "itemGroup.name.coral" + CORAL_DECORATIONS = "itemGroup.name.coral_decorations" + BUTTON = "itemGroup.name.button" + SIGN = "itemGroup.name.sign" + WOOD = "itemGroup.name.wood" + BANNER_PATTERN = "itemGroup.name.banner_pattern" + NETHER_WART_BLOCK = "itemGroup.name.netherWartBlock" + CANDLES = "itemGroup.name.candles" + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return ItemGroup(data) + except KeyError: + raise ValueError(f"Invalid ItemGroup value: {data}") class CameraListener(Enum): - none = "none" - player = "player" + NONE = "none" + PLAYER = "player" + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return CameraListener(data) + except KeyError: + raise ValueError(f"Invalid CameraListener value: {data}") class Edition(Enum): - bedrock = "bedrock" - preview = "preview" - education = "education" + BEDROCK = "bedrock" + PREVIEW = "preview" + EDUCATION = "education" + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return Edition(data) + except KeyError: + raise ValueError(f"Invalid Edition value: {data}") class ModuleType(Enum): - resources = "resources" - data = "data" - client_data = "client_data" - interface = "interface" - world_template = "world_template" + RESOURCES = "resources" + DATA = "data" + CLIENT_DATA = "client_data" + INTERFACE = "interface" + WORLD_TEMPLATE = "world_template" + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return ModuleType(data) + except KeyError: + raise ValueError(f"Invalid ModuleType value: {data}") class Category(Enum): - commands = "commands" - construction = "construction" - equipment = "equipment" - items = "items" - nature = "nature" - none = "none" + COMMANDS = "commands" + CONSTRUCTION = "construction" + EQUIPMENT = "equipment" + ITEMS = "items" + NATURE = "nature" + NONE = "none" + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return Category(data) + except KeyError: + raise ValueError(f"Invalid Category value: {data}") class RenderMethod(Enum): - opaque = "opaque" - double_sided = "double_sided" - blend = "blend" - alpha_test = "alpha_test" + OPAQUE = "opaque" + DOUBLE_SIDED = "double_sided" + BLEND = "blend" + ALPHA_TEST = "alpha_test" + ALPHA_TEST_SINGLE_SIDED = "alpha_test_single_sided" + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return RenderMethod(data) + except KeyError: + raise ValueError(f"Invalid RenderMethod value: {data}") class EventTarget(Enum): - self = "self" - holder = "holder" - baby = "baby" - other = "other" - player = "player" - target = "target" - parent = "parent" - block = "block" - damager = "damager" - item = "item" + SELF = "self" + HOLDER = "holder" + BABY = "baby" + OTHER = "other" + PLAYER = "player" + TARGET = "target" + PARENT = "parent" + BLOCK = "block" + DAMAGER = "damager" + ITEM = "item" + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return EventTarget(data) + except KeyError: + raise ValueError(f"Invalid EventTarget value: {data}") class UseAnimation(Enum): - eat = "eat" - drink = "drink" - camera = "camera" + EAT = "eat" + DRINK = "drink" + CAMERA = "camera" + def jsonify(self) -> dict: + return self._value_ -class RecipeTag(Enum): - furnace = "furnace" - smoker = "smoker" - campfire = "campfire" - soul_campfire = "soul_campfire" - crafting_table = "crafting_table" - brewing_stand = "brewing_stand" - stonecutter = "stonecutter" - smithing_table = "smithing_table" - material_reducer = "material_reducer" + @staticmethod + def from_dict(data: str) -> Self: + try: + return UseAnimation(data) + except KeyError: + raise ValueError(f"Invalid UseAnimation value: {data}") class BlockFace(Enum): - up = "up" - down = "down" - north = "north" - south = "south" - east = "east" - west = "west" - side = "side" - all = "all" + UP = "up" + DOWN = "down" + NORTH = "north" + SOUTH = "south" + EAST = "east" + WEST = "west" + SIDE = "side" + ALL = "all" + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return BlockFace(data) + except KeyError: + raise ValueError(f"Invalid BlockFace value: {data}") + + +class MapColor(Enum): + CLEAR = "#0" + PALE_GREEN = "#7FB238" + PALE_YELLOW = "#F7E9A3" + WHITE_GRAY = "#C7C7C7" + BRIGHT_RED = "#FF0000" + PALE_PURPLE = "#A0A0FF" + IRON_GRAY = "#A7A7A7" + DARK_GREEN = "#7C00" + WHITE = "#FFFFFF" + LIGHT_BLUE_GRAY = "#A4A8B8" + DIRT_BROWN = "#976D4D" + STONE_GRAY = "#707070" + WATER_BLUE = "#4040FF" + OAK_TAN = "#8F7748" + OFF_WHITE = "#FFFCF5" + ORANGE = "#D87F33" + MAGENTA = "#B24CD8" + LIGHT_BLUE = "#6699D8" + YELLOW = "#E5E533" + LIME = "#7FCC19" + PINK = "#F27FA5" + GRAY = "#4C4C4C" + LIGHT_GRAY = "#999999" + CYAN = "#4C7F99" + PURPLE = "#7F3FB2" + BLUE = "#334CB2" + BROWN = "#664C33" + GREEN = "#667F33" + RED = "#993333" + BLACK = "#191919" + GOLD = "#FAEE4D" + DIAMOND_BLUE = "#5CDBD5" + LAPIS_BLUE = "#4A80FF" + EMERALD_GREEN = "#D93A" + SPRUCE_BROWN = "#815631" + DARK_RED = "#700200" + TERRACOTTA_WHITE = "#D1B1A1" + TERRACOTTA_ORANGE = "#9F5224" + TERRACOTTA_MAGENTA = "#95576C" + TERRACOTTA_LIGHT_BLUE = "#706C8A" + TERRACOTTA_YELLOW = "#BA8524" + TERRACOTTA_LIME = "#677535" + TERRACOTTA_PINK = "#A04D4E" + TERRACOTTA_GRAY = "#392923" + TERRACOTTA_LIGHT_GRAY = "#876B62" + TERRACOTTA_CYAN = "#575C5C" + TERRACOTTA_PURPLE = "#7A4958" + TERRACOTTA_BLUE = "#4C3E5C" + TERRACOTTA_BROWN = "#4C3223" + TERRACOTTA_GREEN = "#4C522A" + TERRACOTTA_RED = "#8E3C2E" + TERRACOTTA_BLACK = "#251610" + DULL_RED = "#BD3031" + DULL_PINK = "#943F61" + DARK_CRIMSON = "#5C191D" + TEAL = "#167E86" + DARK_AQUA = "#3A8E8C" + DARK_DULL_PINK = "#562C3E" + BRIGHT_TEAL = "#14B485" + DEEPSLATE_GRAY = "#646464" + RAW_IRON_PINK = "#D8AF93" + LICHEN_GREEN = "#7FA796" + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return MapColor(data) + except KeyError: + raise ValueError(f"Invalid MapColor value: {data}") + + +MapColour = MapColor + + +class DyeColor(Enum): + WHITE = MapColor.WHITE + LIGHT_GRAY = MapColor.LIGHT_GRAY + GRAY = MapColor.GRAY + BLACK = MapColor.BLACK + BROWN = MapColor.BROWN + RED = MapColor.RED + ORANGE = MapColor.ORANGE + YELLOW = MapColor.YELLOW + LIME = MapColor.LIME + GREEN = MapColor.GREEN + CYAN = MapColor.CYAN + LIGHT_BLUE = MapColor.LIGHT_BLUE + BLUE = MapColor.BLUE + PURPLE = MapColor.PURPLE + MAGENTA = MapColor.MAGENTA + PINK = MapColor.PINK + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return DyeColor(data) + except KeyError: + raise ValueError(f"Invalid DyeColor value: {data}") + + +DyeColour = DyeColor + + +class Formatting(Enum): + DARK_RED = ("§4", "\\u00A74", "#BE0000") + RED = ("§C", "\\u00A7C", "#FE3F3F") + GOLD = ("§6", "\\u00A76", "#D9A334") + YELLOW = ("§E", "\\u00A7E", "#FEFE3F") + DARK_GREEN = ("§2", "\\u00A72", "#00BE00") + GREEN = ("§A", "\\u00A7A", "#3FFE3F") + AQUA = ("§B", "\\u00A7B", "#3FFEFE") + DARK_AQUA = ("§3", "\\u00A73", "#00BEBE") + DARK_BLUE = ("§1", "\\u00A71", "#0000BE") + BLUE = ("§9", "\\u00A79", "#3F3FFE") + LIGHT_PURPLE = ("§D", "\\u00A7D", "#FE3FFE") + DARK_PURPLE = ("§5", "\\u00A75", "#BE00BE") + WHITE = ("§F", "\\u00A7F", "#FFFFFF") + GRAY = ("§7", "\\u00A77", "#BEBEBE") + DARK_GRAY = ("§8", "\\u00A78", "#3F3F3F") + BLACK = ("§0", "\\u00A70", "#000000") + RESET = ("§R", "\\u00A7R", None) + BOLD = ("§L", "\\u00A7L", None) + ITALIC = ("§O", "\\u00A7O", None) + UNDERLINE = ("§N", "\\u00A7N", None) + STRIKE = ("§M", "\\u00A7M", None) + OBFUSCATE = ("§K", "\\u00A7K", None) + + def jsonify(self) -> dict: + return self._value_[2] + + @staticmethod + def from_dict(data: str) -> Self: + try: + return Formatting[data] + except KeyError: + raise ValueError(f"Invalid Formatting value: {data}") class Color(Enum): - white = "white" - light_gray = "light_gray" - gray = "gray" - black = "black" - brown = "brown" - red = "red" - orange = "orange" - yellow = "yellow" - lime = "lime" - green = "green" - cyan = "cyan" - light_blue = "light_blue" - blue = "blue" - purple = "purple" - magenta = "magenta" - pink = "pink" + WHITE = "white" + LIGHT_GRAY = "light_gray" + GRAY = "gray" + BLACK = "black" + BROWN = "brown" + RED = "red" + ORANGE = "orange" + YELLOW = "yellow" + LIME = "lime" + GREEN = "green" + CYAN = "cyan" + LIGHT_BLUE = "light_blue" + BLUE = "blue" + PURPLE = "purple" + MAGENTA = "magenta" + PINK = "pink" + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return Color(data) + except KeyError: + raise ValueError(f"Invalid Color value: {data}") + + +Colour = Color class Destination(Enum): - buriedtreasure = "buriedtreasure" - endcity = "endcity" - fortress = "fortress" - mansion = "mansion" - mineshaft = "mineshaft" - monument = "monument" - pillageroutpost = "pillageroutpost" - ruins = "ruins" - shipwreck = "shipwreck" - stronghold = "stronghold" - temple = "temple" - village = "village" + BURIEDTREASURE = "buriedtreasure" + ENDCITY = "endcity" + FORTRESS = "fortress" + MANSION = "mansion" + MINESHAFT = "mineshaft" + MOMUMENT = "monument" + PILLAGEROUTPOST = "pillageroutpost" + RUINS = "ruins" + SHIPWRECK = "shipwreck" + STRONGHOLD = "stronghold" + TEMPLE = "temple" + VILLAGE = "village" + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return Destination(data) + except KeyError: + raise ValueError(f"Invalid Destination value: {data}") class TextureType(Enum): terrain = "terrain" item = "item" + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return TextureType(data) + except KeyError: + raise ValueError(f"Invalid TextureType value: {data}") + class OxidationLevel(Enum): - unaffected = "unaffected" - exposed = "exposed" - weathered = "weathered" - oxidized = "oxidized" - - -class LootContextType(Enum): - empty = "empty" - chest = "chest" - command = "command" - selector = "selector" - fishing = "fishing" - entity = "entity" - archaeology = "archaeology" - gift = "gift" - barter = "barter" - advancement_reward = "advancement_reward" - advancement_entity = "advancement_entity" - advancement_location = "advancement_location" - generic = "generic" - block = "block" + UNAFFECTED = "unaffected" + EXPOSED = "exposed" + WEATHERED = "weathered" + OXIDIZED = "oxidized" + + def jsonify(self) -> dict: + return self._value_ + + @staticmethod + def from_dict(data: str) -> Self: + try: + return OxidationLevel(data) + except KeyError: + raise ValueError(f"Invalid OxidationLevel value: {data}") diff --git a/mcaddon/schemas/block1.json b/mcaddon/data/schemas/block1.json similarity index 100% rename from mcaddon/schemas/block1.json rename to mcaddon/data/schemas/block1.json diff --git a/mcaddon/data/schemas/block_culling1.json b/mcaddon/data/schemas/block_culling1.json new file mode 100644 index 0000000..8a646ee --- /dev/null +++ b/mcaddon/data/schemas/block_culling1.json @@ -0,0 +1,48 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:block_culling_rules"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:block_culling_rules": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { "type": "string" } + }, + "additionalProperties": false + }, + "rules": { + "type": "array", + "items": { + "type": "object", + "required": ["direction"], + "properties": { + "geometry_part": { + "type": "object", + "properties": { + "bone": { "type": "string" }, + "cube": { "type": "integer" }, + "face": { + "enum": ["north", "south", "east", "west", "up", "down"] + } + }, + "additionalProperties": false + }, + "direction": { + "enum": ["north", "south", "east", "west", "up", "down"] + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/schemas/camera1.json b/mcaddon/data/schemas/camera1.json similarity index 74% rename from mcaddon/schemas/camera1.json rename to mcaddon/data/schemas/camera1.json index 5a09029..f2bbc7e 100644 --- a/mcaddon/schemas/camera1.json +++ b/mcaddon/data/schemas/camera1.json @@ -5,19 +5,16 @@ "format_version": { "type": "string" }, "minecraft:camera_preset": { "type": "object", + "required": ["identifier"], "properties": { - "description": { - "type": "object", - "properties": { - "identifier": { "type": "string" } - }, - "additionalProperties": false - }, + "identifier": { "type": "string" }, + "inherit_from": { "type": "string" }, "pos_x": { "type": "integer" }, "pos_y": { "type": "integer" }, "pos_z": { "type": "integer" }, "rot_x": { "type": "integer" }, "rot_y": { "type": "integer" }, + "player_effects": { "type": "boolean" }, "listener": { "type": "string" } }, "additionalProperties": false diff --git a/mcaddon/schemas/common.json b/mcaddon/data/schemas/common.json similarity index 100% rename from mcaddon/schemas/common.json rename to mcaddon/data/schemas/common.json diff --git a/mcaddon/data/schemas/feature/aggregate.json b/mcaddon/data/schemas/feature/aggregate.json new file mode 100644 index 0000000..49ee07d --- /dev/null +++ b/mcaddon/data/schemas/feature/aggregate.json @@ -0,0 +1,33 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:aggregate_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:aggregate_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "early_out": {"type": "string"}, + "features": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/beards_and_shavers.json b/mcaddon/data/schemas/feature/beards_and_shavers.json new file mode 100644 index 0000000..637886d --- /dev/null +++ b/mcaddon/data/schemas/feature/beards_and_shavers.json @@ -0,0 +1,34 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:beards_and_shavers_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:beards_and_shavers_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "places_feature": { "type": "string" }, + "bounding_box_min": { "type": "array", "items": { "type": "integer" } }, + "bounding_box_max": { "type": "array", "items": { "type": "integer" } }, + "y_delta": {"type": "number"}, + "surface_block_type": {"type": "string"}, + "subsurface_block_type": {"type": "string"}, + "beard_raggedness_min": {"type": "number"}, + "beard_raggedness_max": {"type": "number"}, + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/cave_carver.json b/mcaddon/data/schemas/feature/cave_carver.json new file mode 100644 index 0000000..c380977 --- /dev/null +++ b/mcaddon/data/schemas/feature/cave_carver.json @@ -0,0 +1,60 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:cave_carver_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:cave_carver_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "fill_with": { "type": "string" }, + "width_modifier": { "type": "number" }, + "skip_carve_chance": { "type": "integer" }, + "floor_level": { + "type": ["number", "array"], + "maxItems": 2, + "minItems": 2, + "items": { + "type": "number" + } + }, + "height_limit": { "type": "integer" }, + "horizontal_radius_multiplier": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { + "type": "number" + } + }, + "vertical_radius_multiplier": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { + "type": "number" + } + }, + "y_scale": { + "type": ["number", "array"], + "minItems": 2, + "maxItems": 2, + "items": { "type": "number" } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/conditional_list.json b/mcaddon/data/schemas/feature/conditional_list.json new file mode 100644 index 0000000..25f65f3 --- /dev/null +++ b/mcaddon/data/schemas/feature/conditional_list.json @@ -0,0 +1,38 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:conditional_list"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:conditional_list": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "conditional_features": { + "type": "array", + "items": { + "type": "object", + "properties": { + "places_feature": { "type": "string" }, + "condition": { "type": "string" } + }, + "additionalProperties": false + } + }, + "early_out_scheme": { "type": "string" } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/fossil.json b/mcaddon/data/schemas/feature/fossil.json new file mode 100644 index 0000000..5ef6dea --- /dev/null +++ b/mcaddon/data/schemas/feature/fossil.json @@ -0,0 +1,28 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:fossil_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:fossil_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "ore_block": { "type": "string" }, + "max_empty_corners": { "type": "integer" } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/geode.json b/mcaddon/data/schemas/feature/geode.json new file mode 100644 index 0000000..7a06aa5 --- /dev/null +++ b/mcaddon/data/schemas/feature/geode.json @@ -0,0 +1,62 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:geode_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:geode_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "filler": { "type": "string" }, + "inner_layer": { "type": "string" }, + "alternate_inner_layer": { "type": "string" }, + "middle_layer": { "type": "string" }, + "outer_layer": { "type": "string" }, + "inner_placements": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + } + }, + "min_outer_wall_distance": { "type": "integer" }, + "max_outer_wall_distance": { "type": "integer" }, + "min_distribution_points": { "type": "integer" }, + "max_distribution_points": { "type": "integer" }, + "min_point_offset": { "type": "integer" }, + "max_point_offset": { "type": "integer" }, + "max_radius": { "type": "integer" }, + "crack_point_offset": { "type": "integer" }, + "generate_crack_chance": { "type": "number" }, + "base_crack_size": { "type": "number" }, + "noise_multiplier": { "type": "number" }, + "use_potential_placements_chance": { "type": "number" }, + "use_alternate_layer0_chance": { "type": "number" }, + "placements_require_layer0_alternate": { "type": "boolean" }, + "invalid_blocks_threshold": { "type": "integer" } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/growing_plant.json b/mcaddon/data/schemas/feature/growing_plant.json new file mode 100644 index 0000000..4a882bb --- /dev/null +++ b/mcaddon/data/schemas/feature/growing_plant.json @@ -0,0 +1,39 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:growing_plant_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:growing_plant_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "height_distribution": { "type": "array", "items": {} }, + "growth_direction": { "type": "string" }, + "age": { + "type": "object", + "properties": { + "range_min": { "type": "integer" }, + "range_max": { "type": "integer" } + }, + "additionalProperties": false + }, + "body_blocks": { "type": "array", "items": {} }, + "head_blocks": { "type": "array", "items": {} }, + "allow_water": { "type": "boolean" } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/multiface.json b/mcaddon/data/schemas/feature/multiface.json new file mode 100644 index 0000000..3758242 --- /dev/null +++ b/mcaddon/data/schemas/feature/multiface.json @@ -0,0 +1,36 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:multiface_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:multiface_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "places_block": { "type": "string" }, + "search_range": { "type": "integer" }, + "can_place_on_floor": { "type": "boolean" }, + "can_place_on_ceiling": { "type": "boolean" }, + "can_place_on_wall": { "type": "boolean" }, + "chance_of_spreading": { "type": "number" }, + "can_place_on": { + "type": "array", + "items": { "type": "string" } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/nether_cave_carver.json b/mcaddon/data/schemas/feature/nether_cave_carver.json new file mode 100644 index 0000000..a15a23c --- /dev/null +++ b/mcaddon/data/schemas/feature/nether_cave_carver.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:nether_cave_carver_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:nether_cave_carver_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "fill_with": {"type": "string"}, + "width_modifier": {"type": "number"} + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + \ No newline at end of file diff --git a/mcaddon/data/schemas/feature/ore.json b/mcaddon/data/schemas/feature/ore.json new file mode 100644 index 0000000..f469230 --- /dev/null +++ b/mcaddon/data/schemas/feature/ore.json @@ -0,0 +1,65 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:ore_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:ore_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "count": { "type": "integer" }, + "discard_chance_on_air_exposure": { "type": "number" }, + "places_block": { + "type": "string" + }, + "replace_rules": { + "type": "array", + "items": { + "type": "object", + "properties": { + "places_block": { + "type": ["string", "object"], + "properties": { + "name": { "type": "string" }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + }, + "may_replace": { + "type": "array", + "items": { + "type": ["string", "object"], + "properties": { + "name": { "type": "string" }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/partially_exposed_blob.json b/mcaddon/data/schemas/feature/partially_exposed_blob.json new file mode 100644 index 0000000..dea400a --- /dev/null +++ b/mcaddon/data/schemas/feature/partially_exposed_blob.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:partially_exposed_blob_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:partially_exposed_blob_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "places_block": {"type": "string"}, + "placement_radius_around_floor": {"type": "integer"}, + "placement_probability_per_valid_position": {"type": "number"}, + "exposed_face": {"type": "string"} + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + \ No newline at end of file diff --git a/mcaddon/data/schemas/feature/rect_layout.json b/mcaddon/data/schemas/feature/rect_layout.json new file mode 100644 index 0000000..3843bfe --- /dev/null +++ b/mcaddon/data/schemas/feature/rect_layout.json @@ -0,0 +1,45 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:rect_layout"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:rect_layout": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "ratio_of_empty_space": { "type": "number" }, + "feature_areas": { + "type": "array", + "items": { + "type": "object", + "properties": { + "feature": { "type": "string" }, + "area_dimentions": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { + "type": "integer" + } + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/scan_surface.json b/mcaddon/data/schemas/feature/scan_surface.json new file mode 100644 index 0000000..5261c89 --- /dev/null +++ b/mcaddon/data/schemas/feature/scan_surface.json @@ -0,0 +1,28 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:scan_surface"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:scan_surface": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "scan_surface_feature": {"type": "string"} + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + \ No newline at end of file diff --git a/mcaddon/data/schemas/feature/scatter.json b/mcaddon/data/schemas/feature/scatter.json new file mode 100644 index 0000000..e161dff --- /dev/null +++ b/mcaddon/data/schemas/feature/scatter.json @@ -0,0 +1,76 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:scatter_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:scatter_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "project_input_to_floor": { "type": "boolean" }, + "places_feature": { "type": "string" }, + "iterations": { "type": ["integer", "string"] }, + "scatter_chance": { "type": "number" }, + "coordinate_eval_order": { "type": "string" }, + "x": { + "type": ["object", "integer"], + "properties": { + "distribution": { "type": "string" }, + "extent": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { + "type": "integer" + } + } + }, + "additionalProperties": false + }, + "y": { + "type": ["object", "integer"], + "properties": { + "distribution": { "type": "string" }, + "extent": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { + "type": "integer" + } + } + }, + "additionalProperties": false + }, + "z": { + "type": ["object", "integer"], + "properties": { + "distribution": { "type": "string" }, + "extent": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { + "type": "integer" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/sculk_patch.json b/mcaddon/data/schemas/feature/sculk_patch.json new file mode 100644 index 0000000..cb4fc8d --- /dev/null +++ b/mcaddon/data/schemas/feature/sculk_patch.json @@ -0,0 +1,48 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:sculk_patch_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:sculk_patch_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + + "can_place_sculk_patch_on": { + "type": "array", + "items": { + "type": "string" + } + }, + "central_block": { "type": "string" }, + "central_block_placement_chance": { "type": "number" }, + "charge_amount": { "type": "integer" }, + "cursor_count": { "type": "integer" }, + "growth_rounds": { "type": "integer" }, + "spread_attempts": { "type": "integer" }, + "spread_rounds": { "type": "integer" }, + "extra_growth_chance": { + "type": "object", + "properties": { + "range_min": { "type": "integer" }, + "range_max": { "type": "integer" } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/search.json b/mcaddon/data/schemas/feature/search.json new file mode 100644 index 0000000..1266299 --- /dev/null +++ b/mcaddon/data/schemas/feature/search.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:search_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:search_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "places_feature": { "type": "string" }, + "search_volume": { + "type": "object", + "properties": { + "min": { + "type": "array", + "maxItems": 3, + "minItems": 3, + "items": { "type": "integer" } + }, + "max": { + "type": "array", + "maxItems": 3, + "minItems": 3, + "items": { "type": "integer" } + } + }, + "additionalProperties": false + }, + "search_axis": { "type": "string" }, + "required_successes": { "type": "integer" } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/sequence.json b/mcaddon/data/schemas/feature/sequence.json new file mode 100644 index 0000000..e2fbf89 --- /dev/null +++ b/mcaddon/data/schemas/feature/sequence.json @@ -0,0 +1,33 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:sequence_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:sequence_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "features": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + \ No newline at end of file diff --git a/mcaddon/data/schemas/feature/single_block.json b/mcaddon/data/schemas/feature/single_block.json new file mode 100644 index 0000000..5e4525c --- /dev/null +++ b/mcaddon/data/schemas/feature/single_block.json @@ -0,0 +1,143 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:single_block_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:single_block_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "places_block": { + "type": ["object", "string"], + "properties": { + "name": { "type": "string" }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + }, + "enforce_placement_rule": { "type": "boolean" }, + "enforce_survivability_rule": { "type": "boolean" }, + "may_place_on": { + "type": "array", + "items": { + "type": "string" + } + }, + "may_replace": { + "type": "array", + "items": { + "type": "string" + } + }, + "may_attach_to": { + "type": "object", + "properties": { + "auto_rotate": { "type": "boolean" }, + "min_sides_must_attach": { "type": "integer" }, + "north": { + "type": ["array", "string"], + "items": { + "type": ["object", "string"], + "properties": { + "name": { "type": "string" }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + } + }, + "south": { + "type": ["array", "string"], + "items": { + "type": ["object", "string"], + "properties": { + "name": { "type": "string" }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + } + }, + "east": { + "type": ["array", "string"], + "items": { + "type": ["object", "string"], + "properties": { + "name": { "type": "string" }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + } + }, + "west": { + "type": ["array", "string"], + "items": { + "type": ["object", "string"], + "properties": { + "name": { "type": "string" }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + } + }, + "top": { + "type": ["array", "string"], + "items": { + "type": ["object", "string"], + "properties": { + "name": { "type": "string" }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + } + }, + "bottom": { + "type": ["array", "string"], + "items": { + "type": ["object", "string"], + "properties": { + "name": { "type": "string" }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/snap_to_surface.json b/mcaddon/data/schemas/feature/snap_to_surface.json new file mode 100644 index 0000000..5ff6d8a --- /dev/null +++ b/mcaddon/data/schemas/feature/snap_to_surface.json @@ -0,0 +1,31 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:snap_to_surface_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:snap_to_surface_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "feature_to_snap": { "type": "string" }, + "vertical_search_range": { "type": "integer" }, + "surface": { "type": "string" }, + "allow_air_placement": { "type": "boolean" }, + "allow_underwater_placement": { "type": "boolean" } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/structure_template.json b/mcaddon/data/schemas/feature/structure_template.json new file mode 100644 index 0000000..3e3703d --- /dev/null +++ b/mcaddon/data/schemas/feature/structure_template.json @@ -0,0 +1,58 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:structure_template_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:structure_template_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "structure_name": { "type": "string" }, + "adjustment_radius": { "type": "integer" }, + "facing_direction": { "type": "string" }, + "constraints": { + "type": "object", + "properties": { + "unburied": { + "type": "object", + "properties": {}, + "additionalProperties": false + }, + "block_intersection": { + "type": "object", + "properties": { + "block_allowlist": { + "type": "array", + "items": { + "type": "string" + } + }, + "block_denylist": { + "type": "array", + "items": { + "type": "string" + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/surface_relative_threshold.json b/mcaddon/data/schemas/feature/surface_relative_threshold.json new file mode 100644 index 0000000..729324e --- /dev/null +++ b/mcaddon/data/schemas/feature/surface_relative_threshold.json @@ -0,0 +1,32 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": [ + "format_version", + "minecraft:surface_relative_threshold_feature" + ], + "properties": { + "format_version": { "type": "string" }, + "minecraft:surface_relative_threshold_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "feature_to_place": { "type": "string" }, + "feature_to_snap": { "type": "string" }, + "minimum_distance_below_surface": { "type": "integer" } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/tree.json b/mcaddon/data/schemas/feature/tree.json new file mode 100644 index 0000000..0e51458 --- /dev/null +++ b/mcaddon/data/schemas/feature/tree.json @@ -0,0 +1,128 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:tree_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:tree_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "base_block": { + "type": ["array", "string"], + "items": { + "type": ["object", "string"], + "properties": { + "tags": { "type": "string" }, + "name": { "type": "string" }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + } + }, + "base_cluster": { + "type": "object", + "properties": { + "cluster_radius": { "type": "integer" }, + "num_clusters": { "type": "integer" }, + "may_replace": { + "type": "array", + "items": { + "type": ["object", "string"], + "properties": { + "tags": { "type": "string" }, + "name": { "type": "string" }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + }, + "may_grow_on": { + "type": "array", + "items": { + "type": ["object", "string"], + "properties": { + "tags": { "type": "string" }, + "name": { "type": "string" }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + } + }, + "may_replace": { + "type": "array", + "items": { + "type": ["object", "string"], + "properties": { + "tags": { "type": "string" }, + "name": { "type": "string" }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + } + }, + "may_grow_through": { + "type": "array", + "items": { + "type": ["object", "string"], + "properties": { + "tags": { "type": "string" }, + "name": { "type": "string" }, + "states": { + "type": "object", + "additionalProperties": true + } + }, + "additionalProperties": false + } + }, + "trunk": {}, + "acacia_trunk": {}, + "cherry_trunk": {}, + "fallen_trunk": {}, + "fancy_trunk": {}, + "mangrove_trunk": {}, + "mega_trunk": {}, + "canopy": {}, + "acacia_canopy": {}, + "cherry_canopy": {}, + "fancy_canopy": {}, + "mangrove_canopy": {}, + "mega_canopy": {}, + "mega_pine_canopy": {}, + "pine_canopy": {}, + "roofed_canopy": {}, + "spruce_canopy": {}, + "random_spread_canopy": {}, + "mangrove_roots": {} + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/underwater_cave_carver.json b/mcaddon/data/schemas/feature/underwater_cave_carver.json new file mode 100644 index 0000000..38b6412 --- /dev/null +++ b/mcaddon/data/schemas/feature/underwater_cave_carver.json @@ -0,0 +1,29 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:underwater_cave_carver_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:underwater_cave_carver_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "fill_with": { "type": "string" }, + "width_modifier": { "type": "number" }, + "replace_air_with": { "type": "string" } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/vegetation_patch.json b/mcaddon/data/schemas/feature/vegetation_patch.json new file mode 100644 index 0000000..ea81365 --- /dev/null +++ b/mcaddon/data/schemas/feature/vegetation_patch.json @@ -0,0 +1,57 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:vegetation_patch_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:vegetation_patch_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "replaceable_blocks": { + "type": "array", + "items": { + "type": "string" + } + }, + "extra_deep_column_chance": {"type": "number"}, + "ground_block": { "type": "string" }, + "vegetation_feature": { "type": "string" }, + "surface": { "type": "string" }, + "depth": { + "type": ["object", "integer"], + "properties": { + "range_min": { "type": "integer" }, + "range_max": { "type": "integer" } + }, + "additionalProperties": false + }, + "vertical_range": { "type": "integer" }, + "vegetation_chance": { "type": "number" }, + "horizontal_radius": { + "type": "object", + "properties": { + "range_min": { "type": "integer" }, + "range_max": { "type": "integer" } + }, + "additionalProperties": false + }, + "extra_deep_block_chance": { "type": "number" }, + "extra_edge_column_chance": { "type": "number" }, + "waterlogged": { "type": "boolean" } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature/weighted_random.json b/mcaddon/data/schemas/feature/weighted_random.json new file mode 100644 index 0000000..14f1226 --- /dev/null +++ b/mcaddon/data/schemas/feature/weighted_random.json @@ -0,0 +1,37 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:weighted_random_feature"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:weighted_random_feature": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "features": { + "type": "array", + "items": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { + "type": ["string", "integer"] + } + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/feature_rules1.json b/mcaddon/data/schemas/feature_rules1.json new file mode 100644 index 0000000..279d7f8 --- /dev/null +++ b/mcaddon/data/schemas/feature_rules1.json @@ -0,0 +1,47 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:feature_rules"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:feature_rules": { + "type": "object", + "required": ["description"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { "type": "string" }, + "places_feature": { "type": "string" } + }, + "additionalProperties": false + }, + + "conditions": { + "type": "object", + "properties": { + "placement_pass": { "type": "string" }, + "minecraft:biome_filter": { + "type": "array", + "items": {} + } + }, + "additionalProperties": false + }, + "distribution": { + "type": "object", + "properties": { + "iterations": { "type": ["string", "integer"] }, + "x": { "type": "integer" }, + "y": { "type": "integer" }, + "z": { "type": "integer" } + }, + "additionalProperties": false + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/schemas/geometry1.json b/mcaddon/data/schemas/geometry1.json new file mode 100644 index 0000000..2abe2fb --- /dev/null +++ b/mcaddon/data/schemas/geometry1.json @@ -0,0 +1,252 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "minecraft:geometry"], + "properties": { + "format_version": { "type": "string" }, + "minecraft:geometry": { + "type": "array", + "items": { + "type": "object", + "required": ["description", "bones"], + "properties": { + "description": { + "type": "object", + "required": ["identifier"], + "properties": { + "identifier": { "type": "string" }, + "texture_height": { "type": "integer" }, + "texture_width": { "type": "integer" }, + "visible_bounds_offset": { + "type": "array", + "minItems": 3, + "maxItems": 3, + "items": { "type": "number" } + }, + "visible_bounds_width": { "type": "number" }, + "visible_bounds_height": { "type": "number" } + }, + "additionalProperties": false + }, + "bones": { + "type": "array", + "items": { + "type": "object", + "properties": { + "name": { "type": "string" }, + "parent": { "type": "string" }, + "mirror": { "type": "boolean" }, + "binding": { "type": "string" }, + "rotation": { + "type": "array", + "maxItems": 3, + "minItems": 3, + "items": { "type": "number" } + }, + "texture_meshes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "local_pivot": { + "type": "array", + "maxItems": 3, + "minItems": 3, + "items": { "type": "number" } + }, + "position": { + "type": "array", + "maxItems": 3, + "minItems": 3, + "items": { "type": "number" } + }, + "rotation": { + "type": "array", + "maxItems": 3, + "minItems": 3, + "items": { "type": "number" } + }, + "texture": { "type": "string" } + }, + "additionalProperties": false + } + }, + "locators": { + "type": "object", + "additionalProperties": { + "type": "array", + "maxItems": 3, + "minItems": 3, + "items": { "type": "number" } + } + }, + "pivot": { + "type": "array", + "maxItems": 3, + "minItems": 3, + "items": { "type": "number" } + }, + "inflate": { "type": "number" }, + "reset": { "type": "boolean" }, + "cubes": { + "type": "array", + "items": { + "type": "object", + "properties": { + "origin": { + "type": "array", + "maxItems": 3, + "minItems": 3, + "items": { "type": "number" } + }, + "size": { + "type": "array", + "maxItems": 3, + "minItems": 3, + "items": { "type": "number" } + }, + "uv": { + "type": ["array", "object"], + "maxItems": 2, + "minItems": 2, + "items": { "type": "number" }, + "properties": { + "north": { + "type": "object", + "properties": { + "uv": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { "type": "number" } + }, + "uv_size": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { "type": "number" } + } + }, + "additionalProperties": false + }, + "south": { + "type": "object", + "properties": { + "uv": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { "type": "number" } + }, + "uv_size": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { "type": "number" } + } + }, + "additionalProperties": false + }, + "east": { + "type": "object", + "properties": { + "uv": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { "type": "number" } + }, + "uv_size": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { "type": "number" } + } + }, + "additionalProperties": false + }, + "west": { + "type": "object", + "properties": { + "uv": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { "type": "number" } + }, + "uv_size": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { "type": "number" } + } + }, + "additionalProperties": false + }, + "up": { + "type": "object", + "properties": { + "uv": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { "type": "number" } + }, + "uv_size": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { "type": "number" } + } + }, + "additionalProperties": false + }, + "down": { + "type": "object", + "properties": { + "uv": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { "type": "number" } + }, + "uv_size": { + "type": "array", + "maxItems": 2, + "minItems": 2, + "items": { "type": "number" } + } + }, + "additionalProperties": false + } + } + }, + "mirror": { "type": "boolean" }, + "inflate": { "type": "number" }, + "rotation": { + "type": "array", + "maxItems": 3, + "minItems": 3, + "items": { "type": "number" } + }, + "pivot": { + "type": "array", + "maxItems": 3, + "minItems": 3, + "items": { "type": "number" } + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false +} diff --git a/mcaddon/schemas/item1.json b/mcaddon/data/schemas/item1.json similarity index 100% rename from mcaddon/schemas/item1.json rename to mcaddon/data/schemas/item1.json diff --git a/mcaddon/schemas/item2.json b/mcaddon/data/schemas/item2.json similarity index 100% rename from mcaddon/schemas/item2.json rename to mcaddon/data/schemas/item2.json diff --git a/mcaddon/data/schemas/manifest1.json b/mcaddon/data/schemas/manifest1.json new file mode 100644 index 0000000..ef221bc --- /dev/null +++ b/mcaddon/data/schemas/manifest1.json @@ -0,0 +1,109 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "required": ["format_version", "header", "modules"], + "properties": { + "format_version": { + "type": "integer" + }, + "header": { + "type": "object", + "required": ["name", "description", "uuid", "version"], + "properties": { + "description": { "type": "string" }, + "name": { "type": "string" }, + "min_engine_version": { + "type": "array", + "minItems": 3, + "maxItems": 3, + "items": { "type": "integer" } + }, + "uuid": { + "type": "string" + }, + "version": { + "type": "array", + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "pack_scope": { + "enum": [ + "world" + ] + } + }, + "additionalProperties": false + }, + "dependencies": { + "type": "array", + "items": { + "type": "object", + "required": ["uuid", "version"], + "properties": { + "uuid": { + "type": "string" + }, + "version": { + "type": "array", + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + } + }, + "additionalProperties": false + } + }, + "capabilities": { + "type": ["object", "array"], + "properties": { + "chemistry": { + "type": "boolean" + }, + "editorExtension": { + "type": "boolean" + }, + "experimental_custom_ui": { + "type": "boolean" + }, + "raytraced": { + "type": "boolean" + } + }, + "items": { + "enum": [ + "chemistry", + "editorExtension", + "experimental_custom_ui", + "raytraced" + ] + } + }, + "modules": { + "type": "array", + "items": { + "type": "object", + "required": ["type", "uuid", "version"], + "properties": { + "description": { "type": "string" }, + "type": { "enum": ["data", "resources"] }, + "version": { + "type": "array", + "minItems": 3, + "maxItems": 3, + "items": { + "type": "integer" + } + }, + "uuid": { "type": "string" } + }, + "additionalProperties": false + } + } + }, + "additionalProperties": false +} diff --git a/mcaddon/schemas/brewing_container1.json b/mcaddon/data/schemas/recipe/brewing_container1.json similarity index 100% rename from mcaddon/schemas/brewing_container1.json rename to mcaddon/data/schemas/recipe/brewing_container1.json diff --git a/mcaddon/schemas/brewing_mix1.json b/mcaddon/data/schemas/recipe/brewing_mix1.json similarity index 100% rename from mcaddon/schemas/brewing_mix1.json rename to mcaddon/data/schemas/recipe/brewing_mix1.json diff --git a/mcaddon/schemas/furnace1.json b/mcaddon/data/schemas/recipe/furnace1.json similarity index 100% rename from mcaddon/schemas/furnace1.json rename to mcaddon/data/schemas/recipe/furnace1.json diff --git a/mcaddon/schemas/material_reduction1.json b/mcaddon/data/schemas/recipe/material_reduction1.json similarity index 100% rename from mcaddon/schemas/material_reduction1.json rename to mcaddon/data/schemas/recipe/material_reduction1.json diff --git a/mcaddon/schemas/shaped1.json b/mcaddon/data/schemas/recipe/shaped1.json similarity index 100% rename from mcaddon/schemas/shaped1.json rename to mcaddon/data/schemas/recipe/shaped1.json diff --git a/mcaddon/schemas/shapeless1.json b/mcaddon/data/schemas/recipe/shapeless1.json similarity index 100% rename from mcaddon/schemas/shapeless1.json rename to mcaddon/data/schemas/recipe/shapeless1.json diff --git a/mcaddon/schemas/smithing_transform1.json b/mcaddon/data/schemas/recipe/smithing_transform1.json similarity index 100% rename from mcaddon/schemas/smithing_transform1.json rename to mcaddon/data/schemas/recipe/smithing_transform1.json diff --git a/mcaddon/schemas/smithing_transform2.json b/mcaddon/data/schemas/recipe/smithing_transform2.json similarity index 100% rename from mcaddon/schemas/smithing_transform2.json rename to mcaddon/data/schemas/recipe/smithing_transform2.json diff --git a/mcaddon/schemas/smithing_trim1.json b/mcaddon/data/schemas/recipe/smithing_trim1.json similarity index 100% rename from mcaddon/schemas/smithing_trim1.json rename to mcaddon/data/schemas/recipe/smithing_trim1.json diff --git a/mcaddon/data/schemas/volume1.json b/mcaddon/data/schemas/volume1.json new file mode 100644 index 0000000..28a8234 --- /dev/null +++ b/mcaddon/data/schemas/volume1.json @@ -0,0 +1,43 @@ +{ + "$schema": "http://json-schema.org/draft-07/schema", + "type": "object", + "properties": { + "format_version": { "type": "string" }, + "minecraft:volume": { + "type": "object", + "default": {}, + "required": ["description"], + "properties": { + "description": { + "type": "object", + "default": {}, + "required": ["identifier"], + "properties": { + "identifier": { + "type": "string" + } + }, + "additionalProperties": false + }, + "components": { + "type": "object", + "default": {}, + "additionalProperties": { + "type": "object", + "default": {} + } + }, + "events": { + "type": "object", + "default": {}, + "additionalProperties": { + "type": "object", + "default": {} + } + } + }, + "additionalProperties": false + } + }, + "additionalProperties": false +} diff --git a/mcaddon/data/shaders/default.frag b/mcaddon/data/shaders/default.frag new file mode 100644 index 0000000..f8b20bd --- /dev/null +++ b/mcaddon/data/shaders/default.frag @@ -0,0 +1,7 @@ +#version 330 + +out vec4 color; + +void main() { + color = vec4(1.0, 0.0, 0.0, 1.0); +} \ No newline at end of file diff --git a/mcaddon/data/shaders/default.vert b/mcaddon/data/shaders/default.vert new file mode 100644 index 0000000..bac00de --- /dev/null +++ b/mcaddon/data/shaders/default.vert @@ -0,0 +1,21 @@ +#version 330 + +layout (location = 1) in vec3 in_normal; +layout (location = 2) in vec3 in_position; + +out vec3 normal; +out vec3 fragPos; + +uniform mat4 m_proj; +uniform mat4 m_view; +uniform mat4 m_model; + +void main() { + fragPos = vec3(m_model * vec4(in_position, 1.0)); + normal = mat3(transpose(inverse(m_model))) * normalize(in_normal); + gl_Position = m_proj * m_view * m_model * vec4(in_position, 1.0); + // gl_Position = m_model * vec4(in_position, 1.0); + + + // gl_Position = vec4(vert, 0.0, 1.0); +} \ No newline at end of file diff --git a/mcaddon/event.py b/mcaddon/event.py index ac81fdc..0ba71d2 100644 --- a/mcaddon/event.py +++ b/mcaddon/event.py @@ -3,45 +3,78 @@ from .registry import INSTANCE, Registries from .constant import EventTarget -from .util import getattr2, Identifier +from .math import Vector3 +from .util import ( + getattr2, + clearitems, + getitem, + removeitem, + additem, + Identifier, + Identifiable, + Misc, +) # EVENTS -class Event: +class Event(Misc): """Base event class for items and blocks""" def __init__(self, target: EventTarget = None): self.target = target - @property - def __dict__(self) -> dict: - data = super().__dict__ - data["target"] = self.target._value_ + def __call__(self, ctx) -> int: + return self.execute(ctx) + + def jsonify(self) -> dict: + data = super().jsonify() + data["target"] = self.target.jsonify() + return data @property def target(self) -> EventTarget: - return getattr(self, "_target", EventTarget.self) + return getattr(self, "_target", EventTarget.SELF) @target.setter def target(self, value: EventTarget): if value is None: - setattr(self, "_target", EventTarget.self) + self.target = EventTarget.SELF return if not isinstance(value, EventTarget): raise TypeError( f"Expected EventTarget but got '{value.__class__.__name__}' instead" ) + self.on_update("target", value) setattr(self, "_target", value) @classmethod def from_dict(cls, data: dict) -> Self: self = cls.__new__(cls) if "target" in data: - self.target = EventTarget[data.pop("target")] + self.target = EventTarget.from_dict(data.pop("target")) return self + @property + def id(self) -> Identifier: + return getattr(self, "_id") + + @id.setter + def id(self, value: Identifier): + setattr(self, "_id", Identifier.of(value)) + + def generate(self, ctx) -> None: + """ + Called when this event is added to Item, Block, Volume, or BehaviorPack + + :type ctx: Item | Block | Volume | BehaviorPack + """ + ... + + def execute(self, ctx) -> int: + return 0 + INSTANCE.create_registry(Registries.EVENT_TYPE, Event) @@ -61,31 +94,30 @@ def wrapper(): @event_type class AddMobEffect(Event): - """Apply mob effect to target""" + """Apply mob effect to target. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_add_mob_effect?view=minecraft-bedrock-stable)""" id = Identifier("add_mob_effect") def __init__( self, - effect: Identifier | str, + effect: Identifiable, amplifier: int = 0, duration: float = 0.0, target: EventTarget = None, ): Event.__init__(self, target) - self.effect = Identifier(effect) + self.effect = effect self.amplifier = amplifier self.duration = duration self.target = target - @property - def __dict__(self): + def jsonify(self): data = { "amplifier": self.amplifier, "duration": self.duration, "effect": str(self.effect), } - if self.target not in [None, EventTarget.self]: + if self.target not in [None, EventTarget.SELF]: data["target"] = self.target._value_ return data @@ -94,7 +126,7 @@ def from_dict(cls, data: dict) -> Self: self = super().from_dict(data) self.amplifier = data.pop("amplifier") self.duration = data.pop("duration") - self.effect = Identifier(data.pop("effect")) + self.effect = data.pop("effect") return self @property @@ -102,13 +134,10 @@ def effect(self) -> Identifier: return getattr(self, "_effect") @effect.setter - def effect(self, value: Identifier): - if isinstance(value, Identifier): - setattr(self, "_effect", value) - else: - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) + def effect(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("effect", id) + setattr(self, "_effect", id) @property def amplifier(self) -> int: @@ -117,6 +146,7 @@ def amplifier(self) -> int: @amplifier.setter def amplifier(self, value: int): if isinstance(value, int): + self.on_update("amplifier", value) setattr(self, "_amplifier", value) else: raise TypeError( @@ -130,6 +160,7 @@ def duration(self) -> float: @duration.setter def duration(self, value: float): if isinstance(value, float): + self.on_update("duration", value) setattr(self, "_duration", value) else: raise TypeError( @@ -139,54 +170,54 @@ def duration(self, value: float): @event_type class Damage(Event): - """Deals damage to the target""" + """Deals damage to the target. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_damage?view=minecraft-bedrock-stable)""" id = Identifier("damage") def __init__( self, - type: Identifier | str, + type: Identifiable, amount: int = 0, mob_amount: int = 0, target: EventTarget = None, ): Event.__init__(self, target) - self.type = Identifier(type) + self.type = type self.amount = amount self.mob_amount = mob_amount self.target = target - @property - def __dict__(self): + def jsonify(self): data = { "type": str(self.type), "amount": self.amount, "mob_amount": self.mob_amount, } - if self.target not in [None, EventTarget.self]: + if self.target not in [None, EventTarget.SELF]: data["target"] = self.target._value_ return data @classmethod def from_dict(cls, data: dict) -> Self: self = super().from_dict(data) - self.type = Identifier(data.pop("type")) + self.type = data.pop("type") self.amount = data.pop("amount") self.mob_amount = data.pop("mob_amount") return self + @staticmethod + def item(amount: int = 1): + return Damage("durability", amount, target=EventTarget.ITEM) + @property def type(self) -> Identifier: return getattr(self, "_type") @type.setter - def type(self, value: Identifier): - if isinstance(value, Identifier): - setattr(self, "_type", value) - else: - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) + def type(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("type", id) + setattr(self, "_type", id) @property def amount(self) -> int: @@ -195,6 +226,7 @@ def amount(self) -> int: @amount.setter def amount(self, value: int): if isinstance(value, int): + self.on_update("amount", value) setattr(self, "_amount", value) else: raise TypeError( @@ -208,6 +240,7 @@ def mob_amount(self) -> int: @mob_amount.setter def mob_amount(self, value: int): if isinstance(value, int): + self.on_update("mob_amount", value) setattr(self, "_mob_amount", value) else: raise TypeError( @@ -217,7 +250,7 @@ def mob_amount(self, value: int): @event_type class DecrementStack(Event): - """Decrement item stack""" + """Decrement item stack. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_decrement_stack?view=minecraft-bedrock-stable)""" id = Identifier("decrement_stack") @@ -229,15 +262,14 @@ def from_dict(cls, data: dict) -> Self: self = cls.__new__(cls) return self - @property - def __dict__(self): + def jsonify(self): data = {} return data @event_type class Die(Event): - """Kill target. If target is self and this is run from a block then destroy the block""" + """Kill target. If target is self and this is run from a block then destroy the block. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_die?view=minecraft-bedrock-stable)""" id = Identifier("die") @@ -249,39 +281,35 @@ def from_dict(cls, data: dict) -> Self: self = super().from_dict(data) return self - @property - def __dict__(self): + def jsonify(self): data = {} - if self.target not in [None, EventTarget.self]: + if self.target not in [None, EventTarget.SELF]: data["target"] = self.target._value_ return data @event_type class PlayEffect(Event): - """Spawns a particle effect relative to target position""" + """Spawns a particle effect relative to target position. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_play_effect?view=minecraft-bedrock-stable)""" id = Identifier("play_effect") - def __init__( - self, effect: Identifier | str, data: int = 0, target: EventTarget = None - ): + def __init__(self, effect: Identifiable, data: int = 0, target: EventTarget = None): Event.__init__(self, target) - self.effect = Identifier(effect) + self.effect = effect self.data = data self.target = target @classmethod def from_dict(cls, data: dict) -> Self: self = super().from_dict(data) - self.effect = Identifier(data.pop("effect")) + self.effect = data.pop("effect") self.data = data.pop("data") return self - @property - def __dict__(self): + def jsonify(self): data = {"effect": str(self.effect), "data": self.data} - if self.target not in [None, EventTarget.self]: + if self.target not in [None, EventTarget.SELF]: data["target"] = self.target._value_ return data @@ -290,13 +318,10 @@ def effect(self) -> Identifier: return getattr(self, "_effect") @effect.setter - def effect(self, value: Identifier): - if isinstance(value, Identifier): - setattr(self, "_effect", value) - else: - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) + def effect(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("effect", id) + setattr(self, "_effect", id) @property def data(self) -> int: @@ -305,6 +330,7 @@ def data(self) -> int: @data.setter def data(self, value: int): if isinstance(value, int): + self.on_update("data", value) setattr(self, "_data", value) else: raise TypeError( @@ -314,11 +340,11 @@ def data(self, value: int): @event_type class PlaySound(Event): - """Play a sound relative to target position""" + """Play a sound relative to target position. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_play_sound?view=minecraft-bedrock-stable)""" id = Identifier("play_sound") - def __init__(self, sound: str, target: EventTarget = None): + def __init__(self, sound: Identifiable, target: EventTarget = None): Event.__init__(self, target) self.sound = sound self.target = target @@ -326,46 +352,46 @@ def __init__(self, sound: str, target: EventTarget = None): @classmethod def from_dict(cls, data: dict) -> Self: self = super().from_dict(data) - self.sound = Identifier(data.pop("sound")) + self.sound = data.pop("sound") return self - @property - def __dict__(self): + def jsonify(self): data = {"sound": str(self.sound)} - if self.target not in [None, EventTarget.self]: + if self.target not in [None, EventTarget.SELF]: data["target"] = self.target._value_ return data @property - def sound(self) -> str: + def sound(self) -> Identifier: return getattr(self, "_sound") @sound.setter - def sound(self, value: str): - setattr(self, "_sound", str(value)) + def sound(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("sound", id) + setattr(self, "_sound", id) @event_type class RemoveMobEffect(Event): - """Removes mob effect from target""" + """Removes mob effect from target. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_remove_mob_effect?view=minecraft-bedrock-stable)""" id = Identifier("remove_mob_effect") - def __init__(self, effect: Identifier | str, target: EventTarget = None): + def __init__(self, effect: Identifiable, target: EventTarget = None): Event.__init__(self, target) - self.effect = Identifier(effect) + self.effect = effect self.target = target @classmethod def from_dict(cls, data: dict) -> Self: self = super().from_dict(data) - self.effect = Identifier(data.pop("effect")) + self.effect = data.pop("effect") return self - @property - def __dict__(self): + def jsonify(self): data = {"effect": str(self.effect)} - if self.target not in [None, EventTarget.self]: + if self.target not in [None, EventTarget.SELF]: data["target"] = self.target._value_ return data @@ -374,18 +400,15 @@ def effect(self) -> Identifier: return getattr(self, "_effect") @effect.setter - def effect(self, value: Identifier): - if isinstance(value, Identifier): - setattr(self, "_effect", value) - else: - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) + def effect(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("effect", id) + setattr(self, "_effect", id) @event_type class RunCommand(Event): - """Triggers a slash command or a list of slash commands""" + """Triggers a slash command or a list of slash commands. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_run_command?view=minecraft-bedrock-stable)""" id = Identifier("run_command") @@ -400,12 +423,11 @@ def from_dict(cls, data: dict) -> Self: self.command = data.pop("command") return self - @property - def __dict__(self): + def jsonify(self): data = {"command": self.command} if isinstance(self.command, list) and len(self.command) == 1: data["command"] = self.command[0] - if self.target not in [None, EventTarget.self]: + if self.target not in [None, EventTarget.SELF]: data["target"] = self.target._value_ return data @@ -416,28 +438,42 @@ def command(self) -> list[str]: @command.setter def command(self, value: list[str]): if isinstance(value, list): - setattr(self, "_command", [str(x) for x in value]) + v = [str(x) for x in value] + self.on_update("command", v) + setattr(self, "_command", v) else: self.command = [str(value)] + def get_command(self, index: int) -> str: + return getitem(self, "commands", index) + + def add_commands(self, command: str) -> str: + return additem(self, "commands", command) + + def remove_command(self, index: int) -> str: + return removeitem(self, "commands", index) + + def clear_commands(self) -> Self: + """Remove all commands""" + return clearitems(self, "commands") + @event_type class SetBlock(Event): - """Sets this block to another block type""" + """Sets this block to another block type. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_set_block?view=minecraft-bedrock-stable)""" id = Identifier("set_block") - def __init__(self, block_type: Identifier | str): - self.block_type = Identifier(block_type) + def __init__(self, block_type: Identifiable): + self.block_type = block_type @classmethod def from_dict(cls, data: dict) -> Self: self = super().from_dict(data) - self.block_type = Identifier(data.pop("block_type")) + self.block_type = data.pop("block_type") return self - @property - def __dict__(self): + def jsonify(self): data = {"block_type": str(self.block_type)} return data @@ -446,36 +482,36 @@ def block_type(self) -> Identifier: return getattr(self, "_block_type") @block_type.setter - def block_type(self, value: Identifier): - if not isinstance(value, Identifier): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_block_type", value) + def block_type(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("block_type", id) + setattr(self, "_block_type", id) @event_type class SetBlockAtPos(Event): - """Sets a block relative to this block to another block type""" + """Sets a block relative to this block to another block type. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_set_block_at_pos?view=minecraft-bedrock-stable)""" id = Identifier("set_block_at_pos") def __init__( - self, block_type: Identifier | str, block_offset: list = [0.0, 0.0, 0.0] + self, block_type: Identifiable, block_offset: Vector3 = Vector3(0, 0, 0) ): - self.block_type = Identifier(block_type) + self.block_type = block_type self.block_offset = block_offset @classmethod def from_dict(cls, data: dict) -> Self: self = super().from_dict(data) - self.block_type = Identifier(data.pop("block_type")) - self.block_offset = data.pop("block_offset") + self.block_type = data.pop("block_type") + self.block_offset = Vector3.from_dict(data.pop("block_offset")) return self - @property - def __dict__(self): - data = {"block_type": str(self.block_type), "block_offset": self.block_offset} + def jsonify(self): + data = { + "block_type": str(self.block_type), + "block_offset": self.block_offset.jsonify(), + } return data @property @@ -483,29 +519,28 @@ def block_type(self) -> Identifier: return getattr(self, "_block_type") @block_type.setter - def block_type(self, value: Identifier): - if not isinstance(value, Identifier): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_block_type", value) + def block_type(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("block_type", id) + setattr(self, "_block_type", id) @property - def block_offset(self) -> list: + def block_offset(self) -> Vector3: return getattr(self, "_block_offset") @block_offset.setter - def block_offset(self, value: list): - if not isinstance(value, list): + def block_offset(self, value: Vector3): + if not isinstance(value, Vector3): raise TypeError( - f"Expected list but got '{value.__class__.__name__}' instead" + f"Expected Vector3 but got '{value.__class__.__name__}' instead" ) + self.on_update("block_offset", value) setattr(self, "_block_offset", value) @event_type class SpawnLoot(Event): - """Spawn loot from block""" + """Spawn loot from block. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_spawn_loot?view=minecraft-bedrock-stable)""" id = Identifier("spawn_loot") @@ -518,8 +553,7 @@ def from_dict(cls, data: dict) -> Self: self.table = data.pop("table") return self - @property - def __dict__(self): + def jsonify(self): data = {"table": str(self.table)} return data @@ -529,36 +563,36 @@ def table(self) -> str: @table.setter def table(self, value: str): + self.on_update("table", str(value)) setattr(self, "_table", str(value)) @event_type class Swing(Event): - """Event causes the actor to swing""" + """Event causes the actor to swing. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_swing?view=minecraft-bedrock-stable)""" id = Identifier("swing") def __init__(self, target: EventTarget = None): Event.__init__(self, target) - @property - def __dict__(self): + def jsonify(self): data = {} return data @event_type class Teleport(Event): - """Teleport target randomly around destination point""" + """Teleport target randomly around destination point. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_teleport?view=minecraft-bedrock-stable)""" id = Identifier("teleport") def __init__( self, avoid_water: bool = True, - destination: list = [0.0, 0.0, 0.0], + destination: Vector3 = Vector3(0.0, 0.0, 0.0), land_on_block: bool = True, - max_range: list = [8.0, 8.0, 8.0], + max_range: Vector3 = Vector3(8.0, 8.0, 8.0), target: EventTarget = None, ): self.avoid_water = avoid_water @@ -571,20 +605,19 @@ def __init__( def from_dict(cls, data: dict) -> Self: self = super().from_dict(data) self.avoid_water = data.pop("avoid_water") - self.destination = data.pop("destination") + self.destination = Vector3.from_dict(data.pop("destination")) self.land_on_block = data.pop("land_on_block") - self.max_range = data.pop("max_range") + self.max_range = Vector3.from_dict(data.pop("max_range")) return self - @property - def __dict__(self): + def jsonify(self): data = { "avoid_water": self.avoid_water, - "destination": self.destination, + "destination": self.destination.jsonify(), "land_on_block": self.land_on_block, - "max_range": self.max_range, + "max_range": self.max_range.jsonify(), } - if self.target not in [None, EventTarget.self]: + if self.target not in [None, EventTarget.SELF]: data["target"] = self.target._value_ return data @@ -598,18 +631,20 @@ def avoid_water(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("avoid_water", value) setattr(self, "_avoid_water", value) @property - def destination(self) -> list: + def destination(self) -> Vector3: return getattr(self, "_destination") @destination.setter - def destination(self, value: list): - if not isinstance(value, list): + def destination(self, value: Vector3): + if not isinstance(value, Vector3): raise TypeError( - f"Expected list but got '{value.__class__.__name__}' instead" + f"Expected Vector3 but got '{value.__class__.__name__}' instead" ) + self.on_update("destination", value) setattr(self, "_destination", value) @property @@ -622,29 +657,31 @@ def land_on_block(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("land_on_block", value) setattr(self, "_land_on_block", value) @property - def max_range(self) -> list: + def max_range(self) -> Vector3: return getattr(self, "_max_range") @max_range.setter - def max_range(self, value: list): - if not isinstance(value, list): + def max_range(self, value: Vector3): + if not isinstance(value, Vector3): raise TypeError( - f"Expected list but got '{value.__class__.__name__}' instead" + f"Expected Vector3 but got '{value.__class__.__name__}' instead" ) + self.on_update("max_range", value) setattr(self, "_max_range", value) @event_type -class TransformiIem(Event): - """Transforms item into another item""" +class TransformIem(Event): + """Transforms item into another item. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_transform_item?view=minecraft-bedrock-stable)""" id = Identifier("transform_item") - def __init__(self, transform: Identifier | str): - self.transform = Identifier(transform) + def __init__(self, transform: Identifiable): + self.transform = transform @classmethod def from_dict(cls, data: dict) -> Self: @@ -652,8 +689,7 @@ def from_dict(cls, data: dict) -> Self: self.transform = data return self - @property - def __dict__(self): + def jsonify(self): data = str(self.transform) return data @@ -662,35 +698,32 @@ def transform(self) -> Identifier: return getattr(self, "_transform") @transform.setter - def transform(self, value: Identifier): - if not isinstance(value, Identifier): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_transform", value) + def transform(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("transform", id) + setattr(self, "_transform", id) @event_type -class SetBlockState(Event): - """Sets a block state on this block""" +class SetBlockProperty(Event): + """Sets a block state on this block. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/blockreference/examples/blockevents/minecraftblock_set_block_state?view=minecraft-bedrock-stable)""" id = Identifier("set_block_state") - def __init__(self, states: dict[Identifier, Molang] = {}, **state: str): + def __init__(self, states: dict[Identifiable, Molang] = {}): self.states = states - @property - def __dict__(self): + def jsonify(self): data = {} for k, v in self.states.items(): - data[str(k)] = str(v) + data[str(k)] = Molang(v) return data @classmethod def from_dict(cls, data: dict) -> Self: self = cls.__new__(cls) for k, v in data.items(): - id = Identifier(k) + id = Identifiable.of(k) self.states[id] = Molang(v) return self @@ -699,12 +732,30 @@ def states(self) -> dict[Identifier, Molang]: return getattr2(self, "_states", {}) @states.setter - def states(self, value: dict[Identifier, Molang]): + def states(self, value: dict[Identifiable, Molang]): if not isinstance(value, dict): raise TypeError( f"Expected dict but got '{value.__class__.__name__}' instead" ) - setattr(self, "_states", value) + states = {} + for k, v in value.items(): + id = Identifiable.of(k) + states[id] = v + self.on_update("states", states) + setattr(self, "_states", states) + + def get_state(self, name: Identifiable) -> Identifier: + return getitem(self, "states", Identifiable.of(name)) + + def add_state(self, name: Identifiable, value: Molang) -> Self: + return additem(self, "states", Molang(value), Identifiable.of(name)) + + def remove_state(self, name: Identifiable) -> Molang: + return removeitem(self, "states", Identifiable.of(name)) + + def clear_states(self) -> Self: + """Remove all states""" + return clearitems(self, "states") @event_type @@ -724,15 +775,14 @@ def from_dict(cls, data: dict) -> Self: self.events = [x for x in data] return self - @property - def __dict__(self): + def jsonify(self): data = [] for v in self.events: data.append({}) if v["condition"] is not None: data[-1]["condition"] = str(v["condition"]) for i, j in v["events"].items(): - data[-1][i.path] = j.__dict__ + data[-1][i.path] = j.jsonify() return data @property @@ -745,6 +795,7 @@ def events(self, value: list[dict]): raise TypeError( f"Expected list[Event] but got '{value.__class__.__name__}' instead" ) + self.on_update("events", value) setattr(self, "_events", value) # CONDITION @@ -794,7 +845,7 @@ def clear_events(self) -> Self: @event_type class Randomize(Sequence): - """Randomly run event responses""" + """Randomly run event responses.""" id = Identifier("randomize") pass @@ -802,23 +853,26 @@ class Randomize(Sequence): @event_type class Trigger(Event): - """Trigger an event on a specified target""" + """Trigger an event on a specified target.""" id = Identifier("trigger") def __init__( - self, event: Identifier | str, condition: Molang = None, target: str = None + self, event: Identifiable, condition: Molang = None, target: str = None ): Event.__init__(self, target) self.event = event self.condition = None if condition is None else Molang(condition) self.target = target - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"event": str(self.event)} - if self.target not in [None, EventTarget.self]: - data["target"] = self.target._value_ + if self.target not in [None, EventTarget.SELF]: + data["target"] = ( + self.target._value_ + if isinstance(self.target, EventTarget) + else self.target + ) if hasattr(self, "condition") and self.condition: data["condition"] = str(self.condition) return data @@ -841,6 +895,7 @@ def condition(self, value: Molang): if value is None: setattr(self, "_condition", None) elif isinstance(value, Molang): + self.on_update("condition", value) setattr(self, "_condition", value) else: raise TypeError( @@ -853,46 +908,51 @@ def event(self) -> Identifier: return getattr(self, "_event") @event.setter - def event(self, value: Identifier | str): - if isinstance(value, (Identifier, str)): - setattr(self, "_event", Identifier(value)) - else: - raise TypeError( - f"Expected Molang but got '{value.__class__.__name__}' instead" - ) + def event(self, value: Identifiable | str): + id = Identifiable.of(value) + self.on_update("event", id) + setattr(self, "_event", id) @property - def target(self) -> str: + def target(self) -> EventTarget: """The target of event executed on the object""" - return getattr(self, "_target") + return getattr(self, "_target", EventTarget.SELF) @target.setter - def target(self, value: str): - setattr(self, "_target", str(value)) + def target(self, value: EventTarget): + if value is None: + self.target = EventTarget.SELF + return + if not isinstance(value, EventTarget): + raise TypeError( + f"Expected EventTarget but got '{value.__class__.__name__}' instead" + ) + self.on_update("target", value) + setattr(self, "_target", value) # CUSTOM -class IncrementBlockState(SetBlockState): +class IncrementBlockProperty(SetBlockProperty): """Increase a block state on this block""" - def __init__(self, name: Identifier, amount: int = 1): - id = Identifier(name) - SetBlockState.__init__(self, {id: f"q.block_state('{id}')+{amount}"}) + def __init__(self, name: Identifiable, count: int = 1): + id = Identifiable.of(name) + SetBlockProperty.__init__(self, {id: f"q.block_state('{id}')+{count}"}) -class DecrementBlockState(SetBlockState): +class DecrementBlockProperty(SetBlockProperty): """Decrease a block state on this block""" - def __init__(self, name: Identifier, amount: int = 1): - id = Identifier(name) - SetBlockState.__init__(self, {id: f"q.block_state('{id}')-{amount}"}) + def __init__(self, name: Identifiable, count: int = 1): + id = Identifiable.of(name) + SetBlockProperty.__init__(self, {id: f"q.block_state('{id}')-{count}"}) -class SwitchBlockState(SetBlockState): - """Switch a boolean block state on this block. (true = false, false = true)""" +class SwitchBlockProperty(SetBlockProperty): + """Switch a boolean block state on this block. (true -> false, false -> true)""" - def __init__(self, name: Identifier): - id = Identifier(name) - SetBlockState.__init__(self, {id: f"!q.block_state('{id}')"}) + def __init__(self, name: Identifiable): + id = Identifiable.of(name) + SetBlockProperty.__init__(self, {id: f"!q.block_state('{id}')"}) diff --git a/mcaddon/exception.py b/mcaddon/exception.py index 8ed9a53..673b58d 100644 --- a/mcaddon/exception.py +++ b/mcaddon/exception.py @@ -16,9 +16,15 @@ class EventNotFoundError(Error): ... class SchemaNotFoundError(Error): ... +class TypeNotFoundError(Error): ... + + class SyntaxError(Error): ... +class ManifestNotFoundError(Error): ... + + class MinecraftNotFoundError(Error): def __init__(self, edition: Edition): if not isinstance(edition, Edition): @@ -26,13 +32,3 @@ def __init__(self, edition: Edition): f"Expected Edition but got '{edition.__class__.__name__}' instead" ) Error.__init__(self, repr(edition._value_)) - - -# remove -class RecipeTypeNotFoundError(Error): ... - - -class ManifestNotFoundError(Error): ... - - -class TypeNotFoundError(Error): ... diff --git a/mcaddon/experimental/__init__.py b/mcaddon/experimental/__init__.py new file mode 100644 index 0000000..15a4f64 --- /dev/null +++ b/mcaddon/experimental/__init__.py @@ -0,0 +1,14 @@ +from .animation_controller import * +from .animation import * +from .attachable import * +from .biome import * +from .client_biome import * +from .entity import * +from .fog import * +from .particle import * +from .piece import * +from .render_controller import * +from .spawn_rule import * +from .structure import * +from .texture_set import * +from .ui import * diff --git a/mcaddon/experimental/__pycache__/__init__.cpython-311.pyc b/mcaddon/experimental/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..780cbfe Binary files /dev/null and b/mcaddon/experimental/__pycache__/__init__.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/animation.cpython-311.pyc b/mcaddon/experimental/__pycache__/animation.cpython-311.pyc new file mode 100644 index 0000000..a2dabc6 Binary files /dev/null and b/mcaddon/experimental/__pycache__/animation.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/animation_controller.cpython-311.pyc b/mcaddon/experimental/__pycache__/animation_controller.cpython-311.pyc new file mode 100644 index 0000000..34b1678 Binary files /dev/null and b/mcaddon/experimental/__pycache__/animation_controller.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/attachable.cpython-311.pyc b/mcaddon/experimental/__pycache__/attachable.cpython-311.pyc new file mode 100644 index 0000000..daf4a9d Binary files /dev/null and b/mcaddon/experimental/__pycache__/attachable.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/biome.cpython-311.pyc b/mcaddon/experimental/__pycache__/biome.cpython-311.pyc new file mode 100644 index 0000000..c20a751 Binary files /dev/null and b/mcaddon/experimental/__pycache__/biome.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/client_biome.cpython-311.pyc b/mcaddon/experimental/__pycache__/client_biome.cpython-311.pyc new file mode 100644 index 0000000..b51d57b Binary files /dev/null and b/mcaddon/experimental/__pycache__/client_biome.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/entity.cpython-311.pyc b/mcaddon/experimental/__pycache__/entity.cpython-311.pyc new file mode 100644 index 0000000..8e3f626 Binary files /dev/null and b/mcaddon/experimental/__pycache__/entity.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/feature.cpython-311.pyc b/mcaddon/experimental/__pycache__/feature.cpython-311.pyc new file mode 100644 index 0000000..ad1457f Binary files /dev/null and b/mcaddon/experimental/__pycache__/feature.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/feature_rule.cpython-311.pyc b/mcaddon/experimental/__pycache__/feature_rule.cpython-311.pyc new file mode 100644 index 0000000..957d386 Binary files /dev/null and b/mcaddon/experimental/__pycache__/feature_rule.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/fog.cpython-311.pyc b/mcaddon/experimental/__pycache__/fog.cpython-311.pyc new file mode 100644 index 0000000..47b0227 Binary files /dev/null and b/mcaddon/experimental/__pycache__/fog.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/model.cpython-311.pyc b/mcaddon/experimental/__pycache__/model.cpython-311.pyc new file mode 100644 index 0000000..0c8a749 Binary files /dev/null and b/mcaddon/experimental/__pycache__/model.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/particle.cpython-311.pyc b/mcaddon/experimental/__pycache__/particle.cpython-311.pyc new file mode 100644 index 0000000..f0a5c46 Binary files /dev/null and b/mcaddon/experimental/__pycache__/particle.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/piece.cpython-311.pyc b/mcaddon/experimental/__pycache__/piece.cpython-311.pyc new file mode 100644 index 0000000..ea80a09 Binary files /dev/null and b/mcaddon/experimental/__pycache__/piece.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/render_controller.cpython-311.pyc b/mcaddon/experimental/__pycache__/render_controller.cpython-311.pyc new file mode 100644 index 0000000..3afb58b Binary files /dev/null and b/mcaddon/experimental/__pycache__/render_controller.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/spawn_rule.cpython-311.pyc b/mcaddon/experimental/__pycache__/spawn_rule.cpython-311.pyc new file mode 100644 index 0000000..e18a0cf Binary files /dev/null and b/mcaddon/experimental/__pycache__/spawn_rule.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/structure.cpython-311.pyc b/mcaddon/experimental/__pycache__/structure.cpython-311.pyc new file mode 100644 index 0000000..04e3d18 Binary files /dev/null and b/mcaddon/experimental/__pycache__/structure.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/texture_set.cpython-311.pyc b/mcaddon/experimental/__pycache__/texture_set.cpython-311.pyc new file mode 100644 index 0000000..fd40e53 Binary files /dev/null and b/mcaddon/experimental/__pycache__/texture_set.cpython-311.pyc differ diff --git a/mcaddon/experimental/__pycache__/ui.cpython-311.pyc b/mcaddon/experimental/__pycache__/ui.cpython-311.pyc new file mode 100644 index 0000000..e38e5e7 Binary files /dev/null and b/mcaddon/experimental/__pycache__/ui.cpython-311.pyc differ diff --git a/mcaddon/experimental/animation.py b/mcaddon/experimental/animation.py new file mode 100644 index 0000000..fb0ab78 --- /dev/null +++ b/mcaddon/experimental/animation.py @@ -0,0 +1,2 @@ +class Animation: + pass diff --git a/mcaddon/experimental/animation_controller.py b/mcaddon/experimental/animation_controller.py new file mode 100644 index 0000000..e1b53ec --- /dev/null +++ b/mcaddon/experimental/animation_controller.py @@ -0,0 +1,2 @@ +class AnimationController: + pass diff --git a/mcaddon/experimental/attachable.py b/mcaddon/experimental/attachable.py new file mode 100644 index 0000000..04ccd71 --- /dev/null +++ b/mcaddon/experimental/attachable.py @@ -0,0 +1,2 @@ +class Attachable: + pass diff --git a/mcaddon/experimental/biome.py b/mcaddon/experimental/biome.py new file mode 100644 index 0000000..f4898de --- /dev/null +++ b/mcaddon/experimental/biome.py @@ -0,0 +1,2 @@ +class Biome: + pass diff --git a/mcaddon/experimental/client_biome.py b/mcaddon/experimental/client_biome.py new file mode 100644 index 0000000..93c6dee --- /dev/null +++ b/mcaddon/experimental/client_biome.py @@ -0,0 +1,2 @@ +class BiomesClient: + pass diff --git a/mcaddon/experimental/entity.py b/mcaddon/experimental/entity.py new file mode 100644 index 0000000..a6100ac --- /dev/null +++ b/mcaddon/experimental/entity.py @@ -0,0 +1,25 @@ +from typing import Self +from ..util import Identifier + + +class EntityComponent: + @classmethod + def from_dict(cls, data: dict) -> Self: + raise NotImplementedError() + + +COMPONENTS: dict[str, EntityComponent] = {} + + +def component(cls): + def wrapper(): + global COMPONENTS + COMPONENTS[cls.id] = cls + return cls + + return wrapper() + + +class Entity: + format_version = "1.20.51" + id = Identifier("entity") diff --git a/mcaddon/experimental/fog.py b/mcaddon/experimental/fog.py new file mode 100644 index 0000000..3f59962 --- /dev/null +++ b/mcaddon/experimental/fog.py @@ -0,0 +1,2 @@ +class Fog: + pass diff --git a/mcaddon/experimental/particle.py b/mcaddon/experimental/particle.py new file mode 100644 index 0000000..0d181ed --- /dev/null +++ b/mcaddon/experimental/particle.py @@ -0,0 +1,2 @@ +class Particle: + pass diff --git a/mcaddon/experimental/piece.py b/mcaddon/experimental/piece.py new file mode 100644 index 0000000..026cc47 --- /dev/null +++ b/mcaddon/experimental/piece.py @@ -0,0 +1,2 @@ +class Piece: + pass diff --git a/mcaddon/experimental/render_controller.py b/mcaddon/experimental/render_controller.py new file mode 100644 index 0000000..6f9ea3a --- /dev/null +++ b/mcaddon/experimental/render_controller.py @@ -0,0 +1,2 @@ +class RenderController: + pass diff --git a/mcaddon/experimental/spawn_rule.py b/mcaddon/experimental/spawn_rule.py new file mode 100644 index 0000000..7cb0f48 --- /dev/null +++ b/mcaddon/experimental/spawn_rule.py @@ -0,0 +1,2 @@ +class SpawnRule: + pass diff --git a/mcaddon/experimental/structure.py b/mcaddon/experimental/structure.py new file mode 100644 index 0000000..69852c1 --- /dev/null +++ b/mcaddon/experimental/structure.py @@ -0,0 +1,2 @@ +class Structure: + pass diff --git a/mcaddon/experimental/texture_set.py b/mcaddon/experimental/texture_set.py new file mode 100644 index 0000000..ceb8783 --- /dev/null +++ b/mcaddon/experimental/texture_set.py @@ -0,0 +1,2 @@ +class TextureSet: + pass diff --git a/mcaddon/experimental/ui.py b/mcaddon/experimental/ui.py new file mode 100644 index 0000000..7f89a96 --- /dev/null +++ b/mcaddon/experimental/ui.py @@ -0,0 +1,245 @@ +from typing import Self + +from ..registry import INSTANCE, Registries +from ..file import JsonFile +from ..util import getattr2, Identifier, Identifiable + + +class UIGlobalVariables(JsonFile): + FILEPATH = "ui8/_global_variables.json" + + def __init__(self, variables: dict[str] = None): + self.variables = variables + + def __getitem__(self, key: str): + return self.variables.get(key) + + def __setitem__(self, key: str, value): + self.variables[str(key)] = value + + def jsonify(self) -> dict: + data = {} + for k, v in self.variables.items(): + data[str(k)] = v + return data + + @property + def variables(self) -> dict: + return getattr2(self, "_variables", {}) + + @variables.setter + def variables(self, value: dict): + if value is None: + self.variables = {} + return + if not isinstance(value, dict): + raise TypeError( + f"Expected dict but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_variables", value) + + @classmethod + def from_dict(cls, data: dict) -> Self: + self = cls.__new__(cls) + self.variables = data + return self + + def get_variable(self, key: str) -> str: + return self.variables.get(key) + + def add_variable(self, key: str, value) -> str: + self.variables[key] = value + return value + + def remove_variable(self, key: str) -> str: + return self.variables.pop(key) + + def clear_variables(self) -> Self: + self.variables = {} + return self + + def get(self, key: str): + return self.variables.get(key) + + def set(self, key: str, value): + return self.variables[key](value) + + +class UIDefs(JsonFile): + FILEPATH = "ui/_ui_defs.json" + + def __init__(self, definitions: list[str] = None): + self.definitions = definitions + + def __iter__(self): + for i in self.definitions: + yield i + + def jsonify(self) -> dict: + data = {"ui_defs": [str(x) for x in self.definitions]} + return data + + @property + def definitions(self) -> list[str]: + return getattr2(self, "_definitions", []) + + @definitions.setter + def definitions(self, value: list[str]): + if value is None: + self.definitions = [] + return + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_definitions", value) + + @classmethod + def from_dict(cls, data: dict) -> Self: + self = cls.__new__(cls) + if "ui_defs" in data: + self.definitions = data.pop("ui_defs") + return self + + def get_definition(self, index: int) -> str: + return self.definitions[index] + + def add_definition(self, fp: str) -> str: + self.definitions.append(fp) + return fp + + def remove_definition(self, index: int) -> str: + return self.definitions.pop(index) + + def clear_definitions(self) -> Self: + self.definitions = [] + return self + + +class Element(Identifiable): + def __init__(self): ... + + @property + def id(self) -> Identifier: + return getattr(self, "_id") + + @id.setter + def id(self, value: Identifier): + if not isinstance(value, Identifier): + raise TypeError( + f"Expected Identifier but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_id", value) + + +INSTANCE.create_registry(Registries.ELEMENT_TYPE, Element) + + +def element_type(cls): + """ + Add this element type to the registry + """ + + def wrapper(): + return INSTANCE.register(Registries.ELEMENT_TYPE, cls.id, cls) + + return wrapper() + + +@element_type +class LabelElement(Element): + """ + for creating text objects + """ + + id = Identifier("label") + + def __init__(self): ... + + +@element_type +class ImageElement(Element): + """ + for rendering images from a filepath provided + """ + + id = Identifier("image") + + def __init__(self): ... + + +@element_type +class ButtonElement(Element): + """ + for creating interactive and clickable elements + """ + + id = Identifier("button") + + def __init__(self): ... + + +@element_type +class PanelElement(Element): + """ + an empty container where you can store all other elements that may overlap to each other + """ + + id = Identifier("panel") + + def __init__(self): ... + + +@element_type +class StackPanelElement(Element): + """ + an empty container where you can store all other elements in a stack that doesn't overlap to each other + """ + + id = Identifier("stack_panel") + + def __init__(self): ... + + +@element_type +class GridElement(Element): + """ + uses another element as a template, and then renders it repeatedly in multiple rows and columns + """ + + id = Identifier("grid") + + def __init__(self): ... + + +@element_type +class FactoryElement(Element): + """ + renders an element based off of another element, is capable of calling hardcoded values and variables + """ + + id = Identifier("factory") + + def __init__(self): ... + + +@element_type +class CustomElement(Element): + """ + is paired with another property renderer which renders hardcoded JSON UI elements + """ + + id = Identifier("custom") + + def __init__(self): ... + + +@element_type +class ScreenElement(Element): + """ + elements that are called by the game directly, usually root panel elements + """ + + id = Identifier("screen") + + def __init__(self): ... diff --git a/mcaddon/ext/__init__.py b/mcaddon/ext/__init__.py new file mode 100644 index 0000000..a8c43de --- /dev/null +++ b/mcaddon/ext/__init__.py @@ -0,0 +1,3 @@ +""" +Experimental objects +""" diff --git a/mcaddon/ext/__pycache__/__init__.cpython-311.pyc b/mcaddon/ext/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..b1834ea Binary files /dev/null and b/mcaddon/ext/__pycache__/__init__.cpython-311.pyc differ diff --git a/mcaddon/ext/__pycache__/mgl.cpython-311.pyc b/mcaddon/ext/__pycache__/mgl.cpython-311.pyc new file mode 100644 index 0000000..25f8b07 Binary files /dev/null and b/mcaddon/ext/__pycache__/mgl.cpython-311.pyc differ diff --git a/mcaddon/ext/__pycache__/ui_creator.cpython-311.pyc b/mcaddon/ext/__pycache__/ui_creator.cpython-311.pyc new file mode 100644 index 0000000..f38f5da Binary files /dev/null and b/mcaddon/ext/__pycache__/ui_creator.cpython-311.pyc differ diff --git a/mcaddon/ext/mgl.py b/mcaddon/ext/mgl.py new file mode 100644 index 0000000..99cdf52 --- /dev/null +++ b/mcaddon/ext/mgl.py @@ -0,0 +1,74 @@ +# Support for moderngl +from typing import Self +import moderngl +import os + +from .. import __file__, Model + + +# https://stackoverflow.com/questions/44384543/how-to-render-3d-object-to-silhouette-image-in-python +class MGLRenderer: + def __init__(self, ctx: moderngl.Context = None, size: tuple = (512, 512)): + # def __init__(self, ctx:moderngl.Context=None, size:tuple=(2000, 2000)): + self.size = size + self.vbo = None + self.fbo = None + self.ctx = moderngl.create_standalone_context() if ctx is None else ctx + + with open( + os.path.join(os.path.dirname(__file__), "data", "shaders", "default.vert") + ) as fd: + vertex_shader = fd.read() + + with open( + os.path.join(os.path.dirname(__file__), "data", "shaders", "default.frag") + ) as fd: + fragment_shader = fd.read() + + self.program = self.ctx.program( + vertex_shader=vertex_shader, fragment_shader=fragment_shader + ) + self.program["m_proj"].write(self.get_camera_projection_matrix()) + self.program["m_view"].write(self.get_camera_view_matrix()) + + def render(self, model: Model) -> Self: + self.program["m_model"].write(model.get_matrix()) + + vao = self.ctx.vertex_array( + self.program, + [ + ( + self.ctx.buffer(model.get_vertex_data()), + "3f 3f", + "in_normal", + "in_position", + ) + ], + skip_errors=True, + ) + self.fbo = self.ctx.framebuffer(self.ctx.renderbuffer(self.size)) + self.fbo.use() + + self.ctx.viewport = (0, 0, self.size[0], self.size[1]) + self.ctx.clear(0.9, 0.9, 0.9) + vao.render() + + # pixels = fbo.read(components=3, alignment=1) + # return Image.frombytes("RGB", fbo.size, pixels).transpose(Image.FLIP_TOP_BOTTOM) + return self + + def get_camera_view_matrix(self): + import glm + + pos = glm.vec3((0, 0, 0)) + up = glm.vec3(0, 1, 0) + forward = glm.vec3(0, 0, -1) + return glm.lookAt(pos, pos + forward, up) + + def get_camera_projection_matrix(self): + import glm + + FOV = 50 + NEAR = 0.1 + FAR = 200 + return glm.perspective(glm.radians(FOV), self.size[0] / self.size[1], NEAR, FAR) diff --git a/mcaddon/ext/ui_creator.py b/mcaddon/ext/ui_creator.py new file mode 100644 index 0000000..986d6c1 --- /dev/null +++ b/mcaddon/ext/ui_creator.py @@ -0,0 +1,85 @@ +""" +Simple app to render JSON UIs without having to start the game. +""" + +from tkinter import Tk, Listbox, Toplevel +from tkinter.scrolledtext import ScrolledText +import os +import glob +import commentjson + +from ..experimental import UIGlobalVariables, UIDefs + + +class PreviewWindow(Toplevel): + def __init__(self, master): + Toplevel.__init__(self, master) + self.title("UI Preview") + self.geometry("700x700") + + +class UICreator(Tk): + def __init__(self, directory: str): + Tk.__init__(self) + self.title("UI Creator") + self.geometry("700x500") + + # Variables + self.preview = PreviewWindow(self) + self.global_variables = UIGlobalVariables() + self.defs = UIDefs() + self.directory = directory + self.files = [] + + # Widgets + self.outliner = Listbox(self, width=50) + self.outliner.bind("<>", self.onselect) + self.outliner.grid(row=0, column=0, sticky="ns") + + self.text = ScrolledText(self, state="disabled") + self.text.grid(row=0, column=1, sticky="nesw") + + # Responsive + self.grid_rowconfigure(0, weight=1) + self.grid_columnconfigure(1, weight=1) + + # Keybinds + self.bind("", lambda e: self.refresh_files()) + + self.load_files() + + def onselect(self, e): + w = e.widget + index = int(w.curselection()[0]) + fp = w.get(index) + self.close_file() + self.open_file(fp) + + def open_file(self, fp: str): + self.text.configure(state="normal") + self.text.delete(0.0, "end") + with open(os.path.join(self.directory, fp)) as fd: + content = commentjson.load(fd) + self.text.insert(0.0, commentjson.dumps(content, indent=4)) + + def close_file(self): + self.text.delete(0.0, "end") + self.text.configure(state="disabled") + + def load_files(self): + self.files = [ + os.path.relpath(fp, self.directory) + for fp in glob.glob(self.directory + "/**/*.json", recursive=True) + ] + for f in self.files: + self.outliner.insert("end", f) + + def refresh_files(self): + self.outliner.delete(0, "end") + self.files = [] + self.load_files() + + +if __name__ == "__main__": + app = UICreator() + app.mainloop() diff --git a/mcaddon/ext/vanilla.py b/mcaddon/ext/vanilla.py deleted file mode 100644 index c619038..0000000 --- a/mcaddon/ext/vanilla.py +++ /dev/null @@ -1,46 +0,0 @@ -""" -All vanilla Minecraft registries located in the vanilla packs. -""" - -from enum import Enum - -from .. import ( - Item, - Block, - CameraPreset, - Identifier, - MenuCategory, - Category, - FoodComponent, - IconComponent, -) - - -class AppleItem(Item): - def __init__(self, id: Identifier | str): - Item.__init__(self, id, MenuCategory(Category.items, "itemGroup.name.food")) - self.add_component(FoodComponent(0, 1.0)) - self.add_component(IconComponent("minecraft:apple")) - - -class Items(Enum): - AIR = Item("air") - APPLE = Item("apple") - - -class Blocks(Enum): - AIR = Block("air") - - -class Cameras(Enum): - FIRST_PERSON = CameraPreset("first_person") - FREE = CameraPreset("free", pos_x=0, pos_y=0, pos_z=0, rot_x=0, rot_y=0) - THIRD_PERSON = CameraPreset("third_person") - THIRD_PERSON_FRONT = CameraPreset("third_person_front") - - -# class LootTables(Enum): -# ... - -# class Recipes(Enum): -# ... diff --git a/mcaddon/feature.py b/mcaddon/feature.py new file mode 100644 index 0000000..950aa8f --- /dev/null +++ b/mcaddon/feature.py @@ -0,0 +1,5788 @@ +from typing import Self +from molang import Molang +from dataclasses import dataclass + +from . import VERSION +from .exception import TypeNotFoundError +from .registry import INSTANCE, Registries +from .pack import behavior_pack +from .math import Range, Slope, Vector3, Vector2, VectorRange, Chance +from .util import getattr2, Identifier, Identifiable +from .file import JsonFile, Loader +from .block import BlockState, BlockPredicate + +# TODO: Add on_update to all properties + + +class Feature(JsonFile, Identifiable): + """ + Represents a data-driven [Feature](https://bedrock.dev/docs/stable/Features). + """ + + def __init__(self, identifier: Identifiable): + Identifiable.__init__(self, identifier) + + def __str__(self) -> str: + return self.__class__.__name__ + "{" + str(self.identifier) + "}" + + def jsonify(self) -> dict: + data = { + "format_version": VERSION["FEATURE"], + str(self.id): {"description": {"identifier": str(self.identifier)}}, + } + return data + + @staticmethod + def from_dict(data: dict) -> Self: + for k, v in INSTANCE.get_registry(Registries.FEATURE_TYPE).items(): + if str(k) in data: + self = v.from_dict(data) + dat = data.get(str(self.id)) + self.identifier = dat["description"]["identifier"] + return self + raise TypeNotFoundError(data) + + @property + def id(self) -> Identifier: + return getattr(self, "_id") + + @id.setter + def id(self, value: Identifier): + setattr(self, "_id", Identifier.of(value)) + + +INSTANCE.create_registry(Registries.FEATURE_TYPE, Feature) + + +def feature_type(cls): + """ + Add this feature type to the registry + """ + + def wrapper(): + return INSTANCE.register(Registries.FEATURE_TYPE, cls.id, cls) + + return wrapper() + + +class WeightedBlock: + def __init__(self, block: BlockState, weight: int): + self.block = block + self.weight = weight + + @property + def block(self) -> BlockState: + return getattr(self, "_block") + + @block.setter + def block(self, value: BlockState): + setattr(self, "_block", BlockState.of(value)) + + @property + def weight(self) -> int: + return getattr(self, "_weight") + + @weight.setter + def weight(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_weight", value) + + @staticmethod + def from_dict(data: list) -> Self: + return WeightedBlock(*data) + + def jsonify(self) -> dict: + data = [self.block.jsonify(), self.weight] + return data + + +@feature_type +@behavior_pack +class AggregateFeature(Feature): + """ + Represents a data-driven [Aggregate Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Aaggregate_feature). + """ + + id = Identifier("aggregate_feature") + FILEPATH = "features/aggregate_feature.json" + + def __init__( + self, + identifier: Identifiable, + features: list[Identifiable] = [], + early_out: str = None, + ): + Feature.__init__(self, identifier) + self.features = features + self.early_out = early_out + + @property + def features(self) -> list[Identifier]: + return getattr(self, "_features") + + @features.setter + def features(self, value: list[Identifiable]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_features", [Identifiable.of(x) for x in value]) + + @property + def early_out(self) -> str: + return getattr(self, "_early_out") + + @early_out.setter + def early_out(self, value: str): + if value is None: + return + setattr(self, "_early_out", str(value)) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = AggregateFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["features"] = [str(x) for x in self.features] + return data + + # FEATURE + + def get_feature(self, index: int) -> Identifier: + return self.features[index] + + def add_feature(self, feature: Identifiable) -> Identifiable: + id = Identifiable.of(feature) + self.features.append(id) + return id + + def remove_feature(self, index: int) -> Identifier: + return self.features.pop(index) + + def clear_features(self) -> Self: + self.features.clear() + return self + + +class AggregateFeatureLoader(Loader): + name = "Aggregate Feature" + + def __init__(self): + from .schemas import AggregateSchem1 + + Loader.__init__(self, AggregateFeature) + self.add_schema(AggregateSchem1, "1.13.0") + self.add_schema(AggregateSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class SequenceFeature(Feature): + """ + Represents a data-driven [Sequence Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Asequence_feature). + """ + + id = Identifier("sequence_feature") + FILEPATH = "features/sequence_feature.json" + + def __init__(self, identifier: Identifiable, features: list[Identifiable] = []): + Feature.__init__(self, identifier) + self.features = features + + @property + def features(self) -> list[Identifier]: + return getattr(self, "_features") + + @features.setter + def features(self, value: list[Identifiable]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_features", [Identifiable.of(x) for x in value]) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = SequenceFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["features"] = [str(x) for x in self.features] + return data + + # FEATURE + + def get_feature(self, index: int) -> Identifier: + return self.features[index] + + def add_feature(self, feature: Identifiable) -> Identifiable: + id = Identifiable.of(feature) + self.features.append(id) + return id + + def remove_feature(self, index: int) -> Identifier: + return self.features.pop(index) + + def clear_features(self) -> Self: + self.features.clear() + return self + + +class SequenceFeatureLoader(Loader): + name = "Sequence Feature" + + def __init__(self): + from .schemas import SequenceSchem1 + + Loader.__init__(self, SequenceFeature) + self.add_schema(SequenceSchem1, "1.13.0") + self.add_schema(SequenceSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class BeardsAndShaversFeature(Feature): + """ + Represents a data-driven [Beards And Shavers Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Abeards_and_shavers). + """ + + id = Identifier("beards_and_shavers_feature") + FILEPATH = "features/beards_and_shavers_feature.json" + + def __init__( + self, + identifier: Identifiable, + places_feature: Identifiable, + bounding_box_min: list[int], + bounding_box_max: list[int], + y_delta: float, + surface_block_type: BlockState, + subsurface_block_type: BlockState, + beard_raggedness_min: float, + beard_raggedness_max: float, + ): + Feature.__init__(self, identifier) + self.places_feature = places_feature + self.bounding_box_min = bounding_box_min + self.bounding_box_max = bounding_box_max + self.y_delta = y_delta + self.surface_block_type = surface_block_type + self.subsurface_block_type = subsurface_block_type + self.beard_raggedness_min = beard_raggedness_min + self.beard_raggedness_max = beard_raggedness_max + + @property + def surface_block_type(self) -> BlockState: + return getattr(self, "_surface_block_type") + + @surface_block_type.setter + def surface_block_type(self, value: BlockState): + setattr(self, "_surface_block_type", BlockState.of(value)) + + @property + def subsurface_block_type(self) -> BlockState: + return getattr(self, "_subsurface_block_type") + + @subsurface_block_type.setter + def subsurface_block_type(self, value: BlockState): + setattr(self, "_subsurface_block_type", BlockState.of(value)) + + @property + def beard_raggedness_min(self) -> float: + return getattr(self, "_beard_raggedness_min") + + @beard_raggedness_min.setter + def beard_raggedness_min(self, value: float): + if not isinstance(value, float): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_beard_raggedness_min", value) + + @property + def beard_raggedness_max(self) -> float: + return getattr(self, "_beard_raggedness_max") + + @beard_raggedness_max.setter + def beard_raggedness_max(self, value: float): + if not isinstance(value, float): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_beard_raggedness_max", value) + + @property + def places_feature(self) -> Identifier: + return getattr(self, "_places_feature") + + @places_feature.setter + def places_feature(self, value: Identifiable): + setattr(self, "_places_feature", Identifiable.of(value)) + + @property + def bounding_box_min(self) -> Vector3: + return getattr(self, "_bounding_box_min") + + @bounding_box_min.setter + def bounding_box_min(self, value: Vector3): + if not isinstance(value, Vector3): + raise TypeError( + f"Expected Vector3 but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_bounding_box_min", value) + + @property + def bounding_box_max(self) -> Vector3: + return getattr(self, "_bounding_box_max") + + @bounding_box_max.setter + def bounding_box_max(self, value: Vector3): + if not isinstance(value, Vector3): + raise TypeError( + f"Expected Vector3 but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_bounding_box_max", value) + + @property + def y_delta(self) -> float: + return getattr(self, "_y_delta") + + @y_delta.setter + def y_delta(self, value: float): + if not isinstance(value, float): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_y_delta", value) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = BeardsAndShaversFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["places_feature"] = str(self.places_feature) + data[str(self.id)]["bounding_box_min"] = self.bounding_box_min.jsonify() + data[str(self.id)]["bounding_box_max"] = self.bounding_box_max.jsonify() + data[str(self.id)]["y_delta"] = self.y_delta + data[str(self.id)]["surface_block_type"] = self.surface_block_type.jsonify() + data[str(self.id)][ + "subsurface_block_type" + ] = self.subsurface_block_type.jsonify() + data[str(self.id)]["beard_raggedness_min"] = self.beard_raggedness_min + data[str(self.id)]["beard_raggedness_max"] = self.beard_raggedness_max + return data + + +class BeardsAndShaversFeatureLoader(Loader): + name = "Beards and Shavers Feature" + + def __init__(self): + from .schemas import BeardsAndShaversSchem1 + + Loader.__init__(self, BeardsAndShaversFeature) + self.add_schema(BeardsAndShaversSchem1, "1.13.0") + self.add_schema(BeardsAndShaversSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class CaveCarverFeature(Feature): + """ + Represents a data-driven [Cave Carver Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Acave_carver_feature). + """ + + id = Identifier("cave_carver_feature") + FILEPATH = "features/cave_carver_feature.json" + + def __init__( + self, + identifier: Identifiable, + fill_with: BlockState, + width_modifier: float, + skip_carve_chance: int, + ): + Feature.__init__(self, identifier) + self.fill_with = fill_with + self.width_modifier = width_modifier + self.skip_carve_chance = skip_carve_chance + + @property + def width_modifier(self) -> float: + return getattr(self, "_width_modifier") + + @width_modifier.setter + def width_modifier(self, value: float): + if not isinstance(value, float): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_width_modifier", value) + + @property + def skip_carve_chance(self) -> int: + return getattr(self, "_skip_carve_chance") + + @skip_carve_chance.setter + def skip_carve_chance(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_skip_carve_chance", value) + + @property + def fill_with(self) -> BlockState: + return getattr(self, "_fill_with") + + @fill_with.setter + def fill_with(self, value: BlockState): + setattr(self, "_fill_with", BlockState.of(value)) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = CaveCarverFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["fill_with"] = self.fill_with.jsonify() + data[str(self.id)]["width_modifier"] = self.width_modifier + data[str(self.id)]["skip_carve_chance"] = self.skip_carve_chance + return data + + +class CaveCarverFeatureLoader(Loader): + name = "Cave Carver Feature" + + def __init__(self): + from .schemas import CaveCarverSchem1 + + Loader.__init__(self, CaveCarverFeature) + self.add_schema(CaveCarverSchem1, "1.13.0") + self.add_schema(CaveCarverSchem1, "1.16.0") + self.add_schema(CaveCarverSchem1, "1.16.100") + + +class ConditionalFeature: + def __init__(self, places_feature: Identifiable, condition: Molang): + self.places_feature = places_feature + self.condition = condition + + @property + def places_feature(self) -> Identifier: + return getattr(self, "_places_feature") + + @places_feature.setter + def places_feature(self, value: Identifiable): + setattr(self, "_places_feature", Identifiable.of(value)) + + @property + def condition(self) -> Molang: + return getattr(self, "_condition") + + @condition.setter + def condition(self, value: Molang): + if not isinstance(value, Molang): + raise TypeError( + f"Expected Molang but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_condition", value) + + def jsonify(self) -> dict: + data = { + "places_feature": str(self.places_feature), + "condition": str(self.condition), + } + return data + + @staticmethod + def from_dict(data: dict) -> Self: + places_feature = data.pop("places_feature") + condition = Molang(data.pop("condition")) + return ConditionalFeature(places_feature, condition) + + +@feature_type +@behavior_pack +class ConditionalListFeature(Feature): + """ + Represents a data-driven [Conditional List Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Aconditional_list). + """ + + id = Identifier("conditional_list") + FILEPATH = "features/conditional_list.json" + + def __init__( + self, + identifier: Identifiable, + early_out_scheme: str = None, + conditional_features: list[ConditionalFeature] = [], + ): + Feature.__init__(self, identifier) + self.conditional_features = conditional_features + self.early_out_scheme = early_out_scheme + + @property + def conditional_features(self) -> list[ConditionalFeature]: + return getattr(self, "_conditional_features") + + @conditional_features.setter + def conditional_features(self, value: list[ConditionalFeature]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_conditional_features", value) + + @property + def early_out_scheme(self) -> str: + return getattr(self, "_early_out_scheme") + + @early_out_scheme.setter + def early_out_scheme(self, value: str): + if value is None: + return + setattr(self, "_early_out_scheme", str(value)) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = ConditionalListLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["conditional_features"] = [ + x.jsonify() for x in self.conditional_features + ] + data[str(self.id)]["early_out_scheme"] = self.early_out_scheme + return data + + def get_feature(self, index: int) -> ConditionalFeature: + return self.conditional_features[index] + + def add_feature(self, feature: ConditionalFeature) -> ConditionalFeature: + self.conditional_features.append(feature) + return feature + + def remove_feature(self, index: int) -> ConditionalFeature: + return self.conditional_features.pop(index) + + def clear_features(self) -> Self: + self.conditional_features.clear() + return self + + +class ConditionalListLoader(Loader): + name = "Conditional List" + + def __init__(self): + from .schemas import ConditionalListSchem1 + + Loader.__init__(self, ConditionalListFeature) + self.add_schema(ConditionalListSchem1, "1.13.0") + self.add_schema(ConditionalListSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class FossilFeature(Feature): + """ + Represents a data-driven [Fossil Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Afossil_feature). + """ + + id = Identifier("fossil_feature") + FILEPATH = "features/fossil_feature.json" + + def __init__( + self, identifier: Identifiable, ore_block: BlockState, max_empty_corners: int + ): + Feature.__init__(self, identifier) + self.ore_block = ore_block + self.max_empty_corners = max_empty_corners + + @property + def ore_block(self) -> BlockState: + return getattr(self, "_ore_block") + + @ore_block.setter + def ore_block(self, value: BlockState): + setattr(self, "_ore_block", BlockState.of(value)) + + @property + def max_empty_corners(self) -> int: + return getattr(self, "_max_empty_corners") + + @max_empty_corners.setter + def max_empty_corners(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_max_empty_corners", value) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = FossilFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["ore_block"] = self.ore_block.jsonify() + data[str(self.id)]["max_empty_corners"] = self.max_empty_corners + return data + + +class FossilFeatureLoader(Loader): + name = "Fossil Feature" + + def __init__(self): + from .schemas import FossilSchem1 + + Loader.__init__(self, FossilFeature) + self.add_schema(FossilSchem1, "1.13.0") + self.add_schema(FossilSchem1, "1.16.0") + + +# VV PROPS VV + + +@feature_type +@behavior_pack +class GeodeFeature(Feature): + """ + Represents a data-driven [Geode Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Ageode_feature). + """ + + id = Identifier("geode_feature") + FILEPATH = "features/geode_feature.json" + + def __init__( + self, + identifier: Identifiable, + filler: BlockState, + inner_layer: BlockState, + alternate_inner_layer: BlockState, + middle_layer: BlockState, + outer_layer: BlockState, + min_outer_wall_distance: int, + max_outer_wall_distance: int, + min_distribution_points: int, + max_distribution_points: int, + min_point_offset: int, + max_point_offset: int, + max_radius: int, + crack_point_offset: int, + generate_crack_chance: float, + base_crack_size: float, + noise_multiplier: float, + use_potential_placements_chance: float, + use_alternate_layer0_chance: float, + placements_require_layer0_alternate: bool, + invalid_blocks_threshold: int, + inner_placements: list[BlockState] = [], + ): + Feature.__init__(self, identifier) + self.filler = filler + self.inner_layer = inner_layer + self.alternate_inner_layer = alternate_inner_layer + self.middle_layer = middle_layer + self.outer_layer = outer_layer + self.inner_placements = inner_placements + self.min_outer_wall_distance = min_outer_wall_distance + self.max_outer_wall_distance = max_outer_wall_distance + self.min_distribution_points = min_distribution_points + self.max_distribution_points = max_distribution_points + self.min_point_offset = min_point_offset + self.max_point_offset = max_point_offset + self.max_radius = max_radius + self.crack_point_offset = crack_point_offset + self.generate_crack_chance = generate_crack_chance + self.base_crack_size = base_crack_size + self.noise_multiplier = noise_multiplier + self.use_potential_placements_chance = use_potential_placements_chance + self.use_alternate_layer0_chance = use_alternate_layer0_chance + self.placements_require_layer0_alternate = placements_require_layer0_alternate + self.invalid_blocks_threshold = invalid_blocks_threshold + + @property + def inner_placements(self) -> list[BlockState]: + return getattr(self, "_inner_placements") + + @inner_placements.setter + def inner_placements(self, value: list[BlockState]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_inner_placements", [BlockState.of(x) for x in value]) + + @property + def outer_layer(self) -> BlockState: + return getattr(self, "_outer_layer") + + @outer_layer.setter + def outer_layer(self, value: BlockState): + setattr(self, "_outer_layer", BlockState.of(value)) + + @property + def middle_layer(self) -> BlockState: + return getattr(self, "_middle_layer") + + @middle_layer.setter + def middle_layer(self, value: BlockState): + setattr(self, "_middle_layer", BlockState.of(value)) + + @property + def alternate_inner_layer(self) -> BlockState: + return getattr(self, "_alternate_inner_layer") + + @alternate_inner_layer.setter + def alternate_inner_layer(self, value: BlockState): + setattr(self, "_alternate_inner_layer", BlockState.of(value)) + + @property + def inner_layer(self) -> BlockState: + return getattr(self, "_inner_layer") + + @inner_layer.setter + def inner_layer(self, value: BlockState): + setattr(self, "_inner_layer", BlockState.of(value)) + + @property + def filler(self) -> BlockState: + return getattr(self, "_filler") + + @filler.setter + def filler(self, value: BlockState): + setattr(self, "_filler", BlockState.of(value)) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = GeodeFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["filler"] = self.filler.jsonify() + data[str(self.id)]["inner_layer"] = self.inner_layer.jsonify() + data[str(self.id)][ + "alternate_inner_layer" + ] = self.alternate_inner_layer.jsonify() + data[str(self.id)]["middle_layer"] = self.middle_layer.jsonify() + data[str(self.id)]["outer_layer"] = self.outer_layer.jsonify() + data[str(self.id)]["inner_placements"] = [ + x.jsonify() for x in self.inner_placements + ] + data[str(self.id)]["min_outer_wall_distance"] = self.min_outer_wall_distance + data[str(self.id)]["max_outer_wall_distance"] = self.max_outer_wall_distance + data[str(self.id)]["min_distribution_points"] = self.min_distribution_points + data[str(self.id)]["max_distribution_points"] = self.max_distribution_points + data[str(self.id)]["min_point_offset"] = self.min_point_offset + data[str(self.id)]["max_point_offset"] = self.max_point_offset + data[str(self.id)]["max_radius"] = self.max_radius + data[str(self.id)]["crack_point_offset"] = self.crack_point_offset + data[str(self.id)]["generate_crack_chance"] = self.generate_crack_chance + data[str(self.id)]["base_crack_size"] = self.base_crack_size + data[str(self.id)]["noise_multiplier"] = self.noise_multiplier + data[str(self.id)][ + "use_potential_placements_chance" + ] = self.use_potential_placements_chance + data[str(self.id)][ + "use_alternate_layer0_chance" + ] = self.use_alternate_layer0_chance + data[str(self.id)][ + "placements_require_layer0_alternate" + ] = self.placements_require_layer0_alternate + data[str(self.id)]["invalid_blocks_threshold"] = self.invalid_blocks_threshold + return data + + # INNER PLACEMENTS + def get_placement(self, index) -> BlockState: + return self.inner_placements[index] + + def add_placement(self, inner_block: BlockState) -> BlockState: + self.inner_placements.append(inner_block) + return inner_block + + def remove_placement(self, index: int) -> BlockState: + return self.inner_placements.pop(index) + + def clear_placements(self) -> Self: + self.inner_placements.clear() + return self + + +class GeodeFeatureLoader(Loader): + name = "Geode Feature" + + def __init__(self): + from .schemas import GeodeSchem1 + + Loader.__init__(self, GeodeFeature) + self.add_schema(GeodeSchem1, "1.13.0") + self.add_schema(GeodeSchem1, "1.16.0") + + +@dataclass +class HeightDistribution: + range: Range + value: int + + @staticmethod + def from_dict(data: dict) -> Self: + return HeightDistribution(Range.from_dict(data[0], "range_"), data[1]) + + def jsonify(self) -> dict: + data = [self.range.jsonify("range_"), self.value] + return data + + +class GrowingPlantBlock: + + def __init__(self, block: BlockState, value: int): + self.block = block + self.value = value + + @property + def block(self) -> BlockState: + return getattr(self, "_block") + + @block.setter + def block(self, value: BlockState): + setattr(self, "_block", BlockState.of(value)) + + @property + def value(self) -> int: + return getattr(self, "_value") + + @value.setter + def value(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_value", value) + + @staticmethod + def from_dict(data: dict) -> Self: + return GrowingPlantBlock(BlockState.from_dict(data[0]), data[1]) + + def jsonify(self) -> dict: + data = [self.block.jsonify(), self.value] + return data + + +@feature_type +@behavior_pack +class GrowingPlantFeature(Feature): + """ + Represents a data-driven [Growing Plant Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Agrowing_plant_feature). + """ + + id = Identifier("growing_plant_feature") + FILEPATH = "features/growing_plant_feature.json" + + def __init__( + self, + identifier: Identifiable, + growth_direction: str, + allow_water: bool, + age: Range = None, + height_distribution: list[HeightDistribution] = [], + body_blocks: list[GrowingPlantBlock] = [], + head_blocks: list[GrowingPlantBlock] = [], + ): + Feature.__init__(self, identifier) + self.height_distribution = height_distribution + self.growth_direction = growth_direction + self.age = age + self.body_blocks = body_blocks + self.head_blocks = head_blocks + self.allow_water = allow_water + + @property + def head_blocks(self) -> list[GrowingPlantBlock]: + return getattr(self, "_head_blocks") + + @head_blocks.setter + def head_blocks(self, value: list[GrowingPlantBlock]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_head_blocks", value) + + @property + def body_blocks(self) -> list[GrowingPlantBlock]: + return getattr(self, "_body_blocks") + + @body_blocks.setter + def body_blocks(self, value: list[GrowingPlantBlock]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_body_blocks", value) + + @property + def height_distribution(self) -> list[HeightDistribution]: + return getattr(self, "_height_distribution") + + @height_distribution.setter + def height_distribution(self, value: list[HeightDistribution]): + if not isinstance(value, list): + raise TypeError(f"Expected lt but got '{value.__class__.__name__}' instead") + setattr(self, "_height_distribution", value) + + @property + def allow_water(self) -> bool: + return getattr(self, "_allow_water", False) + + @allow_water.setter + def allow_water(self, value: bool): + if not isinstance(value, bool): + raise TypeError( + f"Expected bool but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_allow_water", value) + + @property + def growth_direction(self) -> str: + return getattr(self, "_growth_direction") + + @growth_direction.setter + def growth_direction(self, value: str): + setattr(self, "_growth_direction", str(value)) + + @property + def age(self) -> Range: + return getattr(self, "_age", None) + + @age.setter + def age(self, value: Range): + if value is None: + return + if not isinstance(value, Range): + raise TypeError( + f"Expected Range but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_age", value) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = GrowingPlantFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["height_distribution"] = [ + x.jsonify() for x in self.height_distribution + ] + data[str(self.id)]["growth_direction"] = self.growth_direction + data[str(self.id)]["body_blocks"] = [x.jsonify() for x in self.body_blocks] + data[str(self.id)]["head_blocks"] = [x.jsonify() for x in self.head_blocks] + data[str(self.id)]["allow_water"] = self.allow_water + if self.age is not None: + data[str(self.id)]["age"] = self.age.jsonify("range_") + return data + + # HEIGHT DISTRIBUTION + + def get_height_distribution(self, index: int) -> HeightDistribution: + return self.height_distribution[index] + + def add_height_distribution( + self, height_distribution: HeightDistribution + ) -> HeightDistribution: + self.height_distribution.append(height_distribution) + return height_distribution + + def remove_height_distribution(self, index: int) -> HeightDistribution: + return self.height_distribution.pop(index) + + def clear_height_distribution(self) -> Self: + self.height_distribution.clear() + return self + + # BODY BLOCKS + + def get_body_block(self, index: int) -> GrowingPlantBlock: + return self.body_blocks[index] + + def add_body_block(self, block: GrowingPlantBlock) -> GrowingPlantBlock: + self.body_blocks.append(block) + return block + + def remove_body_block(self, index: int) -> GrowingPlantBlock: + return self.body_blocks.pop(index) + + def clear_body_blocks(self) -> Self: + self.body_blocks.clear() + return self + + # HEAD BLOCKS + + def get_head_block(self, index: int) -> GrowingPlantBlock: + return self.head_blocks[index] + + def add_head_block(self, block: GrowingPlantBlock) -> GrowingPlantBlock: + self.head_blocks.append(block) + return block + + def remove_head_block(self, index: int) -> GrowingPlantBlock: + return self.head_blocks.pop(index) + + def clear_head_blocks(self) -> Self: + self.head_blocks.clear() + return self + + +class GrowingPlantFeatureLoader(Loader): + name = "Growing Plant Feature" + + def __init__(self): + from .schemas import GrowingPlantSchem1 + + Loader.__init__(self, GrowingPlantFeature) + self.add_schema(GrowingPlantSchem1, "1.13.0") + self.add_schema(GrowingPlantSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class NetherCaveCarverFeature(Feature): + """ + Represents a data-driven [Nether Cave Carver Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Anether_cave_carver_feature). + """ + + id = Identifier("nether_cave_carver_feature") + FILEPATH = "features/nether_cave_carver_feature.json" + + def __init__( + self, identifier: Identifiable, fill_with: BlockState, width_modifier: float + ): + Feature.__init__(self, identifier) + self.fill_with = fill_with + self.width_modifier = width_modifier + + @property + def fill_with(self) -> BlockState: + return getattr(self, "_fill_with") + + @fill_with.setter + def fill_with(self, value: BlockState): + setattr(self, "_fill_with", BlockState.of(value)) + + @property + def width_modifier(self) -> float: + return getattr(self, "_width_modifier") + + @width_modifier.setter + def width_modifier(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_width_modifier", float(value)) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = NetherCaveCarverFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["fill_with"] = self.fill_with.jsonify() + data[str(self.id)]["width_modifier"] = self.width_modifier + return data + + +class NetherCaveCarverFeatureLoader(Loader): + name = "Nether Cave Carver Feature" + + def __init__(self): + from .schemas import NetherCaveCarverSchem1 + + Loader.__init__(self, NetherCaveCarverFeature) + self.add_schema(NetherCaveCarverSchem1, "1.13.0") + self.add_schema(NetherCaveCarverSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class MultifaceFeature(Feature): + """ + Represents a data-driven [Multiface Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Amultiface_feature). + """ + + id = Identifier("multiface_feature") + FILEPATH = "features/multiface_feature.json" + + def __init__( + self, + identifier: Identifiable, + places_block: BlockState, + search_range: int, + can_place_on_floor: bool, + can_place_on_ceiling: bool, + can_place_on_wall: bool, + chance_of_spreading: float, + can_place_on: list[BlockState] = [], + ): + Feature.__init__(self, identifier) + self.places_block = places_block + self.search_range = search_range + self.can_place_on_floor = can_place_on_floor + self.can_place_on_ceiling = can_place_on_ceiling + self.can_place_on_wall = can_place_on_wall + self.chance_of_spreading = chance_of_spreading + self.can_place_on = can_place_on + + @property + def places_block(self) -> BlockState: + return getattr(self, "_places_block") + + @places_block.setter + def places_block(self, value: BlockState): + setattr(self, "_places_block", BlockState.of(value)) + + @property + def search_range(self) -> int: + return getattr(self, "_search_range") + + @search_range.setter + def search_range(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_search_range", value) + + @property + def can_place_on_floor(self) -> bool: + return getattr(self, "_can_place_on_floor") + + @can_place_on_floor.setter + def can_place_on_floor(self, value: bool): + if not isinstance(value, bool): + raise TypeError( + f"Expected bool but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_can_place_on_floor", value) + + @property + def can_place_on_ceiling(self) -> bool: + return getattr(self, "_can_place_on_ceiling") + + @can_place_on_ceiling.setter + def can_place_on_ceiling(self, value: bool): + if not isinstance(value, bool): + raise TypeError( + f"Expected bool but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_can_place_on_ceiling", value) + + @property + def can_place_on_wall(self) -> bool: + return getattr(self, "_can_place_on_wall") + + @can_place_on_wall.setter + def can_place_on_wall(self, value: bool): + if not isinstance(value, bool): + raise TypeError( + f"Expected bool but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_can_place_on_wall", value) + + @property + def chance_of_spreading(self) -> float: + return getattr(self, "_chance_of_spreading") + + @chance_of_spreading.setter + def chance_of_spreading(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_chance_of_spreading", float(value)) + + @property + def can_place_on(self) -> list[BlockState]: + return getattr(self, "_can_place_on") + + @can_place_on.setter + def can_place_on(self, value: list[BlockState]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_can_place_on", [BlockState.of(x) for x in value]) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = MultifaceFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["places_block"] = self.places_block.jsonify() + data[str(self.id)]["search_range"] = self.search_range + data[str(self.id)]["can_place_on_floor"] = self.can_place_on_floor + data[str(self.id)]["can_place_on_ceiling"] = self.can_place_on_ceiling + data[str(self.id)]["can_place_on_wall"] = self.can_place_on_wall + data[str(self.id)]["chance_of_spreading"] = self.chance_of_spreading + data[str(self.id)]["can_place_on"] = [x.jsonify() for x in self.can_place_on] + return data + + def get_place_on_block(self, index: int) -> BlockState: + return self.can_place_on[index] + + def add_place_on_block(self, block: BlockState) -> BlockState: + b = BlockState.of(block) + self.can_place_on.append(b) + return b + + def remove_place_on_block(self, index: int) -> BlockState: + return self.can_place_on.pop(index) + + def clear_place_on_block(self) -> Self: + self.can_place_on.clear() + return self + + +class MultifaceFeatureLoader(Loader): + name = "Multiface Feature" + + def __init__(self): + from .schemas import MultifaceSchem1 + + Loader.__init__(self, MultifaceFeature) + self.add_schema(MultifaceSchem1, "1.13.0") + self.add_schema(MultifaceSchem1, "1.16.0") + + +class ReplaceRule: + def __init__(self, places_block: BlockState, may_replace: list[BlockState] = []): + self.places_block = places_block + self.may_replace = may_replace + + @property + def places_block(self) -> BlockState: + return getattr(self, "_places_block") + + @places_block.setter + def places_block(self, value: BlockState): + setattr(self, "_places_block", BlockState.of(value)) + + @property + def may_replace(self) -> list[BlockState]: + return getattr(self, "_may_replace") + + @may_replace.setter + def may_replace(self, value: list[BlockState]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_may_replace", [BlockState.of(x) for x in value]) + + @staticmethod + def from_dict(data: dict) -> Self: + places_block = BlockState.from_dict(data.pop("places_block")) + may_replace = [BlockState.from_dict(x) for x in data.pop("may_replace")] + return ReplaceRule(places_block, may_replace) + + def jsonify(self) -> dict: + data = { + "places_block": self.places_block.jsonify(), + } + if self.may_replace: + data["may_replace"] = [x.jsonify() for x in self.may_replace] + return data + + def get_replace(self, index: int) -> BlockState: + return self.may_replace[index] + + def add_replace(self, block: BlockState) -> BlockState: + b = BlockState.of(block) + self.may_replace.append(b) + return b + + def remove_replace(self, index: int) -> BlockState: + return self.may_replace.pop(index) + + def clear_replace(self) -> Self: + self.may_replace.clear() + return self + + +@feature_type +@behavior_pack +class OreFeature(Feature): + """ + Represents a data-driven [Ore Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Aore_feature). + """ + + id = Identifier("ore_feature") + FILEPATH = "features/ore_feature.json" + + def __init__( + self, + identifier: Identifiable, + count: int, + places_block: BlockState = None, + replace_rules: list[ReplaceRule] = [], + ): + Feature.__init__(self, identifier) + self.places_block = places_block + self.count = count + self.replace_rules = replace_rules + + @property + def places_block(self) -> BlockState: + return getattr(self, "_places_block", None) + + @places_block.setter + def places_block(self, value: BlockState): + if value is None: + return + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_places_block", value) + + @property + def count(self) -> int: + return getattr(self, "_count") + + @count.setter + def count(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_count", value) + + @property + def replace_rules(self) -> list[ReplaceRule]: + return getattr(self, "_replace_rules") + + @replace_rules.setter + def replace_rules(self, value: list[ReplaceRule]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_replace_rules", value) + + def __iter__(self): + for i in self.replace_rules: + yield i + + @staticmethod + def from_dict(data: dict) -> Self: + loader = OreFeatureLoader() + loader.validate(data) + return loader.load(data) + + # REPLACE RULE + def get_rule(self, index: int) -> ReplaceRule: + return self.replace_rules[index] + + def add_rule(self, rule: ReplaceRule) -> ReplaceRule: + self.replace_rules.append(rule) + return rule + + def remove_rule(self, index: int) -> ReplaceRule: + return self.replace_rules.pop(index) + + def clear_rules(self) -> Self: + self.replace_rules.clear() + return self + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["count"] = self.count + if self.places_block: + data[str(self.id)]["places_block"] = self.places_block.jsonify() + data[str(self.id)]["replace_rules"] = [x.jsonify() for x in self.replace_rules] + return data + + +class OreFeatureLoader(Loader): + name = "Ore Feature" + + def __init__(self): + from .schemas import OreSchem1 + + Loader.__init__(self, OreFeature) + self.add_schema(OreSchem1, "1.13.0") + self.add_schema(OreSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class PartiallyExposedBlobFeature(Feature): + """ + Represents a data-driven [Partially Exposed Blob Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Apartially_exposed_blob_feature). + """ + + id = Identifier("partially_exposed_blob_feature") + FILEPATH = "features/partially_exposed_blob_feature.json" + + def __init__( + self, + identifier: Identifiable, + places_block: BlockState, + placement_radius_around_floor: int, + placement_probability_per_valid_position: float, + exposed_face: str, + ): + Feature.__init__(self, identifier) + self.places_block = places_block + self.placement_radius_around_floor = placement_radius_around_floor + self.placement_probility_per_valid_position = ( + placement_probability_per_valid_position + ) + self.exposed_face = exposed_face + + @property + def places_block(self) -> BlockState: + return getattr(self, "_places_block") + + @places_block.setter + def places_block(self, value: BlockState): + setattr(self, "_places_block", BlockState.of(value)) + + @property + def placement_radius_around_floor(self) -> int: + return getattr(self, "_placement_radius_around_floor") + + @placement_radius_around_floor.setter + def placement_radius_around_floor(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_placement_radius_around_floor", value) + + @property + def placement_probility_per_valid_position(self) -> float: + return getattr(self, "_placement_probility_per_valid_position") + + @placement_probility_per_valid_position.setter + def placement_probility_per_valid_position(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_placement_probility_per_valid_position", float(value)) + + @property + def exposed_face(self) -> str: + return getattr(self, "_exposed_face") + + @exposed_face.setter + def exposed_face(self, value: str): + setattr(self, "_exposed_face", str(value)) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = PartiallyExposedBlobFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["places_block"] = self.places_block.jsonify() + data[str(self.id)][ + "placement_radius_around_floor" + ] = self.placement_radius_around_floor + data[str(self.id)][ + "placement_probability_per_valid_position" + ] = self.placement_probility_per_valid_position + data[str(self.id)]["exposed_face"] = self.exposed_face + return data + + +class PartiallyExposedBlobFeatureLoader(Loader): + name = "Partially Exposed Blob Feature" + + def __init__(self): + from .schemas import PartiallyExposedBlobSchem1 + + Loader.__init__(self, PartiallyExposedBlobFeature) + self.add_schema(PartiallyExposedBlobSchem1, "1.13.0") + self.add_schema(PartiallyExposedBlobSchem1, "1.16.0") + + +class FeatureArea: + def __init__(self, feature: Identifiable, area_dimentions: Vector2): + self.feature = feature + self.area_dimentions = area_dimentions + + @property + def feature(self) -> Identifier: + return getattr(self, "_feature") + + @feature.setter + def feature(self, value: Identifiable): + setattr(self, "_feature", Identifiable.of(value)) + + @property + def area_dimentions(self) -> Vector2: + return getattr(self, "_area_dimentions") + + @area_dimentions.setter + def area_dimentions(self, value: Vector2): + if not isinstance(value, Vector2): + raise TypeError( + f"Expected Vector2 but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_area_dimentions", value) + + @staticmethod + def from_dict(data: dict) -> Self: + feature = data.pop("feature") + area_dimentions = Vector2.from_dict(data.pop("area_dimentions")) + return FeatureArea(feature, area_dimentions) + + def jsonify(self) -> dict: + data = { + "feature": str(self.feature), + "area_dimentions": self.area_dimentions.jsonify(), + } + return data + + +@feature_type +@behavior_pack +class RectLayoutFeature(Feature): + """ + Represents a data-driven [Rect Layout Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Arect_layout). + """ + + id = Identifier("rect_layout") + FILEPATH = "features/rect_layout.json" + + def __init__( + self, + identifier: Identifiable, + ratio_of_empty_space: float, + feature_areas: list[FeatureArea] = [], + ): + Feature.__init__(self, identifier) + self.ratio_of_empty_space = ratio_of_empty_space + self.feature_areas = feature_areas + + @property + def ratio_of_empty_space(self) -> float: + return getattr(self, "_ratio_of_empty_space") + + @ratio_of_empty_space.setter + def ratio_of_empty_space(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_ratio_of_empty_space", float(value)) + + @property + def feature_areas(self) -> list[FeatureArea]: + return getattr(self, "_feature_areas") + + @feature_areas.setter + def feature_areas(self, value: list[FeatureArea]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_feature_areas", value) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = RectLayoutFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["ratio_of_empty_space"] = self.ratio_of_empty_space + data[str(self.id)]["feature_areas"] = [x.jsonify() for x in self.feature_areas] + return data + + # FEATURE AREA + + def get_feature_area(self, index: int) -> FeatureArea: + return self.feature_areas[index] + + def add_feature_area(self, feature_area: FeatureArea) -> FeatureArea: + self.feature_areas.append(feature_area) + return feature_area + + def remove_feature_area(self, index: int) -> FeatureArea: + return self.feature_areas.pop(index) + + def clear_feature_areas(self) -> Self: + self.feature_areas.clear() + return self + + +class RectLayoutFeatureLoader(Loader): + name = "Rect Layout" + + def __init__(self): + from .schemas import RectLayoutSchem1 + + Loader.__init__(self, RectLayoutFeature) + self.add_schema(RectLayoutSchem1, "1.13.0") + self.add_schema(RectLayoutSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class ScanSurfaceFeature(Feature): + """ + Represents a data-driven [Scan Surface Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Ascan_surface). + """ + + id = Identifier("scan_surface") + FILEPATH = "features/scan_surface.json" + + def __init__(self, identifier: Identifiable, scan_surface_feature: Identifiable): + Feature.__init__(self, identifier) + self.scan_surface_feature = scan_surface_feature + + @staticmethod + def from_dict(data: dict) -> Self: + loader = ScanSurfaceFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["scan_surface_feature"] = str(self.scan_surface_feature) + return data + + +class ScanSurfaceFeatureLoader(Loader): + name = "Scan Surface" + + def __init__(self): + from .schemas import ScanSurfaceSchem1 + + Loader.__init__(self, ScanSurfaceFeature) + self.add_schema(ScanSurfaceSchem1, "1.13.0") + self.add_schema(ScanSurfaceSchem1, "1.16.0") + + +class DistributionProvider: + def __init__( + self, + distribution: str, + extent: Vector2, + step_size: int = None, + grid_offset: int = None, + ): + self.distribution = distribution + self.extent = extent + self.step_size = step_size + self.grid_offset = grid_offset + + @property + def step_size(self) -> int: + return getattr(self, "_step_size", None) + + @step_size.setter + def step_size(self, value: int): + if value is None: + return + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_step_size", value) + + @property + def grid_offset(self) -> int: + return getattr(self, "_grid_offset", None) + + @grid_offset.setter + def grid_offset(self, value: int): + if value is None: + return + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_grid_offset", value) + + @property + def distribution(self) -> str: + return getattr(self, "_distribution") + + @distribution.setter + def distribution(self, value: str): + setattr(self, "_distribution", str(value)) + + @property + def extent(self) -> Vector2: + return getattr(self, "_extent") + + @extent.setter + def extent(self, value: Vector2): + if not isinstance(value, Vector2): + raise TypeError( + f"Expected Vector2 but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_extent", value) + + @staticmethod + def from_dict(data: dict) -> Self | int: + if isinstance(data, int): + return data + distribution = data.pop("distribution") + extent = Vector2(*data.pop("extent")) + return DistributionProvider(distribution, extent) + + def jsonify(self) -> dict: + data = {"distribution": self.distribution, "extent": self.extent.jsonify()} + if self.step_size: + data["step_size"] = self.step_size + if self.grid_offset: + data["grid_offset"] = self.grid_offset + return data + + +@feature_type +@behavior_pack +class ScatterFeature(Feature): + """ + Represents a data-driven [Scatter Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Ascatter_feature). + """ + + id = Identifier("scatter_feature") + FILEPATH = "features/scatter_feature.json" + + def __init__( + self, + identifier: Identifiable, + places_feature: Identifiable, + iterations: Molang, + x: DistributionProvider | int, + y: DistributionProvider | int, + z: DistributionProvider | int, + scatter_chance: float = None, + ): + Feature.__init__(self, identifier) + self.places_feature = places_feature + self.iterations = iterations + self.scatter_chance = scatter_chance + self.x = x + self.y = y + self.z = z + + @property + def z(self) -> DistributionProvider | int: + return getattr(self, "_z") + + @z.setter + def z(self, value: DistributionProvider | int): + if not isinstance(value, (DistributionProvider, int)): + raise TypeError( + f"Expected Distribution, int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_z", value) + + @property + def y(self) -> DistributionProvider | int: + return getattr(self, "_y") + + @y.setter + def y(self, value: DistributionProvider | int): + if not isinstance(value, (DistributionProvider, int)): + raise TypeError( + f"Expected Distribution, int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_y", value) + + @property + def x(self) -> DistributionProvider | int: + return getattr(self, "_x") + + @x.setter + def x(self, value: DistributionProvider | int): + if not isinstance(value, (DistributionProvider, int)): + raise TypeError( + f"Expected Distribution, int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_x", value) + + @property + def scatter_chance(self) -> float: + return getattr(self, "_scatter_chance", None) + + @scatter_chance.setter + def scatter_chance(self, value: float): + if value is None: + return + if not isinstance(value, float): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_scatter_chance", value) + + @property + def iterations(self) -> int: + return getattr(self, "_iterations") + + @iterations.setter + def iterations(self, value: Molang): + if not isinstance(value, (Molang, int)): + raise TypeError( + f"Expected Molang, int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_iterations", Molang(value)) + + @property + def places_feature(self) -> Identifier: + return getattr(self, "_places_feature") + + @places_feature.setter + def places_feature(self, value: Identifiable): + setattr(self, "_places_feature", Identifiable.of(value)) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = ScatterFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["places_feature"] = str(self.places_feature) + data[str(self.id)]["iterations"] = self.iterations + if self.scatter_chance: + data[str(self.id)]["scatter_chance"] = self.scatter_chance + data[str(self.id)]["x"] = ( + self.x.jsonify() if isinstance(self.x, DistributionProvider) else self.x + ) + data[str(self.id)]["y"] = ( + self.y.jsonify() if isinstance(self.y, DistributionProvider) else self.y + ) + data[str(self.id)]["z"] = ( + self.z.jsonify() if isinstance(self.z, DistributionProvider) else self.z + ) + return data + + +class ScatterFeatureLoader(Loader): + name = "Scatter Feature" + + def __init__(self): + from .schemas import ScatterSchem1 + + Loader.__init__(self, ScatterFeature) + self.add_schema(ScatterSchem1, "1.13.0") + self.add_schema(ScatterSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class SculkPatchFeature(Feature): + """ + Represents a data-driven [Sculk Patch Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Asculk_patch_feature). + """ + + id = Identifier("sculk_patch_feature") + FILEPATH = "features/sculk_patch_feature.json" + + def __init__( + self, + identifier: Identifiable, + central_block: BlockState, + central_block_placement_chance: float, + charge_amount: int, + cursor_count: int, + growth_rounds: int, + spread_attempts: int, + spread_rounds: int, + extra_growth_chance: Range, + can_place_sculk_patch_on: list[BlockState] = [], + ): + Feature.__init__(self, identifier) + self.can_place_sculk_patch_on = can_place_sculk_patch_on + self.central_block = central_block + self.central_block_placement_chance = central_block_placement_chance + self.charge_amount = charge_amount + self.cursor_count = cursor_count + self.growth_rounds = growth_rounds + self.spread_attempts = spread_attempts + self.spread_rounds = spread_rounds + self.extra_growth_chance = extra_growth_chance + + @property + def central_block(self) -> BlockState: + return getattr(self, "_central_block") + + @central_block.setter + def central_block(self, value: BlockState): + setattr(self, "_central_block", BlockState.of(value)) + + @property + def central_block_placement_chance(self) -> float: + return getattr(self, "_central_block_placement_chance") + + @central_block_placement_chance.setter + def central_block_placement_chance(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_central_block_placement_chance", float(value)) + + @property + def charge_amount(self) -> int: + return getattr(self, "_charge_amount") + + @charge_amount.setter + def charge_amount(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_charge_amount", value) + + @property + def growth_rounds(self) -> int: + return getattr(self, "_growth_rounds") + + @growth_rounds.setter + def growth_rounds(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_growth_rounds", value) + + @property + def spread_attempts(self) -> int: + return getattr(self, "_spread_attempts") + + @spread_attempts.setter + def spread_attempts(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_spread_attempts", value) + + @property + def spread_rounds(self) -> int: + return getattr(self, "_spread_rounds") + + @spread_rounds.setter + def spread_rounds(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_spread_rounds", value) + + @property + def extra_growth_chance(self) -> Range: + return getattr(self, "_extra_growth_chance", None) + + @extra_growth_chance.setter + def extra_growth_chance(self, value: Range): + if not isinstance(value, Range): + raise TypeError( + f"Expected Range but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_extra_growth_chance", value) + + @property + def can_place_sculk_patch_on(self) -> list[BlockState]: + return getattr(self, "_can_place_sculk_patch_on") + + @can_place_sculk_patch_on.setter + def can_place_sculk_patch_on(self, value: list[BlockState]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_can_place_sculk_patch_on", [BlockState.of(x) for x in value]) + + @property + def cursor_count(self) -> int: + return getattr(self, "_cursor_count") + + @cursor_count.setter + def cursor_count(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_cursor_count", value) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = SculkPatchFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["can_place_sculk_patch_on"] = [ + x.jsonify() for x in self.can_place_sculk_patch_on + ] + data[str(self.id)]["central_block"] = self.central_block.jsonify() + data[str(self.id)][ + "central_block_placement_chance" + ] = self.central_block_placement_chance + data[str(self.id)]["charge_amount"] = self.charge_amount + data[str(self.id)]["cursor_count"] = self.cursor_count + data[str(self.id)]["growth_rounds"] = self.growth_rounds + data[str(self.id)]["spread_attempts"] = self.spread_attempts + data[str(self.id)]["spread_rounds"] = self.spread_rounds + if self.extra_growth_chance is not None: + data[str(self.id)]["extra_growth_chance"] = ( + self.extra_growth_chance.jsonify("range_") + ) + return data + + # CAN PLACE ON + + def get_can_place_on(self, index: int) -> BlockState: + return self.can_place_sculk_patch_on[index] + + def add_can_place_on(self, block: BlockState) -> BlockState: + b = BlockState.of(block) + self.can_place_sculk_patch_on.append(b) + return b + + def remove_can_place_on(self, index: int) -> BlockState: + return self.can_place_sculk_patch_on.pop(index) + + def clear_can_place_on(self) -> Self: + self.can_place_sculk_patch_on.clear() + return self + + +class SculkPatchFeatureLoader(Loader): + name = "Sculk Patch Feature" + + def __init__(self): + from .schemas import SculkPatchSchem1 + + Loader.__init__(self, SculkPatchFeature) + self.add_schema(SculkPatchSchem1, "1.13.0") + self.add_schema(SculkPatchSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class SearchFeature(Feature): + """ + Represents a data-driven [Search Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Asearch_feature). + """ + + id = Identifier("search_feature") + FILEPATH = "features/search_feature.json" + + def __init__( + self, + identifier: Identifiable, + places_feature: Identifiable, + search_volume: VectorRange, + search_axis: str, + required_successes: int, + ): + Feature.__init__(self, identifier) + self.places_feature = places_feature + self.search_volume = search_volume + self.search_axis = search_axis + self.required_successes = required_successes + + @property + def places_feature(self) -> Identifier: + return getattr(self, "_places_feature") + + @places_feature.setter + def places_feature(self, value: Identifiable): + setattr(self, "_places_feature", Identifiable.of(value)) + + @property + def search_volume(self) -> VectorRange: + return getattr(self, "_search_volume") + + @search_volume.setter + def search_volume(self, value: VectorRange): + if not isinstance(value, VectorRange): + raise TypeError( + f"Expected VectorRange but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_search_volume", value) + + @property + def search_axis(self) -> str: + return getattr(self, "_search_axis") + + @search_axis.setter + def search_axis(self, value: str): + setattr(self, "_search_axis", str(value)) + + @property + def required_successes(self) -> int: + return getattr(self, "_required_successes") + + @required_successes.setter + def required_successes(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_required_successes", value) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = SearchFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["places_feature"] = str(self.places_feature) + data[str(self.id)]["search_volume"] = self.search_volume.jsonify() + data[str(self.id)]["search_axis"] = self.search_axis + data[str(self.id)]["required_successes"] = self.required_successes + return data + + +class SearchFeatureLoader(Loader): + name = "Search Feature" + + def __init__(self): + from .schemas import SearchSchem1 + + Loader.__init__(self, SearchFeature) + self.add_schema(SearchSchem1, "1.13.0") + self.add_schema(SearchSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class SingleBlockFeature(Feature): + """ + Represents a data-driven [Single Block Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Asingle_block_feature). + """ + + id = Identifier("single_block_feature") + FILEPATH = "features/single_block_feature.json" + + def __init__( + self, + identifier: Identifiable, + places_block: BlockState, + enforce_placement_rule: bool, + enforce_survivability_rule: bool = False, + may_place_on: list[BlockState] = [], + may_replace: list[BlockState] = [], + ): + Feature.__init__(self, identifier) + self.places_block = places_block + self.enforce_placement_rule = enforce_placement_rule + self.enforce_survivability_rule = enforce_survivability_rule + self.may_place_on = may_place_on + self.may_replace = may_replace + + @property + def places_block(self) -> BlockState: + return getattr(self, "_places_block") + + @places_block.setter + def places_block(self, value: BlockState): + setattr(self, "_places_block", BlockState.of(value)) + + @property + def enforce_placement_rule(self) -> bool: + return getattr(self, "_enforce_placement_rule", False) + + @enforce_placement_rule.setter + def enforce_placement_rule(self, value: bool): + if not isinstance(value, bool): + raise TypeError( + f"Expected bool but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_enforce_placement_rule", value) + + @property + def enforce_survivability_rule(self) -> bool: + return getattr(self, "_enforce_survivability_rule", False) + + @enforce_survivability_rule.setter + def enforce_survivability_rule(self, value: bool): + if not isinstance(value, bool): + raise TypeError( + f"Expected bool but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_enforce_survivability_rule", value) + + @property + def may_place_on(self) -> list[BlockState]: + return getattr2(self, "_may_place_on", []) + + @may_place_on.setter + def may_place_on(self, value: list[BlockState]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_may_place_on", [BlockState.of(x) for x in value]) + + @property + def may_replace(self) -> list[BlockState]: + return getattr2(self, "_may_replace", []) + + @may_replace.setter + def may_replace(self, value: list[BlockState]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_may_replace", [BlockState.of(x) for x in value]) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = SingleBlockFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["places_block"] = self.places_block.jsonify() + data[str(self.id)]["enforce_placement_rule"] = self.enforce_placement_rule + if self.enforce_survivability_rule: + data[str(self.id)][ + "enforce_survivability_rule" + ] = self.enforce_survivability_rule + if self.may_place_on: + data[str(self.id)]["may_place_on"] = [ + x.jsonify() for x in self.may_place_on + ] + if self.may_replace: + data[str(self.id)]["may_replace"] = [x.jsonify() for x in self.may_replace] + return data + + # PLACE ON + + def get_place_on(self, index: int) -> BlockState: + return self.may_place_on[index] + + def add_place_on(self, block: BlockState) -> BlockState: + b = BlockState.of(block) + self.may_place_on.append(b) + return b + + def remove_place_on(self, index: int) -> BlockState: + return self.may_place_on.pop(index) + + def clear_place_on(self) -> Self: + self.may_place_on.clear() + return self + + # REPLACE + + def get_replace(self, index: int) -> BlockState: + return self.may_replace[index] + + def add_replace(self, block: BlockState) -> BlockState: + b = BlockState.of(block) + self.may_replace.append(b) + return b + + def remove_replace(self, index: int) -> BlockState: + return self.may_replace.pop(index) + + def claer_replace(self) -> Self: + self.may_replace.clear() + return self + + +class SingleBlockFeatureLoader(Loader): + name = "Single Block Feature" + + def __init__(self): + from .schemas import SingleBlockSchem1 + + Loader.__init__(self, SingleBlockFeature) + self.add_schema(SingleBlockSchem1, "1.13.0") + self.add_schema(SingleBlockSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class SnapToSurfaceFeature(Feature): + """ + Represents a data-driven [Snap To Surface Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Asnap_to_surface_feature). + """ + + id = Identifier("snap_to_surface_feature") + FILEPATH = "features/snap_to_surface_feature.json" + + def __init__( + self, + identifier: Identifiable, + feature_to_snap: Identifiable, + vertical_search_range: int, + surface: str, + ): + Feature.__init__(self, identifier) + self.feature_to_snap = feature_to_snap + self.vertical_search_range = vertical_search_range + self.surface = surface + + @property + def feature_to_snap(self) -> Identifier: + return getattr(self, "_feature_to_snap") + + @feature_to_snap.setter + def feature_to_snap(self, value: Identifiable): + setattr(self, "_feature_to_snap", Identifiable.of(value)) + + @property + def vertical_search_range(self) -> int: + return getattr(self, "_vertical_search_range") + + @vertical_search_range.setter + def vertical_search_range(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_vertical_search_range", value) + + @property + def surface(self) -> str: + return getattr(self, "_surface") + + @surface.setter + def surface(self, value: str): + setattr(self, "_surface", str(value)) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = SnapToSurfaceFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["feature_to_snap"] = str(self.feature_to_snap) + data[str(self.id)]["vertical_search_range"] = self.vertical_search_range + data[str(self.id)]["surface"] = self.surface + return data + + +class SnapToSurfaceFeatureLoader(Loader): + name = "Snap To Surface Feature" + + def __init__(self): + from .schemas import SnapToSurfaceSchem1 + + Loader.__init__(self, SnapToSurfaceFeature) + self.add_schema(SnapToSurfaceSchem1, "1.13.0") + self.add_schema(SnapToSurfaceSchem1, "1.16.0") + + +class BlockIntersection: + def __init__( + self, + block_allowlist: list[BlockState] = [], + block_denylist: list[BlockState] = [], + ): + self.block_allowlist = block_allowlist + self.block_denylist = block_denylist + + @property + def block_allowlist(self) -> list[BlockState]: + return getattr2(self, "_block_allowlist", []) + + @block_allowlist.setter + def block_allowlist(self, value: list[BlockState]): + if value is None: + value = [] + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_block_allowlist", [BlockState.of(x) for x in value]) + + @property + def block_denylist(self) -> list[BlockState]: + return getattr2(self, "_block_denylist", []) + + @block_denylist.setter + def block_denylist(self, value: list[BlockState]): + if value is None: + value = [] + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_block_denylist", [BlockState.of(x) for x in value]) + + @staticmethod + def from_dict(data: dict) -> Self: + block_allowlist = ( + data.pop("block_allowlist") if "block_allowlist" in data else None + ) + block_denylist = ( + data.pop("block_denylist") if "block_denylist" in data else None + ) + return BlockIntersection(block_allowlist, block_denylist) + + def jsonify(self) -> dict: + data = {} + if self.block_allowlist: + data["block_allowlist"] = [x.jsonify() for x in self.block_allowlist] + if self.block_denylist: + data["block_denylist"] = [x.jsonify() for x in self.block_denylist] + return data + + # ALLOWLIST + + def get_allow_block(self, index: int) -> BlockState: + return self.block_allowlist[index] + + def add_allow_block(self, block: BlockState) -> BlockState: + b = BlockState.of(block) + self.block_allowlist.append(b) + return b + + def remove_allow_block(self, index: int) -> BlockState: + return self.block_allowlist.pop(index) + + def clear_allow_blocks(self) -> Self: + self.block_allowlist.clear() + return self + + # DENYLIST + + def get_deny_block(self, index: int) -> BlockState: + return self.block_denylist[index] + + def add_deny_block(self, block: BlockState) -> BlockState: + b = BlockState.of(block) + self.block_denylist.append(b) + return b + + def remove_deny_block(self, index: int) -> BlockState: + return self.block_denylist.pop(index) + + def clear_deny_blocks(self) -> Self: + self.block_denylist.clear() + return self + + +class Constraints: + def __init__(self, unburied: bool, block_intersection: BlockIntersection): + self.unburied = unburied + self.block_intersection = block_intersection + + @staticmethod + def from_dict(data: dict) -> Self: + unburied = False + if "unburied" in data: + unburied = True + block_intersection = BlockIntersection.from_dict(data.pop("block_intersection")) + return Constraints(unburied, block_intersection) + + def jsonify(self) -> dict: + data = {"block_intersection": self.block_intersection.jsonify()} + if self.unburied: + data["unburied"] = {} + return data + + +@feature_type +@behavior_pack +class StructureTemplateFeature(Feature): + """ + Represents a data-driven [Structure Template Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Astructure_template_feature). + """ + + id = Identifier("structure_template_feature") + FILEPATH = "features/structure_template_feature.json" + + def __init__( + self, + identifier: Identifiable, + structure_name: Identifiable, + adjustment_radius: int, + facing_direction: str, + constraints: Constraints, + ): + Feature.__init__(self, identifier) + self.structure_name = structure_name + self.adjustment_radius = adjustment_radius + self.facing_direction = facing_direction + self.constraints = constraints + + @staticmethod + def from_dict(data: dict) -> Self: + loader = StructureTemplateFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["structure_name"] = str(self.structure_name) + data[str(self.id)]["adjustment_radius"] = self.adjustment_radius + data[str(self.id)]["facing_direction"] = self.facing_direction + data[str(self.id)]["constraints"] = self.constraints.jsonify() + return data + + +class StructureTemplateFeatureLoader(Loader): + name = "Structure Template Feature" + + def __init__(self): + from .schemas import StructureTemplateSchem1 + + Loader.__init__(self, StructureTemplateFeature) + self.add_schema(StructureTemplateSchem1, "1.13.0") + self.add_schema(StructureTemplateSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class SurfaceRelativeThresholdFeature(Feature): + """ + Represents a data-driven [Surface Relative Threshold Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Asurface_relative_threshold_feature). + """ + + id = Identifier("surface_relative_threshold_feature") + FILEPATH = "features/surface_relative_threshold_feature.json" + + def __init__( + self, + identifier: Identifiable, + feature_to_snap: Identifiable, + minimum_distance_below_surface: int, + ): + Feature.__init__(self, identifier) + self.feature_to_snap = feature_to_snap + self.minimum_distance_below_surface = minimum_distance_below_surface + + @property + def feature_to_snap(self) -> Identifier: + return getattr(self, "_feature_to_snap", None) + + @feature_to_snap.setter + def feature_to_snap(self, value: Identifiable): + setattr(self, "_feature_to_snap", Identifiable.of(value)) + + @property + def minimum_distance_below_surface(self) -> int: + return getattr(self, "_minimum_distance_below_surface") + + @minimum_distance_below_surface.setter + def minimum_distance_below_surface(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_minimum_distance_below_surface", value) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = SurfaceRelativeThresholdFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + if self.feature_to_snap: + data[str(self.id)]["feature_to_snap"] = str(self.feature_to_snap) + data[str(self.id)][ + "minimum_distance_below_surface" + ] = self.minimum_distance_below_surface + return data + + +class SurfaceRelativeThresholdFeatureLoader(Loader): + name = "Surface Relative Threshold Feature" + + def __init__(self): + from .schemas import SurfaceRelativeThresholdSchem1 + + Loader.__init__(self, SurfaceRelativeThresholdFeature) + self.add_schema(SurfaceRelativeThresholdSchem1, "1.13.0") + self.add_schema(SurfaceRelativeThresholdSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class UnderwaterCaveCarverFeature(Feature): + """ + Represents a data-driven [Underwater Cave Carver Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Aunderwater_cave_carver_feature). + """ + + id = Identifier("underwater_cave_carver_feature") + FILEPATH = "features/underwater_cave_carver_feature.json" + + def __init__( + self, + identifier: Identifiable, + fill_with: BlockState, + width_modifier: float, + replace_air_with: BlockState, + ): + Feature.__init__(self, identifier) + self.fill_with = fill_with + self.width_modifier = width_modifier + self.replace_air_with = replace_air_with + + @property + def fill_with(self) -> BlockState: + return getattr(self, "_fill_with") + + @fill_with.setter + def fill_with(self, value: BlockState): + setattr(self, "_fill_with", BlockState.of(value)) + + @property + def width_modifier(self) -> float: + return getattr(self, "_width_modifier") + + @width_modifier.setter + def width_modifier(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_width_modifier", float(value)) + + @property + def replace_air_with(self) -> BlockState: + return getattr(self, "_replace_air_with") + + @replace_air_with.setter + def replace_air_with(self, value: BlockState): + setattr(self, "_replace_air_with", BlockState.of(value)) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = UnderwaterCaveCarverFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["fill_with"] = self.fill_with.jsonify() + data[str(self.id)]["width_modifier"] = self.width_modifier + data[str(self.id)]["replace_air_with"] = self.replace_air_with.jsonify() + return data + + +class UnderwaterCaveCarverFeatureLoader(Loader): + name = "Underwater Cave Carver Feature" + + def __init__(self): + from .schemas import UnderwaterCaveCarverSchem1 + + Loader.__init__(self, UnderwaterCaveCarverFeature) + self.add_schema(UnderwaterCaveCarverSchem1, "1.13.0") + self.add_schema(UnderwaterCaveCarverSchem1, "1.16.0") + + +class Cluster: + def __init__( + self, may_replace: list[BlockState], num_clusters: int, cluster_radius: int + ): + self.may_replace = may_replace + self.num_clusters = num_clusters + self.cluster_radius = cluster_radius + + @property + def may_replace(self) -> list[BlockState]: + return getattr(self, "_may_replace") + + @may_replace.setter + def may_replace(self, value: list[BlockState]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_may_replace", [BlockState.of(x) for x in value]) + + @property + def num_clusters(self) -> int: + return getattr(self, "_num_clusters") + + @num_clusters.setter + def num_clusters(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_num_clusters", value) + + @property + def cluster_radius(self) -> int: + return getattr(self, "_cluster_radius") + + @cluster_radius.setter + def cluster_radius(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_cluster_radius", value) + + @staticmethod + def from_dict(data: dict) -> Self: + may_replace = [BlockState.of(x) for x in data.pop("may_replace")] + num_clusters = data.pop("num_clusters") + cluster_radius = data.pop("cluster_radius") + return Cluster(may_replace, num_clusters, cluster_radius) + + def jsonify(self) -> dict: + data = { + "may_replace": [x.jsonify() for x in self.may_replace], + "num_clusters": self.num_clusters, + "cluster_radius": self.cluster_radius, + } + return data + + +class TrunkHeight: + def __init__( + self, base: int, intervals: list[int], min_height_for_canopy: int = None + ): + self.base = base + self.intervals = intervals + self.min_height_for_canopy = min_height_for_canopy + + @property + def base(self) -> int: + return getattr(self, "_base") + + @base.setter + def base(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_base", value) + + @property + def intervals(self) -> list[int]: + return getattr(self, "_intervals") + + @intervals.setter + def intervals(self, value: list[int]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_intervals", value) + + @property + def num_height_for_canopy(self) -> int: + return getattr(self, "_num_height_for_canopy") + + @num_height_for_canopy.setter + def num_height_for_canopy(self, value: int): + if value is None: + return + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_num_height_for_canopy", value) + + @staticmethod + def from_dict(data: dict) -> Self: + return TrunkHeight(**data) + + def jsonify(self) -> dict: + data = { + "base": self.base, + "intervals": self.intervals, + "min_height_for_canopy": self.min_height_for_canopy, + } + return data + + +@dataclass +class FancyHeight: + base: int + variance: int + scale: float + + @staticmethod + def from_dict(data: dict) -> Self: + return FancyHeight(**data) + + def jsonify(self) -> dict: + data = {"base": self.base, "variance": self.variance, "scale": self.scale} + return data + + +@dataclass +class MangroveHeight: + base: int + height_rand_a: int + height_rand_b: int + variance: int = None + scale: float = 1.0 + + @staticmethod + def from_dict(data: dict) -> Self: + return MangroveHeight(**data) + + def jsonify(self) -> dict: + data = { + "base": self.base, + "height_rand_a": self.height_rand_a, + "height_rand_b": self.height_rand_b, + } + if self.variance: + data["variance"] = self.variance + if self.scale: + data["scale"] = self.scale + return data + + +@dataclass +class TrunkLean: + allow_diagonal_growth: bool + lean_height: Range + lean_steps: Range + lean_length: Range = None + + @staticmethod + def from_dict(data: dict) -> Self: + allow_diagonal_growth = data.pop("allow_diagonal_growth") + lean_height = Range.from_dict(data.pop("lean_height"), "range_") + lean_steps = Range.from_dict(data.pop("lean_steps"), "range_") + lean_length = ( + Range.from_dict(data.pop("lean_length"), "range_") + if "lean_length" in data + else None + ) + return TrunkLean(allow_diagonal_growth, lean_height, lean_steps, lean_length) + + def jsonify(self) -> dict: + data = { + "allow_diagonal_growth": self.allow_diagonal_growth, + "lean_height": self.lean_height.jsonify("range_"), + "lean_steps": self.lean_steps.jsonify("range_"), + } + if self.lean_length is not None: + data["lean_length"] = self.lean_length.jsonify("range_") + return data + + +class CanopyType: + @property + def id(self) -> Identifier: + return getattr(self, "_id", Identifier("canopy_type")) + + @id.setter + def id(self, value: Identifier): + setattr(self, "_id", Identifier.of(value)) + + @staticmethod + def from_dict(data: dict) -> Self: + for id in data.keys(): + clazz = INSTANCE.get_registry(Registries.TREE_CANOPY).get(id) + if clazz is not None: + return clazz.from_dict(data[id]) + + +@dataclass +class Branches: + branch_length: int + branch_chance: float + branch_steps: int = None + branch_position: int = None + + @staticmethod + def from_dict(data: dict) -> Self: + return Branches(**data) + + def jsonify(self) -> dict: + data = { + "branch_length": self.branch_length, + "branch_chance": self.branch_chance, + } + if self.branch_steps: + data["branch_steps"] = self.branch_steps + if self.branch_position: + data["branch_position"] = self.branch_position + return data + + +@dataclass +class AcaciaBranches(Branches): + branch_canopy: CanopyType = None + + @staticmethod + def from_dict(data: dict) -> Self: + branch_canopy = CanopyType.from_dict(data.pop("branch_canopy")) + return AcaciaBranches(**data, branch_canopy=branch_canopy) + + def jsonify(self) -> dict: + data = super().jsonify() + data["branch_canopy"] = self.branch_canopy.jsonify() + return data + + +@dataclass +class MegaBranches: + branch_length: int + branch_slope: float + branch_interval: int + branch_canopy: CanopyType + + @staticmethod + def from_dict(data: dict) -> Self: + branch_length = data.pop("branch_length") + branch_slope = data.pop("branch_slope") + branch_interval = data.pop("branch_interval") + branch_canopy = CanopyType.from_dict(data.pop("branch_canopy")) + return MegaBranches(branch_length, branch_slope, branch_interval, branch_canopy) + + def jsonify(self) -> dict: + data = { + "branch_length": self.branch_length, + "branch_slope": self.branch_slope, + "branch_interval": self.branch_interval, + "branch_canopy": self.branch_canopy.jsonify(), + } + return data + + +@dataclass +class TreeTypeWeights: + one_branch: int + two_branches: int + two_branches_and_trunk: int + + @staticmethod + def from_dict(data: dict) -> Self: + return TreeTypeWeights(**data) + + def jsonify(self) -> dict: + data = { + "one_branch": self.one_branch, + "two_branches": self.two_branches, + "two_branches_and_trunk": self.two_branches_and_trunk, + } + return data + + +@dataclass +class CherryBranches: + tree_type_weights: TreeTypeWeights + branch_horizontal_length: int + branch_start_offset_from_top: int + branch_end_offset_from_top: int + branch_canopy: CanopyType + + @staticmethod + def from_dict(data: dict) -> Self: + tree_type_weights = TreeTypeWeights.from_dict(data.pop("tree_type_weights")) + branch_horizontal_length = data.pop("branch_horizontal_length") + branch_start_offset_from_top = data.pop("branch_start_offset_from_top") + branch_end_offset_from_top = data.pop("branch_end_offset_from_top") + branch_canopy = CanopyType.from_dict(data.pop("branch_canopy")) + return CherryBranches( + tree_type_weights, + branch_horizontal_length, + branch_start_offset_from_top, + branch_end_offset_from_top, + branch_canopy, + ) + + def jsonify(self) -> dict: + data = { + "tree_type_weights": self.tree_type_weights.jsonify(), + "branch_horizontal_length": self.branch_horizontal_length, + "branch_start_offset_from_top": self.branch_start_offset_from_top, + "branch_end_offset_from_top": self.branch_end_offset_from_top, + "branch_canopy": self.branch_canopy.jsonify(), + } + return data + + +@dataclass +class FancyBranches: + slope: float + density: float + min_altitude_factor: float + + @staticmethod + def from_dict(data: dict) -> Self: + return FancyBranches(**data) + + def jsonify(self) -> dict: + data = { + "slope": self.slope, + "density": self.density, + "min_altitude_factor": self.min_altitude_factor, + } + return data + + +@dataclass +class Decoration: + decoration_block: BlockState + decoration_chance: float + num_steps: int = None + step_direction: str = None + + @staticmethod + def from_dict(data: dict) -> Self: + decoration_block = BlockState.of(data.pop("decoration_block")) + decoration_chance = data.pop("decoration_chance") + num_steps = data.pop("num_steps") if "num_steps" in data else None + step_direction = ( + data.pop("step_direction") if "step_direction" in data else None + ) + return Decoration( + decoration_block, decoration_chance, num_steps, step_direction + ) + + def jsonify(self) -> dict: + data = { + "decoration_block": self.decoration_block.jsonify(), + "decoration_chance": self.decoration_chance, + } + if self.num_steps: + data["num_steps"] = self.num_steps + if self.step_direction: + data["step_direction"] = self.step_direction + return data + + +@dataclass +class TrunkType: + trunk_block: BlockState + + @property + def id(self) -> Identifier: + return getattr(self, "_id") + + @id.setter + def id(self, value: Identifier): + setattr(self, "_id", Identifier.of(value)) + + @property + def trunk_block(self) -> BlockState: + return getattr(self, "_trunk_block") + + @trunk_block.setter + def trunk_block(self, value: BlockState): + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_block", BlockState.of(value)) + + @staticmethod + def from_dict(data: dict) -> Self: + return TrunkType(**data) + + def jsonify(self) -> dict: + data = {"trunk_block": self.trunk_block.jsonify()} + return data + + +class RootType: + def __init__(self): ... + + @property + def id(self) -> Identifier: + return getattr(self, "_id") + + @id.setter + def id(self, value: Identifier): + setattr(self, "_id", Identifier.of(value)) + + @staticmethod + def from_dict(data: dict) -> Self: + for id in data.keys(): + clazz = INSTANCE.get_registry(Registries.TREE_ROOT).get(id) + if clazz is not None: + return clazz.from_dict(data) + + def jsonify(self) -> dict: + data = {} + return data + + +@dataclass +class AboveRoot: + above_root_chance: float + above_root_block: BlockState + + @staticmethod + def from_dict(data: dict) -> Self: + above_root_chance = data.pop("above_root_chance") + above_root_block = BlockState.from_dict(data.pop("above_root_block")) + return AboveRoot(above_root_chance, above_root_block) + + def jsonify(self) -> dict: + data = { + "above_root_chance": self.above_root_chance, + "above_root_block": self.above_root_block.jsonify(), + } + return data + + +INSTANCE.create_registry(Registries.TREE_TRUNK, TrunkType) + + +def tree_trunk(cls): + """ + Add this tree trunk to the registry + """ + + def wrapper(): + if not issubclass(cls, TrunkType): + raise TypeError(f"Expected TrunkType but got '{cls.__name__}' instead") + return INSTANCE.register(Registries.TREE_TRUNK, cls.id, cls) + + return wrapper() + + +INSTANCE.create_registry(Registries.TREE_CANOPY, CanopyType) + + +def tree_canopy(cls): + """ + Add this tree canopy to the registry + """ + + def wrapper(): + if not issubclass(cls, CanopyType): + raise TypeError(f"Expected CanopyType but got '{cls.__name__}' instead") + return INSTANCE.register(Registries.TREE_CANOPY, cls.id, cls) + + return wrapper() + + +INSTANCE.create_registry(Registries.TREE_ROOT, RootType) + + +def tree_root(cls): + """ + Add this tree misc to the registry + """ + + def wrapper(): + if not issubclass(cls, RootType): + raise TypeError(f"Expected RootType but got '{cls.__name__}' instead") + return INSTANCE.register(Registries.TREE_ROOT, cls.id, cls) + + return wrapper() + + +@tree_trunk +class Trunk(TrunkType): + id = Identifier("trunk") + + def __init__( + self, + trunk_block: BlockState, + trunk_height: TrunkHeight, + height_modifier: int, + can_be_submerged: int | bool, + trunk_decoration: Decoration, + ): + TrunkType.__init__(self, trunk_block) + # can_be_submerged {max_depth: int} + self.trunk_height = trunk_height + self.height_modifier = height_modifier + self.can_be_submerged = can_be_submerged + self.trunk_decoration = trunk_decoration + + @property + def trunk_height(self) -> TrunkHeight | Range: + return getattr(self, "_trunk_height") + + @trunk_height.setter + def trunk_height(self, value: TrunkHeight | Range): + if not isinstance(value, (TrunkHeight, Range)): + raise TypeError( + f"Expected TrunkHeight, Range but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_height", value) + + @property + def height_modifier(self) -> Range: + return getattr(self, "_height_modifier", None) + + @height_modifier.setter + def height_modifier(self, value: Range): + if value is None: + return + if not isinstance(value, Range): + raise TypeError( + f"Expected Range but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_height_modifier", value) + + @property + def can_be_submerged(self) -> int | bool: + return getattr(self, "_can_be_submerged", False) + + @can_be_submerged.setter + def can_be_submerged(self, value: dict | bool): + if value is None: + return + if not isinstance(value, (dict, bool)): + raise TypeError( + f"Expected dict, bool but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_can_be_submerged", value) + + @property + def trunk_decoration(self) -> Decoration: + return getattr(self, "_trunk_decoration", None) + + @trunk_decoration.setter + def trunk_decoration(self, value: Decoration): + if value is None: + return + if not isinstance(value, Decoration): + raise TypeError( + f"Expected Decoration but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_decoration", value) + + @staticmethod + def from_dict(data: dict) -> Self: + trunk_block = BlockState.from_dict(data.pop("trunk_block")) + trunk_height = ( + Range.from_dict(data.pop("trunk_height"), "range_") + if "range_min" in data["trunk_height"] + else TrunkHeight.from_dict(data.pop("trunk_height")) + ) + height_modifier = ( + Range.from_dict(data.pop("height_modifier"), "range_") + if "height_modifier" in data + else None + ) + can_be_submerged = ( + data.pop("can_be_submerged") if "can_be_submerged" in data else None + ) + trunk_decoration = ( + Decoration.from_dict(data.pop("trunk_decoration")) + if "trunk_decoration" in data + else None + ) + return Trunk( + trunk_block, + trunk_height, + height_modifier, + can_be_submerged, + trunk_decoration, + ) + + def jsonify(self) -> dict: + data = super().jsonify() + data["trunk_height"] = self.trunk_height.jsonify("range_") + data["can_be_submerged"] = self.can_be_submerged + if self.height_modifier is not None: + data["height_modifier"] = self.height_modifier.jsonify("range_") + if self.trunk_decoration: + data["trunk_decoration"] = self.trunk_decoration.jsonify() + return data + + +@tree_trunk +class AcaciaTrunk(TrunkType): + id = Identifier("acacia_trunk") + + def __init__( + self, + trunk_block: BlockState, + trunk_height: TrunkHeight, + trunk_width: int, + trunk_lean: TrunkLean, + branches: AcaciaBranches = None, + trunk_decoration: Decoration = None, + ): + TrunkType.__init__(self, trunk_block) + self.trunk_height = trunk_height + self.trunk_width = trunk_width + self.trunk_lean = trunk_lean + self.branches = branches + self.trunk_decoration = trunk_decoration + + @property + def trunk_height(self) -> TrunkHeight: + return getattr(self, "_trunk_height") + + @trunk_height.setter + def trunk_height(self, value: TrunkHeight): + if not isinstance(value, TrunkHeight): + raise TypeError( + f"Expected TrunkHeight but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_height", value) + + @property + def trunk_width(self) -> int: + return getattr(self, "_trunk_width") + + @trunk_width.setter + def trunk_width(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_width", value) + + @property + def trunk_lean(self) -> TrunkLean: + return getattr(self, "_trunk_lean") + + @trunk_lean.setter + def trunk_lean(self, value: TrunkLean): + if value is None: + return + if not isinstance(value, TrunkLean): + raise TypeError( + f"Expected TrunkLean but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_lean", value) + + @property + def branches(self) -> AcaciaBranches: + return getattr(self, "_branches", None) + + @branches.setter + def branches(self, value: AcaciaBranches): + if value is None: + return + if not isinstance(value, AcaciaBranches): + raise TypeError( + f"Expected AcaciaBranches but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_branches", value) + + @property + def trunk_decoration(self) -> Decoration: + return getattr(self, "_trunk_decoration", None) + + @trunk_decoration.setter + def trunk_decoration(self, value: Decoration): + if value is None: + return + if not isinstance(value, Decoration): + raise TypeError( + f"Expected Decoration but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_decoration", value) + + @staticmethod + def from_dict(data: dict) -> Self: + trunk_block = BlockState.from_dict(data.pop("trunk_block")) + trunk_height = TrunkHeight.from_dict(data.pop("trunk_height")) + trunk_width = data.pop("trunk_width") + trunk_lean = TrunkLean.from_dict(data.pop("trunk_lean")) + branches = ( + AcaciaBranches.from_dict(data.pop("branches")) + if "branches" in data + else None + ) + trunk_decoration = ( + Decoration.from_dict(data.pop("trunk_decoration")) + if "trunk_decoration" in data + else None + ) + return AcaciaTrunk( + trunk_block, + trunk_height, + trunk_width, + trunk_lean, + branches, + trunk_decoration, + ) + + def jsonify(self) -> dict: + data = super().jsonify() + data["trunk_height"] = self.trunk_height.jsonify() + data["trunk_width"] = self.trunk_width + data["trunk_lean"] = self.trunk_lean.jsonify() + if self.branches: + data["branches"] = self.branches.jsonify() + if self.trunk_decoration: + data["trunk_decoration"] = self.trunk_decoration.jsonify() + return data + + +@tree_trunk +class CherryTrunk(TrunkType): + id = Identifier("cherry_trunk") + + def __init__( + self, + trunk_block: BlockState, + trunk_height: TrunkHeight, + branches: CherryBranches, + ): + TrunkType.__init__(self, trunk_block) + self.trunk_height = trunk_height + self.branches = branches + + @property + def trunk_height(self) -> TrunkHeight: + return getattr(self, "_trunk_height") + + @trunk_height.setter + def trunk_height(self, value: TrunkHeight): + if not isinstance(value, TrunkHeight): + raise TypeError( + f"Expected TrunkHeight but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_height", value) + + @property + def branches(self) -> CherryBranches: + return getattr(self, "_branches") + + @branches.setter + def branches(self, value: CherryBranches): + if not isinstance(value, CherryBranches): + raise TypeError( + f"Expected CherryBranches but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_branches", value) + + @staticmethod + def from_dict(data: dict) -> Self: + trunk_block = BlockState.from_dict(data.pop("trunk_block")) + trunk_height = TrunkHeight.from_dict(data.pop("trunk_height")) + branches = CherryBranches.from_dict(data.pop("branches")) + return CherryTrunk(trunk_block, trunk_height, branches) + + def jsonify(self) -> dict: + data = super().jsonify() + data["trunk_height"] = self.trunk_height.jsonify() + data["branches"] = self.branches.jsonify() + return data + + +@tree_trunk +class FallenTrunk(TrunkType): + id = Identifier("fallen_trunk") + + def __init__( + self, + trunk_block: BlockState, + log_length: int, + stump_height: int, + height_modifier: int, + log_decoration_feature: Identifiable, + trunk_decoration: Decoration, + ): + TrunkType.__init__(self, trunk_block) + self.log_length = log_length + self.stump_height = stump_height + self.height_modifier = height_modifier + self.log_decoration_feature = log_decoration_feature + self.trunk_decoration = trunk_decoration + + @property + def log_length(self) -> int | Range: + return getattr(self, "_log_length") + + @log_length.setter + def log_length(self, value: int | Range): + if not isinstance(value, (int, Range)): + raise TypeError( + f"Expected int, Range but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_log_length", value) + + @property + def stump_height(self) -> int: + return getattr(self, "_stump_height", 1) + + @stump_height.setter + def stump_height(self, value: int): + if value is None: + return + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_stump_height", value) + + @property + def height_modifier(self) -> Range: + return getattr(self, "_height_modifier", None) + + @height_modifier.setter + def height_modifier(self, value: Range): + if value is None: + return + if not isinstance(value, Range): + raise TypeError( + f"Expected Range but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_height_modifier", value) + + @property + def log_decoration_feature(self) -> Identifier: + return getattr(self, "_log_decoration_feature") + + @log_decoration_feature.setter + def log_decoration_feature(self, value: Identifiable): + setattr(self, "_log_decoration_feature", Identifiable.of(value)) + + @property + def trunk_decoration(self) -> Decoration: + return getattr(self, "_trunk_decoration", None) + + @trunk_decoration.setter + def trunk_decoration(self, value: Decoration): + if value is None: + return + if not isinstance(value, Decoration): + raise TypeError( + f"Expected Decoration but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_decoration", value) + + @staticmethod + def from_dict(data: dict) -> Self: + trunk_block = BlockState.from_dict(data.pop("trunk_block")) + log_length = ( + Range.from_dict(data.pop("log_length"), "range_") + if isinstance(data["log_length"], dict) + else data.pop("log_length") + ) + stump_height = data.pop("stump_height") if "stump_height" in data else None + height_modifier = ( + Range.from_dict(data.pop("height_modifier"), "range_") + if "height_modifier" in data + else None + ) + log_decoration_feature = data.pop("log_decoration_feature") + trunk_decoration = ( + Decoration.from_dict(data.pop("trunk_decoration")) + if "trunk_decoration" in data + else None + ) + return FallenTrunk( + trunk_block, + log_length, + stump_height, + height_modifier, + log_decoration_feature, + trunk_decoration, + ) + + def jsonify(self) -> dict: + data = super().jsonify() + data["log_length"] = ( + self.log_length.jsonify("range_") + if isinstance(self.log_length, Range) + else self.log_length + ) + data["log_decoration_feature"] = str(self.log_decoration_feature) + if self.stump_height: + data["stump_height"] = self.stump_height + if self.height_modifier is not None: + data["height_modifier"] = self.height_modifier.jsonify("range_") + if self.trunk_decoration: + data["trunk_decoration"] = self.trunk_decoration.jsonify() + return data + + +@tree_trunk +class FancyTrunk(TrunkType): + id = Identifier("fancy_trunk") + + def __init__( + self, + trunk_block: BlockState, + trunk_height: FancyHeight, + trunk_width: int, + branches: FancyBranches, + width_scale: float, + foliage_altitude_factor: float, + ): + TrunkType.__init__(self, trunk_block) + self.trunk_height = trunk_height + self.trunk_width = trunk_width + self.branches = branches + self.width_scale = width_scale + self.foliage_altitude_factor = foliage_altitude_factor + + @property + def trunk_height(self) -> FancyHeight: + return getattr(self, "_trunk_height") + + @trunk_height.setter + def trunk_height(self, value: FancyHeight): + if not isinstance(value, FancyHeight): + raise TypeError( + f"Expected FancyHeight but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_height", value) + + @property + def trunk_width(self) -> int: + return getattr(self, "_trunk_width") + + @trunk_width.setter + def trunk_width(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_width", value) + + @property + def branches(self) -> FancyBranches: + return getattr(self, "_branches") + + @branches.setter + def branches(self, value: FancyBranches): + if not isinstance(value, FancyBranches): + raise TypeError( + f"Expected FancyBranches but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_branches", value) + + @property + def width_scale(self) -> float: + return getattr(self, "_width_scale") + + @width_scale.setter + def width_scale(self, value: float): + if not isinstance(value, float): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_width_scale", value) + + @property + def foliage_altitude_factor(self) -> float: + return getattr(self, "_foliage_altitude_factor") + + @foliage_altitude_factor.setter + def foliage_altitude_factor(self, value: float): + if not isinstance(value, float): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_foliage_altitude_factor", value) + + @staticmethod + def from_dict(data: dict) -> Self: + trunk_block = BlockState.from_dict(data.pop("trunk_block")) + trunk_height = FancyHeight.from_dict(data.pop("trunk_height")) + trunk_width = data.pop("trunk_width") + branches = FancyBranches.from_dict(data.pop("branches")) + width_scale = data.pop("width_scale") + foliage_altitude_factor = data.pop("foliage_altitude_factor") + return FancyTrunk( + trunk_block, + trunk_height, + trunk_width, + branches, + width_scale, + foliage_altitude_factor, + ) + + def jsonify(self) -> dict: + data = super().jsonify() + data["trunk_height"] = self.trunk_height.jsonify() + data["trunk_width"] = self.trunk_width + data["branches"] = self.branches.jsonify() + data["width_scale"] = self.width_scale + data["foliage_altitude_factor"] = self.foliage_altitude_factor + return data + + +@tree_trunk +class MangroveTrunk(TrunkType): + id = Identifier("mangrove_trunk") + + def __init__( + self, + trunk_block: BlockState, + trunk_height: MangroveHeight, + trunk_width: int, + branches: Branches, + trunk_decoration: Decoration, + ): + TrunkType.__init__(self, trunk_block) + self.trunk_height = trunk_height + self.trunk_width = trunk_width + self.branches = branches + self.trunk_decoration = trunk_decoration + + @property + def trunk_height(self) -> MangroveHeight: + return getattr(self, "_trunk_height") + + @trunk_height.setter + def trunk_height(self, value: MangroveHeight): + if not isinstance(value, MangroveHeight): + raise TypeError( + f"Expected MangroveHeight but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_height", value) + + @property + def trunk_width(self) -> int: + return getattr(self, "_trunk_width") + + @trunk_width.setter + def trunk_width(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_width", value) + + @property + def branches(self) -> Branches: + return getattr(self, "_branches") + + @branches.setter + def branches(self, value: Branches): + if not isinstance(value, Branches): + raise TypeError( + f"Expected Branches but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_branches", value) + + @property + def trunk_decoration(self) -> Decoration: + return getattr(self, "_trunk_decoration", None) + + @trunk_decoration.setter + def trunk_decoration(self, value: Decoration): + if value is None: + return + if not isinstance(value, Decoration): + raise TypeError( + f"Expected Decoration but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_decoration", value) + + @staticmethod + def from_dict(data: dict) -> Self: + trunk_block = BlockState.from_dict(data.pop("trunk_block")) + trunk_height = MangroveHeight.from_dict(data.pop("trunk_height")) + trunk_width = data.pop("trunk_width") + branches = ( + Branches.from_dict(data.pop("branches")) if "branches" in data else None + ) + trunk_decoration = ( + Decoration.from_dict(data.pop("trunk_decoration")) + if "trunk_decoration" in data + else None + ) + return MangroveTrunk( + trunk_block, trunk_height, trunk_width, branches, trunk_decoration + ) + + def jsonify(self) -> dict: + data = super().jsonify() + data["trunk_height"] = self.trunk_height.jsonify() + data["trunk_width"] = self.trunk_width + data["branches"] = self.branches.jsonify() + if self.trunk_decoration: + data["trunk_decoration"] = self.trunk_decoration.jsonify() + return data + + +@tree_trunk +class MegaTrunk(TrunkType): + id = Identifier("mega_trunk") + + def __init__( + self, + trunk_block: BlockState, + trunk_height: TrunkHeight, + trunk_width: int, + trunk_decoration: Decoration, + branches: MegaBranches, + ): + TrunkType.__init__(self, trunk_block) + self.trunk_height = trunk_height + self.trunk_width = trunk_width + self.trunk_decoration = trunk_decoration + self.branches = branches + + @property + def trunk_height(self) -> TrunkHeight: + return getattr(self, "_trunk_height") + + @trunk_height.setter + def trunk_height(self, value: TrunkHeight): + if not isinstance(value, TrunkHeight): + raise TypeError( + f"Expected TrunkHeight but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_height", value) + + @property + def trunk_width(self) -> int: + return getattr(self, "_trunk_width") + + @trunk_width.setter + def trunk_width(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_width", value) + + @property + def trunk_decoration(self) -> Decoration: + return getattr(self, "_trunk_decoration", None) + + @trunk_decoration.setter + def trunk_decoration(self, value: Decoration): + if value is None: + return + if not isinstance(value, Decoration): + raise TypeError( + f"Expected Decoration but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_decoration", value) + + @property + def branches(self) -> MegaBranches: + return getattr(self, "_branches", None) + + @branches.setter + def branches(self, value: MegaBranches): + if value is None: + return + if not isinstance(value, MegaBranches): + raise TypeError( + f"Expected MegaBranches but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_branches", value) + + @staticmethod + def from_dict(data: dict) -> Self: + trunk_block = BlockState.from_dict(data.pop("trunk_block")) + trunk_height = TrunkHeight.from_dict(data.pop("trunk_height")) + trunk_width = data.pop("trunk_width") + trunk_decoration = ( + Decoration.from_dict(data.pop("trunk_decoration")) + if "trunk_decoration" in data + else None + ) + branches = ( + MegaBranches.from_dict(data.pop("branches")) if "branches" in data else None + ) + return MegaTrunk( + trunk_block, trunk_height, trunk_width, trunk_decoration, branches + ) + + def jsonify(self) -> dict: + data = super().jsonify() + data["trunk_height"] = self.trunk_height.jsonify() + data["trunk_width"] = self.trunk_width + if self.trunk_decoration: + data["trunk_decoration"] = self.trunk_decoration.jsonify() + if self.branches: + data["branches"] = self.branches.jsonify() + return data + + +@tree_canopy +class Canopy(CanopyType): + id = Identifier("canopy") + + def __init__( + self, + leaf_block: BlockState, + canopy_offset: Range, + min_width: int, + canopy_slope: Slope, + variation_chance: float, + canopy_decoration: Decoration, + ): + CanopyType.__init__(self) + self.leaf_block = leaf_block + self.canopy_offset = canopy_offset + self.min_width = min_width + self.canopy_slope = canopy_slope + self.variation_chance = variation_chance + self.canopy_decoration = canopy_decoration + + @property + def leaf_block(self) -> BlockState: + return getattr(self, "_leaf_block") + + @leaf_block.setter + def leaf_block(self, value: BlockState): + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_leaf_block", value) + + @property + def canopy_offset(self) -> Range: + return getattr(self, "_canopy_offset") + + @canopy_offset.setter + def canopy_offset(self, value: Range): + if not isinstance(value, Range): + raise TypeError( + f"Expected Range but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_canopy_offset", value) + + @property + def min_width(self) -> int: + return getattr(self, "_min_width", None) + + @min_width.setter + def min_width(self, value: int): + if value is None: + return + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_min_width", value) + + @property + def canopy_slope(self) -> Slope: + return getattr(self, "_canopy_slope", None) + + @canopy_slope.setter + def canopy_slope(self, value: Slope): + if value is None: + return + if not isinstance(value, Slope): + raise TypeError( + f"Expected Slope but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_canopy_slope", value) + + @property + def variation_chance(self) -> list: + return getattr(self, "_variation_chance") + + @variation_chance.setter + def variation_chance(self, value: list): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_variation_chance", value) + + @property + def canopy_decoration(self) -> Decoration: + return getattr(self, "_canopy_decoration", None) + + @canopy_decoration.setter + def canopy_decoration(self, value: Decoration): + if value is None: + return + if not isinstance(value, Decoration): + raise TypeError( + f"Expected Decoration but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_canopy_decoration", value) + + @staticmethod + def from_dict(data: dict) -> Self: + leaf_block = BlockState.from_dict(data.pop("leaf_block")) + canopy_offset = Range.from_dict(data.pop("canopy_offset")) + min_width = data.pop("min_width") if "min_width" in data else None + canopy_slope = ( + Slope.from_dict(data.pop("canopy_slope")) + if "canopy_slope" in data + else None + ) + variation_chance = data.pop("variation_chance") + canopy_decoration = ( + Decoration.from_dict(data.pop("canopy_decoration")) + if "canopy_decoration" in data + else None + ) + return Canopy( + leaf_block, + canopy_offset, + min_width, + canopy_slope, + variation_chance, + canopy_decoration, + ) + + def jsonify(self) -> dict: + data = { + "leaf_block": self.leaf_block.jsonify(), + "canopy_offset": self.canopy_offset.jsonify(), + "variation_chance": self.variation_chance, + } + if self.min_width: + data["min_width"] = self.min_width + if self.canopy_slope: + data["canopy_slope"] = (self.canopy_slope.jsonify(),) + if self.canopy_decoration: + data["canopy_decoration"] = (self.canopy_decoration.jsonify(),) + return data + + +@tree_canopy +class AcaciaCanopy(CanopyType): + id = Identifier("acacia_canopy") + + def __init__(self, leaf_block: BlockState, canopy_size: int, simplify_canopy: bool): + CanopyType.__init__(self) + self.leaf_block = leaf_block + self.canopy_size = canopy_size + self.simplify_canopy = simplify_canopy + + @property + def leaf_block(self) -> BlockState: + return getattr(self, "_leaf_block") + + @leaf_block.setter + def leaf_block(self, value: BlockState): + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_leaf_block", value) + + @property + def canopy_size(self) -> int: + return getattr(self, "_canopy_size") + + @canopy_size.setter + def canopy_size(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_canopy_size", value) + + @property + def simplify_canopy(self) -> bool: + return getattr(self, "_simplify_canopy", False) + + @simplify_canopy.setter + def simplify_canopy(self, value: bool): + if not isinstance(value, bool): + raise TypeError( + f"Expected bool but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_simplify_canopy", value) + + @staticmethod + def from_dict(data: dict) -> Self: + leaf_block = BlockState.from_dict(data.pop("leaf_block")) + canopy_size = data.pop("canopy_size") + simplify_canopy = ( + data.pop("simplify_canopy") if "simplify_canopy" in data else False + ) + return AcaciaCanopy(leaf_block, canopy_size, simplify_canopy) + + def jsonify(self) -> dict: + data = { + "leaf_block": self.leaf_block.jsonify(), + "canopy_size": self.canopy_size, + "simply_canopy": self.simplify_canopy, + } + return data + + +@tree_canopy +class CherryCanopy(CanopyType): + id = Identifier("cherry_canopy") + + def __init__( + self, + leaf_block: BlockState, + height: int, + radius: int, + trunk_width: int, + wide_bottom_layer_hole_chance: float, + corner_hole_chance: float, + hanging_leaves_chance: float, + hanging_leaves_extension_chance: float, + ): + CanopyType.__init__(self) + self.leaf_block = leaf_block + self.height = height + self.radius = radius + self.trunk_width = trunk_width + self.wide_bottom_layer_hole_chance = wide_bottom_layer_hole_chance + self.corner_hole_chance = corner_hole_chance + self.hanging_leaves_chance = hanging_leaves_chance + self.hanging_leaves_extension_chance = hanging_leaves_extension_chance + + @property + def leaf_block(self) -> BlockState: + return getattr(self, "_leaf_block") + + @leaf_block.setter + def leaf_block(self, value: BlockState): + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_leaf_block", value) + + @property + def height(self) -> int: + return getattr(self, "_height") + + @height.setter + def height(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_height", value) + + @property + def radius(self) -> int: + return getattr(self, "_radius") + + @radius.setter + def radius(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_radius", value) + + @property + def radius(self) -> int: + return getattr(self, "_radius") + + @radius.setter + def radius(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_radius", value) + + @property + def trunk_width(self) -> int: + return getattr(self, "_trunk_width", 1) + + @trunk_width.setter + def trunk_width(self, value: int): + if value is None: + return + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk_width", value) + + @property + def wide_bottom_layer_hole_chance(self) -> float: + return getattr(self, "_wide_bottom_layer_hole_chance") + + @wide_bottom_layer_hole_chance.setter + def wide_bottom_layer_hole_chance(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float, int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_wide_bottom_layer_hole_chance", float(value)) + + @property + def corner_hole_chance(self) -> float: + return getattr(self, "_corner_hole_chance") + + @corner_hole_chance.setter + def corner_hole_chance(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float, int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_corner_hole_chance", float(value)) + + @property + def hanging_leaves_chance(self) -> float: + return getattr(self, "_hanging_leaves_chance") + + @hanging_leaves_chance.setter + def hanging_leaves_chance(self, value: float): + if not isinstance(value, float): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_hanging_leaves_chance", value) + + @property + def hanging_leaves_extension_chance(self) -> float: + return getattr(self, "_hanging_leaves_extension_chance") + + @hanging_leaves_extension_chance.setter + def hanging_leaves_extension_chance(self, value: float): + if not isinstance(value, float): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_hanging_leaves_extension_chance", value) + + @staticmethod + def from_dict(data: dict) -> Self: + leaf_block = BlockState.from_dict(data.pop("leaf_block")) + height = data.pop("height") + radius = data.pop("radius") + wide_bottom_layer_hole_chance = data.pop("wide_bottom_layer_hole_chance") + corner_hole_chance = data.pop("corner_hole_chance") + hanging_leaves_chance = data.pop("hanging_leaves_chance") + hanging_leaves_extension_chance = data.pop("hanging_leaves_extension_chance") + trunk_width = data.pop("trunk_width") if "trunk_width" in data else None + return CherryCanopy( + leaf_block, + height, + radius, + trunk_width, + wide_bottom_layer_hole_chance, + corner_hole_chance, + hanging_leaves_chance, + hanging_leaves_extension_chance, + ) + + def jsonify(self) -> dict: + data = { + "leaf_block": self.leaf_block.jsonify(), + "height": self.height, + "radius": self.radius, + "wide_bottom_layer_hole_chance": self.wide_bottom_layer_hole_chance, + "corner_hole_chance": self.corner_hole_chance, + "hanging_leaves_chance": self.hanging_leaves_chance, + "hanging_leaves_extension_chance": self.hanging_leaves_extension_chance, + } + if self.trunk_width: + data["trunk_width"] = self.trunk_width + return data + + +@tree_canopy +class FancyCanopy(CanopyType): + id = Identifier("fancy_canopy") + + def __init__(self, leaf_block: BlockState, height: int, radius: int): + CanopyType.__init__(self) + self.leaf_block = leaf_block + self.height = height + self.radius = radius + + @property + def leaf_block(self) -> BlockState: + return getattr(self, "_leaf_block") + + @leaf_block.setter + def leaf_block(self, value: BlockState): + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_leaf_block", value) + + @property + def height(self) -> int: + return getattr(self, "_height") + + @height.setter + def height(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_height", value) + + @property + def radius(self) -> int: + return getattr(self, "_radius") + + @radius.setter + def radius(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_radius", value) + + @staticmethod + def from_dict(data: dict) -> Self: + leaf_block = BlockState.from_dict(data.pop("leaf_block")) + height = data.pop("height") + radius = data.pop("radius") + return FancyCanopy(leaf_block, height, radius) + + def jsonify(self) -> dict: + data = { + "leaf_block": self.leaf_block.jsonify(), + "height": self.height, + "radius": self.radius, + } + return data + + +@tree_canopy +class MangroveCanopy(CanopyType): + id = Identifier("mangrove_canopy") + + def __init__( + self, + canopy_height: int, + canopy_radius: int, + leaf_placement_attempts: int, + leaf_blocks: list[BlockState], + canopy_decoration: Decoration, + hanging_block: BlockState, + hanging_block_placement_chance: float, + ): + CanopyType.__init__(self) + self.canopy_height = canopy_height + self.canopy_radius = canopy_radius + self.leaf_placement_attempts = leaf_placement_attempts + self.leaf_blocks = leaf_blocks + self.canopy_decoration = canopy_decoration + self.hanging_block = hanging_block + self.hanging_block_placement_chance = hanging_block_placement_chance + + @property + def canopy_height(self) -> int: + return getattr(self, "_canopy_height") + + @canopy_height.setter + def canopy_height(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_canopy_height", value) + + @property + def canopy_radius(self) -> int: + return getattr(self, "_canopy_radius") + + @canopy_radius.setter + def canopy_radius(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_canopy_radius", value) + + @property + def leaf_placement_attempts(self) -> int: + return getattr(self, "_leaf_placement_attempts") + + @leaf_placement_attempts.setter + def leaf_placement_attempts(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_leaf_placement_attempts", value) + + @property + def leaf_blocks(self) -> list[WeightedBlock]: + return getattr(self, "_leaf_blocks") + + @leaf_blocks.setter + def leaf_blocks(self, value: list[WeightedBlock]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_leaf_blocks", value) + + @property + def hanging_block(self) -> BlockState: + return getattr(self, "_hanging_block") + + @hanging_block.setter + def hanging_block(self, value: BlockState): + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_hanging_block", value) + + @property + def hanging_block_placement_chance(self) -> Chance: + return getattr(self, "_hanging_block_placement_chance") + + @hanging_block_placement_chance.setter + def hanging_block_placement_chance(self, value: Chance): + if not isinstance(value, Chance): + raise TypeError( + f"Expected Chance but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_hanging_block_placement_chance", value) + + @staticmethod + def from_dict(data: dict) -> Self: + canopy_height = data.pop("canopy_height") + canopy_radius = data.pop("canopy_radius") + leaf_placement_attempts = data.pop("leaf_placement_attempts") + leaf_blocks = [WeightedBlock.from_dict(x) for x in data.pop("leaf_blocks")] + canopy_decoration = Decoration.from_dict(data.pop("canopy_decoration")) + hanging_block = BlockState.from_dict(data.pop("hanging_block")) + hanging_block_placement_chance = Chance.from_dict( + data.pop("hanging_block_placement_chance") + ) + return MangroveCanopy( + canopy_height, + canopy_radius, + leaf_placement_attempts, + leaf_blocks, + canopy_decoration, + hanging_block, + hanging_block_placement_chance, + ) + + def jsonify(self) -> dict: + data = { + "canopy_height": self.canopy_height, + "canopy_radius": self.canopy_radius, + "leaf_placement_attempts": self.leaf_placement_attempts, + "leaf_blocks": [x.jsonify() for x in self.leaf_blocks], + "canopy_decoration": self.canopy_decoration.jsonify(), + "hanging_block": self.hanging_block.jsonify(), + "hanging_block_placement_chance": self.hanging_block_placement_chance.jsonify(), + } + return data + + +@tree_canopy +class MegaCanopy(CanopyType): + id = Identifier("mega_canopy") + + def __init__( + self, + leaf_block: BlockState, + canopy_height: int, + base_radius: int, + core_width: int, + simplify_canopy: bool, + ): + CanopyType.__init__(self) + self.leaf_block = leaf_block + self.canopy_height = canopy_height + self.base_radius = base_radius + self.core_width = core_width + self.simplify_canopy = simplify_canopy + + @property + def leaf_block(self) -> BlockState: + return getattr(self, "_leaf_block", None) + + @leaf_block.setter + def leaf_block(self, value: BlockState): + if value is None: + return + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_leaf_block", value) + + @property + def canopy_height(self) -> int | Range: + return getattr(self, "_canopy_height", None) + + @canopy_height.setter + def canopy_height(self, value: int | Range): + if value is None: + return + if not isinstance(value, (int, Range)): + raise TypeError( + f"Expected Range, int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_canopy_height", value) + + @property + def base_radius(self) -> int: + return getattr(self, "_base_radius") + + @base_radius.setter + def base_radius(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_base_radius", value) + + @property + def core_width(self) -> int: + return getattr(self, "_core_width", None) + + @core_width.setter + def core_width(self, value: int): + if value is None: + return + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_core_width", value) + + @property + def simplify_canopy(self) -> bool: + return getattr(self, "_simplify_canopy", False) + + @simplify_canopy.setter + def simplify_canopy(self, value: bool): + if not isinstance(value, bool): + raise TypeError( + f"Expected bool but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_simplify_canopy", value) + + @staticmethod + def from_dict(data: dict) -> Self: + leaf_block = BlockState.from_dict(data.pop("leaf_block")) + canopy_height = Range.from_dict(data.pop("canopy_height"), "range_") + base_radius = data.pop("base_radius") + core_width = data.pop("core_width") if "core_width" in data else None + simplify_canopy = ( + data.pop("simplify_canopy") if "simplify_canopy" in data else False + ) + return MegaCanopy( + leaf_block, canopy_height, base_radius, core_width, simplify_canopy + ) + + def jsonify(self) -> dict: + data = { + "base_radius": self.base_radius, + "canopy_height": ( + self.canopy_height.jsonify("range_") + if isinstance(self.canopy_height, Range) + else self.canopy_height + ), + "leaf_block": self.leaf_block.jsonify(), + } + if self.core_width: + data["core_width"] = self.core_width + if self.simplify_canopy: + data["simplify_canopy"] = self.simplify_canopy + return data + + +@tree_canopy +class MegaPineCanopy(CanopyType): + id = Identifier("mega_pine_canopy") + + def __init__( + self, + leaf_block: BlockState, + canopy_height: int, + base_radius: int, + radius_step_modifier: float, + core_width: int, + ): + CanopyType.__init__(self) + self.leaf_block = leaf_block + self.canopy_height = canopy_height + self.base_radius = base_radius + self.radius_step_modifier = radius_step_modifier + self.core_width = core_width + + @property + def leaf_block(self) -> BlockState: + return getattr(self, "_leaf_block") + + @leaf_block.setter + def leaf_block(self, value: BlockState): + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_leaf_block", value) + + @property + def canopy_height(self) -> Range: + return getattr(self, "_canopy_height") + + @canopy_height.setter + def canopy_height(self, value: Range): + if not isinstance(value, Range): + raise TypeError( + f"Expected Range but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_canopy_height", value) + + @property + def base_radius(self) -> int: + return getattr(self, "_base_radius") + + @base_radius.setter + def base_radius(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_base_radius", value) + + @property + def radius_step_modifier(self) -> float: + return getattr(self, "_radius_step_modifier") + + @radius_step_modifier.setter + def radius_step_modifier(self, value: float): + if not isinstance(value, float): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_radius_step_modifier", value) + + @property + def core_radius(self) -> int: + return getattr(self, "_core_radius") + + @core_radius.setter + def core_radius(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_core_radius", value) + + @staticmethod + def from_dict(data: dict) -> Self: + leaf_block = BlockState.from_dict(data.pop("leaf_block")) + canopy_height = Range.from_dict(data.pop("canopy_height"), "range_") + base_radius = data.pop("base_radius") + radius_step_modifier = data.pop("radius_step_modifier") + core_width = data.pop("core_width") + return MegaPineCanopy( + leaf_block, canopy_height, base_radius, radius_step_modifier, core_width + ) + + def jsonify(self) -> dict: + data = { + "leaf_block": self.leaf_block.jsonify(), + "canopy_height": self.canopy_height.jsonify("range_"), + "base_radius": self.base_radius, + "radius_step_modifier": self.radius_step_modifier, + "core_width": self.core_width, + } + return data + + +@tree_canopy +class PineCanopy(CanopyType): + id = Identifier("pine_canopy") + + def __init__(self, leaf_block: BlockState, canopy_height: int, base_radius: int): + CanopyType.__init__(self) + self.leaf_block = leaf_block + self.canopy_height = canopy_height + self.base_radius = base_radius + + @property + def leaf_block(self) -> BlockState: + return getattr(self, "_leaf_block") + + @leaf_block.setter + def leaf_block(self, value: BlockState): + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_leaf_block", value) + + @property + def canopy_height(self) -> int | Range: + return getattr(self, "_canopy_height") + + @canopy_height.setter + def canopy_height(self, value: int | Range): + if not isinstance(value, (int, Range)): + raise TypeError( + f"Expected int, Range but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_canopy_height", value) + + @property + def base_radius(self) -> int: + return getattr(self, "_base_radius") + + @base_radius.setter + def base_radius(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_base_radius", value) + + @staticmethod + def from_dict(data: dict) -> Self: + leaf_block = BlockState.from_dict(data.pop("leaf_block")) + canopy_height = Range.from_dict(data.pop("canopy_height"), "range_") + base_radius = data.pop("base_radius") + return PineCanopy(leaf_block, canopy_height, base_radius) + + def jsonify(self) -> dict: + data = { + "leaf_block": self.leaf_block.jsonify(), + "canopy_height": ( + self.canopy_height.jsonify("range_") + if isinstance(self.canopy_height, Range) + else self.canopy_height + ), + "base_radius": self.base_radius, + } + return data + + +@tree_canopy +class RoofedCanopy(CanopyType): + id = Identifier("roofed_canopy") + + def __init__( + self, + leaf_block: BlockState, + canopy_height: int, + core_width: int, + outer_radius: int, + inner_radius: int, + ): + CanopyType.__init__(self) + self.leaf_block = leaf_block + self.canopy_height = canopy_height + self.core_width = core_width + self.outer_radius = outer_radius + self.inner_radius = inner_radius + + @property + def leaf_block(self) -> BlockState: + return getattr(self, "_leaf_block") + + @leaf_block.setter + def leaf_block(self, value: BlockState): + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_leaf_block", value) + + @property + def canopy_height(self) -> int: + return getattr(self, "_canopy_height") + + @canopy_height.setter + def canopy_height(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_canopy_height", value) + + @property + def core_width(self) -> int: + return getattr(self, "_core_width") + + @core_width.setter + def core_width(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_core_width", value) + + @property + def outer_radius(self) -> int: + return getattr(self, "_outer_radius") + + @outer_radius.setter + def outer_radius(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_outer_radius", value) + + @property + def inner_radius(self) -> int: + return getattr(self, "_inner_radius") + + @inner_radius.setter + def inner_radius(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_inner_radius", value) + + @staticmethod + def from_dict(data: dict) -> Self: + leaf_block = BlockState.from_dict(data.pop("leaf_block")) + canopy_height = data.pop("canopy_height") + core_width = data.pop("core_width") + outer_radius = data.pop("outer_radius") + inner_radius = data.pop("inner_radius") + return RoofedCanopy( + leaf_block, canopy_height, core_width, outer_radius, inner_radius + ) + + def jsonify(self) -> dict: + data = { + "leaf_block": self.leaf_block.jsonify(), + "canopy_height": self.canopy_height, + "core_width": self.core_width, + "outer_radius": self.outer_radius, + "inner_radius": self.inner_radius, + } + return data + + +@tree_canopy +class SpruceCanopy(CanopyType): + id = Identifier("spruce_canopy") + + def __init__( + self, + leaf_block: BlockState, + lower_offset: int, + upper_offset: int, + max_radius: int, + ): + CanopyType.__init__(self) + self.leaf_block = leaf_block + self.lower_offset = lower_offset + self.upper_offset = upper_offset + self.max_radius = max_radius + + @property + def leaf_block(self) -> BlockState: + return getattr(self, "_leaf_block") + + @leaf_block.setter + def leaf_block(self, value: BlockState): + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_leaf_block", value) + + @property + def lower_offset(self) -> Range: + return getattr(self, "_lower_offset") + + @lower_offset.setter + def lower_offset(self, value: Range): + if not isinstance(value, Range): + raise TypeError( + f"Expected Range but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_lower_offset", value) + + @property + def upper_offset(self) -> Range: + return getattr(self, "_upper_offset") + + @upper_offset.setter + def upper_offset(self, value: Range): + if not isinstance(value, Range): + raise TypeError( + f"Expected Range but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_upper_offset", value) + + @property + def max_radius(self) -> Range: + return getattr(self, "_max_radius") + + @max_radius.setter + def max_radius(self, value: Range): + if not isinstance(value, Range): + raise TypeError( + f"Expected Range but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_max_radius", value) + + @staticmethod + def from_dict(data: dict) -> Self: + leaf_block = BlockState.from_dict(data.pop("leaf_block")) + lower_offset = Range.from_dict(data.pop("lower_offset"), "range_") + upper_offset = Range.from_dict(data.pop("upper_offset"), "range_") + max_radius = Range.from_dict(data.pop("max_radius"), "range_") + return SpruceCanopy(leaf_block, lower_offset, upper_offset, max_radius) + + def jsonify(self) -> dict: + data = { + "leaf_block": self.leaf_block.jsonify(), + "lower_offset": self.lower_offset.jsonify("range_"), + "upper_offset": self.upper_offset.jsonify("range_"), + "max_radius": self.max_radius.jsonify("range_"), + } + return data + + +@tree_canopy +class RandomSpreadCanopy(CanopyType): + id = Identifier("random_spread_canopy") + + def __init__( + self, + canopy_height: int, + canopy_radius: int, + leaf_placement_attemps: int, + leaf_blocks: list[WeightedBlock] = [], + ): + CanopyType.__init__(self) + self.leaf_blocks = leaf_blocks + self.canopy_height = canopy_height + self.canopy_radius = canopy_radius + self.leaf_placement_attemps = leaf_placement_attemps + + @property + def leaf_blocks(self) -> list[WeightedBlock]: + return getattr(self, "_leaf_blocks") + + @leaf_blocks.setter + def leaf_blocks(self, value: list[WeightedBlock]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_leaf_blocks", value) + + @property + def canopy_height(self) -> int: + return getattr(self, "_canopy_height") + + @canopy_height.setter + def canopy_height(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_canopy_height", value) + + @property + def canopy_radius(self) -> int: + return getattr(self, "_canopy_radius") + + @canopy_radius.setter + def canopy_radius(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_canopy_radius", value) + + @property + def leaf_placement_attempts(self) -> int: + return getattr(self, "_leaf_placement_attempts") + + @leaf_placement_attempts.setter + def leaf_placement_attempts(self, value: int): + if value is None: + return + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_leaf_placement_attempts", value) + + @staticmethod + def from_dict(data: dict) -> Self: + leaf_blocks = [WeightedBlock.from_dict(x) for x in data.pop("leaf_blocks")] + canopy_height = data.pop("canopy_height") + canopy_radius = data.pop("canopy_radius") + leaf_placement_attemps = ( + data.pop("leaf_placement_attemps") + if "leaf_placement_attemps" in data + else None + ) + return RandomSpreadCanopy( + canopy_height, canopy_radius, leaf_placement_attemps, leaf_blocks + ) + + def jsonify(self) -> dict: + data = { + "leaf_blocks": [x.jsonify() for x in self.leaf_blocks], + "canopy_height": self.canopy_height, + "canopy_radius": self.canopy_radius, + "leaf_placement_attemps": self.leaf_placement_attemps, + } + return data + + # LEAF BLOCK + def get_leaf(self, index: int) -> WeightedBlock: + return self.leaf_blocks[index] + + def add_leaf(self, block: WeightedBlock) -> WeightedBlock: + self.leaf_blocks.append(block) + return block + + def remove_leaf(self, index: int) -> WeightedBlock: + return self.leaf_blocks.pop(index) + + def clear_leaves(self) -> Self: + return self + + +@tree_root +class MangroveRoots(RootType): + id = Identifier("mangrove_roots") + + def __init__( + self, + root_block: BlockState, + max_root_width: int, + max_root_length: int, + above_root: AboveRoot, + muddy_root_block: BlockState, + mud_block: BlockState, + y_offset: int, + roots_may_grow_through: list[Identifiable], + root_decoration: Decoration, + ): + RootType.__init__(self) + self.root_block = root_block + self.max_root_width = max_root_width + self.max_root_length = max_root_length + self.above_root = above_root + self.muddy_root_block = muddy_root_block + self.mud_block = mud_block + self.y_offset = y_offset + self.roots_may_grow_through = roots_may_grow_through + self.root_decoration = root_decoration + + @property + def root_block(self) -> BlockState: + return getattr(self, "_root_block") + + @root_block.setter + def root_block(self, value: BlockState): + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_root_block", value) + + @property + def max_root_width(self) -> int: + return getattr(self, "_max_root_width") + + @max_root_width.setter + def max_root_width(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_max_root_width", value) + + @property + def max_root_length(self) -> int: + return getattr(self, "_max_root_length") + + @max_root_length.setter + def max_root_length(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_max_root_length", value) + + @property + def above_root(self) -> AboveRoot: + return getattr(self, "_above_root") + + @above_root.setter + def above_root(self, value: AboveRoot): + if not isinstance(value, AboveRoot): + raise TypeError( + f"Expected AboveRoot but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_above_root", value) + + @property + def muddy_mangrove_roots(self) -> BlockState: + return getattr(self, "_muddy_mangrove_roots") + + @muddy_mangrove_roots.setter + def muddy_mangrove_roots(self, value: BlockState): + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_muddy_mangrove_roots", value) + + @property + def mud_block(self) -> BlockState: + return getattr(self, "_mud_block") + + @mud_block.setter + def mud_block(self, value: BlockState): + if not isinstance(value, BlockState): + raise TypeError( + f"Expected BlockState but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_mud_block", value) + + @property + def y_offset(self) -> int | Range: + return getattr(self, "_y_offset") + + @y_offset.setter + def y_offset(self, value: int | Range): + if not isinstance(value, (int, Range)): + raise TypeError( + f"Expected int, Range but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_y_offset", value) + + @property + def roots_may_grow_through(self) -> list[BlockState]: + return getattr(self, "_roots_may_grow_through") + + @roots_may_grow_through.setter + def roots_may_grow_through(self, value: list[BlockState]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_roots_may_grow_through", [BlockState.of(x) for x in value]) + + @property + def root_decoration(self) -> Decoration: + return getattr(self, "_root_decoration", None) + + @root_decoration.setter + def root_decoration(self, value: Decoration): + if value is None: + return + if not isinstance(value, Decoration): + raise TypeError( + f"Expected Decoration but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_root_decoration", value) + + @staticmethod + def from_dict(data: dict) -> Self: + root_block = BlockState.from_dict(data.pop("root_block")) + max_root_width = data.pop("max_root_width") + max_root_length = data.pop("max_root_length") + above_root = AboveRoot.from_dict(data.pop("above_root")) + muddy_root_block = BlockState.from_dict(data.pop("muddy_root_block")) + mud_block = BlockState.from_dict(data.pop("mud_block")) + y_offset = Range.from_dict(data.pop("y_offset"), "range_") + roots_may_grow_through = [ + BlockState.from_dict(x) for x in data.pop("roots_may_grow_through") + ] + root_decoration = ( + Decoration.from_dict(data.pop("root_decoration")) + if "root_decoration" in data + else None + ) + return MangroveRoots( + root_block, + max_root_width, + max_root_length, + above_root, + muddy_root_block, + mud_block, + y_offset, + roots_may_grow_through, + root_decoration, + ) + + def jsonify(self) -> dict: + data = { + "root_block": self.root_block.jsonify(), + "max_root_width": self.max_root_width, + "max_root_length": self.max_root_length, + "above_root": self.above_root.jsonify(), + "muddy_root_block": self.muddy_root_block.jsonify(), + "mud_block": self.mud_block.jsonify(), + "y_offset": ( + self.y_offset.jsonify("range_") + if isinstance(self.y_offset, Range) + else self.y_offset + ), + "roots_may_grow_through": [ + x.jsonify() for x in self.roots_may_grow_through + ], + } + if self.root_decoration: + data["root_decoration"] = (self.root_decoration.jsonify(),) + return data + + +@feature_type +@behavior_pack +class TreeFeature(Feature): + """ + Represents a data-driven [Tree Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Atree_feature). + """ + + id = Identifier("tree_feature") + FILEPATH = "features/tree_feature.json" + + def __init__( + self, + identifier: Identifiable, + trunk: Trunk = None, + canopy: Canopy = None, + root: RootType = None, + base_cluster: Cluster = None, + base_block: list[Identifiable] = [], + may_grow_on: list[BlockPredicate] = [], + may_replace: list[BlockPredicate] = [], + may_grow_through: list[BlockPredicate] = [], + ): + Feature.__init__(self, identifier) + self.base_block = base_block + self.base_cluster = base_cluster + self.may_grow_on = may_grow_on + self.may_replace = may_replace + self.may_grow_through = may_grow_through + self.trunk = trunk + self.canopy = canopy + self.root = root + + @property + def base_block(self) -> list[BlockState]: + return getattr(self, "_base_block") + + @base_block.setter + def base_block(self, value: list[BlockState]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_base_block", [BlockState.of(x) for x in value]) + + @property + def base_cluster(self) -> Cluster: + return getattr(self, "_base_cluster", None) + + @base_cluster.setter + def base_cluster(self, value: Cluster): + if value is None: + return + if not isinstance(value, Cluster): + raise TypeError( + f"Expected Cluster but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_base_cluster", value) + + @property + def may_grow_on(self) -> list[BlockPredicate]: + return getattr2(self, "_may_grow_on", []) + + @may_grow_on.setter + def may_grow_on(self, value: list[BlockPredicate]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_may_grow_on", [BlockPredicate.of(x) for x in value]) + + @property + def may_replace(self) -> list[BlockPredicate]: + return getattr2(self, "_may_replace", []) + + @may_replace.setter + def may_replace(self, value: list[BlockPredicate]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_may_replace", [BlockPredicate.of(x) for x in value]) + + @property + def may_grow_through(self) -> list[BlockPredicate]: + return getattr2(self, "_may_grow_through", []) + + @may_grow_through.setter + def may_grow_through(self, value: list[BlockPredicate]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_may_grow_through", [BlockPredicate.of(x) for x in value]) + + @property + def trunk(self) -> TrunkType: + return getattr(self, "_trunk") + + @trunk.setter + def trunk(self, value: TrunkType): + if value is None: + return + if not isinstance(value, TrunkType): + raise TypeError( + f"Expected TrunkType but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trunk", value) + + @property + def canopy(self) -> CanopyType: + return getattr(self, "_canopy", None) + + @canopy.setter + def canopy(self, value: CanopyType): + if value is None: + return + if not isinstance(value, CanopyType): + raise TypeError( + f"Expected CanopyType but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_canopy", value) + + @property + def root(self) -> RootType: + return getattr(self, "_root", None) + + @root.setter + def root(self, value: RootType): + if value is None: + return + if not isinstance(value, RootType): + raise TypeError( + f"Expected RootType but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_root", value) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = TreeFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["base_block"] = [x.jsonify() for x in self.base_block] + data[str(self.id)]["may_grow_on"] = [x.jsonify() for x in self.may_grow_on] + data[str(self.id)]["may_replace"] = [x.jsonify() for x in self.may_replace] + data[str(self.id)]["may_grow_through"] = [ + x.jsonify() for x in self.may_grow_through + ] + if self.base_cluster: + data[str(self.id)]["base_cluster"] = self.base_cluster.jsonify() + + if self.trunk: + data[str(self.id)][self.trunk.id.path] = self.trunk.jsonify() + + if self.canopy: + data[str(self.id)][self.canopy.id.path] = self.canopy.jsonify() + + if self.root: + data[str(self.id)][self.root.id.path] = self.root.jsonify() + return data + + # BASE BLOCK + def get_base_block(self, index: int) -> BlockState: + return self.base_block[index] + + def add_base_block(self, block: BlockState) -> BlockState: + b = BlockState.of(block) + self.base_block.append(b) + return b + + def remove_base_block(self, index: int) -> BlockState: + return self.base_block.pop(index) + + def clear_base_blocks(self) -> Self: + self.base_block.clear() + return self + + # MAY GROW ON + + def get_grow_on(self, index: int) -> BlockState: + return self.may_grow_on[index] + + def add_grow_on(self, block: BlockState) -> BlockState: + b = BlockState.of(block) + self.may_grow_on.append(b) + return b + + def remove_grow_on(self, index: int) -> BlockState: + return self.may_grow_on.pop(index) + + def clear_grow_on(self) -> Self: + self.may_grow_on.clear() + return self + + # MAY REPLACE + + def get_replace(self, index: int) -> BlockState: + return self.may_replace[index] + + def add_replace(self, block: BlockState) -> BlockState: + b = BlockState.of(block) + self.may_replace.append(b) + return b + + def remove_replace(self, index: int) -> BlockState: + return self.may_replace.pop(index) + + def clear_replace(self) -> Self: + self.may_replace.clear() + return self + + # MAY GROW THROUGH + + def get_grow_through(self, index: int) -> BlockState: + return self.may_grow_through[index] + + def add_grow_through(self, block: BlockState) -> BlockState: + b = BlockState.of(block) + self.may_grow_through.append(b) + return b + + def remove_grow_through(self, index: int) -> BlockState: + return self.may_grow_through.pop(index) + + def clear_grow_through(self) -> Self: + self.may_grow_through.clear() + return self + + +class TreeFeatureLoader(Loader): + name = "Tree Feature" + + def __init__(self): + from .schemas import TreeSchem1 + + Loader.__init__(self, TreeFeature) + self.add_schema(TreeSchem1, "1.13.0") + self.add_schema(TreeSchem1, "1.16.0") + + +@feature_type +@behavior_pack +class VegetationPatchFeature(Feature): + """ + Represents a data-driven [Vegetation Patch Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Avegetation_patch_feature). + """ + + id = Identifier("vegetation_patch_feature") + FILEPATH = "features/vegetation_patch_feature.json" + + def __init__( + self, + identifier: Identifiable, + ground_block: BlockState, + vegetation_feature: Identifiable, + surface: str, + depth: Range, + vertical_range: int, + vegetation_chance: float, + horizontal_radius: Range, + extra_deep_block_chance: float, + extra_edge_column_chance: float, + waterlogged: bool, + replaceable_blocks: list[BlockState] = [], + ): + Feature.__init__(self, identifier) + self.replaceable_blocks = replaceable_blocks + self.ground_block = ground_block + self.vegetation_feature = vegetation_feature + self.surface = surface + self.depth = depth + self.vertical_range = vertical_range + self.vegetation_chance = vegetation_chance + self.horizontal_radius = horizontal_radius + self.extra_deep_block_chance = extra_deep_block_chance + self.extra_deep_column_chance = extra_edge_column_chance + self.waterlogged = waterlogged + + @property + def waterlogged(self) -> bool: + return getattr(self, "_waterlogged") + + @waterlogged.setter + def waterlogged(self, value: bool): + if not isinstance(value, bool): + raise TypeError( + f"Expected bool but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_waterlogged", value) + + @property + def extra_deep_column_chance(self) -> float: + return getattr(self, "_extra_deep_column_chance") + + @extra_deep_column_chance.setter + def extra_deep_column_chance(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_extra_deep_column_chance", float(value)) + + @property + def extra_deep_block_chance(self) -> float: + return getattr(self, "_extra_deep_block_chance", None) + + @extra_deep_block_chance.setter + def extra_deep_block_chance(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_extra_deep_block_chance", float(value)) + + @property + def horizontal_radius(self) -> Range: + return getattr(self, "_horizontal_radius") + + @horizontal_radius.setter + def horizontal_radius(self, value: Range): + if not isinstance(value, Range): + raise TypeError( + f"Expected Range but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_horizontal_radius", value) + + @property + def vegetation_feature(self) -> Identifier: + return getattr(self, "_vegetation_feature") + + @vegetation_feature.setter + def vegetation_feature(self, value: Identifiable): + setattr(self, "_vegetation_feature", Identifiable.of(value)) + + @property + def depth(self) -> Range | int: + return getattr(self, "_depth") + + @depth.setter + def depth(self, value: Range | int): + if not isinstance(value, (Range, int)): + raise TypeError( + f"Expected Range, int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_depth", value) + + @property + def vertical_range(self) -> int: + return getattr(self, "_vertical_range") + + @vertical_range.setter + def vertical_range(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_vertical_range", value) + + @property + def surface(self) -> str: + return getattr(self, "_surface") + + @surface.setter + def surface(self, value: str): + setattr(self, "_surface", str(value)) + + @property + def replaceable_blocks(self) -> list[BlockState]: + return getattr(self, "_replaceable_blocks") + + @replaceable_blocks.setter + def replaceable_blocks(self, value: list[BlockState]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_replaceable_blocks", [BlockState.of(x) for x in value]) + + @property + def vegetation_chance(self) -> float: + return getattr(self, "_vegetation_chance") + + @vegetation_chance.setter + def vegetation_chance(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_vegetation_chance", float(value)) + + @property + def ground_block(self) -> BlockState: + return getattr(self, "_ground_block") + + @ground_block.setter + def ground_block(self, value: BlockState): + setattr(self, "_ground_block", BlockState.of(value)) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = VegetationPatchFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["replaceable_blocks"] = [ + x.jsonify() for x in self.replaceable_blocks + ] + data[str(self.id)]["ground_block"] = self.ground_block.jsonify() + data[str(self.id)]["vegetation_feature"] = str(self.vegetation_feature) + data[str(self.id)]["surface"] = self.surface + data[str(self.id)]["depth"] = ( + self.depth.jsonify("range_") + if isinstance(self.depth, Range) + else self.depth + ) + data[str(self.id)]["vertical_range"] = self.vertical_range + data[str(self.id)]["vegetation_chance"] = self.vegetation_chance + data[str(self.id)]["horizontal_radius"] = self.horizontal_radius.jsonify( + "range_" + ) + if self.extra_deep_block_chance: + data[str(self.id)]["extra_deep_block_chance"] = self.extra_deep_block_chance + data[str(self.id)]["extra_deep_column_chance"] = self.extra_deep_column_chance + return data + + def get_replace(self, index: int) -> BlockState: + return self.replaceable_blocks[index] + + def add_replace(self, block: BlockState) -> BlockState: + b = BlockState.of(block) + self.replaceable_blocks.append(b) + return b + + def remove_replace(self, index: int) -> BlockState: + return self.replaceable_blocks.pop(index) + + def clear_replaces(self) -> Self: + self.replaceable_blocks.clear() + return self + + +class VegetationPatchFeatureLoader(Loader): + name = "Vegetation Patch Feature" + + def __init__(self): + from .schemas import VegetationPatchSchem1 + + Loader.__init__(self, VegetationPatchFeature) + self.add_schema(VegetationPatchSchem1, "1.13.0") + self.add_schema(VegetationPatchSchem1, "1.16.0") + + +class WeightedFeature: + def __init__(self, feature: Identifiable, weight: int): + self.feature = feature + self.weight = weight + + @staticmethod + def from_dict(data: list) -> Self: + return WeightedFeature(*data) + + def jsonify(self) -> list: + data = [self.feature, self.weight] + return data + + +@feature_type +@behavior_pack +class WeightedRandomFeature(Feature): + """ + Represents a data-driven [Weighted Random Feature](https://bedrock.dev/docs/stable/Features#minecraft%3Aweighted_random_feature). + """ + + id = Identifier("weighted_random_feature") + FILEPATH = "features/weighted_random_feature.json" + + def __init__(self, identifier: Identifiable, features: list[WeightedFeature] = []): + Feature.__init__(self, identifier) + self.features = features + + @property + def features(self) -> list[WeightedFeature]: + return getattr(self, "_features") + + @features.setter + def features(self, value: list[WeightedFeature]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_features", value) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = WeightedRandomFeatureLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["features"] = [x.jsonify() for x in self.features] + return data + + def get_feature(self, index: int) -> WeightedFeature: + return self.features[index] + + def add_feature(self, feature: WeightedFeature) -> WeightedFeature: + if not isinstance(feature, WeightedFeature): + raise TypeError( + f"Expected WeightedFeature but got '{feature.__class__.__name__}' instead" + ) + self.features.append(feature) + return feature + + def remove_feature(self, index: int) -> WeightedFeature: + return self.features.pop(index) + + def clear_festures(self) -> Self: + self.features.clear() + return self + + +class WeightedRandomFeatureLoader(Loader): + name = "Weighted Random Feature" + + def __init__(self): + from .schemas import WeightedRandomSchem1 + + Loader.__init__(self, WeightedRandomFeature) + self.add_schema(WeightedRandomSchem1, "1.13.0") + self.add_schema(WeightedRandomSchem1, "1.16.0") diff --git a/mcaddon/feature_rule.py b/mcaddon/feature_rule.py new file mode 100644 index 0000000..95682cd --- /dev/null +++ b/mcaddon/feature_rule.py @@ -0,0 +1,245 @@ +# TODO: https://bedrock.dev/docs/stable/Features#Feature%20rule%20schema +from typing import Self +from molang import Molang + +from . import VERSION +from .feature import DistributionProvider +from .predicate import Filters +from .pack import behavior_pack +from .util import Misc, Identifier, Identifiable +from .file import JsonFile, Loader + + +class Distribution: + id = Identifier("scatter_feature") + FILEPATH = "features/scatter_feature.json" + + def __init__( + self, + iterations: Molang, + x: DistributionProvider | int, + y: DistributionProvider | int, + z: DistributionProvider | int, + scatter_chance: float = None, + ): + self.iterations = iterations + self.x = x + self.y = y + self.z = z + self.scatter_chance = scatter_chance + + @property + def z(self) -> DistributionProvider | int: + return getattr(self, "_z") + + @z.setter + def z(self, value: DistributionProvider | int): + if not isinstance(value, (DistributionProvider, int)): + raise TypeError( + f"Expected DistributionProvider, int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_z", value) + + @property + def y(self) -> DistributionProvider | int: + return getattr(self, "_y") + + @y.setter + def y(self, value: DistributionProvider | int): + if not isinstance(value, (DistributionProvider, int)): + raise TypeError( + f"Expected DistributionProvider, int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_y", value) + + @property + def x(self) -> DistributionProvider | int: + return getattr(self, "_x") + + @x.setter + def x(self, value: DistributionProvider | int): + if not isinstance(value, (DistributionProvider, int)): + raise TypeError( + f"Expected DistributionProvider, int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_x", value) + + @property + def iterations(self) -> int: + return getattr(self, "_iterations") + + @iterations.setter + def iterations(self, value: Molang): + if not isinstance(value, (Molang, int)): + raise TypeError( + f"Expected Molang, int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_iterations", Molang(value)) + + @property + def scatter_chance(self) -> float: + return getattr(self, "_scatter_chance", None) + + @scatter_chance.setter + def scatter_chance(self, value: float): + if value is None: + return + if not isinstance(value, float): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_scatter_chance", value) + + @staticmethod + def from_dict(data: dict) -> Self: + scatter_chance = ( + data.pop("scatter_chance") if "scatter_chance" in data else None + ) + iterations = data.pop("iterations") + x = DistributionProvider.from_dict(data.pop("x")) + y = DistributionProvider.from_dict(data.pop("y")) + z = DistributionProvider.from_dict(data.pop("z")) + return Distribution(iterations, x, y, z, scatter_chance) + + def jsonify(self) -> dict: + data = {"iterations": self.iterations} + if self.scatter_chance: + data["scatter_chance"] = self.scatter_chance + data["x"] = ( + self.x.jsonify() if isinstance(self.x, DistributionProvider) else self.x + ) + data["y"] = ( + self.y.jsonify() if isinstance(self.y, DistributionProvider) else self.y + ) + data["z"] = ( + self.z.jsonify() if isinstance(self.z, DistributionProvider) else self.z + ) + return data + + +class FeatureRuleCondition(Misc): + def __init__(self, placement_pass: str, biome_filter: Filters): + self.placement_pass = placement_pass + self.biome_filter = biome_filter + + @property + def placement_pass(self) -> str: + return getattr(self, "_placement_pass") + + @placement_pass.setter + def placement_pass(self, value: str): + setattr(self, "_placement_pass", str(value)) + + @property + def biome_filter(self) -> Filters: + return getattr(self, "_biome_filter") + + @biome_filter.setter + def biome_filter(self, value: Filters): + if not isinstance(value, Filters): + raise TypeError( + f"Expected Filters but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_biome_filter", value) + + @staticmethod + def from_dict(data: dict) -> Self: + placement_pass = data.pop("placement_pass") + biome_filter = Filters.from_dict(data.pop("minecraft:biome_filter")) + return FeatureRuleCondition(placement_pass, biome_filter) + + def jsonify(self) -> dict: + data = { + "placement_pass": self.placement_pass, + "minecraft:biome_filter": self.biome_filter.jsonify(), + } + return data + + +@behavior_pack +class FeatureRule(JsonFile, Identifiable): + id = Identifier("feature_rules") + FILEPATH = "feature_rules/feature_rule.json" + + def __init__( + self, + identifier: Identifiable, + places_feature: Identifiable, + conditions: FeatureRuleCondition, + distribution: Distribution, + ): + Identifiable.__init__(self, identifier) + self.places_feature = places_feature + self.conditions = conditions + self.distribution = distribution + + def __str__(self) -> str: + return "FeatureRule{" + str(self.identifier) + "}" + + @property + def places_feature(self) -> Identifier: + return getattr(self, "_places_feature") + + @places_feature.setter + def places_feature(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("places_feature", id) + setattr(self, "_places_feature", id) + + @property + def conditions(self) -> FeatureRuleCondition: + return getattr(self, "_conditions") + + @conditions.setter + def conditions(self, value: FeatureRuleCondition): + if not isinstance(value, FeatureRuleCondition): + raise TypeError( + f"Expected FeatureRuleCondition but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_conditions", value) + + @property + def distribution(self) -> Distribution: + return getattr(self, "_distribution") + + @distribution.setter + def distribution(self, value: Distribution): + if not isinstance(value, Distribution): + raise TypeError( + f"Expected Distribution but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_distribution", value) + + def jsonify(self) -> dict: + feature_rule = { + "conditions": self.conditions.jsonify(), + "distribution": self.distribution.jsonify(), + } + data = { + "format_version": VERSION["FEATURE_RULE"], + str(self.id): { + "description": { + "identifier": str(self.identifier), + "places_feature": str(self.places_feature), + } + }, + } + for k, v in feature_rule.items(): + data[str(self.id)][k] = v + return data + + @classmethod + def from_dict(cls, data: dict) -> Self: + loader = FeatureRuleLoader() + loader.validate(data) + return loader.load(data) + + +class FeatureRuleLoader(Loader): + name = "Feature Rule" + + def __init__(self): + from .schemas import FeatureRuleSchem1 + + Loader.__init__(self, FeatureRule) + self.add_schema(FeatureRuleSchem1, "1.12") diff --git a/mcaddon/file.py b/mcaddon/file.py index c54f46b..ab0ec88 100644 --- a/mcaddon/file.py +++ b/mcaddon/file.py @@ -1,6 +1,5 @@ from typing import Self from io import TextIOWrapper, BytesIO -from zipfile import ZipFile from PIL import Image, ImageFile from dataclasses import dataclass import os @@ -8,11 +7,13 @@ import commentjson import tempfile import jsonschema +import zipfile +import tarfile from . import APPDATA_PATH, EDU_APPDATA_PATH, PRE_APPDATA_PATH -from .exception import MinecraftNotFoundError, SchemaNotFoundError +from .exception import MinecraftNotFoundError, SchemaNotFoundError, SyntaxError from .constant import Edition -from .util import getattr2 +from .util import getattr2, splitpath, modpath, Misc, Identifiable, Identifier class Schema: @@ -23,6 +24,7 @@ def __init__(self, schemafile: str, version: str = None): @property def schemafile(self) -> str: + """The filepath to this JSON schema.""" return getattr(self, "_schemafile") @schemafile.setter @@ -31,6 +33,7 @@ def schemafile(self, value: str): @property def version(self) -> str | int: + """The version to match.""" return getattr(self, "_version") @version.setter @@ -38,6 +41,7 @@ def version(self, value: str | int): setattr(self, "_version", value) def schema(self) -> dict: + """Get the JSON schema file and cache for future use.""" if self.cache is None: path = ( self.schemafile @@ -60,6 +64,7 @@ def __init__(self, cls, key: str = "format_version"): @property def schemas(self) -> list[Schema]: + """All schemas registered to this loader.""" return getattr2(self, "_schemas", []) @schemas.setter @@ -72,6 +77,7 @@ def schemas(self, value: list[Schema]): @property def key(self) -> str: + """The root key required for this object.""" return getattr(self, "_key") @key.setter @@ -80,6 +86,7 @@ def key(self, value: str): @property def name(self) -> str: + """The display name of this loader for errors.""" return getattr(self, "_name", "untitled") @name.setter @@ -115,6 +122,7 @@ def add_schema(self, schema: Schema, version: str | int = None): self.schemas.append(schem) def clear_schemas(self): + """Remove all schemas""" self.schemas = [] def validate(self, data: dict, errors: bool = True) -> bool: @@ -126,18 +134,19 @@ def validate(self, data: dict, errors: bool = True) -> bool: :param errors: If true it will raise errors if invalid, defaults to True :type errors: bool, optional """ - if self.key in data: - version = data.get(self.key) + obj = data.copy() + if self.key in obj: + version = obj.get(self.key) s = self.get_schema(version) if s is not None: schema = s.schema() try: # resolver = jsonschema.RefResolver(base_uri='file://'+os.path.dirname(__file__), store={}) - jsonschema.validate(data, schema) + jsonschema.validate(obj, schema) return True except jsonschema.ValidationError as err: if errors: - raise SyntaxError(self.name, err.message) + raise SyntaxError(self.name, err.message, s.schemafile) return False if errors: raise SchemaNotFoundError(self.name, version) @@ -163,11 +172,13 @@ def load(self, data: dict, errors: bool = True): class Importable: - def import_to(self, edition: Edition = Edition.bedrock, dev: bool = True) -> str: + def import_to( + self, name: str = None, edition: Edition = Edition.BEDROCK, dev: bool = True + ) -> str: """ Saves this addon/pack to the correct Minecraft folders. - :param edition: The Minecraft edition to import to, defaults to Edition.bedrock + :param edition: The Minecraft edition to import to, defaults to Edition.BEDROCK :type edition: Edition, optional :param dev: When True it will place this addon/pack in the development packs folders, defaults to True :type dev: bool, optional @@ -177,14 +188,16 @@ def import_to(self, edition: Edition = Edition.bedrock, dev: bool = True) -> str # Bulid addon path = None match edition: - case Edition.bedrock: + case Edition.BEDROCK: path = APPDATA_PATH - case Edition.preview: + case Edition.PREVIEW: path = PRE_APPDATA_PATH - case Edition.education: + case Edition.EDUCATION: path = EDU_APPDATA_PATH if path is None: raise NotImplementedError("This platform is not supported") + if name is not None: + self.filename = name if not os.path.isdir(path): raise MinecraftNotFoundError(edition) @@ -203,10 +216,8 @@ def startfile(self) -> str: return tf.name -class File: - """ - Represents a File. - """ +class File(Misc): + """Represents a File.""" def __enter__(self) -> Self: return self @@ -214,78 +225,117 @@ def __enter__(self) -> Self: def __exit__(self, exception_type, exception_value, exception_traceback) -> Self: self.save() + @property + def fp(self) -> str: + """This objects path on disk""" + return getattr(self, "_fp", self.FILEPATH) + + @fp.setter + def fp(self, value: str): + setattr(self, "_fp", os.path.join(value)) + @property def extension(self) -> str: - return getattr(self, "_extension", self.EXTENSION) + """This objects extension from fp""" + return splitpath(self.fp)[2] @extension.setter def extension(self, value: str): - if value is None: - delattr(self, "_extension") - return - setattr(self, "_extension", str(value)) + self.fp = modpath(self.fp, "e", value) @property def filename(self) -> str: - return getattr(self, "_filename", self.FILENAME) + """This objects name from fp""" + return splitpath(self.fp)[1] @filename.setter def filename(self, value: str): - if value is None: - delattr(self, "_filename") - return - setattr(self, "_filename", str(value)) + self.fp = modpath(self.fp, "f", value) @property def dirname(self) -> str: - return getattr(self, "_dirname", self.DIRNAME) + """This objects directory from fp""" + return splitpath(self.fp)[0] @dirname.setter def dirname(self, value: str): - if value is None: - delattr(self, "_dirname") - return - setattr(self, "_dirname", str(value)) + self.fp = modpath(self.fp, "d", value) @classmethod def from_fileobj(cls, fileobj: TextIOWrapper, args: dict[str, str]) -> Self: raise NotImplementedError() @classmethod - def load(cls, filename: str, args={}): - with open(filename, "r") as fileobj: - self = cls.from_fileobj(fileobj, args) - return self + def open(cls, file: str, start: str = None): + """ + Open a FILE to load - def has_filename(self) -> bool: - return hasattr(self, "_filename") + :param file: The path to a DIRECTORY or ARCHIVE FILE to open + :type file: str + """ + with open(file, "r") as fd: + obj = cls.load(fd) + obj.filename = os.path.basename(file) + dirname = os.path.dirname(os.path.relpath(file, start)) + if dirname is not None and dirname != "" and dirname != " ": + obj.dirname = os.path.join(obj.dirname, dirname) + return obj - def write(self, fileobj: TextIOWrapper, **kw) -> Self: + @classmethod + def loads(cls, s: str) -> Self: raise NotImplementedError() - def save(self, filename: str = None, **kw) -> Self: - if filename is None: - filename = self.filename - if filename is None: + @classmethod + def load(cls, fileobj: TextIOWrapper) -> Self: + """ + Deserialize fp (a .read()-supporting file-like object) to a Python object. + """ + return cls.loads(fileobj.read()) + + def dump(self, fileobj: TextIOWrapper): + """ + Serialize obj as a formatted stream to fp (a .write()-supporting file-like object). + """ + fileobj.write(bytes(self.dumps(), "utf-8")) + + def dumps(self) -> str: + raise NotImplementedError() + + def save(self, fp: str = None, overwrite: bool = True, **kw) -> Self: + """ + Save this object to disk. + + :param fp: The filepath to save, defaults to None + :type fp: str, optional + :param overwrite: When true it will override the previus written file. When false it will not override the file, defaults to True + :type overwrite: bool, optional + """ + fp = self.filename if fp is None else fp + if fp is None: raise ValueError("No filename specified") # add extension if missing - name, ext = os.path.splitext(filename) + name, ext = os.path.splitext(fp) if name.endswith("/") or name.endswith("\\"): - filename += self.FILENAME + self.extension + fp += self.filename + self.extension elif ext == "": - filename += self.extension + fp += self.extension - dir = os.path.dirname(filename) + dir = os.path.dirname(fp) if dir != "": os.makedirs(dir, exist_ok=True) - with open(str(filename), "w") as fd: - self.write(fd, **kw) - return self + with open(str(fp), "wb") as fd: + return self.dump(fd) + + def valid(self, fp: str) -> bool: + return True def getvalue(self) -> bytes: + """ + :rtype: bytes + """ with BytesIO() as io: - self.write(io) + self.dump(io) return io.getvalue() @@ -295,6 +345,43 @@ class JsonFile(File): Represents a JSON File. """ + def __eq__(self, other) -> bool: + # if isinstance(other, JsonFile): Super Slow + # return self.jsonify() == other.jsonify() + if isinstance(self, Identifiable) and isinstance( + other, (str, Identifier, Identifiable) + ): + return self.identifier == Identifiable.of(other) + return False + + def __len__(self) -> int: + return len(self.__dict__) + + def __contains__(self, item) -> bool: + if hasattr(self, item): + value = getattr(self, item) + if isinstance(value, (dict, list, set)): + return True if value else False + return value is not None + return False + + # TODO: Handle nested values. ex: 'main.nested' == {main: {nested: 5}}} + def __setitem__(self, name: str, value) -> None: + setattr(self, name, value) + + def __getitem__(self, name: str): + return getattr(self, name) + + def __delitem__(self, name: str) -> None: + delattr(self, name) + + def __getstate__(self): + state = self.__dict__.copy() + return state + + def __setstate__(self, state): + self.__dict__.update(state) + @classmethod def from_dict(cls, data: dict) -> Self: """ @@ -306,42 +393,58 @@ def from_dict(cls, data: dict) -> Self: raise NotImplementedError() @classmethod - def from_fileobj(cls, fileobj: TextIOWrapper, args: dict[str, str] = {}) -> Self: - """ - Load object from FILEOBJ + def jsonfile(cls, fp: str) -> dict: + """Opens fp and returns the result as JSON""" + with open(fp, "r") as fd: + return commentjson.load(fd) - :param fileobj: The file to load - :type fileobj: TextIOWrapper - :param args: The arguments to pass to chevron to render - :type args: dict[str, str] - :rtype: JsonFile - """ - text = chevron.render(fileobj, args, warn=True) + @classmethod + def load(cls, fileobj: TextIOWrapper, args: dict[str, str] = {}) -> Self: + """Deserialize fp (a .read()-supporting file-like object containing a JSON document) to a Python object.""" + text = chevron.render(fileobj.read(), args, warn=True) self = cls.from_dict(commentjson.loads(text)) self.filename = getattr(fileobj, "name", None) return self - def json(self, **kw) -> str: + @classmethod + def loads(cls, s: str, args: dict[str, str] = {}) -> Self: + """Deserialize s (a str, bytes or bytearray instance containing a JSON document) to a Python object.""" + text = chevron.render(s, args, warn=True) + self = cls.from_dict(commentjson.loads(text)) + return self + + def dumps(self, indent: int = 2, **kw) -> str: + """Serialize obj to a JSON formatted str.""" + return commentjson.dumps(self.jsonify(), indent=indent, **kw) + + def valid(self, fp: str) -> bool: """ - Convert object to a string in JSON format + Whether or not this is a valid object - :return: Stringified JSON - :rtype: str + :param fp: The FILE to validate + :type fp: str + :rtype: bool """ - return commentjson.dumps(self.__dict__, **kw) + data = self.jsonfile(fp) + return str(self.id) in data - def write(self, fileobj: TextIOWrapper, indent: int = 2, **kw) -> int: + def copy(self) -> Self: + return self.from_dict(self.jsonify()) + + def generate(self, ctx) -> None: """ - Write FILEOBJ as JSON + Called when this object is added to BehaviorPack or ResourcePack - :param fileobj: The file to write to - :type fileobj: TextIOWrapper - :param indent: The indentation for the JSON, defaults to 2 - :type indent: int, optional - :return: _description_ - :rtype: int + :type ctx: BehaviorPack | ResourcePack """ - return fileobj.write(self.json(indent=indent, **kw)) + ... + + @staticmethod + def from_dict(data: dict) -> Self: + raise NotImplementedError() + + def jsonify(self) -> dict: + raise NotImplementedError() @dataclass(repr=False) @@ -363,21 +466,11 @@ def write(self, fileobj: TextIOWrapper, indent: int = 2, **kw) -> int: return fileobj.write(self.json(indent=indent, **kw)) -class ArchiveFile: +class ArchiveFile(Misc): """ Represents an Archive File. """ - @classmethod - def load(cls, filename: str = None) -> Self: - self = cls.__new__(cls) - if filename is not None: - self.filename = filename - if filename.startswith(".zip"): - with ZipFile(filename) as zip: - return cls.readzip(zip) - return cls.readdir(filename) - def __enter__(self) -> Self: return self @@ -385,85 +478,135 @@ def __exit__(self, exception_type, exception_value, exception_traceback) -> Self self.save(zipped=False, overwrite=True) return self + @property + def fp(self) -> str: + """This objects path on disk""" + return getattr(self, "_fp", self.FILEPATH) + + @fp.setter + def fp(self, value: str): + setattr(self, "_fp", os.path.join(value)) + @property def extension(self) -> str: - return getattr(self, "_extension", self.EXTENSION) + """This objects extension from fp""" + return splitpath(self.fp)[2] @extension.setter def extension(self, value: str): - if value is None: - delattr(self, "_extension") - return - setattr(self, "_extension", str(value)) + self.fp = modpath(self.fp, "e", value) @property def filename(self) -> str: - return getattr(self, "_filename", self.FILENAME) + """This objects name from fp""" + return splitpath(self.fp)[1] @filename.setter def filename(self, value: str): - if value is None: - delattr(self, "_filename") - return - setattr(self, "_filename", os.path.realpath(value)) + self.fp = modpath(self.fp, "f", value) + + @property + def dirname(self) -> str: + """This objects directory from fp""" + return splitpath(self.fp)[0] + + @dirname.setter + def dirname(self, value: str): + self.fp = modpath(self.fp, "d", value) + + # new @classmethod - def readzip(cls, zip: ZipFile) -> Self: + def open(cls, file: str, *args, **kw) -> Self: + """ + Open a ZIP, TAR, or DIRECTORY to load + + :param file: The path to a DIRECTORY or ARCHIVE FILE to open + :type file: str + """ + try: + if zipfile.is_zipfile(file): + with zipfile.ZipFile(file, "r") as fd: + obj = cls.load_archive(fd, *args, **kw) + elif tarfile.is_tarfile(file): + with tarfile.open(file, "r") as tf: + obj = cls.load_archive(tf, *args, **kw) + + obj.dirname = os.path.dirname(file) + obj.filename, ext = os.path.splitext(os.path.basename(file)) + return obj + except PermissionError: + obj = cls.load_directory(file, *args, **kw) + obj.dirname = os.path.dirname(file) + obj.filename, ext = os.path.splitext(os.path.basename(file)) + return obj + + @classmethod + def load_archive(cls, fileobj: zipfile.ZipFile, *args, **kw) -> Self: raise NotImplementedError() @classmethod - def readdir(cls, path: str) -> Self: + def load_directory(cls, path: str, *args, **kw) -> Self: raise NotImplementedError() - def has_filename(self) -> bool: - return hasattr(self, "_filename") + def dump_archive(self, fileobj: zipfile.ZipFile, *args, **kw): + raise NotImplementedError() - def save( - self, filename: str = None, zipped: bool = False, overwrite: bool = False - ) -> Self: - if filename is None: - filename = self.filename - if filename is None: - raise ValueError("No path specified") + def dump_directory(self, path: str, *args, **kw): + raise NotImplementedError() - # add extension if missing - name, ext = os.path.splitext(filename) - if name.endswith("/") or name.endswith("\\"): - filename += self.FILENAME + self.extension - elif ext == "": - filename += self.extension + def save( + self, fp: str = None, zipped: bool = False, overwrite: bool = False, *args, **kw + ): + """ + Save this object to disk. + + :param fp: The filepath to save, defaults to None + :type fp: str, optional + :param zipped: When true it will save as a ZIP file. When false save in FOLDER, defaults to False + :type zipped: bool, optional + :param overwrite: When true it will override the previus written file. When false it will not override the file, defaults to False + :type overwrite: bool, optional + """ + fp = self.fp if fp is None else fp + if fp is None: + raise ValueError("No filename specified") + self.fp = fp - # Make dir - dir = os.path.dirname(filename) - if dir != "": - os.makedirs(dir, exist_ok=True) + # Make unique filename if overrite=False and exits + if not overwrite and os.path.exists(fp): + c = 0 + while not os.path.exists(fp): + t, ext = os.path.splitext(fp) + fp = t + str(c) + ext + c += 1 if zipped: - if os.path.exists(filename) and not overwrite: - raise FileExistsError(f"Could't overwrite {filename!r}") - with ZipFile(filename, "w") as zip: - self.writezip(zip) - return self - else: - filename, ext = os.path.splitext(filename) - if not overwrite: - c = 1 - while os.path.exists(filename): - filename = filename + str(c) - c += 1 - self.writedir(filename) - return self - - def writedir(self, path: str) -> Self: - raise NotImplementedError() + os.makedirs(os.path.dirname(fp), exist_ok=True) + with zipfile.ZipFile(fp, "w") as zf: + return self.dump_archive(zf, *args, **kw) + return self.dump_directory( + os.path.join(self.dirname, self.filename), *args, **kw + ) + + def valid(self, fp: str) -> bool: + """ + Whether or not this is a valid object - def writezip(self, zip: ZipFile) -> Self: - raise NotImplementedError() + :param fp: The DIRECTORY, TAR file or ZIP file to validate + :type fp: str + :rtype: bool + """ + try: + return tarfile.is_tarfile(fp) or zipfile.is_zipfile(fp) # TAR or ZIP file + except PermissionError: + return True # Directory def getvalue(self) -> bytes: + """ + :rtype: bytes + """ with BytesIO() as io: - with ZipFile(io, "w") as zip: - self.writezip(zip) + with zipfile.ZipFile(io, "w") as zf: + self.dump_archive(zf) return io.getvalue() - - def setup(self): ... diff --git a/mcaddon/geometry.py b/mcaddon/geometry.py new file mode 100644 index 0000000..c1e9976 --- /dev/null +++ b/mcaddon/geometry.py @@ -0,0 +1,609 @@ +import os +from typing import Self +from molang import Molang +from dataclasses import dataclass, field +from PIL import Image, ImageFile +import numpy as np + +from . import __file__, VERSION +from .file import JsonFile, Loader +from .pack import resource_pack +from .util import ( + getattr2, + getitem, + additem, + removeitem, + clearitems, + Identifier, + Identifiable, +) +from .math import Vector3, Vector2 + + +class Model(Identifiable): + def __init__( + self, + identifier: Identifiable, + ): + Identifiable.__init__(self, identifier) + + def __str__(self) -> str: + return self.__class__.__name__ + "{" + str(self.identifier.path) + "}" + + @staticmethod + def get_data(vertices, indices) -> np.ndarray: + data = [vertices[ind] for triangle in indices for ind in triangle] + return np.array(data, dtype="f4") + + def get_vertex_data(self) -> np.ndarray: + raise NotImplementedError() + + def get_matrix(self): + raise NotImplementedError() + + def thumbnail(self) -> ImageFile.ImageFile: + from .ext.mgl import MGLRenderer + + renderer = MGLRenderer().render(self) + pixels = renderer.fbo.read(components=3, alignment=1) + return Image.frombytes("RGB", renderer.fbo.size, pixels).transpose( + Image.FLIP_TOP_BOTTOM + ) + + def geometry(self): + geo = Geometry(self.identifier) + geo.add_model(self) + return geo + + +# Add support for rendering as an image and support for common 3D libraries like pygame, OpenGL, etc +@resource_pack +class Geometry(JsonFile, Identifiable): + + id = Identifier("geometry") + FILEPATH = "models/geometry.geo.json" + + def __init__( + self, identifier: Identifiable, models: dict[Identifiable, Model] = {} + ): + Identifiable.__init__(self, identifier) + self.models = models + + def __str__(self) -> str: + return "Geometry{" + repr(self.identifier.path) + "}" + + def __iter__(self): + for i in self.models: + yield i + + def __getitem__(self, id: Identifiable): + return self.models[Identifiable.of(id)] + + @property + def models(self) -> dict[Identifier, Model]: + return getattr2(self, "_models", {}) + + @models.setter + def models(self, value: dict[Identifiable, Model]): + if not isinstance(value, dict): + raise TypeError( + f"Expected dict but got '{value.__class__.__name__}' instead" + ) + models = {} + for k, v in value.items(): + models[Identifiable.of(k)] = v + self.on_update("models", models) + setattr(self, "_models", models) + + @staticmethod + def from_dict(data: dict) -> Self: + loader = GeometryLoader() + loader.validate(data) + return loader.load(data) + + def jsonify(self) -> dict: + data = {"format_version": VERSION["GEOMETRY"], str(self.id): []} + for v in self.models.values(): + data[str(self.id)].append(v.jsonify()) + return data + + @classmethod + def open(cls, fp: str, start): + with open(fp, "r") as fd: + self = cls.load(fd) + self.identifier = os.path.relpath(fp, start).replace("\\", "/") + return self + + # MODEL + + def get_model(self, id: Identifiable) -> Model: + return getitem(self, "models", Identifiable.of(id)) + + def add_model(self, model: Model) -> Model: + return additem(self, "models", model, model.identifier, Model) + + def remove_model(self, id: Identifiable) -> Model: + return removeitem(self, "models", Identifiable.of(id)) + + def clear_models(self) -> Self: + """Remove all models""" + return clearitems(self, "models") + + +class GeometryLoader(Loader): + name = "Geometry" + + def __init__(self): + from .schemas import GeometrySchema1 + + Loader.__init__(self, Geometry) + self.add_schema(GeometrySchema1, "1.12.0") + self.add_schema(GeometrySchema1, "1.16.0") + + +@dataclass +class TextureMesh: + position: Vector3 + rotation: Vector3 + texture: str + local_pivot: Vector3 = None + + @staticmethod + def from_dict(data: dict) -> Self: + position = Vector3.of(data.pop("position")) + rotation = Vector3.of(data.pop("rotation")) + texture = data.pop("texture") + self = TextureMesh(position, rotation, texture) + if "local_pivot" in data: + self.local_pivot = Vector3.of(data.pop("local_pivot")) + return self + + def jsonify(self) -> dict: + data = { + "position": self.position.jsonify(), + "rotation": self.rotation.jsonify(), + "texture": self.texture, + } + if self.local_pivot is not None: + data["local_pivot"] = self.local_pivot.jsonify() + return data + + +@dataclass +class UV: + uv: Vector2 + uv_size: Vector2 = None + + @staticmethod + def from_dict(data: dict) -> Self: + uv = Vector2.of(data.pop("uv")) + self = UV(uv) + if "uv_size" in data: + self.uv_size = Vector2.of(data.pop("uv_size")) + return self + + def jsonify(self) -> dict: + data = {"uv": self.uv.jsonify()} + if self.uv_size is not None: + data["uv_size"] = self.uv_size.jsonify() + return data + + +@dataclass +class Cube: + origin: Vector3 + size: Vector3 + uv: Vector2 | dict[str, UV] = None + mirror: bool = False + inflate: float = None + rotation: Vector3 = None + pivot: Vector3 = None + + @staticmethod + def from_dict(data: dict) -> Self: + origin = Vector3.of(data.pop("origin")) + size = Vector3.of(data.pop("size")) + self = Cube(origin, size) + if "uv" in data: + uv = data.pop("uv") + if isinstance(uv, list): + self.uv = Vector2.of(uv) + else: + uvs = {} + for k, v in uv.items(): + uvs[k] = UV.from_dict(v) + self.uv = uvs + if "mirror" in data: + self.mirror = data.pop("mirror") + if "inflate" in data: + self.inflate = data.pop("inflate") + if "rotation" in data: + self.rotation = Vector3.of(data.pop("rotation")) + if "pivot" in data: + self.pivot = Vector3.of(data.pop("pivot")) + return self + + def jsonify(self) -> dict: + data = {"origin": self.origin.jsonify(), "size": self.size.jsonify()} + if self.uv is not None: + if isinstance(self.uv, dict): + data["uv"] = {} + for k, v in self.uv.items(): + data["uv"][k] = v.jsonify() + else: + data["uv"] = self.uv.jsonify() + if self.mirror: + data["mirror"] = self.mirror + if self.inflate: + data["inflate"] = self.inflate + if self.rotation is not None: + data["rotation"] = self.rotation.jsonify() + if self.pivot is not None: + data["pivot"] = self.pivot.jsonify() + return data + + @staticmethod + def default(): + uv = { + "north": UV(Vector2(0, 0), Vector2(64, 64)), + "south": UV(Vector2(0, 0), Vector2(64, 64)), + "east": UV(Vector2(0, 0), Vector2(64, 64)), + "west": UV(Vector2(0, 0), Vector2(64, 64)), + "up": UV(Vector2(64, 64), Vector2(-64, -64)), + "down": UV(Vector2(64, 64), Vector2(-64, -64)), + } + return Cube(Vector3(-8, 0, -8), Vector3(16, 16, 16), uv) + + +@dataclass +class Bone: + name: str + parent: str = None + mirror: bool = False + binding: Molang = None + rotation: Vector3 = None + texture_meshes: list[TextureMesh] = field(default_factory=list) + locators: dict[str, Vector3] = field(default_factory=dict) + pivot: Vector3 = None + inflate: float = None + reset: bool = False + cubes: list[Cube] = field(default_factory=list) + + def __iter__(self): + for c in self.cubes: + yield c + + @staticmethod + def from_dict(data: dict) -> Self: + name = data.pop("name") + self = Bone(name) + if "parent" in data: + self.parent = data.pop("parent") + if "mirror" in data: + self.mirror = data.pop("mirror") + if "binding" in data: + self.binding = Molang(data.pop("binding")) + if "rotation" in data: + self.rotation = Vector3.of(data.pop("rotation")) + if "texture_meshes" in data: + self.texture_meshes = [ + TextureMesh.from_dict(x) for x in data.pop("texture_meshes") + ] + if "locators" in data: + locators = {} + for k, v in data.pop("locators").items(): + locators[k] = Vector3.of(v) + self.locators = locators + if "pivot" in data: + self.pivot = Vector3.of(data.pop("pivot")) + if "inflate" in data: + self.inflate = data.pop("inflate") + if "reset" in data: + self.reset = data.pop("reset") + if "cubes" in data: + self.cubes = [Cube.from_dict(x) for x in data.pop("cubes")] + return self + + @staticmethod + def cube(name: str): + return Bone(name, cubes=[Cube.default()]) + + def jsonify(self) -> dict: + data = {"name": self.name} + if self.parent: + data["parent"] = self.parent + if self.mirror: + data["mirror"] = self.mirror + if self.binding: + data["binding"] = str(self.binding) + if self.rotation is not None: + data["rotation"] = self.rotation.jsonify() + if self.texture_meshes: + data["texture_meshes"] = [x.jsonify() for x in self.texture_meshes] + if self.locators: + locators = {} + for k, v in self.locators.items(): + locators[k] = v.jsonify() + data["locators"] = locators + if self.pivot is not None: + data["pivot"] = self.pivot.jsonify() + if self.inflate: + data["inflate"] = self.inflate + if self.reset: + data["reset"] = self.reset + if self.cubes: + data["cubes"] = [x.jsonify() for x in self.cubes] + return data + + # CUBE + + def get_cube(self, index: int) -> Cube: + return self.cubes[index] + + def add_cube(self, cube: Cube) -> Cube: + self.cubes.append(cube) + return cube + + def remove_cube(self, index) -> Cube: + return self.cubes.pop(index) + + def clear_cubes(self) -> Self: + self.cubes.clear() + return self + + +class EntityModel(Model): + + id = Identifier("entity") + + def __init__( + self, + identifier: Identifiable, + texture_height: float | int, + texture_width: float | int, + visible_bounds_width: float | int = None, + visible_bounds_height: float | int = None, + visible_bounds_offset: Vector3 = None, + bones: dict[str, Bone] = {}, + ): + Model.__init__(self, identifier) + self.texture_height = texture_height + self.texture_width = texture_width + self.visible_bounds_offset = visible_bounds_offset + self.visible_bounds_width = visible_bounds_width + self.visible_bounds_height = visible_bounds_height + self.bones = bones + + def __iter__(self): + for bone in self.bones.values(): + yield bone + + def __getitem__(self, name: str): + return self.bones[name] + + @property + def texture_width(self) -> float: + return getattr(self, "_texture_width") + + @texture_width.setter + def texture_width(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + v = float(value) + self.on_update("texture_width", v) + setattr(self, "_texture_width", v) + + @property + def texture_height(self) -> float: + return getattr(self, "_texture_height") + + @texture_height.setter + def texture_height(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + v = float(value) + self.on_update("texture_height", v) + setattr(self, "_texture_height", v) + + @property + def visible_bounds_offset(self) -> Vector3: + return getattr(self, "_visible_bounds_offset", None) + + @visible_bounds_offset.setter + def visible_bounds_offset(self, value: Vector3): + if value is None: + return + elif isinstance(value, (float, int)): + self.visible_bounds_offset = Vector3(value, value, value) + elif isinstance(value, Vector3): + self.on_update("visible_bounds_offset", value) + setattr(self, "_visible_bounds_offset", value) + else: + raise TypeError( + f"Expected Vector3 but got '{value.__class__.__name__}' instead" + ) + + @property + def visable_bounds_width(self) -> float: + return getattr(self, "_visable_bounds_width") + + @visable_bounds_width.setter + def visable_bounds_width(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + v = float(value) + self.on_update("visable_bounds_width", v) + setattr(self, "_visable_bounds_width", v) + + @property + def visable_bounds_height(self) -> float: + return getattr(self, "_visable_bounds_height") + + @visable_bounds_height.setter + def visable_bounds_height(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + v = float(value) + self.on_update("visable_bounds_height", v) + setattr(self, "_visable_bounds_height", v) + + @property + def bone(self) -> dict[str, Bone]: + return getattr(self, "_bone", {}) + + @bone.setter + def bone(self, value: dict[str, Bone]): + if not isinstance(value, dict): + raise TypeError( + f"Expected dict but got '{value.__class__.__name__}' instead" + ) + self.on_update("bone", value) + setattr(self, "_bone", value) + + @staticmethod + def from_dict(data: dict) -> Self: + desc = data.pop("description") + id = desc["identifier"] + texture_height = desc.get("texture_height") + texture_width = desc.get("texture_width") + visible_bounds_offset = desc.get("visible_bounds_offset") + visible_bounds_width = desc.get("visible_bounds_width") + visible_bounds_height = desc.get("visible_bounds_height") + bones = {} + for x in data.pop("bones"): + b = Bone.from_dict(x) + bones[b.name] = b + + return EntityModel( + id, + texture_height, + texture_width, + visible_bounds_offset, + visible_bounds_width, + visible_bounds_height, + bones, + ) + + @staticmethod + def cube(id: Identifiable): + model = EntityModel(id, 64, 64, 2, 2.5, Vector3(0, 0.75, 0)) + model.add_bone(Bone.cube(model.identifier.path)) + return model + + def jsonify(self) -> dict: + data = { + "description": {"identifier": str(self.identifier)}, + "bones": [bone.jsonify() for bone in self.bones.values()], + } + if self.texture_height: + data["description"]["texture_height"] = self.texture_height + if self.texture_width: + data["description"]["texture_width"] = self.texture_width + if self.visible_bounds_width: + data["description"]["visible_bounds_width"] = self.visible_bounds_width + if self.visible_bounds_height: + data["description"]["visible_bounds_height"] = self.visible_bounds_height + if self.visible_bounds_offset is not None: + data["description"][ + "visible_bounds_offset" + ] = self.visible_bounds_offset.jsonify() + return data + + def get_vertex_data(self) -> np.ndarray: + # Should get vertex data for all self.bones.cubes + vertices = [ + (-1, -1, 1), + (1, -1, 1), + (1, 1, 1), + (-1, 1, 1), + (-1, 1, -1), + (-1, -1, -1), + (1, -1, -1), + (1, 1, -1), + ] + indices = [ + (0, 2, 3), + (0, 1, 2), + (1, 7, 2), + (1, 6, 7), + (6, 5, 4), + (4, 7, 6), + (3, 4, 5), + (3, 5, 0), + (3, 7, 4), + (3, 2, 7), + (0, 6, 1), + (0, 5, 6), + ] + + vertex_data = self.get_data(vertices, indices) + + tex_coord = [(0, 0), (1, 0), (1, 1), (0, 1)] + tex_coord_indices = [ + (0, 2, 3), + (0, 1, 2), + (0, 2, 3), + (0, 1, 2), + (0, 1, 2), + (2, 3, 0), + (2, 3, 0), + (2, 0, 1), + (0, 2, 3), + (0, 1, 2), + (3, 1, 2), + (3, 0, 1), + ] + tex_coord_data = self.get_data(tex_coord, tex_coord_indices) + + normals = [ + (0, 0, 1) * 6, + (1, 0, 0) * 6, + (0, 0, -1) * 6, + (-1, 0, 0) * 6, + (0, 1, 0) * 6, + (0, -1, 0) * 6, + ] + normals = np.array(normals, dtype="f4").reshape(36, 3) + + vertex_data = np.hstack([normals, vertex_data]) + vertex_data = np.hstack([tex_coord_data, vertex_data]) + return vertex_data + + def get_matrix(self): + import glm # PyGLM + + pos = (0, 0, -10) + rot = glm.vec3([glm.radians(a) for a in (0, 0, 0)]) + scale = (1, 1, 1) + m_model = glm.mat4() + # Translate + m_model = glm.translate(m_model, pos) + # Rotate + m_model = glm.rotate(m_model, rot.x, glm.vec3(1, 0, 0)) + m_model = glm.rotate(m_model, rot.y, glm.vec3(0, 1, 0)) + m_model = glm.rotate(m_model, rot.z, glm.vec3(0, 0, 1)) + # Scale + m_model = glm.scale(m_model, scale) + return m_model + + # BONES + def get_bone(self, name: str) -> Bone: + return getitem(self, "bones", name) + + def add_bone(self, bone: Bone) -> Bone: + return additem(self, "bones", bone, bone.name, Bone) + + def remove_bone(self, name) -> Bone: + return removeitem(self, "bones", name) + + def clear_bones(self) -> Self: + """Remove all bones""" + return clearitems(self, "bones") diff --git a/mcaddon/item.py b/mcaddon/item.py index 26bb545..0ac4f8f 100644 --- a/mcaddon/item.py +++ b/mcaddon/item.py @@ -3,65 +3,87 @@ import json from . import VERSION -from .registry import INSTANCE, Registries from .constant import UseAnimation +from .registry import INSTANCE, Registries from .file import JsonFile, Loader -from .util import getattr2, Identifier, MenuCategory, Identifiable +from .pack import behavior_pack, resource_pack, ResourcePack +from .util import ( + getattr2, + getitem, + additem, + removeitem, + clearitems, + Identifier, + MenuCategory, + Identifiable, + Misc, +) from .event import Event +from .block import BlockDescriptor # COMPONENTS -class ItemComponent: +class ItemComponent(Misc): def __repr__(self): return str(self) def __str__(self) -> str: return "ItemComponent{" + str(self.id) + "}" - @property - def __dict__(self) -> dict: + def __call__(self, ctx) -> int: + return self.execute(ctx) + + def jsonify(self) -> dict: raise NotImplementedError() def json(self) -> str: - return json.dumps(self.__dict__) + return json.dumps(self.jsonify()) - @classmethod - def from_dict(cls, data: dict) -> Self: + @staticmethod + def from_dict(data: dict) -> Self: raise NotImplementedError() + @property + def id(self) -> Identifier: + return getattr(self, "_id") + + @id.setter + def id(self, value: Identifier): + setattr(self, "_id", Identifier.of(value)) + + def execute(self, ctx) -> int: + return 0 + + def generate(self, ctx) -> None: + """ + Called when this component is added to an Item + + :type ctx: Item + """ + ... + class SimpleItemComponent(ItemComponent): def __init__(self, value): self.value = value - @property - def __dict__(self): + def jsonify(self): data = self.value return data - @classmethod - def from_dict(cls, data) -> Self: - self = cls.__new__(cls) - self.value = data - return self - @property def value(self): return getattr(self, "_value") @value.setter def value(self, value): - if not isinstance(self.clazz, tuple) and issubclass(self.clazz, Identifier): - if isinstance(value, (Identifier, str)): - setattr(self, "_value", Identifier(value)) - else: - raise TypeError( - f"Expected {self.clazz.__name__} but got '{value.__class__.__name__}' instead" - ) + if not isinstance(self.clazz, tuple) and issubclass(self.clazz, Identifiable): + setattr(self, "_value", Identifiable.of(value)) else: if isinstance(value, self.clazz): + self.on_update("value", value) setattr(self, "_value", value) else: raise TypeError( @@ -70,8 +92,7 @@ def value(self, value): class EmptyItemComponent(ItemComponent): - @property - def __dict__(self): + def jsonify(self): data = {} return data @@ -102,42 +123,51 @@ def wrapper(): @item_component_type class IgnoresPermissionComponent(SimpleItemComponent): + """ """ + id = Identifier("ignores_permission") clazz = bool + @staticmethod + def from_dict(data: bool) -> Self: + return IgnoresPermissionComponent(data) + @item_component_type class AllowOffHandComponent(SimpleItemComponent): - """The allow off hand component determines whether the item can be placed in the off hand slot of the inventory.""" + """The allow off hand component determines whether the item can be placed in the off hand slot of the inventory. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_allow_off_hand?view=minecraft-bedrock-stable)""" id = Identifier("allow_off_hand") clazz = bool + @staticmethod + def from_dict(data: bool) -> Self: + return AllowOffHandComponent(data) + @item_component_type class BlockPlacerComponent(ItemComponent): - """Block Placer item component. Items with this component will place a block when used.""" + """Block Placer item component. Items with this component will place a block when used. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_block_placer?view=minecraft-bedrock-stable)""" id = Identifier("block_placer") - def __init__(self, block: Identifier | str, use_on: list = None): - self.block = Identifier.parse(block) + def __init__(self, block: Identifiable, use_on: list[BlockDescriptor] = []): + self.block = block self.use_on = use_on - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"block": str(self.block)} if self.use_on: - data["use_on"] = self.use_on + data["use_on"] = [x.jsonify() for x in self.use_on] return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.block = data.pop("block") + @staticmethod + def from_dict(data: dict) -> Self: + block = data.pop("block") + use_on = [] if "use_on" in data: - self.use_on = data.pop("use_on") - return self + use_on = data.pop("use_on") + return BlockPlacerComponent(block, use_on) @property def block(self) -> Identifier: @@ -145,41 +175,54 @@ def block(self) -> Identifier: return getattr(self, "_block") @block.setter - def block(self, value: Identifier): - if not isinstance(value, (Identifier, str)): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_block", Identifier(value)) + def block(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("block", id) + setattr(self, "_block", id) @property - def use_on(self) -> list: + def use_on(self) -> list[BlockDescriptor]: """List of block descriptors that contain blocks that this item can be used on. If left empty, all blocks will be allowed.""" return getattr2(self, "_use_on", []) @use_on.setter - def use_on(self, value: list): - if value is None: - self.use_on = [] - return + def use_on(self, value: list[BlockDescriptor]): if not isinstance(value, list): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("use_on", value) setattr(self, "_use_on", value) + def get_use_on(self, index: int) -> BlockDescriptor: + return getitem(self, "use_on", index) + + def add_use_on(self, block: BlockDescriptor) -> BlockDescriptor: + return additem(self, "use_on", block, type=BlockDescriptor) + + def remove_use_on(self, index: int) -> BlockDescriptor: + return removeitem(self, "use_on", index) + + def clear_use_on(self) -> Self: + """Remove all use on blocks""" + return clearitems(self, "use_on") + @item_component_type class CanDestroyInCreativeComponent(SimpleItemComponent): - """The can destroy in creative component determines if the item will break blocks in creative when swinging.""" + """The can destroy in creative component determines if the item will break blocks in creative when swinging. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_can_destroy_in_creative?view=minecraft-bedrock-stable)""" id = Identifier("can_destroy_in_creative") clazz = bool + @staticmethod + def from_dict(data: bool) -> Self: + return CanDestroyInCreativeComponent(data) + @item_component_type class CooldownComponent(ItemComponent): - """Cool down time for a component. After you use an item, all items specified with the same `cool down category` setting becomes unusable for the duration specified by the 'cool down time' setting in this component.""" + """Cool down time for a component. After you use an item, all items specified with the same `cool down category` setting becomes unusable for the duration specified by the 'cool down time' setting in this component. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_cooldown?view=minecraft-bedrock-stable)""" id = Identifier("cooldown") @@ -187,17 +230,13 @@ def __init__(self, category: str, duration: float): self.category = category self.duration = duration - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"category": self.category, "duration": self.duration} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.category = data.pop("category") - self.duration = data.pop("duration") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return CooldownComponent(**data) @property def category(self) -> str: @@ -206,7 +245,9 @@ def category(self) -> str: @category.setter def category(self, value: str): - setattr(self, "_category", str(value)) + v = str(value) + self.on_update("category", v) + setattr(self, "_category", v) @property def duration(self) -> float: @@ -219,13 +260,15 @@ def duration(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_duration", float(value)) + v = float(value) + self.on_update("duration", v) + setattr(self, "_duration", v) @item_component_type class DamageComponent(ItemComponent): """ - The damage component determines how much extra damage the item does on attack. + The damage component determines how much extra damage the item does on attack. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_damage?view=minecraft-bedrock-stable) """ id = Identifier("damage") @@ -234,22 +277,19 @@ class DamageComponent(ItemComponent): def __init__(self, value: int): self.value = value - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"value": self.value} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.value = data.pop("value") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return DamageComponent(**data) @item_component_type class ItemDisplayNameComponent(ItemComponent): """ - Display Name item component. Determines the text shown whenever an item's name is displayed (ex. hover text). + Display Name item component. Determines the text shown whenever an item's name is displayed (ex. hover text). [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_display_name?view=minecraft-bedrock-stable) """ id = Identifier("display_name") @@ -257,16 +297,13 @@ class ItemDisplayNameComponent(ItemComponent): def __init__(self, value: str): self.value = value - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"value": self.value} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.value = data.pop("value") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return ItemDisplayNameComponent(**data) @property def value(self) -> str: @@ -274,13 +311,15 @@ def value(self) -> str: @value.setter def value(self, value: str): - setattr(self, "_value", str(value)) + v = str(value) + self.on_update("value", v) + setattr(self, "_value", v) @item_component_type class DurabilityComponent(ItemComponent): """ - Durability item component. Determines how much damage this item takes before breaking and allows the item to be combined in crafting. + Durability item component. Determines how much damage this item takes before breaking and allows the item to be combined in crafting. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_durability?view=minecraft-bedrock-stable) """ id = Identifier("durability") @@ -289,20 +328,16 @@ def __init__(self, damage_chance: float, max_durability: int): self.damage_chance = damage_chance self.max_durability = max_durability - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = { "damage_chance": self.damage_chance, "max_durability": self.max_durability, } return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.damage_chance = data.pop("damage_chance") - self.max_durability = data.pop("max_durability") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return DurabilityComponent(**data) @property def damage_chance(self) -> float: @@ -315,7 +350,9 @@ def damage_chance(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_damage_chance", float(value)) + v = float(value) + self.on_update("damage_chance", v) + setattr(self, "_damage_chance", v) @property def max_durability(self) -> int: @@ -328,13 +365,14 @@ def max_durability(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("max_durability", value) setattr(self, "_max_durability", value) @item_component_type class EnchantableComponent(ItemComponent): """ - The enchantable component determines what enchantments can be applied to the item. Not all enchantments will have an effect on all item components. + The enchantable component determines what enchantments can be applied to the item. Not all enchantments will have an effect on all item components. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_enchantable?view=minecraft-bedrock-stable) """ id = Identifier("enchantable") @@ -343,17 +381,13 @@ def __init__(self, slot: str, value: int): self.slot = slot self.value = value - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"slot": self.slot, "value": self.value} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.slot = data.pop("slot") - self.value = data.pop("value") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return EnchantableComponent(**data) @property def slot(self) -> str: @@ -362,7 +396,9 @@ def slot(self) -> str: @slot.setter def slot(self, value: str): - setattr(self, "_slot", str(value)) + v = str(value) + self.on_update("slot", v) + setattr(self, "_slot", v) @property def value(self) -> int: @@ -375,26 +411,24 @@ def value(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("value", value) setattr(self, "_value", value) @item_component_type class EntityPlacerComponent(ItemComponent): """ - Entity placer item component. You can specifiy allowed blocks that the item is restricted to. + Entity placer item component. You can specifiy allowed blocks that the item is restricted to. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_entity_placer?view=minecraft-bedrock-stable) """ id = Identifier("entity_placer") - def __init__( - self, entity: Identifier | str, dispense_on: list = None, use_on: list = None - ): - self.entity = Identifier.parse(entity) + def __init__(self, entity: Identifiable, dispense_on: list = [], use_on: list = []): + self.entity = entity self.dispense_on = dispense_on self.use_on = use_on - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"entity": str(self.entity)} if self.dispense_on: data["dispense_on"] = self.dispense_on @@ -402,15 +436,12 @@ def __dict__(self) -> dict: data["use_on"] = self.use_on return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.entity = data.pop("entity") - if "dispense_on" in data: - self.dispense_on = data.pop("dispense_on") - if "use_on" in data: - self.use_on = data.pop("use_on") - return self + @staticmethod + def from_dict(data: dict) -> Self: + entity = data.pop("entity") + dispense_on = data.pop("dispense_on") if "dispense_on" in data else [] + use_on = data.pop("use_on") if "use_on" in data else [] + return EntityPlacerComponent(entity, dispense_on, use_on) @property def entity(self) -> Identifier: @@ -418,12 +449,10 @@ def entity(self) -> Identifier: return getattr(self, "_entity") @entity.setter - def entity(self, value: Identifier): - if not isinstance(value, (Identifier, str)): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_entity", Identifier(value)) + def entity(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("entity", id) + setattr(self, "_entity", id) @property def dispense_on(self) -> list: @@ -432,13 +461,11 @@ def dispense_on(self) -> list: @dispense_on.setter def dispense_on(self, value: list): - if value is None: - self.dispense_on = [] - return if not isinstance(value, list): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("dispense_on", value) setattr(self, "_dispense_on", value) @property @@ -448,20 +475,42 @@ def use_on(self) -> list: @use_on.setter def use_on(self, value: list): - if value is None: - self.use_on = [] - return if not isinstance(value, list): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("use_on", value) setattr(self, "_use_on", value) + def get_dispense_on(self, index: int) -> BlockDescriptor: + return getitem(self, "dispense_on", index) + + def add_dispense_on(self, block: BlockDescriptor) -> BlockDescriptor: + return additem(self, "dispense_on", block, type=BlockDescriptor) + + def remove_dispense_on(self, index: int) -> BlockDescriptor: + return removeitem(self, "dispense_on", index) + + def clear_dispense_on(self) -> Self: + return clearitems(self, "dispense_on") + + def get_use_on(self, index: int) -> BlockDescriptor: + return getitem(self, "use_on", index) + + def add_use_on(self, block: BlockDescriptor) -> BlockDescriptor: + return additem(self, "use_on", block, type=BlockDescriptor) + + def remove_use_on(self, index: int) -> BlockDescriptor: + return removeitem(self, "use_on", index) + + def clear_use_on(self) -> Self: + return clearitems(self, "use_on") + @item_component_type class FoodComponent(ItemComponent): """ - When an item has a food component, it becomes edible to the player. Must have the 'minecraft:use_duration' component in order to function properly. + When an item has a food component, it becomes edible to the player. Must have the 'minecraft:use_duration' component in order to function properly. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_food?view=minecraft-bedrock-stable) """ id = Identifier("food") @@ -471,15 +520,16 @@ def __init__( nutrition: int, saturation_modifier: float = None, can_always_eat: bool = False, - using_converts_to: Identifier | str = None, + using_converts_to: Identifiable = None, + is_meat: bool = False, ): self.nutrition = nutrition self.saturation_modifier = saturation_modifier self.can_always_eat = can_always_eat self.using_converts_to = using_converts_to + self.is_meat = is_meat - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {} if self.nutrition is not None: data["nutrition"] = self.nutrition @@ -489,20 +539,36 @@ def __dict__(self) -> dict: data["can_always_eat"] = self.can_always_eat if self.using_converts_to is not None: data["using_converts_to"] = str(self.using_converts_to) + if self.is_meat not in [None, False]: + data["is_meat"] = self.is_meat return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - if "nutrition" in data: - self.nutrition = data.pop("nutrition") - if "saturation_modifier" in data: - self.saturation_modifier = data.pop("saturation_modifier") - if "can_always_eat" in data: - self.can_always_eat = data.pop("can_always_eat") - if "using_converts_to" in data: - self.using_converts_to = data.pop("using_converts_to") - return self + @staticmethod + def from_dict(data: dict) -> Self: + for x in [ + "effects", + "on_use_action", + "on_use_range", + "cooldown_type", + "cooldown_time", + "remove_effects", + ]: + if x in data: + del data[x] + return FoodComponent(**data) + + @property + def is_meat(self) -> bool: + return getattr(self, "_is_meat") + + @is_meat.setter + def is_meat(self, value: bool): + if not isinstance(value, bool): + raise TypeError( + f"Expected bool but got '{value.__class__.__name__}' instead" + ) + self.on_update("is_meat", value) + setattr(self, "_is_meat", value) @property def nutrition(self) -> int: @@ -515,6 +581,7 @@ def nutrition(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("nutrition", value) setattr(self, "_nutrition", value) @property @@ -547,7 +614,9 @@ def saturation_modifier(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_saturation_modifier", float(value)) + v = float(value) + self.on_update("saturation_modifier", v) + setattr(self, "_saturation_modifier", v) @property def can_always_eat(self) -> bool: @@ -562,6 +631,7 @@ def can_always_eat(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("can_always_eat", value) setattr(self, "_can_always_eat", value) @property @@ -570,17 +640,19 @@ def using_converts_to(self) -> Identifier | None: return getattr(self, "_using_converts_to", None) @using_converts_to.setter - def using_converts_to(self, value: Identifier | None): + def using_converts_to(self, value: Identifiable | None): if value is None: setattr(self, "_using_converts_to", None) else: - setattr(self, "_using_converts_to", Identifier(value)) + id = Identifiable.of(value) + self.on_update("using_converts_to", id) + setattr(self, "_using_converts_to", id) @item_component_type class FuelComponent(ItemComponent): """ - Fuel item component. Allows this item to be used as fuel in a furnace to 'cook' other items. + Fuel item component. Allows this item to be used as fuel in a furnace to 'cook' other items. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_fuel?view=minecraft-bedrock-stable) """ id = Identifier("fuel") @@ -588,16 +660,13 @@ class FuelComponent(ItemComponent): def __init__(self, duration: float): self.duration = duration - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"duration": self.duration} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.duration = data.pop("duration") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return FuelComponent(**data) @property def duration(self) -> float: @@ -610,82 +679,79 @@ def duration(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_duration", float(value)) + v = float(value) + self.on_update("duration", v) + setattr(self, "_duration", v) @item_component_type class GlintComponent(SimpleItemComponent): """ - The glint component determines whether the item has the enchanted glint render effect on it. + The glint component determines whether the item has the enchanted glint render effect on it. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_glint?view=minecraft-bedrock-stable) """ id = Identifier("glint") clazz = bool - @property - def __dict__(self) -> dict: - data = {"value": self.value} + def jsonify(self) -> dict: + data = self.value return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.value = data.pop("value") - return self + @staticmethod + def from_dict(data: bool) -> Self: + return GlintComponent(data) @item_component_type class HandEquippedComponent(SimpleItemComponent): """ - This component determines if an item is rendered like a tool while in hand. + This component determines if an item is rendered like a tool while in hand. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_hand_equipped?view=minecraft-bedrock-stable) """ id = Identifier("hand_equipped") clazz = bool + @staticmethod + def from_dict(data: bool) -> Self: + return HandEquippedComponent(data) + @item_component_type class HoverTextColorComponent(SimpleItemComponent): """ - The hover text color component determines the color of the item name when hovering over it. + The hover text color component determines the color of the item name when hovering over it. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_hover_text_color?view=minecraft-bedrock-stable) """ id = Identifier("hover_text_color") clazz = str - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"value": self.value} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.value = data.pop("value") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return HoverTextColorComponent(**data) @item_component_type class IconComponent(ItemComponent): """ - Icon item component. Determines the icon to represent the item in the UI and elsewhere. + Icon item component. Determines the icon to represent the item in the UI and elsewhere. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_icon?view=minecraft-bedrock-stable) """ id = Identifier("icon") - def __init__(self, texture: Identifier | str): + def __init__(self, texture: Identifiable): self.texture = texture - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"texture": str(self.texture)} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.texture = data.pop("texture") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return IconComponent(**data) @property def texture(self) -> Identifier: @@ -693,29 +759,28 @@ def texture(self) -> Identifier: return getattr(self, "_texture") @texture.setter - def texture(self, value: Identifier | str): - setattr(self, "_texture", Identifier(value)) + def texture(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("texture", id) + setattr(self, "_texture", id) @item_component_type class InteractButtonComponent(SimpleItemComponent): """ - This component is a boolean or string that determines if the interact button is shown in touch controls and what text is displayed on the button. When set as true, default "Use Item" text will be used.z + This component is a boolean or string that determines if the interact button is shown in touch controls and what text is displayed on the button. When set as true, default "Use Item" text will be used.z [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_interact_button?view=minecraft-bedrock-stable) """ id = Identifier("interact_button") clazz = (str, bool) - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"value": self.value} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.value = data.pop("value") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return InteractButtonComponent(**data) @item_component_type @@ -729,16 +794,13 @@ class ItemStorageComponent(ItemComponent): def __init__(self, capacity: int): self.capacity = capacity - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"capacity": self.capacity} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.capacity = data.pop("capacity") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return ItemStorageComponent(**data) @property def capacity(self) -> int: @@ -751,68 +813,64 @@ def capacity(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("capacity", value) setattr(self, "_capacity", value) @item_component_type class LiquidClippedComponent(SimpleItemComponent): """ - The liquid clipped component determines whether the item interacts with liquid blocks on use. + The liquid clipped component determines whether the item interacts with liquid blocks on use. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_liquid_clipped?view=minecraft-bedrock-stable) """ id = Identifier("liquid_clipped") clazz = bool - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"value": self.value} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.value = data.pop("value") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return LiquidClippedComponent(**data) @item_component_type class MaxStackSizeComponent(SimpleItemComponent): """ - The max stack size component determines how many of the item can be stacked together. + The max stack size component determines how many of the item can be stacked together. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_max_stack_size?view=minecraft-bedrock-stable) """ id = Identifier("max_stack_size") clazz = int + @staticmethod + def from_dict(data: int) -> Self: + return MaxStackSizeComponent(data) + @item_component_type class ProjectileComponent(ItemComponent): """ - Projectile item component. projectile items shoot out, like an arrow. + Projectile item component. projectile items shoot out, like an arrow. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_projectile?view=minecraft-bedrock-stable) """ id = Identifier("projectile") - def __init__( - self, projectile_entity: Identifier | str, minimum_critical_power: float - ): - self.projectile_entity = Identifier.parse(projectile_entity) + def __init__(self, projectile_entity: Identifiable, minimum_critical_power: float): + self.projectile_entity = projectile_entity self.minimum_critical_power = minimum_critical_power - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = { "projectile_entity": str(self.projectile_entity), "minimum_critical_power": self.minimum_critical_power, } return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.projectile_entity = data.pop("projectile_entity") - self.minimum_critical_power = data.pop("minimum_critical_power") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return ProjectileComponent(**data) @property def projectile_entity(self) -> Identifier: @@ -820,12 +878,10 @@ def projectile_entity(self) -> Identifier: return getattr(self, "_projectile_entity") @projectile_entity.setter - def projectile_entity(self, value: Identifier): - if not isinstance(value, (Identifier, str)): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_projectile_entity", Identifier(value)) + def projectile_entity(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("projectile_entity", id) + setattr(self, "_projectile_entity", id) @property def minimum_critical_power(self) -> float: @@ -838,40 +894,37 @@ def minimum_critical_power(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_minimum_critical_power", float(value)) + v = float(value) + self.on_update("minimum_critical_power", v) + setattr(self, "_minimum_critical_power", v) @item_component_type class RecordComponent(ItemComponent): """ - Record Item Component. Used by record items to play music. + Record Item Component. Used by record items to play music. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_record?view=minecraft-bedrock-stable) """ id = Identifier("record") def __init__( - self, comparator_signal: int, duration: float, sound_event: Identifier | str + self, comparator_signal: int, duration: float, sound_event: Identifiable ): self.comparator_signal = comparator_signal self.duration = duration - self.sound_event = Identifier.parse(sound_event) + self.sound_event = sound_event - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = { - "comparator": self.comparator_signal, + "comparator_signal": self.comparator_signal, "duration": self.duration, "sound_event": str(self.sound_event), } return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.comparator_signal = data.pop("comparator") - self.duration = data.pop("duration") - self.sound_event = data.pop("sound_event") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return RecordComponent(**data) @property def comparator_signal(self) -> int: @@ -884,6 +937,7 @@ def comparator_signal(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("comparator_signal", value) setattr(self, "_comparator_signal", value) @property @@ -897,7 +951,9 @@ def duration(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_duration", float(value)) + v = float(value) + self.on_update("duration", v) + setattr(self, "_duration", v) @property def sound_event(self) -> Identifier: @@ -905,22 +961,26 @@ def sound_event(self) -> Identifier: return getattr(self, "_sound_event") @sound_event.setter - def sound_event(self, value: Identifier): - if not isinstance(value, (Identifier, str)): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_sound_event", Identifier(value)) + def sound_event(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("sound_event", id) + setattr(self, "_sound_event", id) class RepairItem: - pass + @staticmethod + def from_dict(data: dict) -> Self: + return RepairItem(**data) + + def to_dict(self) -> dict: + data = {} + return data @item_component_type class RepairableComponent(ItemComponent): """ - Repairable item component. Determines the items that can be used to repair this item along with how much durability they repair. + Repairable item component. Determines the items that can be used to repair this item along with how much durability they repair. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_repairable?view=minecraft-bedrock-stable) """ id = Identifier("repairable") @@ -928,18 +988,15 @@ class RepairableComponent(ItemComponent): def __init__(self, repair_items: list[RepairItem] = None): self.repair_items = repair_items - @property - def __dict__(self) -> dict: - data = {"repair_items": []} - for i in self.repair_items: - data["repair_items"].append(i.__dict__) + def jsonify(self) -> dict: + data = {"repair_items": [x.jsonify() for x in self.repair_items]} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.repair_items = data.pop("repair_items") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return RepairableComponent( + [RepairItem.from_dict(x) for x in data.pop("repair_items")] + ) @property def repair_items(self) -> list[RepairItem]: @@ -955,13 +1012,27 @@ def repair_items(self, value: list[RepairItem]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("repair_items", value) setattr(self, "_repair_items", value) + def get_repair_item(self, index: int) -> RepairItem: + return getitem(self, "repair_items", index) + + def add_repair_item(self, item: RepairItem) -> RepairItem: + return additem(self, "repair_items", item, type=RepairItem) + + def remove_repair_item(self, index: int) -> RepairItem: + return removeitem(self, "repair_items", index) + + def clear_repair_items(self) -> Self: + """Remove all repair items""" + return clearitems(self, "repair_items") + @item_component_type class ShooterComponent(ItemComponent): """ - Shooter Item Component. Must have the 'minecraft:use_duration' component in order to function properly. + Shooter Item Component. Must have the 'minecraft:use_duration' component in order to function properly. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_shooter?view=minecraft-bedrock-stable) """ id = Identifier("shooter") @@ -971,15 +1042,14 @@ def __init__( charge_on_draw: bool, max_draw_duration: float, scale_power_by_draw_duration: bool, - ammunition: list[Identifier] = None, + ammunition: list[Identifiable] = None, ): self.ammunition = ammunition self.charge_on_draw = charge_on_draw self.max_draw_duration = max_draw_duration self.scale_power_by_draw_duration = scale_power_by_draw_duration - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = { "ammunition": [str(x) for x in self.ammunition], "charge_on_draw": self.charge_on_draw, @@ -988,14 +1058,9 @@ def __dict__(self) -> dict: } return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.ammunition = data.pop("ammunition") - self.charge_on_draw = data.pop("charge_on_draw") - self.max_draw_duration = data.pop("max_draw_duration") - self.scale_power_by_draw_duration = data.pop("scale_power_by_draw_duration") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return ShooterComponent(**data) @property def ammunition(self) -> list[Identifier]: @@ -1003,7 +1068,7 @@ def ammunition(self) -> list[Identifier]: return getattr2(self, "_ammunition", []) @ammunition.setter - def ammunition(self, value: list[Identifier]): + def ammunition(self, value: list[Identifiable]): if value is None: self.ammunition = [] return @@ -1011,7 +1076,9 @@ def ammunition(self, value: list[Identifier]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) - setattr(self, "_ammunition", value) + v = [Identifiable.of(x) for x in value] + self.on_update("ammunition", v) + setattr(self, "_ammunition", v) @property def charge_on_draw(self) -> bool: @@ -1024,6 +1091,7 @@ def charge_on_draw(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("charge_on_draw", value) setattr(self, "_charge_on_draw", value) @property @@ -1037,7 +1105,9 @@ def max_draw_duration(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_max_draw_duration", float(value)) + v = float(value) + self.on_update("max_draw_duration", v) + setattr(self, "_max_draw_duration", v) @property def scale_power_by_draw_duration(self) -> bool: @@ -1050,14 +1120,11 @@ def scale_power_by_draw_duration(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("scale_power_by_draw_duration", value) setattr(self, "_scale_power_by_draw_duration", value) - def add_ammunition(self, identifier: Identifier) -> Identifier: - if not isinstance(identifier, (Identifier, str)): - raise TypeError( - f"Expected Identifier but got '{identifier.__class__.__name__}' instead" - ) - self.ammunition.append(Identifier(identifier)) + def add_ammunition(self, identifier: Identifiable) -> Identifier: + self.ammunition.append(Identifiable.of(identifier)) return identifier def remove_ammunition(self, index: int) -> Identifier: @@ -1071,65 +1138,63 @@ def clear_ammunitions(self) -> Self: @item_component_type class ShouldDespawnComponent(SimpleItemComponent): """ - Should despawn component determines if the item should eventually despawn while floating in the world + Should despawn component determines if the item should eventually despawn while floating in the world [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_should_despawn?view=minecraft-bedrock-stable) """ id = Identifier("should_despawn") clazz = bool - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"value": self.value} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.value = data.pop("value") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return ShouldDespawnComponent(**data) @item_component_type class StackedByDataComponent(SimpleItemComponent): """ - The stacked by data component determines if the same item with different aux values can stack. Also defines whether the item actors can merge while floating in the world. + The stacked by data component determines if the same item with different aux values can stack. Also defines whether the item actors can merge while floating in the world. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_stacked_by_data?view=minecraft-bedrock-stable) """ id = Identifier("stacked_by_data") clazz = bool + @staticmethod + def from_dict(data: bool) -> Self: + return StackedByDataComponent(data) + @item_component_type -class TagsComponent(ItemComponent): +class ItemTagsComponent(ItemComponent): """ - The tags component determines which tags an item has on it. + The tags component determines which tags an item has on it. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_tags?view=minecraft-bedrock-stable) """ id = Identifier("tags") - def __init__(self, tags: list[Identifier | str] = None): + def __init__(self, tags: list[Identifiable] = None): self.tags = tags - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"tags": []} for x in self.tags: data["tags"].append(str(x)) return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.tags = data.pop("tags") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return ItemTagsComponent(**data) @property - def tags(self) -> list[Identifier | str]: + def tags(self) -> list[Identifier]: """An array that can contain multiple item tags., defaults to None""" return getattr(self, "_tags", []) @tags.setter - def tags(self, value: list[Identifier | str]): + def tags(self, value: list[Identifiable]): if value is None: self.tags = [] return @@ -1137,13 +1202,27 @@ def tags(self, value: list[Identifier | str]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) - setattr(self, "_tags", value) + v = [Identifiable.of(x) for x in value] + self.on_update("tags", v) + setattr(self, "_tags", v) + + def get_tag(self, index: int) -> Identifier: + return getitem(self, "tags", index) + + def add_tag(self, tag: Identifiable) -> Identifier: + return additem(self, "tags", Identifiable.of(tag)) + + def remove_tag(self, index: int) -> Identifier: + return removeitem(self, "tags", index) + + def clear_tags(self) -> Self: + return clearitems(self, "tags") @item_component_type class ThrowableComponent(ItemComponent): """ - Throwable item component. Throwable items, such as a snowball. + Throwable item component. Throwable items, such as a snowball. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_throwable?view=minecraft-bedrock-stable) """ id = Identifier("throwable") @@ -1164,8 +1243,7 @@ def __init__( self.min_draw_duration = min_draw_duration self.scale_power_by_draw_duration = scale_power_by_draw_duration - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = { "do_swing_animation": self.do_swing_animation, "launch_power_scale": self.launch_power_scale, @@ -1176,16 +1254,9 @@ def __dict__(self) -> dict: } return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.do_swing_animation = data.pop("do_swing_animation") - self.launch_power_scale = data.pop("launch_power_scale") - self.max_draw_duration = data.pop("max_draw_duration") - self.max_launch_power = data.pop("max_launch_power") - self.min_draw_duration = data.pop("min_draw_duration") - self.scale_power_by_draw_duration = data.pop("scale_power_by_draw_duration") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return ThrowableComponent(**data) @property def do_swing_animation(self) -> bool: @@ -1198,6 +1269,7 @@ def do_swing_animation(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("do_swing_animation", value) setattr(self, "_do_swing_animation", value) @property @@ -1211,6 +1283,7 @@ def launch_power_scale(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("launch_power_scale", value) setattr(self, "_launch_power_scale", value) @property @@ -1224,7 +1297,9 @@ def max_draw_duration(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_max_draw_duration", float(value)) + v = float(value) + self.on_update("max_draw_duration", v) + setattr(self, "_max_draw_duration", v) @property def max_launch_power(self) -> float: @@ -1237,7 +1312,9 @@ def max_launch_power(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_max_launch_power", float(value)) + v = float(value) + self.on_update("max_launch_power", v) + setattr(self, "_max_launch_power", v) @property def min_draw_duration(self) -> float: @@ -1250,7 +1327,9 @@ def min_draw_duration(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_min_draw_duration", float(value)) + v = float(value) + self.on_update("min_draw_duration", v) + setattr(self, "_min_draw_duration", v) @property def scale_power_by_draw_duration(self) -> bool: @@ -1263,33 +1342,33 @@ def scale_power_by_draw_duration(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("scale_power_by_draw_duration", value) setattr(self, "_scale_power_by_draw_duration", value) @item_component_type class UseAnimationComponent(SimpleItemComponent): """ - This component determines which animation plays when using the item. + This component determines which animation plays when using the item. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_use_animation?view=minecraft-bedrock-stable) """ id = Identifier("use_animation") clazz = UseAnimation - @property - def __dict__(self) -> str: - return self.value._value_ + def jsonify(self) -> str: + return self.value.jsonify() - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.value = UseAnimation[data] - return self + @staticmethod + def from_dict(data: UseAnimation | str) -> Self: + if isinstance(data, str): + data = UseAnimation.from_dict(data) + return UseAnimationComponent(data) @item_component_type class UseModifiersComponent(ItemComponent): """ - This component modifies use effects, including how long the item takes to use and the player's speed when used in combination with components like Shooter, Throwable or Food. + This component modifies use effects, including how long the item takes to use and the player's speed when used in combination with components like Shooter, Throwable or Food. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_use_modifiers?view=minecraft-bedrock-stable) """ id = Identifier("use_modifiers") @@ -1298,20 +1377,16 @@ def __init__(self, movement_modifier: float, use_duration: float): self.movement_modifier = movement_modifier self.use_duration = use_duration - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = { "movement_modifier": self.movement_modifier, "use_duration": self.use_duration, } return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.movement_modifier = data.pop("movement_modifier") - self.use_duration = data.pop("use_duration") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return UseModifiersComponent(**data) @property def movement_modifier(self) -> float: @@ -1324,7 +1399,9 @@ def movement_modifier(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_movement_modifier", float(value)) + v = float(value) + self.on_update("movement_modifier", v) + setattr(self, "_movement_modifier", v) @property def use_duration(self) -> float: @@ -1337,13 +1414,15 @@ def use_duration(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_use_duration", float(value)) + v = float(value) + self.on_update("use_duration", v) + setattr(self, "_use_duration", v) @item_component_type class WearableComponent(ItemComponent): """ - Wearable item component. + Wearable item component. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemcomponents/minecraft_wearable?view=minecraft-bedrock-stable) """ id = Identifier("wearable") @@ -1352,17 +1431,13 @@ def __init__(self, protection: int, slot: int): self.protection = protection self.slot = slot - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"protection": self.protection, "slot": self.slot} return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.protection = data.pop("protection") - self.slot = data.pop("slot") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return WearableComponent(**data) @property def protection(self) -> int: @@ -1375,6 +1450,7 @@ def protection(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("protection", value) setattr(self, "_protection", value) @property @@ -1388,6 +1464,7 @@ def slot(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("slot", value) setattr(self, "_slot", value) @@ -1399,24 +1476,20 @@ class DiggerComponent(ItemComponent): id = Identifier("digger") - def __init__(self, use_efficiency: bool, destroy_speeds: list = None): + def __init__(self, use_efficiency: bool, destroy_speeds: list = []): self.destroy_speeds = destroy_speeds self.use_efficiency = use_efficiency - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = { "destroy_speeds": self.destroy_speeds, "use_efficiency": self.use_efficiency, } return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.destroy_speeds = data.pop("destroy_speeds") - self.use_efficiency = data.pop("use_efficiency") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return DiggerComponent(**data) @property def destroy_speeds(self) -> list: @@ -1425,13 +1498,11 @@ def destroy_speeds(self) -> list: @destroy_speeds.setter def destroy_speeds(self, value: list): - if value is None: - self.destroy_speeds = [] - return if not isinstance(value, list): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("destroy_speeds", value) setattr(self, "_destroy_speeds", value) @property @@ -1445,6 +1516,7 @@ def use_efficiency(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("use_efficiency", value) setattr(self, "_use_efficiency", value) @@ -1453,18 +1525,35 @@ def use_efficiency(self, value: bool): @item_component_type class UseDurationComponent(SimpleItemComponent): + """desc""" + id = Identifier("use_duration") clazz = int + @staticmethod + def from_dict(data: int) -> Self: + return UseDurationComponent(data) + @item_component_type class BlockComponent2(SimpleItemComponent): + """desc""" + id = Identifier("block") - clazz = Identifier + clazz = Identifiable + + def jsonify(self) -> dict: + return str(self.value) + + @staticmethod + def from_dict(data: Identifiable) -> Self: + return BlockComponent2(Identifiable.of(data)) @item_component_type class CameraComponent(ItemComponent): + """desc""" + id = Identifier("camera") def __init__( @@ -1472,9 +1561,9 @@ def __init__( black_bars_duration: float, black_bars_screen_ratio: float, shutter_duration: float, - shutter_screen_ratio: float, picture_duration: float, slide_away_duration: float, + shutter_screen_ratio: float = 0.0, ): self.black_bars_duration = black_bars_duration self.black_bars_screen_ratio = black_bars_screen_ratio @@ -1483,8 +1572,7 @@ def __init__( self.picture_duration = picture_duration self.slide_away_duration = slide_away_duration - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = { "black_bars_duration": self.black_bars_duration, "black_bars_screen_ratio": self.black_bars_screen_ratio, @@ -1496,17 +1584,9 @@ def __dict__(self) -> dict: data["shutter_screen_ratio"] = self.shutter_screen_ratio return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.black_bars_duration = data.pop("black_bars_duration") - self.black_bars_screen_ratio = data.pop("black_bars_screen_ratio") - self.shutter_duration = data.pop("shutter_duration") - self.picture_duration = data.pop("picture_duration") - self.slide_away_duration = data.pop("slide_away_duration") - if "shutter_screen_ratio" in data: - self.shutter_screen_ratio = data.pop("shutter_screen_ratio") - return self + @staticmethod + def from_dict(data: dict) -> Self: + return CameraComponent(**data) @property def black_bars_duration(self) -> float: @@ -1518,7 +1598,9 @@ def black_bars_duration(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_black_bars_duration", float(value)) + v = float(value) + self.on_update("black_bars_duration", v) + setattr(self, "_black_bars_duration", v) @property def black_bars_screen_ratio(self) -> float: @@ -1530,7 +1612,9 @@ def black_bars_screen_ratio(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_black_bars_screen_ratio", float(value)) + v = float(value) + self.on_update("black_bars_screen_ratio", v) + setattr(self, "_black_bars_screen_ratio", v) @property def shutter_duration(self) -> float: @@ -1542,7 +1626,9 @@ def shutter_duration(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_shutter_duration", float(value)) + v = float(value) + self.on_update("shutter_duration", v) + setattr(self, "_shutter_duration", v) @property def shutter_screen_ratio(self) -> float: @@ -1554,7 +1640,9 @@ def shutter_screen_ratio(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_shutter_screen_ratio", float(value)) + v = float(value) + self.on_update("shutter_screen_ratio", v) + setattr(self, "_shutter_screen_ratio", v) @property def picture_duration(self) -> float: @@ -1566,7 +1654,9 @@ def picture_duration(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_picture_duration", float(value)) + v = float(value) + self.on_update("picture_duration", v) + setattr(self, "_picture_duration", v) @property def slide_away_duration(self) -> float: @@ -1578,56 +1668,123 @@ def slide_away_duration(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_slide_away_duration", float(value)) + v = float(value) + self.on_update("slide_away_duration", v) + setattr(self, "_slide_away_duration", v) @item_component_type class PortfolioComponent(EmptyItemComponent): + """desc""" + id = Identifier("portfolio") @item_component_type class FoilComponent(EmptyItemComponent): + """desc""" + id = Identifier("foil") clazz = bool @item_component_type class SeedComponent(ItemComponent): + """desc""" + id = Identifier("seed") - def __init__(self, crop_result: Identifier): + def __init__( + self, + crop_result: Identifiable, + plant_at_any_solid_surface: bool = None, + plant_at_face: bool = None, + plant_at: list[Identifiable] = [], + ): self.crop_result = crop_result + self.plant_at = plant_at + self.plant_at_any_solid_surface = plant_at_any_solid_surface + self.plant_at_face = plant_at_face + + def jsonify(self) -> dict: + data = {"crop_result": str(self.crop_result)} + if self.plant_at_any_solid_surface is not None: + data["plant_at_any_solid_surface"] = self.plant_at_any_solid_surface + if self.plant_at_face is not None: + data["plant_at_face"] = self.plant_at_face + if len(self.plant_at) >= 1: + data["plant_at"] = [str(x) for x in self.plant_at] + return data + + @staticmethod + def from_dict(data: dict) -> Self: + if "plant_at" in data: + if isinstance(data["plant_at"], str): + data["plant_at"] = [data["plant_at"]] + return SeedComponent(**data) @property - def __dict__(self) -> dict: - data = {"crop_result": self.crop_result} - return data + def plant_at_face(self) -> str: + return getattr(self, "_plant_at_face", None) - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) - self.crop_result = data.pop("crop_result") - return self + @plant_at_face.setter + def plant_at_face(self, value: str): + if not isinstance(value, str) and value is not None: + raise TypeError( + f"Expected str but got '{value.__class__.__name__}' instead" + ) + self.on_update("plant_at_face", value) + setattr(self, "_plant_at_face", value) + + @property + def plant_at_any_solid_surface(self) -> bool: + return getattr(self, "_plant_at_any_solid_surface", None) + + @plant_at_any_solid_surface.setter + def plant_at_any_solid_surface(self, value: bool): + if not isinstance(value, bool) and value is not None: + raise TypeError( + f"Expected bool but got '{value.__class__.__name__}' instead" + ) + self.on_update("plant_at_any_solid_surface", value) + setattr(self, "_plant_at_any_solid_surface", value) @property def crop_result(self) -> Identifier: return getattr(self, "_crop_result") @crop_result.setter - def crop_result(self, value: Identifier): - if not isinstance(value, (Identifier, str)): + def crop_result(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("crop_result", id) + setattr(self, "_crop_result", id) + + @property + def plant_at(self) -> list[Identifier]: + return getattr2(self, "_plant_at", []) + + @plant_at.setter + def plant_at(self, value: list[Identifiable]): + if not isinstance(value, list): raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" + f"Expected list but got '{value.__class__.__name__}' instead" ) - setattr(self, "_crop_result", Identifier(value)) + v = [Identifiable.of(x) for x in value] + self.on_update("plant_at", v) + setattr(self, "_plant_at", v) @item_component_type class MaxDamageComponent(SimpleItemComponent): + """desc""" + id = Identifier("max_damage") clazz = int + @staticmethod + def from_dict(data: int) -> Self: + return MaxDamageComponent(data) + @dataclass class ItemSettings: @@ -1637,7 +1794,7 @@ class ItemSettings: max_count: int = None max_damage: int = None - recipe_remainder: Identifier = None + recipe_remainder: Identifiable = None color: str = None def set_count(self, max_count: int) -> Self: @@ -1656,23 +1813,37 @@ def rarity(self, color: str) -> Self: self.color = color return self + def build(self, item): + if self.max_count is not None: + item.add_component(MaxStackSizeComponent(self.max_count)) + + if self.max_damage is not None: + item.add_component(MaxDamageComponent(self.max_damage)) + + if self.recipe_remainder is not None: + item.recipe_remainder = self.recipe_remainder + + if self.color is not None: + item.add_component(HoverTextColorComponent(self.color)) + return item + +@resource_pack +@behavior_pack class Item(JsonFile, Identifiable): """ - Represents an Item. + Represents a data-driven Item. [MS Docs](https://learn.microsoft.com/en-us/minecraft/creator/reference/content/itemreference/examples/itemdefinition?view=minecraft-bedrock-stable) """ id = Identifier("item") - EXTENSION: str = ".json" - FILENAME: str = "item" - DIRNAME: str = "items" + FILEPATH = "items/item.json" def __init__( self, - identifier: Identifier, + identifier: Identifiable, menu_category: MenuCategory = None, - components: dict[Identifier, ItemComponent] = None, - events: dict[Identifier, Event] = None, + components: dict[Identifiable, ItemComponent] = None, + events: dict[Identifiable, Event] = None, ): Identifiable.__init__(self, identifier) self.menu_category = menu_category @@ -1685,23 +1856,22 @@ def __repr__(self) -> str: def __str__(self) -> str: return "Item{" + str(self.identifier) + "}" - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: item = {"description": {"identifier": str(self.identifier)}} if self.menu_category: - item["description"]["menu_category"] = self.menu_category.__dict__ + item["description"]["menu_category"] = self.menu_category.jsonify() if self.components: item["components"] = {} for k, v in self.components.items(): - item["components"][str(k)] = v.__dict__ + item["components"][str(k)] = v.jsonify() if self.events: item["events"] = {} for key, events in self.events.items(): d = {} for k, v in events.items(): - d[k.path] = v.__dict__ + d[k.path] = v.jsonify() item["events"][str(key)] = d data = {"format_version": VERSION["ITEM"], str(self.id): item} @@ -1721,6 +1891,7 @@ def menu_category(self, value: MenuCategory): raise TypeError( f"Expected MenuCategory but got '{value.__class__.__name__}' instead" ) + self.on_update("menu_category", value) setattr(self, "_menu_category", value) @property @@ -1737,6 +1908,7 @@ def components(self, value: dict[str, ItemComponent]): raise TypeError( f"Expected dict but got '{value.__class__.__name__}' instead" ) + self.on_update("components", value) setattr(self, "_components", value) @property @@ -1745,7 +1917,7 @@ def events(self) -> dict[Identifier, Event]: return getattr2(self, "_events", {}) @events.setter - def events(self, value: dict[Identifier, Event]): + def events(self, value: dict[Identifiable, Event]): if value is None: self.events = {} return @@ -1753,19 +1925,29 @@ def events(self, value: dict[Identifier, Event]): raise TypeError( f"Expected dict but got '{value.__class__.__name__}' instead" ) - setattr(self, "_events", value) + events = {} + for k, v in value.items(): + events[Identifiable.of(k)] = v + self.on_update("events", events) + setattr(self, "_events", events) @property def recipe_remainder(self) -> Identifier: - return getattr(self, "_recipe_remainder") + return getattr(self, "_recipe_remainder", None) @recipe_remainder.setter - def recipe_remainder(self, value: Identifier): - if not isinstance(value, Identifier): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_recipe_remainder", value) + def recipe_remainder(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("recipe_remainder", id) + setattr(self, "_recipe_remainder", id) + + @property + def name(self) -> str | None: + return getattr(self, "_name", None) + + @name.setter + def name(self, value: str): + setattr(self, "_name", str(value)) # Read-Only @@ -1778,72 +1960,77 @@ def max_count(self) -> int: def max_damage(self) -> int: return self.get_component("max_damage") - @classmethod - def from_dict(cls, data: dict) -> Self: + @staticmethod + def from_dict(data: dict) -> Self: loader = ItemLoader() loader.validate(data) return loader.load(data) @classmethod - def from_settings(cls, identifier: Identifier, settings: ItemSettings): + def from_settings(cls, identifier: Identifiable, settings: ItemSettings): if not isinstance(settings, ItemSettings): raise TypeError( f"Expected ItemSettings but got '{settings.__class__.__name__}' instead" ) self = cls.__new__(cls) self.identifier = identifier + return settings.build(self) - if settings.max_count is not None: - self.add_component(MaxStackSizeComponent(settings.max_count)) - - if settings.max_damage is not None: - self.add_component(MaxDamageComponent(settings.max_damage)) + def translation_key(self) -> str: + return f"item.{self.identifier}" - if settings.recipe_remainder is not None: - self.recipe_remainder = settings.recipe_remainder + def stack(self): + return ItemStack(self.identifier) - if settings.color is not None: - self.add_component(HoverTextColorComponent(settings.color)) + def display_name(self, text: str) -> Self: + """ + The name of this item in-game. + :rtype: Self + """ + self.name = text return self - def translation_key(self) -> str: - return "item." + str(self.id) + def generate(self, ctx) -> None: + """ + Called when this item is added to ResourcePack or BehaviorPack - def stack(self): - return ItemStack(self.identifier) + :type ctx: ResourcePack | BehaviorPack + """ + for c in self.components.values(): + c.generate(ctx) + for e in self.events.values(): + for ee in e.values(): + ee.generate(ctx) + if isinstance(ctx, ResourcePack) and self.name is not None: + ctx.texts[self.translation_key()] = self.name # COMPONENT def add_component(self, component: ItemComponent) -> ItemComponent: - if not isinstance(component, ItemComponent): - raise TypeError( - f"Expected ItemComponent but got '{component.__class__.__name__}' instead" - ) - self.components[component.id] = component - return component + component.generate(self) + return additem(self, "components", component, component.id, ItemComponent) - def get_component(self, id: str) -> ItemComponent: - x = id.id if isinstance(id, ItemComponent) else id - return self.components.get(x) + def get_component(self, id: Identifiable) -> ItemComponent: + return getitem(self, "components", Identifiable.of(id)) - def remove_component(self, id: str) -> ItemComponent: - x = id.id if isinstance(id, ItemComponent) else id - return self.components.pop(x) + def remove_component(self, id: Identifiable) -> ItemComponent: + return removeitem(self, "components", Identifiable.of(id)) def clear_components(self) -> Self: - self.components.clear() - return self + """Remove all components""" + return clearitems(self, "components") # EVENT - def add_event(self, id: Identifier | str, event: Event) -> Event: + def add_event(self, id: Identifiable, event: Event) -> Event: if not isinstance(event, Event): raise TypeError( f"Expected ItemEvent but got '{event.__class__.__name__}' instead" ) - i = Identifier.parse(id) + i = Identifiable.of(id) if i in self.events: + event.generate(self) self.events[i][event.id] = event return event obj = {} @@ -1852,17 +2039,24 @@ def add_event(self, id: Identifier | str, event: Event) -> Event: event.id return event - def get_event(self, id: Identifier | str) -> Event: - i = Identifier.parse(id) - return self.events.get(i) + def get_event(self, event: Identifiable) -> Event: + return getitem(self, "events", Identifiable.of(event)) - def remove_event(self, id: Identifier | str) -> Event: - i = Identifier.parse(id) - return self.events.pop(i) + def remove_event(self, event: Identifiable) -> Event: + return removeitem(self, "events", Identifiable.of(event)) def clear_events(self) -> Self: - self.events.clear() - return self + """Remove all events""" + return clearitems(self, "events") + + +class BlockItem(Item): + def __init__( + self, identifier: Identifiable, block: Identifiable, icon: str, *args, **kw + ): + Item.__init__(self, identifier, *args, **kw) + self.add_component(BlockPlacerComponent(block)) + self.add_component(IconComponent(icon)) class ItemLoader(Loader): @@ -1876,20 +2070,19 @@ def __init__(self): self.add_schema(ItemSchema2, "1.14") self.add_schema(ItemSchema2, "1.16") self.add_schema(ItemSchema2, "1.16.0") - self.add_schema(ItemSchema1, "1.20.51") + self.add_schema(ItemSchema1, "1.20.50") # UTIL -class ItemStack: - def __init__(self, item: Identifier | Item, count: int = 1, data: int = None): +class ItemStack(Misc): + def __init__(self, item: Identifiable, count: int = 1, data: int = None): self.item = item self.count = count self.data = data - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"item": str(self.item)} if self.count is not None: data["count"] = self.count @@ -1897,29 +2090,22 @@ def __dict__(self) -> dict: data["data"] = self.data return data - @classmethod - def from_dict(cls, data: dict) -> Self: - self = cls.__new__(cls) + @staticmethod + def from_dict(data: dict) -> Self: if isinstance(data, str): - self.item = data + return ItemStack(data) else: - self.item = data.pop("item") - if "count" in data: - self.count = data.pop("count") - if "data" in data: - self.data = data.pop("data") - return self + return ItemStack(**data) @property def item(self) -> Identifier: return getattr(self, "_item") @item.setter - def item(self, value: Identifier): - if isinstance(value, Item): - self.item = value.identifier - else: - setattr(self, "_item", Identifier(value)) + def item(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("item", id) + setattr(self, "_item", id) @property def count(self) -> int: @@ -1934,6 +2120,7 @@ def count(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("count", value) setattr(self, "_count", value) @property @@ -1949,4 +2136,5 @@ def data(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("data", value) setattr(self, "_data", value) diff --git a/mcaddon/loot.py b/mcaddon/loot.py index 02e2451..377338b 100644 --- a/mcaddon/loot.py +++ b/mcaddon/loot.py @@ -1,15 +1,28 @@ from typing import Self +import os +from .pack import behavior_pack from .exception import TypeNotFoundError -from .constant import Destination, LootContextType +from .constant import Destination from .registry import INSTANCE, Registries from .file import JsonFile -from .util import getattr2, Identifier, Identifiable +from .util import ( + getattr2, + getitem, + removeitem, + clearitems, + additem, + Identifier, + Identifiable, + Misc, +) from .block import Block from .item import Item +# TODO: Needs get, add, remove, and clear methods -class LootNumberProvider: + +class LootNumberProvider(Misc): def __init__(self, min: float, max: float = None): """ :param min: the minimum value @@ -20,8 +33,7 @@ def __init__(self, min: float, max: float = None): self.min = min self.max = max - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {} if self.min: data["min"] = self.min @@ -51,7 +63,9 @@ def min(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_min", float(value)) + v = float(value) + self.on_update("min", v) + setattr(self, "_min", v) @property def max(self) -> float: @@ -66,28 +80,31 @@ def max(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_max", float(value)) + v = float(value) + self.on_update("max", v) + setattr(self, "_max", v) -class Enchant: - def __init__(self, id: Identifier, levels: LootNumberProvider): +class Enchant(Misc): + def __init__(self, id: Identifiable, levels: LootNumberProvider): """ An enchantment :param id: an enchantment ID - :type id: Identifier + :type id: Identifiable :param levels: the level of the enchantment :type levels: LootNumberProvider """ self.id = id self.levels = levels - @property - def __dict__(self) -> dict: - data = { - "id": str(self.id), - "levels": {"range_min": self.levels.min, "range_max": self.levels.max}, - } + def jsonify(self) -> dict: + data = {"id": str(self.id)} + if self.levels: + data["levels"] = { + "range_min": self.levels.min, + "range_max": self.levels.max, + } return data @classmethod @@ -99,14 +116,50 @@ def from_dict(cls, data: dict) -> Self: self.levels = LootNumberProvider.from_dict(data.pop("levels")) return self + @property + def id(self) -> Identifier: + return getattr(self, "_id") + + @id.setter + def id(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("id", id) + setattr(self, "_id", id) + + @property + def levels(self) -> LootNumberProvider: + return getattr(self, "_levels", None) + + @levels.setter + def levels(self, value: LootNumberProvider): + if not isinstance(value, LootNumberProvider): + raise TypeError( + f"Expected LootNumberProvider but got '{value.__class__.__name__}' instead" + ) + self.on_update("levels", value) + setattr(self, "_levels", value) + # CONDITIONS # https://learn.microsoft.com/en-us/minecraft/creator/documents/loottableconditions?view=minecraft-bedrock-stable -class LootCondition: +class LootCondition(Misc): + def __call__(self, ctx) -> int: + return self.execute(ctx) + @property - def __dict__(self) -> dict: + def id(self) -> Identifier: + return getattr(self, "_id") + + @id.setter + def id(self, value: Identifier): + setattr(self, "_id", Identifier.of(value)) + + def execute(self, ctx) -> int: + return 0 + + def jsonify(self) -> dict: data = {"condition": str(self.id)} return data @@ -128,7 +181,7 @@ def wrapper(): @loot_condition -class HasMarkvariantLootCondition(LootCondition): +class HasMarkVariantLootCondition(LootCondition): id = Identifier("has_mark_variant") def __init__(self, value: int): @@ -137,9 +190,43 @@ def __init__(self, value: int): """ self.value = value + def jsonify(self) -> dict: + data = super().jsonify() + data["value"] = self.value + return data + + @classmethod + def from_dict(cls, data: dict) -> Self: + self = cls.__new__(cls) + self.value = data.pop("value") + return self + @property - def __dict__(self) -> dict: - data = super().__dict__ + def value(self) -> int: + return getattr(self, "_value") + + @value.setter + def value(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + self.on_update("value", value) + setattr(self, "_value", value) + + +@loot_condition +class HasVariantLootCondition(LootCondition): + id = Identifier("has_variant") + + def __init__(self, value: int): + """ + Specifies that there are different variations for the loot + """ + self.value = value + + def jsonify(self) -> dict: + data = super().jsonify() data["value"] = self.value return data @@ -159,6 +246,7 @@ def value(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("value", value) setattr(self, "_value", value) @@ -188,9 +276,8 @@ def __init__(self, chance: float): """ self.chance = chance - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["chance"] = self.chance return data @@ -210,7 +297,9 @@ def chance(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_chance", float(value)) + v = float(value) + self.on_update("chance", v) + setattr(self, "_chance", v) @loot_condition @@ -224,9 +313,8 @@ def __init__(self, chance: float, looting_multiplier: float): self.chance = chance self.looting_multiplier = looting_multiplier - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["chance"] = self.chance data["looting_multiplier"] = self.looting_multiplier return data @@ -248,7 +336,9 @@ def chance(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_chance", float(value)) + v = float(value) + self.on_update("chance", v) + setattr(self, "_chance", v) @property def looting_multiplier(self) -> float: @@ -260,7 +350,9 @@ def looting_multiplier(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_looting_multiplier", float(value)) + v = float(value) + self.on_update("looting_multiplier", v) + setattr(self, "_looting_multiplier", v) @loot_condition @@ -275,9 +367,8 @@ def __init__(self, default_chance: float, peaceful: float, hard: float): self.peaceful = peaceful self.hard = hard - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["default_chance"] = self.default_chance if self.peaceful: data["peaceful"] = self.peaceful @@ -305,11 +396,13 @@ def default_chance(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_default_chance", float(value)) + v = float(value) + self.on_update("default_chance", v) + setattr(self, "_default_chance", v) @property def peaceful(self) -> float: - return getattr(self, "_peaceful") + return getattr(self, "_peaceful", None) @peaceful.setter def peaceful(self, value: float): @@ -317,11 +410,13 @@ def peaceful(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_peaceful", float(value)) + v = float(value) + self.on_update("peaceful", v) + setattr(self, "_peaceful", v) @property def hard(self) -> float: - return getattr(self, "_hard") + return getattr(self, "_hard", None) @hard.setter def hard(self, value: float): @@ -329,7 +424,9 @@ def hard(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_hard", float(value)) + v = float(value) + self.on_update("hard", v) + setattr(self, "_hard", v) @loot_condition @@ -342,9 +439,8 @@ def __init__(self, max_chance: float): """ self.max_chance = max_chance - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["max_chance"] = self.max_chance return data @@ -364,7 +460,9 @@ def max_chance(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_max_chance", float(value)) + v = float(value) + self.on_update("max_chance", v) + setattr(self, "_max_chance", v) @loot_condition @@ -373,7 +471,7 @@ class MatchToolLootCondition(LootCondition): def __init__( self, - item: Identifier, + item: Identifiable, count: LootNumberProvider, durability: LootNumberProvider, enchantments: list[Enchant], @@ -382,7 +480,7 @@ def __init__( Checks whether the tool (or weapon/item the player is using) used to make the loot drop matches the modifier conditions provided. The predicates used are: count, durability, enchantments, and item :param item: An item ID - :type item: Identifier + :type item: Identifiable :param count: amount of the item :type count: LootNumberProvider :param durability: the durability of the item @@ -395,9 +493,8 @@ def __init__( self.durability = durability self.enchantments = enchantments - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() if self.item: data["item"] = str(self.item) if self.count: @@ -408,7 +505,7 @@ def __dict__(self) -> dict: "range_max": self.durability.max, } if self.enchantments: - data["enchantments"] = [x.__dict__ for x in self.enchantments] + data["enchantments"] = [x.jsonify() for x in self.enchantments] return data @classmethod @@ -429,12 +526,10 @@ def item(self) -> Identifier: return getattr(self, "_item") @item.setter - def item(self, value: Identifier): - if not isinstance(value, Identifier): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_item", value) + def item(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("item", id) + setattr(self, "_item", id) @property def count(self) -> LootNumberProvider: @@ -446,6 +541,7 @@ def count(self, value: LootNumberProvider): raise TypeError( f"Expected LootNumberProvider but got '{value.__class__.__name__}' instead" ) + self.on_update("count", value) setattr(self, "_count", value) @property @@ -458,6 +554,7 @@ def durability(self, value: LootNumberProvider): raise TypeError( f"Expected LootNumberProvider but got '{value.__class__.__name__}' instead" ) + self.on_update("durability", value) setattr(self, "_durability", value) @property @@ -470,19 +567,61 @@ def enchantments(self, value: list[Enchant]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("enchantments", value) setattr(self, "_enchantments", value) + def get_enchantment(self, index: int) -> Enchant: + return getitem(self, "enchantments", index) + + def add_enchantment(self, enchant: Enchant) -> Enchant: + return additem(self, "enchantments", enchant) + + def remove_enchantment(self, index: int) -> Enchant: + return removeitem(self, "enchantments", index) + + def clear_enchantments(self) -> Self: + """Remove all enchantments""" + return clearitems(self, "enchantments") + @loot_condition class KilledByEntityLootCondition(LootCondition): id = Identifier("killed_by_entity") - def __init__(self, entity_type: Identifier): + def __init__(self, entity_type: Identifiable): self.entity_type = entity_type + def jsonify(self) -> dict: + data = super().jsonify() + data["entity_type"] = str(self.entity_type) + return data + + @classmethod + def from_dict(cls, data: dict) -> Self: + self = cls.__new__(cls) + self.entity_type = data.pop("entity_type") + return self + @property - def __dict__(self) -> dict: - data = super().__dict__ + def entity_type(self) -> Identifier: + return getattr(self, "_entity_type") + + @entity_type.setter + def entity_type(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("entity_type", id) + setattr(self, "_entity_type", id) + + +@loot_condition +class EntityKilledLootCondition(LootCondition): + id = Identifier("entity_killed") + + def __init__(self, entity_type: Identifiable): + self.entity_type = entity_type + + def jsonify(self) -> dict: + data = super().jsonify() data["entity_type"] = str(self.entity_type) return data @@ -497,12 +636,10 @@ def entity_type(self) -> Identifier: return getattr(self, "_entity_type") @entity_type.setter - def entity_type(self, value: Identifier): - if not isinstance(value, Identifier): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_entity_type", value) + def entity_type(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("entity_type", id) + setattr(self, "_entity_type", id) @loot_condition @@ -522,12 +659,26 @@ def from_dict(cls, data: dict) -> Self: # https://learn.microsoft.com/en-us/minecraft/creator/documents/lootandtradetablefunctions?view=minecraft-bedrock-stable -class LootFunction: +class LootFunction(Misc): + + def __call__(self, ctx) -> int: + return self.execute(ctx) + @property - def __dict__(self) -> dict: + def id(self) -> Identifier: + return getattr(self, "_id") + + @id.setter + def id(self, value: Identifier): + setattr(self, "_id", Identifier.of(value)) + + def jsonify(self) -> dict: data = {"function": str(self.id)} return data + def execute(self, ctx) -> int: + return 0 + INSTANCE.create_registry(Registries.LOOT_FUNCTION_TYPE, LootFunction) @@ -565,9 +716,8 @@ def __init__( self.per_level_random_cost = per_level_random_cost self.per_level_cost = per_level_cost - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["base_cost"] = self.base_cost data["base_random_cost"] = self.base_random_cost data["per_level_random_cost"] = self.per_level_random_cost @@ -593,6 +743,7 @@ def base_cost(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("base_cost", value) setattr(self, "_base_cost", value) @property @@ -605,6 +756,7 @@ def base_random_cost(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("base_random_cost", value) setattr(self, "_base_random_cost", value) @property @@ -617,6 +769,7 @@ def per_level_random_cost(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("per_level_random_cost", value) setattr(self, "_per_level_random_cost", value) @property @@ -629,9 +782,72 @@ def per_level_cost(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("per_level_cost", value) setattr(self, "_per_level_cost", value) +class StewEffect: + def __init__(self, id: int): + self.id = id + + @classmethod + def from_dict(cls, data: dict) -> Self: + self = cls.__new__(cls) + self.id = data["id"] + return self + + def jsonify(self) -> dict: + data = {"id": self.id} + return data + + +@loot_function +class SetStewEffectLootFunction(LootFunction): + id = Identifier("set_stew_effect") + + def __init__(self, effects: list[StewEffect]): + """ + This function sets stew effects on a suspicious_stew item. + """ + self.effects = effects + + def jsonify(self) -> dict: + data = super().jsonify() + data["effects"] = [x.jsonify() for x in self.effects] + return data + + @classmethod + def from_dict(cls, data: dict) -> Self: + self = cls.__new__(cls) + self.effects = [StewEffect.from_dict(x) for x in data.pop("effects")] + return self + + @property + def effects(self) -> list[StewEffect]: + return getattr(self, "_effects") + + @effects.setter + def effects(self, value: list[StewEffect]): + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + self.on_update("effects", value) + setattr(self, "_effects", value) + + def get_effect(self, index: int) -> StewEffect: + return getitem(self, "effects", index) + + def add_effect(self, effect: StewEffect) -> StewEffect: + return additem(self, "effects", effect, type=StewEffect) + + def remove_effect(self, index: int) -> StewEffect: + return removeitem(self, "effects", index) + + def clear_effects(self) -> Self: + return clearitems(self, "effects") + + @loot_function class EnchantRandomGearLootFunction(LootFunction): id = Identifier("enchant_random_gear") @@ -642,9 +858,8 @@ def __init__(self, chance: float): """ self.chance = chance - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["chance"] = self.chance return data @@ -664,7 +879,9 @@ def chance(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_chance", float(value)) + v = float(value) + self.on_update("chance", v) + setattr(self, "_chance", v) @loot_function @@ -677,21 +894,21 @@ def __init__(self, treasure: bool): """ self.treasure = treasure - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["treasure"] = self.treasure return data @classmethod def from_dict(cls, data: dict) -> Self: self = cls.__new__(cls) - self.treasure = data.pop("treasure") + if "treasure" in data: + self.treasure = data.pop("treasure") return self @property def treasure(self) -> bool: - return getattr(self, "_treasure") + return getattr(self, "_treasure", False) @treasure.setter def treasure(self, value: bool): @@ -699,6 +916,7 @@ def treasure(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("treasure", value) setattr(self, "_treasure", value) @@ -713,11 +931,10 @@ def __init__(self, treasure: bool, levels: LootNumberProvider): self.treasure = treasure self.levels = levels - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["treasure"] = self.treasure - data["levels"] = self.levels.__dict__ + data["levels"] = self.levels.jsonify() return data @classmethod @@ -737,6 +954,7 @@ def treasure(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("treasure", value) setattr(self, "_treasure", value) @property @@ -749,6 +967,7 @@ def levels(self, value: LootNumberProvider): raise TypeError( f"Expected LootNumberProvider but got '{value.__class__.__name__}' instead" ) + self.on_update("levels", value) setattr(self, "_levels", value) @@ -756,16 +975,15 @@ def levels(self, value: LootNumberProvider): class SpecificEnchantsLootFunction(LootFunction): id = Identifier("specific_enchants") - def __init__(self, enchants: list[Identifier | Enchant]): + def __init__(self, enchants: list[Enchant] = []): """ This function allows you to set a list of specific enchantments on an item. It also allows you to apply enchantments to items that wouldn't normally be enchantable in-game. """ self.enchants = enchants - @property - def __dict__(self) -> dict: - data = super().__dict__ - data["enchants"] = [x.__dict__ for x in self.enchants] + def jsonify(self) -> dict: + data = super().jsonify() + data["enchants"] = [x.jsonify() for x in self.enchants] return data @classmethod @@ -775,17 +993,31 @@ def from_dict(cls, data: dict) -> Self: return self @property - def enchantments(self) -> list[Identifier | Enchant]: + def enchantments(self) -> list[Enchant]: return getattr(self, "_enchantments") @enchantments.setter - def enchantments(self, value: list[Identifier | Enchant]): + def enchantments(self, value: list[Enchant]): if not isinstance(value, list): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("enchantments", value) setattr(self, "_enchantments", value) + def get_enchantment(self, index: int) -> Enchant: + return getitem(self, "enchantments", index) + + def add_enchantment(self, enchant: Enchant) -> Enchant: + return additem(self, "enchantments", enchant) + + def remove_enchantment(self, index: int) -> Enchant: + return removeitem(self, "enchantments", index) + + def clear_enchantments(self) -> Self: + """Remove all enchantments""" + return clearitems(self, "enchantments") + # loot table only @loot_function @@ -798,10 +1030,9 @@ def __init__(self, count: LootNumberProvider): """ self.count = count - @property - def __dict__(self) -> dict: - data = super().__dict__ - data["count"] = self.count.__dict__ + def jsonify(self) -> dict: + data = super().jsonify() + data["count"] = self.count.jsonify() return data @classmethod @@ -820,6 +1051,7 @@ def count(self, value: LootNumberProvider): raise TypeError( f"Expected LootNumberProvider but got '{value.__class__.__name__}' instead" ) + self.on_update("count", value) setattr(self, "_count", value) @@ -833,10 +1065,9 @@ def __init__(self, values: LootNumberProvider): """ self.values = values - @property - def __dict__(self) -> dict: - data = super().__dict__ - data["values"] = self.values.__dict__ + def jsonify(self) -> dict: + data = super().jsonify() + data["values"] = self.values.jsonify() return data @classmethod @@ -855,25 +1086,25 @@ def values(self, value: LootNumberProvider): raise TypeError( f"Expected LootNumberProvider but got '{value.__class__.__name__}' instead" ) + self.on_update("values", value) setattr(self, "_values", value) @loot_function -class RandomBlockStateLootFunction(LootFunction): +class RandomBlockPropertyLootFunction(LootFunction): id = Identifier("random_block_state") - def __init__(self, block_state: Identifier, values: LootNumberProvider): + def __init__(self, block_state: Identifiable, values: LootNumberProvider): """ This allows you to randomize the block state of the resulting item. For instance, the following example code can drop stone (0), granite (1), polished granite (2), diorite (3), polished diorite (4), or andesite (5). """ self.block_state = block_state self.values = values - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["block_state"] = str(self.block_state) - data["values"] = self.values.__dict__ + data["values"] = self.values.jsonify() return data @classmethod @@ -888,12 +1119,10 @@ def block_state(self) -> Identifier: return getattr(self, "_block_state") @block_state.setter - def block_state(self, value: Identifier): - if not isinstance(value, (Identifier, str)): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_block_state", Identifier(value)) + def block_state(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("block_state", id) + setattr(self, "_block_state", id) @property def values(self) -> LootNumberProvider: @@ -905,6 +1134,7 @@ def values(self, value: LootNumberProvider): raise TypeError( f"Expected LootNumberProvider but got '{value.__class__.__name__}' instead" ) + self.on_update("values", value) setattr(self, "_values", value) @@ -928,15 +1158,14 @@ def from_dict(cls, data: dict) -> Self: class SetActorIdLootFunction(LootFunction): id = Identifier("set_actor_id") - def __init__(self, actor_id: Identifier): + def __init__(self, actor_id: Identifiable): """ This function only works with a spawn egg and is used to set the entity ID of that spawn egg. """ self.actor_id = actor_id - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["id"] = str(self.actor_id) return data @@ -951,12 +1180,10 @@ def actor_id(self) -> Identifier: return getattr(self, "_actor_id") @actor_id.setter - def actor_id(self, value: Identifier): - if not isinstance(value, (Identifier, str)): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_actor_id", Identifier(value)) + def actor_id(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("actor_id", id) + setattr(self, "_actor_id", id) @loot_function @@ -969,9 +1196,8 @@ def __init__(self, type: int): """ self.type = type - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["type"] = self.type return data @@ -991,6 +1217,7 @@ def type(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("type", value) setattr(self, "_type", value) @@ -1006,9 +1233,8 @@ def __init__(self, author: str, title: str, pages: list[str]): self.title = title self.pages = pages - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["author"] = self.author data["title"] = self.title data["pages"] = self.pages @@ -1028,7 +1254,9 @@ def author(self) -> str: @author.setter def author(self, value: str): - setattr(self, "_author", str(value)) + v = str(value) + self.on_update("author", v) + setattr(self, "_author", v) @property def title(self) -> str: @@ -1036,7 +1264,9 @@ def title(self) -> str: @title.setter def title(self, value: str): - setattr(self, "_title", str(value)) + v = str(value) + self.on_update("title", v) + setattr(self, "_title", v) @property def pages(self) -> list[str]: @@ -1048,8 +1278,22 @@ def pages(self, value: list[str]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("pages", value) setattr(self, "_pages", value) + def get_page(self, index: int) -> str: + return getitem(self, "pages", index) + + def add_page(self, page: str): + return additem(self, "pages", str(page)) + + def remove_page(self, index: int) -> str: + return removeitem(self, "pages", index) + + def clear_pages(self) -> Self: + """Remove all pages""" + return clearitems(self, "pages") + @loot_function class SetCountLootFunction(LootFunction): @@ -1061,10 +1305,9 @@ def __init__(self, count: LootNumberProvider): """ self.count = count - @property - def __dict__(self) -> dict: - data = super().__dict__ - data["count"] = self.count.__dict__ + def jsonify(self) -> dict: + data = super().jsonify() + data["count"] = self.count.jsonify() return data @classmethod @@ -1083,6 +1326,7 @@ def count(self, value: LootNumberProvider): raise TypeError( f"Expected LootNumberProvider but got '{value.__class__.__name__}' instead" ) + self.on_update("count", value) setattr(self, "_count", value) @@ -1096,10 +1340,9 @@ def __init__(self, damage: LootNumberProvider): """ self.damage = damage - @property - def __dict__(self) -> dict: - data = super().__dict__ - data["damage"] = self.damage.__dict__ + def jsonify(self) -> dict: + data = super().jsonify() + data["damage"] = self.damage.jsonify() return data @classmethod @@ -1118,6 +1361,7 @@ def damage(self, value: LootNumberProvider): raise TypeError( f"Expected LootNumberProvider but got '{value.__class__.__name__}' instead" ) + self.on_update("damage", value) setattr(self, "_damage", value) @@ -1131,9 +1375,8 @@ def __init__(self, data: int): """ self.data = data - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["data"] = self.data return data @@ -1149,10 +1392,11 @@ def data(self) -> int: @data.setter def data(self, value: int): - if not isinstance(value, int): + if not isinstance(value, (int, dict)): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("data", value) setattr(self, "_data", value) @@ -1176,15 +1420,14 @@ def from_dict(cls, data: dict) -> Self: class SetLoreLootFunction(LootFunction): id = Identifier("set_lore") - def __init__(self, lore: list[str]): + def __init__(self, lore: list[str] = []): """ This function allows you to set the lore of an item. Each line within the lore object represents a single line of text. There's currently no support for rawtext. """ self.lore = lore - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["lore"] = self.lore return data @@ -1204,8 +1447,22 @@ def lore(self, value: list[str]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("lore", value) setattr(self, "_lore", value) + def get_lore(self, index: int) -> str: + return getitem(self, "lore", index) + + def add_lore(self, text: str) -> str: + return additem(self, "lore", str(text)) + + def remove_lore(self, index: int) -> str: + return removeitem(self, "lore", index) + + def clear_lores(self) -> Self: + """Remove all lore""" + return clearitems(self, "lore") + @loot_function class SetNameLootFunction(LootFunction): @@ -1217,9 +1474,8 @@ def __init__(self, name: str): """ self.name = name - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["name"] = self.name return data @@ -1235,7 +1491,9 @@ def name(self) -> str: @name.setter def name(self, value: str): - setattr(self, "_name", str(value)) + v = str(value) + self.on_update("name", v) + setattr(self, "_name", v) @loot_function @@ -1248,16 +1506,15 @@ def __init__(self, destination: Destination): """ self.destination = destination - @property - def __dict__(self) -> dict: - data = super().__dict__ - data["destination"] = self.destination._value_ + def jsonify(self) -> dict: + data = super().jsonify() + data["destination"] = self.destination.jsonify() return data @classmethod def from_dict(cls, data: dict) -> Self: self = cls.__new__(cls) - self.destination = Destination[data.pop("destination")] + self.destination = Destination.from_dict(data.pop("destination")) return self @property @@ -1270,6 +1527,7 @@ def destination(self, value: Destination): raise TypeError( f"Expected Destination but got '{value.__class__.__name__}' instead" ) + self.on_update("destination", value) setattr(self, "_destination", value) @@ -1285,9 +1543,8 @@ def __init__(self, loot_table: str): """ self.loot_table = loot_table - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["loot_table"] = self.loot_table return data @@ -1303,7 +1560,9 @@ def loot_table(self) -> str: @loot_table.setter def loot_table(self, value: str): - setattr(self, "_loot_table", str(value)) + v = str(value) + self.on_update("loot_table", v) + setattr(self, "_loot_table", v) # loot table only @@ -1342,17 +1601,24 @@ def from_dict(cls, data: dict) -> Self: # ENTRY -class LootPoolEntry: - def __init__(self, conditions: list[LootCondition] = None): +class LootPoolEntry(Misc): + def __init__(self, conditions: list[LootCondition] = []): self.conditions = conditions - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"type": str(self.id.path)} if self.conditions: - data["conditions"] = [x.__dict__ for x in self.conditions] + data["conditions"] = [x.jsonify() for x in self.conditions] return data + @property + def id(self) -> Identifier: + return getattr(self, "_id") + + @id.setter + def id(self, value: Identifier): + setattr(self, "_id", Identifier.of(value)) + @property def conditions(self) -> list[LootCondition]: return getattr2(self, "_conditions", []) @@ -1366,20 +1632,9 @@ def conditions(self, value: list[LootCondition]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("conditions", value) setattr(self, "_conditions", value) - @property - def id(self) -> Identifier: - return getattr(self, "_id") - - @id.setter - def id(self, value: Identifier): - if not isinstance(value, Identifier): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_id", value) - @classmethod def from_dict(cls, data: dict) -> Self: self = cls.__new__(cls) @@ -1394,6 +1649,18 @@ def from_dict(cls, data: dict) -> Self: self.conditions = v return self + def get_condition(self, index: int) -> LootCondition: + return getitem(self, "conditions", index) + + def add_condition(self, condition: LootCondition) -> LootCondition: + return additem(self, "conditions", condition, type=LootCondition) + + def remove_condition(self, index: int) -> LootCondition: + return removeitem(self, "conditions", index) + + def clear_conditions(self) -> Self: + return clearitems(self, "conditions") + INSTANCE.create_registry(Registries.POOL_ENTRY_TYPE, LootPoolEntry) @@ -1416,23 +1683,22 @@ def __init__( self, weight: int = None, quality: int = None, - conditions: list[LootCondition] = None, - functions: list[LootFunction] = None, + conditions: list[LootCondition] = [], + functions: list[LootFunction] = [], ): LootPoolEntry.__init__(self, conditions) self.weight = weight self.quality = quality self.functions = functions - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() if self.weight not in [None, 1]: data["weight"] = self.weight if self.quality not in [None, 1]: data["quality"] = self.quality if self.functions: - data["functions"] = [x.__dict__ for x in self.functions] + data["functions"] = [x.jsonify() for x in self.functions] return data @property @@ -1448,6 +1714,7 @@ def weight(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("weight", value) setattr(self, "_weight", value) @property @@ -1463,6 +1730,7 @@ def quality(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("quality", value) setattr(self, "_quality", value) @property @@ -1478,6 +1746,7 @@ def functions(self, value: list[LootFunction]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("functions", value) setattr(self, "_functions", value) @classmethod @@ -1499,41 +1768,18 @@ def from_dict(cls, data: dict) -> Self: self.functions = v return self - def get_condition(self, index: int) -> LootCondition: - return self.conditions[index] - - def add_condition(self, condition: LootCondition) -> LootCondition: - if not isinstance(condition, LootCondition): - raise TypeError( - f"Expected LootCondition but got '{function.__class__.__name__}' instead" - ) - self.conditions.append(condition) - return condition - - def remove_condition(self, index: int) -> LootCondition: - return self.conditions.pop(index) - - def clear_conditions(self) -> Self: - self.conditions = [] - return self - def get_function(self, index: int) -> LootFunction: - return self.functions[index] + return getitem(self, "functions", index) def add_function(self, function: LootFunction) -> LootFunction: - if not isinstance(function, LootFunction): - raise TypeError( - f"Expected LootFunction but got '{function.__class__.__name__}' instead" - ) - self.functions.append(function) - return function + return additem(self, "functions", function, type=LootFunction) def remove_function(self, index: int) -> LootFunction: - return self.functions.pop(index) + return removeitem(self, "functions", index) def clear_functions(self) -> Self: - self.functions = [] - return self + """Remove all functions""" + return clearitems(self, "functions") @pool_entry @@ -1542,11 +1788,11 @@ class ItemEntry(LeafEntry): def __init__( self, - name: Identifier, + name: Identifiable, weight: int = None, quality: int = None, - conditions: list[LootCondition] = None, - functions: list[LootFunction] = None, + conditions: list[LootCondition] = [], + functions: list[LootFunction] = [], ): LeafEntry.__init__(self, weight, quality, conditions, functions) self.name = name @@ -1554,9 +1800,8 @@ def __init__( def __str__(self) -> str: return "ItemEntry{" + str(self.item) + "}" - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["name"] = str(self.name) return data @@ -1565,12 +1810,10 @@ def name(self) -> Identifier: return getattr(self, "_name") @name.setter - def name(self, value: Identifier): - if not isinstance(value, (Identifier, str)): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_name", Identifier(value)) + def name(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("name", id) + setattr(self, "_name", id) @classmethod def from_dict(cls, data: dict) -> Self: @@ -1589,8 +1832,8 @@ def __init__( name: str, weight: int = None, quality: int = None, - conditions: list[LootCondition] = None, - functions: list[LootFunction] = None, + conditions: list[LootCondition] = [], + functions: list[LootFunction] = [], ): LeafEntry.__init__(self, weight, quality, conditions, functions) self.name = name @@ -1598,9 +1841,8 @@ def __init__( def __str__(self) -> str: return "LootEntry{" + repr(self.name) + "}" - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["name"] = self.name return data @@ -1610,7 +1852,9 @@ def name(self) -> str: @name.setter def name(self, value: str): - setattr(self, "_name", str(value)) + v = str(value) + self.on_update("name", v) + setattr(self, "_name", v) @classmethod def from_dict(cls, data: dict) -> Self: @@ -1620,30 +1864,45 @@ def from_dict(cls, data: dict) -> Self: return self +@pool_entry +class EmptyEntry(LeafEntry): + id = Identifier("empty") + + def __init__( + self, + weight: int = None, + quality: int = None, + conditions: list[LootCondition] = [], + functions: list[LootFunction] = [], + ): + LeafEntry.__init__(self, weight, quality, conditions, functions) + + # MISC -class LootTiers: +class LootTiers(Misc): def __init__(self, initial_range: int, bonus_rolls: int, bonus_chance: float): self.initial_range = initial_range self.bonus_rolls = bonus_rolls self.bonus_chance = bonus_chance - @property - def __dict__(self) -> dict: - data = { - "initial_range": self.initial_range, - "bonus_rolls": self.bonus_rolls, - "bonus_chance": self.bonus_chance, - } + def jsonify(self) -> dict: + data = {"initial_range": self.initial_range} + if self.bonus_rolls: + data["bonus_rolls"] = self.bonus_rolls + if self.bonus_chance: + data["bonus_chance"] = self.bonus_chance return data @classmethod def from_dict(cls, data: dict) -> Self: self = cls.__new__(cls) self.initial_range = data.pop("initial_range") - self.bonus_rolls = data.pop("bonus_rolls") - self.bonus_chance = data.pop("bonus_chance") + if "bonus_rolls" in data: + self.bonus_rolls = data.pop("bonus_rolls") + if "bonus_chance" in data: + self.bonus_chance = data.pop("bonus_chance") return self @property @@ -1656,11 +1915,12 @@ def initial_range(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("initial_range", value) setattr(self, "_initial_range", value) @property def bonus_rolls(self) -> int: - return getattr(self, "_bonus_rolls") + return getattr(self, "_bonus_rolls", None) @bonus_rolls.setter def bonus_rolls(self, value: int): @@ -1668,11 +1928,12 @@ def bonus_rolls(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("bonus_rolls", value) setattr(self, "_bonus_rolls", value) @property def bonus_chance(self) -> float: - return getattr(self, "_bonus_chance") + return getattr(self, "_bonus_chance", None) @bonus_chance.setter def bonus_chance(self, value: float): @@ -1680,18 +1941,20 @@ def bonus_chance(self, value: float): raise TypeError( f"Expected float but got '{value.__class__.__name__}' instead" ) - setattr(self, "_bonus_chance", float(value)) + v = float(value) + self.on_update("bonus_chance", v) + setattr(self, "_bonus_chance", v) -class LootPool: +class LootPool(Misc): def __init__( self, rolls: LootNumberProvider = None, bonus_rolls: LootNumberProvider = None, tiers: LootTiers = None, - entries: list[LootPoolEntry] = None, - conditions: list[LootCondition] = None, - functions: list[LootFunction] = None, + entries: list[LootPoolEntry] = [], + conditions: list[LootCondition] = [], + functions: list[LootFunction] = [], ): self.rolls = rolls self.bonus_rolls = bonus_rolls @@ -1707,19 +1970,18 @@ def __iter__(self): def __getitem__(self, index: int) -> LootPoolEntry: return self.entries[index] - @property - def __dict__(self) -> dict: - data = {"entries": [x.__dict__ for x in self.entries]} + def jsonify(self) -> dict: + data = {"entries": [x.jsonify() for x in self.entries]} if self.tiers: - data["tiers"] = self.tiers.__dict__ + data["tiers"] = self.tiers.jsonify() if self.conditions: - data["conditions"] = [x.__dict__ for x in self.conditions] + data["conditions"] = [x.jsonify() for x in self.conditions] if self.functions: - data["functions"] = [x.__dict__ for x in self.functions] + data["functions"] = [x.jsonify() for x in self.functions] if self.rolls not in [None, 1.0]: - data["rolls"] = self.rolls.__dict__ + data["rolls"] = self.rolls.jsonify() if self.bonus_rolls not in [None, 1.0]: - data["bonus_rolls"] = self.bonus_rolls.__dict__ + data["bonus_rolls"] = self.bonus_rolls.jsonify() return data @property @@ -1735,6 +1997,7 @@ def tiers(self, value: LootTiers): raise TypeError( f"Expected LootTiers but got '{value.__class__.__name__}' instead" ) + self.on_update("tiers", value) setattr(self, "_tiers", value) @property @@ -1750,6 +2013,7 @@ def entries(self, value: list[LootPoolEntry]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("entries", value) setattr(self, "_entries", value) @property @@ -1765,6 +2029,7 @@ def conditions(self, value: list[LootCondition]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("conditions", value) setattr(self, "_conditions", value) @property @@ -1780,6 +2045,7 @@ def functions(self, value: list[LootFunction]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("functions", value) setattr(self, "_functions", value) @property @@ -1798,6 +2064,7 @@ def rolls(self, value: LootNumberProvider): raise TypeError( f"Expected LootNumberProvider but got '{value.__class__.__name__}' instead" ) + self.on_update("rolls", value) setattr(self, "_rolls", value) @property @@ -1813,6 +2080,7 @@ def bonus_rolls(self, value: LootNumberProvider): raise TypeError( f"Expected LootNumberProvider but got '{value.__class__.__name__}' instead" ) + self.on_update("bonus_rolls", value) setattr(self, "_bonus_rolls", value) @classmethod @@ -1857,76 +2125,67 @@ def from_dict(cls, data: dict) -> Self: return self def get_entry(self, index: int) -> LootPoolEntry: - return self.entries[index] + return getitem(self, "entries", index) - def add_entry(self, function: LootPoolEntry) -> LootPoolEntry: - if not isinstance(function, LootPoolEntry): - raise TypeError( - f"Expected LootPoolEntry but got '{function.__class__.__name__}' instead" - ) - self.entries.append(function) - return function + def add_entry(self, entry: LootPoolEntry) -> LootPoolEntry: + return additem(self, "entries", entry, type=LootPoolEntry) def remove_entry(self, index: int) -> LootPoolEntry: - return self.entries.pop(index) + return removeitem(self, "entries", index) def clear_entries(self) -> Self: - self.entries = [] - return self + """Remove all entries""" + return clearitems(self, "entries") def get_condition(self, index: int) -> LootCondition: - return self.conditions[index] + return getitem(self, "entries", index) - def add_condition(self, function: LootCondition) -> LootCondition: - if not isinstance(function, LootCondition): - raise TypeError( - f"Expected LootCondition but got '{function.__class__.__name__}' instead" - ) - self.conditions.append(function) - return function + def add_condition(self, condition: LootCondition) -> LootCondition: + return additem(self, "conditions", condition, type=LootCondition) def remove_condition(self, index: int) -> LootCondition: - return self.conditions.pop(index) + return removeitem(self, "conditions", index) def clear_conditions(self) -> Self: - self.conditions = [] - return self + """Remove all conditions""" + return clearitems(self, "conditions") def get_function(self, index: int) -> LootFunction: - return self.functions[index] + return getitem(self, "functions", index) def add_function(self, function: LootFunction) -> LootFunction: - if not isinstance(function, LootFunction): - raise TypeError( - f"Expected LootFunction but got '{function.__class__.__name__}' instead" - ) - self.functions.append(function) - return function + return additem(self, "functions", function, type=LootFunction) def remove_function(self, index: int) -> LootFunction: - return self.functions.pop(index) + return removeitem(self, "functions", index) def clear_functions(self) -> Self: - self.functions = [] - return self + """Remove all functions""" + return clearitems(self, "functions") +@behavior_pack class LootTable(JsonFile, Identifiable): - extension = ".json" - filename = "loot_table" - dirname = "loot_tables" + """ + Represents a Loot Table. + """ + + id = Identifier("loot_table") + FILEPATH = "loot_tables/loot_table.json" def __init__( self, - type: LootContextType = None, + identifier: Identifiable = None, pools: list[LootPool] = None, functions: list[LootFunction] = None, ): - Identifiable.__init__(self, "empty.json") - self.type = type + Identifiable.__init__(self, identifier) self.pools = pools self.functions = functions + def __str__(self) -> str: + return "LootTable{" + repr(self.identifier.path) + "}" + def __iter__(self): for pool in self.pools: yield pool @@ -1934,30 +2193,12 @@ def __iter__(self): def __getitem__(self, index: int) -> LootPool: return self.pools[index] - @property - def __dict__(self) -> dict: - data = {"pools": [x.__dict__ for x in self.pools]} - if self.type not in [None, LootContextType.empty]: - data["type"] = self.type._value_ + def jsonify(self) -> dict: + data = {"pools": [x.jsonify() for x in self.pools]} if self.functions: - data["functions"] = [x.__dict__ for x in self.functions] + data["functions"] = [x.jsonify() for x in self.functions] return data - @property - def type(self) -> LootContextType: - return getattr2(self, "_type", LootContextType.empty) - - @type.setter - def type(self, value: LootContextType): - if value is None: - self.type = LootContextType.empty - return - if not isinstance(value, LootContextType): - raise TypeError( - f"Expected LootContextType but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_type", value) - @property def pools(self) -> list[LootPool]: return getattr2(self, "_pools", []) @@ -1971,6 +2212,7 @@ def pools(self, value: list[LootPool]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("pools", value) setattr(self, "_pools", value) @property @@ -1986,14 +2228,14 @@ def functions(self, value: list[LootFunction]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("functions", value) setattr(self, "_functions", value) @classmethod def from_dict(cls, data: dict) -> Self: self = cls.__new__(cls) - self.pools = [LootPool.from_dict(x) for x in data.pop("pools")] - if "type" in data: - self.type = LootContextType[data.pop("type")] + if "pools" in data: + self.pools = [LootPool.from_dict(x) for x in data.pop("pools")] if "functions" in data: v = [] @@ -2007,18 +2249,14 @@ def from_dict(cls, data: dict) -> Self: return self @classmethod - def block(cls, obj: Item | Block | Identifier | str): + def block(cls, obj: Identifiable): if not isinstance(obj, (Item, Block, Identifier, str)): raise TypeError( f"Expected Item, Block, or Identifier but got '{obj.__class__.__name__}' instead" ) - id = None - if isinstance(obj, (Block, Item)): - id = obj.id - if isinstance(obj, (Identifier, str)): - id = Identifier(obj) + id = Identifiable.of(obj) self = cls.__new__(cls) - self.identifier = Identifier("blocks/" + id.path) + self.identifier = Identifier.of("blocks/" + id.path) self.filename = id.path pool = LootPool() pool.add_entry(ItemEntry(id)) @@ -2026,37 +2264,37 @@ def block(cls, obj: Item | Block | Identifier | str): return self def get_pool(self, index: int) -> LootPool: - return self.pools[index] + return getitem(self, "pools", index) def add_pool(self, pool: LootPool) -> LootPool: - if not isinstance(pool, LootPool): - raise TypeError( - f"Expected LootPool but got '{pool.__class__.__name__}' instead" - ) - self.pools.append(pool) - return pool + return additem(self, "pools", pool, type=LootPool) def remove_pool(self, index: int) -> LootPool: - return self.pools.pop(index) + return removeitem(self, "pools", index) def clear_pools(self) -> Self: - self.pools = [] - return self + """Remove all pools""" + return clearitems(self, "pools") def get_function(self, index: int) -> LootFunction: - return self.functions[index] + return getitem(self, "functions", index) def add_function(self, function: LootFunction) -> LootFunction: - if not isinstance(function, LootFunction): - raise TypeError( - f"Expected LootFunction but got '{function.__class__.__name__}' instead" - ) - self.functions.append(function) - return function + return additem(self, "functions", function, type=LootFunction) def remove_function(self, index: int) -> LootFunction: - return self.functions.pop(index) + return removeitem(self, "functions", index) def clear_functions(self) -> Self: - self.functions = [] - return self + """Remove all functions""" + return clearitems(self, "functions") + + def valid(self, fp: str) -> bool: + return True + + @classmethod + def open(cls, fp: str, start): + with open(fp, "r") as fd: + self = cls.load(fd) + self.identifier = os.path.relpath(fp, start).replace("\\", "/") + return self diff --git a/mcaddon/manifest.py b/mcaddon/manifest.py index 8fdfa05..3304410 100644 --- a/mcaddon/manifest.py +++ b/mcaddon/manifest.py @@ -2,12 +2,12 @@ from uuid import uuid4, UUID from . import VERSION -from .constant import ModuleType +from .constant import ModuleType, PackScope from .file import JsonFile, Loader -from .util import getattr2, Version +from .util import getattr2, getitem, additem, removeitem, clearitems, Version, Misc -class Header: +class Header(Misc): def __init__( self, min_engine_version: Version = None, @@ -18,6 +18,7 @@ def __init__( allow_random_seed: bool = None, base_game_version: Version = None, lock_template_options: bool = None, + pack_scope: str = None, ): self.name = name self.uuid = uuid @@ -27,22 +28,24 @@ def __init__( self.base_game_version = base_game_version self.lock_template_options = lock_template_options self.min_engine_version = min_engine_version + self.pack_scope = pack_scope - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = { "name": self.name_key, "description": self.description_key, "uuid": str(self.uuid), - "version": self.version.__dict__, - "min_engine_version": self.min_engine_version.__dict__, + "version": self.version.jsonify(), + "min_engine_version": self.min_engine_version.jsonify(), } if self.allow_random_seed: data["allow_random_seed"] = self.allow_random_seed if self.base_game_version: - data["base_game_version"] = self.base_game_version.__dict__ + data["base_game_version"] = self.base_game_version.jsonify() if self.lock_template_options: data["lock_template_options"] = self.lock_template_options + if self.pack_scope: + data["pack_scope"] = self.pack_scope.jsonify() return data @classmethod @@ -51,17 +54,32 @@ def from_dict(cls, data: dict) -> Self: self.name = data.pop("name") self.description = data.pop("description") self.uuid = data.pop("uuid") - self.version = data.pop("version") + self.version = Version.of(data.pop("version")) if "allow_random_seed" in data: self.allow_random_seed = data.pop("allow_random_seed") if "base_game_version" in data: - self.base_game_version = data.pop("base_game_version") + self.base_game_version = Version.of(data.pop("base_game_version")) if "lock_template_options" in data: self.lock_template_options = data.pop("lock_template_options") if "min_engine_version" in data: - self.min_engine_version = data.pop("min_engine_version") + self.min_engine_version = Version.of(data.pop("min_engine_version")) + if "pack_scope" in data: + self.pack_scope = PackScope.from_dict(data.pop("pack_scope")) return self + @property + def pack_scope(self) -> PackScope: + return getattr(self, "_pack_scope", None) + + @pack_scope.setter + def pack_scope(self, value: PackScope): + if not isinstance(value, PackScope) and value is not None: + raise TypeError( + f"Expected PackScope but got '{value.__class__.__name__}' instead" + ) + self.on_update("pack_scope", value) + setattr(self, "_pack_scope", value) + @property def name_key(self) -> str: return getattr(self, "_name_key", "pack.name") @@ -71,7 +89,9 @@ def name_key(self, value: str): if value is None: self.name_key = "pack.name" else: - setattr(self, "_name_key", str(value)) + v = str(value) + self.on_update("name_key", v) + setattr(self, "_name_key", v) @property def description_key(self) -> str: @@ -82,7 +102,9 @@ def description_key(self, value: str): if value is None: self.description_key = "pack.description" else: - setattr(self, "_description_key", str(value)) + v = str(value) + self.on_update("description_key", v) + setattr(self, "_description_key", v) @property def name(self) -> str: @@ -93,7 +115,9 @@ def name(self, value: str): if value is None: self.name = "Untitled" return - setattr(self, "_name", str(value)) + v = str(value) + self.on_update("name", v) + setattr(self, "_name", v) @property def description(self) -> str: @@ -104,23 +128,26 @@ def description(self, value: str): if value is None: self.description = "Auto generated" return - setattr(self, "_description", str(value)) + v = str(value) + self.on_update("description", v) + setattr(self, "_description", v) @property def min_engine_version(self) -> Version: return getattr2( - self, "_min_engine_version", Version.parse(VERSION["MIN_ENGINE_VERSION"]) + self, "_min_engine_version", Version.of(VERSION["MIN_ENGINE_VERSION"]) ) @min_engine_version.setter def min_engine_version(self, value: Version): if value is None: - self.min_engine_version = Version.parse(VERSION["MIN_ENGINE_VERSION"]) + self.min_engine_version = Version.of(VERSION["MIN_ENGINE_VERSION"]) return if not isinstance(value, Version): raise TypeError( f"Expected Version but got '{value.__class__.__name__}' instead" ) + self.on_update("min_engine_version", value) setattr(self, "_min_engine_version", value) @property @@ -132,6 +159,7 @@ def uuid(self, value: UUID): if value is None: self.uuid = uuid4() elif isinstance(value, UUID): + self.on_update("uuid", value) setattr(self, "_uuid", value) else: self.uuid = UUID(str(value)) @@ -149,6 +177,7 @@ def version(self, value: Version): raise TypeError( f"Expected Version but got '{value.__class__.__name__}' instead" ) + self.on_update("version", value) setattr(self, "_version", value) @property @@ -164,6 +193,7 @@ def allow_random_seed(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("allow_random_seed", value) setattr(self, "_allow_random_seed", value) @property @@ -179,6 +209,7 @@ def base_game_version(self, value: Version): raise TypeError( f"Expected Version but got '{value.__class__.__name__}' instead" ) + self.on_update("base_game_version", value) setattr(self, "_base_game_version", value) @property @@ -194,17 +225,17 @@ def lock_template_options(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("lock_template_options", value) setattr(self, "_lock_template_options", value) -class Metadata: +class Metadata(Misc): def __init__(self, license: str, url: str): self.authors = [] self.license = license self.url = url - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"authors": self.authors, "license": self.license, "url": self.url} return data @@ -226,6 +257,7 @@ def authors(self, value: list[str]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("authors", value) setattr(self, "_authors", value) @property @@ -234,7 +266,9 @@ def license(self) -> str: @license.setter def license(self, value: str): - setattr(self, "_license", str(value)) + v = str(value) + self.on_update("license", v) + setattr(self, "_license", v) @property def url(self) -> str: @@ -242,7 +276,9 @@ def url(self) -> str: @url.setter def url(self, value: str): - setattr(self, "_url", str(value)) + v = str(value) + self.on_update("url", v) + setattr(self, "_url", v) def add_author(self, name: str) -> str: self.authors.append(name) @@ -252,30 +288,27 @@ def get_author(self, index: int) -> str: return self.authors[index] def remove_author(self, index: int) -> str: - name = self.authors[index] - del self.authors[index] - return name + return self.authors.pop(index) def clear_authors(self): self.authors = [] return self -class Dependency: - def __init__(self, uuid: UUID, version: list[int] = None): +class Dependency(Misc): + def __init__(self, uuid: UUID, version: Version = None): self.uuid = uuid self.version = version - @property - def __dict__(self) -> dict: - data = {"uuid": str(self.uuid), "version": self.version.__dict__} + def jsonify(self) -> dict: + data = {"uuid": str(self.uuid), "version": self.version.jsonify()} return data @classmethod def from_dict(cls, data: dict) -> Self: self = cls.__new__(cls) self.uuid = data.pop("uuid") - self.version = data.pop("version") + self.version = Version.of(data.pop("version")) return self @property @@ -285,6 +318,7 @@ def uuid(self) -> UUID: @uuid.setter def uuid(self, value: UUID): if isinstance(value, UUID): + self.on_update("uuid", value) setattr(self, "_uuid", value) else: self.uuid = UUID(str(value)) @@ -302,15 +336,16 @@ def version(self, value: Version): raise TypeError( f"Expected Version but got '{value.__class__.__name__}' instead" ) + self.on_update("version", value) setattr(self, "_version", value) -class Module: +class Module(Misc): def __init__( self, type: ModuleType, uuid: str = None, - version: list[int] = None, + version: Version = None, description: str = None, ): self.type = type @@ -318,13 +353,12 @@ def __init__( self.uuid = uuid self.version = version - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = { "description": self.description, - "type": self.type._value_, + "type": self.type.jsonify(), "uuid": str(self.uuid), - "version": self.version.__dict__, + "version": self.version.jsonify(), } return data @@ -332,7 +366,7 @@ def __dict__(self) -> dict: def from_dict(cls, data: dict) -> Self: self = cls.__new__(cls) self.description = data.pop("description") - self.type = ModuleType[data.pop("type")] + self.type = ModuleType.from_dict(data.pop("type")) self.uuid = data.pop("uuid") self.version = data.pop("version") return self @@ -347,6 +381,7 @@ def type(self, value: ModuleType): raise TypeError( f"Expected ModuleType but got '{value.__class__.__name__}' instead" ) + self.on_update("type", value) setattr(self, "_type", value) @property @@ -358,7 +393,9 @@ def description(self, value: str): if value is None: self.description = "pack.description" else: - setattr(self, "_description", str(value)) + v = str(value) + self.on_update("description", v) + setattr(self, "_description", v) @property def uuid(self) -> UUID: @@ -369,6 +406,7 @@ def uuid(self, value: UUID): if value is None: self.uuid = uuid4() elif isinstance(value, UUID): + self.on_update("uuid", value) setattr(self, "_uuid", value) else: self.uuid = UUID(str(value)) @@ -379,47 +417,42 @@ def version(self) -> Version: @version.setter def version(self, value: Version): - if value is None: - self.version = Version(1, 0, 0) - return - if not isinstance(value, list): - raise TypeError( - f"Expected list but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_version", value) + v = Version.of(value) + self.on_update("version", v) + setattr(self, "_version", v) @classmethod def resources(cls, uuid: UUID = None) -> Self: self = cls.__new__(cls) - self.type = ModuleType.resources + self.type = ModuleType.RESOURCES self.uuid = uuid return self @classmethod def data(cls, uuid: UUID = None) -> Self: self = cls.__new__(cls) - self.type = ModuleType.data + self.type = ModuleType.DATA self.uuid = uuid return self @classmethod def client_data(cls, uuid: UUID = None) -> Self: self = cls.__new__(cls) - self.type = ModuleType.client_data + self.type = ModuleType.CLIENT_DATA self.uuid = uuid return self @classmethod def interface(cls, uuid: UUID = None) -> Self: self = cls.__new__(cls) - self.type = ModuleType.interface + self.type = ModuleType.INTERFACE self.uuid = uuid return self @classmethod def world_template(cls, uuid: UUID = None) -> Self: self = cls.__new__(cls) - self.type = ModuleType.world_template + self.type = ModuleType.WORLD_TEMPLATE self.uuid = uuid return self @@ -429,15 +462,19 @@ class Manifest(JsonFile): Represents a Pack Manifest. """ - EXTENSION = ".json" - DIRNAME = "" - FILENAME = "manifest" + FILEPATH = "manifest.json" - def __init__(self, header: Header, metadata: Metadata = None): + def __init__( + self, + header: Header, + metadata: Metadata = None, + dependencies: dict[str, Dependency] = {}, + modules: dict[str, Module] = {}, + ): self.header = header self.metadata = metadata - self.dependencies = {} - self.modules = {} + self.dependencies = dependencies + self.modules = modules def __iter__(self): for i in self.modules: @@ -446,24 +483,23 @@ def __iter__(self): def __str__(self): return "Manifest{" + str(self.header.uuid) + "}" - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = { "format_version": VERSION["MANIFEST"], - "header": self.header.__dict__, + "header": self.header.jsonify(), "modules": [], } if self.metadata: - data["metadata"] = self.metadata.__dict__ + data["metadata"] = self.metadata.jsonify() if self.dependencies: data["dependencies"] = [] for v in self.dependencies.values(): - data["dependencies"].append(v.__dict__) + data["dependencies"].append(v.jsonify()) if self.modules: for v in self.modules.values(): - data["modules"].append(v.__dict__) + data["modules"].append(v.jsonify()) return data @property @@ -476,7 +512,8 @@ def header(self, value: Header): raise TypeError( f"Expected Header but got '{value.__class__.__name__}' instead" ) - self.FILENAME = value.name + self.FILEFILEPATH = value.name + self.on_update("header", value) setattr(self, "_header", value) @property @@ -492,11 +529,12 @@ def metadata(self, value: Metadata): raise TypeError( f"Expected Metadata but got '{value.__class__.__name__}' instead" ) + self.on_update("metadata", value) setattr(self, "_metadata", value) @property def dependencies(self) -> dict[str, Dependency]: - return getattr(self, "_dependencies", {}) + return getattr2(self, "_dependencies", {}) @dependencies.setter def dependencies(self, value: dict[str, Dependency]): @@ -504,11 +542,12 @@ def dependencies(self, value: dict[str, Dependency]): raise TypeError( f"Expected dict but got '{value.__class__.__name__}' instead" ) + self.on_update("dependencies", value) setattr(self, "_dependencies", value) @property def modules(self) -> dict[str, Module]: - return getattr(self, "_modules", {}) + return getattr2(self, "_modules", {}) @modules.setter def modules(self, value: dict[str, Module]): @@ -516,6 +555,7 @@ def modules(self, value: dict[str, Module]): raise TypeError( f"Expected dict but got '{value.__class__.__name__}' instead" ) + self.on_update("modules", value) setattr(self, "_modules", value) # SHORTCUTS @@ -542,23 +582,24 @@ def from_dict(cls, data: dict) -> Self: loader.validate(data) return loader.load(data) + def get_module(self, uuid: UUID) -> Module: + return getitem(self, "modules", uuid) + def add_module(self, module: Module) -> Module: - self.modules[module.uuid] = module - return module + return additem(self, "modules", module, module.uuid, Module) def set_module(self, module: Module) -> Module: self.clear_modules() return self.add_module(module) - def get_module(self, uuid: str) -> Module: - return self.modules[uuid] - - def remove_module(self, uuid: str) -> Module: - return self.modules.pop(uuid) + def remove_module(self, uuid: UUID) -> Module: + return removeitem(self, "modules", uuid) def clear_modules(self) -> Self: - self.modules = {} - return self + return clearitems(self, "modules") + + def get_dependency(self, uuid: UUID) -> Dependency: + return getitem(self, "dependencies", uuid) def add_dependency(self, obj: Dependency | Self) -> Dependency: from .pack import Pack @@ -569,22 +610,14 @@ def add_dependency(self, obj: Dependency | Self) -> Dependency: return self.add_dependency( Dependency(obj.manifest.header.uuid, obj.manifest.header.version) ) - if not isinstance(obj, Dependency): - raise TypeError( - f"Expected Dependency but got '{obj.__class__.__name__}' instead" - ) - self.dependencies[obj.uuid] = obj - return obj - - def get_dependency(self, uuid: str) -> Dependency: - return self.dependencies[uuid] + return additem(self, "dependencies", obj, obj.uuid, Dependency) - def remove_dependency(self, uuid: str) -> Dependency: - return self.dependencies.pop(uuid) + def remove_dependency(self, uuid: UUID) -> Dependency: + return removeitem(self, "dependencies", uuid) def clear_dependencies(self) -> Self: - self.dependencies = {} - return self + """Remove all dependencies""" + return clearitems(self, "dependencies") def set_uuids(self, header_uuid: str, *module_uuid: str) -> Self: self.header.uuid = header_uuid @@ -593,6 +626,15 @@ def set_uuids(self, header_uuid: str, *module_uuid: str) -> Self: m.uuid = uuid return self + def has_behavior(self) -> bool: + return ModuleType.DATA in [m.type for m in self.modules.values()] + + def has_resource(self) -> bool: + return ModuleType.RESOURCES in [m.type for m in self.modules.values()] + + def has_world_template(self) -> bool: + return ModuleType.WORLD_TEMPLATE in [m.type for m in self.modules.values()] + @classmethod def behavior(cls) -> Self: self = cls.__new__(cls) @@ -629,3 +671,4 @@ def __init__(self): Loader.__init__(self, Manifest) self.add_schema(ManifestSchema1, 1) + self.add_schema(ManifestSchema1, 2) diff --git a/mcaddon/math.py b/mcaddon/math.py new file mode 100644 index 0000000..c6970be --- /dev/null +++ b/mcaddon/math.py @@ -0,0 +1,255 @@ +from typing import Self +from dataclasses import dataclass +import numpy as np + + +class Vector2(np.ndarray): + def __new__(cls, x: float | int = 0, y: float | int = 0): + obj = np.asarray([x, y]).view(cls) + return obj + + @property + def x(self): + return self[0] + + @property + def y(self): + return self[1] + + def __eq__(self, other): + return np.array_equal(self, other) + + def __ne__(self, other): + return not np.array_equal(self, other) + + def __iter__(self): + for x in np.nditer(self): + yield x.item() + + def dist(self, other): + return np.linalg.norm(self - other) + + @staticmethod + def of(data: list) -> Self: + if isinstance(data, list): + if len(data) != 2: + raise IndexError(data) + return Vector2(*data) + return Vector2(*str(data).split(" ")) + + @staticmethod + def from_dict(data: dict) -> Self: + return Vector2.of(data) + + def jsonify(self) -> dict: + return [float(x) for x in self] + + +class Vector3(np.ndarray): + def __new__(cls, x: float | int = 0, y: float | int = 0, z: float | int = 0): + obj = np.asarray([x, y, z]).view(cls) + return obj + + @property + def x(self): + return self[0] + + @property + def y(self): + return self[1] + + @property + def z(self): + return self[2] + + def __eq__(self, other): + return np.array_equal(self, other) + + def __ne__(self, other): + return not np.array_equal(self, other) + + def __iter__(self): + for x in np.nditer(self): + yield x.item() + + def dist(self, other): + return np.linalg.norm(self - other) + + @staticmethod + def of(data: list) -> Self: + if isinstance(data, list): + if len(data) != 3: + raise IndexError(data) + return Vector3(*data) + return Vector3(*str(data).split(" ")) + + @staticmethod + def from_dict(data: dict) -> Self: + return Vector3.of(data) + + def jsonify(self) -> dict: + return [float(x) for x in self] + + +class Range(np.ndarray): + def __new__(cls, min: float | int = 0, max: float | int = 0): + obj = np.asarray([min, max]).view(cls) + return obj + + @property + def min(self): + return self[0] + + @property + def max(self): + return self[1] + + def __eq__(self, other): + return np.array_equal(self, other) + + def __ne__(self, other): + return not np.array_equal(self, other) + + def __iter__(self): + for x in np.nditer(self): + yield x.item() + + def dist(self, other): + return np.linalg.norm(self - other) + + @staticmethod + def of(data: list) -> Self: + if isinstance(data, list): + if len(data) != 2: + raise IndexError(data) + return Range(*data) + return Range(*str(data).split(" ")) + + @staticmethod + def from_dict(data: dict, prefix: str = "") -> Self | int | float: + if isinstance(data, (float, int)): + return data + elif isinstance(data, list): + return Range(*data) + else: + min = data.pop(prefix + "min") + max = data.pop(prefix + "max") + return Range(min, max) + + def to_list(self) -> dict: + return [x for x in self] + + def jsonify(self, prefix: str = "") -> dict: + data = {} + data[prefix + "min"] = float(self.min) + data[prefix + "max"] = float(self.max) + return data + + +class VectorRange: + def __init__(self, min: Vector3, max: Vector3): + self.min = min + self.max = max + + @property + def min(self) -> Vector3: + return getattr(self, "_min") + + @min.setter + def min(self, value: Vector3): + if not isinstance(value, Vector3): + raise TypeError( + f"Expected Vector3i but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_min", value) + + @property + def max(self) -> Vector3: + return getattr(self, "_max") + + @max.setter + def max(self, value: Vector3): + if not isinstance(value, Vector3): + raise TypeError( + f"Expected Vector3i but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_max", value) + + @classmethod + def from_dict(cls, data: dict, prefix: str = "") -> Self: + self = cls.__new__(cls) + self.min = Vector3.of(data.pop(prefix + "min")) + self.max = Vector3.of(data.pop(prefix + "max")) + return self + + def jsonify(self, prefix: str = "") -> dict: + data = {} + data[prefix + "min"] = self.min.jsonify() + data[prefix + "max"] = self.max.jsonify() + return data + + +class Slope(np.ndarray): + def __new__(cls, rise: float | int = 0, run: float | int = 0): + obj = np.asarray([rise, run]).view(cls) + return obj + + @property + def rise(self): + return self[0] + + @property + def run(self): + return self[1] + + def __eq__(self, other): + return np.array_equal(self, other) + + def __ne__(self, other): + return not np.array_equal(self, other) + + def __iter__(self): + for x in np.nditer(self): + yield x.item() + + def dist(self, other): + return np.linalg.norm(self - other) + + @staticmethod + def of(data: list) -> Self: + if isinstance(data, list): + if len(data) != 2: + raise IndexError(data) + return Slope(*data) + return Slope(*str(data).split(" ")) + + @staticmethod + def from_dict(data: dict, prefix: str = "") -> Self | int | float: + if isinstance(data, (float, int)): + return data + rise = data.pop(prefix + "rise") + run = data.pop(prefix + "run") + return Range(rise, run) + + def to_list(self) -> dict: + return [x for x in self] + + def jsonify(self, prefix: str = "") -> dict: + data = {} + data[prefix + "rise"] = float(self.rise) + data[prefix + "run"] = float(self.run) + return data + + +@dataclass +class Chance: + numerator: float + denominator: float + + @staticmethod + def from_dict(data: dict) -> Self: + return Chance(**data) + + def jsonify(self) -> dict: + data = {"numerator": self.numerator, "denominator": self.denominator} + return data diff --git a/mcaddon/pack.py b/mcaddon/pack.py index 24adaed..914485e 100644 --- a/mcaddon/pack.py +++ b/mcaddon/pack.py @@ -1,5 +1,6 @@ from typing import Self from zipfile import ZIP_DEFLATED, ZipFile +from multiprocessing import Pool from io import BytesIO import mclang import os @@ -12,16 +13,19 @@ from .constant import Edition from .manifest import Manifest from .file import ArchiveFile, File, Importable -from .util import getattr2, Identifier -from .resrouce import ItemAtlas, TerrainAtlas -from .recipe import Recipe -from .block import Block -from .item import Item -from .volume import Volume -from .loot import LootTable - - -class Pack(Importable): +from .util import ( + getattr2, + getitem, + additem, + clearitems, + Identifier, + Identifiable, +) +from .registry import INSTANCE, Registries, RegistryKey + + +# TODO: Instead of creating self.items, self.blocks, etc. add self.registry = {'item': RegistryKey()} +class Pack(ArchiveFile, Importable): def __init__( self, manifest: Manifest = None, texts: mclang.Lang = None, filename: str = None ): @@ -30,20 +34,48 @@ def __init__( if filename: self.filename = filename + self._methods = [] + + def __getstate__(self): + state = self.__dict__.copy() + for m in self._methods: + del state[m] + return state + + def __setstate__(self, state): + self.__dict__.update(state) + + def __repr__(self) -> str: + return str(self) + def __str__(self) -> str: return self.__class__.__name__ + "{" + str(self.manifest.header.uuid) + "}" + def __iter__(self): + for reg in self.registry.keys(): + for obj in getattr(self, reg.path + "s"): + yield obj + @property - def file_types(self) -> list[File]: - return getattr(self, "_file_types") + def id(self) -> Identifier: + return getattr(self, "_id") - @file_types.setter - def file_types(self, value: list[File]): - if not isinstance(value, list): + @id.setter + def id(self, value: Identifier): + setattr(self, "_id", Identifier.of(value)) + + @property + def registry(self) -> RegistryKey: + return getattr(self, "_registry") + + @registry.setter + def registry(self, value: RegistryKey): + if not isinstance(value, RegistryKey): raise TypeError( - f"Expected list but got '{value.__class__.__name__}' instead" + f"Expected RegistryKey but got '{value.__class__.__name__}' instead" ) - setattr(self, "_file_types", value) + self.on_update("registry", value) + setattr(self, "_registry", value) @property def manifest(self) -> Manifest: @@ -58,6 +90,7 @@ def manifest(self, value: Manifest): raise TypeError( f"Expected Manifest but got '{value.__class__.__name__}' instead" ) + self.on_update("manifest", value) setattr(self, "_manifest", value) @property @@ -73,6 +106,7 @@ def texts(self, value: mclang.Lang): raise TypeError( f"Expected mclang.Lang but got '{value.__class__.__name__}' instead" ) + self.on_update("texts", value) setattr(self, "_texts", value) @property @@ -94,6 +128,7 @@ def name(self) -> str: @name.setter def name(self, value: str): + self.on_update("name", value) self.manifest.name = value @property @@ -102,6 +137,7 @@ def description(self) -> str: @description.setter def description(self, value: str): + self.on_update("description", value) self.manifest.description = value @property @@ -110,62 +146,73 @@ def versions(self) -> list[int]: @versions.setter def versions(self, value: list[int]): + self.on_update("versions", value) self.manifest.header.version = value for m in self.manifest.modules: m.version = value + @classmethod + def load_archive(cls, zip: ZipFile) -> Self: + self = cls.__new__(cls) + self._create_file_methods() + return ArchiveFile.load_archive(zip) + + @classmethod + def load_directory(cls, path: str) -> Self: + self = cls.__new__(cls) + self._create_file_methods() + manifest_path = os.path.join(path, "manifest.json") + if not os.path.isfile(manifest_path): + raise ManifestNotFoundError(manifest_path) + + # Load Manifest + self.manifest = Manifest.open(manifest_path) + + # Load registry files + for k, cls in self.registry.items(): + obj = cls.__new__(cls) + start = os.path.join(path, obj.dirname) + if os.path.isdir(start): + for fp in glob.glob(start + "/**/*" + obj.extension, recursive=True): + bl = obj.valid(fp) + if bl: + file = obj.open(fp, start) + self.add(file) + + return self + def _create_file_methods(self): - for f in self.file_types: - setattr(self, f.dirname, {}) - setattr( - self, "get_" + f.filename, lambda i, l=f.dirname: self.get_file(l, i) - ) + self._methods = [] + for id in self.registry.keys(): + name = id.path + objects = name + "s" + if not hasattr(self, objects): + setattr(self, objects, {}) + setattr(self, "get_" + name, lambda i, l=objects: self._get_file(l, i)) setattr( self, - "add_" + f.filename, - lambda obj, l=f.dirname: self.add_file(l, obj), + "add_" + name, + lambda obj, l=objects: self._add_file(l, obj), ) setattr( self, - "remove_" + f.filename, - lambda i, l=f.dirname: self.remove_file(l, i), + "remove_" + name, + lambda i, l=objects: self._remove_file(l, i), ) - setattr( - self, "clear_" + f.filename, lambda l=f.dirname: self.clear_files(l) - ) - - def set_details(self, name: str, description: str) -> Self: - self.name = name - self.description = description - return self - - def get_file(self, dirname: str, id: Identifier) -> File: - return getattr(self, dirname).get(id) - - def add_file(self, dirname: str, obj: File) -> File: - getattr(self, dirname)[obj.identifier] = obj - return obj - - def remove_file(self, dirname: str, id: Identifier) -> File: - return getattr(self, dirname).pop(id) + setattr(self, f"clear_{name}s", lambda l=objects: self._clear_files(l)) - def clear_files(self, dirname: str) -> Self: - setattr(self, dirname, {}) - return self - - def set_uuids(self, header_uuid: str, *module_uuid: str) -> Self: - if self.manifest: - self.manifest.set_uuids(header_uuid, *module_uuid) - return self + self._methods.extend( + ["get_" + name, "add_" + name, "remove_" + name, f"clear_{name}s"] + ) - def writedir(self, path: str) -> None: - props = {"indent": 2} + def dump_directory(self, path: str, indent: int = 2) -> None: + props = {"indent": indent} # MANIFEST fp = os.path.join(path, "manifest.json") os.makedirs(os.path.dirname(fp), exist_ok=True) with open(fp, "w") as f: - f.write(self.manifest.json(**props)) + f.write(self.manifest.dumps(**props)) # TEXTS name_key = self.manifest.header.name_key @@ -180,23 +227,36 @@ def writedir(self, path: str) -> None: with open(fp, "w") as f: mclang.dump(self.texts, f) + # LANGUAGES.json + fp = os.path.join(path, "texts", "languages.json") + with open(fp, "w") as w: + json.dump(["en_US"], w) + # FILES - for k in self.file_types: - v = getattr(self, k.dirname, {}) + for k, cls in self.registry.items(): + obj = cls.__new__(cls) + v = getattr(self, k.path + "s", {}) if len(v) >= 1: - dirpath = os.path.join(path, k.dirname) + dirpath = os.path.join(path, obj.dirname) os.makedirs(dirpath, exist_ok=True) for id, itm in v.items(): fp = os.path.join(dirpath, itm.filename + itm.extension) + fp_dir = os.path.dirname(fp) + if dirpath != fp_dir: + os.makedirs(fp_dir, exist_ok=True) with open(fp, "w") as f: - f.write(itm.json(**props)) + f.write(itm.dumps(**props)) - def writezip(self, zip: ZipFile) -> None: + def dump_archive(self, zip: ZipFile) -> None: + if not isinstance(zip, ZipFile): + raise TypeError( + f"Expected zipfile.ZipFile but got '{zip.__class__.__name__}' instead" + ) props = {"separators": (",", ":")} path = "" # MANIFEST - zip.writestr(os.path.join(path, "manfiest.json"), self.manifest.json(**props)) + zip.writestr(os.path.join(path, "manfiest.json"), self.manifest.getvalue()) # TEXTS name_key = self.manifest.header.name_key @@ -209,58 +269,103 @@ def writezip(self, zip: ZipFile) -> None: os.path.join(path, "texts", "en_US.lang"), mclang.dumps(self.texts) ) + # LANGUAGES.json + zip.writestr( + os.path.join(path, "texts", "languages.json"), json.dumps(["en_US"]) + ) + # FILES - # for k, v in self.files.items(): - # dirpath = os.path.join(path, k) - # for id, itm in v.items(): - # fp = os.path.join(dirpath, itm.filename+itm.EXT) - # zip.writestr(fp, itm.json(**props)) - - for k in self.file_types: - dirpath = os.path.join(path, k.dirname) - v = getattr(self, k.dirname, {}) - for id, itm in v.items(): - fp = os.path.join(dirpath, itm.filename + itm.extension) - zip.writestr(fp, itm.json(**props)) + for k, cls in self.registry.items(): + obj = cls.__new__(cls) + v = getattr(self, k.path + "s", {}) + if len(v) >= 1: + dirpath = os.path.join(path, obj.dirname) + for id, itm in v.items(): + fp = os.path.join(dirpath, itm.filename + itm.extension) + zip.writestr(fp, itm.getvalue()) + # with open(fp, "w") as f: + # f.write(itm.dumps(**props)) + return self + + def get_registry(self, registry: Identifiable): + path = Identifiable.of(registry).path + "s" + return getattr(self, path) + + def add(self, obj) -> Self: + """ + Add File to this pack + + :param obj: The file to add + :type obj: File + """ + for cls in self.registry: + if isinstance(obj, cls): + name = cls.id.path + "s" + getattr(self, name)[obj.identifier] = obj + obj.generate(self) + return self + + def set_details(self, name: str, description: str) -> Self: + self.name = name + self.description = description + return self + + def _get_file(self, dirname: str, id: Identifiable) -> File: + return getattr(self, dirname).get(Identifiable.of(id)) + + def _add_file(self, dirname: str, obj: File) -> File: + getattr(self, dirname)[obj.identifier] = obj + return obj + + def _remove_file(self, dirname: str, id: Identifiable) -> File: + return getattr(self, dirname).pop(Identifiable.of(id)) + + def _clear_files(self, dirname: str) -> Self: + setattr(self, dirname, {}) + return self + + def set_uuids(self, header_uuid: str, *module_uuid: str) -> Self: + if self.manifest: + self.manifest.set_uuids(header_uuid, *module_uuid) return self -class BehaviorPack(ArchiveFile, Pack): +INSTANCE.create_registry(Registries.BEHAVIOR_PACK_FILE, File) + + +def behavior_pack(cls): + """ + Add this behavior pack file to the registry + """ + + def wrapper(): + if not issubclass(cls, File): + raise TypeError(f"Expected File but got '{cls.__name__}' instead") + return INSTANCE.register(Registries.BEHAVIOR_PACK_FILE, cls.id, cls) + + return wrapper() + + +class BehaviorPack(Pack): """ Represents a Behavior Pack. """ + registry = INSTANCE.get_registry(Registries.BEHAVIOR_PACK_FILE) id = Identifier("data") - EXTENSION = ".mcpack" - FILENAME = "untitled" - DIRNAME = "behavior_packs" + FILEPATH = "behavior_packs/untitled.mcpack" suffix = "_BP" def __init__( self, manifest: Manifest = None, texts: mclang.Lang = None, filename: str = None ): Pack.__init__(self, manifest, texts, filename) - self.setup() + self._create_file_methods() @property def MANIFEST(self): return getattr2(self, "_MANIFEST", Manifest.behavior()) - @classmethod - def load(cls, filename: str = None) -> Self: - self = super().load(filename) - return self - - def setup(self): - self.file_types = [ - Item.__new__(Item), - Block.__new__(Block), - Recipe.__new__(Recipe), - Volume.__new__(Volume), - LootTable.__new__(LootTable), - ] - self._create_file_methods() - # UTIL def merge(self, other) -> Self: @@ -273,49 +378,12 @@ def merge(self, other) -> Self: self.recipes.update(other.recipes) return self - def add(self, obj) -> Self: - if isinstance(obj, Item): - return self.add_item(obj) - if isinstance(obj, Block): - return self.add_block(obj) - if isinstance(obj, Recipe): - return self.add_recipe(obj) - if isinstance(obj, Volume): - return self.add_volume(obj) - return self - # FILE - @classmethod - def readzip(cls, zip: ZipFile) -> Self: - self = cls.__new__(cls) - self.setup() - return self - - @classmethod - def readdir(cls, path: str) -> Self: - self = cls.__new__(cls) - self.setup() - manifest_path = os.path.join(path, "manifest.json") - if not os.path.isfile(manifest_path): - raise ManifestNotFoundError(manifest_path) - - for v in self.file_types: - k_path = os.path.join(path, v.dirname) - if os.path.isdir(k_path): - for fp in glob.glob(k_path + "/**" + v.extension): - self.add_file(v.dirname, v.load(fp)) - - return self - - def writedir(self, path: str) -> None: - Pack.writedir(self, path) - - def writezip(self, zip: ZipFile) -> None: - Pack.writezip(self, zip) - - def import_to(self, edition: Edition = Edition.bedrock, dev: bool = True) -> str: - mojang = super().import_to(edition, dev) + def import_to( + self, name: str = None, edition: Edition = Edition.BEDROCK, dev: bool = True + ) -> str: + mojang = super().import_to(name, edition, dev) dirpath = ( os.path.join(mojang, "development_behavior_packs") if dev @@ -323,100 +391,51 @@ def import_to(self, edition: Edition = Edition.bedrock, dev: bool = True) -> str ) path = os.path.join(dirpath, self.filename + self.suffix) os.makedirs(path, exist_ok=True) - self.writedir(path) + self.save(path, zipped=False, overwrite=True) return path - # RECIPE - - def get_recipe(self) -> Recipe | None: ... - def add_recipe(self, recipe: Recipe) -> Recipe: ... - def remove_recipe(self, identifier: Identifier | str) -> Recipe | None: ... - def clear_recipes(self) -> Self: ... - - # BLOCK - def get_block(self) -> Block | None: ... - def add_block(self, block: Block) -> Block: ... - def remove_block(self, identifier: Identifier | str) -> Block | None: ... - def clear_blocks(self): ... +INSTANCE.create_registry(Registries.RESOURCE_PACK_FILE, File) - # ITEM - def get_item(self) -> Item | None: ... - def add_item(self, item: Item) -> Item: ... - def remove_item(self, identifier: Identifier | str) -> Item | None: ... - def clear_items(self) -> Self: ... +def resource_pack(cls): + """ + Add this resource pack file to the registry + """ - # VOLUME + def wrapper(): + if not issubclass(cls, File): + raise TypeError(f"Expected File but got '{cls.__name__}' instead") + return INSTANCE.register(Registries.RESOURCE_PACK_FILE, cls.id, cls) - def get_volume(self) -> Volume | None: ... - def add_volume(self, volume: Volume) -> Volume: ... - def remove_volume(self, identifier: Identifier | str) -> Item | None: ... - def clear_volumes(self) -> Self: ... + return wrapper() -class ResourcePack(ArchiveFile, Pack): +class ResourcePack(Pack): """ Represents a Resource Pack. """ + registry = INSTANCE.get_registry(Registries.RESOURCE_PACK_FILE) id = Identifier("resources") - EXTENSION = ".mcpack" - FILENAME = "untitled" - DIRNAME = "resource_packs" + FILEPATH = "resource_packs/untitled.mcpack" suffix = "_RP" def __init__( self, manifest: Manifest = None, texts: mclang.Lang = None, filename: str = None ): Pack.__init__(self, manifest, texts, filename) - self.setup() + self._create_file_methods() @property def MANIFEST(self): return getattr2(self, "_MANIFEST", Manifest.resource()) - @property - def blocks(self) -> dict[Identifier, Block]: - return getattr2(self, "_blocks", {}) - - @blocks.setter - def blocks(self, value: dict[Identifier, Block]): - if value is None: - self.blocks = {} - return - if not isinstance(value, dict): - raise TypeError( - f"Expected dict but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_blocks", value) - - @property - def items(self) -> dict[Identifier, Item]: - return getattr2(self, "_items", {}) - - @items.setter - def items(self, value: dict[Identifier, Item]): - if value is None: - self.items = {} - return - if not isinstance(value, dict): - raise TypeError( - f"Expected dict but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_items", value) - - @classmethod - def load(cls, filename: str = None) -> Self: - self = super().load(filename) - return self - - def setup(self): - self.file_types = [ - ItemAtlas.__new__(ItemAtlas), - TerrainAtlas.__new__(TerrainAtlas), - ] - self._create_file_methods() + # @classmethod + # def open(cls, filename: str = None) -> Self: + # self = super().load(filename) + # self.filename = os.path.basename(filename) + # return self # UTIL @@ -427,29 +446,15 @@ def merge(self, other) -> Self: ) return self - # SHORTHAND - - def add(self, obj) -> Self: - if isinstance(obj, ItemAtlas): - return self.add_item_texture(obj) - if isinstance(obj, TerrainAtlas): - return self.add_terrain_texture(obj) - raise TypeError(obj) - # FILE @classmethod - def readzip(cls, zip: ZipFile) -> Self: - self = cls.__new__(cls) - return self - - @classmethod - def readdir(cls, path: str) -> Self: + def load_archive(cls, zip: ZipFile) -> Self: self = cls.__new__(cls) + self._create_file_methods() return self - def writedir(self, path: str) -> None: - Pack.writedir(self, path) + def dump_directory(self, path: str) -> None: props = {"indent": 2} v = getattr(self, "textures", {}) @@ -461,8 +466,10 @@ def writedir(self, path: str) -> None: fp = os.path.join(tpath, t.filename + t.extension) t.save(fp) + # Blocks if len(self.blocks) >= 1: fp = os.path.join(path, "blocks.json") + os.makedirs(os.path.dirname(fp), exist_ok=True) data = {"format_version": VERSION["BLOCKS"]} for id, block in self.blocks.items(): b = {} @@ -473,11 +480,22 @@ def writedir(self, path: str) -> None: with open(fp, "w") as fd: fd.write(json.dumps(data, **props)) - def writezip(self, zip: ZipFile) -> None: - Pack.writezip(self, zip) + if hasattr(self, "clear_blocks"): + self.clear_blocks() + # self.clear_items() + Pack.dump_directory(self, path) + + # TODO: Write blocks and items + def dump_archive(self, zip: ZipFile) -> None: + if hasattr(self, "clear_blocks"): + self.clear_blocks() + # self.clear_items() + Pack.dump_archive(self, zip) - def import_to(self, edition: Edition = Edition.bedrock, dev: bool = True) -> str: - mojang = super().import_to(edition, dev) + def import_to( + self, name: str = None, edition: Edition = Edition.BEDROCK, dev: bool = True + ) -> str: + mojang = super().import_to(name, edition, dev) dirpath = ( os.path.join(mojang, "development_resource_packs") if dev @@ -485,56 +503,18 @@ def import_to(self, edition: Edition = Edition.bedrock, dev: bool = True) -> str ) path = os.path.join(dirpath, self.filename + self.suffix) os.makedirs(path, exist_ok=True) - self.writedir(path) + self.save(path, zipped=False, overwrite=True) return path - # BLOCK - - def get_block(self, identifier) -> Block | None: - return self.blocks.get(identifier) - - def add_block(self, block: Block) -> Block: - self.blocks[block.identifier] = block - return block - - def remove_block(self, identifier: Block | str) -> Block | None: - return self.blocks.pop(identifier) - def clear_block(self) -> Self: - self.blocks = {} - return self - - # ITEM - - def get_item(self, identifier) -> Item | None: - return self.items.get(identifier) - - def add_item(self, item: Item) -> Item: - self.items[item.identifier] = item - return item - - def remove_item(self, identifier: Item | str) -> Item | None: - return self.items.pop(identifier) - - def clear_item(self) -> Self: - self.items = {} - return self - - # ITEM ATLAS - - def get_item_texture(self, identifier) -> ItemAtlas | None: ... - def add_item_texture(self, atlas: ItemAtlas) -> ItemAtlas: ... - def remove_item_texture(self, identifier: ItemAtlas | str) -> ItemAtlas | None: ... - def clear_item_texture(self) -> Self: ... - - # TERRAIN ATLAS - - def get_terrain_texture(self, identifier) -> TerrainAtlas | None: ... - def add_terrain_texture(self, atlas: TerrainAtlas) -> TerrainAtlas: ... - def remove_terrain_texture( - self, identifier: TerrainAtlas | str - ) -> TerrainAtlas | None: ... - def clear_terrain_texture(self) -> Self: ... +def job(args): + cls, manifest, pack_path = args + if manifest.has_behavior(): + cls.add_pack(BehaviorPack.open(pack_path)) + elif manifest.has_resource(): + cls.add_pack(ResourcePack.open(pack_path)) + else: + raise TypeError(f'Unknown pack type "{manifest}"') class Addon(ArchiveFile, Importable): @@ -543,20 +523,21 @@ class Addon(ArchiveFile, Importable): """ id = Identifier("addon") - EXTENSION = ".mcaddon" - FILENAME = "untitled" + FILEPATH = "untitled.mcaddon" - def __init__(self): + def __init__(self, filename: str = None): + if filename is not None: + self.filename = filename self.setup() def __iter__(self): for i in self.packs: yield i - def __getitem__(self, item: Identifier | str | int): + def __getitem__(self, item: Identifiable | int): if isinstance(item, int): return self.packs[item] - id = Identifier(item) + id = Identifiable.of(item) for p in self.packs: if p.id == id: return p @@ -577,6 +558,7 @@ def packs(self, value: list[Pack]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("packs", value) setattr(self, "_packs", value) @property @@ -584,128 +566,110 @@ def manifests(self) -> list[Manifest]: return [p.manifest for p in self] @classmethod - def readzip(cls, zip: ZipFile) -> Self: - self = cls.__new__(cls) - return self + def load_archive(cls, zip: ZipFile, *args, **kw) -> Self: + raise NotImplementedError() + # self = cls.__new__(cls) + # return self @classmethod - def readdir(cls, path: str) -> Self: + def load_directory(cls, path: str, multiprocess: bool = False) -> Self: + self = cls.__new__(cls) self.clear_packs() - for fp in glob.glob(path + "/**/manifest.json"): - manifest = Manifest.load(fp) - pack_path = os.path.dirname(fp) + packs = [ + (self, Manifest.open(fp), os.path.dirname(fp)) + for fp in glob.glob(path + "/**/manifest.json") + ] - # print(manifest.pack()) + if multiprocess: + # with Pool(20) as p: + # packs = p.map(job, packs) + raise NotImplementedError("multiprocess not implemented yet!") + else: + for a in packs: + job(a) return self def setup(self): # name = os.path.basename(self.filename) self.packs = [ResourcePack(), BehaviorPack()] - def get(self, identifier: Identifier, default=None): + def get(self, identifier: Identifiable, default=None): try: - return self[identifier] + return self[Identifiable.of(identifier)] except (KeyError, IndexError): return default # PACK - def get_pack(self, identifier: Identifier) -> Pack | None: - return self.get(identifier) - - def add_pack(self, pack: Pack) -> Pack: + def append(self, pack: Pack) -> None: if not isinstance(pack, Pack): raise TypeError( f"Expected Pack but got '{pack.__class__.__name__}' instead" ) self.packs.append(pack) - return pack - def remove_pack(self, identifier: Identifier) -> Pack: + def extend(self, packs: list[Pack]) -> None: + self.packs.extend(packs) + + def get_pack(self, identifier: Identifiable) -> Pack | None: + return getitem(self, "packs", Identifiable.of(identifier)) + + def add_pack(self, pack: Pack) -> Pack: + return additem(self, "packs", pack, type=Pack) + + def remove_pack(self, identifier: Identifiable) -> Pack: + id = Identifiable.of(identifier) for i, p in enumerate(self.packs): - if p.id == identifier: + if p.id == id: p2 = self.packs[i] del self.packs[i] return p2 return None def clear_packs(self) -> Self: - self.packs = [] - return self + """Remove all packs""" + return clearitems(self, "packs") - # ADD + def add(self, obj) -> File: + """ + Add File to this addon - def add(self, obj) -> Self: - if isinstance(obj, Item): - return self.add_item(obj) - if isinstance(obj, Block): - return self.add_block(obj) - if isinstance(obj, Recipe): - return self.add_recipe(obj) - if isinstance(obj, Volume): - return self.add_volume(obj) - if isinstance(obj, LootTable): - return self.add_loot_table(obj) - if isinstance(obj, ItemAtlas): - return self.add_item_texture(obj) - if isinstance(obj, TerrainAtlas): - return self.add_terrain_texture(obj) - raise TypeError(obj) - - def add_recipe(self, recipe: Recipe) -> Recipe: - self["data"].add_recipe(recipe) - return recipe - - def add_block(self, block: Block) -> Block: - self["data"].add_block(block) - self["resources"].add_block(block) - return block - - def add_item(self, item: Item) -> Item: - self["data"].add_item(item) - self["resources"].add_item(item) - return item - - def add_volume(self, volume: Volume) -> Volume: - self["data"].add_volume(volume) - return volume - - def add_loot_table(self, loot_table: LootTable) -> LootTable: - self["data"].add_loot_table(loot_table) - return loot_table - - def add_item_texture(self, atlas: ItemAtlas) -> ItemAtlas: - self["resources"].add_item_texture(atlas) - return atlas - - def add_terrain_texture(self, atlas: TerrainAtlas) -> TerrainAtlas: - self["resources"].add_terrain_texture(atlas) - return atlas + :param obj: The file to add + :type obj: File + """ + try: + for pack in self.packs: + pack.add(obj) + except TypeError as err: + pass + return obj # FILE - def writedir(self, path: str) -> Self: - name = os.path.basename(path) + def dump_directory(self, path: str) -> Self: for p in self.packs: - filename = p.filename - if not p.has_filename(): - filename = name + p.suffix - p.writedir(os.path.join(path, os.path.basename(filename))) + p.dump_directory( + os.path.join(path, os.path.basename(self.filename + p.suffix)) + ) return self - def writezip(self, zip: ZipFile) -> Self: + def dump_archive(self, zip: ZipFile) -> Self: for p in self.packs: file_buffer = BytesIO() with ZipFile(file_buffer, "a", ZIP_DEFLATED, False) as zip_file: - p.writezip(zip_file) - fp = os.path.basename(p.filename) - if p.suffix != "": - fp += p.suffix - zip.writestr(fp + ".mcpack", file_buffer.getvalue()) + p.dump_archive(zip_file) + zip.writestr( + ( + self.filename + p.suffix + p.extension + if p.suffix != "" + else self.filename + p.extension + ), + file_buffer.getvalue(), + ) return self def import_to( - self, edition: Edition = Edition.bedrock, dev: bool = True + self, name: str = None, edition: Edition = Edition.BEDROCK, dev: bool = True ) -> list[str]: - return [pack.import_to(edition, dev) for pack in self] + return [pack.import_to(name, edition, dev) for pack in self] diff --git a/mcaddon/predicate.py b/mcaddon/predicate.py new file mode 100644 index 0000000..22fed03 --- /dev/null +++ b/mcaddon/predicate.py @@ -0,0 +1,152 @@ +from typing import Self + +from .util import getattr2, Misc + + +class Filter(Misc): + def __init__(self, test: str, value: str, operator: str = "=="): + self.test = test + self.value = value + self.operator = operator + + def __repr__(self) -> str: + return str(self) + + def __str__(self) -> str: + return "Filter{" + self.test + self.operator + self.value + "}" + + @property + def test(self) -> str: + return getattr(self, "_test") + + @test.setter + def test(self, value: str): + setattr(self, "_test", str(value)) + + @property + def value(self) -> str: + return getattr(self, "_value") + + @value.setter + def value(self, value: str): + setattr(self, "_value", str(value)) + + @property + def operator(self) -> str: + return getattr(self, "_operator") + + @operator.setter + def operator(self, value: str): + setattr(self, "_operator", str(value)) + + @staticmethod + def from_dict(data: dict) -> Self: + test = data.pop("test") + value = data.pop("value") + operator = data.pop("operator") if "operator" in data else "==" + return Filter(test, value, operator) + + def jsonify(self) -> dict: + data = {"test": self.test, "value": self.value} + if self.operator: + data["operator"] = self.operator + return data + + +class Filters(Misc): + def __init__(self, filters: list[Filter] = None): + self.filters = filters + + def __repr__(self) -> str: + return str(self) + + def __str__(self) -> str: + return self.__class__.__name__ + "{" + "}" + + def __iter__(self): + for f in self.filters: + yield f + + def __len__(self) -> int: + return len(self.filters) + + @property + def filters(self) -> list[Filter]: + return getattr2(self, "_filters", []) + + @filters.setter + def filters(self, value: list[Filter]): + if value is None: + self.filters = [] + return + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_filters", value) + + def get_filter(self, index: int) -> Filter | None: + return self.filters.get(index) + + def add_filter(self, filter: Filter) -> Filter: + if not isinstance(filter, (Filter, AllFilter, AnyFilter)): + raise TypeError( + f"Expected Filter, AnyFilters, AllFilters but got '{filter.__class__.__name__}' instead" + ) + self.filters.append(filter) + return filter + + def add_filters(self, *filter: Filter) -> list[Filter]: + return [self.add_filter(f) for f in filter] + + def remove_filter(self, index: int) -> Filter: + return self.filters.pop(index) + + def clear_filters(self) -> Self: + self.filters.clear() + return self + + @staticmethod + def from_dict(data: list) -> Self: + if isinstance(data, dict): + return Filters([Filter.from_dict(data)]) + return Filters([Filter.from_dict(x) for x in data]) + + def jsonify(self) -> list: + return [x.jsonify() for x in self] + + +class AllFilter(Filters): + @staticmethod + def from_dict(data: list) -> Self: + return AllFilter([Filter.from_dict(f) for f in data.pop("all_of")]) + + def add_filter(self, filter: Filter) -> Filter: + if not isinstance(filter, Filter): + raise TypeError( + f"Expected Filter but got '{filter.__class__.__name__}' instead" + ) + self.filters.append(filter) + return filter + + def jsonify(self) -> dict: + data = {"all_of": [f.jsonify() for f in self.filters]} + return data + + +class AnyFilter(Filters): + @staticmethod + def from_dict(data: dict) -> Self: + return AnyFilter([Filter.from_dict(f) for f in data.pop("any_of")]) + + def add_filter(self, filter: Filter) -> Filter: + if not isinstance(filter, Filter): + raise TypeError( + f"Expected Filter but got '{filter.__class__.__name__}' instead" + ) + self.filters.append(filter) + return filter + + def jsonify(self) -> dict: + data = {"any_of": [f.jsonify() for f in self.filters]} + return data diff --git a/mcaddon/recipe.py b/mcaddon/recipe.py index 426c7e3..1799b6a 100644 --- a/mcaddon/recipe.py +++ b/mcaddon/recipe.py @@ -1,27 +1,28 @@ from typing import Self -from .item import ItemStack -from .exception import RecipeTypeNotFoundError +from . import VERSION +from .exception import TypeNotFoundError from .registry import INSTANCE, Registries -from .constant import RecipeTag -from .file import JsonFile, Loader -from .util import getattr2, Identifier, Identifiable - -class Ingredient: - def __init__(self, item: ItemStack = None, tag: Identifier = None): +from .item import ItemStack +from .pack import behavior_pack +from .file import JsonFile, Loader, Misc +from .util import ( + getattr2, + getitem, + additem, + removeitem, + clearitems, + Identifier, + Identifiable, +) + + +class Ingredient(Misc): + def __init__(self, item: ItemStack = None, tag: Identifiable = None): self.item = item self.tag = tag - @property - def __dict__(self) -> dict: - data = {} - if self.item: - data = self.item.__dict__ - elif self.tag: - data["tag"] = str(self.tag) - return data - @classmethod def from_dict(cls, data: dict) -> Self: self = cls.__new__(cls) @@ -34,7 +35,7 @@ def from_dict(cls, data: dict) -> Self: @property def item(self) -> ItemStack: """Item used as input for the recipe.""" - return getattr(self, "_item") + return getattr(self, "_item", None) @item.setter def item(self, value: ItemStack): @@ -42,44 +43,52 @@ def item(self, value: ItemStack): raise TypeError( f"Expected ItemStack but got '{value.__class__.__name__}' instead" ) + self.on_update("item", value) setattr(self, "_item", value) @property def tag(self) -> Identifier: """Tag used as input for the recipe.""" - return getattr(self, "_tag") + return getattr(self, "_tag", None) @tag.setter - def tag(self, value: Identifier): - if not isinstance(value, (Identifier, str)): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - setattr(self, "_tag", Identifier(value)) + def tag(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("tag", id) + setattr(self, "_tag", id) + + def jsonify(self) -> dict: + data = {} + if self.item: + data = self.item.jsonify() + elif self.tag: + data["tag"] = str(self.tag) + return data + @staticmethod + def of(obj) -> Self: + if isinstance(obj, Ingredient): + return obj + elif isinstance(obj, ItemStack): + return Ingredient(obj) + res = str(obj) + if res.startswith("#"): + return Ingredient(tag=res.replace("#", "", 1)) + return Ingredient(ItemStack(res)) -class Recipe(JsonFile, Identifiable): - EXTENSION = ".json" - FILENAME = "recipe" - DIRNAME = "recipes" - def __init__(self, identifier: Identifier | str, tags: list[RecipeTag] = None): +class Recipe(JsonFile, Identifiable): + def __init__(self, identifier: Identifiable, tags: list[str] = []): Identifiable.__init__(self, identifier) self.tags = tags def __str__(self) -> str: - return "Recipe{" + str(self.identifier) + "}" + return self.__class__.__name__ + "{" + str(self.identifier) + "}" - @property - def __dict__(self) -> dict: - recipe = { - "tags": [ - str(tag._value_) if isinstance(tag, RecipeTag) else str(tag) - for tag in self.tags - ] - } + def jsonify(self) -> dict: + recipe = {"tags": [str(tag) for tag in self.tags]} data = { - "format_version": "1.20.51", + "format_version": "1.20.50", str(self.id): {"description": {"identifier": str(self.identifier)}}, } for k, v in recipe.items(): @@ -94,7 +103,7 @@ def from_dict(cls, data: dict) -> Self: dat = data.get(str(self.id)) self.identifier = dat["description"]["identifier"] return self - raise RecipeTypeNotFoundError(data) + raise TypeNotFoundError(data) @property def id(self) -> Identifier: @@ -102,15 +111,15 @@ def id(self) -> Identifier: @id.setter def id(self, value: Identifier): - setattr(self, "_id", Identifier(value)) + setattr(self, "_id", Identifier.of(value)) @property - def tags(self) -> list[RecipeTag]: + def tags(self) -> list[str]: """Item used in a Recipe.""" return getattr2(self, "_tags", []) @tags.setter - def tags(self, value: list[RecipeTag]): + def tags(self, value: list[str]): if value is None: self.tags = [] return @@ -118,6 +127,7 @@ def tags(self, value: list[RecipeTag]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("tags", value) setattr(self, "_tags", value) @property @@ -134,23 +144,21 @@ def result(self, value: ItemStack | list[ItemStack]): raise TypeError( f"Expected ItemStack but got '{value.__class__.__name__}' instead" ) + self.on_update("result", value) setattr(self, "_result", value) - def add_tag(self, tag: RecipeTag | str) -> str: - if not isinstance(tag, (RecipeTag, str)): - raise TypeError( - f"Expected RecipeTag but got '{tag.__class__.__name__}' instead" - ) - self.tags.append(tag) - return tag + def get_tag(self, index: int) -> str: + return getitem(self, "tags", index) - def remove_tag(self, tag: RecipeTag | str) -> Self: - self.tags.remove(tag) - return self + def add_tag(self, tag: str | str) -> str: + return additem(self, "tags", tag, type=str) + + def remove_tag(self, index: int) -> Self: + return removeitem(self, "tags", index) def clear_tags(self) -> Self: - self.tags = [] - return self + """Remove all tags""" + return clearitems(self, "tags") INSTANCE.create_registry(Registries.RECIPE_TYPE, Recipe) @@ -168,23 +176,24 @@ def wrapper(): @recipe_type +@behavior_pack class FurnaceRecipe(Recipe): - """Represents a furnace recipe for a furnace.'Input' items will burn and transform into items specified in 'output'.""" + """Represents a [furnace recipe](https://bedrock.dev/docs/stable/Recipes#Furnace%20Recipe) for a furnace.'Input' items will burn and transform into items specified in 'output'.""" id = Identifier("recipe_furnace") + FILEPATH = "recipes/recipe_furnace.json" def __init__( - self, identifier: Identifier | str, input: ItemStack, output: ItemStack + self, identifier: Identifier | str, input: Ingredient, output: ItemStack ): Recipe.__init__(self, identifier) self.input = input self.output = output - self.add_tag(RecipeTag.furnace) + self.add_tag("furnace") - @property - def __dict__(self) -> dict: - data = super().__dict__ - data[str(self.id)]["input"] = str(self.input.item) + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["input"] = self.input.item.jsonify() data[str(self.id)]["output"] = str(self.output.item) return data @@ -205,6 +214,7 @@ def input(self, value: Ingredient): raise TypeError( f"Expected Ingredient but got '{value.__class__.__name__}' instead" ) + self.on_update("input", value) setattr(self, "_input", value) @property @@ -218,6 +228,7 @@ def output(self, value: ItemStack): raise TypeError( f"Expected ItemStack but got '{value.__class__.__name__}' instead" ) + self.on_update("output", value) setattr(self, "_output", value) @@ -230,14 +241,16 @@ def __init__(self): Loader.__init__(self, FurnaceRecipe) self.add_schema(FurnaceSchem1, "1.12") self.add_schema(FurnaceSchem1, "1.20.10") - self.add_schema(FurnaceSchem1, "1.20.51") + self.add_schema(FurnaceSchem1, "1.20.50") @recipe_type +@behavior_pack class BrewingContainerRecipe(Recipe): - """Represents a Potion Brewing Container Recipe.""" + """Represents a [Potion Brewing Container Recipe](https://bedrock.dev/docs/stable/Recipes#Potion%20Brewing%20Container%20Recipe).""" id = Identifier("recipe_brewing_container") + FILEPATH = "recipes/recipe_brewing_container.json" def __init__( self, @@ -250,11 +263,10 @@ def __init__( self.input = input self.reagent = reagent self.output = output - self.add_tag(RecipeTag.brewing_stand) + self.add_tag("brewing_stand") - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data[str(self.id)]["input"] = str(self.input.item) data[str(self.id)]["reagent"] = str(self.reagent.item) data[str(self.id)]["output"] = str(self.output.item) @@ -277,6 +289,7 @@ def input(self, value: ItemStack): raise TypeError( f"Expected ItemStack but got '{value.__class__.__name__}' instead" ) + self.on_update("input", value) setattr(self, "_input", value) @property @@ -290,6 +303,7 @@ def reagent(self, value: ItemStack): raise TypeError( f"Expected ItemStack but got '{value.__class__.__name__}' instead" ) + self.on_update("reagent", value) setattr(self, "_reagent", value) @property @@ -303,6 +317,7 @@ def output(self, value: ItemStack): raise TypeError( f"Expected ItemStack but got '{value.__class__.__name__}' instead" ) + self.on_update("output", value) setattr(self, "_output", value) @@ -315,13 +330,16 @@ def __init__(self): Loader.__init__(self, BrewingContainerRecipe) self.add_schema(BrewingContainerSchem1, "1.12") self.add_schema(BrewingContainerSchem1, "1.20.10") + self.add_schema(BrewingContainerSchem1, "1.20.50") @recipe_type +@behavior_pack class BrewingMixRecipe(Recipe): - """Represents a Potion Brewing Mix.""" + """Represents a [Potion Brewing Mix](https://bedrock.dev/docs/stable/Recipes#Potion%20Brewing%20Mix).""" id = Identifier("recipe_brewing_mix") + FILEPATH = "recipes/recipe_brewing_mix.json" def __init__( self, @@ -334,11 +352,10 @@ def __init__( self.input = input self.reagent = reagent self.output = output - self.add_tag(RecipeTag.brewing_stand) + self.add_tag("brewing_stand") - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data[str(self.id)]["input"] = str(self.input.item) data[str(self.id)]["reagent"] = str(self.reagent.item) data[str(self.id)]["output"] = str(self.output.item) @@ -361,6 +378,7 @@ def input(self, value: ItemStack): raise TypeError( f"Expected ItemStack but got '{value.__class__.__name__}' instead" ) + self.on_update("input", value) setattr(self, "_input", value) @property @@ -374,6 +392,7 @@ def reagent(self, value: ItemStack): raise TypeError( f"Expected ItemStack but got '{value.__class__.__name__}' instead" ) + self.on_update("reagent", value) setattr(self, "_reagent", value) @property @@ -387,6 +406,7 @@ def output(self, value: ItemStack): raise TypeError( f"Expected ItemStack but got '{value.__class__.__name__}' instead" ) + self.on_update("output", value) setattr(self, "_output", value) @@ -399,33 +419,41 @@ def __init__(self): Loader.__init__(self, BrewingMixRecipe) self.add_schema(BrewingMixSchem1, "1.12") self.add_schema(BrewingMixSchem1, "1.20.10") + self.add_schema(BrewingMixSchem1, "1.20.50") @recipe_type +@behavior_pack class ShapedRecipe(Recipe): """ - Represents a shaped crafting recipe for a crafting table. + Represents a [shaped crafting recipe](https://bedrock.dev/docs/stable/Recipes#Shaped%20Recipe) for a crafting table. The key used in the pattern may be any single character except the 'space' character, which is reserved for empty slots in a recipe. """ id = Identifier("recipe_shaped") + FILEPATH = "recipes/recipe_shaped.json" - def __init__(self, identifier: Identifier, pattern: list[str], result: ItemStack): + def __init__( + self, identifier: Identifier, result: ItemStack, pattern: list[str] = [] + ): Recipe.__init__(self, identifier) self.pattern = pattern self.key = {} self.result = result - self.add_tag(RecipeTag.crafting_table) + self.add_tag("crafting_table") - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data[str(self.id)]["pattern"] = self.pattern data[str(self.id)]["key"] = {} for k, v in self.key.items(): - data[str(self.id)]["key"][k] = v.__dict__ - data[str(self.id)]["result"] = self.result.__dict__ + data[str(self.id)]["key"][k] = v.jsonify() + + if isinstance(self.result, list): + data[str(self.id)]["result"] = [x.jsonify() for x in self.result] + else: + data[str(self.id)]["result"] = self.result.jsonify() return data @classmethod @@ -448,6 +476,7 @@ def pattern(self, value: list[str]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("pattern", value) setattr(self, "_pattern", value) @property @@ -464,6 +493,7 @@ def key(self, value: dict[str, ItemStack]): raise TypeError( f"Expected dict but got '{value.__class__.__name__}' instead" ) + self.on_update("key", value) setattr(self, "_key", value) def add_key(self, key: str, stack: ItemStack) -> ItemStack: @@ -495,24 +525,29 @@ def __init__(self): self.add_schema(ShapedSchem1, "1.14") self.add_schema(ShapedSchem1, "1.16") self.add_schema(ShapedSchem1, "1.20.10") - self.add_schema(ShapedSchem1, "1.20.51") + self.add_schema(ShapedSchem1, "1.20.50") @recipe_type +@behavior_pack class ShapelessRecipe(Recipe): + """ + Represents a [shapeless crafting recipe](https://bedrock.dev/docs/stable/Recipes#Shapeless%20Recipe). + """ + id = Identifier("recipe_shapeless") + FILEPATH = "recipes/recipe_shapeless.json" def __init__(self, identifier: Identifier, result: ItemStack): Recipe.__init__(self, identifier) self.ingredients = [] self.result = result - self.add_tag(RecipeTag.crafting_table) + self.add_tag("crafting_table") - @property - def __dict__(self) -> dict: - data = super().__dict__ - data[str(self.id)]["ingredients"] = [x.__dict__ for x in self.ingredients] - data[str(self.id)]["result"] = self.result.__dict__ + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["ingredients"] = [x.jsonify() for x in self.ingredients] + data[str(self.id)]["result"] = self.result.jsonify() return data @classmethod @@ -522,12 +557,12 @@ def from_dict(cls, data: dict) -> Self: return loader.load(data) @property - def ingredients(self) -> list[RecipeTag]: + def ingredients(self) -> list[str]: """items used as input (without a shape) for the recipe.""" return getattr2(self, "_ingredients", []) @ingredients.setter - def ingredients(self, value: list[RecipeTag]): + def ingredients(self, value: list[str]): if value is None: self.ingredients = [] return @@ -535,6 +570,7 @@ def ingredients(self, value: list[RecipeTag]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("ingredients", value) setattr(self, "_ingredients", value) def add_ingredient(self, stack: ItemStack) -> ItemStack: @@ -561,18 +597,20 @@ def __init__(self): self.add_schema(ShapelessSchem1, "1.16") self.add_schema(ShapelessSchem1, "1.19") self.add_schema(ShapelessSchem1, "1.20.10") - self.add_schema(ShapelessSchem1, "1.20.51") + self.add_schema(ShapelessSchem1, "1.20.50") @recipe_type +@behavior_pack class SmithingTransformRecipe(Recipe): """ - Represents a Smithing Transform Recipe for the Smithing Table. + Represents a [Smithing Transform Recipe](https://bedrock.dev/docs/stable/Recipes#Smithing%20Transform%20Recipe) for the Smithing Table. This recipe transforms an item into another one, while retaining its properties. """ id = Identifier("recipe_smithing_transform") + FILEPATH = "recipes/recipe_smithing_transform.json" def __init__( self, @@ -587,11 +625,10 @@ def __init__( self.base = base self.addition = addition self.result = result - self.add_tag(RecipeTag.smithing_table) + self.add_tag("smithing_table") - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data[str(self.id)]["template"] = str(self.template.item) data[str(self.id)]["base"] = str(self.base.item) data[str(self.id)]["addition"] = str(self.addition.item) @@ -615,6 +652,7 @@ def template(self, value: ItemStack): raise TypeError( f"Expected ItemStack but got '{value.__class__.__name__}' instead" ) + self.on_update("template", value) setattr(self, "_template", value) @property @@ -628,6 +666,7 @@ def addition(self, value: ItemStack): raise TypeError( f"Expected ItemStack but got '{value.__class__.__name__}' instead" ) + self.on_update("addition", value) setattr(self, "_addition", value) @property @@ -641,6 +680,7 @@ def base(self, value: ItemStack): raise TypeError( f"Expected ItemStack but got '{value.__class__.__name__}' instead" ) + self.on_update("base", value) setattr(self, "_base", value) @property @@ -653,6 +693,7 @@ def result(self, value: ItemStack): raise TypeError( f"Expected ItemStack but got '{value.__class__.__name__}' instead" ) + self.on_update("result", value) setattr(self, "_result", value) @@ -665,38 +706,39 @@ def __init__(self): Loader.__init__(self, SmithingTransformRecipe) self.add_schema(SmithingTransformSchem2, "1.12") self.add_schema(SmithingTransformSchem1, "1.20.10") - self.add_schema(SmithingTransformSchem1, "1.20.51") + self.add_schema(SmithingTransformSchem1, "1.20.50") @recipe_type +@behavior_pack class SmithingTrimRecipe(Recipe): """ - Represents a Smithing Trim Recipe for the Smithing Table. + Represents a [Smithing Trim Recipe](https://bedrock.dev/docs/stable/Recipes#Smithing%20Trim%20Recipe) for the Smithing Table. This recipe applies a colored trim pattern to an item, while preserving its other properties. """ id = Identifier("recipe_smithing_trim") + FILEPATH = "recipes/recipe_smithing_trim.json" def __init__( self, identifier: Identifier, - template: ItemStack, - base: ItemStack, - addition: ItemStack, + template: Ingredient, + base: Ingredient, + addition: Ingredient, ): Recipe.__init__(self, identifier) self.template = template self.base = base self.addition = addition - self.add_tag(RecipeTag.smithing_table) + self.add_tag("smithing_table") - @property - def __dict__(self) -> dict: - data = super().__dict__ - data[str(self.id)]["template"] = str(self.template.item) - data[str(self.id)]["base"] = str(self.base.item) - data[str(self.id)]["addition"] = str(self.addition.item) + def jsonify(self) -> dict: + data = super().jsonify() + data[str(self.id)]["template"] = self.template.item.jsonify() + data[str(self.id)]["base"] = self.base.item.jsonify() + data[str(self.id)]["addition"] = self.addition.item.jsonify() return data @classmethod @@ -716,6 +758,7 @@ def template(self, value: Ingredient): raise TypeError( f"Expected Ingredient but got '{value.__class__.__name__}' instead" ) + self.on_update("template", value) setattr(self, "_template", value) @property @@ -729,6 +772,7 @@ def base(self, value: Ingredient): raise TypeError( f"Expected Ingredient but got '{value.__class__.__name__}' instead" ) + self.on_update("base", value) setattr(self, "_base", value) @property @@ -742,6 +786,7 @@ def addition(self, value: Ingredient): raise TypeError( f"Expected Ingredient but got '{value.__class__.__name__}' instead" ) + self.on_update("addition", value) setattr(self, "_addition", value) @@ -754,26 +799,31 @@ def __init__(self): Loader.__init__(self, SmithingTrimRecipe) self.add_schema(SmithingTrimSchem1, "1.12") self.add_schema(SmithingTrimSchem1, "1.20.10") - self.add_schema(SmithingTrimSchem1, "1.20.51") + self.add_schema(SmithingTrimSchem1, "1.20.50") @recipe_type +@behavior_pack class MaterialReductionRecipe(Recipe): + """ + Represents a Material Reduction Recipe for the Material Reducer. + """ + id = Identifier("recipe_material_reduction") + FILEPATH = "recipes/recipe_material_reduction.json" def __init__( - self, identifier: Identifier, input: ItemStack, output: list[ItemStack] + self, identifier: Identifier, input: Ingredient, output: list[ItemStack] ): Recipe.__init__(self, identifier) self.input = input self.output = output - self.add_tag(RecipeTag.material_reducer) + self.add_tag("material_reducer") - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data[str(self.id)]["input"] = str(self.input.item) - data[str(self.id)]["output"] = [str(x.item) for x in self.output] + data[str(self.id)]["output"] = [x.item.jsonify() for x in self.output] return data @classmethod @@ -783,15 +833,16 @@ def from_dict(cls, data: dict) -> Self: return loader.load(data) @property - def input(self) -> ItemStack: + def input(self) -> Ingredient: return getattr(self, "_input") @input.setter - def input(self, value: ItemStack): - if not isinstance(value, ItemStack): + def input(self, value: Ingredient): + if not isinstance(value, Ingredient): raise TypeError( - f"Expected ItemStack but got '{value.__class__.__name__}' instead" + f"Expected Ingredient but got '{value.__class__.__name__}' instead" ) + self.on_update("input", value) setattr(self, "_input", value) @property @@ -804,6 +855,7 @@ def output(self, value: list[ItemStack]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("output", value) setattr(self, "_output", value) @@ -818,8 +870,14 @@ def __init__(self): # SHORTCUT + + class StonecuttingRecipe(ShapelessRecipe): + """ + Represents a Shapeless Recipe for the Stonecutter. + """ + def __init__(self, identifier: Identifier, result: ItemStack): ShapelessRecipe.__init__(self, identifier, result) self.clear_tags() - self.add_tag(RecipeTag.stonecutter) + self.add_tag("stonecutter") diff --git a/mcaddon/registry.py b/mcaddon/registry.py index 4309077..7339397 100644 --- a/mcaddon/registry.py +++ b/mcaddon/registry.py @@ -1,10 +1,13 @@ from enum import Enum from .exception import RegistryError -from .util import Identifier +from .util import Identifier, Identifiable class Registries(Enum): + + # Global + BLOCK_COMPONENT_TYPE = Identifier("block_component_type") BLOCK_TYPE = Identifier("block_type") ITEM_COMPONENT_TYPE = Identifier("item_component_type") @@ -16,6 +19,41 @@ class Registries(Enum): POOL_ENTRY_TYPE = Identifier("pool_entry_type") LOOT_FUNCTION_TYPE = Identifier("loot_function_type") LOOT_CONDITION_TYPE = Identifier("loot_condition_type") + ELEMENT_TYPE = Identifier("element_type") + FEATURE_TYPE = Identifier("feature_type") + + TREE_TRUNK = Identifier("tree_trunk") + TREE_CANOPY = Identifier("tree_canopy") + TREE_ROOT = Identifier("tree_root") + + BEHAVIOR_PACK_FILE = Identifier("behavior_pack_file") + RESOURCE_PACK_FILE = Identifier("resource_pack_file") + + # Pack Only - unimplemented + + RECIPE = Identifier("recipe") + ITEM = Identifier("item") + BLOCK = Identifier("block") + FEATURE = Identifier("feature") + FEATURE_RULE = Identifier("feature_rule") + VOLUME = Identifier("volume") + CAMERA = Identifier("camera") + LOOT_TABLE = Identifier("loot_table") + TRADING = Identifier("trading") + ENTITY = Identifier("entity") + ANIMATION = Identifier("animation") + ANIMATION_CONTROLLER = Identifier("animation_controller") + RENDER_CONTROLLER = Identifier("render_controller") + ATTACHABLE = Identifier("attachable") + FOG = Identifier("fog") + MODEL = Identifier("model") + BIOME = Identifier("biome") + CLIENT_BIOME = Identifier("client_biome") + PARTICLE = Identifier("particle") + PIECE = Identifier("piece") + SPAWN_RULE = Identifier("spawn_rule") + STRUCTURE = Identifier("structure") + UI = Identifier("ui") class RegistryKey: @@ -27,6 +65,9 @@ def __iter__(self): for k, v in self.instances.items(): yield v + def __str__(self) -> str: + return "RegistryKey{" + str(self.type) + "}" + def keys(self): return self.instances.keys() @@ -36,35 +77,37 @@ def values(self): def items(self): return self.instances.items() - def get(self, identifier: Identifier): + def get(self, identifier: Identifiable): + id = Identifiable.of(identifier) for k, v in self.instances.items(): - if k == identifier: + if k == id: return v return None - def register(self, identifier: Identifier, obj): + def register(self, identifier: Identifiable, obj): if not issubclass(obj, self.type): raise TypeError( f"Expected {self.type.__name__} but got '{obj.__name__}' instead" ) - if identifier in self.instances: + id = Identifiable.of(identifier) + if id in self.instances: raise RegistryError(f"'{identifier}' is already registered!") - self.instances[identifier] = obj + self.instances[id] = obj return obj class Registry: def __init__(self): - self.registryistries = {} + self.registries = {} - def register(self, registry: Registries, identifier: Identifier, obj): + def register(self, registry: Registries, identifier: Identifiable, obj): return self.get_registry(registry).register(identifier, obj) def get_registry(self, registry: Registries) -> RegistryKey: - return self.registryistries[registry._value_] + return self.registries[registry._value_] def create_registry(self, registry: Registries, type) -> None: - self.registryistries[registry._value_] = RegistryKey(type) + self.registries[registry._value_] = RegistryKey(type) return None diff --git a/mcaddon/resrouce.py b/mcaddon/resrouce.py index db6455c..3a98395 100644 --- a/mcaddon/resrouce.py +++ b/mcaddon/resrouce.py @@ -2,8 +2,17 @@ from PIL import Image, ImageFile import os -from .util import getattr2, Identifier, Identifiable +from .util import ( + getattr2, + getitem, + additem, + removeitem, + clearitems, + Identifier, + Identifiable, +) from .file import JsonFile, PngFile +from .pack import resource_pack class Texture(PngFile): @@ -11,9 +20,8 @@ class Texture(PngFile): Represents a Texture. """ - FILENAME = "texture" - EXTENSION = ".png" - DIRNAME = "textures" + id = Identifier("texture") + FILEPATH = "textures/texture.png" def __init__(self, path: str, image: ImageFile.ImageFile): self.path = path @@ -25,8 +33,7 @@ def __repr__(self) -> str: def __str__(self) -> str: return "Texture{" + repr(self.filename + self.extension) + "}" - @property - def __dict__(self) -> str: + def jsonify(self) -> str: return os.path.join( "textures", self.path, self.filename + self.extension ).replace("\\", "/") @@ -37,7 +44,9 @@ def path(self) -> str: @path.setter def path(self, value: str): - setattr(self, "_path", str(value)) + v = str(value) + self.on_update("path", v) + setattr(self, "_path", v) @classmethod def load(cls, filename: str, path: str) -> Self: @@ -52,7 +61,7 @@ def save(self, fp: str): class _TextureDef(Identifiable): - def __init__(self, identifier: Identifier, textures: list[Texture]): + def __init__(self, identifier: Identifiable, textures: list[Texture]): Identifiable.__init__(self, identifier) self.textures = textures @@ -66,13 +75,12 @@ def __repr__(self) -> str: def __str__(self) -> str: return "TextureDef{" + str(self.identifier) + "}" - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {} if len(self.textures) == 1: - data["textures"] = self.textures[0].__dict__ + data["textures"] = self.textures[0].jsonify() else: - data["textures"] = [t.__dict__ for t in self.textures] + data["textures"] = [t.jsonify() for t in self.textures] return data @property @@ -85,8 +93,22 @@ def textures(self, value: list[Texture]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("textures", value) setattr(self, "_textures", value) + def get_texture(self, index: int) -> Texture: + return getitem(self, "textures", index) + + def add_texture(self, texture: Texture) -> Texture: + return additem(self, "textures", texture, type=Texture) + + def remove_texture(self, index: int) -> Texture: + return removeitem(self, "textures", index) + + def clear_textures(self) -> Self: + """Remove all textures""" + return clearitems(self, "textures") + class ItemTexture(_TextureDef): """ @@ -111,7 +133,7 @@ class FlipbookTexture(Identifiable): def __init__( self, - identifier: Identifier, + identifier: Identifiable, flipbook_texture: Texture, atlas_tile: int = None, atlas_index: int = None, @@ -131,8 +153,7 @@ def __init__( self.replicate = replicate self.blend_frames = blend_frames - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"flipbook_texture": self.flipbook_texture.path} if self.atlas_tile: data["atlas_tile"] = self.atlas_tile @@ -159,7 +180,9 @@ def atlas_tile(self, value: str): if value is None: setattr(self, "_atlas_tile", None) return - setattr(self, "_atlas_tile", str(value)) + v = str(value) + self.on_update("atlas_tile", v) + setattr(self, "_atlas_tile", v) @property def atlas_index(self) -> int: @@ -174,6 +197,7 @@ def atlas_index(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("atlas_index", value) setattr(self, "_atlas_index", value) @property @@ -189,6 +213,7 @@ def atlas_tile_variant(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("atlas_tile_variant", value) setattr(self, "_atlas_tile_variant", value) @property @@ -204,6 +229,7 @@ def ticks_per_frame(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("ticks_per_frame", value) setattr(self, "_ticks_per_frame", value) @property @@ -219,6 +245,7 @@ def frames(self, value: list[int]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("frames", value) setattr(self, "_frames", value) @property @@ -234,6 +261,7 @@ def replicate(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("replicate", value) setattr(self, "_replicate", value) @property @@ -249,6 +277,7 @@ def blend_frames(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("blend_frames", value) setattr(self, "_blend_frames", value) @@ -257,7 +286,7 @@ def __init__( self, resource_pack_name: str = None, texture_name: str = None, - texture_data: dict[Identifier, dict] = None, + texture_data: dict[Identifiable, dict] = None, ): self.resource_pack_name = resource_pack_name self.texture_name = texture_name @@ -267,8 +296,7 @@ def __iter__(self): for t in self.texture_data.values(): yield t - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = { "resource_pack_name": self.resource_pack_name, "texture_name": self.texture_name, @@ -276,7 +304,7 @@ def __dict__(self) -> dict: } for k, v in self.texture_data.items(): key = k.path if k.namespace == "minecraft" else k - data["texture_data"][str(key)] = v.__dict__ + data["texture_data"][str(key)] = v.jsonify() return data @property @@ -288,7 +316,9 @@ def resource_pack_name(self, value: str): if value is None: self.resource_pack_name = "vanilla" return - setattr(self, "_resource_pack_name", str(value)) + v = str(value) + self.on_update("resource_pack_name", v) + setattr(self, "_resource_pack_name", v) @property def texture_name(self) -> str: @@ -299,14 +329,16 @@ def texture_name(self, value: str): if value is None: self.texture_name = "atlas.terrain" return - setattr(self, "_texture_name", str(value)) + v = str(value) + self.on_update("texture_name", v) + setattr(self, "_texture_name", v) @property def texture_data(self) -> dict[Identifier, dict]: return getattr2(self, "_texture_data", {}) @texture_data.setter - def texture_data(self, value: dict[Identifier, dict]): + def texture_data(self, value: dict[Identifiable, dict]): if value is None: self.texture_data = {} return @@ -314,39 +346,44 @@ def texture_data(self, value: dict[Identifier, dict]): raise TypeError( f"Expected dict but got '{value.__class__.__name__}' instead" ) - setattr(self, "_texture_data", value) + data = {} + for k, v in value.items(): + data[Identifiable.of(k)] = v + self.on_update("texture_data", data) + setattr(self, "_texture_data", data) - def get_texture(self, identifier: Identifier) -> dict | None: - return self.texture_data.get(identifier) + @property + def id(self) -> Identifier: + return getattr(self, "_id") - def add_texture(self, texture: _TextureDef) -> _TextureDef: - if not isinstance(texture, _TextureDef): - raise TypeError( - f"Expected _TextureDef but got '{texture.__class__.__name__}' instead" - ) - self.texture_data[texture.identifier] = texture - return texture + @id.setter + def id(self, value: Identifier): + setattr(self, "_id", Identifier.of(value)) - def remove_texture(self, identifier: Identifier) -> dict | None: - return self.texture_data.pop(identifier) + def get_texture_data(self, identifier: Identifiable) -> dict | None: + return getitem(self, "texture_data", Identifiable.of(identifier)) - def clear_textures(self) -> Self: - self.texture_data = {} - return self + def add_texture_data(self, texture: _TextureDef) -> _TextureDef: + return additem(self, "texture_data", texture, texture.identifier) + + def remove_texture_data(self, texture: Identifiable) -> dict | None: + return removeitem(self, "texture_data", Identifiable.of(texture)) + + def clear_texture_data(self) -> Self: + return clearitems(self, "texture_data") def items(self): return self.texture_data.items() +@resource_pack class TerrainAtlas(_Atlas): """ Represents a Terrain Textures Atlas. """ - identifier = Identifier("terrain_texture") - FILENAME = "terrain_texture" - EXTENSION = ".json" - DIRNAME = "textures" + id = Identifier("terrain_texture") + FILEPATH = "textures/terrain_texture.json" def __init__( self, @@ -354,15 +391,14 @@ def __init__( texture_name: str = None, padding: int = None, num_mip_levels: int = None, - texture_data: dict[Identifier, dict] = None, + texture_data: dict[Identifiable, dict] = None, ): _Atlas.__init__(self, resource_pack_name, texture_name, texture_data) self.padding = padding self.num_mip_levels = num_mip_levels - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() data["padding"] = self.padding data["num_mip_levels"] = self.num_mip_levels return data @@ -379,6 +415,7 @@ def padding(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("padding", value) setattr(self, "_padding", value) @property @@ -394,28 +431,27 @@ def num_mip_levels(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("num_mip_levels", value) setattr(self, "_num_mip_levels", value) +@resource_pack class ItemAtlas(_Atlas): """ Represents a Item Textures Atlas. """ - identifier = Identifier("item_texture") - FILENAME = "item_texture" - EXTENSION = ".json" - DIRNAME = "textures" + id = Identifier("item_texture") + FILEPATH = "textures/item_texture.json" def __init__( self, resource_pack_name: str = None, texture_name: str = None, - texture_data: dict[Identifier, dict] = None, + texture_data: dict[Identifiable, dict] = None, ): _Atlas.__init__(self, resource_pack_name, texture_name, texture_data) - @property - def __dict__(self) -> dict: - data = super().__dict__ + def jsonify(self) -> dict: + data = super().jsonify() return data diff --git a/mcaddon/schemas/__init__.py b/mcaddon/schemas/__init__.py index 0e186a2..b3d0ce8 100644 --- a/mcaddon/schemas/__init__.py +++ b/mcaddon/schemas/__init__.py @@ -1,12 +1,10 @@ -""" -> You must include these files in your app otherwise things will break. - -This directory contains both a PYTHON and JSON file for each format version to convert the file from JSON to a PYTHON object using the specified format. -""" - from .manifest import * from .block import * +from .block_culling import * from .item import * from .recipe import * from .volume import * from .camera import * +from .feature import * +from .feature_rule import * +from .geometry import * diff --git a/mcaddon/schemas/__pycache__/__init__.cpython-311.pyc b/mcaddon/schemas/__pycache__/__init__.cpython-311.pyc index 7956e63..8b6ace8 100644 Binary files a/mcaddon/schemas/__pycache__/__init__.cpython-311.pyc and b/mcaddon/schemas/__pycache__/__init__.cpython-311.pyc differ diff --git a/mcaddon/schemas/__pycache__/block.cpython-311.pyc b/mcaddon/schemas/__pycache__/block.cpython-311.pyc index 66ab8ba..e292049 100644 Binary files a/mcaddon/schemas/__pycache__/block.cpython-311.pyc and b/mcaddon/schemas/__pycache__/block.cpython-311.pyc differ diff --git a/mcaddon/schemas/__pycache__/block_culling.cpython-311.pyc b/mcaddon/schemas/__pycache__/block_culling.cpython-311.pyc new file mode 100644 index 0000000..500956e Binary files /dev/null and b/mcaddon/schemas/__pycache__/block_culling.cpython-311.pyc differ diff --git a/mcaddon/schemas/__pycache__/camera.cpython-311.pyc b/mcaddon/schemas/__pycache__/camera.cpython-311.pyc index e0d8d5f..76e3783 100644 Binary files a/mcaddon/schemas/__pycache__/camera.cpython-311.pyc and b/mcaddon/schemas/__pycache__/camera.cpython-311.pyc differ diff --git a/mcaddon/schemas/__pycache__/feature.cpython-311.pyc b/mcaddon/schemas/__pycache__/feature.cpython-311.pyc new file mode 100644 index 0000000..bb42134 Binary files /dev/null and b/mcaddon/schemas/__pycache__/feature.cpython-311.pyc differ diff --git a/mcaddon/schemas/__pycache__/feature_rule.cpython-311.pyc b/mcaddon/schemas/__pycache__/feature_rule.cpython-311.pyc new file mode 100644 index 0000000..46ab731 Binary files /dev/null and b/mcaddon/schemas/__pycache__/feature_rule.cpython-311.pyc differ diff --git a/mcaddon/schemas/__pycache__/geometry.cpython-311.pyc b/mcaddon/schemas/__pycache__/geometry.cpython-311.pyc new file mode 100644 index 0000000..010801e Binary files /dev/null and b/mcaddon/schemas/__pycache__/geometry.cpython-311.pyc differ diff --git a/mcaddon/schemas/__pycache__/item.cpython-311.pyc b/mcaddon/schemas/__pycache__/item.cpython-311.pyc index d7825ab..5b61b8f 100644 Binary files a/mcaddon/schemas/__pycache__/item.cpython-311.pyc and b/mcaddon/schemas/__pycache__/item.cpython-311.pyc differ diff --git a/mcaddon/schemas/__pycache__/manifest.cpython-311.pyc b/mcaddon/schemas/__pycache__/manifest.cpython-311.pyc index b1ce5ef..b634874 100644 Binary files a/mcaddon/schemas/__pycache__/manifest.cpython-311.pyc and b/mcaddon/schemas/__pycache__/manifest.cpython-311.pyc differ diff --git a/mcaddon/schemas/__pycache__/recipe.cpython-311.pyc b/mcaddon/schemas/__pycache__/recipe.cpython-311.pyc index 5c9185c..0769ebe 100644 Binary files a/mcaddon/schemas/__pycache__/recipe.cpython-311.pyc and b/mcaddon/schemas/__pycache__/recipe.cpython-311.pyc differ diff --git a/mcaddon/schemas/__pycache__/volume.cpython-311.pyc b/mcaddon/schemas/__pycache__/volume.cpython-311.pyc index a85b0d1..183ad8d 100644 Binary files a/mcaddon/schemas/__pycache__/volume.cpython-311.pyc and b/mcaddon/schemas/__pycache__/volume.cpython-311.pyc differ diff --git a/mcaddon/schemas/block.py b/mcaddon/schemas/block.py index a5215c5..b7b0112 100644 --- a/mcaddon/schemas/block.py +++ b/mcaddon/schemas/block.py @@ -1,4 +1,7 @@ +import os + from .. import ( + __file__, INSTANCE, Schema, BlockPermutation, @@ -7,28 +10,37 @@ ComponentNotFoundError, EventNotFoundError, Block, + BlockTagsComponent, ) class BlockSchema1(Schema): def __init__(self): - Schema.__init__(self, "block1.json") + Schema.__init__( + self, + os.path.join(os.path.dirname(__file__), "data", "schemas", "block1.json"), + ) def load(cls, self: Block, data: dict): - if "description" in data: - desc = data["description"] - if "identifier" in desc: - self.identifier = desc["identifier"] + self.identifier = data["description"]["identifier"] if "components" in data: comp = data["components"] + tags = BlockTagsComponent() for k, v in comp.items(): id = Identifier(k) + if str(id).startswith("tag:"): + tags.add_tag(id.path) + continue clazz = INSTANCE.get_registry(Registries.BLOCK_COMPONENT_TYPE).get(id) if clazz is None: raise ComponentNotFoundError(repr(id)) self.components[id] = clazz.from_dict(v) + # Add tag + if len(tags.tags) >= 1: + self.components[Identifier("tags")] = tags + if "permutations" in data: for perm in data["permutations"]: self.permutations.append(BlockPermutation.from_dict(perm)) diff --git a/mcaddon/schemas/block_culling.py b/mcaddon/schemas/block_culling.py new file mode 100644 index 0000000..6381847 --- /dev/null +++ b/mcaddon/schemas/block_culling.py @@ -0,0 +1,19 @@ +import os + +from .. import __file__, Schema, BlockCullingRules, CullingRule, GeometryPart + + +class BlockCullingRulesSchema1(Schema): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), "data", "schemas", "block_culling1.json" + ), + ) + + def load(cls, self: BlockCullingRules, data: dict): + self.identifier = data["description"]["identifier"] + + for rule in data["rules"]: + self.add_rule(CullingRule.from_dict(rule)) diff --git a/mcaddon/schemas/camera.py b/mcaddon/schemas/camera.py index f695581..72f034a 100644 --- a/mcaddon/schemas/camera.py +++ b/mcaddon/schemas/camera.py @@ -1,15 +1,17 @@ -from .. import INSTANCE, Schema, CameraPreset +import os + +from .. import __file__, INSTANCE, Schema, CameraPreset class CameraPresetSchem1(Schema): def __init__(self): - Schema.__init__(self, "camera1.json") + Schema.__init__( + self, + os.path.join(os.path.dirname(__file__), "data", "schemas", "camera1.json"), + ) def load(cls, self: CameraPreset, data: dict): - if "description" in data: - desc = data["description"] - if "identifier" in desc: - self.identifier = desc["identifier"] + self.identifier = data["identifier"] if "inherit_from" in data: self.inherit_from = data.pop("inherit_from") diff --git a/mcaddon/schemas/feature.py b/mcaddon/schemas/feature.py new file mode 100644 index 0000000..559cb95 --- /dev/null +++ b/mcaddon/schemas/feature.py @@ -0,0 +1,618 @@ +import os + +from .. import * +from .. import __file__ + + +class FeatureSchem(Schema): + def load(cls, self: Feature, data: dict): + self.identifier = data["description"]["identifier"] + + +class AggregateSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "aggregate.json", + ), + ) + + def load(cls, self: AggregateFeature, data: dict): + super().load(self, data) + self.features = data.pop("features") + if "early_out" in data: + self.early_out = data.pop("early_out") + + +class SequenceSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), "data", "schemas", "feature", "sequence.json" + ), + ) + + def load(cls, self: SequenceFeature, data: dict): + super().load(self, data) + self.features = data.pop("features") + + +class BeardsAndShaversSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "beards_and_shavers.json", + ), + ) + + def load(cls, self: BeardsAndShaversFeature, data: dict): + super().load(self, data) + self.places_feature = data.pop("places_feature") + self.bounding_box_min = Vector3.from_dict(data.pop("bounding_box_min")) + self.bounding_box_max = Vector3.from_dict(data.pop("bounding_box_max")) + self.y_delta = data.pop("y_delta") + self.surface_block_type = data.pop("surface_block_type") + self.subsurface_block_type = data.pop("subsurface_block_type") + self.beard_raggedness_min = data.pop("beard_raggedness_min") + self.beard_raggedness_max = data.pop("beard_raggedness_max") + + +class CaveCarverSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "cave_carver.json", + ), + ) + + def load(cls, self: CaveCarverFeature, data: dict): + super().load(self, data) + self.fill_with = data.pop("fill_with") + self.width_modifier = data.pop("width_modifier") + self.skip_carve_chance = data.pop("skip_carve_chance") + + +class ConditionalListSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "conditional_list.json", + ), + ) + + def load(cls, self: ConditionalListFeature, data: dict): + super().load(self, data) + self.early_out_scheme = data.pop("early_out_scheme") + self.conditional_features = [ + ConditionalFeature.from_dict(x) for x in data.pop("conditional_features") + ] + + +class FossilSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), "data", "schemas", "feature", "fossil.json" + ), + ) + + def load(cls, self: FossilFeature, data: dict): + super().load(self, data) + self.ore_block = BlockState.from_dict(data.pop("ore_block")) + self.max_empty_corners = data.pop("max_empty_corners") + + +class GeodeSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), "data", "schemas", "feature", "geode.json" + ), + ) + + def load(cls, self: GeodeFeature, data: dict): + super().load(self, data) + self.filler = BlockState.from_dict(data.pop("filler")) + self.inner_layer = BlockState.from_dict(data.pop("inner_layer")) + self.alternate_inner_layer = BlockState.from_dict( + data.pop("alternate_inner_layer") + ) + self.middle_layer = BlockState.from_dict(data.pop("middle_layer")) + self.outer_layer = BlockState.from_dict(data.pop("outer_layer")) + self.min_outer_wall_distance = data.pop("min_outer_wall_distance") + self.max_outer_wall_distance = data.pop("max_outer_wall_distance") + self.min_distribution_points = data.pop("min_distribution_points") + self.max_distribution_points = data.pop("max_distribution_points") + self.min_point_offset = data.pop("min_point_offset") + self.max_point_offset = data.pop("max_point_offset") + self.max_radius = data.pop("max_radius") + self.crack_point_offset = data.pop("crack_point_offset") + self.generate_crack_chance = data.pop("generate_crack_chance") + self.base_crack_size = data.pop("base_crack_size") + self.noise_multiplier = data.pop("noise_multiplier") + self.use_potential_placements_chance = data.pop( + "use_potential_placements_chance" + ) + self.use_alternate_layer0_chance = data.pop("use_alternate_layer0_chance") + self.placements_require_layer0_alternate = data.pop( + "placements_require_layer0_alternate" + ) + self.invalid_blocks_threshold = data.pop("invalid_blocks_threshold") + self.inner_placements = [ + BlockState.from_dict(x) for x in data.pop("inner_placements") + ] + + +class GrowingPlantSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "growing_plant.json", + ), + ) + + def load(cls, self: GrowingPlantFeature, data: dict): + super().load(self, data) + self.growth_direction = data.pop("growth_direction") + self.height_distribution = [ + HeightDistribution.from_dict(x) for x in data.pop("height_distribution") + ] + self.body_blocks = [ + GrowingPlantBlock.from_dict(x) for x in data.pop("body_blocks") + ] + self.head_blocks = [ + GrowingPlantBlock.from_dict(x) for x in data.pop("head_blocks") + ] + if "age" in data: + self.age = Range.from_dict(data.pop("age"), "range_") + if "allow_water" in data: + self.allow_water = data.pop("allow_water") + + +class NetherCaveCarverSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "nether_cave_carver.json", + ), + ) + + def load(cls, self: NetherCaveCarverFeature, data: dict): + super().load(self, data) + self.fill_with = BlockState.from_dict(data.pop("fill_with")) + self.width_modifier = data.pop("width_modifier") + + +class OreSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), "data", "schemas", "feature", "ore.json" + ), + ) + + def load(cls, self: OreFeature, data: dict): + super().load(self, data) + self.count = data.pop("count") + if "replace_rules" in data: + self.replace_rules = [ + ReplaceRule.from_dict(x) for x in data.pop("replace_rules") + ] + if "places_block" in data: + self.places_block = BlockState.from_dict(data.pop("places_block")) + + +class MultifaceSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "multiface.json", + ), + ) + + def load(cls, self: MultifaceFeature, data: dict): + super().load(self, data) + self.places_block = BlockState.from_dict(data.pop("places_block")) + self.search_range = data.pop("search_range") + self.can_place_on_floor = data.pop("can_place_on_floor") + self.can_place_on_ceiling = data.pop("can_place_on_ceiling") + self.can_place_on_wall = data.pop("can_place_on_wall") + self.chance_of_spreading = data.pop("chance_of_spreading") + self.can_place_on = [BlockState.from_dict(x) for x in data.pop("can_place_on")] + + +class PartiallyExposedBlobSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "partially_exposed_blob.json", + ), + ) + + def load(cls, self: PartiallyExposedBlobFeature, data: dict): + super().load(self, data) + self.places_block = BlockState.from_dict(data.pop("places_block")) + self.placement_radius_around_floor = data.pop("placement_radius_around_floor") + self.placement_probility_per_valid_position = data.pop( + "placement_probability_per_valid_position" + ) + self.exposed_face = data.pop("exposed_face") + + +class RectLayoutSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "rect_layout.json", + ), + ) + + def load(cls, self: RectLayoutFeature, data: dict): + super().load(self, data) + self.ratio_of_empty_space = data.pop("ratio_of_empty_space") + self.feature_areas = [ + FeatureArea.from_dict(x) for x in data.pop("feature_areas") + ] + + +class ScanSurfaceSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "scan_surface.json", + ), + ) + + def load(cls, self: ScanSurfaceFeature, data: dict): + super().load(self, data) + self.scan_surface_feature = data.pop("scan_surface_feature") + + +class ScatterSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), "data", "schemas", "feature", "scatter.json" + ), + ) + + def load(cls, self: ScatterFeature, data: dict): + super().load(self, data) + self.places_feature = data.pop("places_feature") + self.iterations = Molang(data.pop("iterations")) + if "scatter_chance" in data: + self.scatter_chance = data.pop("scatter_chance") + + if isinstance(data["x"], dict): + self.x = DistributionProvider.from_dict(data.pop("x")) + elif isinstance(data["x"], list): + self.x = Vector2(*data.pop("x")) + else: + self.x = data.pop("x") + + if isinstance(data["y"], dict): + self.y = DistributionProvider.from_dict(data.pop("y")) + elif isinstance(data["y"], list): + self.y = Vector2(*data.pop("y")) + else: + self.y = data.pop("y") + + if isinstance(data["z"], dict): + self.z = DistributionProvider.from_dict(data.pop("z")) + elif isinstance(data["z"], list): + self.z = Vector2(*data.pop("z")) + else: + self.z = data.pop("z") + + +class SculkPatchSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "sculk_patch.json", + ), + ) + + def load(cls, self: SculkPatchFeature, data: dict): + super().load(self, data) + self.can_place_sculk_patch_on = [ + BlockState.from_dict(x) for x in data.pop("can_place_sculk_patch_on") + ] + self.central_block = BlockState.from_dict(data.pop("central_block")) + self.central_block_placement_chance = data.pop("central_block_placement_chance") + self.charge_amount = data.pop("charge_amount") + self.cursor_count = data.pop("cursor_count") + self.growth_rounds = data.pop("growth_rounds") + self.spread_attempts = data.pop("spread_attempts") + self.spread_rounds = data.pop("spread_rounds") + if "extra_growth_chance" in data: + self.extra_growth_chance = Range.from_dict( + data.pop("extra_growth_chance"), "range_" + ) + + +class SearchSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), "data", "schemas", "feature", "search.json" + ), + ) + + def load(cls, self: SearchFeature, data: dict): + super().load(self, data) + self.places_feature = data.pop("places_feature") + self.search_volume = VectorRange.from_dict(data.pop("search_volume")) + self.search_axis = data.pop("search_axis") + self.required_successes = data.pop("required_successes") + + +class SingleBlockSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "single_block.json", + ), + ) + + def load(cls, self: SingleBlockFeature, data: dict): + super().load(self, data) + self.places_block = BlockState.from_dict(data.pop("places_block")) + if "may_replace" in data: + self.may_replace = [ + BlockState.from_dict(x) for x in data.pop("may_replace") + ] + if "may_place_on" in data: + self.may_place_on = [ + BlockState.from_dict(x) for x in data.pop("may_place_on") + ] + if "enforce_survivability_rule" in data: + self.enforce_survivability_rule = data.pop("enforce_survivability_rule") + if "enforce_placement_rule" in data: + self.enforce_placement_rule = data.pop("enforce_placement_rule") + + +class SnapToSurfaceSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "snap_to_surface.json", + ), + ) + + def load(cls, self: SnapToSurfaceFeature, data: dict): + super().load(self, data) + self.feature_to_snap = data.pop("feature_to_snap") + self.vertical_search_range = data.pop("vertical_search_range") + self.surface = data.pop("surface") + + +class StructureTemplateSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "structure_template.json", + ), + ) + + def load(cls, self: StructureTemplateFeature, data: dict): + super().load(self, data) + self.structure_name = data.pop("structure_name") + self.adjustment_radius = data.pop("adjustment_radius") + self.facing_direction = data.pop("facing_direction") + self.constraints = Constraints.from_dict(data.pop("constraints")) + + +class SurfaceRelativeThresholdSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "surface_relative_threshold.json", + ), + ) + + def load(cls, self: SurfaceRelativeThresholdFeature, data: dict): + super().load(self, data) + self.minimum_distance_below_surface = data.pop("minimum_distance_below_surface") + if "feature_to_snap" in data: + self.feature_to_snap = data.pop("feature_to_snap") + + +class UnderwaterCaveCarverSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "underwater_cave_carver.json", + ), + ) + + def load(cls, self: UnderwaterCaveCarverFeature, data: dict): + super().load(self, data) + self.fill_with = BlockState.from_dict(data.pop("fill_with")) + self.width_modifier = data.pop("width_modifier") + self.replace_air_with = BlockState.from_dict(data.pop("replace_air_with")) + + +class TreeSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), "data", "schemas", "feature", "tree.json" + ), + ) + + def load(cls, self: TreeFeature, data: dict): + super().load(self, data) + self.base_block = ( + [BlockState.from_dict(x) for x in data.pop("base_block")] + if isinstance(data["base_block"], list) + else [BlockState.from_dict(data.pop("base_block"))] + ) + if "base_cluster" in data: + self.base_cluster = Cluster.from_dict(data.pop("base_cluster")) + if "may_grow_on" in data: + self.may_grow_on = [ + BlockPredicate.from_dict(x) for x in data.pop("may_grow_on") + ] + if "may_grow_through" in data: + self.may_grow_through = [ + BlockPredicate.from_dict(x) for x in data.pop("may_grow_through") + ] + self.may_replace = [BlockState.from_dict(x) for x in data.pop("may_replace")] + + for id, v in data.items(): + clazz = INSTANCE.get_registry(Registries.TREE_TRUNK).get(id) + if clazz is not None: + self.trunk = clazz.from_dict(v) + + clazz = INSTANCE.get_registry(Registries.TREE_CANOPY).get(id) + if clazz is not None: + self.canopy = clazz.from_dict(v) + + clazz = INSTANCE.get_registry(Registries.TREE_ROOT).get(id) + if clazz is not None: + self.root = clazz.from_dict(v) + + +class VegetationPatchSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "vegetation_patch.json", + ), + ) + + def load(cls, self: VegetationPatchFeature, data: dict): + super().load(self, data) + self.replaceable_blocks = [ + BlockState.from_dict(x) for x in data.pop("replaceable_blocks") + ] + self.ground_block = BlockState.from_dict(data.pop("ground_block")) + + self.vegetation_feature = data.pop("vegetation_feature") + self.surface = data.pop("surface") + self.depth = ( + Range.from_dict(data.pop("depth"), "range_") + if isinstance(data["depth"], dict) + else data.pop("depth") + ) + self.vertical_range = data.pop("vertical_range") + self.vegetation_chance = data.pop("vegetation_chance") + self.horizontal_radius = Range.from_dict( + data.pop("horizontal_radius"), "range_" + ) + self.extra_deep_column_chance = data.pop("extra_deep_column_chance") + if "extra_deep_block_chance" in data: + self.extra_deep_block_chance = data.pop("extra_deep_block_chance") + if "waterlogged" in data: + self.waterlogged = data.pop("waterlogged") + + +class WeightedRandomSchem1(FeatureSchem): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "feature", + "weighted_random.json", + ), + ) + + def load(cls, self: WeightedRandomFeature, data: dict): + super().load(self, data) + self.features = [WeightedFeature.from_dict(x) for x in data.pop("features")] diff --git a/mcaddon/schemas/feature_rule.py b/mcaddon/schemas/feature_rule.py new file mode 100644 index 0000000..6ae6998 --- /dev/null +++ b/mcaddon/schemas/feature_rule.py @@ -0,0 +1,16 @@ +from .. import * +from .. import __file__ + + +class FeatureRuleSchem1(Schema): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), "data", "schemas", "feature_rules1.json" + ), + ) + + def load(cls, self: FeatureRule, data: dict): + self.identifier = data["description"]["identifier"] + self.places_feature = data["description"]["places_feature"] diff --git a/mcaddon/schemas/geometry.py b/mcaddon/schemas/geometry.py new file mode 100644 index 0000000..760876a --- /dev/null +++ b/mcaddon/schemas/geometry.py @@ -0,0 +1,18 @@ +import os + +from .. import __file__, INSTANCE, Schema, Geometry, EntityModel + + +class GeometrySchema1(Schema): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), "data", "schemas", "geometry1.json" + ), + ) + + def load(cls, self: Geometry, data: dict): + for x in data: + model = EntityModel.from_dict(x) + self.add_model(model) diff --git a/mcaddon/schemas/item.py b/mcaddon/schemas/item.py index 1cfc4ef..c53ccb8 100644 --- a/mcaddon/schemas/item.py +++ b/mcaddon/schemas/item.py @@ -1,4 +1,7 @@ +import os + from .. import ( + __file__, INSTANCE, Schema, Identifier, @@ -11,13 +14,13 @@ class ItemSchema1(Schema): def __init__(self): - Schema.__init__(self, "item1.json") + Schema.__init__( + self, + os.path.join(os.path.dirname(__file__), "data", "schemas", "item1.json"), + ) def load(cls, self: Item, data: dict): - if "description" in data: - desc = data["description"] - if "identifier" in desc: - self.identifier = desc["identifier"] + self.identifier = data["description"]["identifier"] if "components" in data: comp = data["components"] @@ -26,7 +29,10 @@ def load(cls, self: Item, data: dict): clazz = INSTANCE.get_registry(Registries.ITEM_COMPONENT_TYPE).get(id) if clazz is None: raise ComponentNotFoundError(repr(id)) - self.components[id] = clazz.from_dict(v) + obj = clazz.from_dict(v) + if obj is None: + raise ValueError(id, v) + self.components[id] = obj if "events" in data: for k, v in data["events"].items(): @@ -43,7 +49,10 @@ def load(cls, self: Item, data: dict): class ItemSchema2(Schema): def __init__(self): - Schema.__init__(self, "item2.json") + Schema.__init__( + self, + os.path.join(os.path.dirname(__file__), "data", "schemas", "item2.json"), + ) def load(cls, self: Item, data: dict): if "description" in data: @@ -58,4 +67,7 @@ def load(cls, self: Item, data: dict): clazz = INSTANCE.get_registry(Registries.ITEM_COMPONENT_TYPE).get(id) if clazz is None: raise ComponentNotFoundError(repr(id)) - self.components[id] = clazz.from_dict(v) + obj = clazz.from_dict(v) + if obj is None: + raise ValueError(id, v) + self.components[id] = obj diff --git a/mcaddon/schemas/manifest.py b/mcaddon/schemas/manifest.py index 574424a..dd3b8bb 100644 --- a/mcaddon/schemas/manifest.py +++ b/mcaddon/schemas/manifest.py @@ -1,9 +1,16 @@ -from .. import Schema, Manifest, Header, Metadata, Module, Dependency +import os + +from .. import __file__, Schema, Manifest, Header, Metadata, Module, Dependency class ManifestSchema1(Schema): def __init__(self): - Schema.__init__(self, "schema11.json") + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), "data", "schemas", "manifest1.json" + ), + ) def load(cls, self: Manifest, data: dict): if "header" in data: diff --git a/mcaddon/schemas/recipe.py b/mcaddon/schemas/recipe.py index 66dd9af..7f167e5 100644 --- a/mcaddon/schemas/recipe.py +++ b/mcaddon/schemas/recipe.py @@ -1,40 +1,79 @@ -from .. import Schema, ItemStack, Ingredient +import os +from .. import __file__, Schema, ItemStack, Ingredient, FurnaceRecipe -class FurnaceSchem1(Schema): - def __init__(self): - Schema.__init__(self, "furnace1.json") +class RecipeSchem1(Schema): def load(cls, self, data: dict): + self.identifier = data["description"]["identifier"] + + +class FurnaceSchem1(RecipeSchem1): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), "data", "schemas", "recipe", "furnace1.json" + ), + ) + + def load(cls, self: FurnaceRecipe, data: dict): + super().load(self, data) self.input = Ingredient.from_dict(data.pop("input")) self.output = ItemStack.from_dict(data.pop("output")) -class BrewingContainerSchem1(Schema): +class BrewingContainerSchem1(RecipeSchem1): def __init__(self): - Schema.__init__(self, "brewing_container1.json") + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "recipe", + "brewing_container1.json", + ), + ) def load(cls, self, data: dict): + super().load(self, data) self.input = ItemStack.from_dict(data.pop("input")) self.reagent = ItemStack.from_dict(data.pop("reagent")) self.output = ItemStack.from_dict(data.pop("output")) -class BrewingMixSchem1(Schema): +class BrewingMixSchem1(RecipeSchem1): def __init__(self): - Schema.__init__(self, "brewing_mix1.json") + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "recipe", + "brewing_mix1.json", + ), + ) def load(cls, self, data: dict): + super().load(self, data) self.input = ItemStack.from_dict(data.pop("input")) self.reagent = ItemStack.from_dict(data.pop("reagent")) self.output = ItemStack.from_dict(data.pop("output")) -class ShapedSchem1(Schema): +class ShapedSchem1(RecipeSchem1): def __init__(self): - Schema.__init__(self, "shaped1.json") + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), "data", "schemas", "recipe", "shaped1.json" + ), + ) def load(cls, self, data: dict): + super().load(self, data) self.pattern = data.pop("pattern") self.key = {} for k, v in data.pop("key").items(): @@ -47,49 +86,120 @@ def load(cls, self, data: dict): self.result = ItemStack.from_dict(res) -class ShapelessSchem1(Schema): +class ShapelessSchem1(RecipeSchem1): def __init__(self): - Schema.__init__(self, "shapeless1.json") + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "recipe", + "shapeless1.json", + ), + ) def load(cls, self, data: dict): + super().load(self, data) self.ingredients = [Ingredient.from_dict(x) for x in data.pop("ingredients")] self.result = ItemStack.from_dict(data.pop("result")) -class SmithingTransformSchem1(Schema): +class SmithingTransformSchem1(RecipeSchem1): def __init__(self): - Schema.__init__(self, "smithing_transform1.json") + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "recipe", + "smithing_transform1.json", + ), + ) def load(cls, self, data: dict): + super().load(self, data) self.template = ItemStack.from_dict(data.pop("template")) self.base = ItemStack.from_dict(data.pop("base")) self.addition = ItemStack.from_dict(data.pop("addition")) self.result = ItemStack.from_dict(data.pop("result")) -class SmithingTransformSchem2(Schema): +class SmithingTransformSchem2(RecipeSchem1): def __init__(self): - Schema.__init__(self, "smithing_transform2.json") + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "recipe", + "smithing_transform2.json", + ), + ) def load(cls, self, data: dict): + super().load(self, data) self.template = ItemStack("netherite_upgrade_smithing_template") self.base = ItemStack.from_dict(data.pop("base")) self.addition = ItemStack.from_dict(data.pop("addition")) self.result = ItemStack.from_dict(data.pop("result")) -class SmithingTrimSchem1(Schema): +class SmithingTrimSchem1(RecipeSchem1): def __init__(self): - Schema.__init__(self, "smithing_trim1.json") + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "recipe", + "smithing_trim1.json", + ), + ) def load(cls, self, data: dict): + super().load(self, data) self.template = Ingredient.from_dict(data.pop("template")) self.base = Ingredient.from_dict(data.pop("base")) self.addition = Ingredient.from_dict(data.pop("addition")) -class MaterialReductionSchem1(Schema): +class MaterialReductionSchem1(RecipeSchem1): + def __init__(self): + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "recipe", + "material_reduction1.json", + ), + ) + + def load(cls, self, data: dict): + super().load(self, data) + self.input = Ingredient.from_dict(data.pop("input")) + self.output = [ItemStack.from_dict(x) for x in data.pop("output")] + + +class MaterialReductionSchem2(RecipeSchem1): def __init__(self): - Schema.__init__(self, "material_reduction1.json") + Schema.__init__( + self, + os.path.join( + os.path.dirname(__file__), + "data", + "schemas", + "recipe", + "material_reduction1.json", + ), + ) - def load(cls, self, data: dict): ... + def load(cls, self, data: dict): + super().load(self, data) + self.input = Ingredient.from_dict(data.pop("input")) + self.output = [ItemStack.from_dict(x) for x in data.pop("output")] diff --git a/mcaddon/schemas/volume.py b/mcaddon/schemas/volume.py index f93076c..75a44e2 100644 --- a/mcaddon/schemas/volume.py +++ b/mcaddon/schemas/volume.py @@ -1,4 +1,7 @@ +import os + from .. import ( + __file__, INSTANCE, Schema, Identifier, @@ -10,13 +13,13 @@ class VolumeSchema1(Schema): def __init__(self): - Schema.__init__(self, "volume1.json") + Schema.__init__( + self, + os.path.join(os.path.dirname(__file__), "data", "schemas", "volume1.json"), + ) def load(cls, self, data: dict): - if "description" in data: - desc = data["description"] - if "identifier" in desc: - self.identifier = desc["identifier"] + self.identifier = data["description"]["identifier"] if "components" in data: comp = data["components"] diff --git a/mcaddon/schemas/volume1.json b/mcaddon/schemas/volume1.json deleted file mode 100644 index 3cb44be..0000000 --- a/mcaddon/schemas/volume1.json +++ /dev/null @@ -1,6 +0,0 @@ -{ - "$schema": "http://json-schema.org/draft-07/schema", - "type": "object", - "properties": {}, - "additionalProperties": false -} diff --git a/mcaddon/state.py b/mcaddon/state.py index 3d8dc86..769bf94 100644 --- a/mcaddon/state.py +++ b/mcaddon/state.py @@ -1,43 +1,46 @@ -from typing import Self +from typing import Self, Any from .registry import INSTANCE, Registries -from .util import Identifier - - -class BlockState: - def __init__(self, *values: str, id: Identifier | str = None): +from .util import ( + getitem, + additem, + removeitem, + clearitems, + Identifier, + Identifiable, + Misc, +) + + +class BlockProperty(Misc): + def __init__(self, *values: str, id: Identifiable = None): """ Base state class for blocks :param id: The identifier of this blockstate, defaults to None - :type id: Identifier | str, optional + :type id: Identifiable, optional """ if id: - self.id = Identifier(id) + self.id = id self.values = list(values) def __repr__(self) -> str: - return str(self) + return "BlockProperty{" + str(self.id) + "}" def __str__(self) -> str: - return "BlockState{" + str(self.id) + "}" + return str(self.id) def __iter__(self): for v in self.values: yield v - @property - def __dict__(self) -> list: - data = {str(self.id): [x for x in self.values]} - return data - @property def id(self) -> Identifier: return getattr(self, "_id") @id.setter - def id(self, value: Identifier): - setattr(self, "_id", Identifier(value)) + def id(self, value: Identifiable): + setattr(self, "_id", Identifiable.of(value)) @property def values(self) -> list: @@ -57,21 +60,45 @@ def _default(o): self.values = [] elif isinstance(value, list): v = [_default(x) for x in value] + self.on_update("values", v) setattr(self, "_values", v) else: raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + def get_value(self, index: int) -> Any: + return getitem(self, "values", index) + + def add_value(self, value: Any) -> Any: + return additem(self, "values", value) + + def remove_value(self, index: int) -> Any: + return removeitem(self, "values", index) + + def clear_values(self) -> Self: + """Remove all values""" + return clearitems(self, "values") + @classmethod def from_dict(cls, data: list) -> Self: self = cls.__new__(cls) return self + def jsonify(self) -> list: + data = {str(self.id): [x for x in self.values]} + return data + + def default(self) -> str | int: + """ + Get the default value for this block property + """ + return self.values[0] + # STATES -INSTANCE.create_registry(Registries.BLOCK_STATE, BlockState) +INSTANCE.create_registry(Registries.BLOCK_STATE, BlockProperty) def state(cls): @@ -80,8 +107,8 @@ def state(cls): """ def wrapper(): - if not issubclass(cls, BlockState): - raise TypeError(f"Expected BlockState but got '{cls.__name__}' instead") + if not issubclass(cls, BlockProperty): + raise TypeError(f"Expected BlockProperty but got '{cls.__name__}' instead") return INSTANCE.register(Registries.BLOCK_STATE, cls.id, cls) return wrapper() @@ -90,22 +117,22 @@ def wrapper(): # BASES -class BooleanState(BlockState): - def __init__(self, id: Identifier = None, default: bool = False): +class BooleanState(BlockProperty): + def __init__(self, id: Identifiable = None, default: bool = False): """ True or False blockstate :param id: The identifier of this blockstate, defaults to None - :type id: Identifier, optional + :type id: Identifiable, optional :param default: The default value, defaults to None :type default: bool, optional """ values = [True, False] if default else [False, True] - BlockState.__init__(self, *values, id=id) + BlockProperty.__init__(self, *values, id=id) -class IntegerState(BlockState): - def __init__(self, stop: int, start: int = 0, id: Identifier = None): +class IntegerState(BlockProperty): + def __init__(self, stop: int, start: int = 0, id: Identifiable = None): """ Integer blockstate from START to END @@ -114,56 +141,56 @@ def __init__(self, stop: int, start: int = 0, id: Identifier = None): :param start: The minimum value, defaults to 0 :type start: int, optional :param id: The identifier of this blockstate, defaults to None - :type id: Identifier, optional + :type id: Identifiable, optional """ - BlockState.__init__(self, *range(start, stop + 1), id=id) + BlockProperty.__init__(self, *range(start, stop + 1), id=id) # VANILLA @state -class BlockFaceState(BlockState): +class BlockFaceState(BlockProperty): id = Identifier("block_face") def __init__(self): """ States: ["down", "up", "north", "south", "east", "west"] """ - BlockState.__init__(self, "down", "up", "north", "south", "east", "west") + BlockProperty.__init__(self, "down", "up", "north", "south", "east", "west") @state -class VerticalHalfState(BlockState): +class VerticalHalfState(BlockProperty): id = Identifier("vertical_half") def __init__(self): """ States: ["bottom", "up"] """ - BlockState.__init__(self, "bottom", "up") + BlockProperty.__init__(self, "bottom", "up") @state -class CardinalDirectionState(BlockState): +class CardinalDirectionState(BlockProperty): id = Identifier("cardinal_direction") def __init__(self): """ States: ["north", "south", "east", "west"] """ - BlockState.__init__(self, "north", "south", "east", "west") + BlockProperty.__init__(self, "north", "south", "east", "west") @state -class FacingDirectionState(BlockState): +class FacingDirectionState(BlockProperty): id = Identifier("facing_direction") def __init__(self): """ States: ["down", "up", "north", "south", "east", "west"] """ - BlockState.__init__(self, "down", "up", "north", "south", "east", "west") + BlockProperty.__init__(self, "down", "up", "north", "south", "east", "west") @state @@ -207,35 +234,35 @@ def __init__(self): @state -class AttachmentState(BlockState): +class AttachmentState(BlockProperty): id = Identifier("attachment") def __init__(self): - BlockState.__init__(self, "standing", "hanging", "side", "multiple") + BlockProperty.__init__(self, "standing", "hanging", "side", "multiple") @state -class BambooLeafSizeState(BlockState): +class BambooLeafSizeState(BlockProperty): id = Identifier("bamboo_leaf_size") def __init__(self): - BlockState.__init__(self, "no_leaves", "small_leaves", "large_leaves") + BlockProperty.__init__(self, "no_leaves", "small_leaves", "large_leaves") @state -class BambooStalkThicknessState(BlockState): +class BambooStalkThicknessState(BlockProperty): id = Identifier("bamboo_stalk") def __init__(self): - BlockState.__init__(self, "thin", "thick") + BlockProperty.__init__(self, "thin", "thick") @state -class BigDripleafTiltState(BlockState): +class BigDripleafTiltState(BlockProperty): id = Identifier("bigt_dripleaf_tilt") def __init__(self): - BlockState.__init__(self, "none", "unstable", "partial_tilt", "full_tilt") + BlockProperty.__init__(self, "none", "unstable", "partial_tilt", "full_tilt") @state @@ -303,19 +330,19 @@ def __init__(self): @state -class CauldronLiquidState(BlockState): +class CauldronLiquidState(BlockProperty): id = Identifier("cauldron_liquid") def __init__(self): - BlockState.__init__(self, "water", "lava") + BlockProperty.__init__(self, "water", "lava") @state -class ChemistryTableTypeState(BlockState): +class ChemistryTableTypeState(BlockProperty): id = Identifier("chemistry_table_type") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "compound_creator", "material_reducer", @@ -325,11 +352,11 @@ def __init__(self): @state -class ChiselTypeState(BlockState): +class ChiselTypeState(BlockProperty): id = Identifier("chisel_type") def __init__(self): - BlockState.__init__(self, "default", "chiseled", "lines", "smooth") + BlockProperty.__init__(self, "default", "chiseled", "lines", "smooth") @state @@ -341,11 +368,11 @@ def __init__(self): @state -class ColorState(BlockState): +class ColorState(BlockProperty): id = Identifier("color") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "white", "orange", @@ -383,11 +410,11 @@ def __init__(self): @state -class CoralColorState(BlockState): +class CoralColorState(BlockProperty): id = Identifier("coral_color") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "blue", "pink", @@ -427,11 +454,11 @@ def __init__(self): @state -class CrackedState(BlockState): +class CrackedState(BlockProperty): id = Identifier("cracked_state") def __init__(self): - BlockState.__init__(self, "no_cracks", "cracked", "max_cracked") + BlockProperty.__init__(self, "no_cracks", "cracked", "max_cracked") @state @@ -443,11 +470,11 @@ def __init__(self): @state -class DamageState(BlockState): +class DamageState(BlockProperty): id = Identifier("damage") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "undamaged", "slightly_damaged", "very_damaged", "broken" ) @@ -469,11 +496,11 @@ def __init__(self): @state -class DirtTypeState(BlockState): +class DirtTypeState(BlockProperty): id = Identifier("dirt_type") def __init__(self): - BlockState.__init__(self, "normal", "coarse") + BlockProperty.__init__(self, "normal", "coarse") @state @@ -493,11 +520,11 @@ def __init__(self): @state -class DoublePlantTypeState(BlockState): +class DoublePlantTypeState(BlockProperty): id = Identifier("double_plant_type") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "sunflower", "syringa", "grass", "fern", "rose", "paeonia" ) @@ -511,11 +538,11 @@ def __init__(self): @state -class DripstoneThicknessState(BlockState): +class DripstoneThicknessState(BlockProperty): id = Identifier("dripstone_thickness") def __init__(self): - BlockState.__init__(self, "tip", "frustum", "base", "middle", "merge") + BlockProperty.__init__(self, "tip", "frustum", "base", "middle", "merge") @state @@ -543,11 +570,11 @@ def __init__(self): @state -class FlowerTypeState(BlockState): +class FlowerTypeState(BlockProperty): id = Identifier("flower_type") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "poppy", "orchid", @@ -660,11 +687,11 @@ def __init__(self): @state -class MonsterEggStoneTypeState(BlockState): +class MonsterEggStoneTypeState(BlockProperty): id = Identifier("monster_egg_stone_type") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "stone", "cobblestone", @@ -676,19 +703,19 @@ def __init__(self): @state -class NewLeafTypeState(BlockState): +class NewLeafTypeState(BlockProperty): id = Identifier("new_leaf_type") def __init__(self): - BlockState.__init__(self, "acacia", "dark_oak") + BlockProperty.__init__(self, "acacia", "dark_oak") @state -class NewLogTypeState(BlockState): +class NewLogTypeState(BlockProperty): id = Identifier("new_log_type") def __init__(self): - BlockState.__init__(self, "acacia", "dark_oak") + BlockProperty.__init__(self, "acacia", "dark_oak") @state @@ -708,19 +735,19 @@ def __init__(self): @state -class OldLeafTypeState(BlockState): +class OldLeafTypeState(BlockProperty): id = Identifier("old_leaf_type") def __init__(self): - BlockState.__init__(self, "oak", "spruce", "birch", "jungle") + BlockProperty.__init__(self, "oak", "spruce", "birch", "jungle") @state -class OldLogTypeState(BlockState): +class OldLogTypeState(BlockProperty): id = Identifier("old_log_type") def __init__(self): - BlockState.__init__(self, "oak", "spruce", "birch", "jungle") + BlockProperty.__init__(self, "oak", "spruce", "birch", "jungle") @state @@ -764,11 +791,11 @@ def __init__(self): @state -class PortalAxisState(BlockState): +class PortalAxisState(BlockProperty): id = Identifier("portal_axis") def __init__(self): - BlockState.__init__(self, "unknown", "x", "z") + BlockProperty.__init__(self, "unknown", "x", "z") @state @@ -812,53 +839,53 @@ def __init__(self): @state -class SandStoneTypeState(BlockState): +class SandStoneTypeState(BlockProperty): id = Identifier("sand_stone_type") def __init__(self): - BlockState.__init__(self, "default", "heiroglyphs", "cut", "smooth") + BlockProperty.__init__(self, "default", "heiroglyphs", "cut", "smooth") @state -class SandTypeState(BlockState): +class SandTypeState(BlockProperty): id = Identifier("sand_type") def __init__(self): - BlockState.__init__(self, "normal", "type") + BlockProperty.__init__(self, "normal", "type") @state -class SaplingTypeState(BlockState): +class SaplingTypeState(BlockProperty): id = Identifier("sapling_type") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "evergreen", "birch", "jungle", "acacia", "roofed_oak" ) @state -class SculkSensorPhaseState(BlockState): +class SculkSensorPhaseState(BlockProperty): id = Identifier("sculk_sensor_phase") def __init__(self): - BlockState.__init__(self, "inactive", "active", "cooldown") + BlockProperty.__init__(self, "inactive", "active", "cooldown") @state -class SeaGrassTypeState(BlockState): +class SeaGrassTypeState(BlockProperty): id = Identifier("sea_grass_type") def __init__(self): - BlockState.__init__(self, "default", "double_top", "double_bot") + BlockProperty.__init__(self, "default", "double_top", "double_bot") @state -class SpongeTypeState(BlockState): +class SpongeTypeState(BlockProperty): id = Identifier("sponge_type") def __init__(self): - BlockState.__init__(self, "dry", "wet") + BlockProperty.__init__(self, "dry", "wet") @state @@ -878,19 +905,21 @@ def __init__(self): @state -class StoneBrickTypeState(BlockState): +class StoneBrickTypeState(BlockProperty): id = Identifier("stone_brick_type") def __init__(self): - BlockState.__init__(self, "default", "mossy", "cracked", "chiseled", "smooth") + BlockProperty.__init__( + self, "default", "mossy", "cracked", "chiseled", "smooth" + ) @state -class StoneSlabTypeState(BlockState): +class StoneSlabTypeState(BlockProperty): id = Identifier("stone_slab_type") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "smooth_stone", "sandstone", @@ -904,11 +933,11 @@ def __init__(self): @state -class StoneSlabType2State(BlockState): +class StoneSlabType2State(BlockProperty): id = Identifier("stone_slab_type2") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "red_sandstone", "purpur", @@ -922,11 +951,11 @@ def __init__(self): @state -class StoneSlabType3State(BlockState): +class StoneSlabType3State(BlockProperty): id = Identifier("stone_slab_type3") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "end_stone_brick", "smooth_red_sandstone", @@ -940,11 +969,11 @@ def __init__(self): @state -class StoneSlabType4State(BlockState): +class StoneSlabType4State(BlockProperty): id = Identifier("stone_slab_type_4") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "mossy_stone_brick", "smooth_quartz", @@ -955,11 +984,11 @@ def __init__(self): @state -class StoneTypeState(BlockState): +class StoneTypeState(BlockProperty): id = Identifier("stone_type") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "stone", "granite", @@ -980,19 +1009,21 @@ def __init__(self): @state -class StructureBlockTypeState(BlockState): +class StructureBlockTypeState(BlockProperty): id = Identifier("structure_block_type") def __init__(self): - BlockState.__init__(self, "data", "save", "load", "corner", "invalid", "export") + BlockProperty.__init__( + self, "data", "save", "load", "corner", "invalid", "export" + ) @state -class StructureVoidTypeState(BlockState): +class StructureVoidTypeState(BlockProperty): id = Identifier("structure_void_type") def __init__(self): - BlockState.__init__(self, "void", "air") + BlockProperty.__init__(self, "void", "air") @state @@ -1004,11 +1035,11 @@ def __init__(self): @state -class TallGrassTypeState(BlockState): +class TallGrassTypeState(BlockProperty): id = Identifier("tall_grass_type") def __init__(self): - BlockState.__init__(self, "default", "tall", "fern", "snow") + BlockProperty.__init__(self, "default", "tall", "fern", "snow") @state @@ -1028,11 +1059,11 @@ def __init__(self): @state -class TorchFacingDirectionState(BlockState): +class TorchFacingDirectionState(BlockProperty): id = Identifier("torch_facing_direction") def __init__(self): - BlockState.__init__(self, "unknown", "west", "east", "north", "south", "top") + BlockProperty.__init__(self, "unknown", "west", "east", "north", "south", "top") @state @@ -1044,11 +1075,11 @@ def __init__(self): @state -class TurtleEggCountState(BlockState): +class TurtleEggCountState(BlockProperty): id = Identifier("turtle_egg_count") def __init__(self): - BlockState.__init__(self, "one_egg", "two_egg", "three_egg", "four_egg") + BlockProperty.__init__(self, "one_egg", "two_egg", "three_egg", "four_egg") @state @@ -1084,11 +1115,11 @@ def __init__(self): @state -class WallBlockTypeState(BlockState): +class WallBlockTypeState(BlockProperty): id = Identifier("wall_block_type") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "cobblestone", "mossy_cobblestone", @@ -1108,35 +1139,35 @@ def __init__(self): @state -class WallConnectionTypEastState(BlockState): +class WallConnectionTypEastState(BlockProperty): id = Identifier("wall_connection_type_east") def __init__(self): - BlockState.__init__(self, "none", "short", "tall") + BlockProperty.__init__(self, "none", "short", "tall") @state -class WallConnectionTypeNorthState(BlockState): +class WallConnectionTypeNorthState(BlockProperty): id = Identifier("wall_connection_type_north") def __init__(self): - BlockState.__init__(self, "none", "short", "tall") + BlockProperty.__init__(self, "none", "short", "tall") @state -class WallConnectionTypeSouthState(BlockState): +class WallConnectionTypeSouthState(BlockProperty): id = Identifier("wall_connection_type_south") def __init__(self): - BlockState.__init__(self, "none", "short", "tall") + BlockProperty.__init__(self, "none", "short", "tall") @state -class WallConnectionTypeWestState(BlockState): +class WallConnectionTypeWestState(BlockProperty): id = Identifier("wall_connection_type_west") def __init__(self): - BlockState.__init__(self, "none", "short", "tall") + BlockProperty.__init__(self, "none", "short", "tall") @state @@ -1156,10 +1187,10 @@ def __init__(self): @state -class WoodTypeState(BlockState): +class WoodTypeState(BlockProperty): id = Identifier("wood_type") def __init__(self): - BlockState.__init__( + BlockProperty.__init__( self, "oak", "spruce", "birch", "jungle", "acacia", "dark_oak" ) diff --git a/mcaddon/text.py b/mcaddon/text.py index 4d2a5d0..9b6db53 100644 --- a/mcaddon/text.py +++ b/mcaddon/text.py @@ -1 +1,30 @@ -class Text: ... +from typing import Self + +from .util import Misc + + +class LiteralContent(str): + def jsonify(self) -> dict: + data = {"text": str(self)} + return data + + +class Text(Misc): + @property + def content(self) -> LiteralContent: + return getattr(self, "_content") + + @content.setter + def content(self, value): + self.on_update("content", value) + setattr(self, "_content", value) + + @classmethod + def literal(cls, text: str) -> Self: + self = cls.__new__(cls) + self.content = LiteralContent(text) + return self + + def jsonify(self) -> dict: + data = {"rawtext": [self.content.jsonify()]} + return data diff --git a/mcaddon/trading.py b/mcaddon/trading.py new file mode 100644 index 0000000..e15feb5 --- /dev/null +++ b/mcaddon/trading.py @@ -0,0 +1,521 @@ +from typing import Self +import os + +from .pack import behavior_pack +from .util import ( + getattr2, + setattr2, + getitem, + additem, + removeitem, + clearitems, + Identifier, + Identifiable, + Misc, +) +from .loot import LootFunction +from .file import JsonFile +from .math import Range + + +class TradeChoice: + + @classmethod + def from_dict(cls, data: dict) -> Self: + self = cls.__new__(cls) + return self + + def jsonify(self) -> dict: + data = {} + return data + + +# TODO: add choice +class ItemTrade(Misc): + def __init__( + self, + item: Identifiable, + quantity: int = None, + choice: TradeChoice = None, + functions: list[LootFunction] = None, + price_multiplier: float = 0.0, + ): + self.item = item + self.quantity = quantity + self.price_multiplier = price_multiplier + self.functions = functions + + def jsonify(self) -> dict: + data = {"item": str(self.item)} + if self.quantity is not None: + if isinstance(self.quantity, Range): + data["quantity"] = self.quantity.jsonify() + else: + data["quantity"] = self.quantity + if self.price_multiplier: + data["price_multiplier"] = self.price_multiplier + if self.functions: + data["functions"] = [x.jsonify() for x in self.functions] + return data + + @property + def functions(self) -> list[LootFunction]: + return getattr2(self, "_functions", []) + + @functions.setter + def functions(self, value: list[LootFunction]): + setattr2(self, "_functions", value, list) + + @property + def item(self) -> Identifier: + return getattr(self, "_item", None) + + @item.setter + def item(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("item", id) + setattr(self, "_item", id) + + @property + def quantity(self) -> int: + return getattr(self, "_quantity", None) + + @quantity.setter + def quantity(self, value: Range | int): + if value is None: + return + if not isinstance(value, (Range, int)): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + self.on_update("quantity", value) + setattr(self, "_quantity", value) + + @property + def price_multiplier(self) -> float: + return getattr(self, "_price_multiplier") + + @price_multiplier.setter + def price_multiplier(self, value: float): + if not isinstance(value, (float, int)): + raise TypeError( + f"Expected float but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_price_multiplier", value) + + @property + def choice(self) -> TradeChoice: + return getattr(self, "_choice") + + @choice.setter + def choice(self, value: TradeChoice): + if not isinstance(value, TradeChoice): + raise TypeError( + f"Expected TradeChoice but got '{value.__class__.__name__}' instead" + ) + self.on_update("choice", value) + setattr(self, "_choice", value) + + @classmethod + def from_dict(cls, data: dict) -> Self: + self = cls.__new__(cls) + if "item" in data: + self.item = data.pop("item") + else: + self.choice = TradeChoice.from_dict(data) + + if "quantity" in data: + q = data.pop("quantity") + if isinstance(q, dict): + self.quantity = Range.from_dict(q) + else: + self.quantity = q + + if "price_multiplier" in data: + self.price_multiplier = data.pop("price_multiplier") + return self + + # FUNCTIONS + + def get_functions(self, index: int) -> LootFunction: + return getitem(self, "functions", index) + + def add_function(self, trade: LootFunction) -> LootFunction: + return additem(self, "functions", trade, type=LootFunction) + + def remove_function(self, index: int) -> LootFunction: + return removeitem(self, "functions", index) + + def clear_functions(self) -> Self: + """Remove all functions""" + return clearitems(self, "functions") + + +class Trade(Misc): + def __init__( + self, + wants: list[ItemTrade], + gives: list[ItemTrade], + max_uses: int, + trader_exp: int = None, + reward_exp: bool = True, + ): + self.wants = [wants] if isinstance(wants, ItemTrade) else wants + self.gives = [gives] if isinstance(gives, ItemTrade) else gives + self.max_uses = max_uses + self.trader_exp = trader_exp + self.reward_exp = reward_exp + + def jsonify(self) -> dict: + data = { + "wants": [i.jsonify() for i in self.wants], + "gives": [i.jsonify() for i in self.gives], + } + if self.max_uses: + data["max_uses"] = self.max_uses + if self.trader_exp: + data["trader_exp"] = self.trader_exp + if self.reward_exp is not None: + data["reward_exp"] = self.reward_exp + return data + + @property + def reward_exp(self) -> bool: + return getattr(self, "_reward_exp") + + @reward_exp.setter + def reward_exp(self, value: bool): + if not isinstance(value, bool): + raise TypeError( + f"Expected bool but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_reward_exp", value) + + @property + def max_uses(self) -> int: + return getattr(self, "_max_uses", None) + + @max_uses.setter + def max_uses(self, value: int): + if value is None: + return + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_max_uses", value) + + @property + def trader_exp(self) -> int: + return getattr(self, "_trader_exp", None) + + @trader_exp.setter + def trader_exp(self, value: int): + if value is None: + return + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_trader_exp", value) + + @property + def wants(self) -> list[ItemTrade]: + return getattr2(self, "_wants", []) + + @wants.setter + def wants(self, value: list[ItemTrade]): + if value is None: + self.wants = [] + return + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + self.on_update("wants", value) + setattr(self, "_wants", value) + + @property + def gives(self) -> list[ItemTrade]: + return getattr2(self, "_gives", []) + + @gives.setter + def gives(self, value: list[ItemTrade]): + if value is None: + self.gives = [] + return + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + self.on_update("gives", value) + setattr(self, "_gives", value) + + @classmethod + def from_dict(cls, data: dict) -> Self: + self = cls.__new__(cls) + self.wants = [ItemTrade.from_dict(i) for i in data.pop("wants")] + self.gives = [ItemTrade.from_dict(i) for i in data.pop("gives")] + if "max_uses": + self.max_uses = data.pop("max_uses") + if "trader_exp": + self.trader_exp = data.pop("trader_exp") + if "reward_exp": + self.reward_exp = data.pop("reward_exp") + return self + + def get_want(self, index: int) -> ItemTrade: + return getitem(self, "wants", index) + + def add_want(self, item: ItemTrade) -> ItemTrade: + return additem(self, "wants", item, type=ItemTrade) + + def remove_want(self, index: int) -> ItemTrade: + return removeitem(self, "wants", index) + + def clear_wants(self) -> Self: + return clearitems(self, "wants") + + def get_give(self, index: int) -> ItemTrade: + return getitem(self, "gives", index) + + def add_give(self, item: ItemTrade) -> ItemTrade: + return additem(self, "gives", item, type=ItemTrade) + + def remove_give(self, index: int) -> ItemTrade: + return removeitem(self, "gives", index) + + def clear_gives(self) -> Self: + return clearitems(self, "gives") + + +class TradeGroup(Misc): + def __init__(self, num_to_select: int, trades: list[Trade] = None): + self.num_to_select = num_to_select + self.trades = trades + + @property + def num_to_select(self) -> int: + return getattr(self, "_num_to_select") + + @num_to_select.setter + def num_to_select(self, value: int): + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_num_to_select", value) + + @property + def trades(self) -> list[Trade]: + return getattr2(self, "_trades", []) + + @trades.setter + def trades(self, value: list[Trade]): + setattr2(self, "_trades", value, list) + + @staticmethod + def from_dict(data: dict) -> Self: + num_to_select = data.pop("num_to_select") + trades = [Trade.from_dict(x) for x in data.pop("trades")] + return TradeGroup(num_to_select, trades) + + def jsonify(self) -> dict: + data = { + "num_to_select": self.num_to_select, + "trades": [trade.jsonify() for trade in self.trades], + } + return data + + def get_trade(self, index: int) -> Trade: + return getitem(self, "trades", index) + + def add_trade(self, trade: Trade) -> Trade: + return additem(self, "trades", trade, type=Trade) + + def remove_trade(self, index: int) -> Trade: + return removeitem(self, "trades", index) + + def clear_trades(self) -> Self: + """Remove all trades""" + return clearitems(self, "trades") + + +class TradeTier(Misc): + def __init__( + self, + total_exp_required: int = None, + trades: list[Trade] = None, + groups: list[TradeGroup] = None, + ): + self.trades = trades + self.groups = groups + self.total_exp_required = total_exp_required + + def __iter__(self): + for i in self.trades: + yield i + + def jsonify(self) -> dict: + data = {} + if self.trades: + data["trades"] = [i.jsonify() for i in self.trades] + if self.groups: + data["groups"] = [i.jsonify() for i in self.groups] + if self.total_exp_required: + data["total_exp_required"] = self.total_exp_required + return data + + @property + def total_exp_required(self) -> int: + return getattr(self, "_total_exp_required", None) + + @total_exp_required.setter + def total_exp_required(self, value: int): + if value is None: + return + if not isinstance(value, int): + raise TypeError( + f"Expected int but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_total_exp_required", value) + + @property + def groups(self) -> list[TradeGroup]: + return getattr2(self, "_groups", []) + + @groups.setter + def groups(self, value: list[TradeGroup]): + if value is None: + self.groups = [] + return + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + setattr(self, "_groups", value) + + @property + def trades(self) -> list[Trade]: + return getattr2(self, "_trades", []) + + @trades.setter + def trades(self, value: list[Trade]): + if value is None: + self.trades = [] + return + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + self.on_update("trades", value) + setattr(self, "_trades", value) + + # TRADES + + def get_trade(self, index: int) -> Trade: + return getitem(self, "trades", index) + + def add_trade(self, trade: Trade) -> Trade: + return additem(self, "trades", trade, type=Trade) + + def remove_trade(self, index: int) -> Trade: + return removeitem(self, "trades", index) + + def clear_trades(self) -> Self: + """Remove all trades""" + return clearitems(self, "trades") + + # GROUPS + + def get_group(self, index: int) -> TradeGroup: + return getitem(self, "groups", index) + + def add_group(self, group: TradeGroup) -> TradeGroup: + return additem(self, "groups", group, type=TradeGroup) + + def remove_group(self, index: int) -> TradeGroup: + return removeitem(self, "groups", index) + + def clear_group(self) -> Self: + """Remove all groups""" + return clearitems(self, "groups") + + @classmethod + def from_dict(cls, data: dict) -> Self: + self = cls.__new__(cls) + if "trades" in data: + self.trades = [Trade.from_dict(i) for i in data.pop("trades")] + if "groups" in data: + self.groups = [TradeGroup.from_dict(x) for x in data.pop("groups")] + return self + + +@behavior_pack +class Trading(JsonFile, Identifiable): + """ + Represents a Trade Table. + """ + + id = Identifier("trading") + FILEPATH = "trading/trade.json" + + def __init__(self, identiifer: Identifiable, tiers: list[TradeTier] = None): + Identifiable.__init__(self, identiifer) + self.tiers = tiers + + def __iter__(self): + for i in self.tiers: + yield i + + def __str__(self) -> str: + return "Trading{" + repr(self.identifier.path) + "}" + + @property + def tiers(self) -> list[TradeTier]: + return getattr2(self, "_tiers", []) + + @tiers.setter + def tiers(self, value: list[TradeTier]): + if value is None: + self.tiers = [] + return + if not isinstance(value, list): + raise TypeError( + f"Expected list but got '{value.__class__.__name__}' instead" + ) + self.on_update("tiers", value) + setattr(self, "_tiers", value) + + def jsonify(self) -> dict: + data = {"tiers": [i.jsonify() for i in self.tiers]} + return data + + def valid(self, fp: str) -> bool: + return True + + def get_tier(self, index: int) -> TradeTier: + return getitem(self, "tiers", index) + + def add_tier(self, tier: TradeTier) -> TradeTier: + return additem(self, "tiers", tier, type=TradeTier) + + def remove_tier(self, index: int) -> TradeTier: + return removeitem(self, "tiers", index) + + def clear_tiers(self, index: int) -> Self: + """Remove all trade tiers""" + return clearitems(self, "tiers") + + @classmethod + def open(cls, fp: str, start): + with open(fp, "r") as fd: + self = cls.load(fd) + self.identifier = os.path.relpath(fp, start).replace("\\", "/") + return self + + @classmethod + def from_dict(cls, data: dict) -> Self: + self = cls.__new__(cls) + self.tiers = [TradeTier.from_dict(i) for i in data.pop("tiers")] + return self diff --git a/mcaddon/util.py b/mcaddon/util.py index 9c5f6df..fbdea54 100644 --- a/mcaddon/util.py +++ b/mcaddon/util.py @@ -1,7 +1,9 @@ -from typing import Self +from typing import Self, Callable, Any import re +import os -from .constant import Category +from .constant import Category, ItemGroup +from .math import Vector3 def stringify(self, args): @@ -9,25 +11,128 @@ def stringify(self, args): return f"{self.__class__.__name__}({inner})" -def getattr2(o, name, default=None): +def splitpath(path: str) -> tuple[str, str, str]: + """ + Splits the path into 3 parts. `root/dirname/filename.extension` -> (`root/dirname`, `filename`, `.extension`) + + :param path: The path to split + :type path: str + :return: 3 parts of the path (dirname, filename, extension) + :rtype: tuple[str, str, str] + """ + a = os.path.dirname(path) + b, c = os.path.splitext(os.path.basename(path)) + return a, b, c + + +def modpath(path: str, part: str, value: str) -> str: + """ + Modify a part of a path. + + :param path: The main path to modify. + :type path: str + :param part: The part to modify. `d` - dirname. `f` - filename. `e` - extension. + :type part: str + :param value: The value to place + :type value: str + :return: The modified path. + :rtype: str + """ + a, b, c = splitpath(path) + if value == "" or value is None: + return path + match part.lower(): + case "d": + return os.path.join(value, b + c) + case "f": + return os.path.join(a, value + c) + case "e": + return os.path.join(a, b + value) + return path + + +# Rename to getsetattr +def getattr2(obj, name, default=None): """ Normal getattr function but if not defined it uses setattr and returns the default value """ - res = getattr(o, name, None) + res = getattr(obj, name, None) if res is None: - setattr(o, name, default) + setattr(obj, name, default) return default return res +def setattr2(obj, name: str, value, type=None): + """ + setattr method but has type checking and list/dict defaults. + """ + if value is None: + if issubclass(type, list): + value = [] + if issubclass(type, dict): + value = {} + if type is not None and not isinstance(value, type): + raise TypeError( + f"Expected {type.__class__.__name__} but got '{value.__class__.__name__}' instead" + ) + setattr(obj, name, value) + + +def clearitems(obj, name: str): + getattr(obj, name).clear() + return obj + + +def removeitem(obj, name: str, key: Any): + return getattr(obj, name).pop(key) + + +def getitem(obj, name: str, key: Any): + return getattr(obj, name)[key] + + +def additem(obj, name: str, value: Any, key: Any = None, type=None): + v = getattr(obj, name) + if type is not None and not isinstance(value, type): + raise TypeError( + f"Expected {type.__class__.__name__} but got '{value.__class__.__name__}' instead" + ) + if key is None: + v.append(value) + else: + v[key] = value + return value + + +class Misc: + _events = {} + + def on_update(self, name: str, value: Any): + if name in self._events: + for func in self._events[name]: + self._events[name](value) + + def bind(self, name: str, func: Callable) -> Self: + if name not in self._events: + self._events[name] = [] + self._events[name].append(func) + return self + + def copy(self) -> Self: + return self.from_dict(self.jsonify()) + + # Should extend datapackutils.Identifier to include AUX values -class Identifier: +class Identifier(Misc): + """Represents a string which contains a `namespace` and `path`""" + DEFAULT_NAMESPACE = "minecraft" SEPERATOR = ":" def __init__(self, namespace: str, path: str = None): if path is None: - id = Identifier.parse(namespace) + id = Identifier.of(namespace) self.namespace = id.namespace self.path = id.path else: @@ -45,7 +150,7 @@ def __str__(self) -> str: ) def __eq__(self, other) -> bool: - other = Identifier(other) + other = Identifiable.of(other) return self.namespace == other.namespace and self.path == other.path def __add__(self, other) -> str: @@ -53,6 +158,9 @@ def __add__(self, other) -> str: return str(self) + str(other) return str(self) + other + def __len__(self) -> int: + return len(str(self)) + def __inter__(self): for x in self.split(): yield x @@ -60,25 +168,22 @@ def __inter__(self): def __hash__(self): return hash((self.namespace, self.path)) - @property - def __dict__(self) -> dict: - data = {"namespace": self.namespace, "path": self.path} - return data - @property def namespace(self) -> str: return getattr(self, "_namespace", self.DEFAULT_NAMESPACE) @namespace.setter def namespace(self, value: str | None): - if value is None or value == "": - setattr(self, "_namespace", self.DEFAULT_NAMESPACE) + if value is None or value == "" or value.lower() == "none": + self.namespace = self.DEFAULT_NAMESPACE elif isinstance(value, Identifier): self.namespace = value.namespace elif self.is_namespace_valid(value): - setattr(self, "_namespace", str(value).strip()) + v = str(value).strip() + self.on_update("namespace", v) + setattr(self, "_namespace", v) else: - raise ValueError(value) + raise ValueError(repr(value)) @property def path(self) -> str | None: @@ -91,10 +196,41 @@ def path(self, value: str): elif isinstance(value, Identifier): self.path = value.path elif self.is_path_valid(str(value)): - setattr(self, "_path", str(value).strip()) + v = str(value).strip() + self.on_update("path", v) + setattr(self, "_path", v) else: raise ValueError(value) + # Read-Only + @property + def identifier(self) -> Self: + return self + + @staticmethod + def from_dict(data: dict) -> Self: + return Identifier(**data) + + @staticmethod + def of(value: str) -> Self: + """ + Parse this value as an identifier + + :param value: The value to parse + :type value: str + :rtype: Identifier + """ + if isinstance(value, Identifier): + return value.copy() + + if str(value).count(Identifier.SEPERATOR) == 0: + return Identifier(Identifier.DEFAULT_NAMESPACE, value) + return Identifier(*str(value).split(Identifier.SEPERATOR, 1)) + + def jsonify(self) -> dict: + data = {"namespace": self.namespace, "path": self.path} + return data + def is_path_valid(self, path: str = None) -> bool: """ Validates the path @@ -105,7 +241,7 @@ def is_path_valid(self, path: str = None) -> bool: :rtype: bool """ v = self.path if path is None else path - res = re.match(r"^[a-zA-Z-0-9/_\.]+$", v) + res = re.match(r"^[a-zA-Z-0-9/_\.:]+$", v) return res is not None def is_namespace_valid(self, namespace: str = None) -> bool: @@ -121,35 +257,6 @@ def is_namespace_valid(self, namespace: str = None) -> bool: res = re.match(r"^[a-z0-9_]+$", v) return res is not None - @classmethod - def parse(cls, value: str) -> Self: - """ - Parse this value as an identifier - - :param value: The value to parse - :type value: str - :rtype: Identifier - """ - self = cls.__new__(cls) - if isinstance(value, Identifier): - return value.copy() - - if str(value).count(self.SEPERATOR) == 0: - self.path = value - else: - x = str(value).split(self.SEPERATOR) - self.namespace = x[0] - self.path = x[1] - return self - - def copy(self) -> Self: - """ - Returns a copy of this identifier - - :rtype: Identifier - """ - return Identifier(self.namespace, self.path) - def copy_with_path(self, path: str) -> Self: """ Returns a copy of this identifier with a new path @@ -172,24 +279,64 @@ def copy_with_namespace(self, namespace: str) -> Self: ) return id - def split(self) -> tuple: + def split(self) -> tuple[str, str]: """ - Returns (namespace, path) + Returns the Identifier split as (namespace, path) + + :rtype: tuple[str, str] """ return (self.namespace, self.path) - def replace(self, old, new, count=-1) -> Self: + def replace(self, old: str, new: str, count=-1) -> Self: + """ + Replace text in path + + :param old: The text to replace + :type old: str + :param new: The new text to replace with + :type new: str + :param count: Maximum number of occurrences to replace., defaults to -1 + :type count: int, optional + :rtype: Identifier + """ self.path.replace(old, new, count) return self + def suffix(self, suffix: str) -> Self: + """ + Add suffix to the end of the path + + :param suffix: The path suffix + :type suffix: str + :rtype: Identifier + """ + self.path += str(suffix) + return self + + def prefix(self, prefix) -> Self: + """ + Add prefix to the start of the path + + :param prefix: The path prefix + :rtype: Identifier + """ + self.path = str(prefix) + self.path + return self + ID = Identifier -class Identifiable: +class Identifiable(Misc): def __init__(self, identifier: Identifier): self.identifier = identifier + def __repr__(self) -> str: + return self.__class__.__name__ + "{" + str(self.identifier) + "}" + + def __str__(self) -> str: + return str(self.identifier) + @property def identifier(self) -> Identifier: """The unique identifier for this object. It must be of the form 'namespace:name', where namespace cannot be 'minecraft'.""" @@ -197,23 +344,63 @@ def identifier(self) -> Identifier: @identifier.setter def identifier(self, value: Identifier): - if not isinstance(value, (Identifier, str)): - raise TypeError( - f"Expected Identifier but got '{value.__class__.__name__}' instead" - ) - id = Identifier(value) + id = Identifiable.of(value) self.filename = id.path + self.on_update("identifier", id) setattr(self, "_identifier", id) + @staticmethod + def of(value: str | Identifier) -> Identifier: + if value is None: + return Identifier("empty") + if isinstance(value, Identifiable): + return value.identifier + if isinstance(value, Identifier): + return value + return Identifier.of(value) + + def copy_with_path(self, path: str) -> Self: + """ + Returns a copy of this object with a new path + + :rtype: Identifiable + """ + obj = self.copy() + obj.identifier = obj.identifier.copy_with_path(path) + return obj + + def copy_with_namespace(self, namespace: str) -> Self: + """ + Returns a copy of this object with a new namespace + + :rtype: Identifiable + """ + obj = self.copy() + obj.identifier = obj.identifier.copy_with_namespace(namespace) + return obj + + def copy_with(self, identifier) -> Self: + """ + Returns a copy of this object with a new identifier + + :rtype: Identifiable + """ + obj = self.copy() + obj.identifier = Identifiable.of(identifier) + return obj -class Version: - def __init__(self, major: int, minor: int, patch: int): - self.major = major - self.minor = minor - self.patch = patch + +class Version(Misc): + def __init__(self, major: int, minor: int = None, patch: int = None): + if minor == None and patch == None: + self.major, self.minor, self.patch = Version.of(major).split() + else: + self.major = major + self.minor = minor + self.patch = patch def __str__(self) -> str: - return ".".join([str(i) for i in self.__dict__]) + return ".".join([str(i) for i in self.jsonify()]) def __iter__(self): for i in [self.major, self.minor, self.patch]: @@ -229,10 +416,6 @@ def __getitem__(self, k): return self.patch raise KeyError(k) - @property - def __dict__(self) -> list: - return [self.major, self.minor, self.patch] - @property def major(self) -> int: return getattr(self, "_major", 0) @@ -246,6 +429,7 @@ def major(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("major", value) setattr(self, "_major", value) @property @@ -261,6 +445,7 @@ def minor(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("minor", value) setattr(self, "_minor", value) @property @@ -276,28 +461,33 @@ def patch(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("patch", value) setattr(self, "_patch", value) - @classmethod - def parse(cls, s: str | list) -> Self: - self = cls.__new__(cls) - if isinstance(s, list): - self.major = s[0] - self.minor = s[1] - self.patch = s[2] - else: - major, minor, patch = str(s).split(".") - self.major = int(major) - self.minor = int(minor) - self.patch = int(patch) - return self + @staticmethod + def of(value: str | list) -> Self: + if isinstance(value, list): + return Version(*value) + return Version(*str(value).split(".")) + + def jsonify(self) -> list: + return [self.major, self.minor, self.patch] + + def split(self) -> tuple: + """ + Returns (major, minor, patch) + """ + return (self.major, self.minor, self.patch) + def copy(self) -> Self: + return Version(self.major, self.minor, self.patch) -class MenuCategory: + +class MenuCategory(Misc): def __init__( self, category: Category | str, - group: str = None, + group: ItemGroup = ItemGroup.SEARCH, is_hidden_in_commands: bool = False, ): """ @@ -314,11 +504,10 @@ def __init__( self.group = group self.is_hidden_in_commands = is_hidden_in_commands - @property - def __dict__(self) -> dict: - data = {"category": self.category._value_} - if self.category._value_ != "none": - data["group"] = self.group + def jsonify(self) -> dict: + data = {"category": self.category.jsonify()} + if self.category != Category.NONE: + data["group"] = self.group.jsonify() if self.is_hidden_in_commands: data["is_hidden_in_commands"] = self.is_hidden_in_commands return data @@ -328,22 +517,25 @@ def category(self) -> Category: return getattr(self, "_category") @category.setter - def category(self, value: Category): - if isinstance(value, Category): - setattr(self, "_category", value) - else: - self.category = Category[str(value).lower()] + def category(self, value:Category): + if not isinstance(value, Category): raise TypeError(f"Expected Category but got '{value.__class__.__name__}' instead") + self.on_update("category", value) + setattr(self, "_category", value) @property - def group(self) -> str: - return getattr(self, "_group", "itemGroup.search") + def group(self) -> ItemGroup: + return getattr(self, "_group", ItemGroup.SEARCH) @group.setter - def group(self, value: str): + def group(self, value: ItemGroup | None): if value is None: - self.group = "itemGroup.search" + self.group = ItemGroup.SEARCH return - setattr(self, "_group", str(value)) + if isinstance(value, ItemGroup): + self.on_update("group", value) + setattr(self, "_group", value) + else: + self.category = ItemGroup.from_dict(str(value)) @property def is_hidden_in_commands(self) -> bool: @@ -355,32 +547,41 @@ def is_hidden_in_commands(self, value: bool): raise TypeError( f"Expected bool but got '{value.__class__.__name__}' instead" ) + self.on_update("is_hidden_in_commands", value) setattr(self, "_is_hidden_in_commands", value) @classmethod def from_dict(cls, data: dict) -> Self: self = cls.__new__(cls) if "category" in data: - self.category = data.pop("category") + self.category = Category.from_dict(data.pop("category")) if "group" in data: - self.group = data.pop("group") + self.group = ItemGroup.from_dict(data.pop("group")) if "is_hidden_in_commands" in data: self.is_hidden_in_commands = data.pop("is_hidden_in_commands") return self + @staticmethod + def none() -> Self: + return MenuCategory(Category.NONE) + + def copy(self) -> Self: + return MenuCategory(self.category, self.group) + -class Box: - def __init__(self, origin: list = None, size: list = None): +class Box(Misc): + def __init__( + self, origin: Vector3 = Vector3(-8, 0, -8), size: Vector3 = Vector3(16, 16, 16) + ): self.origin = origin self.size = size - @property - def __dict__(self) -> dict: + def as_dict(self) -> dict: data = {} if self.origin is not None: - data["origin"] = self.origin + data["origin"] = self.origin.jsonify() if self.size is not None: - data["size"] = self.size + data["size"] = self.size.jsonify() if isinstance(self.origin, bool): data = self.origin return data @@ -395,56 +596,52 @@ def from_dict(cls, data: dict) -> Self: return self @property - def origin(self) -> list[float]: + def origin(self) -> Vector3: """Minimal position of the bounds of the box. "origin" is specified as [x, y, z] and must be in the range (-8, 0, -8) to (8, 16, 8), inclusive, defaults to [-8.0, 0, -8.0]""" - return getattr(self, "_origin", None) + return getattr(self, "_origin", Vector3(-8, 0, -8)) @origin.setter - def origin(self, value: list[float]): - if value is None: - setattr(self, "_origin", [-8.0, 0, -8.0]) - return - elif isinstance(value, bool): + def origin(self, value: Vector3): + if isinstance(value, bool): setattr(self, "_origin", value) - elif isinstance(value, list): + elif isinstance(value, Vector3): + self.on_update("origin", value) setattr(self, "_origin", value) else: raise TypeError( - f"Expected list[float] but got '{value.__class__.__name__}' instead" + f"Expected Vector3 but got '{value.__class__.__name__}' instead" ) @property - def size(self) -> list[float]: + def size(self) -> Vector3: """Size of each side of the box. Size is specified as [x, y, z]. "origin" + "size" must be in the range (-8, 0, -8) to (8, 16, 8), inclusive, defaults to [16.0, 16.0, 16.0]""" - return getattr(self, "_size", None) + return getattr(self, "_size", Vector3(16, 16, 16)) @size.setter - def size(self, value: list[float]): - if value is None: - setattr(self, "_size", [16, 16, 16]) - return - if not isinstance(value, list): + def size(self, value: Vector3): + if not isinstance(value, Vector3): raise TypeError( f"Expected list[float] but got '{value.__class__.__name__}' instead" ) + self.on_update("size", value) setattr(self, "_size", value) def is_cube(self) -> bool: - return self.origin == [-8, 0, -8] and self.size == [16, 16, 16] + return self.origin == Vector3(-8, 0, -8) and self.size == Vector3(16, 16, 16) def is_none(self) -> bool: - return self.origin == [0, 0, 0] and self.size == [0, 0, 0] + return self.origin == Vector3(0, 0, 0) and self.size == Vector3(0, 0, 0) @classmethod def cube(cls) -> Self: self = cls.__new__(cls) - self.origin = [-8, 0, -8] - self.size = [16, 16, 16] + self.origin = Vector3(-8, 0, -8) + self.size = Vector3(16, 16, 16) return self @classmethod def none(cls) -> Self: self = cls.__new__(cls) - self.origin = [0, 0, 0] - self.size = [0, 0, 0] + self.origin = Vector3(0, 0, 0) + self.size = Vector3(0, 0, 0) return self diff --git a/mcaddon/volume.py b/mcaddon/volume.py index 5437f3c..d869561 100644 --- a/mcaddon/volume.py +++ b/mcaddon/volume.py @@ -2,30 +2,61 @@ import json from . import VERSION +from .pack import behavior_pack from .registry import INSTANCE, Registries from .event import Trigger, Event from .file import JsonFile, Loader -from .util import getattr2, Identifier, Identifiable - - -class VolumeComponent: +from .util import ( + getattr2, + getitem, + additem, + removeitem, + clearitems, + Identifier, + Identifiable, + Misc, +) + + +class VolumeComponent(Misc): def __repr__(self): return str(self) def __str__(self) -> str: return "VolumeComponent{" + str(self.id) + "}" - @property - def __dict__(self) -> dict: + def __call__(self, ctx) -> int: + return self.execute(ctx) + + def jsonify(self) -> dict: raise NotImplementedError() def json(self) -> str: - return json.dumps(self.__dict__) + return json.dumps(self.jsonify()) @classmethod def from_dict(cls, data: dict) -> Self: raise NotImplementedError() + @property + def id(self) -> Identifier: + return getattr(self, "_id") + + @id.setter + def id(self, value: Identifier): + setattr(self, "_id", Identifier.of(value)) + + def execute(self, ctx) -> int: + return 0 + + def generate(self, ctx) -> None: + """ + Called when this component is added to Volume or BehaviorPack + + :type ctx: Volume | BehaviorPack + """ + ... + INSTANCE.create_registry(Registries.VOLUME_COMPONENT_TYPE, VolumeComponent) @@ -49,19 +80,18 @@ class FogComponent(VolumeComponent): id = Identifier("fog") - def __init__(self, fog_identifier: Identifier, priority: int): + def __init__(self, fog_identifier: Identifiable, priority: int): self.fog_identifier = fog_identifier self.priority = priority - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: data = {"fog_identifier": str(self.fog_identifier), "priority": self.priority} return data @classmethod def from_dict(cls, data: dict) -> Self: self = cls.__new__(cls) - self.fog_identifier = Identifier(data.pop("fog_identifier")) + self.fog_identifier = data.pop("fog_identifier") self.priority = data.pop("priority") return self @@ -71,8 +101,10 @@ def fog_identifier(self) -> Identifier: return getattr(self, "_fog_identifier") @fog_identifier.setter - def fog_identifier(self, value: Identifier | str): - setattr(self, "_fog_identifier", Identifier(value)) + def fog_identifier(self, value: Identifiable): + id = Identifiable.of(value) + self.on_update("fog_identifier", id) + setattr(self, "_fog_identifier", id) @property def priority(self) -> int: @@ -85,6 +117,7 @@ def priority(self, value: int): raise TypeError( f"Expected int but got '{value.__class__.__name__}' instead" ) + self.on_update("priority", value) setattr(self, "_priority", value) @@ -97,9 +130,8 @@ class OnActorEnterComponent(VolumeComponent): def __init__(self, on_enter: list[Trigger] = None): self.on_enter = on_enter - @property - def __dict__(self) -> dict: - data = {"on_enter": [x.__dict__ for x in self.on_enter]} + def jsonify(self) -> dict: + data = {"on_enter": [x.jsonify() for x in self.on_enter]} return data @property @@ -116,6 +148,7 @@ def on_enter(self, value: list[Trigger]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("on_enter", value) setattr(self, "_on_enter", value) @classmethod @@ -125,18 +158,17 @@ def from_dict(cls, data: dict) -> Self: return self def get_event(self, index: int) -> Trigger: - return self.on_enter[index] + return getitem(self, "on_enter", index) def add_event(self, event: Trigger) -> Trigger: - self.on_enter.append(event) - return event + return additem(self, "on_enter", event, type=Trigger) def remove_event(self, index: int) -> Trigger: - return self.on_enter.pop(index) + return removeitem(self, "on_enter", index) def clear_events(self) -> Self: - self.on_enter = [] - return self + """Removes all on enter triggers""" + return clearitems(self, "on_enter") @volume_component_type @@ -148,9 +180,8 @@ class OnActorLeaveComponent(VolumeComponent): def __init__(self, on_leave: list[Trigger]): self.on_leave = on_leave - @property - def __dict__(self) -> dict: - data = {"on_leave": [x.__dict__ for x in self.on_leave]} + def jsonify(self) -> dict: + data = {"on_leave": [x.jsonify() for x in self.on_leave]} return data @property @@ -167,6 +198,7 @@ def on_leave(self, value: list[Trigger]): raise TypeError( f"Expected list but got '{value.__class__.__name__}' instead" ) + self.on_update("on_leave", value) setattr(self, "_on_leave", value) @classmethod @@ -176,33 +208,31 @@ def from_dict(cls, data: dict) -> Self: return self def get_event(self, index: int) -> Trigger: - return self.on_leave[index] + return getitem(self, "on_leave", index) def add_event(self, event: Trigger) -> Trigger: - self.on_leave.append(event) - return event + return additem(self, "on_leave", event, type=Trigger) def remove_event(self, index: int) -> Trigger: - return self.on_leave.pop(index) + return removeitem(self, "on_leave", index) def clear_events(self) -> Self: - self.on_leave = [] - return self + """Remove all on leave triggers""" + return clearitems(self, "on_leave") +@behavior_pack class Volume(JsonFile, Identifiable): """ - Represents a Volume. + Represents a data-driven [Volume](https://bedrock.dev/docs/stable/Volumes). """ id = Identifier("volume") - EXTENSION = ".json" - FILENAME = "volume" - DIRNAME = "volumes" + FILEPATH = "volumes/volume.json" def __init__( self, - identifier: Identifier | str, + identifier: Identifiable, components: dict[str, VolumeComponent] = None, ): Identifiable.__init__(self, identifier) @@ -211,20 +241,19 @@ def __init__( def __str__(self) -> str: return "Volume{" + str(self.identifier) + "}" - @property - def __dict__(self) -> dict: + def jsonify(self) -> dict: volume = {"description": {"identifier": str(self.identifier)}} if self.components: volume["components"] = {} for k, v in self.components.items(): - volume["components"][str(k)] = v.__dict__ + volume["components"][str(k)] = v.jsonify() if self.events: volume["events"] = {} for key, events in self.events.items(): d = {} for k, v in events.items(): - d[k.path] = v.__dict__ + d[k.path] = v.jsonify() volume["events"][str(key)] = d data = {"format_version": VERSION["VOLUME"], str(self.id): volume} @@ -250,6 +279,7 @@ def components(self, value: dict[str, VolumeComponent]): raise TypeError( f"Expected dict but got '{value.__class__.__name__}' instead" ) + self.on_update("components", value) setattr(self, "_components", value) @property @@ -258,44 +288,57 @@ def events(self) -> dict[Identifier, Event]: return getattr2(self, "_events", {}) @events.setter - def events(self, value: dict[Identifier, Event]): + def events(self, value: dict[Identifiable, Event]): if not isinstance(value, dict): raise TypeError( f"Expected dict but got '{value.__class__.__name__}' instead" ) - setattr(self, "_events", value) + events = {} + for k, v in value.items(): + events[Identifiable.of(k)] = v + self.on_update("events", events) + setattr(self, "_events", events) + + def generate(self, ctx) -> None: + """ + Called when this item is added to ResourcePack or BehaviorPack + + :type ctx: ResourcePack | BehaviorPack + """ + for c in self.components.values(): + c.generate(ctx) + for e in self.events.values(): + e.generate(ctx) # COMPONENT - def add_component(self, component: VolumeComponent) -> VolumeComponent: - if not isinstance(component, VolumeComponent): - raise TypeError( - f"Expected VolumeComponent but got '{component.__class__.__name__}' instead" - ) - self.components[component.id] = component - return component + def get_component(self, id: Identifiable) -> VolumeComponent: + return getitem(self, "components", Identifiable.of(id)) - def get_component(self, id: str) -> VolumeComponent: - x = id.id if isinstance(id, VolumeComponent) else id - return self.components.get(x) + def add_component(self, component: VolumeComponent) -> VolumeComponent: + component.generate(self) + return additem(self, "components", component, component.id, VolumeComponent) - def remove_component(self, id: str) -> VolumeComponent: - x = id.id if isinstance(id, VolumeComponent) else id - return self.components.pop(x) + def remove_component(self, id: Identifiable) -> VolumeComponent: + return removeitem(self, "components", Identifiable.of(id)) def clear_components(self) -> Self: - self.components.clear() - return self + """Remove all components""" + return clearitems(self, "components") # EVENT - def add_event(self, id: Identifier | str, event: Event) -> Event: + def get_event(self, event: Identifiable) -> Event: + return getitem(self, "events", Identifiable.of(event)) + + def add_event(self, id: Identifiable, event: Event) -> Event: if not isinstance(event, Event): raise TypeError( f"Expected Event but got '{event.__class__.__name__}' instead" ) - i = Identifier.parse(id) + i = Identifier.of(id) if i in self.events: + event.generate(self) self.events[i][event.id] = event return event obj = {} @@ -304,20 +347,19 @@ def add_event(self, id: Identifier | str, event: Event) -> Event: event.id return event - def get_event(self, id: Identifier | str) -> Event: - i = Identifier.parse(id) - return self.events.get(i) - - def remove_event(self, id: Identifier | str) -> Event: - i = Identifier.parse(id) - return self.events.pop(i) + def remove_event(self, event: Identifiable) -> Event: + return removeitem(self, "events", Identifiable.of(event)) def clear_events(self) -> Self: - self.events.clear() - return self + """Remove all events""" + return clearitems(self, "events") + + def generate(self, ctx) -> None: ... class VolumeLoader(Loader): + name = "Volume" + def __init__(self): from .schemas import VolumeSchema1 diff --git a/publish.bat b/publish.bat new file mode 100644 index 0000000..a883c46 --- /dev/null +++ b/publish.bat @@ -0,0 +1,7 @@ +@REM fix for appengine ImportError: pip install urllib3==1.26.15 requests-toolbelt==0.10.1 + +@REM Build source distribution +@REM build + +@REM Upload to PyPI using twime +python -m twine upload dist/* --config-file %userprofile%\Desktop\Python\.pypirc diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..7af0924 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,4 @@ +[pytest] +addopts = -p no:warnings +testpaths = + tests diff --git a/scripting.py b/scripting.py new file mode 100644 index 0000000..8024c37 --- /dev/null +++ b/scripting.py @@ -0,0 +1,15 @@ +import py2js +import math + +# pip install py2js +# pip install jsbeautifier +# pip install strinpy + + +@py2js.convert +def main(): + def test(a): + return a == 5 + + +print(main) diff --git a/setup.cfg b/setup.cfg index 4a87308..2544a86 100644 --- a/setup.cfg +++ b/setup.cfg @@ -16,6 +16,7 @@ classifiers = License :: OSI Approved :: MIT License Programming Language :: Python :: 3.11 + [options] zip_safe = False include_package_data = True @@ -28,6 +29,12 @@ install_requires = jsonschema chevron Pillow + numpy + PyGLM + watchdog + +[options.package_data] +* = data/**/*.json [options.entry_points] console_scripts = diff --git a/.venv/Lib/site-packages/black-24.1.1.dist-info/REQUESTED b/tests/__init__.py similarity index 100% rename from .venv/Lib/site-packages/black-24.1.1.dist-info/REQUESTED rename to tests/__init__.py diff --git a/tests/__pycache__/__init__.cpython-311.pyc b/tests/__pycache__/__init__.cpython-311.pyc new file mode 100644 index 0000000..3a84e82 Binary files /dev/null and b/tests/__pycache__/__init__.cpython-311.pyc differ diff --git a/tests/__pycache__/pickle_test.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/pickle_test.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..e0c3b83 Binary files /dev/null and b/tests/__pycache__/pickle_test.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_addon.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_addon.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..6ef5509 Binary files /dev/null and b/tests/__pycache__/test_addon.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_block.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_block.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..c3cf895 Binary files /dev/null and b/tests/__pycache__/test_block.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_block_culling.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_block_culling.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..48ddb27 Binary files /dev/null and b/tests/__pycache__/test_block_culling.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_camera.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_camera.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..a5ce74c Binary files /dev/null and b/tests/__pycache__/test_camera.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_feature.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_feature.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..0e35586 Binary files /dev/null and b/tests/__pycache__/test_feature.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_feature_rule.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_feature_rule.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..fdee823 Binary files /dev/null and b/tests/__pycache__/test_feature_rule.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_geometry.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_geometry.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..9309f54 Binary files /dev/null and b/tests/__pycache__/test_geometry.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_item.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_item.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..bdb7dbb Binary files /dev/null and b/tests/__pycache__/test_item.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_loot.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_loot.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..261370b Binary files /dev/null and b/tests/__pycache__/test_loot.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_ops.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_ops.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..2110ade Binary files /dev/null and b/tests/__pycache__/test_ops.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_read_addon.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_read_addon.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..c0e1c58 Binary files /dev/null and b/tests/__pycache__/test_read_addon.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_read_pack.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_read_pack.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..e2771c8 Binary files /dev/null and b/tests/__pycache__/test_read_pack.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_recipe.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_recipe.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..f8619e8 Binary files /dev/null and b/tests/__pycache__/test_recipe.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_render.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_render.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..efd26d5 Binary files /dev/null and b/tests/__pycache__/test_render.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_trading.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_trading.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..553567a Binary files /dev/null and b/tests/__pycache__/test_trading.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/__pycache__/test_volume.cpython-311-pytest-8.0.2.pyc b/tests/__pycache__/test_volume.cpython-311-pytest-8.0.2.pyc new file mode 100644 index 0000000..68dd8e4 Binary files /dev/null and b/tests/__pycache__/test_volume.cpython-311-pytest-8.0.2.pyc differ diff --git a/tests/block_settings.py b/tests/block_settings.py deleted file mode 100644 index a85b06d..0000000 --- a/tests/block_settings.py +++ /dev/null @@ -1,4 +0,0 @@ -from mcaddon import * - -blk = Block.from_settings("test:block", BlockSettings().strength(10)) -blk.save("build/") diff --git a/tests/demo.py b/tests/demo.py deleted file mode 100644 index af54b26..0000000 --- a/tests/demo.py +++ /dev/null @@ -1,4 +0,0 @@ -from mcaddon import Item, Addon - -with Addon.load("build/addon") as addon: - addon.add(Item("test")) diff --git a/tests/files/BP_1/blocks/block.json b/tests/files/BP_1/blocks/block.json new file mode 100644 index 0000000..23c40ba --- /dev/null +++ b/tests/files/BP_1/blocks/block.json @@ -0,0 +1,91 @@ +{ + "format_version": "1.20.50", + "minecraft:block": { + "description": { + "identifier": "test:block" + }, + "components": { + "minecraft:on_fall_on": { + "event": "test:on_fall_on", + "min_fall_distance": 0.0 + }, + "minecraft:on_interact": { + "event": "test:on_interact" + }, + "minecraft:on_placed": { + "event": "test:on_placed" + }, + "minecraft:on_player_destroyed": { + "event": "test:on_player_destroyed" + }, + "minecraft:on_player_placing": { + "event": "test:on_player_placing" + }, + "minecraft:on_step_off": { + "event": "test:on_step_off" + }, + "minecraft:on_step_on": { + "event": "test:on_step_on" + }, + "minecraft:bone_visibility": { + "bones": { + "bone": "false" + } + }, + "minecraft:breathability": "air", + "minecraft:collision_box": true, + "minecraft:selection_box": true, + "minecraft:crafting_table": { + "crafting_tags": [ + "crafting_table" + ], + "table_name": "container.crafting_table" + }, + "minecraft:display_name": "tile.BLOCK.name", + "minecraft:destructible_by_explosion": { + "explosion_resistance": 0 + }, + "minecraft:destructible_by_mining": { + "seconds_to_destroy": 0 + }, + "minecraft:flammable": {}, + "minecraft:friction": 0.5, + "minecraft:geometry": "geometry.full_cube", + "minecraft:light_dampening": 0, + "minecraft:light_emission": 0, + "minecraft:loot": "", + "minecraft:map_color": "#f80", + "minecraft:material_instances": { + "*": { + "texture": "minecraft:stone" + } + }, + "minecraft:placement_filter": { + "conditions": [] + }, + "minecraft:queued_ticking": { + "interval_range": [ + 1, + 1 + ], + "on_tick": { + "event": "minecraft:queued_ticking" + } + }, + "minecraft:random_ticking": { + "on_tick": { + "event": "minecraft:random_ticking" + } + }, + "minecraft:transformation": { + "rotation": [ + 0.0, + 0.0, + 0.0 + ] + }, + "minecraft:unit_cube": {}, + "tag:minecraft:stone": {} + } + } +} \ No newline at end of file diff --git a/tests/files/BP_1/items/item.json b/tests/files/BP_1/items/item.json new file mode 100644 index 0000000..7824321 --- /dev/null +++ b/tests/files/BP_1/items/item.json @@ -0,0 +1,112 @@ +{ + "format_version": "1.20.50", + "minecraft:item": { + "description": { + "identifier": "test:item" + }, + "components": { + "minecraft:ignores_permission": true, + "minecraft:allow_off_hand": true, + "minecraft:block_placer": { + "block": "minecraft:stone" + }, + "minecraft:can_destroy_in_creative": true, + "minecraft:cooldown": { + "category": "", + "duration": 1.0 + }, + "minecraft:damage": { + "value": 1 + }, + "minecraft:display_name": { + "value": "item.ITEM" + }, + "minecraft:durability": { + "damage_chance": 1.0, + "max_durability": 1 + }, + "minecraft:enchantable": { + "slot": "chestplate", + "value": 1 + }, + "minecraft:entity_placer": { + "entity": "minecraft:armor_stand" + }, + "minecraft:food": { + "nutrition": 1, + "saturation_modifier": 1.0 + }, + "minecraft:fuel": { + "duration": 1.0 + }, + "minecraft:glint": true, + "minecraft:hand_equipped": true, + "minecraft:hover_text_color": { + "value": "red" + }, + "minecraft:icon": { + "texture": "minecraft:apple" + }, + "minecraft:interact_button": { + "value": "test" + }, + "minecraft:item_storage": { + "capacity": 1 + }, + "minecraft:liquid_clipped": { + "value": true + }, + "minecraft:max_stack_size": 16, + "minecraft:projectile": { + "projectile_entity": "minecraft:arrow", + "minimum_critical_power": 1.0 + }, + "minecraft:record": { + "comparator_signal": 1, + "duration": 1.0, + "sound_event": "minecraft:cat" + }, + "minecraft:repairable": { + "repair_items": [] + }, + "minecraft:shooter": { + "ammunition": [ + "minecraft:arrow" + ], + "charge_on_draw": true, + "max_draw_duration": 1.0, + "scale_power_by_draw_duration": true + }, + "minecraft:should_despawn": { + "value": true + }, + "minecraft:stacked_by_data": true, + "minecraft:tags": { + "tags": [ + "minecraft:paper" + ] + }, + "minecraft:throwable": { + "do_swing_animation": true, + "launch_power_scale": 1, + "max_draw_duration": 1.0, + "max_launch_power": 1.0, + "min_draw_duration": 1.0, + "scale_power_by_draw_duration": true + }, + "minecraft:use_animation": "eat", + "minecraft:use_modifiers": { + "movement_modifier": 1.0, + "use_duration": 1.0 + }, + "minecraft:wearable": { + "protection": 1, + "slot": 1 + }, + "minecraft:digger": { + "destroy_speeds": [], + "use_efficiency": true + } + } + } +} \ No newline at end of file diff --git a/tests/files/BP_1/manifest.json b/tests/files/BP_1/manifest.json new file mode 100644 index 0000000..09c0804 --- /dev/null +++ b/tests/files/BP_1/manifest.json @@ -0,0 +1,30 @@ +{ + "format_version": 2, + "header": { + "name": "pack.name", + "description": "pack.description", + "uuid": "24c5e77a-86a8-4683-9f19-9509343d0659", + "version": [ + 1, + 0, + 0 + ], + "min_engine_version": [ + 1, + 20, + 51 + ] + }, + "modules": [ + { + "description": "pack.description", + "type": "data", + "uuid": "1b2dcb69-be1a-463e-a9c1-71a2ccefb8c5", + "version": [ + 1, + 0, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/tests/files/BP_1/texts/en_US.lang b/tests/files/BP_1/texts/en_US.lang new file mode 100644 index 0000000..77d6a42 --- /dev/null +++ b/tests/files/BP_1/texts/en_US.lang @@ -0,0 +1,2 @@ +pack.name=Untitled +pack.description=Auto generated \ No newline at end of file diff --git a/tests/files/BP_1/texts/languages.json b/tests/files/BP_1/texts/languages.json new file mode 100644 index 0000000..f23f2dd --- /dev/null +++ b/tests/files/BP_1/texts/languages.json @@ -0,0 +1 @@ +["en_US"] \ No newline at end of file diff --git a/tests/files/BP_1/volumes/volume.json b/tests/files/BP_1/volumes/volume.json new file mode 100644 index 0000000..ebac1af --- /dev/null +++ b/tests/files/BP_1/volumes/volume.json @@ -0,0 +1,40 @@ +{ + "format_version": "1.20.50", + "minecraft:volume": { + "description": { + "identifier": "test:volume" + }, + "components": { + "minecraft:fog": { + "fog_identifier": "minecraft:fog_savanna", + "priority": 1 + }, + "minecraft:on_actor_enter": { + "on_enter": [ + { + "event": "minecraft:on_enter" + } + ] + }, + "minecraft:on_actor_leave": { + "on_leave": [ + { + "event": "minecraft:on_leave" + } + ] + } + }, + "events": { + "minecraft:on_enter": { + "run_command": { + "command": "say on_enter" + } + }, + "minecraft:on_leave": { + "run_command": { + "command": "say on_leave" + } + } + } + } +} \ No newline at end of file diff --git a/tests/files/BP_2/blocks/block2.json b/tests/files/BP_2/blocks/block2.json new file mode 100644 index 0000000..4179466 --- /dev/null +++ b/tests/files/BP_2/blocks/block2.json @@ -0,0 +1,87 @@ +{ + "format_version": "1.20.50", + "minecraft:block": { + "description": { + "identifier": "test:block2" + }, + "components": { + "minecraft:on_interact": { + "event": "test:on_interact" + }, + "minecraft:on_placed": { + "event": "test:on_placed" + }, + "minecraft:on_player_destroyed": { + "event": "test:on_player_destroyed" + }, + "minecraft:on_player_placing": { + "event": "test:on_player_placing" + }, + "minecraft:on_step_off": { + "event": "test:on_step_off" + }, + "minecraft:on_step_on": { + "event": "test:on_step_on" + }, + "minecraft:bone_visibility": { + "bones": { + "bone": "false" + } + }, + "minecraft:breathability": "air", + "minecraft:collision_box": true, + "minecraft:selection_box": true, + "minecraft:crafting_table": { + "crafting_tags": [ + "crafting_table" + ], + "table_name": "container.crafting_table" + }, + "minecraft:display_name": "tile.BLOCK.name", + "minecraft:destructible_by_explosion": { + "explosion_resistance": 0 + }, + "minecraft:destructible_by_mining": { + "seconds_to_destroy": 0 + }, + "minecraft:flammable": {}, + "minecraft:friction": 0.5, + "minecraft:geometry": "geometry.full_cube", + "minecraft:light_dampening": 0, + "minecraft:light_emission": 0, + "minecraft:loot": "", + "minecraft:map_color": "#f80", + "minecraft:material_instances": { + "*": { + "texture": "minecraft:stone" + } + }, + "minecraft:placement_filter": { + "conditions": [] + }, + "minecraft:queued_ticking": { + "interval_range": [ + 1, + 1 + ], + "on_tick": { + "event": "minecraft:queued_ticking" + } + }, + "minecraft:random_ticking": { + "on_tick": { + "event": "minecraft:random_ticking" + } + }, + "minecraft:transformation": { + "rotation": [ + 0.0, + 0.0, + 0.0 + ] + }, + "minecraft:unit_cube": {}, + "tag:minecraft:stone": {} + } + } +} \ No newline at end of file diff --git a/tests/files/BP_2/manifest.json b/tests/files/BP_2/manifest.json new file mode 100644 index 0000000..09c0804 --- /dev/null +++ b/tests/files/BP_2/manifest.json @@ -0,0 +1,30 @@ +{ + "format_version": 2, + "header": { + "name": "pack.name", + "description": "pack.description", + "uuid": "24c5e77a-86a8-4683-9f19-9509343d0659", + "version": [ + 1, + 0, + 0 + ], + "min_engine_version": [ + 1, + 20, + 51 + ] + }, + "modules": [ + { + "description": "pack.description", + "type": "data", + "uuid": "1b2dcb69-be1a-463e-a9c1-71a2ccefb8c5", + "version": [ + 1, + 0, + 0 + ] + } + ] +} \ No newline at end of file diff --git a/tests/item_settings.py b/tests/item_settings.py deleted file mode 100644 index bc1aed8..0000000 --- a/tests/item_settings.py +++ /dev/null @@ -1,4 +0,0 @@ -from mcaddon import * - -itm = Item.from_settings("test:item", ItemSettings().set_count(16)) -itm.save("build/") diff --git a/tests/read_addon.py b/tests/read_addon.py deleted file mode 100644 index c9a3c16..0000000 --- a/tests/read_addon.py +++ /dev/null @@ -1,6 +0,0 @@ -from mcaddon import Addon - -addon = Addon.load("build/addon") -print(addon.packs) -# for pack in addon.packs: -# print(pack) diff --git a/tests/read_beh.py b/tests/read_beh.py deleted file mode 100644 index 777b5b0..0000000 --- a/tests/read_beh.py +++ /dev/null @@ -1,6 +0,0 @@ -from mcaddon import BehaviorPack - -beh = BehaviorPack.load("tests/units/behavior_packs/vanilla") -print(beh) -# for pack in addon.packs: -# print(pack) diff --git a/tests/read_block.py b/tests/read_block.py deleted file mode 100644 index b0ea1e4..0000000 --- a/tests/read_block.py +++ /dev/null @@ -1,5 +0,0 @@ -from mcaddon import Block - -blk = Block.load("build/block.json") -print(blk.identifier) -blk.save("build/output.json") diff --git a/tests/read_camera.py b/tests/read_camera.py deleted file mode 100644 index acfe53b..0000000 --- a/tests/read_camera.py +++ /dev/null @@ -1,5 +0,0 @@ -from mcaddon import CameraPreset - -blk = CameraPreset.load("build/camera.json") -print(blk.identifier) -blk.save("build/output.json") diff --git a/tests/read_item.py b/tests/read_item.py deleted file mode 100644 index 7267616..0000000 --- a/tests/read_item.py +++ /dev/null @@ -1,5 +0,0 @@ -from mcaddon import Item - -itm = Item.load("build/item.json") -print(itm.identifier) -itm.save("build/output.json") diff --git a/tests/read_loot.py b/tests/read_loot.py deleted file mode 100644 index ad1625e..0000000 --- a/tests/read_loot.py +++ /dev/null @@ -1,7 +0,0 @@ -from mcaddon import LootTable - -loot1 = LootTable.load("build/loot1.json") -print(loot1[0][0]) - -# loot2 = LootTable.load('build/loot2.json') -# print(loot2[0][0]) diff --git a/tests/read_recipe.py b/tests/read_recipe.py deleted file mode 100644 index 84bc5bf..0000000 --- a/tests/read_recipe.py +++ /dev/null @@ -1,22 +0,0 @@ -from mcaddon import * - -rpe = Recipe.load("build/brewing_container.json") -print(rpe.identifier) - -rpe = Recipe.load("build/brewing_mix.json") -print(rpe.identifier) - -rpe = Recipe.load("build/furnace.json") -print(rpe.identifier) - -rpe = Recipe.load("build/shaped.json") -print(rpe.identifier) - -rpe = Recipe.load("build/shapeless.json") -print(rpe.identifier) - -rpe = Recipe.load("build/smithing_transform.json") -print(rpe.identifier) - -rpe = Recipe.load("build/smithing_trim.json") -print(rpe.identifier) diff --git a/tests/read_volume.py b/tests/read_volume.py deleted file mode 100644 index 6beb505..0000000 --- a/tests/read_volume.py +++ /dev/null @@ -1,5 +0,0 @@ -from mcaddon import Volume - -vol = Volume.load("build/volume.json") -print(vol.identifier) -vol.save("build/output.json") diff --git a/tests/test_addon.py b/tests/test_addon.py new file mode 100644 index 0000000..d6d7ec4 --- /dev/null +++ b/tests/test_addon.py @@ -0,0 +1,34 @@ +from mcaddon import * + +from .test_block_culling import blkcull +from .test_block import blk +from .test_camera import cam +from .test_feature_rule import rule +from .test_feature import features +from .test_geometry import geo +from .test_item import itm +from .test_loot import loot1, loot2 +from .test_recipe import recipes +from .test_trading import trde +from .test_volume import vol + +addon = Addon() + +# Add files + +addon.add(blk) +addon.add(cam) +addon.add(rule) +for f in features: + addon.add(f) +addon.add(geo) +addon.add(itm) +addon.add(loot1) +addon.add(loot2) +for r in recipes: + addon.add(r) +addon.add(trde) +addon.add(vol) +addon.add(blkcull) + +addon.save("build/addon", zipped=False, overwrite=True) diff --git a/tests/write_block.py b/tests/test_block.py similarity index 92% rename from tests/write_block.py rename to tests/test_block.py index c231541..39f6d3b 100644 --- a/tests/write_block.py +++ b/tests/test_block.py @@ -22,7 +22,7 @@ blk.add_component(DestructibleByMiningComponent(0)) blk.add_component(FlammableComponent()) blk.add_component(FrictionComponent(0.5)) -blk.add_component(GeometryComponent("geometry.full_cube")) +blk.add_component(GeometryComponent("geometry.full_cube", culling="test:sushi_cull")) blk.add_component(LightDampeningComponent(0)) blk.add_component(LightEmissionComponent(0)) blk.add_component(LootComponent("")) @@ -32,7 +32,7 @@ blk.add_component(mi) pf = PlacementFilterComponent() blk.add_component(pf) -blk.add_component(QueuedTickingComponent([60, 60], Trigger("queued_ticking"))) +blk.add_component(QueuedTickingComponent(Range(60, 60), Trigger("queued_ticking"))) blk.add_component(RandomTickingComponent(Trigger("random_ticking"))) blk.add_component(TransformationComponent.rotate(0, 0, 0)) blk.add_component(UnitCubeComponent()) diff --git a/tests/test_block_culling.py b/tests/test_block_culling.py new file mode 100644 index 0000000..6510292 --- /dev/null +++ b/tests/test_block_culling.py @@ -0,0 +1,11 @@ +from mcaddon import * + +blkcull = BlockCullingRules("test:sushi_cull") +blkcull.add_rule( + CullingRule(Direction.NORTH, GeometryPart("bb_main", 0, Direction.NORTH)) +) +blkcull.add_rule( + CullingRule(Direction.SOUTH, GeometryPart("bb_main", 0, Direction.SOUTH)) +) +blkcull.add_rule(CullingRule(Direction.EAST, GeometryPart("bb_main"))) +blkcull.save("build/") diff --git a/tests/test_camera.py b/tests/test_camera.py new file mode 100644 index 0000000..7116d27 --- /dev/null +++ b/tests/test_camera.py @@ -0,0 +1,5 @@ +from mcaddon import CameraPreset + +cam = CameraPreset("test:camera", rot_y=90) + +cam.save("build/") diff --git a/tests/test_feature.py b/tests/test_feature.py new file mode 100644 index 0000000..46b30a6 --- /dev/null +++ b/tests/test_feature.py @@ -0,0 +1,270 @@ +from mcaddon import * + + +# Features + +fea1 = AggregateFeature("example:monument_with_flowers_feature") +fea1.add_feature("monument_feature") +fea1.add_feature("scatter_white_flowers_feature") +fea1.add_feature("scatter_yellow_flower_feature") +fea1.save("build/") + +fea2 = SequenceFeature("example:oak_tree_then_apples_feature") +fea2.add_feature("oak_tree_feature") +fea2.add_feature("scatter_apples_feature") +fea2.save("build/") + +fea3 = BeardsAndShaversFeature( + "code:beards_and_shavers", + "minecraft:feature_that_places_a_structure", + Vector3(-2, 0, -2), + Vector3(2, 8, 2), + 2.0, + "grass", + "dirt", + 0.1, + 0.3, +) +fea3.save("build/") + +fea4 = CaveCarverFeature("minecraft:underground_cave_carver_feature", "air", 0.0, 15) +fea4.save("build/") + +fea5 = ConditionalListFeature("test:conditional_features", "placement_success") +fea5.add_feature( + ConditionalFeature( + "minecraft:some_feature_or_other", Molang("query.check_some_block_property()") + ) +) +fea5.save("build/") + +fea6 = FossilFeature("minecraft:fossil_feature", "coal_ore", 4) +fea6.save("build/") + +fea7 = GeodeFeature( + "minecraft:diamond_geode_feature", + "air", + "diamond_block", + "emerald_block", + "calcite", + "obsidian", + 4, + 7, + 3, + 5, + 1, + 3, + 16, + 2.0, + 0.95, + 2.0, + 0.025, + 0.35, + 0.0083, + True, + 1, +) +fea7.add_placement(BlockState("amethyst_cluster", {"amethyst_cluster_type": "small"})) +fea7.save("build/") + +fea8 = GrowingPlantFeature("minecraft:cave_vine_feature", "DOWN", True, Range(17, 26)) +fea8.add_height_distribution(HeightDistribution(Range(1, 13), 2)) +fea8.add_height_distribution(HeightDistribution(Range(1, 2), 3)) +fea8.add_height_distribution(HeightDistribution(Range(1, 7), 10)) +fea8.add_body_block(GrowingPlantBlock("cave_vines", 4)) +fea8.add_body_block(GrowingPlantBlock("cave_vines_body_with_berries", 1)) +fea8.add_head_block(GrowingPlantBlock("cave_vines", 4)) +fea8.add_head_block(GrowingPlantBlock("cave_vines_head_with_berries", 1)) +fea8.save("build/") + +fea9 = NetherCaveCarverFeature("minecraft:nether_cave_carver_feature", "air", 0.0) +fea9.save("build/") + +fea10 = MultifaceFeature( + "example:blue_vines_feature", "example:blue_vine", 64, True, True, True, 0.5 +) +fea10.add_place_on_block("stone") +fea10.save("build/") + +fea11 = OreFeature("example:malachite_ore_feature", 12) +fea11.add_rule(ReplaceRule("example:malachite_ore", ["stone"])) +fea11.add_rule(ReplaceRule("example:granite_malachite_ore", ["granite"])) +fea11.add_rule(ReplaceRule("example:andesite_malachite_ore", ["andesite"])) +fea11.save("build/") + +fea12 = PartiallyExposedBlobFeature( + "example:underwater_magma_feature", "magma", 1, 0.5, "up" +) +fea12.save("build/") + +fea13 = RectLayoutFeature("example:rect_layout_feature", 0.5) +fea13.add_feature_area(FeatureArea("tree", Vector2(0, 0))) +fea13.add_feature_area(FeatureArea("tree2", Vector2(0, 0))) +fea13.save("build/") + +fea14 = ScanSurfaceFeature("example:scan_surface_feature", "example:apple_feature") +fea14.save("build/") + +fea15 = ScatterFeature( + "example:scatter_flowers_feature", + "example:flower_feature", + 10, + x=DistributionProvider("uniform", Vector2(0, 15)), + y=64, + z=DistributionProvider("uniform", Vector2(0, 15)), + scatter_chance=50.0, +) +fea15.save("build/") + +fea16 = SculkPatchFeature( + "example:sculk_patch_feature", "stone", 1.0, 1, 1, 1, 1, 1, Range(1, 5) +) +fea16.add_can_place_on("stone") +fea16.save("build/") + +fea17 = SearchFeature( + "example:find_valid_apples_feature", + "example:apple_feature", + VectorRange(Vector3(-3, -3, -3), Vector3(3, 3, 3)), + "-y", + 3, +) +fea17.save("build/") + +fea18 = SingleBlockFeature( + "example:single_pumpkin_feature", "example:pumpkin", True, True +) +fea18.add_place_on("example:grass") +fea18.add_replace("example:air") +fea18.save("build/") + +fea19 = SnapToSurfaceFeature( + "minecraft:cave_vine_snapped_to_ceiling_feature", + "minecraft:cave_vine_feature", + 12, + "ceiling", +) +fea19.save("build/") + +bi = BlockIntersection() +bi.add_allow_block("example:air") +fea20 = StructureTemplateFeature( + "example:hot_air_balloon_feature", + "example:hot_air_balloon", + 8, + "random", + Constraints(True, bi), +) +fea20.save("build/") + +fea21 = SurfaceRelativeThresholdFeature( + "minecraft:underwater_magma_underground_feature", + "minecraft:underwater_magma_snap_to_surface_feature", + 2, +) +fea21.save("build/") + +fea22 = UnderwaterCaveCarverFeature( + "minecraft:underground_cave_carver_feature", "water", 0.0, "flowing_water" +) +fea22.save("build/") + +# TODO: https://bedrock.dev/docs/stable/Features#minecraft%3Atree_feature + +at = AcaciaTrunk( + BlockState("log", {"old_log_type": "oak"}), + TrunkHeight(4, [2], 3), + 1, + TrunkLean(True, Range(2, 3), Range(3, 4), Range(1, 2)), +) +rsc = RandomSpreadCanopy(2, 3, 50) +rsc.add_leaf(WeightedBlock("azalea_leaves", 3)) +rsc.add_leaf(WeightedBlock("azalea_leaves_flowered", 1)) +fea23 = TreeFeature("custom:azalea_tree_feature", at, rsc) +fea23.add_base_block("dirt_with_roots") +fea23.add_grow_on("dirt") +fea23.add_grow_on("grass") +fea23.add_grow_on("podzol") +fea23.add_grow_on("dirt") +fea23.add_grow_on("farmland") +fea23.add_grow_on("dirt_with_roots") +fea23.add_grow_on("moss_block") +fea23.add_grow_on("clay") +fea23.add_grow_on("mycelium") +fea23.add_grow_on("mud") +fea23.add_grow_on("muddy_mangrove_roots") +fea23.add_replace("leaves") +fea23.add_replace("leaves2") +fea23.add_replace("azalea") +fea23.add_replace("flowering_azalea") +fea23.add_replace("azalea_leaves") +fea23.add_replace("azalea_leaves_flowered") +fea23.add_replace("mangrove_leaves") +fea23.add_replace("water") +fea23.add_replace("flower_water") +fea23.add_replace("moss_carpet") +fea23.add_replace("tallgrass") +fea23.add_replace("grass") +fea23.add_replace("air") +fea23.add_replace("double_plant") +fea23.add_grow_through("dirt") +fea23.add_grow_through("grass") +fea23.add_grow_through("moss_carpet") +fea23.add_grow_through("tallgrass") +fea23.add_grow_through("double_plant") +fea23.save("build/") + +fea24 = VegetationPatchFeature( + "custom:clay_pool_with_dripleaves_feature", + "clay", + "dripleaf_feature", + "floor", + 3, + 5, + 0.1, + Range(4, 8), + 0.8, + 0.7, + True, +) +fea24.add_replace("clay") +fea24.add_replace("moss_block") +fea24.add_replace("sand") +fea24.add_replace("gravel") +fea24.add_replace("dirt") +fea24.add_replace("podzol") +fea24.add_replace("dirt_with_roots") +fea24.add_replace("grass") +fea24.add_replace("mycelium") +fea24.add_replace("stone") +fea24.add_replace("cave_vines") +fea24.add_replace("cave_vines_body_with_berries") +fea24.add_replace("cave_vines_head_with_berries") +fea24.save("build/") + +features = [ + fea1, + fea2, + fea3, + fea4, + fea5, + fea6, + fea7, + fea8, + fea9, + fea10, + fea11, + fea12, + fea13, + fea14, + fea15, + fea16, + fea17, + fea18, + fea19, + fea20, + fea21, + fea22, + fea23, + fea24, +] diff --git a/tests/test_feature_rule.py b/tests/test_feature_rule.py new file mode 100644 index 0000000..7851b95 --- /dev/null +++ b/tests/test_feature_rule.py @@ -0,0 +1,17 @@ +from mcaddon import * + +biome_filter = Filters() +biome_filter.add_filter(Filter("has_biome_tag", "forest", "==")) +all_of = AllFilter() +all_of.add_filter(Filter("has_biome_tag", "birch", "==")) +all_of.add_filter(Filter("has_biome_tag", "mutated", "!=")) +biome_filter.add_filter(all_of) + +conditions = FeatureRuleCondition("surface_pass", biome_filter) +rule = FeatureRule( + "minecraft:birch_forest_surface_trees_feature", + "minecraft:legacy:birch_forest_tree_feature", + conditions, + Distribution(1, 0, 0, 0), +) +rule.save("build/") diff --git a/tests/test_geometry.py b/tests/test_geometry.py new file mode 100644 index 0000000..1436c70 --- /dev/null +++ b/tests/test_geometry.py @@ -0,0 +1,9 @@ +from mcaddon import * + +geo = Geometry("cube.geo") +model = EntityModel("geometry.cube", 64, 64, 2, 2.5, Vector3(0, 0.75, 0)) +bone = Bone("bb_main", pivot=Vector3(0, 0, 0)) +bone.add_cube(Cube(Vector3(-8, 0, -8), Vector3(16, 16, 16), Vector2(0, 0))) +model.add_bone(bone) +geo.add_model(model) +geo.save("build/") diff --git a/tests/write_item.py b/tests/test_item.py similarity index 93% rename from tests/write_item.py rename to tests/test_item.py index 4c75ca9..fe1a944 100644 --- a/tests/write_item.py +++ b/tests/test_item.py @@ -29,10 +29,11 @@ itm.add_component(sc) itm.add_component(ShouldDespawnComponent(True)) itm.add_component(StackedByDataComponent(True)) -itm.add_component(TagsComponent()) +itm.add_component(ItemTagsComponent()) itm.add_component(ThrowableComponent(True, True, 1, 1, 1, True)) -itm.add_component(UseAnimationComponent(UseAnimation.eat)) +itm.add_component(UseAnimationComponent(UseAnimation.EAT)) itm.add_component(UseModifiersComponent(1, 1)) itm.add_component(WearableComponent(1, 1)) itm.add_component(DiggerComponent(True)) + itm.save("build/") diff --git a/tests/write_loot.py b/tests/test_loot.py similarity index 99% rename from tests/write_loot.py rename to tests/test_loot.py index 089bb2b..6c475ef 100644 --- a/tests/write_loot.py +++ b/tests/test_loot.py @@ -21,7 +21,6 @@ entry3 = ItemEntry("name_tag", 30) pool1.add_entry(entry3) loot1.add_pool(pool1) -loot1.save("build/loot1.json") # Tiered Pools loot2 = LootTable() @@ -29,4 +28,6 @@ entry1 = LootEntry("loot_tables/entities/armor_set_leather.json") pool2.add_entry(entry1) loot2.add_pool(pool2) + +loot1.save("build/loot1.json") loot2.save("build/loot2.json") diff --git a/tests/test_ops.py b/tests/test_ops.py new file mode 100644 index 0000000..86bc4df --- /dev/null +++ b/tests/test_ops.py @@ -0,0 +1,13 @@ +from mcaddon import * + +blocks = [Block("test1"), Block("test2"), Block("test3")] + +for b in blocks: + if b == Block("test3"): + print("EQUAL", b) + + if b != Block("test3"): + print("NOT", b) + + if "components" in b: + print("HAS COMPONENTS", b) diff --git a/tests/test_read_addon.py b/tests/test_read_addon.py new file mode 100644 index 0000000..ee510d6 --- /dev/null +++ b/tests/test_read_addon.py @@ -0,0 +1,4 @@ +from mcaddon import Addon + +addon = Addon.open("build/addon") +print(addon.packs) diff --git a/tests/test_read_pack.py b/tests/test_read_pack.py new file mode 100644 index 0000000..9a830e8 --- /dev/null +++ b/tests/test_read_pack.py @@ -0,0 +1,7 @@ +from mcaddon import ResourcePack, BehaviorPack + +BP = BehaviorPack.open("build/addon/addon_BP") +print(BP) + +RP = ResourcePack.open("build/addon/addon_RP") +print(RP) diff --git a/tests/write_recipe.py b/tests/test_recipe.py similarity index 72% rename from tests/write_recipe.py rename to tests/test_recipe.py index 3421470..b39b296 100644 --- a/tests/write_recipe.py +++ b/tests/test_recipe.py @@ -1,7 +1,8 @@ from mcaddon import * -rpe1 = FurnaceRecipe("furnace_beef", ItemStack("beef"), ItemStack("cooked_beef")) -rpe1.save("build/") +rpe1 = FurnaceRecipe( + "furnace_beef", Ingredient(ItemStack("beef")), ItemStack("cooked_beef") +) rpe2 = BrewingContainerRecipe( "brew_potion_sulphur", @@ -9,7 +10,6 @@ ItemStack("gunpowder"), ItemStack("splash_potion"), ) -rpe2.save("build/") rpe3 = BrewingMixRecipe( "brew_awkward_blaze_powder", @@ -17,16 +17,13 @@ ItemStack("blaze_powder"), ItemStack("potion_type"), ) -rpe3.save("build/") -rpe4 = ShapedRecipe("acacia_boat", ["#P#", "###"], ItemStack("boat", data=4)) +rpe4 = ShapedRecipe("acacia_boat", ItemStack("boat", data=4), ["#P#", "###"]) rpe4.add_key("#", ItemStack("planks")) rpe4.add_key("P", ItemStack("wooden_shovel")) -rpe4.save("build/") rpe5 = ShapelessRecipe("firecharge_coal_sulphur", ItemStack("blaze_powder", data=4)) rpe5.add_ingredient(ItemStack("fireball", 4, 0)) -rpe5.save("build/") rpe6 = SmithingTransformRecipe( "smithing_netherite_boots", @@ -35,12 +32,20 @@ ItemStack("netherite_ingot"), ItemStack("netherite_boots"), ) -rpe6.save("build/") rpe7 = SmithingTrimRecipe( "smithing_diamond_boots_jungle_quartz_trim", - ItemStack("jungle_temple_smithing_template"), - ItemStack("diamond_boots"), - ItemStack("quartz"), + Ingredient(ItemStack("jungle_temple_smithing_template")), + Ingredient(ItemStack("diamond_boots")), + Ingredient(ItemStack("quartz")), ) + +rpe1.save("build/") +rpe2.save("build/") +rpe3.save("build/") +rpe4.save("build/") +rpe5.save("build/") +rpe6.save("build/") rpe7.save("build/") + +recipes = [rpe1, rpe2, rpe3, rpe4, rpe5, rpe6, rpe7] diff --git a/tests/test_trading.py b/tests/test_trading.py new file mode 100644 index 0000000..b102b85 --- /dev/null +++ b/tests/test_trading.py @@ -0,0 +1,41 @@ +from mcaddon import * + +trde = Trading("minister") +tier1 = TradeTier() + +group = TradeGroup(1) +gives1 = ItemTrade("enchanted_book") +gives1.add_function(EnchantBookForTradingLootFunction(4, 12, 8, 4)) +group.add_trade( + Trade( + [ + ItemTrade("wiki:blessing_glyph", Range(2, 4), price_multiplier=0.5), + ItemTrade("book"), + ], + gives1, + 7, + 3, + ) +) + +gives2 = ItemTrade("wiki:exalted_blade") +gives2.add_function(EnchantWithLevelsLootFunction(True, LootNumberProvider(15, 25))) +group.add_trade( + Trade( + ItemTrade("wiki:crystalline_spiritite", 32, price_multiplier=0.125), + gives2, + 2, + 8, + False, + ) +) + +tier1.add_group(group) +trde.add_tier(tier1) + +# tier2 = TradeTier(28) +# tier2.add_trade(Trade()) +# tier2.add_trade(Trade()) +# trde.add_tier(tier2) + +trde.save("build/") diff --git a/tests/write_volume.py b/tests/test_volume.py similarity index 99% rename from tests/write_volume.py rename to tests/test_volume.py index db7a3e4..b2cd65e 100644 --- a/tests/write_volume.py +++ b/tests/test_volume.py @@ -6,4 +6,5 @@ vol.add_component(OnActorLeaveComponent([Trigger("on_leave")])) vol.add_event("on_enter", RunCommand("say on_enter")) vol.add_event("on_leave", RunCommand("say on_leave")) + vol.save("build/") diff --git a/tests/units/README.md b/tests/units/README.md deleted file mode 100644 index 469b3a2..0000000 --- a/tests/units/README.md +++ /dev/null @@ -1,6 +0,0 @@ -# units - -This directory contains the Vanilla Minecraft resource_packs, behavior_packs, definitions, and skin_packs from; -``` -C:\Program Files\WindowsApps\Microsoft.MinecraftUWP_1.20.5101.0_x64__8wekyb3d8bbwe\data -``` diff --git a/tests/update_addon.py b/tests/update_addon.py deleted file mode 100644 index eb33f97..0000000 --- a/tests/update_addon.py +++ /dev/null @@ -1,4 +0,0 @@ -from mcaddon import * - -with Addon.load("build/addon") as ctx: - print(ctx) diff --git a/tests/update_block.py b/tests/update_block.py deleted file mode 100644 index 94165bb..0000000 --- a/tests/update_block.py +++ /dev/null @@ -1,4 +0,0 @@ -from mcaddon import * - -with Block.load("build/block.json") as ctx: - ctx.identifier = "custom:block" diff --git a/tests/update_camera.py b/tests/update_camera.py deleted file mode 100644 index 6b91fcc..0000000 --- a/tests/update_camera.py +++ /dev/null @@ -1,4 +0,0 @@ -from mcaddon import CameraPreset - -with CameraPreset.load("build/camera.json") as ctx: - ctx.identifier = "custom:camera" diff --git a/tests/update_item.py b/tests/update_item.py deleted file mode 100644 index f1e85a4..0000000 --- a/tests/update_item.py +++ /dev/null @@ -1,4 +0,0 @@ -from mcaddon import * - -with Item.load("build/item.json") as ctx: - ctx.identifier = "custom:item" diff --git a/tests/update_loot.py b/tests/update_loot.py deleted file mode 100644 index 4872f6f..0000000 --- a/tests/update_loot.py +++ /dev/null @@ -1,4 +0,0 @@ -from mcaddon import LootTable - -with LootTable.load("build/loot1.json") as ctx: - ctx[0].rolls = 0.5 diff --git a/tests/update_recipe.py b/tests/update_recipe.py deleted file mode 100644 index 8ab3e5b..0000000 --- a/tests/update_recipe.py +++ /dev/null @@ -1,22 +0,0 @@ -from mcaddon import * - -with Recipe.load("build/brewing_container.json") as ctx: - ctx.identifier = "custom:brewing_container" - -with Recipe.load("build/brewing_mix.json") as ctx: - ctx.identifier = "custom:brewing_mix" - -with Recipe.load("build/furnace.json") as ctx: - ctx.identifier = "custom:furnace" - -with Recipe.load("build/shaped.json") as ctx: - ctx.identifier = "custom:shaped" - -with Recipe.load("build/shapeless.json") as ctx: - ctx.identifier = "custom:shapeless" - -with Recipe.load("build/smithing_transform.json") as ctx: - ctx.identifier = "custom:smithing_transform" - -with Recipe.load("build/smithing_trim.json") as ctx: - ctx.identifier = "custom:smithing_trim" diff --git a/tests/update_volume.py b/tests/update_volume.py deleted file mode 100644 index eab445b..0000000 --- a/tests/update_volume.py +++ /dev/null @@ -1,7 +0,0 @@ -from mcaddon import * - -with Volume.load("build/volume.json") as ctx: - ctx.identifier = "custom:volume" - -# vol = Volume.load('build/volume.json') -# print(vol) diff --git a/tests/write_addon.py b/tests/write_addon.py deleted file mode 100644 index 5c69b28..0000000 --- a/tests/write_addon.py +++ /dev/null @@ -1,99 +0,0 @@ -from mcaddon.ext.assetplus import * -from mcaddon import * - -addon = Addon() -# with Addon.load('build/addon') as addon: - -# BLOCK - -blk = Block("test:block") -blk.add_component(OnFallOnComponent()) -blk.add_component(OnInteractComponent()) -blk.add_component(OnPlacedComponent()) -blk.add_component(OnPlayerDestroyedComponent()) -blk.add_component(OnPlayerPlacingComponent()) -blk.add_component(OnStepOffComponent()) -blk.add_component(OnStepOnComponent()) -bv = BoneVisabilityComponent() -bv.add_bone("bone", Molang("false")) -blk.add_component(bv) -blk.add_component(BreathabilityComponent("air")) -blk.add_component(CollisionBoxComponent.cube()) -blk.add_component(SelectionBoxComponent.cube()) -ct = CraftingTableComponent("container.crafting_table") -ct.add_crafting_tag("crafting_table") -blk.add_component(ct) -blk.add_component(BlockDisplayNameComponent("tile.BLOCK.name")) -blk.add_component(DestructibleByExplosionComponent(0)) -blk.add_component(DestructibleByMiningComponent(0)) -blk.add_component(FlammableComponent()) -blk.add_component(FrictionComponent(0.5)) -blk.add_component(GeometryComponent("geometry.full_cube")) -blk.add_component(LightDampeningComponent(0)) -blk.add_component(LightEmissionComponent(0)) -blk.add_component(LootComponent("")) -blk.add_component(MapColorComponent("#f80")) -mi = MaterialInstancesComponent() -mi.add_material("*", Material("stone")) -blk.add_component(mi) -pf = PlacementFilterComponent() -blk.add_component(pf) -blk.add_component(QueuedTickingComponent([1, 1], Trigger("queued_ticking"))) -blk.add_component(RandomTickingComponent(Trigger("random_ticking"))) -blk.add_component(TransformationComponent.rotate(0, 0, 0)) -blk.add_component(UnitCubeComponent()) -bt = BlockTagsComponent() -bt.add_tag("stone") -blk.add_component(bt) -addon.add(blk) - -# ITEM - -itm = Item("test:item") -itm.add_component(IgnoresPermissionComponent(True)) -itm.add_component(AllowOffHandComponent(True)) -itm.add_component(BlockPlacerComponent("stone")) -itm.add_component(CanDestroyInCreativeComponent(True)) -itm.add_component(CooldownComponent("", 1)) -itm.add_component(DamageComponent(1)) -itm.add_component(ItemDisplayNameComponent("item.ITEM")) -itm.add_component(DurabilityComponent(1, 1)) -itm.add_component(EnchantableComponent("chestplate", 1)) -itm.add_component(EntityPlacerComponent("armor_stand")) -itm.add_component(FoodComponent(1, 1)) -itm.add_component(FuelComponent(1)) -itm.add_component(GlintComponent(True)) -itm.add_component(HandEquippedComponent(True)) -itm.add_component(HoverTextColorComponent("red")) -itm.add_component(IconComponent("apple")) -itm.add_component(InteractButtonComponent("test")) -itm.add_component(ItemStorageComponent(1)) -itm.add_component(LiquidClippedComponent(True)) -itm.add_component(MaxStackSizeComponent(16)) -itm.add_component(ProjectileComponent("arrow", 1)) -itm.add_component(RecordComponent(1, 1, "cat")) -itm.add_component(RepairableComponent()) -sc = ShooterComponent(True, 1, True) -sc.add_ammunition("arrow") -itm.add_component(sc) -itm.add_component(ShouldDespawnComponent(True)) -itm.add_component(StackedByDataComponent(True)) -itm.add_component(TagsComponent()) -itm.add_component(ThrowableComponent(True, 1, 1, 1, 1, True)) -itm.add_component(UseAnimationComponent(UseAnimation.eat)) -itm.add_component(UseModifiersComponent(1, 1)) -itm.add_component(WearableComponent(1, 1)) -itm.add_component(DiggerComponent(True)) -addon.add(itm) - -# VOLUME - -vol = Volume("test:volume") -vol.add_component(FogComponent("fog_savanna", 1)) -vol.add_component(OnActorEnterComponent([Trigger("on_enter")])) -vol.add_component(OnActorLeaveComponent([Trigger("on_leave")])) -vol.add_event("on_enter", RunCommand("say on_enter")) -vol.add_event("on_leave", RunCommand("say on_leave")) -addon.add(vol) - -addon.save("build/addon", zipped=False, overwrite=True) diff --git a/tests/write_camera.py b/tests/write_camera.py deleted file mode 100644 index 5a4617e..0000000 --- a/tests/write_camera.py +++ /dev/null @@ -1,4 +0,0 @@ -from mcaddon import CameraPreset - -blk = CameraPreset("test:camera", rot_y=90) -blk.save("build/")