Script 'mail_helper' called by obssrc Hello community, here is the log from the commit of package python-basictracer for openSUSE:Factory checked in at 2022-01-15 20:05:26 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/python-basictracer (Old) and /work/SRC/openSUSE:Factory/.python-basictracer.new.1892 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "python-basictracer" Sat Jan 15 20:05:26 2022 rev:2 rq:946673 version:3.2.0 Changes: -------- --- /work/SRC/openSUSE:Factory/python-basictracer/python-basictracer.changes 2021-01-03 21:27:50.403650722 +0100 +++ /work/SRC/openSUSE:Factory/.python-basictracer.new.1892/python-basictracer.changes 2022-01-15 20:05:48.529787488 +0100 @@ -1,0 +2,13 @@ +Sat Jan 15 16:49:06 UTC 2022 - Dirk M??ller <dmuel...@suse.com> + +- update to 3.2.0: +- setup.py: Remove test dependency doubles +- Do not throw error when no tracing headers are sent +- Stop testing with Python 3.5 +- Provide meaningful error messages when failed to extract headers from carrier + - TextPropagator.extract raises SpanContextCorruptedException with + more meaningful error messages. + - Tracer.start_span validates type of ``references=`` preventing + problems for users migrating code from opentracing==1.3.0. + +------------------------------------------------------------------- Old: ---- basictracer-3.1.0.tar.gz New: ---- basictracer-3.2.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ python-basictracer.spec ++++++ --- /var/tmp/diff_new_pack.uEBYzL/_old 2022-01-15 20:05:48.865787750 +0100 +++ /var/tmp/diff_new_pack.uEBYzL/_new 2022-01-15 20:05:48.869787753 +0100 @@ -1,7 +1,7 @@ # # spec file for package python-basictracer # -# Copyright (c) 2021 SUSE LLC +# Copyright (c) 2022 SUSE LLC # # All modifications and additions to the file contributed by third parties # remain the property of their copyright owners, unless otherwise agreed @@ -19,7 +19,7 @@ %{?!python_module:%define python_module() python-%{**} python3-%{**}} %define skip_python2 1 Name: python-basictracer -Version: 3.1.0 +Version: 3.2.0 Release: 0 Summary: BasicTracer reference implementation for OpenTracing License: MIT ++++++ basictracer-3.1.0.tar.gz -> basictracer-3.2.0.tar.gz ++++++ Binary files old/basictracer-3.1.0/.coverage and new/basictracer-3.2.0/.coverage differ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/basictracer-3.1.0/.travis.yml new/basictracer-3.2.0/.travis.yml --- old/basictracer-3.1.0/.travis.yml 2019-05-12 22:09:12.000000000 +0200 +++ new/basictracer-3.2.0/.travis.yml 2021-04-12 23:41:04.000000000 +0200 @@ -3,7 +3,6 @@ language: python python: - "2.7" - - "3.5" - "3.6" - "3.7" - "3.8-dev" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/basictracer-3.1.0/CHANGELOG.rst new/basictracer-3.2.0/CHANGELOG.rst --- old/basictracer-3.1.0/CHANGELOG.rst 2019-05-12 22:12:15.000000000 +0200 +++ new/basictracer-3.2.0/CHANGELOG.rst 2021-04-12 23:45:51.000000000 +0200 @@ -3,6 +3,19 @@ History ------- +3.2.0 (2021-04-12) +------------------ + +- setup.py: Remove test dependency doubles (#44) <John Vandenberg> +- Do not throw error when no tracing headers are sent (#43) <Logan Capaldo> +- Stop testing with Python 3.5 <Yuri Shkuro> +- Provide meaningful error messages when failed to extract headers from carrier (#42) <Gabriel Falc??o> + - TextPropagator.extract raises SpanContextCorruptedException with + more meaningful error messages. + - Tracer.start_span validates type of ``references=`` preventing + problems for users migrating code from opentracing==1.3.0. + + 3.1.0 (2019-05-12) ------------------ @@ -94,4 +107,3 @@ ---------------- - Initial public API - diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/basictracer-3.1.0/PKG-INFO new/basictracer-3.2.0/PKG-INFO --- old/basictracer-3.1.0/PKG-INFO 2019-05-12 22:12:36.000000000 +0200 +++ new/basictracer-3.2.0/PKG-INFO 2021-04-12 23:46:44.871994300 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: basictracer -Version: 3.1.0 +Version: 3.2.0 Summary: UNKNOWN Home-page: https://github.com/opentracing/basictracer-python Author: The OpenTracing Authors diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/basictracer-3.1.0/README.md new/basictracer-3.2.0/README.md --- old/basictracer-3.1.0/README.md 2019-05-12 22:09:12.000000000 +0200 +++ new/basictracer-3.2.0/README.md 2021-04-12 23:41:04.000000000 +0200 @@ -2,7 +2,10 @@ # Basictracer Python -A python version of the "BasicTracer" reference implementation for OpenTracing. +A python version of the "BasicTracer" reference implementation for OpenTracing. + +The `examples/` directory contains a sample of how the BasicTracer +implementation could be used to display spans in the console. ## Development diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/basictracer-3.1.0/basictracer/text_propagator.py new/basictracer-3.2.0/basictracer/text_propagator.py --- old/basictracer-3.1.0/basictracer/text_propagator.py 2019-05-12 22:09:12.000000000 +0200 +++ new/basictracer-3.2.0/basictracer/text_propagator.py 2021-04-12 23:41:04.000000000 +0200 @@ -12,6 +12,37 @@ field_count = 3 +def parse_hex_for_field(field_name, value): + """parses the hexadecimal value of a field into an integer. + Raises SpanContextCorruptedException in case of failure + """ + try: + return int(value, 16) + except ValueError: + msg = '{field_name} got an invalid hexadecimal value {value!r}' + msg = msg.format(field_name=field_name, value=value) + raise SpanContextCorruptedException(msg) + + +def parse_boolean_for_field(field_name, value): + """parses the string value of a field into a boolean. + Raises SpanContextCorruptedException in case of failure + """ + if value in ('true', '1'): + return True + elif value in ('false', '0'): + return False + + msg = ( + '{field} got an invalid value {value!r}, ' + "should be one of \'true\', \'false\', \'0\', \'1\'" + ) + raise SpanContextCorruptedException(msg.format( + value=value, + field=field_name_sampled + )) + + class TextPropagator(Propagator): """A BasicTracer Propagator for Format.TEXT_MAP.""" @@ -31,24 +62,33 @@ v = carrier[k] k = k.lower() if k == field_name_span_id: - span_id = int(v, 16) + span_id = parse_hex_for_field(field_name_span_id, v) count += 1 elif k == field_name_trace_id: - trace_id = int(v, 16) + trace_id = parse_hex_for_field(field_name_trace_id, v) count += 1 elif k == field_name_sampled: - if v in ('true', '1'): - sampled = True - elif v in ('false', '0'): - sampled = False - else: - raise SpanContextCorruptedException() + sampled = parse_boolean_for_field(field_name_sampled, v) count += 1 elif k.startswith(prefix_baggage): baggage[k[len(prefix_baggage):]] = v + if count == 0: + if len(baggage) > 0: + raise SpanContextCorruptedException( + 'found baggage without required fields') + + return None + if count != field_count: - raise SpanContextCorruptedException() + msg = ( + 'expected to parse {field_count} fields' + ', but parsed {count} instead' + ) + raise SpanContextCorruptedException(msg.format( + field_count=field_count, + count=count, + )) return SpanContext( span_id=span_id, diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/basictracer-3.1.0/basictracer/tracer.py new/basictracer-3.2.0/basictracer/tracer.py --- old/basictracer-3.1.0/basictracer/tracer.py 2019-05-12 22:09:12.000000000 +0200 +++ new/basictracer-3.2.0/basictracer/tracer.py 2021-04-12 23:41:04.000000000 +0200 @@ -77,6 +77,9 @@ start_time=None, ignore_active_span=False): + if isinstance(references, opentracing.Reference): + references = [references] + start_time = time.time() if start_time is None else start_time # See if we have a parent_ctx in `references` @@ -87,7 +90,14 @@ else child_of.context) elif references is not None and len(references) > 0: # TODO only the first reference is currently used - parent_ctx = references[0].referenced_context + first_ref = references[0] + if not isinstance(first_ref, opentracing.Reference): + msg = ( + 'references[0] should be a opentracing.Reference ' + 'objects, got %r instead' + ) + raise TypeError(msg % first_ref) + parent_ctx = first_ref.referenced_context # retrieve the active SpanContext if not ignore_active_span and parent_ctx is None: diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/basictracer-3.1.0/basictracer.egg-info/PKG-INFO new/basictracer-3.2.0/basictracer.egg-info/PKG-INFO --- old/basictracer-3.1.0/basictracer.egg-info/PKG-INFO 2019-05-12 22:12:36.000000000 +0200 +++ new/basictracer-3.2.0/basictracer.egg-info/PKG-INFO 2021-04-12 23:46:44.000000000 +0200 @@ -1,6 +1,6 @@ Metadata-Version: 2.1 Name: basictracer -Version: 3.1.0 +Version: 3.2.0 Summary: UNKNOWN Home-page: https://github.com/opentracing/basictracer-python Author: The OpenTracing Authors diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/basictracer-3.1.0/basictracer.egg-info/requires.txt new/basictracer-3.2.0/basictracer.egg-info/requires.txt --- old/basictracer-3.1.0/basictracer.egg-info/requires.txt 2019-05-12 22:12:36.000000000 +0200 +++ new/basictracer-3.2.0/basictracer.egg-info/requires.txt 2021-04-12 23:46:44.000000000 +0200 @@ -3,7 +3,6 @@ six<2.0,>=1.10.0 [tests] -doubles flake8 flake8-quotes mock<1.1.0 diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/basictracer-3.1.0/coverage.xml new/basictracer-3.2.0/coverage.xml --- old/basictracer-3.1.0/coverage.xml 2019-05-12 22:10:53.000000000 +0200 +++ new/basictracer-3.2.0/coverage.xml 2021-04-12 23:42:59.000000000 +0200 @@ -1,324 +1,350 @@ <?xml version="1.0" ?> -<coverage branch-rate="0" branches-covered="0" branches-valid="0" complexity="0" line-rate="0.9658" lines-covered="254" lines-valid="263" timestamp="1557691853652" version="4.5.3"> +<coverage version="5.5" timestamp="1618263779058" lines-valid="289" lines-covered="279" line-rate="0.9654" branches-covered="0" branches-valid="0" branch-rate="0" complexity="0"> <!-- Generated by coverage.py: https://coverage.readthedocs.io --> <!-- Based on https://raw.githubusercontent.com/cobertura/web/master/htdocs/xml/coverage-04.dtd --> <sources> - <source>/Users/yurishkuro/Uber/basictracer-python/basictracer</source> + <source>/Users/ysh/dev/opentracing/basictracer-python/basictracer</source> </sources> <packages> - <package branch-rate="0" complexity="0" line-rate="0.9658" name="."> + <package name="." line-rate="0.9654" branch-rate="0" complexity="0"> <classes> - <class branch-rate="0" complexity="0" filename="__init__.py" line-rate="1" name="__init__.py"> + <class name="__init__.py" filename="__init__.py" complexity="0" line-rate="1" branch-rate="0"> <methods/> <lines> - <line hits="1" number="1"/> - <line hits="1" number="3"/> - <line hits="1" number="4"/> + <line number="1" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> </lines> </class> - <class branch-rate="0" complexity="0" filename="binary_propagator.py" line-rate="0.931" name="binary_propagator.py"> + <class name="binary_propagator.py" filename="binary_propagator.py" complexity="0" line-rate="0.931" branch-rate="0"> <methods/> <lines> - <line hits="1" number="1"/> - <line hits="1" number="3"/> - <line hits="1" number="4"/> - <line hits="1" number="5"/> - <line hits="1" number="7"/> - <line hits="1" number="8"/> - <line hits="1" number="10"/> - <line hits="1" number="13"/> - <line hits="1" number="16"/> - <line hits="1" number="17"/> - <line hits="0" number="18"/> - <line hits="1" number="19"/> - <line hits="1" number="20"/> - <line hits="1" number="21"/> - <line hits="1" number="22"/> - <line hits="1" number="23"/> - <line hits="1" number="24"/> - <line hits="1" number="25"/> - <line hits="1" number="28"/> - <line hits="1" number="29"/> - <line hits="1" number="31"/> - <line hits="1" number="32"/> - <line hits="0" number="33"/> - <line hits="1" number="34"/> - <line hits="1" number="35"/> - <line hits="1" number="36"/> - <line hits="1" number="37"/> - <line hits="1" number="38"/> - <line hits="1" number="40"/> + <line number="1" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="5" hits="1"/> + <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="10" hits="1"/> + <line number="13" hits="1"/> + <line number="16" hits="1"/> + <line number="17" hits="1"/> + <line number="18" hits="0"/> + <line number="19" hits="1"/> + <line number="20" hits="1"/> + <line number="21" hits="1"/> + <line number="22" hits="1"/> + <line number="23" hits="1"/> + <line number="24" hits="1"/> + <line number="25" hits="1"/> + <line number="28" hits="1"/> + <line number="29" hits="1"/> + <line number="31" hits="1"/> + <line number="32" hits="1"/> + <line number="33" hits="0"/> + <line number="34" hits="1"/> + <line number="35" hits="1"/> + <line number="36" hits="1"/> + <line number="37" hits="1"/> + <line number="38" hits="1"/> + <line number="40" hits="1"/> </lines> </class> - <class branch-rate="0" complexity="0" filename="context.py" line-rate="1" name="context.py"> + <class name="context.py" filename="context.py" complexity="0" line-rate="1" branch-rate="0"> <methods/> <lines> - <line hits="1" number="1"/> - <line hits="1" number="3"/> - <line hits="1" number="6"/> - <line hits="1" number="12"/> - <line hits="1" number="18"/> - <line hits="1" number="19"/> - <line hits="1" number="20"/> - <line hits="1" number="21"/> - <line hits="1" number="23"/> - <line hits="1" number="25"/> - <line hits="1" number="27"/> - <line hits="1" number="28"/> - <line hits="1" number="29"/> - <line hits="1" number="30"/> + <line number="1" hits="1"/> + <line number="3" hits="1"/> + <line number="6" hits="1"/> + <line number="12" hits="1"/> + <line number="18" hits="1"/> + <line number="19" hits="1"/> + <line number="20" hits="1"/> + <line number="21" hits="1"/> + <line number="23" hits="1"/> + <line number="24" hits="1"/> + <line number="25" hits="1"/> + <line number="27" hits="1"/> + <line number="28" hits="1"/> + <line number="29" hits="1"/> + <line number="30" hits="1"/> </lines> </class> - <class branch-rate="0" complexity="0" filename="propagator.py" line-rate="0.75" name="propagator.py"> + <class name="propagator.py" filename="propagator.py" complexity="0" line-rate="0.8" branch-rate="0"> <methods/> <lines> - <line hits="1" number="1"/> - <line hits="1" number="3"/> - <line hits="1" number="4"/> - <line hits="1" number="7"/> - <line hits="1" number="9"/> - <line hits="0" number="11"/> - <line hits="1" number="13"/> - <line hits="0" number="15"/> + <line number="1" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="7" hits="1"/> + <line number="9" hits="1"/> + <line number="10" hits="1"/> + <line number="11" hits="0"/> + <line number="13" hits="1"/> + <line number="14" hits="1"/> + <line number="15" hits="0"/> </lines> </class> - <class branch-rate="0" complexity="0" filename="recorder.py" line-rate="0.9167" name="recorder.py"> + <class name="recorder.py" filename="recorder.py" complexity="0" line-rate="0.9231" branch-rate="0"> <methods/> <lines> - <line hits="1" number="1"/> - <line hits="1" number="3"/> - <line hits="1" number="4"/> - <line hits="1" number="7"/> - <line hits="1" number="11"/> - <line hits="0" number="18"/> - <line hits="1" number="21"/> - <line hits="1" number="26"/> - <line hits="1" number="27"/> - <line hits="1" number="28"/> - <line hits="1" number="30"/> - <line hits="1" number="31"/> - <line hits="1" number="32"/> - <line hits="1" number="34"/> - <line hits="1" number="35"/> - <line hits="1" number="36"/> - <line hits="1" number="39"/> - <line hits="1" number="45"/> - <line hits="0" number="47"/> - <line hits="1" number="50"/> - <line hits="1" number="53"/> - <line hits="1" number="54"/> - <line hits="1" number="56"/> - <line hits="1" number="57"/> + <line number="1" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="7" hits="1"/> + <line number="11" hits="1"/> + <line number="12" hits="1"/> + <line number="18" hits="0"/> + <line number="21" hits="1"/> + <line number="26" hits="1"/> + <line number="27" hits="1"/> + <line number="28" hits="1"/> + <line number="30" hits="1"/> + <line number="31" hits="1"/> + <line number="32" hits="1"/> + <line number="34" hits="1"/> + <line number="35" hits="1"/> + <line number="36" hits="1"/> + <line number="39" hits="1"/> + <line number="45" hits="1"/> + <line number="46" hits="1"/> + <line number="47" hits="0"/> + <line number="50" hits="1"/> + <line number="53" hits="1"/> + <line number="54" hits="1"/> + <line number="56" hits="1"/> + <line number="57" hits="1"/> </lines> </class> - <class branch-rate="0" complexity="0" filename="span.py" line-rate="0.9796" name="span.py"> + <class name="span.py" filename="span.py" complexity="0" line-rate="0.9796" branch-rate="0"> <methods/> <lines> - <line hits="1" number="1"/> - <line hits="1" number="3"/> - <line hits="1" number="4"/> - <line hits="1" number="6"/> - <line hits="1" number="7"/> - <line hits="1" number="10"/> - <line hits="1" number="14"/> - <line hits="1" number="22"/> - <line hits="1" number="23"/> - <line hits="1" number="24"/> - <line hits="1" number="26"/> - <line hits="1" number="27"/> - <line hits="1" number="28"/> - <line hits="1" number="29"/> - <line hits="1" number="30"/> - <line hits="1" number="31"/> - <line hits="1" number="33"/> - <line hits="1" number="34"/> - <line hits="1" number="35"/> - <line hits="1" number="36"/> - <line hits="1" number="38"/> - <line hits="1" number="39"/> - <line hits="1" number="40"/> - <line hits="1" number="41"/> - <line hits="1" number="42"/> - <line hits="0" number="43"/> - <line hits="1" number="44"/> - <line hits="1" number="45"/> - <line hits="1" number="47"/> - <line hits="1" number="48"/> - <line hits="1" number="49"/> - <line hits="1" number="50"/> - <line hits="1" number="52"/> - <line hits="1" number="53"/> - <line hits="1" number="54"/> - <line hits="1" number="55"/> - <line hits="1" number="56"/> - <line hits="1" number="58"/> - <line hits="1" number="59"/> - <line hits="1" number="60"/> - <line hits="1" number="61"/> - <line hits="1" number="62"/> - <line hits="1" number="64"/> - <line hits="1" number="65"/> - <line hits="1" number="66"/> - <line hits="1" number="69"/> - <line hits="1" number="70"/> - <line hits="1" number="74"/> - <line hits="1" number="75"/> + <line number="1" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="6" hits="1"/> + <line number="7" hits="1"/> + <line number="10" hits="1"/> + <line number="14" hits="1"/> + <line number="22" hits="1"/> + <line number="23" hits="1"/> + <line number="24" hits="1"/> + <line number="26" hits="1"/> + <line number="27" hits="1"/> + <line number="28" hits="1"/> + <line number="29" hits="1"/> + <line number="30" hits="1"/> + <line number="31" hits="1"/> + <line number="33" hits="1"/> + <line number="34" hits="1"/> + <line number="35" hits="1"/> + <line number="36" hits="1"/> + <line number="38" hits="1"/> + <line number="39" hits="1"/> + <line number="40" hits="1"/> + <line number="41" hits="1"/> + <line number="42" hits="1"/> + <line number="43" hits="0"/> + <line number="44" hits="1"/> + <line number="45" hits="1"/> + <line number="47" hits="1"/> + <line number="48" hits="1"/> + <line number="49" hits="1"/> + <line number="50" hits="1"/> + <line number="52" hits="1"/> + <line number="53" hits="1"/> + <line number="54" hits="1"/> + <line number="55" hits="1"/> + <line number="56" hits="1"/> + <line number="58" hits="1"/> + <line number="59" hits="1"/> + <line number="60" hits="1"/> + <line number="61" hits="1"/> + <line number="62" hits="1"/> + <line number="64" hits="1"/> + <line number="65" hits="1"/> + <line number="66" hits="1"/> + <line number="69" hits="1"/> + <line number="70" hits="1"/> + <line number="74" hits="1"/> + <line number="75" hits="1"/> </lines> </class> - <class branch-rate="0" complexity="0" filename="text_propagator.py" line-rate="0.9535" name="text_propagator.py"> + <class name="text_propagator.py" filename="text_propagator.py" complexity="0" line-rate="1" branch-rate="0"> <methods/> <lines> - <line hits="1" number="1"/> - <line hits="1" number="3"/> - <line hits="1" number="4"/> - <line hits="1" number="5"/> - <line hits="1" number="7"/> - <line hits="1" number="8"/> - <line hits="1" number="9"/> - <line hits="1" number="10"/> - <line hits="1" number="11"/> - <line hits="1" number="12"/> - <line hits="1" number="15"/> - <line hits="1" number="18"/> - <line hits="1" number="19"/> - <line hits="1" number="20"/> - <line hits="1" number="21"/> - <line hits="1" number="22"/> - <line hits="1" number="23"/> - <line hits="1" number="24"/> - <line hits="1" number="26"/> - <line hits="1" number="27"/> - <line hits="1" number="28"/> - <line hits="1" number="29"/> - <line hits="1" number="30"/> - <line hits="1" number="31"/> - <line hits="1" number="32"/> - <line hits="1" number="33"/> - <line hits="1" number="34"/> - <line hits="1" number="35"/> - <line hits="1" number="36"/> - <line hits="1" number="37"/> - <line hits="1" number="38"/> - <line hits="1" number="39"/> - <line hits="1" number="40"/> - <line hits="1" number="41"/> - <line hits="1" number="42"/> - <line hits="1" number="43"/> - <line hits="0" number="45"/> - <line hits="1" number="46"/> - <line hits="1" number="47"/> - <line hits="1" number="48"/> - <line hits="1" number="50"/> - <line hits="0" number="51"/> - <line hits="1" number="53"/> + <line number="1" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="5" hits="1"/> + <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="9" hits="1"/> + <line number="10" hits="1"/> + <line number="11" hits="1"/> + <line number="12" hits="1"/> + <line number="15" hits="1"/> + <line number="19" hits="1"/> + <line number="20" hits="1"/> + <line number="21" hits="1"/> + <line number="22" hits="1"/> + <line number="23" hits="1"/> + <line number="24" hits="1"/> + <line number="27" hits="1"/> + <line number="31" hits="1"/> + <line number="32" hits="1"/> + <line number="33" hits="1"/> + <line number="34" hits="1"/> + <line number="36" hits="1"/> + <line number="40" hits="1"/> + <line number="46" hits="1"/> + <line number="49" hits="1"/> + <line number="50" hits="1"/> + <line number="51" hits="1"/> + <line number="52" hits="1"/> + <line number="53" hits="1"/> + <line number="54" hits="1"/> + <line number="55" hits="1"/> + <line number="57" hits="1"/> + <line number="58" hits="1"/> + <line number="59" hits="1"/> + <line number="60" hits="1"/> + <line number="61" hits="1"/> + <line number="62" hits="1"/> + <line number="63" hits="1"/> + <line number="64" hits="1"/> + <line number="65" hits="1"/> + <line number="66" hits="1"/> + <line number="67" hits="1"/> + <line number="68" hits="1"/> + <line number="69" hits="1"/> + <line number="70" hits="1"/> + <line number="71" hits="1"/> + <line number="72" hits="1"/> + <line number="73" hits="1"/> + <line number="74" hits="1"/> + <line number="76" hits="1"/> + <line number="77" hits="1"/> + <line number="78" hits="1"/> + <line number="81" hits="1"/> + <line number="83" hits="1"/> + <line number="84" hits="1"/> + <line number="88" hits="1"/> + <line number="93" hits="1"/> </lines> </class> - <class branch-rate="0" complexity="0" filename="tracer.py" line-rate="1" name="tracer.py"> + <class name="tracer.py" filename="tracer.py" complexity="0" line-rate="0.9545" branch-rate="0"> <methods/> <lines> - <line hits="1" number="1"/> - <line hits="1" number="3"/> - <line hits="1" number="4"/> - <line hits="1" number="5"/> - <line hits="1" number="6"/> - <line hits="1" number="7"/> - <line hits="1" number="8"/> - <line hits="1" number="9"/> - <line hits="1" number="10"/> - <line hits="1" number="13"/> - <line hits="1" number="15"/> - <line hits="1" number="27"/> - <line hits="1" number="29"/> - <line hits="1" number="31"/> - <line hits="1" number="32"/> - <line hits="1" number="33"/> - <line hits="1" number="35"/> - <line hits="1" number="42"/> - <line hits="1" number="44"/> - <line hits="1" number="45"/> - <line hits="1" number="46"/> - <line hits="1" number="47"/> - <line hits="1" number="48"/> - <line hits="1" number="49"/> - <line hits="1" number="51"/> - <line hits="1" number="61"/> - <line hits="1" number="70"/> - <line hits="1" number="72"/> - <line hits="1" number="80"/> - <line hits="1" number="83"/> - <line hits="1" number="84"/> - <line hits="1" number="85"/> - <line hits="1" number="88"/> - <line hits="1" number="90"/> - <line hits="1" number="93"/> - <line hits="1" number="94"/> - <line hits="1" number="95"/> - <line hits="1" number="96"/> - <line hits="1" number="99"/> - <line hits="1" number="100"/> - <line hits="1" number="101"/> - <line hits="1" number="102"/> - <line hits="1" number="103"/> - <line hits="1" number="104"/> - <line hits="1" number="106"/> - <line hits="1" number="107"/> - <line hits="1" number="110"/> - <line hits="1" number="118"/> - <line hits="1" number="119"/> - <line hits="1" number="120"/> - <line hits="1" number="122"/> - <line hits="1" number="124"/> - <line hits="1" number="125"/> - <line hits="1" number="126"/> - <line hits="1" number="128"/> - <line hits="1" number="130"/> - <line hits="1" number="131"/> - <line hits="1" number="134"/> - <line hits="1" number="135"/> - <line hits="1" number="136"/> + <line number="1" hits="1"/> + <line number="3" hits="1"/> + <line number="4" hits="1"/> + <line number="5" hits="1"/> + <line number="6" hits="1"/> + <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="9" hits="1"/> + <line number="10" hits="1"/> + <line number="13" hits="1"/> + <line number="15" hits="1"/> + <line number="27" hits="1"/> + <line number="29" hits="1"/> + <line number="31" hits="1"/> + <line number="32" hits="1"/> + <line number="33" hits="1"/> + <line number="35" hits="1"/> + <line number="42" hits="1"/> + <line number="44" hits="1"/> + <line number="45" hits="1"/> + <line number="46" hits="1"/> + <line number="47" hits="1"/> + <line number="48" hits="1"/> + <line number="49" hits="1"/> + <line number="51" hits="1"/> + <line number="61" hits="1"/> + <line number="70" hits="1"/> + <line number="72" hits="1"/> + <line number="80" hits="1"/> + <line number="81" hits="0"/> + <line number="83" hits="1"/> + <line number="86" hits="1"/> + <line number="87" hits="1"/> + <line number="88" hits="1"/> + <line number="91" hits="1"/> + <line number="93" hits="1"/> + <line number="94" hits="1"/> + <line number="95" hits="0"/> + <line number="99" hits="0"/> + <line number="100" hits="1"/> + <line number="103" hits="1"/> + <line number="104" hits="1"/> + <line number="105" hits="1"/> + <line number="106" hits="1"/> + <line number="109" hits="1"/> + <line number="110" hits="1"/> + <line number="111" hits="1"/> + <line number="112" hits="1"/> + <line number="113" hits="1"/> + <line number="114" hits="1"/> + <line number="116" hits="1"/> + <line number="117" hits="1"/> + <line number="120" hits="1"/> + <line number="128" hits="1"/> + <line number="129" hits="1"/> + <line number="130" hits="1"/> + <line number="132" hits="1"/> + <line number="134" hits="1"/> + <line number="135" hits="1"/> + <line number="136" hits="1"/> + <line number="138" hits="1"/> + <line number="140" hits="1"/> + <line number="141" hits="1"/> + <line number="144" hits="1"/> + <line number="145" hits="1"/> + <line number="146" hits="1"/> </lines> </class> - <class branch-rate="0" complexity="0" filename="util.py" line-rate="1" name="util.py"> + <class name="util.py" filename="util.py" complexity="0" line-rate="1" branch-rate="0"> <methods/> <lines> - <line hits="1" number="1"/> - <line hits="1" number="2"/> - <line hits="1" number="3"/> - <line hits="1" number="6"/> - <line hits="1" number="10"/> - <line hits="1" number="13"/> - <line hits="1" number="17"/> - <line hits="1" number="18"/> - <line hits="1" number="19"/> - <line hits="1" number="20"/> - <line hits="1" number="21"/> + <line number="1" hits="1"/> + <line number="2" hits="1"/> + <line number="3" hits="1"/> + <line number="6" hits="1"/> + <line number="10" hits="1"/> + <line number="13" hits="1"/> + <line number="17" hits="1"/> + <line number="18" hits="1"/> + <line number="19" hits="1"/> + <line number="20" hits="1"/> + <line number="21" hits="1"/> </lines> </class> - <class branch-rate="0" complexity="0" filename="wire_pb2.py" line-rate="1" name="wire_pb2.py"> + <class name="wire_pb2.py" filename="wire_pb2.py" complexity="0" line-rate="1" branch-rate="0"> <methods/> <lines> - <line hits="1" number="4"/> - <line hits="1" number="5"/> - <line hits="1" number="6"/> - <line hits="1" number="7"/> - <line hits="1" number="8"/> - <line hits="1" number="9"/> - <line hits="1" number="10"/> - <line hits="1" number="13"/> - <line hits="1" number="18"/> - <line hits="1" number="24"/> - <line hits="1" number="29"/> - <line hits="1" number="66"/> - <line hits="1" number="117"/> - <line hits="1" number="118"/> - <line hits="1" number="119"/> - <line hits="1" number="121"/> - <line hits="1" number="133"/> - <line hits="1" number="134"/> - <line hits="1" number="137"/> - <line hits="1" number="138"/> - <line hits="1" number="139"/> - <line hits="1" number="140"/> + <line number="4" hits="1"/> + <line number="5" hits="1"/> + <line number="6" hits="1"/> + <line number="7" hits="1"/> + <line number="8" hits="1"/> + <line number="9" hits="1"/> + <line number="10" hits="1"/> + <line number="13" hits="1"/> + <line number="18" hits="1"/> + <line number="24" hits="1"/> + <line number="29" hits="1"/> + <line number="66" hits="1"/> + <line number="117" hits="1"/> + <line number="118" hits="1"/> + <line number="119" hits="1"/> + <line number="121" hits="1"/> + <line number="133" hits="1"/> + <line number="134" hits="1"/> + <line number="137" hits="1"/> + <line number="138" hits="1"/> + <line number="139" hits="1"/> + <line number="140" hits="1"/> </lines> </class> </classes> diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/basictracer-3.1.0/setup.py new/basictracer-3.2.0/setup.py --- old/basictracer-3.1.0/setup.py 2019-05-12 22:12:15.000000000 +0200 +++ new/basictracer-3.2.0/setup.py 2021-04-12 23:45:51.000000000 +0200 @@ -2,7 +2,7 @@ setup( name='basictracer', - version='3.1.0', + version='3.2.0', author='The OpenTracing Authors', author_email='i...@opentracing.io', license='MIT', @@ -30,7 +30,6 @@ ], extras_require={ 'tests': [ - 'doubles', 'flake8', 'flake8-quotes', 'mock<1.1.0', diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/basictracer-3.1.0/tests/test_propagation.py new/basictracer-3.2.0/tests/test_propagation.py --- old/basictracer-3.1.0/tests/test_propagation.py 2019-05-12 22:09:12.000000000 +0200 +++ new/basictracer-3.2.0/tests/test_propagation.py 2021-04-12 23:41:04.000000000 +0200 @@ -1,5 +1,9 @@ import pytest -from opentracing import Format, UnsupportedFormatException +from opentracing import ( + Format, + UnsupportedFormatException, + SpanContextCorruptedException, +) from basictracer import BasicTracer @@ -52,3 +56,150 @@ assert child.context.sampled == sp.context.sampled assert child.context.baggage == sp.context.baggage assert child.parent_id == sp.context.span_id + + +def test_span_missing_all_fields(): + tracer = BasicTracer() + tracer.register_required_propagators() + + # Given an empty carrier + headers = {} + + # When .extract is called + ctx = tracer.extract(Format.TEXT_MAP, headers) + + # Then it should return None + assert ctx is None + + +def test_span_missing_all_headers(): + tracer = BasicTracer() + tracer.register_required_propagators() + + # Given an carrier with no ot-headers + headers = { + 'Content-Type': 'text/html', + 'Authorization': 'Digest 123456', + } + + # When .extract is called + ctx = tracer.extract(Format.TEXT_MAP, headers) + + # Then it should return None + assert ctx is None + + +def test_span_missing_one_field(): + tracer = BasicTracer() + tracer.register_required_propagators() + + # Given a carrier missing ot-tracer-sampled: + headers = { + 'ot-tracer-spanid': 'deadbeaf', + 'ot-tracer-traceid': '1c3b00da', + } + + # When .extract is called + with pytest.raises(SpanContextCorruptedException) as exc: + tracer.extract(Format.TEXT_MAP, headers) + + # Then it should raise SpanContextCorruptedException + assert str(exc.value) == 'expected to parse 3 fields, but parsed 2 instead' + + +def test_span_missing_two_fields(): + tracer = BasicTracer() + tracer.register_required_propagators() + + # Given a carrier with only ot-tracer-traceid: + headers = { + 'ot-tracer-traceid': '1c3b00da', + } + + # When .extract is called + with pytest.raises(SpanContextCorruptedException) as exc: + tracer.extract(Format.TEXT_MAP, headers) + + # Then it should raise SpanContextCorruptedException + assert str(exc.value) == 'expected to parse 3 fields, but parsed 1 instead' + + +def test_span_with_baggage_only(): + tracer = BasicTracer() + tracer.register_required_propagators() + + # Given a carrier with only baggage: + headers = { + 'ot-baggage-example': 'ok', + } + + # When .extract is called + with pytest.raises(SpanContextCorruptedException) as exc: + tracer.extract(Format.TEXT_MAP, headers) + + # Then it should raise SpanContextCorruptedException + assert str(exc.value) == 'found baggage without required fields' + + +def test_span_corrupted_invalid_sampled_value(): + tracer = BasicTracer() + tracer.register_required_propagators() + + # Given a carrier with invalid "ot-tracer-sampled" value + headers = { + 'ot-tracer-spanid': 'deadbeef', + 'ot-tracer-sampled': 'notbool', + 'ot-tracer-traceid': '1c3b00da', + } + + # When .extract is called + with pytest.raises(SpanContextCorruptedException) as exc: + tracer.extract(Format.TEXT_MAP, headers) + + # Then it should raise SpanContextCorruptedException + assert str(exc.value) == ( + "ot-tracer-sampled got an invalid value 'notbool', " + "should be one of 'true', 'false', '0', '1'" + ) + + +def test_span_corrupted_invalid_spanid_value(): + tracer = BasicTracer() + tracer.register_required_propagators() + + # Given a carrier with invalid "ot-tracer-spanid" value + headers = { + 'ot-tracer-spanid': 'nothex', + 'ot-tracer-sampled': 'false', + 'ot-tracer-traceid': '1c3b00da', + } + + # When .extract is called + with pytest.raises(SpanContextCorruptedException) as exc: + tracer.extract(Format.TEXT_MAP, headers) + + # Then it should raise SpanContextCorruptedException + assert str(exc.value) == ( + "ot-tracer-spanid got an invalid hexadecimal value 'nothex'" + ) + + +def test_span_corrupted_invalid_traceid_value(): + tracer = BasicTracer() + tracer.register_required_propagators() + + # Given a carrier with invalid 'ot-tracer-traceid' value + headers = { + 'ot-tracer-traceid': 'nothex', + 'ot-tracer-sampled': 'false', + 'ot-tracer-spanid': '1c3b00da', + } + + # When .extract is called + with pytest.raises(SpanContextCorruptedException) as exc: + tracer.extract(Format.TEXT_MAP, headers) + + # Then it should raise SpanContextCorruptedException + assert str(exc.value) == ( + "ot-tracer-traceid got an invalid hexadecimal value 'nothex'" + )