[mypy]
namespace_packages = True
plugins = mypy_zope:plugin, scripts-dev/mypy_synapse_plugin.py
follow_imports = normal
check_untyped_defs = True
show_error_codes = True
show_traceback = True
mypy_path = stubs
warn_unreachable = True
local_partial_types = True
no_implicit_optional = True

files =
  scripts-dev/sign_json,
  setup.py,
  synapse/,
  tests/

# Note: Better exclusion syntax coming in mypy > 0.910
# https://github.com/python/mypy/pull/11329
#
# For now, set the (?x) flag enable "verbose" regexes
# https://docs.python.org/3/library/re.html#re.X
exclude = (?x)
  ^(
   |synapse/storage/databases/__init__.py
   |synapse/storage/databases/main/__init__.py
   |synapse/storage/databases/main/cache.py
   |synapse/storage/databases/main/devices.py
   |synapse/storage/databases/main/event_federation.py
   |synapse/storage/databases/main/group_server.py
   |synapse/storage/databases/main/metrics.py
   |synapse/storage/databases/main/monthly_active_users.py
   |synapse/storage/databases/main/push_rule.py
   |synapse/storage/databases/main/receipts.py
   |synapse/storage/databases/main/roommember.py
   |synapse/storage/databases/main/search.py
   |synapse/storage/databases/main/state.py
   |synapse/storage/schema/

   |tests/api/test_auth.py
   |tests/api/test_ratelimiting.py
   |tests/app/test_openid_listener.py
   |tests/appservice/test_scheduler.py
   |tests/config/test_cache.py
   |tests/config/test_tls.py
   |tests/crypto/test_keyring.py
   |tests/events/test_presence_router.py
   |tests/events/test_utils.py
   |tests/federation/test_federation_catch_up.py
   |tests/federation/test_federation_sender.py
   |tests/federation/test_federation_server.py
   |tests/federation/transport/test_knocking.py
   |tests/federation/transport/test_server.py
   |tests/handlers/test_cas.py
   |tests/handlers/test_directory.py
   |tests/handlers/test_e2e_keys.py
   |tests/handlers/test_federation.py
   |tests/handlers/test_oidc.py
   |tests/handlers/test_presence.py
   |tests/handlers/test_profile.py
   |tests/handlers/test_saml.py
   |tests/handlers/test_typing.py
   |tests/http/federation/test_matrix_federation_agent.py
   |tests/http/federation/test_srv_resolver.py
   |tests/http/test_fedclient.py
   |tests/http/test_proxyagent.py
   |tests/http/test_servlet.py
   |tests/http/test_site.py
   |tests/logging/__init__.py
   |tests/logging/test_terse_json.py
   |tests/module_api/test_api.py
   |tests/push/test_email.py
   |tests/push/test_http.py
   |tests/push/test_presentable_names.py
   |tests/push/test_push_rule_evaluator.py
   |tests/rest/client/test_account.py
   |tests/rest/client/test_filter.py
   |tests/rest/client/test_report_event.py
   |tests/rest/client/test_rooms.py
   |tests/rest/client/test_third_party_rules.py
   |tests/rest/client/test_transactions.py
   |tests/rest/client/test_typing.py
   |tests/rest/key/v2/test_remote_key_resource.py
   |tests/rest/media/v1/test_base.py
   |tests/rest/media/v1/test_media_storage.py
   |tests/rest/media/v1/test_url_preview.py
   |tests/scripts/test_new_matrix_user.py
   |tests/server.py
   |tests/server_notices/test_resource_limits_server_notices.py
   |tests/state/test_v2.py
   |tests/storage/test_background_update.py
   |tests/storage/test_base.py
   |tests/storage/test_client_ips.py
   |tests/storage/test_database.py
   |tests/storage/test_event_federation.py
   |tests/storage/test_id_generators.py
   |tests/storage/test_roommember.py
   |tests/test_metrics.py
   |tests/test_phone_home.py
   |tests/test_server.py
   |tests/test_state.py
   |tests/test_terms_auth.py
   |tests/unittest.py
   |tests/util/caches/test_cached_call.py
   |tests/util/caches/test_deferred_cache.py
   |tests/util/caches/test_descriptors.py
   |tests/util/caches/test_response_cache.py
   |tests/util/caches/test_ttlcache.py
   |tests/util/test_async_helpers.py
   |tests/util/test_batching_queue.py
   |tests/util/test_dict_cache.py
   |tests/util/test_expiring_cache.py
   |tests/util/test_file_consumer.py
   |tests/util/test_linearizer.py
   |tests/util/test_logcontext.py
   |tests/util/test_lrucache.py
   |tests/util/test_rwlock.py
   |tests/util/test_wheel_timer.py
   |tests/utils.py
   )$

[mypy-synapse.api.*]
disallow_untyped_defs = True

[mypy-synapse.app.*]
disallow_untyped_defs = True

[mypy-synapse.appservice.*]
disallow_untyped_defs = True

[mypy-synapse.config._base]
disallow_untyped_defs = True

[mypy-synapse.crypto.*]
disallow_untyped_defs = True

[mypy-synapse.event_auth]
disallow_untyped_defs = True

[mypy-synapse.events.*]
disallow_untyped_defs = True

[mypy-synapse.federation.*]
disallow_untyped_defs = True

[mypy-synapse.federation.transport.client]
disallow_untyped_defs = False

[mypy-synapse.handlers.*]
disallow_untyped_defs = True

[mypy-synapse.http.server]
disallow_untyped_defs = True

[mypy-synapse.logging.context]
disallow_untyped_defs = True

[mypy-synapse.metrics.*]
disallow_untyped_defs = True

[mypy-synapse.module_api.*]
disallow_untyped_defs = True

[mypy-synapse.notifier]
disallow_untyped_defs = True

[mypy-synapse.push.*]
disallow_untyped_defs = True

[mypy-synapse.replication.*]
disallow_untyped_defs = True

[mypy-synapse.rest.*]
disallow_untyped_defs = True

[mypy-synapse.server_notices.*]
disallow_untyped_defs = True

[mypy-synapse.state.*]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.account_data]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.client_ips]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.directory]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.e2e_room_keys]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.end_to_end_keys]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.event_push_actions]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.events_bg_updates]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.events_worker]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.room]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.room_batch]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.profile]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.stats]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.state_deltas]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.transactions]
disallow_untyped_defs = True

[mypy-synapse.storage.databases.main.user_erasure_store]
disallow_untyped_defs = True

[mypy-synapse.storage.util.*]
disallow_untyped_defs = True

[mypy-synapse.streams.*]
disallow_untyped_defs = True

[mypy-synapse.util.*]
disallow_untyped_defs = True

[mypy-synapse.util.caches.treecache]
disallow_untyped_defs = False

[mypy-tests.handlers.test_user_directory]
disallow_untyped_defs = True

[mypy-tests.storage.test_profile]
disallow_untyped_defs = True

[mypy-tests.storage.test_user_directory]
disallow_untyped_defs = True

[mypy-tests.rest.admin.*]
disallow_untyped_defs = True

[mypy-tests.rest.client.*]
disallow_untyped_defs = True

[mypy-tests.federation.transport.test_client]
disallow_untyped_defs = True


;; Dependencies without annotations
;; Before ignoring a module, check to see if type stubs are available.
;; The `typeshed` project maintains stubs here:
;;     https://github.com/python/typeshed/tree/master/stubs
;; and for each package `foo` there's a corresponding `types-foo` package on PyPI,
;; which we can pull in as a dev dependency by adding to `setup.py`'s
;; `CONDITIONAL_REQUIREMENTS["mypy"]` list.

[mypy-authlib.*]
ignore_missing_imports = True

[mypy-bcrypt]
ignore_missing_imports = True

[mypy-canonicaljson]
ignore_missing_imports = True

[mypy-constantly]
ignore_missing_imports = True

[mypy-daemonize]
ignore_missing_imports = True

[mypy-h11]
ignore_missing_imports = True

[mypy-hiredis]
ignore_missing_imports = True

[mypy-hyperlink]
ignore_missing_imports = True

[mypy-ijson.*]
ignore_missing_imports = True

[mypy-jaeger_client.*]
ignore_missing_imports = True

[mypy-josepy.*]
ignore_missing_imports = True

[mypy-jwt.*]
ignore_missing_imports = True

[mypy-lxml]
ignore_missing_imports = True

[mypy-msgpack]
ignore_missing_imports = True

[mypy-nacl.*]
ignore_missing_imports = True

[mypy-netaddr]
ignore_missing_imports = True

[mypy-parameterized.*]
ignore_missing_imports = True

[mypy-phonenumbers.*]
ignore_missing_imports = True

[mypy-prometheus_client.*]
ignore_missing_imports = True

[mypy-pymacaroons.*]
ignore_missing_imports = True

[mypy-pympler.*]
ignore_missing_imports = True

[mypy-rust_python_jaeger_reporter.*]
ignore_missing_imports = True

[mypy-saml2.*]
ignore_missing_imports = True

[mypy-sentry_sdk]
ignore_missing_imports = True

[mypy-service_identity.*]
ignore_missing_imports = True

[mypy-signedjson.*]
ignore_missing_imports = True

[mypy-treq.*]
ignore_missing_imports = True

[mypy-twisted.*]
ignore_missing_imports = True

[mypy-zope]
ignore_missing_imports = True
