golf-mcp 0.2.2__py3-none-any.whl → 0.2.4__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of golf-mcp might be problematic. Click here for more details.

Files changed (64) hide show
  1. golf/__init__.py +1 -1
  2. golf/_endpoints.py.in +6 -0
  3. {golf_mcp-0.2.2.dist-info → golf_mcp-0.2.4.dist-info}/METADATA +1 -1
  4. golf_mcp-0.2.4.dist-info/RECORD +56 -0
  5. golf/examples/__pycache__/__init__.cpython-311.pyc +0 -0
  6. golf/examples/basic/.coverage +0 -0
  7. golf/examples/basic/__pycache__/auth.cpython-311.pyc +0 -0
  8. golf/examples/basic/htmlcov/.gitignore +0 -2
  9. golf/examples/basic/htmlcov/class_index.html +0 -547
  10. golf/examples/basic/htmlcov/coverage_html_cb_6fb7b396.js +0 -733
  11. golf/examples/basic/htmlcov/favicon_32_cb_58284776.png +0 -0
  12. golf/examples/basic/htmlcov/function_index.html +0 -2091
  13. golf/examples/basic/htmlcov/index.html +0 -349
  14. golf/examples/basic/htmlcov/keybd_closed_cb_ce680311.png +0 -0
  15. golf/examples/basic/htmlcov/status.json +0 -1
  16. golf/examples/basic/htmlcov/style_cb_8e611ae1.css +0 -337
  17. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496___init___py.html +0 -323
  18. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_api_key_py.html +0 -170
  19. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_factory_py.html +0 -430
  20. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_helpers_py.html +0 -288
  21. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_providers_py.html +0 -493
  22. golf/examples/basic/htmlcov/z_1c9a91c0e91c8496_registry_py.html +0 -353
  23. golf/examples/basic/htmlcov/z_3ec3b3f490dc0950___init___py.html +0 -120
  24. golf/examples/basic/htmlcov/z_3ec3b3f490dc0950_instrumentation_py.html +0 -1535
  25. golf/examples/basic/htmlcov/z_4b8b9dd4ccccc5db___init___py.html +0 -98
  26. golf/examples/basic/htmlcov/z_4b8b9dd4ccccc5db_branding_py.html +0 -289
  27. golf/examples/basic/htmlcov/z_4b8b9dd4ccccc5db_main_py.html +0 -476
  28. golf/examples/basic/htmlcov/z_5a6c4e6bcc86fb2f___init___py.html +0 -97
  29. golf/examples/basic/htmlcov/z_6cadab9ec0df475d___init___py.html +0 -102
  30. golf/examples/basic/htmlcov/z_6cadab9ec0df475d_build_py.html +0 -178
  31. golf/examples/basic/htmlcov/z_6cadab9ec0df475d_init_py.html +0 -387
  32. golf/examples/basic/htmlcov/z_6cadab9ec0df475d_run_py.html +0 -222
  33. golf/examples/basic/htmlcov/z_6fcdee0582ba84e4___init___py.html +0 -106
  34. golf/examples/basic/htmlcov/z_6fcdee0582ba84e4__endpoints_fallback_py.html +0 -107
  35. golf/examples/basic/htmlcov/z_7ba499ed22986217___init___py.html +0 -98
  36. golf/examples/basic/htmlcov/z_7ba499ed22986217_builder_auth_py.html +0 -306
  37. golf/examples/basic/htmlcov/z_7ba499ed22986217_builder_metrics_py.html +0 -329
  38. golf/examples/basic/htmlcov/z_7ba499ed22986217_builder_py.html +0 -1471
  39. golf/examples/basic/htmlcov/z_7ba499ed22986217_builder_telemetry_py.html +0 -186
  40. golf/examples/basic/htmlcov/z_7ba499ed22986217_config_py.html +0 -315
  41. golf/examples/basic/htmlcov/z_7ba499ed22986217_parser_py.html +0 -1149
  42. golf/examples/basic/htmlcov/z_7ba499ed22986217_platform_py.html +0 -279
  43. golf/examples/basic/htmlcov/z_7ba499ed22986217_telemetry_py.html +0 -589
  44. golf/examples/basic/htmlcov/z_7ba499ed22986217_transformer_py.html +0 -286
  45. golf/examples/basic/htmlcov/z_7d7da37693a43688___init___py.html +0 -107
  46. golf/examples/basic/htmlcov/z_7d7da37693a43688_collector_py.html +0 -417
  47. golf/examples/basic/htmlcov/z_7d7da37693a43688_registry_py.html +0 -109
  48. golf/examples/basic/htmlcov/z_abe733142b40ad4e___init___py.html +0 -109
  49. golf/examples/basic/htmlcov/z_abe733142b40ad4e_context_py.html +0 -150
  50. golf/examples/basic/htmlcov/z_abe733142b40ad4e_elicitation_py.html +0 -267
  51. golf/examples/basic/htmlcov/z_abe733142b40ad4e_sampling_py.html +0 -318
  52. golf/examples/basic/prompts/__pycache__/welcome.cpython-311.pyc +0 -0
  53. golf/examples/basic/resources/__pycache__/current_time.cpython-311.pyc +0 -0
  54. golf/examples/basic/resources/__pycache__/info.cpython-311.pyc +0 -0
  55. golf/examples/basic/resources/weather/__pycache__/common.cpython-311.pyc +0 -0
  56. golf/examples/basic/resources/weather/__pycache__/current.cpython-311.pyc +0 -0
  57. golf/examples/basic/resources/weather/__pycache__/forecast.cpython-311.pyc +0 -0
  58. golf/examples/basic/tools/__pycache__/calculator.cpython-311.pyc +0 -0
  59. golf/examples/basic/tools/say/__pycache__/hello.cpython-311.pyc +0 -0
  60. golf_mcp-0.2.2.dist-info/RECORD +0 -110
  61. {golf_mcp-0.2.2.dist-info → golf_mcp-0.2.4.dist-info}/WHEEL +0 -0
  62. {golf_mcp-0.2.2.dist-info → golf_mcp-0.2.4.dist-info}/entry_points.txt +0 -0
  63. {golf_mcp-0.2.2.dist-info → golf_mcp-0.2.4.dist-info}/licenses/LICENSE +0 -0
  64. {golf_mcp-0.2.2.dist-info → golf_mcp-0.2.4.dist-info}/top_level.txt +0 -0
@@ -1,589 +0,0 @@
1
- <!DOCTYPE html>
2
- <html lang="en">
3
- <head>
4
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
5
- <title>Coverage for /Users/antonigmitruk/golf/src/golf/core/telemetry.py: 0%</title>
6
- <link rel="icon" sizes="32x32" href="favicon_32_cb_58284776.png">
7
- <link rel="stylesheet" href="style_cb_8e611ae1.css" type="text/css">
8
- <script src="coverage_html_cb_6fb7b396.js" defer></script>
9
- </head>
10
- <body class="pyfile">
11
- <header>
12
- <div class="content">
13
- <h1>
14
- <span class="text">Coverage for </span><b>/Users/antonigmitruk/golf/src/golf/core/telemetry.py</b>:
15
- <span class="pc_cov">0%</span>
16
- </h1>
17
- <aside id="help_panel_wrapper">
18
- <input id="help_panel_state" type="checkbox">
19
- <label for="help_panel_state">
20
- <img id="keyboard_icon" src="keybd_closed_cb_ce680311.png" alt="Show/hide keyboard shortcuts">
21
- </label>
22
- <div id="help_panel">
23
- <p class="legend">Shortcuts on this page</p>
24
- <div class="keyhelp">
25
- <p>
26
- <kbd>r</kbd>
27
- <kbd>m</kbd>
28
- <kbd>x</kbd>
29
- &nbsp; toggle line displays
30
- </p>
31
- <p>
32
- <kbd>j</kbd>
33
- <kbd>k</kbd>
34
- &nbsp; next/prev highlighted chunk
35
- </p>
36
- <p>
37
- <kbd>0</kbd> &nbsp; (zero) top of page
38
- </p>
39
- <p>
40
- <kbd>1</kbd> &nbsp; (one) first highlighted chunk
41
- </p>
42
- <p>
43
- <kbd>[</kbd>
44
- <kbd>]</kbd>
45
- &nbsp; prev/next file
46
- </p>
47
- <p>
48
- <kbd>u</kbd> &nbsp; up to the index
49
- </p>
50
- <p>
51
- <kbd>?</kbd> &nbsp; show/hide this help
52
- </p>
53
- </div>
54
- </div>
55
- </aside>
56
- <h2>
57
- <span class="text">201 statements &nbsp;</span>
58
- <button type="button" class="run button_toggle_run" value="run" data-shortcut="r" title="Toggle lines run">0<span class="text"> run</span></button>
59
- <button type="button" class="mis show_mis button_toggle_mis" value="mis" data-shortcut="m" title="Toggle lines missing">201<span class="text"> missing</span></button>
60
- <button type="button" class="exc show_exc button_toggle_exc" value="exc" data-shortcut="x" title="Toggle lines excluded">0<span class="text"> excluded</span></button>
61
- </h2>
62
- <p class="text">
63
- <a id="prevFileLink" class="nav" href="z_7ba499ed22986217_platform_py.html">&#xab; prev</a> &nbsp; &nbsp;
64
- <a id="indexLink" class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
65
- <a id="nextFileLink" class="nav" href="z_7ba499ed22986217_transformer_py.html">&#xbb; next</a>
66
- &nbsp; &nbsp; &nbsp;
67
- <a class="nav" href="https://coverage.readthedocs.io/en/7.6.12">coverage.py v7.6.12</a>,
68
- created at 2025-08-16 18:46 +0200
69
- </p>
70
- <aside class="hidden">
71
- <button type="button" class="button_next_chunk" data-shortcut="j"></button>
72
- <button type="button" class="button_prev_chunk" data-shortcut="k"></button>
73
- <button type="button" class="button_top_of_page" data-shortcut="0"></button>
74
- <button type="button" class="button_first_chunk" data-shortcut="1"></button>
75
- <button type="button" class="button_prev_file" data-shortcut="["></button>
76
- <button type="button" class="button_next_file" data-shortcut="]"></button>
77
- <button type="button" class="button_to_index" data-shortcut="u"></button>
78
- <button type="button" class="button_show_hide_help" data-shortcut="?"></button>
79
- </aside>
80
- </div>
81
- </header>
82
- <main id="source">
83
- <p class="pln"><span class="n"><a id="t1" href="#t1">1</a></span><span class="t"><span class="str">"""Telemetry module for anonymous usage tracking with PostHog."""</span>&nbsp;</span><span class="r"></span></p>
84
- <p class="pln"><span class="n"><a id="t2" href="#t2">2</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
85
- <p class="mis show_mis"><span class="n"><a id="t3" href="#t3">3</a></span><span class="t"><span class="key">import</span> <span class="nam">hashlib</span>&nbsp;</span><span class="r"></span></p>
86
- <p class="mis show_mis"><span class="n"><a id="t4" href="#t4">4</a></span><span class="t"><span class="key">import</span> <span class="nam">json</span>&nbsp;</span><span class="r"></span></p>
87
- <p class="mis show_mis"><span class="n"><a id="t5" href="#t5">5</a></span><span class="t"><span class="key">import</span> <span class="nam">os</span>&nbsp;</span><span class="r"></span></p>
88
- <p class="mis show_mis"><span class="n"><a id="t6" href="#t6">6</a></span><span class="t"><span class="key">import</span> <span class="nam">platform</span>&nbsp;</span><span class="r"></span></p>
89
- <p class="mis show_mis"><span class="n"><a id="t7" href="#t7">7</a></span><span class="t"><span class="key">import</span> <span class="nam">uuid</span>&nbsp;</span><span class="r"></span></p>
90
- <p class="mis show_mis"><span class="n"><a id="t8" href="#t8">8</a></span><span class="t"><span class="key">from</span> <span class="nam">pathlib</span> <span class="key">import</span> <span class="nam">Path</span>&nbsp;</span><span class="r"></span></p>
91
- <p class="mis show_mis"><span class="n"><a id="t9" href="#t9">9</a></span><span class="t"><span class="key">from</span> <span class="nam">typing</span> <span class="key">import</span> <span class="nam">Any</span>&nbsp;</span><span class="r"></span></p>
92
- <p class="pln"><span class="n"><a id="t10" href="#t10">10</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
93
- <p class="mis show_mis"><span class="n"><a id="t11" href="#t11">11</a></span><span class="t"><span class="key">import</span> <span class="nam">posthog</span>&nbsp;</span><span class="r"></span></p>
94
- <p class="mis show_mis"><span class="n"><a id="t12" href="#t12">12</a></span><span class="t"><span class="key">from</span> <span class="nam">rich</span><span class="op">.</span><span class="nam">console</span> <span class="key">import</span> <span class="nam">Console</span>&nbsp;</span><span class="r"></span></p>
95
- <p class="pln"><span class="n"><a id="t13" href="#t13">13</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
96
- <p class="mis show_mis"><span class="n"><a id="t14" href="#t14">14</a></span><span class="t"><span class="key">from</span> <span class="nam">golf</span> <span class="key">import</span> <span class="nam">__version__</span>&nbsp;</span><span class="r"></span></p>
97
- <p class="pln"><span class="n"><a id="t15" href="#t15">15</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
98
- <p class="mis show_mis"><span class="n"><a id="t16" href="#t16">16</a></span><span class="t"><span class="nam">console</span> <span class="op">=</span> <span class="nam">Console</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
99
- <p class="pln"><span class="n"><a id="t17" href="#t17">17</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
100
- <p class="pln"><span class="n"><a id="t18" href="#t18">18</a></span><span class="t"><span class="com"># PostHog configuration</span>&nbsp;</span><span class="r"></span></p>
101
- <p class="pln"><span class="n"><a id="t19" href="#t19">19</a></span><span class="t"><span class="com"># This is a client-side API key, safe to be public</span>&nbsp;</span><span class="r"></span></p>
102
- <p class="pln"><span class="n"><a id="t20" href="#t20">20</a></span><span class="t"><span class="com"># Users can override with GOLF_POSTHOG_API_KEY environment variable</span>&nbsp;</span><span class="r"></span></p>
103
- <p class="mis show_mis"><span class="n"><a id="t21" href="#t21">21</a></span><span class="t"><span class="nam">DEFAULT_POSTHOG_API_KEY</span> <span class="op">=</span> <span class="str">"phc_7ccsDDxoC5tK5hodlrs2moGC74cThRzcN63flRYPWGl"</span>&nbsp;</span><span class="r"></span></p>
104
- <p class="mis show_mis"><span class="n"><a id="t22" href="#t22">22</a></span><span class="t"><span class="nam">POSTHOG_API_KEY</span> <span class="op">=</span> <span class="nam">os</span><span class="op">.</span><span class="nam">environ</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"GOLF_POSTHOG_API_KEY"</span><span class="op">,</span> <span class="nam">DEFAULT_POSTHOG_API_KEY</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
105
- <p class="mis show_mis"><span class="n"><a id="t23" href="#t23">23</a></span><span class="t"><span class="nam">POSTHOG_HOST</span> <span class="op">=</span> <span class="str">"https://us.i.posthog.com"</span>&nbsp;</span><span class="r"></span></p>
106
- <p class="pln"><span class="n"><a id="t24" href="#t24">24</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
107
- <p class="pln"><span class="n"><a id="t25" href="#t25">25</a></span><span class="t"><span class="com"># Telemetry state</span>&nbsp;</span><span class="r"></span></p>
108
- <p class="mis show_mis"><span class="n"><a id="t26" href="#t26">26</a></span><span class="t"><span class="nam">_telemetry_enabled</span><span class="op">:</span> <span class="nam">bool</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
109
- <p class="mis show_mis"><span class="n"><a id="t27" href="#t27">27</a></span><span class="t"><span class="nam">_anonymous_id</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
110
- <p class="mis show_mis"><span class="n"><a id="t28" href="#t28">28</a></span><span class="t"><span class="nam">_user_identified</span><span class="op">:</span> <span class="nam">bool</span> <span class="op">=</span> <span class="key">False</span> <span class="com"># Track if we've already identified the user</span>&nbsp;</span><span class="r"></span></p>
111
- <p class="pln"><span class="n"><a id="t29" href="#t29">29</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
112
- <p class="pln"><span class="n"><a id="t30" href="#t30">30</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
113
- <p class="mis show_mis"><span class="n"><a id="t31" href="#t31">31</a></span><span class="t"><span class="key">def</span> <span class="nam">_is_test_mode</span><span class="op">(</span><span class="op">)</span> <span class="op">-></span> <span class="nam">bool</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
114
- <p class="pln"><span class="n"><a id="t32" href="#t32">32</a></span><span class="t"> <span class="str">"""Check if we're in test mode."""</span>&nbsp;</span><span class="r"></span></p>
115
- <p class="mis show_mis"><span class="n"><a id="t33" href="#t33">33</a></span><span class="t"> <span class="key">return</span> <span class="nam">os</span><span class="op">.</span><span class="nam">environ</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"GOLF_TEST_MODE"</span><span class="op">,</span> <span class="str">""</span><span class="op">)</span><span class="op">.</span><span class="nam">lower</span><span class="op">(</span><span class="op">)</span> <span class="key">in</span> <span class="op">(</span><span class="str">"1"</span><span class="op">,</span> <span class="str">"true"</span><span class="op">,</span> <span class="str">"yes"</span><span class="op">,</span> <span class="str">"on"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
116
- <p class="pln"><span class="n"><a id="t34" href="#t34">34</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
117
- <p class="pln"><span class="n"><a id="t35" href="#t35">35</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
118
- <p class="mis show_mis"><span class="n"><a id="t36" href="#t36">36</a></span><span class="t"><span class="key">def</span> <span class="nam">_ensure_posthog_disabled_in_test_mode</span><span class="op">(</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
119
- <p class="pln"><span class="n"><a id="t37" href="#t37">37</a></span><span class="t"> <span class="str">"""Ensure PostHog is disabled when in test mode."""</span>&nbsp;</span><span class="r"></span></p>
120
- <p class="mis show_mis"><span class="n"><a id="t38" href="#t38">38</a></span><span class="t"> <span class="key">if</span> <span class="nam">_is_test_mode</span><span class="op">(</span><span class="op">)</span> <span class="key">and</span> <span class="key">not</span> <span class="nam">posthog</span><span class="op">.</span><span class="nam">disabled</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
121
- <p class="mis show_mis"><span class="n"><a id="t39" href="#t39">39</a></span><span class="t"> <span class="nam">posthog</span><span class="op">.</span><span class="nam">disabled</span> <span class="op">=</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
122
- <p class="pln"><span class="n"><a id="t40" href="#t40">40</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
123
- <p class="pln"><span class="n"><a id="t41" href="#t41">41</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
124
- <p class="mis show_mis"><span class="n"><a id="t42" href="#t42">42</a></span><span class="t"><span class="key">def</span> <span class="nam">get_telemetry_config_path</span><span class="op">(</span><span class="op">)</span> <span class="op">-></span> <span class="nam">Path</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
125
- <p class="pln"><span class="n"><a id="t43" href="#t43">43</a></span><span class="t"> <span class="str">"""Get the path to the telemetry configuration file."""</span>&nbsp;</span><span class="r"></span></p>
126
- <p class="mis show_mis"><span class="n"><a id="t44" href="#t44">44</a></span><span class="t"> <span class="key">return</span> <span class="nam">Path</span><span class="op">.</span><span class="nam">home</span><span class="op">(</span><span class="op">)</span> <span class="op">/</span> <span class="str">".golf"</span> <span class="op">/</span> <span class="str">"telemetry.json"</span>&nbsp;</span><span class="r"></span></p>
127
- <p class="pln"><span class="n"><a id="t45" href="#t45">45</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
128
- <p class="pln"><span class="n"><a id="t46" href="#t46">46</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
129
- <p class="mis show_mis"><span class="n"><a id="t47" href="#t47">47</a></span><span class="t"><span class="key">def</span> <span class="nam">save_telemetry_preference</span><span class="op">(</span><span class="nam">enabled</span><span class="op">:</span> <span class="nam">bool</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
130
- <p class="pln"><span class="n"><a id="t48" href="#t48">48</a></span><span class="t"> <span class="str">"""Save telemetry preference to persistent storage."""</span>&nbsp;</span><span class="r"></span></p>
131
- <p class="mis show_mis"><span class="n"><a id="t49" href="#t49">49</a></span><span class="t"> <span class="nam">config_path</span> <span class="op">=</span> <span class="nam">get_telemetry_config_path</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
132
- <p class="mis show_mis"><span class="n"><a id="t50" href="#t50">50</a></span><span class="t"> <span class="nam">config_path</span><span class="op">.</span><span class="nam">parent</span><span class="op">.</span><span class="nam">mkdir</span><span class="op">(</span><span class="nam">parents</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">exist_ok</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
133
- <p class="pln"><span class="n"><a id="t51" href="#t51">51</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
134
- <p class="mis show_mis"><span class="n"><a id="t52" href="#t52">52</a></span><span class="t"> <span class="nam">config</span> <span class="op">=</span> <span class="op">{</span><span class="str">"enabled"</span><span class="op">:</span> <span class="nam">enabled</span><span class="op">,</span> <span class="str">"version"</span><span class="op">:</span> <span class="num">1</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
135
- <p class="pln"><span class="n"><a id="t53" href="#t53">53</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
136
- <p class="mis show_mis"><span class="n"><a id="t54" href="#t54">54</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
137
- <p class="mis show_mis"><span class="n"><a id="t55" href="#t55">55</a></span><span class="t"> <span class="key">with</span> <span class="nam">open</span><span class="op">(</span><span class="nam">config_path</span><span class="op">,</span> <span class="str">"w"</span><span class="op">)</span> <span class="key">as</span> <span class="nam">f</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
138
- <p class="mis show_mis"><span class="n"><a id="t56" href="#t56">56</a></span><span class="t"> <span class="nam">json</span><span class="op">.</span><span class="nam">dump</span><span class="op">(</span><span class="nam">config</span><span class="op">,</span> <span class="nam">f</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
139
- <p class="mis show_mis"><span class="n"><a id="t57" href="#t57">57</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
140
- <p class="pln"><span class="n"><a id="t58" href="#t58">58</a></span><span class="t"> <span class="com"># Don't fail if we can't save the preference</span>&nbsp;</span><span class="r"></span></p>
141
- <p class="mis show_mis"><span class="n"><a id="t59" href="#t59">59</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
142
- <p class="pln"><span class="n"><a id="t60" href="#t60">60</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
143
- <p class="pln"><span class="n"><a id="t61" href="#t61">61</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
144
- <p class="mis show_mis"><span class="n"><a id="t62" href="#t62">62</a></span><span class="t"><span class="key">def</span> <span class="nam">load_telemetry_preference</span><span class="op">(</span><span class="op">)</span> <span class="op">-></span> <span class="nam">bool</span> <span class="op">|</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
145
- <p class="pln"><span class="n"><a id="t63" href="#t63">63</a></span><span class="t"> <span class="str">"""Load telemetry preference from persistent storage."""</span>&nbsp;</span><span class="r"></span></p>
146
- <p class="mis show_mis"><span class="n"><a id="t64" href="#t64">64</a></span><span class="t"> <span class="nam">config_path</span> <span class="op">=</span> <span class="nam">get_telemetry_config_path</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
147
- <p class="pln"><span class="n"><a id="t65" href="#t65">65</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
148
- <p class="mis show_mis"><span class="n"><a id="t66" href="#t66">66</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">config_path</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
149
- <p class="mis show_mis"><span class="n"><a id="t67" href="#t67">67</a></span><span class="t"> <span class="key">return</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
150
- <p class="pln"><span class="n"><a id="t68" href="#t68">68</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
151
- <p class="mis show_mis"><span class="n"><a id="t69" href="#t69">69</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
152
- <p class="mis show_mis"><span class="n"><a id="t70" href="#t70">70</a></span><span class="t"> <span class="key">with</span> <span class="nam">open</span><span class="op">(</span><span class="nam">config_path</span><span class="op">)</span> <span class="key">as</span> <span class="nam">f</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
153
- <p class="mis show_mis"><span class="n"><a id="t71" href="#t71">71</a></span><span class="t"> <span class="nam">config</span> <span class="op">=</span> <span class="nam">json</span><span class="op">.</span><span class="nam">load</span><span class="op">(</span><span class="nam">f</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
154
- <p class="mis show_mis"><span class="n"><a id="t72" href="#t72">72</a></span><span class="t"> <span class="key">return</span> <span class="nam">config</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"enabled"</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
155
- <p class="mis show_mis"><span class="n"><a id="t73" href="#t73">73</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
156
- <p class="mis show_mis"><span class="n"><a id="t74" href="#t74">74</a></span><span class="t"> <span class="key">return</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
157
- <p class="pln"><span class="n"><a id="t75" href="#t75">75</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
158
- <p class="pln"><span class="n"><a id="t76" href="#t76">76</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
159
- <p class="mis show_mis"><span class="n"><a id="t77" href="#t77">77</a></span><span class="t"><span class="key">def</span> <span class="nam">is_telemetry_enabled</span><span class="op">(</span><span class="op">)</span> <span class="op">-></span> <span class="nam">bool</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
160
- <p class="pln"><span class="n"><a id="t78" href="#t78">78</a></span><span class="t"> <span class="str">"""Check if telemetry is enabled.</span>&nbsp;</span><span class="r"></span></p>
161
- <p class="pln"><span class="n"><a id="t79" href="#t79">79</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
162
- <p class="pln"><span class="n"><a id="t80" href="#t80">80</a></span><span class="t"><span class="str"> Checks in order:</span>&nbsp;</span><span class="r"></span></p>
163
- <p class="pln"><span class="n"><a id="t81" href="#t81">81</a></span><span class="t"><span class="str"> 1. Cached value</span>&nbsp;</span><span class="r"></span></p>
164
- <p class="pln"><span class="n"><a id="t82" href="#t82">82</a></span><span class="t"><span class="str"> 2. GOLF_TEST_MODE environment variable (always disabled in test mode)</span>&nbsp;</span><span class="r"></span></p>
165
- <p class="pln"><span class="n"><a id="t83" href="#t83">83</a></span><span class="t"><span class="str"> 3. GOLF_TELEMETRY environment variable</span>&nbsp;</span><span class="r"></span></p>
166
- <p class="pln"><span class="n"><a id="t84" href="#t84">84</a></span><span class="t"><span class="str"> 4. Persistent preference file</span>&nbsp;</span><span class="r"></span></p>
167
- <p class="pln"><span class="n"><a id="t85" href="#t85">85</a></span><span class="t"><span class="str"> 5. Default to False (opt-in model)</span>&nbsp;</span><span class="r"></span></p>
168
- <p class="pln"><span class="n"><a id="t86" href="#t86">86</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
169
- <p class="pln"><span class="n"><a id="t87" href="#t87">87</a></span><span class="t"> <span class="key">global</span> <span class="nam">_telemetry_enabled</span>&nbsp;</span><span class="r"></span></p>
170
- <p class="pln"><span class="n"><a id="t88" href="#t88">88</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
171
- <p class="mis show_mis"><span class="n"><a id="t89" href="#t89">89</a></span><span class="t"> <span class="key">if</span> <span class="nam">_telemetry_enabled</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
172
- <p class="mis show_mis"><span class="n"><a id="t90" href="#t90">90</a></span><span class="t"> <span class="key">return</span> <span class="nam">_telemetry_enabled</span>&nbsp;</span><span class="r"></span></p>
173
- <p class="pln"><span class="n"><a id="t91" href="#t91">91</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
174
- <p class="pln"><span class="n"><a id="t92" href="#t92">92</a></span><span class="t"> <span class="com"># Check if we're in test mode (highest priority after cache)</span>&nbsp;</span><span class="r"></span></p>
175
- <p class="mis show_mis"><span class="n"><a id="t93" href="#t93">93</a></span><span class="t"> <span class="key">if</span> <span class="nam">_is_test_mode</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
176
- <p class="mis show_mis"><span class="n"><a id="t94" href="#t94">94</a></span><span class="t"> <span class="nam">_telemetry_enabled</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
177
- <p class="mis show_mis"><span class="n"><a id="t95" href="#t95">95</a></span><span class="t"> <span class="key">return</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
178
- <p class="pln"><span class="n"><a id="t96" href="#t96">96</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
179
- <p class="pln"><span class="n"><a id="t97" href="#t97">97</a></span><span class="t"> <span class="com"># Check environment variables (second highest priority)</span>&nbsp;</span><span class="r"></span></p>
180
- <p class="mis show_mis"><span class="n"><a id="t98" href="#t98">98</a></span><span class="t"> <span class="nam">env_telemetry</span> <span class="op">=</span> <span class="nam">os</span><span class="op">.</span><span class="nam">environ</span><span class="op">.</span><span class="nam">get</span><span class="op">(</span><span class="str">"GOLF_TELEMETRY"</span><span class="op">,</span> <span class="str">""</span><span class="op">)</span><span class="op">.</span><span class="nam">lower</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
181
- <p class="mis show_mis"><span class="n"><a id="t99" href="#t99">99</a></span><span class="t"> <span class="key">if</span> <span class="nam">env_telemetry</span> <span class="key">in</span> <span class="op">(</span><span class="str">"0"</span><span class="op">,</span> <span class="str">"false"</span><span class="op">,</span> <span class="str">"no"</span><span class="op">,</span> <span class="str">"off"</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
182
- <p class="mis show_mis"><span class="n"><a id="t100" href="#t100">100</a></span><span class="t"> <span class="nam">_telemetry_enabled</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
183
- <p class="mis show_mis"><span class="n"><a id="t101" href="#t101">101</a></span><span class="t"> <span class="key">return</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
184
- <p class="mis show_mis"><span class="n"><a id="t102" href="#t102">102</a></span><span class="t"> <span class="key">elif</span> <span class="nam">env_telemetry</span> <span class="key">in</span> <span class="op">(</span><span class="str">"1"</span><span class="op">,</span> <span class="str">"true"</span><span class="op">,</span> <span class="str">"yes"</span><span class="op">,</span> <span class="str">"on"</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
185
- <p class="mis show_mis"><span class="n"><a id="t103" href="#t103">103</a></span><span class="t"> <span class="nam">_telemetry_enabled</span> <span class="op">=</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
186
- <p class="mis show_mis"><span class="n"><a id="t104" href="#t104">104</a></span><span class="t"> <span class="key">return</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
187
- <p class="pln"><span class="n"><a id="t105" href="#t105">105</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
188
- <p class="pln"><span class="n"><a id="t106" href="#t106">106</a></span><span class="t"> <span class="com"># Check persistent preference</span>&nbsp;</span><span class="r"></span></p>
189
- <p class="mis show_mis"><span class="n"><a id="t107" href="#t107">107</a></span><span class="t"> <span class="nam">saved_preference</span> <span class="op">=</span> <span class="nam">load_telemetry_preference</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
190
- <p class="mis show_mis"><span class="n"><a id="t108" href="#t108">108</a></span><span class="t"> <span class="key">if</span> <span class="nam">saved_preference</span> <span class="key">is</span> <span class="key">not</span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
191
- <p class="mis show_mis"><span class="n"><a id="t109" href="#t109">109</a></span><span class="t"> <span class="nam">_telemetry_enabled</span> <span class="op">=</span> <span class="nam">saved_preference</span>&nbsp;</span><span class="r"></span></p>
192
- <p class="mis show_mis"><span class="n"><a id="t110" href="#t110">110</a></span><span class="t"> <span class="key">return</span> <span class="nam">saved_preference</span>&nbsp;</span><span class="r"></span></p>
193
- <p class="pln"><span class="n"><a id="t111" href="#t111">111</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
194
- <p class="pln"><span class="n"><a id="t112" href="#t112">112</a></span><span class="t"> <span class="com"># Default to disabled (opt-in model)</span>&nbsp;</span><span class="r"></span></p>
195
- <p class="mis show_mis"><span class="n"><a id="t113" href="#t113">113</a></span><span class="t"> <span class="nam">_telemetry_enabled</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
196
- <p class="mis show_mis"><span class="n"><a id="t114" href="#t114">114</a></span><span class="t"> <span class="key">return</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
197
- <p class="pln"><span class="n"><a id="t115" href="#t115">115</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
198
- <p class="pln"><span class="n"><a id="t116" href="#t116">116</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
199
- <p class="mis show_mis"><span class="n"><a id="t117" href="#t117">117</a></span><span class="t"><span class="key">def</span> <span class="nam">set_telemetry_enabled</span><span class="op">(</span><span class="nam">enabled</span><span class="op">:</span> <span class="nam">bool</span><span class="op">,</span> <span class="nam">persist</span><span class="op">:</span> <span class="nam">bool</span> <span class="op">=</span> <span class="key">True</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
200
- <p class="pln"><span class="n"><a id="t118" href="#t118">118</a></span><span class="t"> <span class="str">"""Set telemetry enabled state.</span>&nbsp;</span><span class="r"></span></p>
201
- <p class="pln"><span class="n"><a id="t119" href="#t119">119</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
202
- <p class="pln"><span class="n"><a id="t120" href="#t120">120</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
203
- <p class="pln"><span class="n"><a id="t121" href="#t121">121</a></span><span class="t"><span class="str"> enabled: Whether telemetry should be enabled</span>&nbsp;</span><span class="r"></span></p>
204
- <p class="pln"><span class="n"><a id="t122" href="#t122">122</a></span><span class="t"><span class="str"> persist: Whether to save this preference persistently</span>&nbsp;</span><span class="r"></span></p>
205
- <p class="pln"><span class="n"><a id="t123" href="#t123">123</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
206
- <p class="pln"><span class="n"><a id="t124" href="#t124">124</a></span><span class="t"> <span class="key">global</span> <span class="nam">_telemetry_enabled</span>&nbsp;</span><span class="r"></span></p>
207
- <p class="mis show_mis"><span class="n"><a id="t125" href="#t125">125</a></span><span class="t"> <span class="nam">_telemetry_enabled</span> <span class="op">=</span> <span class="nam">enabled</span>&nbsp;</span><span class="r"></span></p>
208
- <p class="pln"><span class="n"><a id="t126" href="#t126">126</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
209
- <p class="mis show_mis"><span class="n"><a id="t127" href="#t127">127</a></span><span class="t"> <span class="key">if</span> <span class="nam">persist</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
210
- <p class="mis show_mis"><span class="n"><a id="t128" href="#t128">128</a></span><span class="t"> <span class="nam">save_telemetry_preference</span><span class="op">(</span><span class="nam">enabled</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
211
- <p class="pln"><span class="n"><a id="t129" href="#t129">129</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
212
- <p class="pln"><span class="n"><a id="t130" href="#t130">130</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
213
- <p class="mis show_mis"><span class="n"><a id="t131" href="#t131">131</a></span><span class="t"><span class="key">def</span> <span class="nam">get_anonymous_id</span><span class="op">(</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
214
- <p class="pln"><span class="n"><a id="t132" href="#t132">132</a></span><span class="t"> <span class="str">"""Get or create a persistent anonymous ID for this machine.</span>&nbsp;</span><span class="r"></span></p>
215
- <p class="pln"><span class="n"><a id="t133" href="#t133">133</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
216
- <p class="pln"><span class="n"><a id="t134" href="#t134">134</a></span><span class="t"><span class="str"> The ID is stored in the user's home directory and is unique per installation.</span>&nbsp;</span><span class="r"></span></p>
217
- <p class="pln"><span class="n"><a id="t135" href="#t135">135</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
218
- <p class="pln"><span class="n"><a id="t136" href="#t136">136</a></span><span class="t"> <span class="key">global</span> <span class="nam">_anonymous_id</span>&nbsp;</span><span class="r"></span></p>
219
- <p class="pln"><span class="n"><a id="t137" href="#t137">137</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
220
- <p class="mis show_mis"><span class="n"><a id="t138" href="#t138">138</a></span><span class="t"> <span class="key">if</span> <span class="nam">_anonymous_id</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
221
- <p class="mis show_mis"><span class="n"><a id="t139" href="#t139">139</a></span><span class="t"> <span class="key">return</span> <span class="nam">_anonymous_id</span>&nbsp;</span><span class="r"></span></p>
222
- <p class="pln"><span class="n"><a id="t140" href="#t140">140</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
223
- <p class="pln"><span class="n"><a id="t141" href="#t141">141</a></span><span class="t"> <span class="com"># Try to load existing ID</span>&nbsp;</span><span class="r"></span></p>
224
- <p class="mis show_mis"><span class="n"><a id="t142" href="#t142">142</a></span><span class="t"> <span class="nam">id_file</span> <span class="op">=</span> <span class="nam">Path</span><span class="op">.</span><span class="nam">home</span><span class="op">(</span><span class="op">)</span> <span class="op">/</span> <span class="str">".golf"</span> <span class="op">/</span> <span class="str">"telemetry_id"</span>&nbsp;</span><span class="r"></span></p>
225
- <p class="pln"><span class="n"><a id="t143" href="#t143">143</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
226
- <p class="mis show_mis"><span class="n"><a id="t144" href="#t144">144</a></span><span class="t"> <span class="key">if</span> <span class="nam">id_file</span><span class="op">.</span><span class="nam">exists</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
227
- <p class="mis show_mis"><span class="n"><a id="t145" href="#t145">145</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
228
- <p class="mis show_mis"><span class="n"><a id="t146" href="#t146">146</a></span><span class="t"> <span class="nam">_anonymous_id</span> <span class="op">=</span> <span class="nam">id_file</span><span class="op">.</span><span class="nam">read_text</span><span class="op">(</span><span class="op">)</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
229
- <p class="pln"><span class="n"><a id="t147" href="#t147">147</a></span><span class="t"> <span class="com"># Check if ID is in the old format (no hyphen between hash and</span>&nbsp;</span><span class="r"></span></p>
230
- <p class="pln"><span class="n"><a id="t148" href="#t148">148</a></span><span class="t"> <span class="com"># random component)</span>&nbsp;</span><span class="r"></span></p>
231
- <p class="pln"><span class="n"><a id="t149" href="#t149">149</a></span><span class="t"> <span class="com"># Old format: golf-[8 chars hash][8 chars random]</span>&nbsp;</span><span class="r"></span></p>
232
- <p class="pln"><span class="n"><a id="t150" href="#t150">150</a></span><span class="t"> <span class="com"># New format: golf-[8 chars hash]-[8 chars random]</span>&nbsp;</span><span class="r"></span></p>
233
- <p class="mis show_mis"><span class="n"><a id="t151" href="#t151">151</a></span><span class="t"> <span class="key">if</span> <span class="nam">_anonymous_id</span> <span class="key">and</span> <span class="nam">_anonymous_id</span><span class="op">.</span><span class="nam">startswith</span><span class="op">(</span><span class="str">"golf-"</span><span class="op">)</span> <span class="key">and</span> <span class="nam">len</span><span class="op">(</span><span class="nam">_anonymous_id</span><span class="op">)</span> <span class="op">==</span> <span class="num">21</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
234
- <p class="pln"><span class="n"><a id="t152" href="#t152">152</a></span><span class="t"> <span class="com"># This is likely the old format, regenerate</span>&nbsp;</span><span class="r"></span></p>
235
- <p class="mis show_mis"><span class="n"><a id="t153" href="#t153">153</a></span><span class="t"> <span class="nam">_anonymous_id</span> <span class="op">=</span> <span class="key">None</span>&nbsp;</span><span class="r"></span></p>
236
- <p class="mis show_mis"><span class="n"><a id="t154" href="#t154">154</a></span><span class="t"> <span class="key">elif</span> <span class="nam">_anonymous_id</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
237
- <p class="mis show_mis"><span class="n"><a id="t155" href="#t155">155</a></span><span class="t"> <span class="key">return</span> <span class="nam">_anonymous_id</span>&nbsp;</span><span class="r"></span></p>
238
- <p class="mis show_mis"><span class="n"><a id="t156" href="#t156">156</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
239
- <p class="mis show_mis"><span class="n"><a id="t157" href="#t157">157</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
240
- <p class="pln"><span class="n"><a id="t158" href="#t158">158</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
241
- <p class="pln"><span class="n"><a id="t159" href="#t159">159</a></span><span class="t"> <span class="com"># Generate new ID with more unique data</span>&nbsp;</span><span class="r"></span></p>
242
- <p class="pln"><span class="n"><a id="t160" href="#t160">160</a></span><span class="t"> <span class="com"># Use only non-identifying system information</span>&nbsp;</span><span class="r"></span></p>
243
- <p class="pln"><span class="n"><a id="t161" href="#t161">161</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
244
- <p class="pln"><span class="n"><a id="t162" href="#t162">162</a></span><span class="t"> <span class="com"># Combine non-identifying factors for uniqueness</span>&nbsp;</span><span class="r"></span></p>
245
- <p class="mis show_mis"><span class="n"><a id="t163" href="#t163">163</a></span><span class="t"> <span class="nam">machine_data</span> <span class="op">=</span> <span class="str">f"{platform.machine()}-{platform.system()}-{platform.python_version()}"</span>&nbsp;</span><span class="r"></span></p>
246
- <p class="mis show_mis"><span class="n"><a id="t164" href="#t164">164</a></span><span class="t"> <span class="nam">machine_hash</span> <span class="op">=</span> <span class="nam">hashlib</span><span class="op">.</span><span class="nam">sha256</span><span class="op">(</span><span class="nam">machine_data</span><span class="op">.</span><span class="nam">encode</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="op">.</span><span class="nam">hexdigest</span><span class="op">(</span><span class="op">)</span><span class="op">[</span><span class="op">:</span><span class="num">8</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
247
- <p class="pln"><span class="n"><a id="t165" href="#t165">165</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
248
- <p class="pln"><span class="n"><a id="t166" href="#t166">166</a></span><span class="t"> <span class="com"># Add a random component to ensure uniqueness</span>&nbsp;</span><span class="r"></span></p>
249
- <p class="mis show_mis"><span class="n"><a id="t167" href="#t167">167</a></span><span class="t"> <span class="nam">random_component</span> <span class="op">=</span> <span class="nam">str</span><span class="op">(</span><span class="nam">uuid</span><span class="op">.</span><span class="nam">uuid4</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="op">.</span><span class="nam">split</span><span class="op">(</span><span class="str">"-"</span><span class="op">)</span><span class="op">[</span><span class="num">0</span><span class="op">]</span> <span class="com"># First 8 chars of UUID</span>&nbsp;</span><span class="r"></span></p>
250
- <p class="pln"><span class="n"><a id="t168" href="#t168">168</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
251
- <p class="pln"><span class="n"><a id="t169" href="#t169">169</a></span><span class="t"> <span class="com"># Use hyphen separator for clarity and ensure PostHog treats these as different IDs</span>&nbsp;</span><span class="r"></span></p>
252
- <p class="mis show_mis"><span class="n"><a id="t170" href="#t170">170</a></span><span class="t"> <span class="nam">_anonymous_id</span> <span class="op">=</span> <span class="str">f"golf-{machine_hash}-{random_component}"</span>&nbsp;</span><span class="r"></span></p>
253
- <p class="pln"><span class="n"><a id="t171" href="#t171">171</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
254
- <p class="pln"><span class="n"><a id="t172" href="#t172">172</a></span><span class="t"> <span class="com"># Try to save for next time</span>&nbsp;</span><span class="r"></span></p>
255
- <p class="mis show_mis"><span class="n"><a id="t173" href="#t173">173</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
256
- <p class="mis show_mis"><span class="n"><a id="t174" href="#t174">174</a></span><span class="t"> <span class="nam">id_file</span><span class="op">.</span><span class="nam">parent</span><span class="op">.</span><span class="nam">mkdir</span><span class="op">(</span><span class="nam">parents</span><span class="op">=</span><span class="key">True</span><span class="op">,</span> <span class="nam">exist_ok</span><span class="op">=</span><span class="key">True</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
257
- <p class="mis show_mis"><span class="n"><a id="t175" href="#t175">175</a></span><span class="t"> <span class="nam">id_file</span><span class="op">.</span><span class="nam">write_text</span><span class="op">(</span><span class="nam">_anonymous_id</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
258
- <p class="mis show_mis"><span class="n"><a id="t176" href="#t176">176</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
259
- <p class="pln"><span class="n"><a id="t177" href="#t177">177</a></span><span class="t"> <span class="com"># Not critical if we can't save</span>&nbsp;</span><span class="r"></span></p>
260
- <p class="mis show_mis"><span class="n"><a id="t178" href="#t178">178</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
261
- <p class="pln"><span class="n"><a id="t179" href="#t179">179</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
262
- <p class="mis show_mis"><span class="n"><a id="t180" href="#t180">180</a></span><span class="t"> <span class="key">return</span> <span class="nam">_anonymous_id</span>&nbsp;</span><span class="r"></span></p>
263
- <p class="pln"><span class="n"><a id="t181" href="#t181">181</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
264
- <p class="pln"><span class="n"><a id="t182" href="#t182">182</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
265
- <p class="mis show_mis"><span class="n"><a id="t183" href="#t183">183</a></span><span class="t"><span class="key">def</span> <span class="nam">initialize_telemetry</span><span class="op">(</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
266
- <p class="pln"><span class="n"><a id="t184" href="#t184">184</a></span><span class="t"> <span class="str">"""Initialize PostHog telemetry if enabled."""</span>&nbsp;</span><span class="r"></span></p>
267
- <p class="pln"><span class="n"><a id="t185" href="#t185">185</a></span><span class="t"> <span class="com"># Ensure PostHog is disabled in test mode</span>&nbsp;</span><span class="r"></span></p>
268
- <p class="mis show_mis"><span class="n"><a id="t186" href="#t186">186</a></span><span class="t"> <span class="nam">_ensure_posthog_disabled_in_test_mode</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
269
- <p class="pln"><span class="n"><a id="t187" href="#t187">187</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
270
- <p class="pln"><span class="n"><a id="t188" href="#t188">188</a></span><span class="t"> <span class="com"># Don't initialize if PostHog is disabled (test mode)</span>&nbsp;</span><span class="r"></span></p>
271
- <p class="mis show_mis"><span class="n"><a id="t189" href="#t189">189</a></span><span class="t"> <span class="key">if</span> <span class="nam">posthog</span><span class="op">.</span><span class="nam">disabled</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
272
- <p class="mis show_mis"><span class="n"><a id="t190" href="#t190">190</a></span><span class="t"> <span class="key">return</span>&nbsp;</span><span class="r"></span></p>
273
- <p class="pln"><span class="n"><a id="t191" href="#t191">191</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
274
- <p class="mis show_mis"><span class="n"><a id="t192" href="#t192">192</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">is_telemetry_enabled</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
275
- <p class="mis show_mis"><span class="n"><a id="t193" href="#t193">193</a></span><span class="t"> <span class="key">return</span>&nbsp;</span><span class="r"></span></p>
276
- <p class="pln"><span class="n"><a id="t194" href="#t194">194</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
277
- <p class="pln"><span class="n"><a id="t195" href="#t195">195</a></span><span class="t"> <span class="com"># Skip initialization if no valid API key (empty or placeholder)</span>&nbsp;</span><span class="r"></span></p>
278
- <p class="mis show_mis"><span class="n"><a id="t196" href="#t196">196</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">POSTHOG_API_KEY</span> <span class="key">or</span> <span class="nam">POSTHOG_API_KEY</span><span class="op">.</span><span class="nam">startswith</span><span class="op">(</span><span class="str">"phc_YOUR"</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
279
- <p class="mis show_mis"><span class="n"><a id="t197" href="#t197">197</a></span><span class="t"> <span class="key">return</span>&nbsp;</span><span class="r"></span></p>
280
- <p class="pln"><span class="n"><a id="t198" href="#t198">198</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
281
- <p class="mis show_mis"><span class="n"><a id="t199" href="#t199">199</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
282
- <p class="mis show_mis"><span class="n"><a id="t200" href="#t200">200</a></span><span class="t"> <span class="nam">posthog</span><span class="op">.</span><span class="nam">project_api_key</span> <span class="op">=</span> <span class="nam">POSTHOG_API_KEY</span>&nbsp;</span><span class="r"></span></p>
283
- <p class="mis show_mis"><span class="n"><a id="t201" href="#t201">201</a></span><span class="t"> <span class="nam">posthog</span><span class="op">.</span><span class="nam">host</span> <span class="op">=</span> <span class="nam">POSTHOG_HOST</span>&nbsp;</span><span class="r"></span></p>
284
- <p class="pln"><span class="n"><a id="t202" href="#t202">202</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
285
- <p class="pln"><span class="n"><a id="t203" href="#t203">203</a></span><span class="t"> <span class="com"># Disable PostHog's own logging to avoid noise</span>&nbsp;</span><span class="r"></span></p>
286
- <p class="mis show_mis"><span class="n"><a id="t204" href="#t204">204</a></span><span class="t"> <span class="nam">posthog</span><span class="op">.</span><span class="nam">disabled</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
287
- <p class="mis show_mis"><span class="n"><a id="t205" href="#t205">205</a></span><span class="t"> <span class="nam">posthog</span><span class="op">.</span><span class="nam">debug</span> <span class="op">=</span> <span class="key">False</span>&nbsp;</span><span class="r"></span></p>
288
- <p class="pln"><span class="n"><a id="t206" href="#t206">206</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
289
- <p class="pln"><span class="n"><a id="t207" href="#t207">207</a></span><span class="t"> <span class="com"># Disable IP collection and GeoIP enrichment at the SDK level</span>&nbsp;</span><span class="r"></span></p>
290
- <p class="mis show_mis"><span class="n"><a id="t208" href="#t208">208</a></span><span class="t"> <span class="nam">posthog</span><span class="op">.</span><span class="nam">set_global_event_properties</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
291
- <p class="pln"><span class="n"><a id="t209" href="#t209">209</a></span><span class="t"> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
292
- <p class="pln"><span class="n"><a id="t210" href="#t210">210</a></span><span class="t"> <span class="str">"$ip"</span><span class="op">:</span> <span class="str">"0"</span><span class="op">,</span> <span class="com"># Override IP with dummy value to prevent collection</span>&nbsp;</span><span class="r"></span></p>
293
- <p class="pln"><span class="n"><a id="t211" href="#t211">211</a></span><span class="t"> <span class="str">"$geoip_disable"</span><span class="op">:</span> <span class="key">True</span><span class="op">,</span> <span class="com"># Disable all GeoIP enrichment</span>&nbsp;</span><span class="r"></span></p>
294
- <p class="pln"><span class="n"><a id="t212" href="#t212">212</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
295
- <p class="pln"><span class="n"><a id="t213" href="#t213">213</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
296
- <p class="pln"><span class="n"><a id="t214" href="#t214">214</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
297
- <p class="mis show_mis"><span class="n"><a id="t215" href="#t215">215</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
298
- <p class="pln"><span class="n"><a id="t216" href="#t216">216</a></span><span class="t"> <span class="com"># Telemetry should never break the application</span>&nbsp;</span><span class="r"></span></p>
299
- <p class="mis show_mis"><span class="n"><a id="t217" href="#t217">217</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
300
- <p class="pln"><span class="n"><a id="t218" href="#t218">218</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
301
- <p class="pln"><span class="n"><a id="t219" href="#t219">219</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
302
- <p class="mis show_mis"><span class="n"><a id="t220" href="#t220">220</a></span><span class="t"><span class="key">def</span> <span class="nam">track_event</span><span class="op">(</span><span class="nam">event_name</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span> <span class="nam">properties</span><span class="op">:</span> <span class="nam">dict</span><span class="op">[</span><span class="nam">str</span><span class="op">,</span> <span class="nam">Any</span><span class="op">]</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
303
- <p class="pln"><span class="n"><a id="t221" href="#t221">221</a></span><span class="t"> <span class="str">"""Track an anonymous event with NO IP address or geolocation data.</span>&nbsp;</span><span class="r"></span></p>
304
- <p class="pln"><span class="n"><a id="t222" href="#t222">222</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
305
- <p class="pln"><span class="n"><a id="t223" href="#t223">223</a></span><span class="t"><span class="str"> IP collection and GeoIP enrichment are disabled at the SDK level to ensure</span>&nbsp;</span><span class="r"></span></p>
306
- <p class="pln"><span class="n"><a id="t224" href="#t224">224</a></span><span class="t"><span class="str"> complete privacy protection. No IP addresses or location data ever reach PostHog.</span>&nbsp;</span><span class="r"></span></p>
307
- <p class="pln"><span class="n"><a id="t225" href="#t225">225</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
308
- <p class="pln"><span class="n"><a id="t226" href="#t226">226</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
309
- <p class="pln"><span class="n"><a id="t227" href="#t227">227</a></span><span class="t"><span class="str"> event_name: Name of the event (e.g., "cli_init", "cli_build")</span>&nbsp;</span><span class="r"></span></p>
310
- <p class="pln"><span class="n"><a id="t228" href="#t228">228</a></span><span class="t"><span class="str"> properties: Optional properties to include with the event</span>&nbsp;</span><span class="r"></span></p>
311
- <p class="pln"><span class="n"><a id="t229" href="#t229">229</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
312
- <p class="pln"><span class="n"><a id="t230" href="#t230">230</a></span><span class="t"> <span class="key">global</span> <span class="nam">_user_identified</span>&nbsp;</span><span class="r"></span></p>
313
- <p class="pln"><span class="n"><a id="t231" href="#t231">231</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
314
- <p class="pln"><span class="n"><a id="t232" href="#t232">232</a></span><span class="t"> <span class="com"># Ensure PostHog is disabled in test mode</span>&nbsp;</span><span class="r"></span></p>
315
- <p class="mis show_mis"><span class="n"><a id="t233" href="#t233">233</a></span><span class="t"> <span class="nam">_ensure_posthog_disabled_in_test_mode</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
316
- <p class="pln"><span class="n"><a id="t234" href="#t234">234</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
317
- <p class="pln"><span class="n"><a id="t235" href="#t235">235</a></span><span class="t"> <span class="com"># Early return if PostHog is disabled (test mode)</span>&nbsp;</span><span class="r"></span></p>
318
- <p class="mis show_mis"><span class="n"><a id="t236" href="#t236">236</a></span><span class="t"> <span class="key">if</span> <span class="nam">posthog</span><span class="op">.</span><span class="nam">disabled</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
319
- <p class="mis show_mis"><span class="n"><a id="t237" href="#t237">237</a></span><span class="t"> <span class="key">return</span>&nbsp;</span><span class="r"></span></p>
320
- <p class="pln"><span class="n"><a id="t238" href="#t238">238</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
321
- <p class="mis show_mis"><span class="n"><a id="t239" href="#t239">239</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">is_telemetry_enabled</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
322
- <p class="mis show_mis"><span class="n"><a id="t240" href="#t240">240</a></span><span class="t"> <span class="key">return</span>&nbsp;</span><span class="r"></span></p>
323
- <p class="pln"><span class="n"><a id="t241" href="#t241">241</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
324
- <p class="pln"><span class="n"><a id="t242" href="#t242">242</a></span><span class="t"> <span class="com"># Skip if no valid API key (empty or placeholder)</span>&nbsp;</span><span class="r"></span></p>
325
- <p class="mis show_mis"><span class="n"><a id="t243" href="#t243">243</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">POSTHOG_API_KEY</span> <span class="key">or</span> <span class="nam">POSTHOG_API_KEY</span><span class="op">.</span><span class="nam">startswith</span><span class="op">(</span><span class="str">"phc_YOUR"</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
326
- <p class="mis show_mis"><span class="n"><a id="t244" href="#t244">244</a></span><span class="t"> <span class="key">return</span>&nbsp;</span><span class="r"></span></p>
327
- <p class="pln"><span class="n"><a id="t245" href="#t245">245</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
328
- <p class="mis show_mis"><span class="n"><a id="t246" href="#t246">246</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
329
- <p class="pln"><span class="n"><a id="t247" href="#t247">247</a></span><span class="t"> <span class="com"># Initialize if needed</span>&nbsp;</span><span class="r"></span></p>
330
- <p class="mis show_mis"><span class="n"><a id="t248" href="#t248">248</a></span><span class="t"> <span class="key">if</span> <span class="nam">posthog</span><span class="op">.</span><span class="nam">project_api_key</span> <span class="op">!=</span> <span class="nam">POSTHOG_API_KEY</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
331
- <p class="mis show_mis"><span class="n"><a id="t249" href="#t249">249</a></span><span class="t"> <span class="nam">initialize_telemetry</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
332
- <p class="pln"><span class="n"><a id="t250" href="#t250">250</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
333
- <p class="pln"><span class="n"><a id="t251" href="#t251">251</a></span><span class="t"> <span class="com"># Get anonymous ID</span>&nbsp;</span><span class="r"></span></p>
334
- <p class="mis show_mis"><span class="n"><a id="t252" href="#t252">252</a></span><span class="t"> <span class="nam">anonymous_id</span> <span class="op">=</span> <span class="nam">get_anonymous_id</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
335
- <p class="pln"><span class="n"><a id="t253" href="#t253">253</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
336
- <p class="pln"><span class="n"><a id="t254" href="#t254">254</a></span><span class="t"> <span class="com"># Only identify the user once per session</span>&nbsp;</span><span class="r"></span></p>
337
- <p class="mis show_mis"><span class="n"><a id="t255" href="#t255">255</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">_user_identified</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
338
- <p class="pln"><span class="n"><a id="t256" href="#t256">256</a></span><span class="t"> <span class="com"># Set person properties to differentiate installations</span>&nbsp;</span><span class="r"></span></p>
339
- <p class="pln"><span class="n"><a id="t257" href="#t257">257</a></span><span class="t"> <span class="com"># Only include non-identifying information</span>&nbsp;</span><span class="r"></span></p>
340
- <p class="mis show_mis"><span class="n"><a id="t258" href="#t258">258</a></span><span class="t"> <span class="nam">person_properties</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
341
- <p class="pln"><span class="n"><a id="t259" href="#t259">259</a></span><span class="t"> <span class="str">"$set"</span><span class="op">:</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
342
- <p class="pln"><span class="n"><a id="t260" href="#t260">260</a></span><span class="t"> <span class="str">"golf_version"</span><span class="op">:</span> <span class="nam">__version__</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
343
- <p class="pln"><span class="n"><a id="t261" href="#t261">261</a></span><span class="t"> <span class="str">"os"</span><span class="op">:</span> <span class="nam">platform</span><span class="op">.</span><span class="nam">system</span><span class="op">(</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
344
- <p class="pln"><span class="n"><a id="t262" href="#t262">262</a></span><span class="t"> <span class="str">"python_version"</span><span class="op">:</span> <span class="op">(</span><span class="str">f"{platform.python_version_tuple()[0]}.{platform.python_version_tuple()[1]}"</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
345
- <p class="pln"><span class="n"><a id="t263" href="#t263">263</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
346
- <p class="pln"><span class="n"><a id="t264" href="#t264">264</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
347
- <p class="pln"><span class="n"><a id="t265" href="#t265">265</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
348
- <p class="pln"><span class="n"><a id="t266" href="#t266">266</a></span><span class="t"> <span class="com"># Identify the user with properties (IP tracking disabled)</span>&nbsp;</span><span class="r"></span></p>
349
- <p class="mis show_mis"><span class="n"><a id="t267" href="#t267">267</a></span><span class="t"> <span class="nam">posthog</span><span class="op">.</span><span class="nam">identify</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
350
- <p class="pln"><span class="n"><a id="t268" href="#t268">268</a></span><span class="t"> <span class="nam">distinct_id</span><span class="op">=</span><span class="nam">anonymous_id</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
351
- <p class="pln"><span class="n"><a id="t269" href="#t269">269</a></span><span class="t"> <span class="nam">properties</span><span class="op">=</span><span class="op">{</span>&nbsp;</span><span class="r"></span></p>
352
- <p class="pln"><span class="n"><a id="t270" href="#t270">270</a></span><span class="t"> <span class="op">**</span><span class="nam">person_properties</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
353
- <p class="pln"><span class="n"><a id="t271" href="#t271">271</a></span><span class="t"> <span class="com"># Explicitly disable IP tracking in identify call</span>&nbsp;</span><span class="r"></span></p>
354
- <p class="pln"><span class="n"><a id="t272" href="#t272">272</a></span><span class="t"> <span class="str">"$ip"</span><span class="op">:</span> <span class="str">"0"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
355
- <p class="pln"><span class="n"><a id="t273" href="#t273">273</a></span><span class="t"> <span class="str">"$geoip_disable"</span><span class="op">:</span> <span class="key">True</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
356
- <p class="pln"><span class="n"><a id="t274" href="#t274">274</a></span><span class="t"> <span class="op">}</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
357
- <p class="pln"><span class="n"><a id="t275" href="#t275">275</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
358
- <p class="pln"><span class="n"><a id="t276" href="#t276">276</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
359
- <p class="mis show_mis"><span class="n"><a id="t277" href="#t277">277</a></span><span class="t"> <span class="nam">_user_identified</span> <span class="op">=</span> <span class="key">True</span>&nbsp;</span><span class="r"></span></p>
360
- <p class="pln"><span class="n"><a id="t278" href="#t278">278</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
361
- <p class="pln"><span class="n"><a id="t279" href="#t279">279</a></span><span class="t"> <span class="com"># Only include minimal, non-identifying properties</span>&nbsp;</span><span class="r"></span></p>
362
- <p class="mis show_mis"><span class="n"><a id="t280" href="#t280">280</a></span><span class="t"> <span class="nam">safe_properties</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
363
- <p class="pln"><span class="n"><a id="t281" href="#t281">281</a></span><span class="t"> <span class="str">"golf_version"</span><span class="op">:</span> <span class="nam">__version__</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
364
- <p class="pln"><span class="n"><a id="t282" href="#t282">282</a></span><span class="t"> <span class="str">"python_version"</span><span class="op">:</span> <span class="op">(</span><span class="str">f"{platform.python_version_tuple()[0]}.{platform.python_version_tuple()[1]}"</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
365
- <p class="pln"><span class="n"><a id="t283" href="#t283">283</a></span><span class="t"> <span class="str">"os"</span><span class="op">:</span> <span class="nam">platform</span><span class="op">.</span><span class="nam">system</span><span class="op">(</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
366
- <p class="pln"><span class="n"><a id="t284" href="#t284">284</a></span><span class="t"> <span class="com"># Explicitly disable IP tracking and GeoIP enrichment</span>&nbsp;</span><span class="r"></span></p>
367
- <p class="pln"><span class="n"><a id="t285" href="#t285">285</a></span><span class="t"> <span class="str">"$ip"</span><span class="op">:</span> <span class="str">"0"</span><span class="op">,</span> <span class="com"># Override IP to prevent collection</span>&nbsp;</span><span class="r"></span></p>
368
- <p class="pln"><span class="n"><a id="t286" href="#t286">286</a></span><span class="t"> <span class="str">"$geoip_disable"</span><span class="op">:</span> <span class="key">True</span><span class="op">,</span> <span class="com"># Disable GeoIP enrichment</span>&nbsp;</span><span class="r"></span></p>
369
- <p class="pln"><span class="n"><a id="t287" href="#t287">287</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
370
- <p class="pln"><span class="n"><a id="t288" href="#t288">288</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
371
- <p class="pln"><span class="n"><a id="t289" href="#t289">289</a></span><span class="t"> <span class="com"># Filter properties to only include safe ones</span>&nbsp;</span><span class="r"></span></p>
372
- <p class="mis show_mis"><span class="n"><a id="t290" href="#t290">290</a></span><span class="t"> <span class="key">if</span> <span class="nam">properties</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
373
- <p class="pln"><span class="n"><a id="t291" href="#t291">291</a></span><span class="t"> <span class="com"># Only include specific safe properties</span>&nbsp;</span><span class="r"></span></p>
374
- <p class="mis show_mis"><span class="n"><a id="t292" href="#t292">292</a></span><span class="t"> <span class="nam">safe_keys</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
375
- <p class="pln"><span class="n"><a id="t293" href="#t293">293</a></span><span class="t"> <span class="str">"success"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
376
- <p class="pln"><span class="n"><a id="t294" href="#t294">294</a></span><span class="t"> <span class="str">"environment"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
377
- <p class="pln"><span class="n"><a id="t295" href="#t295">295</a></span><span class="t"> <span class="str">"template"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
378
- <p class="pln"><span class="n"><a id="t296" href="#t296">296</a></span><span class="t"> <span class="str">"command_type"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
379
- <p class="pln"><span class="n"><a id="t297" href="#t297">297</a></span><span class="t"> <span class="str">"error_type"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
380
- <p class="pln"><span class="n"><a id="t298" href="#t298">298</a></span><span class="t"> <span class="str">"error_message"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
381
- <p class="pln"><span class="n"><a id="t299" href="#t299">299</a></span><span class="t"> <span class="str">"shutdown_type"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
382
- <p class="pln"><span class="n"><a id="t300" href="#t300">300</a></span><span class="t"> <span class="str">"exit_code"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
383
- <p class="pln"><span class="n"><a id="t301" href="#t301">301</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
384
- <p class="mis show_mis"><span class="n"><a id="t302" href="#t302">302</a></span><span class="t"> <span class="key">for</span> <span class="nam">key</span> <span class="key">in</span> <span class="nam">safe_keys</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
385
- <p class="mis show_mis"><span class="n"><a id="t303" href="#t303">303</a></span><span class="t"> <span class="key">if</span> <span class="nam">key</span> <span class="key">in</span> <span class="nam">properties</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
386
- <p class="mis show_mis"><span class="n"><a id="t304" href="#t304">304</a></span><span class="t"> <span class="nam">safe_properties</span><span class="op">[</span><span class="nam">key</span><span class="op">]</span> <span class="op">=</span> <span class="nam">properties</span><span class="op">[</span><span class="nam">key</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
387
- <p class="pln"><span class="n"><a id="t305" href="#t305">305</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
388
- <p class="pln"><span class="n"><a id="t306" href="#t306">306</a></span><span class="t"> <span class="com"># Send event</span>&nbsp;</span><span class="r"></span></p>
389
- <p class="mis show_mis"><span class="n"><a id="t307" href="#t307">307</a></span><span class="t"> <span class="nam">posthog</span><span class="op">.</span><span class="nam">capture</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
390
- <p class="pln"><span class="n"><a id="t308" href="#t308">308</a></span><span class="t"> <span class="nam">distinct_id</span><span class="op">=</span><span class="nam">anonymous_id</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
391
- <p class="pln"><span class="n"><a id="t309" href="#t309">309</a></span><span class="t"> <span class="nam">event</span><span class="op">=</span><span class="nam">event_name</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
392
- <p class="pln"><span class="n"><a id="t310" href="#t310">310</a></span><span class="t"> <span class="nam">properties</span><span class="op">=</span><span class="nam">safe_properties</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
393
- <p class="pln"><span class="n"><a id="t311" href="#t311">311</a></span><span class="t"> <span class="op">)</span>&nbsp;</span><span class="r"></span></p>
394
- <p class="pln"><span class="n"><a id="t312" href="#t312">312</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
395
- <p class="mis show_mis"><span class="n"><a id="t313" href="#t313">313</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
396
- <p class="pln"><span class="n"><a id="t314" href="#t314">314</a></span><span class="t"> <span class="com"># Telemetry should never break the application</span>&nbsp;</span><span class="r"></span></p>
397
- <p class="mis show_mis"><span class="n"><a id="t315" href="#t315">315</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
398
- <p class="pln"><span class="n"><a id="t316" href="#t316">316</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
399
- <p class="pln"><span class="n"><a id="t317" href="#t317">317</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
400
- <p class="mis show_mis"><span class="n"><a id="t318" href="#t318">318</a></span><span class="t"><span class="key">def</span> <span class="nam">track_command</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
401
- <p class="pln"><span class="n"><a id="t319" href="#t319">319</a></span><span class="t"> <span class="nam">command</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
402
- <p class="pln"><span class="n"><a id="t320" href="#t320">320</a></span><span class="t"> <span class="nam">success</span><span class="op">:</span> <span class="nam">bool</span> <span class="op">=</span> <span class="key">True</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
403
- <p class="pln"><span class="n"><a id="t321" href="#t321">321</a></span><span class="t"> <span class="nam">error_type</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
404
- <p class="pln"><span class="n"><a id="t322" href="#t322">322</a></span><span class="t"> <span class="nam">error_message</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
405
- <p class="pln"><span class="n"><a id="t323" href="#t323">323</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
406
- <p class="pln"><span class="n"><a id="t324" href="#t324">324</a></span><span class="t"> <span class="str">"""Track a CLI command execution with minimal info.</span>&nbsp;</span><span class="r"></span></p>
407
- <p class="pln"><span class="n"><a id="t325" href="#t325">325</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
408
- <p class="pln"><span class="n"><a id="t326" href="#t326">326</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
409
- <p class="pln"><span class="n"><a id="t327" href="#t327">327</a></span><span class="t"><span class="str"> command: The command being executed (e.g., "init", "build", "run")</span>&nbsp;</span><span class="r"></span></p>
410
- <p class="pln"><span class="n"><a id="t328" href="#t328">328</a></span><span class="t"><span class="str"> success: Whether the command was successful</span>&nbsp;</span><span class="r"></span></p>
411
- <p class="pln"><span class="n"><a id="t329" href="#t329">329</a></span><span class="t"><span class="str"> error_type: Type of error if command failed (e.g., "ValueError",</span>&nbsp;</span><span class="r"></span></p>
412
- <p class="pln"><span class="n"><a id="t330" href="#t330">330</a></span><span class="t"><span class="str"> "FileNotFoundError")</span>&nbsp;</span><span class="r"></span></p>
413
- <p class="pln"><span class="n"><a id="t331" href="#t331">331</a></span><span class="t"><span class="str"> error_message: Sanitized error message (no sensitive data)</span>&nbsp;</span><span class="r"></span></p>
414
- <p class="pln"><span class="n"><a id="t332" href="#t332">332</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
415
- <p class="mis show_mis"><span class="n"><a id="t333" href="#t333">333</a></span><span class="t"> <span class="nam">properties</span> <span class="op">=</span> <span class="op">{</span><span class="str">"success"</span><span class="op">:</span> <span class="nam">success</span><span class="op">}</span>&nbsp;</span><span class="r"></span></p>
416
- <p class="pln"><span class="n"><a id="t334" href="#t334">334</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
417
- <p class="pln"><span class="n"><a id="t335" href="#t335">335</a></span><span class="t"> <span class="com"># Add error details if command failed</span>&nbsp;</span><span class="r"></span></p>
418
- <p class="mis show_mis"><span class="n"><a id="t336" href="#t336">336</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">success</span> <span class="key">and</span> <span class="op">(</span><span class="nam">error_type</span> <span class="key">or</span> <span class="nam">error_message</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
419
- <p class="mis show_mis"><span class="n"><a id="t337" href="#t337">337</a></span><span class="t"> <span class="key">if</span> <span class="nam">error_type</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
420
- <p class="mis show_mis"><span class="n"><a id="t338" href="#t338">338</a></span><span class="t"> <span class="nam">properties</span><span class="op">[</span><span class="str">"error_type"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">error_type</span>&nbsp;</span><span class="r"></span></p>
421
- <p class="mis show_mis"><span class="n"><a id="t339" href="#t339">339</a></span><span class="t"> <span class="key">if</span> <span class="nam">error_message</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
422
- <p class="pln"><span class="n"><a id="t340" href="#t340">340</a></span><span class="t"> <span class="com"># Sanitize error message - remove file paths and sensitive info</span>&nbsp;</span><span class="r"></span></p>
423
- <p class="mis show_mis"><span class="n"><a id="t341" href="#t341">341</a></span><span class="t"> <span class="nam">sanitized_message</span> <span class="op">=</span> <span class="nam">_sanitize_error_message</span><span class="op">(</span><span class="nam">error_message</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
424
- <p class="mis show_mis"><span class="n"><a id="t342" href="#t342">342</a></span><span class="t"> <span class="nam">properties</span><span class="op">[</span><span class="str">"error_message"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">sanitized_message</span>&nbsp;</span><span class="r"></span></p>
425
- <p class="pln"><span class="n"><a id="t343" href="#t343">343</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
426
- <p class="mis show_mis"><span class="n"><a id="t344" href="#t344">344</a></span><span class="t"> <span class="nam">track_event</span><span class="op">(</span><span class="str">f"cli_{command}"</span><span class="op">,</span> <span class="nam">properties</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
427
- <p class="pln"><span class="n"><a id="t345" href="#t345">345</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
428
- <p class="pln"><span class="n"><a id="t346" href="#t346">346</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
429
- <p class="mis show_mis"><span class="n"><a id="t347" href="#t347">347</a></span><span class="t"><span class="key">def</span> <span class="nam">track_detailed_error</span><span class="op">(</span>&nbsp;</span><span class="r"></span></p>
430
- <p class="pln"><span class="n"><a id="t348" href="#t348">348</a></span><span class="t"> <span class="nam">event_name</span><span class="op">:</span> <span class="nam">str</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
431
- <p class="pln"><span class="n"><a id="t349" href="#t349">349</a></span><span class="t"> <span class="nam">error</span><span class="op">:</span> <span class="nam">Exception</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
432
- <p class="pln"><span class="n"><a id="t350" href="#t350">350</a></span><span class="t"> <span class="nam">context</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
433
- <p class="pln"><span class="n"><a id="t351" href="#t351">351</a></span><span class="t"> <span class="nam">operation</span><span class="op">:</span> <span class="nam">str</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
434
- <p class="pln"><span class="n"><a id="t352" href="#t352">352</a></span><span class="t"> <span class="nam">additional_props</span><span class="op">:</span> <span class="nam">dict</span><span class="op">[</span><span class="nam">str</span><span class="op">,</span> <span class="nam">Any</span><span class="op">]</span> <span class="op">|</span> <span class="key">None</span> <span class="op">=</span> <span class="key">None</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
435
- <p class="pln"><span class="n"><a id="t353" href="#t353">353</a></span><span class="t"><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
436
- <p class="pln"><span class="n"><a id="t354" href="#t354">354</a></span><span class="t"> <span class="str">"""Track a detailed error with enhanced debugging information.</span>&nbsp;</span><span class="r"></span></p>
437
- <p class="pln"><span class="n"><a id="t355" href="#t355">355</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
438
- <p class="pln"><span class="n"><a id="t356" href="#t356">356</a></span><span class="t"><span class="str"> Args:</span>&nbsp;</span><span class="r"></span></p>
439
- <p class="pln"><span class="n"><a id="t357" href="#t357">357</a></span><span class="t"><span class="str"> event_name: Name of the error event (e.g., "cli_run_failed", "cli_build_failed")</span>&nbsp;</span><span class="r"></span></p>
440
- <p class="pln"><span class="n"><a id="t358" href="#t358">358</a></span><span class="t"><span class="str"> error: The exception that occurred</span>&nbsp;</span><span class="r"></span></p>
441
- <p class="pln"><span class="n"><a id="t359" href="#t359">359</a></span><span class="t"><span class="str"> context: Additional context about where the error occurred</span>&nbsp;</span><span class="r"></span></p>
442
- <p class="pln"><span class="n"><a id="t360" href="#t360">360</a></span><span class="t"><span class="str"> operation: The specific operation that failed</span>&nbsp;</span><span class="r"></span></p>
443
- <p class="pln"><span class="n"><a id="t361" href="#t361">361</a></span><span class="t"><span class="str"> additional_props: Additional properties to include</span>&nbsp;</span><span class="r"></span></p>
444
- <p class="pln"><span class="n"><a id="t362" href="#t362">362</a></span><span class="t"><span class="str"> """</span>&nbsp;</span><span class="r"></span></p>
445
- <p class="mis show_mis"><span class="n"><a id="t363" href="#t363">363</a></span><span class="t"> <span class="key">import</span> <span class="nam">traceback</span>&nbsp;</span><span class="r"></span></p>
446
- <p class="mis show_mis"><span class="n"><a id="t364" href="#t364">364</a></span><span class="t"> <span class="key">import</span> <span class="nam">time</span>&nbsp;</span><span class="r"></span></p>
447
- <p class="pln"><span class="n"><a id="t365" href="#t365">365</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
448
- <p class="mis show_mis"><span class="n"><a id="t366" href="#t366">366</a></span><span class="t"> <span class="nam">properties</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
449
- <p class="pln"><span class="n"><a id="t367" href="#t367">367</a></span><span class="t"> <span class="str">"success"</span><span class="op">:</span> <span class="key">False</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
450
- <p class="pln"><span class="n"><a id="t368" href="#t368">368</a></span><span class="t"> <span class="str">"error_type"</span><span class="op">:</span> <span class="nam">type</span><span class="op">(</span><span class="nam">error</span><span class="op">)</span><span class="op">.</span><span class="nam">__name__</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
451
- <p class="pln"><span class="n"><a id="t369" href="#t369">369</a></span><span class="t"> <span class="str">"error_message"</span><span class="op">:</span> <span class="nam">_sanitize_error_message</span><span class="op">(</span><span class="nam">str</span><span class="op">(</span><span class="nam">error</span><span class="op">)</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
452
- <p class="pln"><span class="n"><a id="t370" href="#t370">370</a></span><span class="t"> <span class="str">"timestamp"</span><span class="op">:</span> <span class="nam">int</span><span class="op">(</span><span class="nam">time</span><span class="op">.</span><span class="nam">time</span><span class="op">(</span><span class="op">)</span><span class="op">)</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
453
- <p class="pln"><span class="n"><a id="t371" href="#t371">371</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
454
- <p class="pln"><span class="n"><a id="t372" href="#t372">372</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
455
- <p class="pln"><span class="n"><a id="t373" href="#t373">373</a></span><span class="t"> <span class="com"># Add operation context</span>&nbsp;</span><span class="r"></span></p>
456
- <p class="mis show_mis"><span class="n"><a id="t374" href="#t374">374</a></span><span class="t"> <span class="key">if</span> <span class="nam">operation</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
457
- <p class="mis show_mis"><span class="n"><a id="t375" href="#t375">375</a></span><span class="t"> <span class="nam">properties</span><span class="op">[</span><span class="str">"operation"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">operation</span>&nbsp;</span><span class="r"></span></p>
458
- <p class="mis show_mis"><span class="n"><a id="t376" href="#t376">376</a></span><span class="t"> <span class="key">if</span> <span class="nam">context</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
459
- <p class="mis show_mis"><span class="n"><a id="t377" href="#t377">377</a></span><span class="t"> <span class="nam">properties</span><span class="op">[</span><span class="str">"context"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">context</span>&nbsp;</span><span class="r"></span></p>
460
- <p class="pln"><span class="n"><a id="t378" href="#t378">378</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
461
- <p class="pln"><span class="n"><a id="t379" href="#t379">379</a></span><span class="t"> <span class="com"># Add sanitized stack trace for debugging</span>&nbsp;</span><span class="r"></span></p>
462
- <p class="mis show_mis"><span class="n"><a id="t380" href="#t380">380</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
463
- <p class="mis show_mis"><span class="n"><a id="t381" href="#t381">381</a></span><span class="t"> <span class="nam">tb_lines</span> <span class="op">=</span> <span class="nam">traceback</span><span class="op">.</span><span class="nam">format_exception</span><span class="op">(</span><span class="nam">type</span><span class="op">(</span><span class="nam">error</span><span class="op">)</span><span class="op">,</span> <span class="nam">error</span><span class="op">,</span> <span class="nam">error</span><span class="op">.</span><span class="nam">__traceback__</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
464
- <p class="pln"><span class="n"><a id="t382" href="#t382">382</a></span><span class="t"> <span class="com"># Get the last few frames (most relevant) and sanitize them</span>&nbsp;</span><span class="r"></span></p>
465
- <p class="mis show_mis"><span class="n"><a id="t383" href="#t383">383</a></span><span class="t"> <span class="nam">relevant_frames</span> <span class="op">=</span> <span class="nam">tb_lines</span><span class="op">[</span><span class="op">-</span><span class="num">3</span><span class="op">:</span><span class="op">]</span> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">tb_lines</span><span class="op">)</span> <span class="op">></span> <span class="num">3</span> <span class="key">else</span> <span class="nam">tb_lines</span>&nbsp;</span><span class="r"></span></p>
466
- <p class="mis show_mis"><span class="n"><a id="t384" href="#t384">384</a></span><span class="t"> <span class="nam">sanitized_trace</span> <span class="op">=</span> <span class="op">[</span><span class="op">]</span>&nbsp;</span><span class="r"></span></p>
467
- <p class="pln"><span class="n"><a id="t385" href="#t385">385</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
468
- <p class="mis show_mis"><span class="n"><a id="t386" href="#t386">386</a></span><span class="t"> <span class="key">for</span> <span class="nam">frame</span> <span class="key">in</span> <span class="nam">relevant_frames</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
469
- <p class="pln"><span class="n"><a id="t387" href="#t387">387</a></span><span class="t"> <span class="com"># Sanitize file paths in stack trace</span>&nbsp;</span><span class="r"></span></p>
470
- <p class="mis show_mis"><span class="n"><a id="t388" href="#t388">388</a></span><span class="t"> <span class="nam">sanitized_frame</span> <span class="op">=</span> <span class="nam">_sanitize_error_message</span><span class="op">(</span><span class="nam">frame</span><span class="op">.</span><span class="nam">strip</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
471
- <p class="pln"><span class="n"><a id="t389" href="#t389">389</a></span><span class="t"> <span class="com"># Further sanitize common traceback patterns</span>&nbsp;</span><span class="r"></span></p>
472
- <p class="mis show_mis"><span class="n"><a id="t390" href="#t390">390</a></span><span class="t"> <span class="nam">sanitized_frame</span> <span class="op">=</span> <span class="nam">sanitized_frame</span><span class="op">.</span><span class="nam">replace</span><span class="op">(</span><span class="str">'File "[PATH]'</span><span class="op">,</span> <span class="str">'File "[PATH]'</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
473
- <p class="mis show_mis"><span class="n"><a id="t391" href="#t391">391</a></span><span class="t"> <span class="nam">sanitized_trace</span><span class="op">.</span><span class="nam">append</span><span class="op">(</span><span class="nam">sanitized_frame</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
474
- <p class="pln"><span class="n"><a id="t392" href="#t392">392</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
475
- <p class="mis show_mis"><span class="n"><a id="t393" href="#t393">393</a></span><span class="t"> <span class="nam">properties</span><span class="op">[</span><span class="str">"stack_trace"</span><span class="op">]</span> <span class="op">=</span> <span class="str">" | "</span><span class="op">.</span><span class="nam">join</span><span class="op">(</span><span class="nam">sanitized_trace</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
476
- <p class="pln"><span class="n"><a id="t394" href="#t394">394</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
477
- <p class="pln"><span class="n"><a id="t395" href="#t395">395</a></span><span class="t"> <span class="com"># Add the specific line that caused the error if available</span>&nbsp;</span><span class="r"></span></p>
478
- <p class="mis show_mis"><span class="n"><a id="t396" href="#t396">396</a></span><span class="t"> <span class="key">if</span> <span class="nam">hasattr</span><span class="op">(</span><span class="nam">error</span><span class="op">,</span> <span class="str">"__traceback__"</span><span class="op">)</span> <span class="key">and</span> <span class="nam">error</span><span class="op">.</span><span class="nam">__traceback__</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
479
- <p class="mis show_mis"><span class="n"><a id="t397" href="#t397">397</a></span><span class="t"> <span class="nam">tb</span> <span class="op">=</span> <span class="nam">error</span><span class="op">.</span><span class="nam">__traceback__</span>&nbsp;</span><span class="r"></span></p>
480
- <p class="mis show_mis"><span class="n"><a id="t398" href="#t398">398</a></span><span class="t"> <span class="key">while</span> <span class="nam">tb</span><span class="op">.</span><span class="nam">tb_next</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
481
- <p class="mis show_mis"><span class="n"><a id="t399" href="#t399">399</a></span><span class="t"> <span class="nam">tb</span> <span class="op">=</span> <span class="nam">tb</span><span class="op">.</span><span class="nam">tb_next</span>&nbsp;</span><span class="r"></span></p>
482
- <p class="mis show_mis"><span class="n"><a id="t400" href="#t400">400</a></span><span class="t"> <span class="nam">properties</span><span class="op">[</span><span class="str">"error_line"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">tb</span><span class="op">.</span><span class="nam">tb_lineno</span>&nbsp;</span><span class="r"></span></p>
483
- <p class="pln"><span class="n"><a id="t401" href="#t401">401</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
484
- <p class="mis show_mis"><span class="n"><a id="t402" href="#t402">402</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
485
- <p class="pln"><span class="n"><a id="t403" href="#t403">403</a></span><span class="t"> <span class="com"># Don't fail if we can't capture stack trace</span>&nbsp;</span><span class="r"></span></p>
486
- <p class="mis show_mis"><span class="n"><a id="t404" href="#t404">404</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
487
- <p class="pln"><span class="n"><a id="t405" href="#t405">405</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
488
- <p class="pln"><span class="n"><a id="t406" href="#t406">406</a></span><span class="t"> <span class="com"># Add system context for debugging</span>&nbsp;</span><span class="r"></span></p>
489
- <p class="mis show_mis"><span class="n"><a id="t407" href="#t407">407</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
490
- <p class="mis show_mis"><span class="n"><a id="t408" href="#t408">408</a></span><span class="t"> <span class="nam">properties</span><span class="op">[</span><span class="str">"python_executable"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">_sanitize_error_message</span><span class="op">(</span><span class="nam">platform</span><span class="op">.</span><span class="nam">python_implementation</span><span class="op">(</span><span class="op">)</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
491
- <p class="mis show_mis"><span class="n"><a id="t409" href="#t409">409</a></span><span class="t"> <span class="nam">properties</span><span class="op">[</span><span class="str">"platform_detail"</span><span class="op">]</span> <span class="op">=</span> <span class="nam">platform</span><span class="op">.</span><span class="nam">platform</span><span class="op">(</span><span class="op">)</span><span class="op">[</span><span class="op">:</span><span class="num">50</span><span class="op">]</span> <span class="com"># Limit length</span>&nbsp;</span><span class="r"></span></p>
492
- <p class="mis show_mis"><span class="n"><a id="t410" href="#t410">410</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
493
- <p class="mis show_mis"><span class="n"><a id="t411" href="#t411">411</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
494
- <p class="pln"><span class="n"><a id="t412" href="#t412">412</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
495
- <p class="pln"><span class="n"><a id="t413" href="#t413">413</a></span><span class="t"> <span class="com"># Merge additional properties</span>&nbsp;</span><span class="r"></span></p>
496
- <p class="mis show_mis"><span class="n"><a id="t414" href="#t414">414</a></span><span class="t"> <span class="key">if</span> <span class="nam">additional_props</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
497
- <p class="pln"><span class="n"><a id="t415" href="#t415">415</a></span><span class="t"> <span class="com"># Only include safe additional properties</span>&nbsp;</span><span class="r"></span></p>
498
- <p class="mis show_mis"><span class="n"><a id="t416" href="#t416">416</a></span><span class="t"> <span class="nam">safe_additional_keys</span> <span class="op">=</span> <span class="op">{</span>&nbsp;</span><span class="r"></span></p>
499
- <p class="pln"><span class="n"><a id="t417" href="#t417">417</a></span><span class="t"> <span class="str">"exit_code"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
500
- <p class="pln"><span class="n"><a id="t418" href="#t418">418</a></span><span class="t"> <span class="str">"shutdown_type"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
501
- <p class="pln"><span class="n"><a id="t419" href="#t419">419</a></span><span class="t"> <span class="str">"environment"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
502
- <p class="pln"><span class="n"><a id="t420" href="#t420">420</a></span><span class="t"> <span class="str">"template"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
503
- <p class="pln"><span class="n"><a id="t421" href="#t421">421</a></span><span class="t"> <span class="str">"build_env"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
504
- <p class="pln"><span class="n"><a id="t422" href="#t422">422</a></span><span class="t"> <span class="str">"transport"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
505
- <p class="pln"><span class="n"><a id="t423" href="#t423">423</a></span><span class="t"> <span class="str">"component_count"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
506
- <p class="pln"><span class="n"><a id="t424" href="#t424">424</a></span><span class="t"> <span class="str">"file_path"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
507
- <p class="pln"><span class="n"><a id="t425" href="#t425">425</a></span><span class="t"> <span class="str">"component_type"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
508
- <p class="pln"><span class="n"><a id="t426" href="#t426">426</a></span><span class="t"> <span class="str">"validation_error"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
509
- <p class="pln"><span class="n"><a id="t427" href="#t427">427</a></span><span class="t"> <span class="str">"config_error"</span><span class="op">,</span>&nbsp;</span><span class="r"></span></p>
510
- <p class="pln"><span class="n"><a id="t428" href="#t428">428</a></span><span class="t"> <span class="op">}</span>&nbsp;</span><span class="r"></span></p>
511
- <p class="mis show_mis"><span class="n"><a id="t429" href="#t429">429</a></span><span class="t"> <span class="key">for</span> <span class="nam">key</span><span class="op">,</span> <span class="nam">value</span> <span class="key">in</span> <span class="nam">additional_props</span><span class="op">.</span><span class="nam">items</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
512
- <p class="mis show_mis"><span class="n"><a id="t430" href="#t430">430</a></span><span class="t"> <span class="key">if</span> <span class="nam">key</span> <span class="key">in</span> <span class="nam">safe_additional_keys</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
513
- <p class="mis show_mis"><span class="n"><a id="t431" href="#t431">431</a></span><span class="t"> <span class="nam">properties</span><span class="op">[</span><span class="nam">key</span><span class="op">]</span> <span class="op">=</span> <span class="nam">value</span>&nbsp;</span><span class="r"></span></p>
514
- <p class="pln"><span class="n"><a id="t432" href="#t432">432</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
515
- <p class="mis show_mis"><span class="n"><a id="t433" href="#t433">433</a></span><span class="t"> <span class="nam">track_event</span><span class="op">(</span><span class="nam">event_name</span><span class="op">,</span> <span class="nam">properties</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
516
- <p class="pln"><span class="n"><a id="t434" href="#t434">434</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
517
- <p class="pln"><span class="n"><a id="t435" href="#t435">435</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
518
- <p class="mis show_mis"><span class="n"><a id="t436" href="#t436">436</a></span><span class="t"><span class="key">def</span> <span class="nam">_sanitize_error_message</span><span class="op">(</span><span class="nam">message</span><span class="op">:</span> <span class="nam">str</span><span class="op">)</span> <span class="op">-></span> <span class="nam">str</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
519
- <p class="pln"><span class="n"><a id="t437" href="#t437">437</a></span><span class="t"> <span class="str">"""Sanitize error messages to remove sensitive information."""</span>&nbsp;</span><span class="r"></span></p>
520
- <p class="mis show_mis"><span class="n"><a id="t438" href="#t438">438</a></span><span class="t"> <span class="key">import</span> <span class="nam">re</span>&nbsp;</span><span class="r"></span></p>
521
- <p class="pln"><span class="n"><a id="t439" href="#t439">439</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
522
- <p class="pln"><span class="n"><a id="t440" href="#t440">440</a></span><span class="t"> <span class="com"># Remove file paths but preserve filenames</span>&nbsp;</span><span class="r"></span></p>
523
- <p class="pln"><span class="n"><a id="t441" href="#t441">441</a></span><span class="t"> <span class="com"># Match paths with directories and capture the filename</span>&nbsp;</span><span class="r"></span></p>
524
- <p class="pln"><span class="n"><a id="t442" href="#t442">442</a></span><span class="t"> <span class="com"># Unix style: /path/to/file.py -> file.py</span>&nbsp;</span><span class="r"></span></p>
525
- <p class="mis show_mis"><span class="n"><a id="t443" href="#t443">443</a></span><span class="t"> <span class="nam">message</span> <span class="op">=</span> <span class="nam">re</span><span class="op">.</span><span class="nam">sub</span><span class="op">(</span><span class="str">r"(/[^/\s]+)+/([^/\s]+)"</span><span class="op">,</span> <span class="str">r"\2"</span><span class="op">,</span> <span class="nam">message</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
526
- <p class="pln"><span class="n"><a id="t444" href="#t444">444</a></span><span class="t"> <span class="com"># Windows style: C:\path\to\file.py -> file.py</span>&nbsp;</span><span class="r"></span></p>
527
- <p class="mis show_mis"><span class="n"><a id="t445" href="#t445">445</a></span><span class="t"> <span class="nam">message</span> <span class="op">=</span> <span class="nam">re</span><span class="op">.</span><span class="nam">sub</span><span class="op">(</span><span class="str">r"([A-Za-z]:\\[^\\]+\\)+([^\\]+)"</span><span class="op">,</span> <span class="str">r"\2"</span><span class="op">,</span> <span class="nam">message</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
528
- <p class="pln"><span class="n"><a id="t446" href="#t446">446</a></span><span class="t"> <span class="com"># Remaining absolute paths without filename</span>&nbsp;</span><span class="r"></span></p>
529
- <p class="mis show_mis"><span class="n"><a id="t447" href="#t447">447</a></span><span class="t"> <span class="nam">message</span> <span class="op">=</span> <span class="nam">re</span><span class="op">.</span><span class="nam">sub</span><span class="op">(</span><span class="str">r"[/\\][^\s]*[/\\]"</span><span class="op">,</span> <span class="str">"[PATH]/"</span><span class="op">,</span> <span class="nam">message</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
530
- <p class="pln"><span class="n"><a id="t448" href="#t448">448</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
531
- <p class="pln"><span class="n"><a id="t449" href="#t449">449</a></span><span class="t"> <span class="com"># Remove potential API keys or tokens (common patterns)</span>&nbsp;</span><span class="r"></span></p>
532
- <p class="pln"><span class="n"><a id="t450" href="#t450">450</a></span><span class="t"> <span class="com"># Generic API keys (20+ alphanumeric with underscores/hyphens)</span>&nbsp;</span><span class="r"></span></p>
533
- <p class="mis show_mis"><span class="n"><a id="t451" href="#t451">451</a></span><span class="t"> <span class="nam">message</span> <span class="op">=</span> <span class="nam">re</span><span class="op">.</span><span class="nam">sub</span><span class="op">(</span><span class="str">r"\b[a-zA-Z0-9_-]{32,}\b"</span><span class="op">,</span> <span class="str">"[REDACTED]"</span><span class="op">,</span> <span class="nam">message</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
534
- <p class="pln"><span class="n"><a id="t452" href="#t452">452</a></span><span class="t"> <span class="com"># Bearer tokens</span>&nbsp;</span><span class="r"></span></p>
535
- <p class="mis show_mis"><span class="n"><a id="t453" href="#t453">453</a></span><span class="t"> <span class="nam">message</span> <span class="op">=</span> <span class="nam">re</span><span class="op">.</span><span class="nam">sub</span><span class="op">(</span><span class="str">r"Bearer\s+[a-zA-Z0-9_.-]+"</span><span class="op">,</span> <span class="str">"Bearer [REDACTED]"</span><span class="op">,</span> <span class="nam">message</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
536
- <p class="pln"><span class="n"><a id="t454" href="#t454">454</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
537
- <p class="pln"><span class="n"><a id="t455" href="#t455">455</a></span><span class="t"> <span class="com"># Remove email addresses</span>&nbsp;</span><span class="r"></span></p>
538
- <p class="mis show_mis"><span class="n"><a id="t456" href="#t456">456</a></span><span class="t"> <span class="nam">message</span> <span class="op">=</span> <span class="nam">re</span><span class="op">.</span><span class="nam">sub</span><span class="op">(</span><span class="str">r"\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}\b"</span><span class="op">,</span> <span class="str">"[EMAIL]"</span><span class="op">,</span> <span class="nam">message</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
539
- <p class="pln"><span class="n"><a id="t457" href="#t457">457</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
540
- <p class="pln"><span class="n"><a id="t458" href="#t458">458</a></span><span class="t"> <span class="com"># Remove IP addresses</span>&nbsp;</span><span class="r"></span></p>
541
- <p class="mis show_mis"><span class="n"><a id="t459" href="#t459">459</a></span><span class="t"> <span class="nam">message</span> <span class="op">=</span> <span class="nam">re</span><span class="op">.</span><span class="nam">sub</span><span class="op">(</span><span class="str">r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b"</span><span class="op">,</span> <span class="str">"[IP]"</span><span class="op">,</span> <span class="nam">message</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
542
- <p class="pln"><span class="n"><a id="t460" href="#t460">460</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
543
- <p class="pln"><span class="n"><a id="t461" href="#t461">461</a></span><span class="t"> <span class="com"># Remove port numbers in URLs</span>&nbsp;</span><span class="r"></span></p>
544
- <p class="mis show_mis"><span class="n"><a id="t462" href="#t462">462</a></span><span class="t"> <span class="nam">message</span> <span class="op">=</span> <span class="nam">re</span><span class="op">.</span><span class="nam">sub</span><span class="op">(</span><span class="str">r":[0-9]{2,5}(?=/|$|\s)"</span><span class="op">,</span> <span class="str">":[PORT]"</span><span class="op">,</span> <span class="nam">message</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
545
- <p class="pln"><span class="n"><a id="t463" href="#t463">463</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
546
- <p class="pln"><span class="n"><a id="t464" href="#t464">464</a></span><span class="t"> <span class="com"># Truncate to reasonable length</span>&nbsp;</span><span class="r"></span></p>
547
- <p class="mis show_mis"><span class="n"><a id="t465" href="#t465">465</a></span><span class="t"> <span class="key">if</span> <span class="nam">len</span><span class="op">(</span><span class="nam">message</span><span class="op">)</span> <span class="op">></span> <span class="num">200</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
548
- <p class="mis show_mis"><span class="n"><a id="t466" href="#t466">466</a></span><span class="t"> <span class="nam">message</span> <span class="op">=</span> <span class="nam">message</span><span class="op">[</span><span class="op">:</span><span class="num">197</span><span class="op">]</span> <span class="op">+</span> <span class="str">"..."</span>&nbsp;</span><span class="r"></span></p>
549
- <p class="pln"><span class="n"><a id="t467" href="#t467">467</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
550
- <p class="mis show_mis"><span class="n"><a id="t468" href="#t468">468</a></span><span class="t"> <span class="key">return</span> <span class="nam">message</span>&nbsp;</span><span class="r"></span></p>
551
- <p class="pln"><span class="n"><a id="t469" href="#t469">469</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
552
- <p class="pln"><span class="n"><a id="t470" href="#t470">470</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
553
- <p class="mis show_mis"><span class="n"><a id="t471" href="#t471">471</a></span><span class="t"><span class="key">def</span> <span class="nam">flush</span><span class="op">(</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
554
- <p class="pln"><span class="n"><a id="t472" href="#t472">472</a></span><span class="t"> <span class="str">"""Flush any pending telemetry events."""</span>&nbsp;</span><span class="r"></span></p>
555
- <p class="mis show_mis"><span class="n"><a id="t473" href="#t473">473</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">is_telemetry_enabled</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
556
- <p class="mis show_mis"><span class="n"><a id="t474" href="#t474">474</a></span><span class="t"> <span class="key">return</span>&nbsp;</span><span class="r"></span></p>
557
- <p class="pln"><span class="n"><a id="t475" href="#t475">475</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
558
- <p class="mis show_mis"><span class="n"><a id="t476" href="#t476">476</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
559
- <p class="mis show_mis"><span class="n"><a id="t477" href="#t477">477</a></span><span class="t"> <span class="nam">posthog</span><span class="op">.</span><span class="nam">flush</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
560
- <p class="mis show_mis"><span class="n"><a id="t478" href="#t478">478</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
561
- <p class="pln"><span class="n"><a id="t479" href="#t479">479</a></span><span class="t"> <span class="com"># Ignore flush errors</span>&nbsp;</span><span class="r"></span></p>
562
- <p class="mis show_mis"><span class="n"><a id="t480" href="#t480">480</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
563
- <p class="pln"><span class="n"><a id="t481" href="#t481">481</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
564
- <p class="pln"><span class="n"><a id="t482" href="#t482">482</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
565
- <p class="mis show_mis"><span class="n"><a id="t483" href="#t483">483</a></span><span class="t"><span class="key">def</span> <span class="nam">shutdown</span><span class="op">(</span><span class="op">)</span> <span class="op">-></span> <span class="key">None</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
566
- <p class="pln"><span class="n"><a id="t484" href="#t484">484</a></span><span class="t"> <span class="str">"""Shutdown telemetry and flush pending events."""</span>&nbsp;</span><span class="r"></span></p>
567
- <p class="mis show_mis"><span class="n"><a id="t485" href="#t485">485</a></span><span class="t"> <span class="key">if</span> <span class="key">not</span> <span class="nam">is_telemetry_enabled</span><span class="op">(</span><span class="op">)</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
568
- <p class="mis show_mis"><span class="n"><a id="t486" href="#t486">486</a></span><span class="t"> <span class="key">return</span>&nbsp;</span><span class="r"></span></p>
569
- <p class="pln"><span class="n"><a id="t487" href="#t487">487</a></span><span class="t">&nbsp;</span><span class="r"></span></p>
570
- <p class="mis show_mis"><span class="n"><a id="t488" href="#t488">488</a></span><span class="t"> <span class="key">try</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
571
- <p class="mis show_mis"><span class="n"><a id="t489" href="#t489">489</a></span><span class="t"> <span class="nam">posthog</span><span class="op">.</span><span class="nam">shutdown</span><span class="op">(</span><span class="op">)</span>&nbsp;</span><span class="r"></span></p>
572
- <p class="mis show_mis"><span class="n"><a id="t490" href="#t490">490</a></span><span class="t"> <span class="key">except</span> <span class="nam">Exception</span><span class="op">:</span>&nbsp;</span><span class="r"></span></p>
573
- <p class="pln"><span class="n"><a id="t491" href="#t491">491</a></span><span class="t"> <span class="com"># Ignore shutdown errors</span>&nbsp;</span><span class="r"></span></p>
574
- <p class="mis show_mis"><span class="n"><a id="t492" href="#t492">492</a></span><span class="t"> <span class="key">pass</span>&nbsp;</span><span class="r"></span></p>
575
- </main>
576
- <footer>
577
- <div class="content">
578
- <p>
579
- <a class="nav" href="z_7ba499ed22986217_platform_py.html">&#xab; prev</a> &nbsp; &nbsp;
580
- <a class="nav" href="index.html">&Hat; index</a> &nbsp; &nbsp;
581
- <a class="nav" href="z_7ba499ed22986217_transformer_py.html">&#xbb; next</a>
582
- &nbsp; &nbsp; &nbsp;
583
- <a class="nav" href="https://coverage.readthedocs.io/en/7.6.12">coverage.py v7.6.12</a>,
584
- created at 2025-08-16 18:46 +0200
585
- </p>
586
- </div>
587
- </footer>
588
- </body>
589
- </html>