From 730175d56ab5e8b641111ca0221b20be37ef66af Mon Sep 17 00:00:00 2001 From: anthony sottile <103459774+asottile-sentry@users.noreply.github.com> Date: Mon, 7 Aug 2023 11:58:25 -0400 Subject: [PATCH] ref: inline generated DataCategory constants (#2389) this allows mypy to type check this enum this is what it looks like when it fails: ```console $ python3 -c 'import sentry_relay.consts' Traceback (most recent call last): File "", line 1, in File "/Users/asottile/workspace/relay/py/sentry_relay/__init__.py", line 22, in _import_all() File "/Users/asottile/workspace/relay/py/sentry_relay/__init__.py", line 11, in _import_all mod = __import__("sentry_relay.%s" % modname, glob, glob, ["__name__"]) File "/Users/asottile/workspace/relay/py/sentry_relay/consts.py", line 78, in _check_generated() File "/Users/asottile/workspace/relay/py/sentry_relay/consts.py", line 72, in _check_generated raise AssertionError( AssertionError: DataCategory enum does not match source! Paste this into `class DataCategory` in pysentry_relay/consts.py: DEFAULT = 0 ERROR = 1 TRANSACTION = 2 SECURITY = 3 ATTACHMENT = 4 SESSION = 5 PROFILE = 6 REPLAY = 7 TRANSACTION_PROCESSED = 8 TRANSACTION_INDEXED = 9 MONITOR = 10 PROFILE_INDEXED = 11 SPAN = 12 UNKNOWN = -1 ``` #skip-changelog --- py/sentry_relay/consts.py | 50 +++++++++++++++++++++++++++++++-------- 1 file changed, 40 insertions(+), 10 deletions(-) diff --git a/py/sentry_relay/consts.py b/py/sentry_relay/consts.py index e9e07adcde..977f5f6d18 100644 --- a/py/sentry_relay/consts.py +++ b/py/sentry_relay/consts.py @@ -1,3 +1,4 @@ +import sys from enum import IntEnum from sentry_relay._lowlevel import lib @@ -7,17 +8,23 @@ __all__ = ["DataCategory", "SPAN_STATUS_CODE_TO_NAME", "SPAN_STATUS_NAME_TO_CODE"] -def _make_data_categories(ns): - prefix = "RELAY_DATA_CATEGORY_" - - for attr in dir(lib): - if attr.startswith(prefix): - category_name = attr[len(prefix) :] - ns[category_name] = getattr(lib, attr) - - class DataCategory(IntEnum): - _make_data_categories(locals()) + # begin generated + DEFAULT = 0 + ERROR = 1 + TRANSACTION = 2 + SECURITY = 3 + ATTACHMENT = 4 + SESSION = 5 + PROFILE = 6 + REPLAY = 7 + TRANSACTION_PROCESSED = 8 + TRANSACTION_INDEXED = 9 + MONITOR = 10 + PROFILE_INDEXED = 11 + SPAN = 12 + UNKNOWN = -1 + # end generated @classmethod def parse(cls, name): @@ -63,6 +70,29 @@ def api_name(self): return decode_str(lib.relay_data_category_name(self.value), free=True) +def _check_generated(): + prefix = "RELAY_DATA_CATEGORY_" + + attrs = {} + for attr in dir(lib): + if attr.startswith(prefix): + category_name = attr[len(prefix) :] + attrs[category_name] = getattr(lib, attr) + + if attrs != DataCategory.__members__: + values = sorted( + attrs.items(), key=lambda kv: sys.maxsize if kv[1] == -1 else kv[1] + ) + generated = "".join(f" {k} = {v}\n" for k, v in values) + raise AssertionError( + f"DataCategory enum does not match source!\n\n" + f"Paste this into `class DataCategory` in py/sentry_relay/consts.py:\n\n" + f"{generated}" + ) + + +_check_generated() + SPAN_STATUS_CODE_TO_NAME = {} SPAN_STATUS_NAME_TO_CODE = {}