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:
parent
cabe4a3005
commit
3b0083c92a
|
@ -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-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"
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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
|
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
|
||||||
|
|
||||||
|
|
|
@ -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(
|
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.
|
||||||
|
|
|
@ -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]:
|
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.
|
||||||
|
|
|
@ -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"}),
|
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:
|
||||||
|
|
|
@ -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,
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue