Use immutabledict instead of frozendict (#15113)

Additionally:

* Consistently use `freeze()` in test

---------

Co-authored-by: Patrick Cloke <clokep@users.noreply.github.com>
Co-authored-by: 6543 <6543@obermui.de>
This commit is contained in:
David Robertson 2023-03-22 17:15:34 +00:00 committed by GitHub
parent cabe4a3005
commit 3b0083c92a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
20 changed files with 123 additions and 243 deletions

1
changelog.d/15113.misc Normal file
View file

@ -0,0 +1 @@
Use `immutabledict` instead of `frozendict`.

125
poetry.lock generated
View file

@ -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-2.0.0-py3-none-any.whl", hash = "sha256:c38a315de3b5a0532f1ec1f9153cd3d716abfc565a558d00a4835428a34fca5b"},
{file = "canonicaljson-1.6.5.tar.gz", hash = "sha256:68dfc157b011e07d94bf74b5d4ccc01958584ed942d9dfd5fdd706609e81cd4b"}, {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"

View file

@ -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 choose 2.0 as a lower bound: the most recent backwards incompatible release.
# We cannot test our wheels against the 2.3.5 release in CI. Putting in an upper bound for this # It seems generally available, judging by https://pkgs.org/search/?q=immutabledict
# because frozendict has been more trouble than it's worth; we would like to move to immutabledict. immutabledict = ">=2.0"
frozendict = ">=1,!=2.1.2,<2.3.5"
# 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 # We require 2.0.0 for immutabledict support.
# frozendict: https://github.com/matrix-org/python-canonicaljson/issues/36 canonicaljson = "^2.0.0"
canonicaljson = "^1.5.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.

View file

@ -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: ...

View file

@ -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 from canonicaljson import register_preserialisation_callback
from immutabledict import immutabledict
set_json_library(json) 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

View file

@ -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

View file

@ -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})

View file

@ -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

View file

@ -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(

View file

@ -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,

View file

@ -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,

View file

@ -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( instance_map: "immutabledict[str, int]" = attr.ib(
factory=frozendict, 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.

View file

@ -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)

View file

@ -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]: def _handle_immutabledict(obj: Any) -> Dict[Any, Any]:
"""Helper for json_encoder. Makes frozendicts serializable by returning """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 return obj._dict
# for discussion on how frozendict's internals have changed over time.
return obj._dict # type: ignore[attr-defined]
except AttributeError: except AttributeError:
# When the C implementation of frozendict is used, # If all else fails, resort to making a copy of the immutabledict
# there isn't a `_dict` attribute with a dict
# so we resort to making a copy of the frozendict
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.

View file

@ -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)):

View file

@ -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))

View file

@ -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

View file

@ -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"}), freeze({"value": "FoobaZ"}),
"patterns should match on frozendicts", "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"}), freeze({"value": "foobaz"}),
"values should match on frozendicts", "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:

View file

@ -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,
), ),
) )

View file

@ -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,
), ),
) )