From f196235612dcdde514bc4b8228fc62c0fc133945 Mon Sep 17 00:00:00 2001 From: Hugues Pouillot Date: Fri, 19 Dec 2025 14:54:29 +0100 Subject: [PATCH 1/3] add in_app configuration for python SDK --- posthog/client.py | 35 +++++++++++++++++++---------------- posthog/exception_utils.py | 6 +++--- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/posthog/client.py b/posthog/client.py index c1fe14bd..0007a18d 100644 --- a/posthog/client.py +++ b/posthog/client.py @@ -4,24 +4,33 @@ import sys from datetime import datetime, timedelta from typing import Any, Dict, Optional, Union -from typing_extensions import Unpack from uuid import uuid4 from dateutil.tz import tzutc from six import string_types +from typing_extensions import Unpack -from posthog.args import OptionalCaptureArgs, OptionalSetArgs, ID_TYPES, ExceptionArg +from posthog.args import ID_TYPES, ExceptionArg, OptionalCaptureArgs, OptionalSetArgs from posthog.consumer import Consumer +from posthog.contexts import ( + _get_current_context, + get_capture_exception_code_variables_context, + get_code_variables_ignore_patterns_context, + get_code_variables_mask_patterns_context, + get_context_distinct_id, + get_context_session_id, + new_context, +) from posthog.exception_capture import ExceptionCapture from posthog.exception_utils import ( + DEFAULT_CODE_VARIABLES_IGNORE_PATTERNS, + DEFAULT_CODE_VARIABLES_MASK_PATTERNS, exc_info_from_error, + exception_is_already_captured, exceptions_from_error_tuple, handle_in_app, - exception_is_already_captured, mark_exception_as_captured, try_attach_code_variables_to_frames, - DEFAULT_CODE_VARIABLES_MASK_PATTERNS, - DEFAULT_CODE_VARIABLES_IGNORE_PATTERNS, ) from posthog.feature_flags import ( InconclusiveMatchError, @@ -38,15 +47,6 @@ get, remote_config, ) -from posthog.contexts import ( - _get_current_context, - get_context_distinct_id, - get_context_session_id, - get_capture_exception_code_variables_context, - get_code_variables_mask_patterns_context, - get_code_variables_ignore_patterns_context, - new_context, -) from posthog.types import ( FeatureFlag, FeatureFlagResult, @@ -187,6 +187,7 @@ def __init__( capture_exception_code_variables=False, code_variables_mask_patterns=None, code_variables_ignore_patterns=None, + in_app_modules: list[str] | None = None, ): """ Initialize a new PostHog client instance. @@ -254,6 +255,7 @@ def __init__( if code_variables_ignore_patterns is not None else DEFAULT_CODE_VARIABLES_IGNORE_PATTERNS ) + self.in_app_modules = in_app_modules if project_root is None: try: @@ -975,6 +977,7 @@ def capture_exception( "values": all_exceptions_with_trace, }, }, + in_app_include=self.in_app_modules, project_root=self.project_root, ) all_exceptions_with_trace_and_in_app = event["exception"]["values"] @@ -2043,9 +2046,9 @@ def _initialize_flag_cache(self, cache_url): return None try: - from urllib.parse import urlparse, parse_qs + from urllib.parse import parse_qs, urlparse except ImportError: - from urlparse import urlparse, parse_qs + from urlparse import parse_qs, urlparse try: parsed = urlparse(cache_url) diff --git a/posthog/exception_utils.py b/posthog/exception_utils.py index 3c03806b..9f43e9bc 100644 --- a/posthog/exception_utils.py +++ b/posthog/exception_utils.py @@ -14,23 +14,23 @@ from datetime import datetime from types import FrameType, TracebackType # noqa: F401 from typing import ( # noqa: F401 + TYPE_CHECKING, Any, Dict, Iterator, List, Literal, Optional, + Pattern, Set, Tuple, TypedDict, TypeVar, Union, cast, - TYPE_CHECKING, - Pattern, ) -from posthog.args import ExcInfo, ExceptionArg # noqa: F401 +from posthog.args import ExceptionArg, ExcInfo # noqa: F401 try: # Python 3.11 From 007c04041be42350a463e77fe157d380903720c1 Mon Sep 17 00:00:00 2001 From: Hugues Pouillot Date: Fri, 19 Dec 2025 14:56:52 +0100 Subject: [PATCH 2/3] bump version --- CHANGELOG.md | 5 ++++- posthog/version.py | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bcfeac2a..71b3713a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,8 +1,11 @@ +# 7.2.1 - 2025-12-19 + +feat: add `in_app_modules` option to control code variables capturing + # 7.2.0 - 2025-12-01 feat: add $feature_flag_evaluated_at properties to $feature_flag_called events - # 7.1.0 - 2025-11-26 Add support for the async version of Gemini. diff --git a/posthog/version.py b/posthog/version.py index bb603866..32df4b23 100644 --- a/posthog/version.py +++ b/posthog/version.py @@ -1,4 +1,4 @@ -VERSION = "7.2.0" +VERSION = "7.2.1" if __name__ == "__main__": print(VERSION, end="") # noqa: T201 From 6708a97af9c7ad955a4c79358798d63488acb20d Mon Sep 17 00:00:00 2001 From: Hugues Pouillot Date: Fri, 19 Dec 2025 14:58:41 +0100 Subject: [PATCH 3/3] add in_app_modules to init script as well --- posthog/__init__.py | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) diff --git a/posthog/__init__.py b/posthog/__init__.py index 98286dd7..95d20d86 100644 --- a/posthog/__init__.py +++ b/posthog/__init__.py @@ -1,30 +1,49 @@ import datetime # noqa: F401 -from typing import Callable, Dict, Optional, Any # noqa: F401 +from typing import Any, Callable, Dict, Optional # noqa: F401 + from typing_extensions import Unpack -from posthog.args import OptionalCaptureArgs, OptionalSetArgs, ExceptionArg +from posthog.args import ExceptionArg, OptionalCaptureArgs, OptionalSetArgs from posthog.client import Client +from posthog.contexts import ( + identify_context as inner_identify_context, +) from posthog.contexts import ( new_context as inner_new_context, +) +from posthog.contexts import ( scoped as inner_scoped, - tag as inner_tag, - set_context_session as inner_set_context_session, - identify_context as inner_identify_context, +) +from posthog.contexts import ( set_capture_exception_code_variables_context as inner_set_capture_exception_code_variables_context, - set_code_variables_mask_patterns_context as inner_set_code_variables_mask_patterns_context, +) +from posthog.contexts import ( set_code_variables_ignore_patterns_context as inner_set_code_variables_ignore_patterns_context, ) +from posthog.contexts import ( + set_code_variables_mask_patterns_context as inner_set_code_variables_mask_patterns_context, +) +from posthog.contexts import ( + set_context_session as inner_set_context_session, +) +from posthog.contexts import ( + tag as inner_tag, +) from posthog.exception_utils import ( DEFAULT_CODE_VARIABLES_IGNORE_PATTERNS, DEFAULT_CODE_VARIABLES_MASK_PATTERNS, ) from posthog.feature_flags import ( InconclusiveMatchError as InconclusiveMatchError, +) +from posthog.feature_flags import ( RequiresServerEvaluation as RequiresServerEvaluation, ) from posthog.types import ( FeatureFlag, FlagsAndPayloads, +) +from posthog.types import ( FeatureFlagResult as FeatureFlagResult, ) from posthog.version import VERSION @@ -191,6 +210,7 @@ def tag(name: str, value: Any): capture_exception_code_variables = False code_variables_mask_patterns = DEFAULT_CODE_VARIABLES_MASK_PATTERNS code_variables_ignore_patterns = DEFAULT_CODE_VARIABLES_IGNORE_PATTERNS +in_app_modules = None # type: Optional[list[str]] # NOTE - this and following functions take unpacked kwargs because we needed to make @@ -789,6 +809,7 @@ def setup() -> Client: capture_exception_code_variables=capture_exception_code_variables, code_variables_mask_patterns=code_variables_mask_patterns, code_variables_ignore_patterns=code_variables_ignore_patterns, + in_app_modules=in_app_modules, ) # always set incase user changes it