Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-opentelemetry-test-utils for 
openSUSE:Factory checked in at 2026-09-30 16:22:32
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-opentelemetry-test-utils (Old)
 and      
/work/SRC/openSUSE:Factory/.python-opentelemetry-test-utils.new.1465845 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-opentelemetry-test-utils"

Wed Sep 30 16:22:32 2026 rev:16 rq:1381454 version:0.66b0

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/python-opentelemetry-test-utils/python-opentelemetry-test-utils.changes
  2026-07-21 22:53:09.174856541 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-opentelemetry-test-utils.new.1465845/python-opentelemetry-test-utils.changes
     2026-09-30 16:23:22.392155933 +0200
@@ -1,0 +2,9 @@
+Sat Sep 26 14:15:35 UTC 2026 - ecsos <[email protected]>
+
+- Update to 0.66b0
+  * Added
+    - opentelemetry-test-utils: add CapturingSampler to record what samplers 
receive in instrumentation tests (#5681)
+- Changes from 0.65b0
+  * no changes
+
+-------------------------------------------------------------------

Old:
----
  opentelemetry_test_utils-0.64b0.tar.gz

New:
----
  opentelemetry_test_utils-0.66b0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-opentelemetry-test-utils.spec ++++++
--- /var/tmp/diff_new_pack.KqtRYo/_old  2026-09-30 16:23:22.921178056 +0200
+++ /var/tmp/diff_new_pack.KqtRYo/_new  2026-09-30 16:23:22.923178139 +0200
@@ -18,22 +18,23 @@
 
 %{?sle15_python_module_pythons}
 Name:           python-opentelemetry-test-utils
-Version:        0.64b0
+Version:        0.66b0
 Release:        0
 Summary:        Test utilities for OpenTelemetry unit tests
 License:        Apache-2.0
 URL:            https://github.com/open-telemetry/opentelemetry-python/
 Source:         
https://files.pythonhosted.org/packages/source/o/opentelemetry-test-utils/opentelemetry_test_utils-%{version}.tar.gz
 BuildRequires:  %{python_module asgiref >= 3.0}
+BuildRequires:  %{python_module base >= 3.10}
 BuildRequires:  %{python_module hatchling}
-BuildRequires:  %{python_module opentelemetry-api = 1.43.0}
-BuildRequires:  %{python_module opentelemetry-sdk = 1.43.0}
+BuildRequires:  %{python_module opentelemetry-api = 1.45.0}
+BuildRequires:  %{python_module opentelemetry-sdk = 1.45.0}
 BuildRequires:  %{python_module pip}
 BuildRequires:  fdupes
 BuildRequires:  python-rpm-macros
 Requires:       python-asgiref >= 3.0
-Requires:       python-opentelemetry-api = 1.43.0
-Requires:       python-opentelemetry-sdk = 1.43.0
+Requires:       python-opentelemetry-api = 1.45.0
+Requires:       python-opentelemetry-sdk = 1.45.0
 BuildArch:      noarch
 %python_subpackages
 

++++++ opentelemetry_test_utils-0.64b0.tar.gz -> 
opentelemetry_test_utils-0.66b0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/opentelemetry_test_utils-0.64b0/.gitignore 
new/opentelemetry_test_utils-0.66b0/.gitignore
--- old/opentelemetry_test_utils-0.64b0/.gitignore      2020-02-02 
01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/.gitignore      2020-02-02 
01:00:00.000000000 +0100
@@ -36,6 +36,8 @@
 .cache
 htmlcov
 
+.agent/
+
 # Translations
 *.mo
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/opentelemetry_test_utils-0.64b0/PKG-INFO 
new/opentelemetry_test_utils-0.66b0/PKG-INFO
--- old/opentelemetry_test_utils-0.64b0/PKG-INFO        2020-02-02 
01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/PKG-INFO        2020-02-02 
01:00:00.000000000 +0100
@@ -1,6 +1,6 @@
-Metadata-Version: 2.4
+Metadata-Version: 2.5
 Name: opentelemetry-test-utils
-Version: 0.64b0
+Version: 0.66b0
 Summary: Test utilities for OpenTelemetry unit tests
 Project-URL: Homepage, 
https://github.com/open-telemetry/opentelemetry-python/tests/opentelemetry-test-utils
 Project-URL: Repository, https://github.com/open-telemetry/opentelemetry-python
@@ -18,8 +18,8 @@
 Classifier: Programming Language :: Python :: 3.14
 Requires-Python: >=3.10
 Requires-Dist: asgiref~=3.0
-Requires-Dist: opentelemetry-api==1.43.0
-Requires-Dist: opentelemetry-sdk==1.43.0
+Requires-Dist: opentelemetry-api==1.45.0
+Requires-Dist: opentelemetry-sdk==1.45.0
 Requires-Dist: requests~=2.28
 Description-Content-Type: text/x-rst
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/opentelemetry_test_utils-0.64b0/pyproject.toml 
new/opentelemetry_test_utils-0.66b0/pyproject.toml
--- old/opentelemetry_test_utils-0.64b0/pyproject.toml  2020-02-02 
01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/pyproject.toml  2020-02-02 
01:00:00.000000000 +0100
@@ -26,8 +26,8 @@
 ]
 dependencies = [
   "asgiref ~= 3.0",
-  "opentelemetry-api == 1.43.0",
-  "opentelemetry-sdk == 1.43.0",
+  "opentelemetry-api == 1.45.0",
+  "opentelemetry-sdk == 1.45.0",
   "requests ~= 2.28",
 ]
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/__init__.py 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/__init__.py
--- old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/__init__.py      
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/__init__.py      
2020-02-02 01:00:00.000000000 +0100
@@ -17,11 +17,7 @@
 
         def __exit__(self, type_, value, tb):  # pylint: disable=invalid-name
             if value is not None and type_ in self._exception_types:
-                self._test_case.fail(
-                    "Unexpected exception was raised:\n{}".format(
-                        "\n".join(format_tb(tb))
-                    )
-                )
+                self._test_case.fail("Unexpected exception was 
raised:\n{}".format("\n".join(format_tb(tb))))
 
             return True
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/_otlp_test_server.py 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/_otlp_test_server.py
--- 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/_otlp_test_server.py 
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/_otlp_test_server.py 
    2020-02-02 01:00:00.000000000 +0100
@@ -0,0 +1,326 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+from __future__ import annotations
+
+import gzip
+import time
+import zlib
+from dataclasses import dataclass
+from http.server import BaseHTTPRequestHandler, HTTPServer
+from queue import Empty, Queue
+from threading import Thread
+from typing import TYPE_CHECKING
+from urllib.parse import urlparse
+
+if TYPE_CHECKING:
+    from opentelemetry.proto.common.v1.common_pb2 import InstrumentationScope
+    from opentelemetry.proto.logs.v1.logs_pb2 import LogRecord
+    from opentelemetry.proto.metrics.v1.metrics_pb2 import Metric
+    from opentelemetry.proto.resource.v1.resource_pb2 import Resource
+    from opentelemetry.proto.trace.v1.trace_pb2 import Span
+
+
+@dataclass
+class RecordedSpan:
+    span: Span
+    resource: Resource
+    scope: InstrumentationScope
+
+
+@dataclass
+class RecordedMetric:
+    metric: Metric
+    resource: Resource
+    scope: InstrumentationScope
+
+
+@dataclass
+class RecordedLogRecord:
+    log_record: LogRecord
+    resource: Resource
+    scope: InstrumentationScope
+
+
+def _make_handler(
+    spans_queue: Queue[RecordedSpan],
+    metrics_queue: Queue[RecordedMetric],
+    logs_queue: Queue[RecordedLogRecord],
+    traces_path: str,
+    metrics_path: str,
+    logs_path: str,
+) -> type[BaseHTTPRequestHandler]:
+    # pylint: disable=import-outside-toplevel,no-name-in-module
+    from opentelemetry.proto.collector.logs.v1.logs_service_pb2 import (  # 
noqa: PLC0415
+        ExportLogsServiceRequest,
+        ExportLogsServiceResponse,
+    )
+    from opentelemetry.proto.collector.metrics.v1.metrics_service_pb2 import ( 
 # noqa: PLC0415
+        ExportMetricsServiceRequest,
+        ExportMetricsServiceResponse,
+    )
+    from opentelemetry.proto.collector.trace.v1.trace_service_pb2 import (  # 
noqa: PLC0415
+        ExportTraceServiceRequest,
+        ExportTraceServiceResponse,
+    )
+
+    class _Handler(BaseHTTPRequestHandler):
+        def do_POST(self):  # pylint: disable=invalid-name
+            content_length = int(self.headers.get("Content-Length", 0))
+            body = self._decompress(self.rfile.read(content_length))
+            path = urlparse(self.path).path
+
+            if path == traces_path:
+                response_body = self._handle_traces(body)
+            elif path == metrics_path:
+                response_body = self._handle_metrics(body)
+            elif path == logs_path:
+                response_body = self._handle_logs(body)
+            else:
+                self.send_error(404)
+                return
+
+            self.send_response(200)
+            self.send_header("Content-Type", "application/x-protobuf")
+            self.send_header("Content-Length", str(len(response_body)))
+            self.end_headers()
+            self.wfile.write(response_body)
+
+        def _decompress(self, body: bytes) -> bytes:
+            encoding = self.headers.get("Content-Encoding", "")
+            if encoding == "gzip":
+                return gzip.decompress(body)
+            if encoding == "deflate":
+                return zlib.decompress(body)
+            return body
+
+        @staticmethod
+        def _handle_traces(body: bytes) -> bytes:
+            request = ExportTraceServiceRequest()
+            request.ParseFromString(body)
+            for rs in request.resource_spans:
+                for ss in rs.scope_spans:
+                    for span in ss.spans:
+                        spans_queue.put(RecordedSpan(span=span, 
resource=rs.resource, scope=ss.scope))
+            return ExportTraceServiceResponse().SerializeToString()
+
+        @staticmethod
+        def _handle_metrics(body: bytes) -> bytes:
+            request = ExportMetricsServiceRequest()
+            request.ParseFromString(body)
+            for rm in request.resource_metrics:
+                for sm in rm.scope_metrics:
+                    for metric in sm.metrics:
+                        metrics_queue.put(
+                            RecordedMetric(
+                                metric=metric,
+                                resource=rm.resource,
+                                scope=sm.scope,
+                            )
+                        )
+            return ExportMetricsServiceResponse().SerializeToString()
+
+        @staticmethod
+        def _handle_logs(body: bytes) -> bytes:
+            request = ExportLogsServiceRequest()
+            request.ParseFromString(body)
+            for rl in request.resource_logs:
+                for sl in rl.scope_logs:
+                    for log_record in sl.log_records:
+                        logs_queue.put(
+                            RecordedLogRecord(
+                                log_record=log_record,
+                                resource=rl.resource,
+                                scope=sl.scope,
+                            )
+                        )
+            return ExportLogsServiceResponse().SerializeToString()
+
+        def log_message(self, format, *args):  # pylint: 
disable=redefined-builtin
+            pass
+
+    return _Handler
+
+
+class OtlpProtoTestServer:
+    def __init__(self, host: str = "127.0.0.1", port: int = 0, base_path: str 
= "") -> None:
+        try:
+            # pylint: disable-next=import-outside-toplevel,unused-import
+            import opentelemetry.proto  # noqa: PLC0415, F401
+        except ImportError:
+            raise ImportError(
+                "opentelemetry-proto is required to use OtlpProtoTestServer. "
+                "Install it with: pip install opentelemetry-proto"
+            ) from None
+        self._host = host
+        self._port = port
+        self._base_path = base_path.rstrip("/")
+        self._spans_queue: Queue[RecordedSpan] = Queue()
+        self._metrics_queue: Queue[RecordedMetric] = Queue()
+        self._logs_queue: Queue[RecordedLogRecord] = Queue()
+        self._server: HTTPServer | None = None
+        self._thread: Thread | None = None
+
+    def start(self) -> OtlpProtoTestServer:
+        handler = _make_handler(
+            self._spans_queue,
+            self._metrics_queue,
+            self._logs_queue,
+            f"{self._base_path}/v1/traces",
+            f"{self._base_path}/v1/metrics",
+            f"{self._base_path}/v1/logs",
+        )
+        self._server = HTTPServer((self._host, self._port), handler)
+        self._port = self._server.server_address[1]
+        self._thread = Thread(
+            target=self._server.serve_forever,
+            daemon=True,
+            name="OtlpProtoTestServer",
+        )
+        self._thread.start()
+        return self
+
+    def stop(self) -> None:
+        if self._server is not None:
+            self._server.shutdown()
+            if self._thread is not None:
+                self._thread.join()
+            self._server.server_close()
+
+    def __enter__(self) -> OtlpProtoTestServer:
+        return self.start()
+
+    def __exit__(self, *exc: object) -> None:
+        self.stop()
+
+    @property
+    def port(self) -> int:
+        return self._port
+
+    @property
+    def traces_endpoint(self) -> str:
+        return f"http://{self._host}:{self._port}{self._base_path}/v1/traces";
+
+    @property
+    def metrics_endpoint(self) -> str:
+        return f"http://{self._host}:{self._port}{self._base_path}/v1/metrics";
+
+    @property
+    def logs_endpoint(self) -> str:
+        return f"http://{self._host}:{self._port}{self._base_path}/v1/logs";
+
+    def get_span(self, timeout: float = 5.0) -> RecordedSpan:
+        try:
+            return self._spans_queue.get(timeout=timeout)
+        except Empty:
+            raise TimeoutError(f"No span received within {timeout}s") from None
+
+    def get_spans(self, count: int = 1, timeout: float = 5.0) -> 
list[RecordedSpan]:
+        deadline = time.monotonic() + timeout
+        spans = []
+        for _ in range(count):
+            remaining = deadline - time.monotonic()
+            if remaining <= 0:
+                raise TimeoutError(f"Timed out after receiving 
{len(spans)}/{count} spans")
+            spans.append(self.get_span(timeout=remaining))
+        return spans
+
+    def wait_for_span(self, *, name: str | None = None, timeout: float = 5.0) 
-> RecordedSpan:
+        deadline = time.monotonic() + timeout
+        while True:
+            remaining = deadline - time.monotonic()
+            if remaining <= 0:
+                raise TimeoutError(f"No span with name={name!r} received 
within {timeout}s")
+            try:
+                recorded = self._spans_queue.get(timeout=remaining)
+            except Empty:
+                raise TimeoutError(f"No span with name={name!r} received 
within {timeout}s") from None
+            if name is None or recorded.span.name == name:
+                return recorded
+
+    def drain_spans(self) -> list[RecordedSpan]:
+        result = []
+        while True:
+            try:
+                result.append(self._spans_queue.get_nowait())
+            except Empty:
+                return result
+
+    def get_metric(self, timeout: float = 5.0) -> RecordedMetric:
+        try:
+            return self._metrics_queue.get(timeout=timeout)
+        except Empty:
+            raise TimeoutError(f"No metric received within {timeout}s") from 
None
+
+    def get_metrics(self, count: int = 1, timeout: float = 5.0) -> 
list[RecordedMetric]:
+        deadline = time.monotonic() + timeout
+        metrics = []
+        for _ in range(count):
+            remaining = deadline - time.monotonic()
+            if remaining <= 0:
+                raise TimeoutError(f"Timed out after receiving 
{len(metrics)}/{count} metrics")
+            metrics.append(self.get_metric(timeout=remaining))
+        return metrics
+
+    def wait_for_metric(self, *, name: str | None = None, timeout: float = 
5.0) -> RecordedMetric:
+        deadline = time.monotonic() + timeout
+        while True:
+            remaining = deadline - time.monotonic()
+            if remaining <= 0:
+                raise TimeoutError(f"No metric with name={name!r} received 
within {timeout}s")
+            try:
+                recorded = self._metrics_queue.get(timeout=remaining)
+            except Empty:
+                raise TimeoutError(f"No metric with name={name!r} received 
within {timeout}s") from None
+            if name is None or recorded.metric.name == name:
+                return recorded
+
+    def drain_metrics(self) -> list[RecordedMetric]:
+        result = []
+        while True:
+            try:
+                result.append(self._metrics_queue.get_nowait())
+            except Empty:
+                return result
+
+    def get_log_record(self, timeout: float = 5.0) -> RecordedLogRecord:
+        try:
+            return self._logs_queue.get(timeout=timeout)
+        except Empty:
+            raise TimeoutError(f"No log record received within {timeout}s") 
from None
+
+    def get_log_records(self, count: int = 1, timeout: float = 5.0) -> 
list[RecordedLogRecord]:
+        deadline = time.monotonic() + timeout
+        log_records = []
+        for _ in range(count):
+            remaining = deadline - time.monotonic()
+            if remaining <= 0:
+                raise TimeoutError(f"Timed out after receiving 
{len(log_records)}/{count} log records")
+            log_records.append(self.get_log_record(timeout=remaining))
+        return log_records
+
+    def wait_for_log_record(self, *, timeout: float = 5.0) -> 
RecordedLogRecord:
+        try:
+            return self._logs_queue.get(timeout=timeout)
+        except Empty:
+            raise TimeoutError(f"No log record received within {timeout}s") 
from None
+
+    def drain_log_records(self) -> list[RecordedLogRecord]:
+        result = []
+        while True:
+            try:
+                result.append(self._logs_queue.get_nowait())
+            except Empty:
+                return result
+
+    def clear(self) -> None:
+        for queue in (
+            self._spans_queue,
+            self._metrics_queue,
+            self._logs_queue,
+        ):
+            while True:
+                try:
+                    queue.get_nowait()
+                except Empty:
+                    break
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/asgitestutil.py 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/asgitestutil.py
--- old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/asgitestutil.py  
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/asgitestutil.py  
2020-02-02 01:00:00.000000000 +0100
@@ -35,25 +35,19 @@
 
     def tearDown(self):
         if self.communicator:
-            asyncio.get_event_loop().run_until_complete(
-                self.communicator.wait()
-            )
+            
asyncio.get_event_loop().run_until_complete(self.communicator.wait())
 
     def seed_app(self, app):
         self.communicator = ApplicationCommunicator(app, self.scope)
 
     def send_input(self, message):
-        asyncio.get_event_loop().run_until_complete(
-            self.communicator.send_input(message)
-        )
+        
asyncio.get_event_loop().run_until_complete(self.communicator.send_input(message))
 
     def send_default_request(self):
         self.send_input({"type": "http.request", "body": b""})
 
     def get_output(self):
-        output = asyncio.get_event_loop().run_until_complete(
-            self.communicator.receive_output(0)
-        )
+        output = 
asyncio.get_event_loop().run_until_complete(self.communicator.receive_output(0))
         return output
 
     def get_all_output(self):
@@ -76,9 +70,7 @@
 
     def tearDown(self):
         if self.communicator:
-            asyncio.get_event_loop().run_until_complete(
-                self.communicator.wait()
-            )
+            
asyncio.get_event_loop().run_until_complete(self.communicator.wait())
 
     def seed_app(self, app):
         self.communicator = ApplicationCommunicator(app, self.scope)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/concurrency_test.py 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/concurrency_test.py
--- 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/concurrency_test.py  
    2020-02-02 01:00:00.000000000 +0100
+++ 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/concurrency_test.py  
    2020-02-02 01:00:00.000000000 +0100
@@ -68,10 +68,7 @@
             barrier.wait()
             results[idx] = func_to_test()
 
-        threads = [
-            threading.Thread(target=partial(thread_start, i))
-            for i in range(num_threads)
-        ]
+        threads = [threading.Thread(target=partial(thread_start, i)) for i in 
range(num_threads)]
         for thread in threads:
             thread.start()
         for thread in threads:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/globals_test.py 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/globals_test.py
--- old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/globals_test.py  
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/globals_test.py  
2020-02-02 01:00:00.000000000 +0100
@@ -36,16 +36,10 @@
 
 # pylint: disable=protected-access
 def reset_event_globals() -> None:
-    """WARNING: only use this for tests."""
-    from opentelemetry import (  # pylint: disable=import-outside-toplevel # 
noqa: PLC0415
-        _events as events_api,
-    )
-
-    events_api._EVENT_LOGGER_PROVIDER_SET_ONCE = Once()  # type: 
ignore[attr-defined]
-    events_api._EVENT_LOGGER_PROVIDER = None  # type: ignore[attr-defined]
-    events_api._PROXY_EVENT_LOGGER_PROVIDER = (
-        events_api.ProxyEventLoggerProvider()
-    )  # type: ignore[attr-defined]
+    """Deprecated no-op kept for backward compatibility.
+
+    The Events API has been removed; this function does nothing.
+    """
 
 
 class TraceGlobalsTest(unittest.TestCase):
@@ -94,15 +88,13 @@
 
 
 class EventsGlobalsTest(unittest.TestCase):
-    """Resets logging API globals in setUp/tearDown
+    """Deprecated no-op kept for backward compatibility.
 
-    Use as a base class or mixin for your test that modifies logging API 
globals.
+    The Events API has been removed; this class does nothing.
     """
 
-    def setUp(self) -> None:
+    def setUp(self) -> None:  # pylint: disable=useless-parent-delegation
         super().setUp()
-        reset_event_globals()
 
-    def tearDown(self) -> None:
+    def tearDown(self) -> None:  # pylint: disable=useless-parent-delegation
         super().tearDown()
-        reset_event_globals()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/httptest.py 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/httptest.py
--- old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/httptest.py      
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/httptest.py      
2020-02-02 01:00:00.000000000 +0100
@@ -39,9 +39,7 @@
     @classmethod
     def run_server(cls):
         httpd = cls.create_server()
-        worker = Thread(
-            target=httpd.serve_forever, daemon=True, name="Test server worker"
-        )
+        worker = Thread(target=httpd.serve_forever, daemon=True, name="Test 
server worker")
         worker.start()
         return worker, httpd
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/metrictestutil.py 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/metrictestutil.py
--- 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/metrictestutil.py    
    2020-02-02 01:00:00.000000000 +0100
+++ 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/metrictestutil.py    
    2020-02-02 01:00:00.000000000 +0100
@@ -15,9 +15,7 @@
 from opentelemetry.util.types import Attributes
 
 
-def _generate_metric(
-    name, data, attributes=None, description=None, unit=None
-) -> Metric:
+def _generate_metric(name, data, attributes=None, description=None, unit=None) 
-> Metric:
     if description is None:
         description = "foo"
     if unit is None:
@@ -59,9 +57,7 @@
     )
 
 
-def _generate_gauge(
-    name, value, attributes=None, description=None, unit=None
-) -> Metric:
+def _generate_gauge(name, value, attributes=None, description=None, unit=None) 
-> Metric:
     if attributes is None:
         attributes = BoundedAttributes(attributes={"a": 1, "b": True})
     return _generate_metric(
@@ -81,9 +77,7 @@
     )
 
 
-def _generate_unsupported_metric(
-    name, attributes=None, description=None, unit=None
-) -> Metric:
+def _generate_unsupported_metric(name, attributes=None, description=None, 
unit=None) -> Metric:
     return _generate_metric(
         name,
         None,
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/mock_textmap.py 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/mock_textmap.py
--- old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/mock_textmap.py  
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/mock_textmap.py  
2020-02-02 01:00:00.000000000 +0100
@@ -80,12 +80,8 @@
         setter: Setter = default_setter,
     ) -> None:
         span = trace.get_current_span(context)
-        setter.set(
-            carrier, self.TRACE_ID_KEY, str(span.get_span_context().trace_id)
-        )
-        setter.set(
-            carrier, self.SPAN_ID_KEY, str(span.get_span_context().span_id)
-        )
+        setter.set(carrier, self.TRACE_ID_KEY, 
str(span.get_span_context().trace_id))
+        setter.set(carrier, self.SPAN_ID_KEY, 
str(span.get_span_context().span_id))
 
     @property
     def fields(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/samplertestutil.py 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/samplertestutil.py
--- 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/samplertestutil.py   
    1970-01-01 01:00:00.000000000 +0100
+++ 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/samplertestutil.py   
    2020-02-02 01:00:00.000000000 +0100
@@ -0,0 +1,67 @@
+# Copyright The OpenTelemetry Authors
+# SPDX-License-Identifier: Apache-2.0
+
+from __future__ import annotations
+
+from collections.abc import Sequence
+
+from opentelemetry.context import Context
+from opentelemetry.sdk.trace.sampling import Decision, Sampler, SamplingResult
+from opentelemetry.trace import Link, SpanKind, TraceState, get_current_span
+from opentelemetry.util.types import Attributes, AttributeValue
+
+
+class CapturingSampler(Sampler):
+    """Sampler that records what the SDK passes to ``should_sample``.
+
+    Instrumentation tests use it to assert which span kind and attributes a
+    sampler can see when a span starts, for example request headers that have
+    to be available for sampling decisions.
+
+    Every span is recorded and sampled unless ``required_attributes`` is given,
+    in which case a span is dropped when any of these attributes is missing or
+    has a different value.
+    """
+
+    name: str | None
+    kind: SpanKind | None
+    attributes: dict[str, AttributeValue]
+
+    def __init__(self, required_attributes: Attributes = None) -> None:
+        self.required_attributes = dict(required_attributes or {})
+        self.name = None
+        self.kind = None
+        self.attributes = {}
+
+    def should_sample(
+        self,
+        parent_context: Context | None,
+        trace_id: int,
+        name: str,
+        kind: SpanKind | None = None,
+        attributes: Attributes = None,
+        links: Sequence[Link] | None = None,
+        trace_state: TraceState | None = None,
+    ) -> SamplingResult:
+        self.name = name
+        self.kind = kind
+        # Snapshot now so attributes set after span creation cannot hide a 
regression.
+        self.attributes = dict(attributes or {})
+
+        decision = Decision.RECORD_AND_SAMPLE
+        if any(
+            key not in self.attributes or self.attributes[key] != value
+            for key, value in self.required_attributes.items()
+        ):
+            decision = Decision.DROP
+            attributes = None
+
+        parent_span_context = 
get_current_span(parent_context).get_span_context()
+        return SamplingResult(
+            decision,
+            attributes,
+            parent_span_context.trace_state if parent_span_context.is_valid 
else None,
+        )
+
+    def get_description(self) -> str:
+        return "CapturingSampler"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/spantestutil.py 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/spantestutil.py
--- old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/spantestutil.py  
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/spantestutil.py  
2020-02-02 01:00:00.000000000 +0100
@@ -36,9 +36,7 @@
         span_limits=trace_sdk.SpanLimits(),
         resource=Resource(attributes=attributes),
     )
-    with tracer.start_as_current_span(
-        "span", links=links, attributes=attributes
-    ) as span:
+    with tracer.start_as_current_span("span", links=links, 
attributes=attributes) as span:
         for index in range(131):
             span.add_event(f"event{index}", attributes=attributes)
         return span
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/test_base.py 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/test_base.py
--- old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/test_base.py     
2020-02-02 01:00:00.000000000 +0100
+++ new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/test_base.py     
2020-02-02 01:00:00.000000000 +0100
@@ -58,15 +58,11 @@
         reset_metrics_globals()
 
     def get_finished_spans(self):
-        return FinishedTestSpans(
-            self, self.memory_exporter.get_finished_spans()
-        )
+        return FinishedTestSpans(self, 
self.memory_exporter.get_finished_spans())
 
     def assertEqualSpanInstrumentationScope(self, span, module):
         self.assertEqual(span.instrumentation_scope.name, module.__name__)
-        self.assertEqual(
-            span.instrumentation_scope.version, module.__version__
-        )
+        self.assertEqual(span.instrumentation_scope.version, 
module.__version__)
 
     def assertSpanHasAttributes(self, span, attributes):
         for key, val in attributes.items():
@@ -139,9 +135,7 @@
                    all metrics are returned.
         """
         metrics_data = self.memory_metrics_reader.get_metrics_data()
-        resource_metrics = (
-            metrics_data.resource_metrics if metrics_data else []
-        )
+        resource_metrics = metrics_data.resource_metrics if metrics_data else 
[]
 
         all_metrics = []
         for metrics in resource_metrics:
@@ -168,13 +162,9 @@
         expected_data_points: Sequence[DataPointT],
         est_value_delta: float | None = 0,
     ):
-        self.assertEqual(
-            len(expected_data_points), len(metric.data.data_points)
-        )
+        self.assertEqual(len(expected_data_points), 
len(metric.data.data_points))
         for expected_data_point in expected_data_points:
-            self.assert_data_point_expected(
-                expected_data_point, metric.data.data_points, est_value_delta
-            )
+            self.assert_data_point_expected(expected_data_point, 
metric.data.data_points, est_value_delta)
 
     # pylint: disable=unidiomatic-typecheck
     @staticmethod
@@ -183,9 +173,7 @@
         data_point: DataPointT,
         est_value_delta: float | None = 0,
     ):
-        if type(expected_data_point) != type(  # noqa: E721
-            data_point
-        ) or not isinstance(
+        if type(expected_data_point) != type(data_point) or not isinstance(  # 
noqa: E721
             expected_data_point, (HistogramDataPoint, NumberDataPoint)
         ):
             return False
@@ -197,23 +185,14 @@
             values_diff = abs(expected_data_point.sum - data_point.sum)
             if expected_data_point.count != data_point.count or (
                 est_value_delta == 0
-                and (
-                    expected_data_point.min != data_point.min
-                    or expected_data_point.max != data_point.max
-                )
+                and (expected_data_point.min != data_point.min or 
expected_data_point.max != data_point.max)
             ):
                 return False
 
-            if (
-                expected_data_point.explicit_bounds
-                != data_point.explicit_bounds
-            ):
+            if expected_data_point.explicit_bounds != 
data_point.explicit_bounds:
                 return False
 
-        return (
-            values_diff <= est_value_delta
-            and expected_data_point.attributes == dict(data_point.attributes)
-        )
+        return values_diff <= est_value_delta and 
expected_data_point.attributes == dict(data_point.attributes)
 
     def assert_data_point_expected(
         self,
@@ -223,9 +202,7 @@
     ):
         is_data_point_exist = False
         for data_point in data_points:
-            if self.is_data_points_equal(
-                expected_data_point, data_point, est_value_delta
-            ):
+            if self.is_data_points_equal(expected_data_point, data_point, 
est_value_delta):
                 is_data_point_exist = True
                 break
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/version/__init__.py 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/version/__init__.py
--- 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/version/__init__.py  
    2020-02-02 01:00:00.000000000 +0100
+++ 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/version/__init__.py  
    2020-02-02 01:00:00.000000000 +0100
@@ -1,4 +1,4 @@
 # Copyright The OpenTelemetry Authors
 # SPDX-License-Identifier: Apache-2.0
 
-__version__ = "0.64b0"
+__version__ = "0.66b0"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/weaver_live_check.py 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/weaver_live_check.py
--- 
old/opentelemetry_test_utils-0.64b0/src/opentelemetry/test/weaver_live_check.py 
    2020-02-02 01:00:00.000000000 +0100
+++ 
new/opentelemetry_test_utils-0.66b0/src/opentelemetry/test/weaver_live_check.py 
    2020-02-02 01:00:00.000000000 +0100
@@ -47,11 +47,9 @@
             result: list[dict] = []
             lcr = obj.get("live_check_result")
             if isinstance(lcr, dict):
-                advices = lcr.get("all_advice")
-                if isinstance(advices, list):
-                    result.extend(
-                        a for a in advices if a.get("level") == "violation"
-                    )
+                advice_list = lcr.get("all_advice")
+                if isinstance(advice_list, list):
+                    result.extend(a for a in advice_list if a.get("level") == 
"violation")
             for value in obj.values():
                 result.extend(_collect(value))
             return result
@@ -67,9 +65,7 @@
         key = (
             violation.get("id"),
             violation.get("message"),
-            json.dumps(ctx, sort_keys=True)
-            if isinstance(ctx, (dict, list))
-            else ctx,
+            json.dumps(ctx, sort_keys=True) if isinstance(ctx, (dict, list)) 
else ctx,
             violation.get("signal_name"),
             violation.get("signal_type"),
         )
@@ -79,9 +75,7 @@
         {
             "id": k[0],
             "message": k[1],
-            "context": vs[0].get(
-                "context"
-            ),  # preserve original dict, not JSON string
+            "context": vs[0].get("context"),  # preserve original dict, not 
JSON string
             "signal_name": k[3],
             "signal_type": k[4],
             "count": len(vs),
@@ -122,8 +116,7 @@
 
         err = exc_info.value
         assert any(
-            v["id"] == "my_policy_check"
-            and v["context"]["attribute_name"] == "my.attribute"
+            v["id"] == "my_policy_check" and v["context"]["attribute_name"] == 
"my.attribute"
             for v in err.report.violations
         )
     """
@@ -151,9 +144,7 @@
 
         report = weaver.end()
         assert any(
-            v["id"] == "my_policy_check"
-            and v["context"]["attribute_name"] == "my.attribute"
-            for v in report.violations
+            v["id"] == "my_policy_check" and v["context"]["attribute_name"] == 
"my.attribute" for v in report.violations
         )
     """
 
@@ -200,9 +191,7 @@
 
         def test_my_telemetry(self):
             with WeaverLiveCheck() as weaver:
-                exporter = OTLPSpanExporter(
-                    endpoint=weaver.otlp_endpoint, insecure=True
-                )
+                exporter = OTLPSpanExporter(endpoint=weaver.otlp_endpoint, 
insecure=True)
                 # ... configure provider, emit telemetry ...
                 provider.force_flush()
 
@@ -258,8 +247,7 @@
         weaver_bin = shutil.which("weaver")
         if not weaver_bin:
             raise RuntimeError(
-                "weaver binary not found on PATH. "
-                "Install it from 
https://github.com/open-telemetry/weaver/releases";
+                "weaver binary not found on PATH. Install it from 
https://github.com/open-telemetry/weaver/releases";
             )
 
         self._otlp_port = otlp_port or _find_free_port()
@@ -302,7 +290,7 @@
     def __enter__(self) -> "WeaverLiveCheck":
         return self.start()
 
-    def __exit__(self, exc_type: Any, *_: Any) -> None:
+    def __exit__(self, exc_type: Any, *_: object) -> None:
         if exc_type is not None:
             self._stopped = True
         self.close()
@@ -310,12 +298,8 @@
     def start(self) -> "WeaverLiveCheck":
         logger.debug("Starting WeaverLiveCheck process...")
         # Redirect weaver's stdout/stderr to tempfiles
-        stdout_fd, self._stdout_path = tempfile.mkstemp(
-            prefix="weaver-stdout-", suffix=".log"
-        )
-        stderr_fd, self._stderr_path = tempfile.mkstemp(
-            prefix="weaver-stderr-", suffix=".log"
-        )
+        stdout_fd, self._stdout_path = 
tempfile.mkstemp(prefix="weaver-stdout-", suffix=".log")
+        stderr_fd, self._stderr_path = 
tempfile.mkstemp(prefix="weaver-stderr-", suffix=".log")
         try:
             self._process = subprocess.Popen(  # pylint: 
disable=consider-using-with
                 self._command,
@@ -330,9 +314,7 @@
             self._ready = True
         except Exception as exc:  # pylint: disable=broad-except
             logs = self._read_weaver_logs()
-            logger.error(
-                "WeaverLiveCheck did not start: %s, logs: %s", exc, logs
-            )
+            logger.error("WeaverLiveCheck did not start: %s, logs: %s", exc, 
logs)
             raise
         return self
 
@@ -349,17 +331,13 @@
         session = Session()
         session.mount("http://";, HTTPAdapter(max_retries=retry))
         try:
-            session.get(
-                f"http://localhost:{self._admin_port}/health";, timeout=5
-            )
+            session.get(f"http://localhost:{self._admin_port}/health";, 
timeout=5)
         except Exception as exc:  # pylint: disable=broad-except
             if self._process is not None and self._process.poll() is not None:
                 raise RuntimeError(
                     f"WeaverLiveCheck process exited unexpectedly (code 
{self._process.returncode})"
                 ) from exc
-            raise TimeoutError(
-                "WeaverLiveCheck did not become ready in time"
-            ) from exc
+            raise TimeoutError("WeaverLiveCheck did not become ready in time") 
from exc
 
     @property
     def otlp_endpoint(self) -> str:
@@ -372,22 +350,16 @@
         Never raises for semconv violations.
         """
         if not self._ready:
-            raise RuntimeError(
-                "WeaverLiveCheck process did not start successfully"
-            )
+            raise RuntimeError("WeaverLiveCheck process did not start 
successfully")
         try:
-            response = post(
-                f"http://localhost:{self._admin_port}/stop";, timeout=5
-            )
+            response = post(f"http://localhost:{self._admin_port}/stop";, 
timeout=5)
             response.raise_for_status()
             report = LiveCheckReport(response.json())
             assert self._process is not None
             exit_code = self._process.wait(timeout=timeout)
         except Exception as exc:  # pylint: disable=broad-except
             logs = self._read_weaver_logs()
-            logger.error(
-                "Error communicating with weaver: %s, logs: %s", exc, logs
-            )
+            logger.error("Error communicating with weaver: %s, logs: %s", exc, 
logs)
             raise
         return report, exit_code
 
@@ -405,9 +377,7 @@
         for the report structure.
         """
         if self._stopped:
-            logger.warning(
-                "end() called after weaver already stopped; returning empty 
report"
-            )
+            logger.warning("end() called after weaver already stopped; 
returning empty report")
             return LiveCheckReport({})
         self._stopped = True
         report, _ = self._do_stop(timeout)
@@ -429,9 +399,7 @@
         to start, HTTP communication error, etc.).
         """
         if self._stopped:
-            logger.warning(
-                "end_and_check() called after weaver already stopped; 
returning empty report"
-            )
+            logger.warning("end_and_check() called after weaver already 
stopped; returning empty report")
             return LiveCheckReport({})
         self._stopped = True
         report, exit_code = self._do_stop(timeout)

Reply via email to