Browse Source

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>
tags/v1.81.0rc1
David Robertson 1 year ago
committed by GitHub
parent
commit
3b0083c92a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
20 changed files with 124 additions and 244 deletions
  1. +1
    -0
      changelog.d/15113.misc
  2. +16
    -109
      poetry.lock
  3. +5
    -7
      pyproject.toml
  4. +0
    -39
      stubs/frozendict.pyi
  5. +14
    -5
      synapse/__init__.py
  6. +1
    -1
      synapse/crypto/event_signing.py
  7. +2
    -2
      synapse/events/snapshot.py
  8. +1
    -1
      synapse/events/utils.py
  9. +1
    -1
      synapse/events/validator.py
  10. +7
    -3
      synapse/state/__init__.py
  11. +2
    -2
      synapse/storage/databases/main/stream.py
  12. +6
    -6
      synapse/types/__init__.py
  13. +14
    -12
      synapse/types/state.py
  14. +8
    -12
      synapse/util/__init__.py
  15. +3
    -3
      synapse/util/frozenutils.py
  16. +3
    -3
      tests/api/test_filtering.py
  17. +3
    -3
      tests/config/test_workers.py
  18. +8
    -10
      tests/push/test_push_rule_evaluator.py
  19. +22
    -18
      tests/storage/test_state.py
  20. +7
    -7
      tests/types/test_state.py

+ 1
- 0
changelog.d/15113.misc View File

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

+ 16
- 109
poetry.lock 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-1.6.5.tar.gz", hash = "sha256:68dfc157b011e07d94bf74b5d4ccc01958584ed942d9dfd5fdd706609e81cd4b"},
{file = "canonicaljson-2.0.0-py3-none-any.whl", hash = "sha256:c38a315de3b5a0532f1ec1f9153cd3d716abfc565a558d00a4835428a34fca5b"},
{file = "canonicaljson-2.0.0.tar.gz", hash = "sha256:e2fdaef1d7fadc5d9cb59bd3d0d41b064ddda697809ac4325dced721d12f113f"},
] ]


[package.dependencies]
simplejson = ">=3.14.0"
typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.8\""}

[package.extras]
frozendict = ["frozendict (>=1.0)"]

[[package]] [[package]]
name = "certifi" name = "certifi"
version = "2022.12.7" version = "2022.12.7"
@@ -453,33 +446,6 @@ files = [
[package.extras] [package.extras]
dev = ["Sphinx", "coverage", "flake8", "lxml", "memory-profiler", "mypy (==0.910)", "tox", "xmlschema (>=1.8.0)"] dev = ["Sphinx", "coverage", "flake8", "lxml", "memory-profiler", "mypy (==0.910)", "tox", "xmlschema (>=1.8.0)"]


[[package]]
name = "frozendict"
version = "2.3.4"
description = "A simple immutable dictionary"
category = "main"
optional = false
python-versions = ">=3.6"
files = [
{file = "frozendict-2.3.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4a3b32d47282ae0098b9239a6d53ec539da720258bd762d62191b46f2f87c5fc"},
{file = "frozendict-2.3.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:84c9887179a245a66a50f52afa08d4d92ae0f269839fab82285c70a0fa0dd782"},
{file = "frozendict-2.3.4-cp310-cp310-win_amd64.whl", hash = "sha256:b98a0d65a59af6da03f794f90b0c3085a7ee14e7bf8f0ef36b079ee8aa992439"},
{file = "frozendict-2.3.4-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:3d8042b7dab5e992e30889c9b71b781d5feef19b372d47d735e4d7d45846fd4a"},
{file = "frozendict-2.3.4-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25a6d2e8b7cf6b6e5677a1a4b53b4073e5d9ec640d1db30dc679627668d25e90"},
{file = "frozendict-2.3.4-cp36-cp36m-win_amd64.whl", hash = "sha256:dbbe1339ac2646523e0bb00d1896085d1f70de23780e4927ca82b36ab8a044d3"},
{file = "frozendict-2.3.4-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95bac22f7f09d81f378f2b3f672b7a50a974ca180feae1507f5e21bc147e8bc8"},
{file = "frozendict-2.3.4-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dae686722c144b333c4dbdc16323a5de11406d26b76d2be1cc175f90afacb5ba"},
{file = "frozendict-2.3.4-cp37-cp37m-win_amd64.whl", hash = "sha256:389f395a74eb16992217ac1521e689c1dea2d70113bcb18714669ace1ed623b9"},
{file = "frozendict-2.3.4-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ccb6450a416c9cc9acef7683e637e28356e3ceeabf83521f74cc2718883076b7"},
{file = "frozendict-2.3.4-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aca59108b77cadc13ba7dfea7e8f50811208c7652a13dc6c7f92d7782a24d299"},
{file = "frozendict-2.3.4-cp38-cp38-win_amd64.whl", hash = "sha256:3ec86ebf143dd685184215c27ec416c36e0ba1b80d81b1b9482f7d380c049b4e"},
{file = "frozendict-2.3.4-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5809e6ff6b7257043a486f7a3b73a7da71cf69a38980b4171e4741291d0d9eb3"},
{file = "frozendict-2.3.4-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c550ed7fdf1962984bec21630c584d722b3ee5d5f57a0ae2527a0121dc0414a"},
{file = "frozendict-2.3.4-cp39-cp39-win_amd64.whl", hash = "sha256:3e93aebc6e69a8ef329bbe9afb8342bd33c7b5c7a0c480cb9f7e60b0cbe48072"},
{file = "frozendict-2.3.4-py3-none-any.whl", hash = "sha256:d722f3d89db6ae35ef35ecc243c40c800eb344848c83dba4798353312cd37b15"},
{file = "frozendict-2.3.4.tar.gz", hash = "sha256:15b4b18346259392b0d27598f240e9390fafbff882137a9c48a1e0104fb17f78"},
]

[[package]] [[package]]
name = "gitdb" name = "gitdb"
version = "4.0.9" version = "4.0.9"
@@ -725,6 +691,18 @@ files = [
{file = "ijson-3.2.0.post0.tar.gz", hash = "sha256:80a5bd7e9923cab200701f67ad2372104328b99ddf249dbbe8834102c852d316"}, {file = "ijson-3.2.0.post0.tar.gz", hash = "sha256:80a5bd7e9923cab200701f67ad2372104328b99ddf249dbbe8834102c852d316"},
] ]


[[package]]
name = "immutabledict"
version = "2.2.3"
description = "Immutable wrapper around dictionaries (a fork of frozendict)"
category = "main"
optional = false
python-versions = ">=3.7,<4.0"
files = [
{file = "immutabledict-2.2.3-py3-none-any.whl", hash = "sha256:a7b078ebcc4a58ddc73b55f808b26e7c8c2d5183fad325615112689e1a63e714"},
{file = "immutabledict-2.2.3.tar.gz", hash = "sha256:0e1e8a3f2b3ff062daa19795f947e9ec7a58add269d44e34d3ab4319e1343853"},
]

[[package]] [[package]]
name = "importlib-metadata" name = "importlib-metadata"
version = "6.0.0" version = "6.0.0"
@@ -2174,77 +2152,6 @@ unpaddedbase64 = ">=1.0.1"
[package.extras] [package.extras]
dev = ["typing-extensions (>=3.5)"] dev = ["typing-extensions (>=3.5)"]


[[package]]
name = "simplejson"
version = "3.17.6"
description = "Simple, fast, extensible JSON encoder/decoder for Python"
category = "main"
optional = false
python-versions = ">=2.5, !=3.0.*, !=3.1.*, !=3.2.*"
files = [
{file = "simplejson-3.17.6-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:a89acae02b2975b1f8e4974cb8cdf9bf9f6c91162fb8dec50c259ce700f2770a"},
{file = "simplejson-3.17.6-cp27-cp27m-manylinux1_i686.whl", hash = "sha256:82ff356ff91be0ab2293fc6d8d262451eb6ac4fd999244c4b5f863e049ba219c"},
{file = "simplejson-3.17.6-cp27-cp27m-manylinux1_x86_64.whl", hash = "sha256:0de783e9c2b87bdd75b57efa2b6260c24b94605b5c9843517577d40ee0c3cc8a"},
{file = "simplejson-3.17.6-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:d24a9e61df7a7787b338a58abfba975414937b609eb6b18973e25f573bc0eeeb"},
{file = "simplejson-3.17.6-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:e8603e691580487f11306ecb066c76f1f4a8b54fb3bdb23fa40643a059509366"},
{file = "simplejson-3.17.6-cp27-cp27mu-manylinux1_i686.whl", hash = "sha256:9b01e7b00654115965a206e3015f0166674ec1e575198a62a977355597c0bef5"},
{file = "simplejson-3.17.6-cp27-cp27mu-manylinux1_x86_64.whl", hash = "sha256:37bc0cf0e5599f36072077e56e248f3336917ded1d33d2688624d8ed3cefd7d2"},
{file = "simplejson-3.17.6-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:cf6e7d5fe2aeb54898df18db1baf479863eae581cce05410f61f6b4188c8ada1"},
{file = "simplejson-3.17.6-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:bdfc54b4468ed4cd7415928cbe782f4d782722a81aeb0f81e2ddca9932632211"},
{file = "simplejson-3.17.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:dd16302d39c4d6f4afde80edd0c97d4db643327d355a312762ccd9bd2ca515ed"},
{file = "simplejson-3.17.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:deac4bdafa19bbb89edfb73b19f7f69a52d0b5bd3bb0c4ad404c1bbfd7b4b7fd"},
{file = "simplejson-3.17.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a8bbdb166e2fb816e43ab034c865147edafe28e1b19c72433147789ac83e2dda"},
{file = "simplejson-3.17.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a7854326920d41c3b5d468154318fe6ba4390cb2410480976787c640707e0180"},
{file = "simplejson-3.17.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:04e31fa6ac8e326480703fb6ded1488bfa6f1d3f760d32e29dbf66d0838982ce"},
{file = "simplejson-3.17.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f63600ec06982cdf480899026f4fda622776f5fabed9a869fdb32d72bc17e99a"},
{file = "simplejson-3.17.6-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e03c3b8cc7883a54c3f34a6a135c4a17bc9088a33f36796acdb47162791b02f6"},
{file = "simplejson-3.17.6-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a2d30d6c1652140181dc6861f564449ad71a45e4f165a6868c27d36745b65d40"},
{file = "simplejson-3.17.6-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a1aa6e4cae8e3b8d5321be4f51c5ce77188faf7baa9fe1e78611f93a8eed2882"},
{file = "simplejson-3.17.6-cp310-cp310-win32.whl", hash = "sha256:97202f939c3ff341fc3fa84d15db86156b1edc669424ba20b0a1fcd4a796a045"},
{file = "simplejson-3.17.6-cp310-cp310-win_amd64.whl", hash = "sha256:80d3bc9944be1d73e5b1726c3bbfd2628d3d7fe2880711b1eb90b617b9b8ac70"},
{file = "simplejson-3.17.6-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:9fa621b3c0c05d965882c920347b6593751b7ab20d8fa81e426f1735ca1a9fc7"},
{file = "simplejson-3.17.6-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dd2fb11922f58df8528adfca123f6a84748ad17d066007e7ac977720063556bd"},
{file = "simplejson-3.17.6-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:724c1fe135aa437d5126138d977004d165a3b5e2ee98fc4eb3e7c0ef645e7e27"},
{file = "simplejson-3.17.6-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4ff4ac6ff3aa8f814ac0f50bf218a2e1a434a17aafad4f0400a57a8cc62ef17f"},
{file = "simplejson-3.17.6-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:67093a526e42981fdd954868062e56c9b67fdd7e712616cc3265ad0c210ecb51"},
{file = "simplejson-3.17.6-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:5d6b4af7ad7e4ac515bc6e602e7b79e2204e25dbd10ab3aa2beef3c5a9cad2c7"},
{file = "simplejson-3.17.6-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:1c9b1ed7ed282b36571638297525f8ef80f34b3e2d600a56f962c6044f24200d"},
{file = "simplejson-3.17.6-cp36-cp36m-win32.whl", hash = "sha256:632ecbbd2228575e6860c9e49ea3cc5423764d5aa70b92acc4e74096fb434044"},
{file = "simplejson-3.17.6-cp36-cp36m-win_amd64.whl", hash = "sha256:4c09868ddb86bf79b1feb4e3e7e4a35cd6e61ddb3452b54e20cf296313622566"},
{file = "simplejson-3.17.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:4b6bd8144f15a491c662f06814bd8eaa54b17f26095bb775411f39bacaf66837"},
{file = "simplejson-3.17.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5decdc78849617917c206b01e9fc1d694fd58caa961be816cb37d3150d613d9a"},
{file = "simplejson-3.17.6-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:521877c7bd060470806eb6335926e27453d740ac1958eaf0d8c00911bc5e1802"},
{file = "simplejson-3.17.6-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:65b998193bd7b0c7ecdfffbc825d808eac66279313cb67d8892bb259c9d91494"},
{file = "simplejson-3.17.6-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:ac786f6cb7aa10d44e9641c7a7d16d7f6e095b138795cd43503769d4154e0dc2"},
{file = "simplejson-3.17.6-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:3ff5b3464e1ce86a8de8c88e61d4836927d5595c2162cab22e96ff551b916e81"},
{file = "simplejson-3.17.6-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:69bd56b1d257a91e763256d63606937ae4eb890b18a789b66951c00062afec33"},
{file = "simplejson-3.17.6-cp37-cp37m-win32.whl", hash = "sha256:b81076552d34c27e5149a40187a8f7e2abb2d3185576a317aaf14aeeedad862a"},
{file = "simplejson-3.17.6-cp37-cp37m-win_amd64.whl", hash = "sha256:07ecaafc1b1501f275bf5acdee34a4ad33c7c24ede287183ea77a02dc071e0c0"},
{file = "simplejson-3.17.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:068670af975247acbb9fc3d5393293368cda17026db467bf7a51548ee8f17ee1"},
{file = "simplejson-3.17.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4d1c135af0c72cb28dd259cf7ba218338f4dc027061262e46fe058b4e6a4c6a3"},
{file = "simplejson-3.17.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:23fe704da910ff45e72543cbba152821685a889cf00fc58d5c8ee96a9bad5f94"},
{file = "simplejson-3.17.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f444762fed1bc1fd75187ef14a20ed900c1fbb245d45be9e834b822a0223bc81"},
{file = "simplejson-3.17.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:681eb4d37c9a9a6eb9b3245a5e89d7f7b2b9895590bb08a20aa598c1eb0a1d9d"},
{file = "simplejson-3.17.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:8e8607d8f6b4f9d46fee11447e334d6ab50e993dd4dbfb22f674616ce20907ab"},
{file = "simplejson-3.17.6-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b10556817f09d46d420edd982dd0653940b90151d0576f09143a8e773459f6fe"},
{file = "simplejson-3.17.6-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e1ec8a9ee0987d4524ffd6299e778c16cc35fef6d1a2764e609f90962f0b293a"},
{file = "simplejson-3.17.6-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0b4126cac7d69ac06ff22efd3e0b3328a4a70624fcd6bca4fc1b4e6d9e2e12bf"},
{file = "simplejson-3.17.6-cp38-cp38-win32.whl", hash = "sha256:35a49ebef25f1ebdef54262e54ae80904d8692367a9f208cdfbc38dbf649e00a"},
{file = "simplejson-3.17.6-cp38-cp38-win_amd64.whl", hash = "sha256:743cd768affaa508a21499f4858c5b824ffa2e1394ed94eb85caf47ac0732198"},
{file = "simplejson-3.17.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb62d517a516128bacf08cb6a86ecd39fb06d08e7c4980251f5d5601d29989ba"},
{file = "simplejson-3.17.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:12133863178a8080a3dccbf5cb2edfab0001bc41e5d6d2446af2a1131105adfe"},
{file = "simplejson-3.17.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5540fba2d437edaf4aa4fbb80f43f42a8334206ad1ad3b27aef577fd989f20d9"},
{file = "simplejson-3.17.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d74ee72b5071818a1a5dab47338e87f08a738cb938a3b0653b9e4d959ddd1fd9"},
{file = "simplejson-3.17.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:28221620f4dcabdeac310846629b976e599a13f59abb21616356a85231ebd6ad"},
{file = "simplejson-3.17.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b09bc62e5193e31d7f9876220fb429ec13a6a181a24d897b9edfbbdbcd678851"},
{file = "simplejson-3.17.6-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7255a37ff50593c9b2f1afa8fafd6ef5763213c1ed5a9e2c6f5b9cc925ab979f"},
{file = "simplejson-3.17.6-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:401d40969cee3df7bda211e57b903a534561b77a7ade0dd622a8d1a31eaa8ba7"},
{file = "simplejson-3.17.6-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a649d0f66029c7eb67042b15374bd93a26aae202591d9afd71e111dd0006b198"},
{file = "simplejson-3.17.6-cp39-cp39-win32.whl", hash = "sha256:522fad7be85de57430d6d287c4b635813932946ebf41b913fe7e880d154ade2e"},
{file = "simplejson-3.17.6-cp39-cp39-win_amd64.whl", hash = "sha256:3fe87570168b2ae018391e2b43fbf66e8593a86feccb4b0500d134c998983ccc"},
{file = "simplejson-3.17.6.tar.gz", hash = "sha256:cf98038d2abf63a1ada5730e91e84c642ba6c225b0198c3684151b1f80c5f8a6"},
]

[[package]] [[package]]
name = "six" name = "six"
version = "1.16.0" version = "1.16.0"
@@ -3013,4 +2920,4 @@ user-search = ["pyicu"]
[metadata] [metadata]
lock-version = "2.0" lock-version = "2.0"
python-versions = "^3.7.1" python-versions = "^3.7.1"
content-hash = "de2c4c8de336593478ce02581a5336afe2544db93ea82f3955b34c3653c29a26"
content-hash = "0ca92e52a1952f9485172efe25a039351280c28f0a158869557dc2f8855786fe"

+ 5
- 7
pyproject.toml 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 cannot test our wheels against the 2.3.5 release in CI. Putting in an upper bound for this
# because frozendict has been more trouble than it's worth; we would like to move to immutabledict.
frozendict = ">=1,!=2.1.2,<2.3.5"
# We choose 2.0 as a lower bound: the most recent backwards incompatible release.
# It seems generally available, judging by https://pkgs.org/search/?q=immutabledict
immutabledict = ">=2.0"
# We require 2.1.0 or higher for type hints. Previous guard was >= 1.1.0 # We require 2.1.0 or higher for type hints. Previous guard was >= 1.1.0
unpaddedbase64 = ">=2.1.0" unpaddedbase64 = ">=2.1.0"
# We require 1.5.0 to work around an issue when running against the C implementation of
# frozendict: https://github.com/matrix-org/python-canonicaljson/issues/36
canonicaljson = "^1.5.0"
# We require 2.0.0 for immutabledict support.
canonicaljson = "^2.0.0"
# we use the type definitions added in signedjson 1.1. # we use the type definitions added in signedjson 1.1.
signedjson = "^1.1.0" signedjson = "^1.1.0"
# validating SSL certs for IP addresses requires service_identity 18.1. # validating SSL certs for IP addresses requires service_identity 18.1.


+ 0
- 39
stubs/frozendict.pyi 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: ...

+ 14
- 5
synapse/__init__.py 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

set_json_library(json)
from canonicaljson import register_preserialisation_callback
from immutabledict import immutabledict

def _immutabledict_cb(d: immutabledict) -> Dict[str, Any]:
try:
return d._dict
except Exception:
# Paranoia: fall back to a `dict()` call, in case a future version of
# immutabledict removes `_dict` from the implementation.
return dict(d)

register_preserialisation_callback(immutabledict, _immutabledict_cb)
except ImportError: except ImportError:
pass pass




+ 1
- 1
synapse/crypto/event_signing.py 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


+ 2
- 2
synapse/events/snapshot.py 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})

+ 1
- 1
synapse/events/utils.py 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


+ 1
- 1
synapse/events/validator.py 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(


+ 7
- 3
synapse/state/__init__.py 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,


+ 2
- 2
synapse/storage/databases/main/stream.py 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,


+ 6
- 6
synapse/types/__init__.py 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(
factory=frozendict,
instance_map: "immutabledict[str, int]" = attr.ib(
factory=immutabledict,
validator=attr.validators.deep_mapping( validator=attr.validators.deep_mapping(
key_validator=attr.validators.instance_of(str), key_validator=attr.validators.instance_of(str),
value_validator=attr.validators.instance_of(int), value_validator=attr.validators.instance_of(int),
mapping_validator=attr.validators.instance_of(frozendict),
mapping_validator=attr.validators.instance_of(immutabledict),
), ),
) )


@@ -531,7 +531,7 @@ class RoomStreamToken:
return cls( return cls(
topological=None, topological=None,
stream=stream, stream=stream,
instance_map=frozendict(instance_map),
instance_map=immutabledict(instance_map),
) )
except CancelledError: except CancelledError:
raise raise
@@ -566,7 +566,7 @@ class RoomStreamToken:
for instance in set(self.instance_map).union(other.instance_map) for instance in set(self.instance_map).union(other.instance_map)
} }


return RoomStreamToken(None, max_stream, frozendict(instance_map))
return RoomStreamToken(None, max_stream, immutabledict(instance_map))


def as_historical_tuple(self) -> Tuple[int, int]: def as_historical_tuple(self) -> Tuple[int, int]:
"""Returns a tuple of `(topological, stream)` for historical tokens. """Returns a tuple of `(topological, stream)` for historical tokens.


+ 14
- 12
synapse/types/state.py 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)

+ 8
- 12
synapse/util/__init__.py 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]:
"""Helper for json_encoder. Makes frozendicts serializable by returning
def _handle_immutabledict(obj: Any) -> Dict[Any, Any]:
"""Helper for json_encoder. Makes immutabledicts serializable by returning
the underlying dict the underlying dict
""" """
if type(obj) is frozendict:
if type(obj) is immutabledict:
# fishing the protected dict out of the object is a bit nasty, # fishing the protected dict out of the object is a bit nasty,
# but we don't really want the overhead of copying the dict. # but we don't really want the overhead of copying the dict.
try: try:
# Safety: we catch the AttributeError immediately below. # Safety: we catch the AttributeError immediately below.
# See https://github.com/matrix-org/python-canonicaljson/issues/36#issuecomment-927816293
# for discussion on how frozendict's internals have changed over time.
return obj._dict # type: ignore[attr-defined]
return obj._dict
except AttributeError: except AttributeError:
# When the C implementation of frozendict is used,
# there isn't a `_dict` attribute with a dict
# so we resort to making a copy of the frozendict
# If all else fails, resort to making a copy of the immutabledict
return dict(obj) return dict(obj)
raise TypeError( raise TypeError(
"Object of type %s is not JSON serializable" % obj.__class__.__name__ "Object of type %s is not JSON serializable" % obj.__class__.__name__
@@ -64,11 +60,11 @@ def _handle_frozendict(obj: Any) -> Dict[Any, Any]:




# A custom JSON encoder which: # A custom JSON encoder which:
# * handles frozendicts
# * handles immutabledicts
# * produces valid JSON (no NaNs etc) # * produces valid JSON (no NaNs etc)
# * reduces redundant whitespace # * reduces redundant whitespace
json_encoder = json.JSONEncoder( json_encoder = json.JSONEncoder(
allow_nan=False, separators=(",", ":"), default=_handle_frozendict
allow_nan=False, separators=(",", ":"), default=_handle_immutabledict
) )


# Create a custom decoder to reject Python extensions to JSON. # Create a custom decoder to reject Python extensions to JSON.


+ 3
- 3
synapse/util/frozenutils.py 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)):


+ 3
- 3
tests/api/test_filtering.py 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))




+ 3
- 3
tests/config/test_workers.py 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


+ 8
- 10
tests/push/test_push_rule_evaluator.py 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"}),
"patterns should match on frozendicts",
freeze({"value": "FoobaZ"}),
"patterns should match on frozen dictionaries",
) )


# wildcards should match # wildcards should match
@@ -425,11 +423,11 @@ class PushRuleEvaluatorTestCase(unittest.TestCase):
"incorrect types should not match", "incorrect types should not match",
) )


# it should work on frozendicts too
# it should work on frozen dictionaries too
self._assert_matches( self._assert_matches(
condition, condition,
frozendict.frozendict({"value": "foobaz"}),
"values should match on frozendicts",
freeze({"value": "foobaz"}),
"values should match on frozen dictionaries",
) )


def test_exact_event_match_boolean(self) -> None: def test_exact_event_match_boolean(self) -> None:
@@ -546,11 +544,11 @@ class PushRuleEvaluatorTestCase(unittest.TestCase):
"does not search in a string", "does not search in a string",
) )


# it should work on frozendicts too
# it should work on frozen dictionaries too
self._assert_matches( self._assert_matches(
condition, condition,
freeze({"value": ["foobaz"]}), freeze({"value": ["foobaz"]}),
"values should match on frozendicts",
"values should match on frozen dictionaries",
) )


def test_no_body(self) -> None: def test_no_body(self) -> None:


+ 22
- 18
tests/storage/test_state.py 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,
), ),
) )


+ 7
- 7
tests/types/test_state.py 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,
), ),
) )


Loading…
Cancel
Save