Additionally: * Consistently use `freeze()` in test --------- Co-authored-by: Patrick Cloke <clokep@users.noreply.github.com> Co-authored-by: 6543 <6543@obermui.de>tags/v1.81.0rc1
@@ -0,0 +1 @@ | |||||
Use `immutabledict` instead of `frozendict`. |
@@ -160,23 +160,16 @@ css = ["tinycss2 (>=1.1.0,<1.2)"] | |||||
[[package]] | [[package]] | ||||
name = "canonicaljson" | name = "canonicaljson" | ||||
version = "1.6.5" | |||||
version = "2.0.0" | |||||
description = "Canonical JSON" | description = "Canonical JSON" | ||||
category = "main" | category = "main" | ||||
optional = false | optional = false | ||||
python-versions = ">=3.7" | python-versions = ">=3.7" | ||||
files = [ | files = [ | ||||
{file = "canonicaljson-1.6.5-py3-none-any.whl", hash = "sha256:806ea6f2cbb7405d20259e1c36dd1214ba5c242fa9165f5bd0bf2081f82c23fb"}, | |||||
{file = "canonicaljson-1.6.5.tar.gz", hash = "sha256:68dfc157b011e07d94bf74b5d4ccc01958584ed942d9dfd5fdd706609e81cd4b"}, | |||||
{file = "canonicaljson-2.0.0-py3-none-any.whl", hash = "sha256:c38a315de3b5a0532f1ec1f9153cd3d716abfc565a558d00a4835428a34fca5b"}, | |||||
{file = "canonicaljson-2.0.0.tar.gz", hash = "sha256:e2fdaef1d7fadc5d9cb59bd3d0d41b064ddda697809ac4325dced721d12f113f"}, | |||||
] | ] | ||||
[package.dependencies] | |||||
simplejson = ">=3.14.0" | |||||
typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.8\""} | |||||
[package.extras] | |||||
frozendict = ["frozendict (>=1.0)"] | |||||
[[package]] | [[package]] | ||||
name = "certifi" | name = "certifi" | ||||
version = "2022.12.7" | version = "2022.12.7" | ||||
@@ -453,33 +446,6 @@ files = [ | |||||
[package.extras] | [package.extras] | ||||
dev = ["Sphinx", "coverage", "flake8", "lxml", "memory-profiler", "mypy (==0.910)", "tox", "xmlschema (>=1.8.0)"] | dev = ["Sphinx", "coverage", "flake8", "lxml", "memory-profiler", "mypy (==0.910)", "tox", "xmlschema (>=1.8.0)"] | ||||
[[package]] | |||||
name = "frozendict" | |||||
version = "2.3.4" | |||||
description = "A simple immutable dictionary" | |||||
category = "main" | |||||
optional = false | |||||
python-versions = ">=3.6" | |||||
files = [ | |||||
{file = "frozendict-2.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4a3b32d47282ae0098b9239a6d53ec539da720258bd762d62191b46f2f87c5fc"}, | |||||
{file = "frozendict-2.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c9887179a245a66a50f52afa08d4d92ae0f269839fab82285c70a0fa0dd782"}, | |||||
{file = "frozendict-2.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:b98a0d65a59af6da03f794f90b0c3085a7ee14e7bf8f0ef36b079ee8aa992439"}, | |||||
{file = "frozendict-2.3.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d8042b7dab5e992e30889c9b71b781d5feef19b372d47d735e4d7d45846fd4a"}, | |||||
{file = "frozendict-2.3.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25a6d2e8b7cf6b6e5677a1a4b53b4073e5d9ec640d1db30dc679627668d25e90"}, | |||||
{file = "frozendict-2.3.4-cp36-cp36m-win_amd64.whl", hash = "sha256:dbbe1339ac2646523e0bb00d1896085d1f70de23780e4927ca82b36ab8a044d3"}, | |||||
{file = "frozendict-2.3.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95bac22f7f09d81f378f2b3f672b7a50a974ca180feae1507f5e21bc147e8bc8"}, | |||||
{file = "frozendict-2.3.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae686722c144b333c4dbdc16323a5de11406d26b76d2be1cc175f90afacb5ba"}, | |||||
{file = "frozendict-2.3.4-cp37-cp37m-win_amd64.whl", hash = "sha256:389f395a74eb16992217ac1521e689c1dea2d70113bcb18714669ace1ed623b9"}, | |||||
{file = "frozendict-2.3.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ccb6450a416c9cc9acef7683e637e28356e3ceeabf83521f74cc2718883076b7"}, | |||||
{file = "frozendict-2.3.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca59108b77cadc13ba7dfea7e8f50811208c7652a13dc6c7f92d7782a24d299"}, | |||||
{file = "frozendict-2.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:3ec86ebf143dd685184215c27ec416c36e0ba1b80d81b1b9482f7d380c049b4e"}, | |||||
{file = "frozendict-2.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5809e6ff6b7257043a486f7a3b73a7da71cf69a38980b4171e4741291d0d9eb3"}, | |||||
{file = "frozendict-2.3.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c550ed7fdf1962984bec21630c584d722b3ee5d5f57a0ae2527a0121dc0414a"}, | |||||
{file = "frozendict-2.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:3e93aebc6e69a8ef329bbe9afb8342bd33c7b5c7a0c480cb9f7e60b0cbe48072"}, | |||||
{file = "frozendict-2.3.4-py3-none-any.whl", hash = "sha256:d722f3d89db6ae35ef35ecc243c40c800eb344848c83dba4798353312cd37b15"}, | |||||
{file = "frozendict-2.3.4.tar.gz", hash = "sha256:15b4b18346259392b0d27598f240e9390fafbff882137a9c48a1e0104fb17f78"}, | |||||
] | |||||
[[package]] | [[package]] | ||||
name = "gitdb" | name = "gitdb" | ||||
version = "4.0.9" | version = "4.0.9" | ||||
@@ -725,6 +691,18 @@ files = [ | |||||
{file = "ijson-3.2.0.post0.tar.gz", hash = "sha256:80a5bd7e9923cab200701f67ad2372104328b99ddf249dbbe8834102c852d316"}, | {file = "ijson-3.2.0.post0.tar.gz", hash = "sha256:80a5bd7e9923cab200701f67ad2372104328b99ddf249dbbe8834102c852d316"}, | ||||
] | ] | ||||
[[package]] | |||||
name = "immutabledict" | |||||
version = "2.2.3" | |||||
description = "Immutable wrapper around dictionaries (a fork of frozendict)" | |||||
category = "main" | |||||
optional = false | |||||
python-versions = ">=3.7,<4.0" | |||||
files = [ | |||||
{file = "immutabledict-2.2.3-py3-none-any.whl", hash = "sha256:a7b078ebcc4a58ddc73b55f808b26e7c8c2d5183fad325615112689e1a63e714"}, | |||||
{file = "immutabledict-2.2.3.tar.gz", hash = "sha256:0e1e8a3f2b3ff062daa19795f947e9ec7a58add269d44e34d3ab4319e1343853"}, | |||||
] | |||||
[[package]] | [[package]] | ||||
name = "importlib-metadata" | name = "importlib-metadata" | ||||
version = "6.0.0" | version = "6.0.0" | ||||
@@ -2174,77 +2152,6 @@ unpaddedbase64 = ">=1.0.1" | |||||
[package.extras] | [package.extras] | ||||
dev = ["typing-extensions (>=3.5)"] | dev = ["typing-extensions (>=3.5)"] | ||||
[[package]] | |||||
name = "simplejson" | |||||
version = "3.17.6" | |||||
description = "Simple, fast, extensible JSON encoder/decoder for Python" | |||||
category = "main" | |||||
optional = false | |||||
python-versions = ">=2.5, !=3.0.*, !=3.1.*, !=3.2.*" | |||||
files = [ | |||||
{file = "simplejson-3.17.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a89acae02b2975b1f8e4974cb8cdf9bf9f6c91162fb8dec50c259ce700f2770a"}, | |||||
{file = "simplejson-3.17.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:82ff356ff91be0ab2293fc6d8d262451eb6ac4fd999244c4b5f863e049ba219c"}, | |||||
{file = "simplejson-3.17.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:0de783e9c2b87bdd75b57efa2b6260c24b94605b5c9843517577d40ee0c3cc8a"}, | |||||
{file = "simplejson-3.17.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:d24a9e61df7a7787b338a58abfba975414937b609eb6b18973e25f573bc0eeeb"}, | |||||
{file = "simplejson-3.17.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:e8603e691580487f11306ecb066c76f1f4a8b54fb3bdb23fa40643a059509366"}, | |||||
{file = "simplejson-3.17.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:9b01e7b00654115965a206e3015f0166674ec1e575198a62a977355597c0bef5"}, | |||||
{file = "simplejson-3.17.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:37bc0cf0e5599f36072077e56e248f3336917ded1d33d2688624d8ed3cefd7d2"}, | |||||
{file = "simplejson-3.17.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:cf6e7d5fe2aeb54898df18db1baf479863eae581cce05410f61f6b4188c8ada1"}, | |||||
{file = "simplejson-3.17.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:bdfc54b4468ed4cd7415928cbe782f4d782722a81aeb0f81e2ddca9932632211"}, | |||||
{file = "simplejson-3.17.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd16302d39c4d6f4afde80edd0c97d4db643327d355a312762ccd9bd2ca515ed"}, | |||||
{file = "simplejson-3.17.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:deac4bdafa19bbb89edfb73b19f7f69a52d0b5bd3bb0c4ad404c1bbfd7b4b7fd"}, | |||||
{file = "simplejson-3.17.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8bbdb166e2fb816e43ab034c865147edafe28e1b19c72433147789ac83e2dda"}, | |||||
{file = "simplejson-3.17.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7854326920d41c3b5d468154318fe6ba4390cb2410480976787c640707e0180"}, | |||||
{file = "simplejson-3.17.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:04e31fa6ac8e326480703fb6ded1488bfa6f1d3f760d32e29dbf66d0838982ce"}, | |||||
{file = "simplejson-3.17.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f63600ec06982cdf480899026f4fda622776f5fabed9a869fdb32d72bc17e99a"}, | |||||
{file = "simplejson-3.17.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e03c3b8cc7883a54c3f34a6a135c4a17bc9088a33f36796acdb47162791b02f6"}, | |||||
{file = "simplejson-3.17.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a2d30d6c1652140181dc6861f564449ad71a45e4f165a6868c27d36745b65d40"}, | |||||
{file = "simplejson-3.17.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a1aa6e4cae8e3b8d5321be4f51c5ce77188faf7baa9fe1e78611f93a8eed2882"}, | |||||
{file = "simplejson-3.17.6-cp310-cp310-win32.whl", hash = "sha256:97202f939c3ff341fc3fa84d15db86156b1edc669424ba20b0a1fcd4a796a045"}, | |||||
{file = "simplejson-3.17.6-cp310-cp310-win_amd64.whl", hash = "sha256:80d3bc9944be1d73e5b1726c3bbfd2628d3d7fe2880711b1eb90b617b9b8ac70"}, | |||||
{file = "simplejson-3.17.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9fa621b3c0c05d965882c920347b6593751b7ab20d8fa81e426f1735ca1a9fc7"}, | |||||
{file = "simplejson-3.17.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd2fb11922f58df8528adfca123f6a84748ad17d066007e7ac977720063556bd"}, | |||||
{file = "simplejson-3.17.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:724c1fe135aa437d5126138d977004d165a3b5e2ee98fc4eb3e7c0ef645e7e27"}, | |||||
{file = "simplejson-3.17.6-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4ff4ac6ff3aa8f814ac0f50bf218a2e1a434a17aafad4f0400a57a8cc62ef17f"}, | |||||
{file = "simplejson-3.17.6-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:67093a526e42981fdd954868062e56c9b67fdd7e712616cc3265ad0c210ecb51"}, | |||||
{file = "simplejson-3.17.6-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5d6b4af7ad7e4ac515bc6e602e7b79e2204e25dbd10ab3aa2beef3c5a9cad2c7"}, | |||||
{file = "simplejson-3.17.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:1c9b1ed7ed282b36571638297525f8ef80f34b3e2d600a56f962c6044f24200d"}, | |||||
{file = "simplejson-3.17.6-cp36-cp36m-win32.whl", hash = "sha256:632ecbbd2228575e6860c9e49ea3cc5423764d5aa70b92acc4e74096fb434044"}, | |||||
{file = "simplejson-3.17.6-cp36-cp36m-win_amd64.whl", hash = "sha256:4c09868ddb86bf79b1feb4e3e7e4a35cd6e61ddb3452b54e20cf296313622566"}, | |||||
{file = "simplejson-3.17.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4b6bd8144f15a491c662f06814bd8eaa54b17f26095bb775411f39bacaf66837"}, | |||||
{file = "simplejson-3.17.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5decdc78849617917c206b01e9fc1d694fd58caa961be816cb37d3150d613d9a"}, | |||||
{file = "simplejson-3.17.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:521877c7bd060470806eb6335926e27453d740ac1958eaf0d8c00911bc5e1802"}, | |||||
{file = "simplejson-3.17.6-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:65b998193bd7b0c7ecdfffbc825d808eac66279313cb67d8892bb259c9d91494"}, | |||||
{file = "simplejson-3.17.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ac786f6cb7aa10d44e9641c7a7d16d7f6e095b138795cd43503769d4154e0dc2"}, | |||||
{file = "simplejson-3.17.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3ff5b3464e1ce86a8de8c88e61d4836927d5595c2162cab22e96ff551b916e81"}, | |||||
{file = "simplejson-3.17.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:69bd56b1d257a91e763256d63606937ae4eb890b18a789b66951c00062afec33"}, | |||||
{file = "simplejson-3.17.6-cp37-cp37m-win32.whl", hash = "sha256:b81076552d34c27e5149a40187a8f7e2abb2d3185576a317aaf14aeeedad862a"}, | |||||
{file = "simplejson-3.17.6-cp37-cp37m-win_amd64.whl", hash = "sha256:07ecaafc1b1501f275bf5acdee34a4ad33c7c24ede287183ea77a02dc071e0c0"}, | |||||
{file = "simplejson-3.17.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:068670af975247acbb9fc3d5393293368cda17026db467bf7a51548ee8f17ee1"}, | |||||
{file = "simplejson-3.17.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4d1c135af0c72cb28dd259cf7ba218338f4dc027061262e46fe058b4e6a4c6a3"}, | |||||
{file = "simplejson-3.17.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23fe704da910ff45e72543cbba152821685a889cf00fc58d5c8ee96a9bad5f94"}, | |||||
{file = "simplejson-3.17.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f444762fed1bc1fd75187ef14a20ed900c1fbb245d45be9e834b822a0223bc81"}, | |||||
{file = "simplejson-3.17.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:681eb4d37c9a9a6eb9b3245a5e89d7f7b2b9895590bb08a20aa598c1eb0a1d9d"}, | |||||
{file = "simplejson-3.17.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8e8607d8f6b4f9d46fee11447e334d6ab50e993dd4dbfb22f674616ce20907ab"}, | |||||
{file = "simplejson-3.17.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b10556817f09d46d420edd982dd0653940b90151d0576f09143a8e773459f6fe"}, | |||||
{file = "simplejson-3.17.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e1ec8a9ee0987d4524ffd6299e778c16cc35fef6d1a2764e609f90962f0b293a"}, | |||||
{file = "simplejson-3.17.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b4126cac7d69ac06ff22efd3e0b3328a4a70624fcd6bca4fc1b4e6d9e2e12bf"}, | |||||
{file = "simplejson-3.17.6-cp38-cp38-win32.whl", hash = "sha256:35a49ebef25f1ebdef54262e54ae80904d8692367a9f208cdfbc38dbf649e00a"}, | |||||
{file = "simplejson-3.17.6-cp38-cp38-win_amd64.whl", hash = "sha256:743cd768affaa508a21499f4858c5b824ffa2e1394ed94eb85caf47ac0732198"}, | |||||
{file = "simplejson-3.17.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb62d517a516128bacf08cb6a86ecd39fb06d08e7c4980251f5d5601d29989ba"}, | |||||
{file = "simplejson-3.17.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:12133863178a8080a3dccbf5cb2edfab0001bc41e5d6d2446af2a1131105adfe"}, | |||||
{file = "simplejson-3.17.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5540fba2d437edaf4aa4fbb80f43f42a8334206ad1ad3b27aef577fd989f20d9"}, | |||||
{file = "simplejson-3.17.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d74ee72b5071818a1a5dab47338e87f08a738cb938a3b0653b9e4d959ddd1fd9"}, | |||||
{file = "simplejson-3.17.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:28221620f4dcabdeac310846629b976e599a13f59abb21616356a85231ebd6ad"}, | |||||
{file = "simplejson-3.17.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b09bc62e5193e31d7f9876220fb429ec13a6a181a24d897b9edfbbdbcd678851"}, | |||||
{file = "simplejson-3.17.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7255a37ff50593c9b2f1afa8fafd6ef5763213c1ed5a9e2c6f5b9cc925ab979f"}, | |||||
{file = "simplejson-3.17.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:401d40969cee3df7bda211e57b903a534561b77a7ade0dd622a8d1a31eaa8ba7"}, | |||||
{file = "simplejson-3.17.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a649d0f66029c7eb67042b15374bd93a26aae202591d9afd71e111dd0006b198"}, | |||||
{file = "simplejson-3.17.6-cp39-cp39-win32.whl", hash = "sha256:522fad7be85de57430d6d287c4b635813932946ebf41b913fe7e880d154ade2e"}, | |||||
{file = "simplejson-3.17.6-cp39-cp39-win_amd64.whl", hash = "sha256:3fe87570168b2ae018391e2b43fbf66e8593a86feccb4b0500d134c998983ccc"}, | |||||
{file = "simplejson-3.17.6.tar.gz", hash = "sha256:cf98038d2abf63a1ada5730e91e84c642ba6c225b0198c3684151b1f80c5f8a6"}, | |||||
] | |||||
[[package]] | [[package]] | ||||
name = "six" | name = "six" | ||||
version = "1.16.0" | version = "1.16.0" | ||||
@@ -3013,4 +2920,4 @@ user-search = ["pyicu"] | |||||
[metadata] | [metadata] | ||||
lock-version = "2.0" | lock-version = "2.0" | ||||
python-versions = "^3.7.1" | python-versions = "^3.7.1" | ||||
content-hash = "de2c4c8de336593478ce02581a5336afe2544db93ea82f3955b34c3653c29a26" | |||||
content-hash = "0ca92e52a1952f9485172efe25a039351280c28f0a158869557dc2f8855786fe" |
@@ -153,15 +153,13 @@ python = "^3.7.1" | |||||
# ---------------------- | # ---------------------- | ||||
# we use the TYPE_CHECKER.redefine method added in jsonschema 3.0.0 | # we use the TYPE_CHECKER.redefine method added in jsonschema 3.0.0 | ||||
jsonschema = ">=3.0.0" | jsonschema = ">=3.0.0" | ||||
# frozendict 2.1.2 is broken on Debian 10: https://github.com/Marco-Sulla/python-frozendict/issues/41 | |||||
# We cannot test our wheels against the 2.3.5 release in CI. Putting in an upper bound for this | |||||
# because frozendict has been more trouble than it's worth; we would like to move to immutabledict. | |||||
frozendict = ">=1,!=2.1.2,<2.3.5" | |||||
# We choose 2.0 as a lower bound: the most recent backwards incompatible release. | |||||
# It seems generally available, judging by https://pkgs.org/search/?q=immutabledict | |||||
immutabledict = ">=2.0" | |||||
# We require 2.1.0 or higher for type hints. Previous guard was >= 1.1.0 | # We require 2.1.0 or higher for type hints. Previous guard was >= 1.1.0 | ||||
unpaddedbase64 = ">=2.1.0" | unpaddedbase64 = ">=2.1.0" | ||||
# We require 1.5.0 to work around an issue when running against the C implementation of | |||||
# frozendict: https://github.com/matrix-org/python-canonicaljson/issues/36 | |||||
canonicaljson = "^1.5.0" | |||||
# We require 2.0.0 for immutabledict support. | |||||
canonicaljson = "^2.0.0" | |||||
# we use the type definitions added in signedjson 1.1. | # we use the type definitions added in signedjson 1.1. | ||||
signedjson = "^1.1.0" | signedjson = "^1.1.0" | ||||
# validating SSL certs for IP addresses requires service_identity 18.1. | # validating SSL certs for IP addresses requires service_identity 18.1. | ||||
@@ -1,39 +0,0 @@ | |||||
# Copyright 2020 The Matrix.org Foundation C.I.C. | |||||
# | |||||
# Licensed under the Apache License, Version 2.0 (the "License"); | |||||
# you may not use this file except in compliance with the License. | |||||
# You may obtain a copy of the License at | |||||
# | |||||
# http://www.apache.org/licenses/LICENSE-2.0 | |||||
# | |||||
# Unless required by applicable law or agreed to in writing, software | |||||
# distributed under the License is distributed on an "AS IS" BASIS, | |||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |||||
# See the License for the specific language governing permissions and | |||||
# limitations under the License. | |||||
# Stub for frozendict. | |||||
from __future__ import annotations | |||||
from typing import Any, Hashable, Iterable, Iterator, Mapping, Tuple, TypeVar, overload | |||||
_KT = TypeVar("_KT", bound=Hashable) # Key type. | |||||
_VT = TypeVar("_VT") # Value type. | |||||
class frozendict(Mapping[_KT, _VT]): | |||||
@overload | |||||
def __init__(self, **kwargs: _VT) -> None: ... | |||||
@overload | |||||
def __init__(self, __map: Mapping[_KT, _VT], **kwargs: _VT) -> None: ... | |||||
@overload | |||||
def __init__( | |||||
self, __iterable: Iterable[Tuple[_KT, _VT]], **kwargs: _VT | |||||
) -> None: ... | |||||
def __getitem__(self, key: _KT) -> _VT: ... | |||||
def __contains__(self, key: Any) -> bool: ... | |||||
def copy(self, **add_or_replace: Any) -> frozendict: ... | |||||
def __iter__(self) -> Iterator[_KT]: ... | |||||
def __len__(self) -> int: ... | |||||
def __repr__(self) -> str: ... | |||||
def __hash__(self) -> int: ... |
@@ -17,9 +17,9 @@ | |||||
""" This is an implementation of a Matrix homeserver. | """ This is an implementation of a Matrix homeserver. | ||||
""" | """ | ||||
import json | |||||
import os | import os | ||||
import sys | import sys | ||||
from typing import Any, Dict | |||||
from synapse.util.rust import check_rust_lib_up_to_date | from synapse.util.rust import check_rust_lib_up_to_date | ||||
from synapse.util.stringutils import strtobool | from synapse.util.stringutils import strtobool | ||||
@@ -61,11 +61,20 @@ try: | |||||
except ImportError: | except ImportError: | ||||
pass | pass | ||||
# Use the standard library json implementation instead of simplejson. | |||||
# Teach canonicaljson how to serialise immutabledicts. | |||||
try: | try: | ||||
from canonicaljson import set_json_library | |||||
set_json_library(json) | |||||
from canonicaljson import register_preserialisation_callback | |||||
from immutabledict import immutabledict | |||||
def _immutabledict_cb(d: immutabledict) -> Dict[str, Any]: | |||||
try: | |||||
return d._dict | |||||
except Exception: | |||||
# Paranoia: fall back to a `dict()` call, in case a future version of | |||||
# immutabledict removes `_dict` from the implementation. | |||||
return dict(d) | |||||
register_preserialisation_callback(immutabledict, _immutabledict_cb) | |||||
except ImportError: | except ImportError: | ||||
pass | pass | ||||
@@ -51,7 +51,7 @@ def check_event_content_hash( | |||||
# some malformed events lack a 'hashes'. Protect against it being missing | # some malformed events lack a 'hashes'. Protect against it being missing | ||||
# or a weird type by basically treating it the same as an unhashed event. | # or a weird type by basically treating it the same as an unhashed event. | ||||
hashes = event.get("hashes") | hashes = event.get("hashes") | ||||
# nb it might be a frozendict or a dict | |||||
# nb it might be a immutabledict or a dict | |||||
if not isinstance(hashes, collections.abc.Mapping): | if not isinstance(hashes, collections.abc.Mapping): | ||||
raise SynapseError( | raise SynapseError( | ||||
400, "Malformed 'hashes': %s" % (type(hashes),), Codes.UNAUTHORIZED | 400, "Malformed 'hashes': %s" % (type(hashes),), Codes.UNAUTHORIZED | ||||
@@ -15,7 +15,7 @@ from abc import ABC, abstractmethod | |||||
from typing import TYPE_CHECKING, List, Optional, Tuple | from typing import TYPE_CHECKING, List, Optional, Tuple | ||||
import attr | import attr | ||||
from frozendict import frozendict | |||||
from immutabledict import immutabledict | |||||
from synapse.appservice import ApplicationService | from synapse.appservice import ApplicationService | ||||
from synapse.events import EventBase | from synapse.events import EventBase | ||||
@@ -489,4 +489,4 @@ def _decode_state_dict( | |||||
if input is None: | if input is None: | ||||
return None | return None | ||||
return frozendict({(etype, state_key): v for etype, state_key, v in input}) | |||||
return immutabledict({(etype, state_key): v for etype, state_key, v in input}) |
@@ -567,7 +567,7 @@ PowerLevelsContent = Mapping[str, Union[_PowerLevel, Mapping[str, _PowerLevel]]] | |||||
def copy_and_fixup_power_levels_contents( | def copy_and_fixup_power_levels_contents( | ||||
old_power_levels: PowerLevelsContent, | old_power_levels: PowerLevelsContent, | ||||
) -> Dict[str, Union[int, Dict[str, int]]]: | ) -> Dict[str, Union[int, Dict[str, int]]]: | ||||
"""Copy the content of a power_levels event, unfreezing frozendicts along the way. | |||||
"""Copy the content of a power_levels event, unfreezing immutabledicts along the way. | |||||
We accept as input power level values which are strings, provided they represent an | We accept as input power level values which are strings, provided they represent an | ||||
integer, e.g. `"`100"` instead of 100. Such strings are converted to integers | integer, e.g. `"`100"` instead of 100. Such strings are converted to integers | ||||
@@ -258,7 +258,7 @@ POWER_LEVELS_SCHEMA = { | |||||
def _create_power_level_validator() -> Type[jsonschema.Draft7Validator]: | def _create_power_level_validator() -> Type[jsonschema.Draft7Validator]: | ||||
validator = jsonschema.validators.validator_for(POWER_LEVELS_SCHEMA) | validator = jsonschema.validators.validator_for(POWER_LEVELS_SCHEMA) | ||||
# by default jsonschema does not consider a frozendict to be an object so | |||||
# by default jsonschema does not consider a immutabledict to be an object so | |||||
# we need to use a custom type checker | # we need to use a custom type checker | ||||
# https://python-jsonschema.readthedocs.io/en/stable/validate/?highlight=object#validating-with-additional-types | # https://python-jsonschema.readthedocs.io/en/stable/validate/?highlight=object#validating-with-additional-types | ||||
type_checker = validator.TYPE_CHECKER.redefine( | type_checker = validator.TYPE_CHECKER.redefine( | ||||
@@ -33,7 +33,7 @@ from typing import ( | |||||
) | ) | ||||
import attr | import attr | ||||
from frozendict import frozendict | |||||
from immutabledict import immutabledict | |||||
from prometheus_client import Counter, Histogram | from prometheus_client import Counter, Histogram | ||||
from synapse.api.constants import EventTypes | from synapse.api.constants import EventTypes | ||||
@@ -105,14 +105,18 @@ class _StateCacheEntry: | |||||
# | # | ||||
# This can be None if we have a `state_group` (as then we can fetch the | # This can be None if we have a `state_group` (as then we can fetch the | ||||
# state from the DB.) | # state from the DB.) | ||||
self._state = frozendict(state) if state is not None else None | |||||
self._state: Optional[StateMap[str]] = ( | |||||
immutabledict(state) if state is not None else None | |||||
) | |||||
# the ID of a state group if one and only one is involved. | # the ID of a state group if one and only one is involved. | ||||
# otherwise, None otherwise? | # otherwise, None otherwise? | ||||
self.state_group = state_group | self.state_group = state_group | ||||
self.prev_group = prev_group | self.prev_group = prev_group | ||||
self.delta_ids = frozendict(delta_ids) if delta_ids is not None else None | |||||
self.delta_ids: Optional[StateMap[str]] = ( | |||||
immutabledict(delta_ids) if delta_ids is not None else None | |||||
) | |||||
async def get_state( | async def get_state( | ||||
self, | self, | ||||
@@ -50,7 +50,7 @@ from typing import ( | |||||
) | ) | ||||
import attr | import attr | ||||
from frozendict import frozendict | |||||
from immutabledict import immutabledict | |||||
from typing_extensions import Literal | from typing_extensions import Literal | ||||
from twisted.internet import defer | from twisted.internet import defer | ||||
@@ -557,7 +557,7 @@ class StreamWorkerStore(EventsWorkerStore, SQLBaseStore): | |||||
if p > min_pos | if p > min_pos | ||||
} | } | ||||
return RoomStreamToken(None, min_pos, frozendict(positions)) | |||||
return RoomStreamToken(None, min_pos, immutabledict(positions)) | |||||
async def get_room_events_stream_for_rooms( | async def get_room_events_stream_for_rooms( | ||||
self, | self, | ||||
@@ -35,7 +35,7 @@ from typing import ( | |||||
) | ) | ||||
import attr | import attr | ||||
from frozendict import frozendict | |||||
from immutabledict import immutabledict | |||||
from signedjson.key import decode_verify_key_bytes | from signedjson.key import decode_verify_key_bytes | ||||
from signedjson.types import VerifyKey | from signedjson.types import VerifyKey | ||||
from typing_extensions import Final, TypedDict | from typing_extensions import Final, TypedDict | ||||
@@ -490,12 +490,12 @@ class RoomStreamToken: | |||||
) | ) | ||||
stream: int = attr.ib(validator=attr.validators.instance_of(int)) | stream: int = attr.ib(validator=attr.validators.instance_of(int)) | ||||
instance_map: "frozendict[str, int]" = attr.ib( | |||||
factory=frozendict, | |||||
instance_map: "immutabledict[str, int]" = attr.ib( | |||||
factory=immutabledict, | |||||
validator=attr.validators.deep_mapping( | validator=attr.validators.deep_mapping( | ||||
key_validator=attr.validators.instance_of(str), | key_validator=attr.validators.instance_of(str), | ||||
value_validator=attr.validators.instance_of(int), | value_validator=attr.validators.instance_of(int), | ||||
mapping_validator=attr.validators.instance_of(frozendict), | |||||
mapping_validator=attr.validators.instance_of(immutabledict), | |||||
), | ), | ||||
) | ) | ||||
@@ -531,7 +531,7 @@ class RoomStreamToken: | |||||
return cls( | return cls( | ||||
topological=None, | topological=None, | ||||
stream=stream, | stream=stream, | ||||
instance_map=frozendict(instance_map), | |||||
instance_map=immutabledict(instance_map), | |||||
) | ) | ||||
except CancelledError: | except CancelledError: | ||||
raise | raise | ||||
@@ -566,7 +566,7 @@ class RoomStreamToken: | |||||
for instance in set(self.instance_map).union(other.instance_map) | for instance in set(self.instance_map).union(other.instance_map) | ||||
} | } | ||||
return RoomStreamToken(None, max_stream, frozendict(instance_map)) | |||||
return RoomStreamToken(None, max_stream, immutabledict(instance_map)) | |||||
def as_historical_tuple(self) -> Tuple[int, int]: | def as_historical_tuple(self) -> Tuple[int, int]: | ||||
"""Returns a tuple of `(topological, stream)` for historical tokens. | """Returns a tuple of `(topological, stream)` for historical tokens. | ||||
@@ -28,7 +28,7 @@ from typing import ( | |||||
) | ) | ||||
import attr | import attr | ||||
from frozendict import frozendict | |||||
from immutabledict import immutabledict | |||||
from synapse.api.constants import EventTypes | from synapse.api.constants import EventTypes | ||||
from synapse.types import MutableStateMap, StateKey, StateMap | from synapse.types import MutableStateMap, StateKey, StateMap | ||||
@@ -56,7 +56,7 @@ class StateFilter: | |||||
appear in `types`. | appear in `types`. | ||||
""" | """ | ||||
types: "frozendict[str, Optional[FrozenSet[str]]]" | |||||
types: "immutabledict[str, Optional[FrozenSet[str]]]" | |||||
include_others: bool = False | include_others: bool = False | ||||
def __attrs_post_init__(self) -> None: | def __attrs_post_init__(self) -> None: | ||||
@@ -67,7 +67,7 @@ class StateFilter: | |||||
object.__setattr__( | object.__setattr__( | ||||
self, | self, | ||||
"types", | "types", | ||||
frozendict({k: v for k, v in self.types.items() if v is not None}), | |||||
immutabledict({k: v for k, v in self.types.items() if v is not None}), | |||||
) | ) | ||||
@staticmethod | @staticmethod | ||||
@@ -112,7 +112,7 @@ class StateFilter: | |||||
type_dict.setdefault(typ, set()).add(s) # type: ignore | type_dict.setdefault(typ, set()).add(s) # type: ignore | ||||
return StateFilter( | return StateFilter( | ||||
types=frozendict( | |||||
types=immutabledict( | |||||
(k, frozenset(v) if v is not None else None) | (k, frozenset(v) if v is not None else None) | ||||
for k, v in type_dict.items() | for k, v in type_dict.items() | ||||
) | ) | ||||
@@ -139,7 +139,7 @@ class StateFilter: | |||||
The new state filter | The new state filter | ||||
""" | """ | ||||
return StateFilter( | return StateFilter( | ||||
types=frozendict({EventTypes.Member: frozenset(members)}), | |||||
types=immutabledict({EventTypes.Member: frozenset(members)}), | |||||
include_others=True, | include_others=True, | ||||
) | ) | ||||
@@ -159,7 +159,7 @@ class StateFilter: | |||||
types_with_frozen_values[state_types] = None | types_with_frozen_values[state_types] = None | ||||
return StateFilter( | return StateFilter( | ||||
frozendict(types_with_frozen_values), include_others=include_others | |||||
immutabledict(types_with_frozen_values), include_others=include_others | |||||
) | ) | ||||
def return_expanded(self) -> "StateFilter": | def return_expanded(self) -> "StateFilter": | ||||
@@ -217,7 +217,7 @@ class StateFilter: | |||||
# We want to return all non-members, but only particular | # We want to return all non-members, but only particular | ||||
# memberships | # memberships | ||||
return StateFilter( | return StateFilter( | ||||
types=frozendict({EventTypes.Member: self.types[EventTypes.Member]}), | |||||
types=immutabledict({EventTypes.Member: self.types[EventTypes.Member]}), | |||||
include_others=True, | include_others=True, | ||||
) | ) | ||||
else: | else: | ||||
@@ -381,14 +381,16 @@ class StateFilter: | |||||
if state_keys is None: | if state_keys is None: | ||||
member_filter = StateFilter.all() | member_filter = StateFilter.all() | ||||
else: | else: | ||||
member_filter = StateFilter(frozendict({EventTypes.Member: state_keys})) | |||||
member_filter = StateFilter( | |||||
immutabledict({EventTypes.Member: state_keys}) | |||||
) | |||||
elif self.include_others: | elif self.include_others: | ||||
member_filter = StateFilter.all() | member_filter = StateFilter.all() | ||||
else: | else: | ||||
member_filter = StateFilter.none() | member_filter = StateFilter.none() | ||||
non_member_filter = StateFilter( | non_member_filter = StateFilter( | ||||
types=frozendict( | |||||
types=immutabledict( | |||||
{k: v for k, v in self.types.items() if k != EventTypes.Member} | {k: v for k, v in self.types.items() if k != EventTypes.Member} | ||||
), | ), | ||||
include_others=self.include_others, | include_others=self.include_others, | ||||
@@ -578,8 +580,8 @@ class StateFilter: | |||||
return False | return False | ||||
_ALL_STATE_FILTER = StateFilter(types=frozendict(), include_others=True) | |||||
_ALL_STATE_FILTER = StateFilter(types=immutabledict(), include_others=True) | |||||
_ALL_NON_MEMBER_STATE_FILTER = StateFilter( | _ALL_NON_MEMBER_STATE_FILTER = StateFilter( | ||||
types=frozendict({EventTypes.Member: frozenset()}), include_others=True | |||||
types=immutabledict({EventTypes.Member: frozenset()}), include_others=True | |||||
) | ) | ||||
_NONE_STATE_FILTER = StateFilter(types=frozendict(), include_others=False) | |||||
_NONE_STATE_FILTER = StateFilter(types=immutabledict(), include_others=False) |
@@ -18,7 +18,7 @@ import typing | |||||
from typing import Any, Callable, Dict, Generator, Optional, Sequence | from typing import Any, Callable, Dict, Generator, Optional, Sequence | ||||
import attr | import attr | ||||
from frozendict import frozendict | |||||
from immutabledict import immutabledict | |||||
from matrix_common.versionstring import get_distribution_version_string | from matrix_common.versionstring import get_distribution_version_string | ||||
from typing_extensions import ParamSpec | from typing_extensions import ParamSpec | ||||
@@ -41,22 +41,18 @@ def _reject_invalid_json(val: Any) -> None: | |||||
raise ValueError("Invalid JSON value: '%s'" % val) | raise ValueError("Invalid JSON value: '%s'" % val) | ||||
def _handle_frozendict(obj: Any) -> Dict[Any, Any]: | |||||
"""Helper for json_encoder. Makes frozendicts serializable by returning | |||||
def _handle_immutabledict(obj: Any) -> Dict[Any, Any]: | |||||
"""Helper for json_encoder. Makes immutabledicts serializable by returning | |||||
the underlying dict | the underlying dict | ||||
""" | """ | ||||
if type(obj) is frozendict: | |||||
if type(obj) is immutabledict: | |||||
# fishing the protected dict out of the object is a bit nasty, | # fishing the protected dict out of the object is a bit nasty, | ||||
# but we don't really want the overhead of copying the dict. | # but we don't really want the overhead of copying the dict. | ||||
try: | try: | ||||
# Safety: we catch the AttributeError immediately below. | # Safety: we catch the AttributeError immediately below. | ||||
# See https://github.com/matrix-org/python-canonicaljson/issues/36#issuecomment-927816293 | |||||
# for discussion on how frozendict's internals have changed over time. | |||||
return obj._dict # type: ignore[attr-defined] | |||||
return obj._dict | |||||
except AttributeError: | except AttributeError: | ||||
# When the C implementation of frozendict is used, | |||||
# there isn't a `_dict` attribute with a dict | |||||
# so we resort to making a copy of the frozendict | |||||
# If all else fails, resort to making a copy of the immutabledict | |||||
return dict(obj) | return dict(obj) | ||||
raise TypeError( | raise TypeError( | ||||
"Object of type %s is not JSON serializable" % obj.__class__.__name__ | "Object of type %s is not JSON serializable" % obj.__class__.__name__ | ||||
@@ -64,11 +60,11 @@ def _handle_frozendict(obj: Any) -> Dict[Any, Any]: | |||||
# A custom JSON encoder which: | # A custom JSON encoder which: | ||||
# * handles frozendicts | |||||
# * handles immutabledicts | |||||
# * produces valid JSON (no NaNs etc) | # * produces valid JSON (no NaNs etc) | ||||
# * reduces redundant whitespace | # * reduces redundant whitespace | ||||
json_encoder = json.JSONEncoder( | json_encoder = json.JSONEncoder( | ||||
allow_nan=False, separators=(",", ":"), default=_handle_frozendict | |||||
allow_nan=False, separators=(",", ":"), default=_handle_immutabledict | |||||
) | ) | ||||
# Create a custom decoder to reject Python extensions to JSON. | # Create a custom decoder to reject Python extensions to JSON. | ||||
@@ -14,14 +14,14 @@ | |||||
import collections.abc | import collections.abc | ||||
from typing import Any | from typing import Any | ||||
from frozendict import frozendict | |||||
from immutabledict import immutabledict | |||||
def freeze(o: Any) -> Any: | def freeze(o: Any) -> Any: | ||||
if isinstance(o, dict): | if isinstance(o, dict): | ||||
return frozendict({k: freeze(v) for k, v in o.items()}) | |||||
return immutabledict({k: freeze(v) for k, v in o.items()}) | |||||
if isinstance(o, frozendict): | |||||
if isinstance(o, immutabledict): | |||||
return o | return o | ||||
if isinstance(o, (bytes, str)): | if isinstance(o, (bytes, str)): | ||||
@@ -18,7 +18,6 @@ from typing import List | |||||
from unittest.mock import patch | from unittest.mock import patch | ||||
import jsonschema | import jsonschema | ||||
from frozendict import frozendict | |||||
from twisted.test.proto_helpers import MemoryReactor | from twisted.test.proto_helpers import MemoryReactor | ||||
@@ -29,6 +28,7 @@ from synapse.api.presence import UserPresenceState | |||||
from synapse.server import HomeServer | from synapse.server import HomeServer | ||||
from synapse.types import JsonDict | from synapse.types import JsonDict | ||||
from synapse.util import Clock | from synapse.util import Clock | ||||
from synapse.util.frozenutils import freeze | |||||
from tests import unittest | from tests import unittest | ||||
from tests.events.test_utils import MockEvent | from tests.events.test_utils import MockEvent | ||||
@@ -343,12 +343,12 @@ class FilteringTestCase(unittest.HomeserverTestCase): | |||||
self.assertFalse(Filter(self.hs, definition)._check(event)) | self.assertFalse(Filter(self.hs, definition)._check(event)) | ||||
# check it works with frozendicts too | |||||
# check it works with frozen dictionaries too | |||||
event = MockEvent( | event = MockEvent( | ||||
sender="@foo:bar", | sender="@foo:bar", | ||||
type="m.room.message", | type="m.room.message", | ||||
room_id="!secretbase:unknown", | room_id="!secretbase:unknown", | ||||
content=frozendict({EventContentFields.LABELS: ["#fun"]}), | |||||
content=freeze({EventContentFields.LABELS: ["#fun"]}), | |||||
) | ) | ||||
self.assertTrue(Filter(self.hs, definition)._check(event)) | self.assertTrue(Filter(self.hs, definition)._check(event)) | ||||
@@ -14,14 +14,14 @@ | |||||
from typing import Any, Mapping, Optional | from typing import Any, Mapping, Optional | ||||
from unittest.mock import Mock | from unittest.mock import Mock | ||||
from frozendict import frozendict | |||||
from immutabledict import immutabledict | |||||
from synapse.config import ConfigError | from synapse.config import ConfigError | ||||
from synapse.config.workers import WorkerConfig | from synapse.config.workers import WorkerConfig | ||||
from tests.unittest import TestCase | from tests.unittest import TestCase | ||||
_EMPTY_FROZENDICT: Mapping[str, Any] = frozendict() | |||||
_EMPTY_IMMUTABLEDICT: Mapping[str, Any] = immutabledict() | |||||
class WorkerDutyConfigTestCase(TestCase): | class WorkerDutyConfigTestCase(TestCase): | ||||
@@ -29,7 +29,7 @@ class WorkerDutyConfigTestCase(TestCase): | |||||
self, | self, | ||||
worker_app: str, | worker_app: str, | ||||
worker_name: Optional[str], | worker_name: Optional[str], | ||||
extras: Mapping[str, Any] = _EMPTY_FROZENDICT, | |||||
extras: Mapping[str, Any] = _EMPTY_IMMUTABLEDICT, | |||||
) -> WorkerConfig: | ) -> WorkerConfig: | ||||
root_config = Mock() | root_config = Mock() | ||||
root_config.worker_app = worker_app | root_config.worker_app = worker_app | ||||
@@ -14,8 +14,6 @@ | |||||
from typing import Any, Dict, List, Optional, Union, cast | from typing import Any, Dict, List, Optional, Union, cast | ||||
import frozendict | |||||
from twisted.test.proto_helpers import MemoryReactor | from twisted.test.proto_helpers import MemoryReactor | ||||
import synapse.rest.admin | import synapse.rest.admin | ||||
@@ -318,11 +316,11 @@ class PushRuleEvaluatorTestCase(unittest.TestCase): | |||||
"pattern should only match at the start/end of the value", | "pattern should only match at the start/end of the value", | ||||
) | ) | ||||
# it should work on frozendicts too | |||||
# it should work on frozen dictionaries too | |||||
self._assert_matches( | self._assert_matches( | ||||
condition, | condition, | ||||
frozendict.frozendict({"value": "FoobaZ"}), | |||||
"patterns should match on frozendicts", | |||||
freeze({"value": "FoobaZ"}), | |||||
"patterns should match on frozen dictionaries", | |||||
) | ) | ||||
# wildcards should match | # wildcards should match | ||||
@@ -425,11 +423,11 @@ class PushRuleEvaluatorTestCase(unittest.TestCase): | |||||
"incorrect types should not match", | "incorrect types should not match", | ||||
) | ) | ||||
# it should work on frozendicts too | |||||
# it should work on frozen dictionaries too | |||||
self._assert_matches( | self._assert_matches( | ||||
condition, | condition, | ||||
frozendict.frozendict({"value": "foobaz"}), | |||||
"values should match on frozendicts", | |||||
freeze({"value": "foobaz"}), | |||||
"values should match on frozen dictionaries", | |||||
) | ) | ||||
def test_exact_event_match_boolean(self) -> None: | def test_exact_event_match_boolean(self) -> None: | ||||
@@ -546,11 +544,11 @@ class PushRuleEvaluatorTestCase(unittest.TestCase): | |||||
"does not search in a string", | "does not search in a string", | ||||
) | ) | ||||
# it should work on frozendicts too | |||||
# it should work on frozen dictionaries too | |||||
self._assert_matches( | self._assert_matches( | ||||
condition, | condition, | ||||
freeze({"value": ["foobaz"]}), | freeze({"value": ["foobaz"]}), | ||||
"values should match on frozendicts", | |||||
"values should match on frozen dictionaries", | |||||
) | ) | ||||
def test_no_body(self) -> None: | def test_no_body(self) -> None: | ||||
@@ -14,7 +14,7 @@ | |||||
import logging | import logging | ||||
from frozendict import frozendict | |||||
from immutabledict import immutabledict | |||||
from twisted.test.proto_helpers import MemoryReactor | from twisted.test.proto_helpers import MemoryReactor | ||||
@@ -198,7 +198,7 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.storage.state.get_state_for_event( | self.storage.state.get_state_for_event( | ||||
e5.event_id, | e5.event_id, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict( | |||||
types=immutabledict( | |||||
{EventTypes.Member: frozenset({self.u_alice.to_string()})} | {EventTypes.Member: frozenset({self.u_alice.to_string()})} | ||||
), | ), | ||||
include_others=True, | include_others=True, | ||||
@@ -220,7 +220,7 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.storage.state.get_state_for_event( | self.storage.state.get_state_for_event( | ||||
e5.event_id, | e5.event_id, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: frozenset()}), | |||||
types=immutabledict({EventTypes.Member: frozenset()}), | |||||
include_others=True, | include_others=True, | ||||
), | ), | ||||
) | ) | ||||
@@ -246,7 +246,8 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_cache, | self.state_datastore._state_group_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: frozenset()}), include_others=True | |||||
types=immutabledict({EventTypes.Member: frozenset()}), | |||||
include_others=True, | |||||
), | ), | ||||
) | ) | ||||
@@ -263,7 +264,8 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_members_cache, | self.state_datastore._state_group_members_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: frozenset()}), include_others=True | |||||
types=immutabledict({EventTypes.Member: frozenset()}), | |||||
include_others=True, | |||||
), | ), | ||||
) | ) | ||||
@@ -276,7 +278,7 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_cache, | self.state_datastore._state_group_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: None}), include_others=True | |||||
types=immutabledict({EventTypes.Member: None}), include_others=True | |||||
), | ), | ||||
) | ) | ||||
@@ -293,7 +295,7 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_members_cache, | self.state_datastore._state_group_members_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: None}), include_others=True | |||||
types=immutabledict({EventTypes.Member: None}), include_others=True | |||||
), | ), | ||||
) | ) | ||||
@@ -313,7 +315,7 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_cache, | self.state_datastore._state_group_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: frozenset({e5.state_key})}), | |||||
types=immutabledict({EventTypes.Member: frozenset({e5.state_key})}), | |||||
include_others=True, | include_others=True, | ||||
), | ), | ||||
) | ) | ||||
@@ -331,7 +333,7 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_members_cache, | self.state_datastore._state_group_members_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: frozenset({e5.state_key})}), | |||||
types=immutabledict({EventTypes.Member: frozenset({e5.state_key})}), | |||||
include_others=True, | include_others=True, | ||||
), | ), | ||||
) | ) | ||||
@@ -345,7 +347,7 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_members_cache, | self.state_datastore._state_group_members_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: frozenset({e5.state_key})}), | |||||
types=immutabledict({EventTypes.Member: frozenset({e5.state_key})}), | |||||
include_others=False, | include_others=False, | ||||
), | ), | ||||
) | ) | ||||
@@ -396,7 +398,8 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_cache, | self.state_datastore._state_group_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: frozenset()}), include_others=True | |||||
types=immutabledict({EventTypes.Member: frozenset()}), | |||||
include_others=True, | |||||
), | ), | ||||
) | ) | ||||
@@ -408,7 +411,8 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_members_cache, | self.state_datastore._state_group_members_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: frozenset()}), include_others=True | |||||
types=immutabledict({EventTypes.Member: frozenset()}), | |||||
include_others=True, | |||||
), | ), | ||||
) | ) | ||||
@@ -421,7 +425,7 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_cache, | self.state_datastore._state_group_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: None}), include_others=True | |||||
types=immutabledict({EventTypes.Member: None}), include_others=True | |||||
), | ), | ||||
) | ) | ||||
@@ -432,7 +436,7 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_members_cache, | self.state_datastore._state_group_members_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: None}), include_others=True | |||||
types=immutabledict({EventTypes.Member: None}), include_others=True | |||||
), | ), | ||||
) | ) | ||||
@@ -451,7 +455,7 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_cache, | self.state_datastore._state_group_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: frozenset({e5.state_key})}), | |||||
types=immutabledict({EventTypes.Member: frozenset({e5.state_key})}), | |||||
include_others=True, | include_others=True, | ||||
), | ), | ||||
) | ) | ||||
@@ -463,7 +467,7 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_members_cache, | self.state_datastore._state_group_members_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: frozenset({e5.state_key})}), | |||||
types=immutabledict({EventTypes.Member: frozenset({e5.state_key})}), | |||||
include_others=True, | include_others=True, | ||||
), | ), | ||||
) | ) | ||||
@@ -477,7 +481,7 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_cache, | self.state_datastore._state_group_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: frozenset({e5.state_key})}), | |||||
types=immutabledict({EventTypes.Member: frozenset({e5.state_key})}), | |||||
include_others=False, | include_others=False, | ||||
), | ), | ||||
) | ) | ||||
@@ -489,7 +493,7 @@ class StateStoreTestCase(HomeserverTestCase): | |||||
self.state_datastore._state_group_members_cache, | self.state_datastore._state_group_members_cache, | ||||
group, | group, | ||||
state_filter=StateFilter( | state_filter=StateFilter( | ||||
types=frozendict({EventTypes.Member: frozenset({e5.state_key})}), | |||||
types=immutabledict({EventTypes.Member: frozenset({e5.state_key})}), | |||||
include_others=False, | include_others=False, | ||||
), | ), | ||||
) | ) | ||||
@@ -1,4 +1,4 @@ | |||||
from frozendict import frozendict | |||||
from immutabledict import immutabledict | |||||
from synapse.api.constants import EventTypes | from synapse.api.constants import EventTypes | ||||
from synapse.types.state import StateFilter | from synapse.types.state import StateFilter | ||||
@@ -172,7 +172,7 @@ class StateFilterDifferenceTestCase(TestCase): | |||||
}, | }, | ||||
include_others=False, | include_others=False, | ||||
), | ), | ||||
StateFilter(types=frozendict(), include_others=True), | |||||
StateFilter(types=immutabledict(), include_others=True), | |||||
) | ) | ||||
# (wildcard on state keys) - (no state keys) | # (wildcard on state keys) - (no state keys) | ||||
@@ -188,7 +188,7 @@ class StateFilterDifferenceTestCase(TestCase): | |||||
include_others=False, | include_others=False, | ||||
), | ), | ||||
StateFilter( | StateFilter( | ||||
types=frozendict(), | |||||
types=immutabledict(), | |||||
include_others=True, | include_others=True, | ||||
), | ), | ||||
) | ) | ||||
@@ -279,7 +279,7 @@ class StateFilterDifferenceTestCase(TestCase): | |||||
{EventTypes.Member: None, EventTypes.CanonicalAlias: None}, | {EventTypes.Member: None, EventTypes.CanonicalAlias: None}, | ||||
include_others=True, | include_others=True, | ||||
), | ), | ||||
StateFilter(types=frozendict(), include_others=False), | |||||
StateFilter(types=immutabledict(), include_others=False), | |||||
) | ) | ||||
# (wildcard on state keys) - (specific state keys) | # (wildcard on state keys) - (specific state keys) | ||||
@@ -332,7 +332,7 @@ class StateFilterDifferenceTestCase(TestCase): | |||||
include_others=True, | include_others=True, | ||||
), | ), | ||||
StateFilter( | StateFilter( | ||||
types=frozendict(), | |||||
types=immutabledict(), | |||||
include_others=False, | include_others=False, | ||||
), | ), | ||||
) | ) | ||||
@@ -403,7 +403,7 @@ class StateFilterDifferenceTestCase(TestCase): | |||||
{EventTypes.Member: None, EventTypes.CanonicalAlias: None}, | {EventTypes.Member: None, EventTypes.CanonicalAlias: None}, | ||||
include_others=True, | include_others=True, | ||||
), | ), | ||||
StateFilter(types=frozendict(), include_others=False), | |||||
StateFilter(types=immutabledict(), include_others=False), | |||||
) | ) | ||||
# (wildcard on state keys) - (specific state keys) | # (wildcard on state keys) - (specific state keys) | ||||
@@ -450,7 +450,7 @@ class StateFilterDifferenceTestCase(TestCase): | |||||
include_others=True, | include_others=True, | ||||
), | ), | ||||
StateFilter( | StateFilter( | ||||
types=frozendict(), | |||||
types=immutabledict(), | |||||
include_others=False, | include_others=False, | ||||
), | ), | ||||
) | ) | ||||