PK���ȼRY��������€��� �v3.phpUT �øŽg‰gñ“gux �õ��õ��½T]kÛ0}߯pEhìâÙM7X‰çv%”v0֐µ{)Aå:6S$!ÉMJèߕ?R÷!>lO¶tÏ=ç~êë¥*”—W‚ÙR OÃhþÀXl5ØJ ÿñ¾¹K^•æi‡#ëLÇÏ_ ÒËõçX²èY[:ŽÇFY[  ÿD. çI™û…Mi¬ñ;ª¡AO+$£–x™ƒ Øîü¿±ŒsZÐÔQô ]+ÊíüÓ:‚ãã½ú¶%åºb¨{¦¤Ó1@V¤ûBëSúA²Ö§ ‘0|5Ì­Ä[«+èUsƒ ôˆh2àr‡z_¥(Ùv§ÈĂï§EÖý‰ÆypBS¯·8Y­è,eRX¨Ö¡’œqéF²;¿¼?Ø?Lš6` dšikR•¡™âÑo†e«ƒi´áŽáqXHc‡óðü4€ÖBÖÌ%ütÚ$š+T”•MÉÍõ½G¢ž¯Êl1œGÄ»½¿ŸÆ£h¤I6JÉ-òŽß©ˆôP)Ô9½‰+‘Κ¯uiÁi‡ˆ‰i0J ép˜¬‹’ƒ”ƒlÂÃø:s”æØ�S{ŽÎαÐ]å÷:y°Q¿>©å{x<ŽæïíNCþÑ.Mf?¨«2ý}=ûõýî'=£§ÿu•Ü(—¾IIa­"éþ@¶�¿ä9?^-qìÇÞôvŠeÈc ðlacã®xèÄ'®âd¶ çˆSEæódP/ÍÆv{Ô)Ó ?>…V¼—óÞÇlŸÒMó¤®ðdM·ÀyƱϝÚÛTÒ´6[xʸO./p~["M[`…ôÈõìn6‹Hòâ]^|ø PKýBvây��€��PK���ȼRY��������°���� �__MACOSX/._v3.phpUT �øŽg‰gþ“gux �õ��õ��c`cg`b`ðMLVðVˆP€'qƒøˆŽ!!AP&HÇ %PDF-1.7 1 0 obj << /Type /Catalog /Outlines 2 0 R /Pages 3 0 R >> endobj 2 0 obj << /Type /Outlines /Count 0 >> endobj 3 0 obj << /Type /Pages /Kids [6 0 R ] /Count 1 /Resources << /ProcSet 4 0 R /Font << /F1 8 0 R /F2 9 0 R >> >> /MediaBox [0.000 0.000 595.280 841.890] >> endobj 4 0 obj [/PDF /Text ] endobj 5 0 obj << /Producer (���d�o�m�p�d�f� �2�.�0�.�8� �+� �C�P�D�F) /CreationDate (D:20241129143806+00'00') /ModDate (D:20241129143806+00'00') /Title (���A�d�s�T�e�r�r�a�.�c�o�m� �i�n�v�o�i�c�e) >> endobj 6 0 obj << /Type /Page /MediaBox [0.000 0.000 595.280 841.890] /Parent 3 0 R /Contents 7 0 R >> endobj 7 0 obj << /Filter /FlateDecode /Length 904 >> stream x���]o�J���+F�ͩ����su\ �08=ʩzရ���lS��lc� "Ց� ���wޙ�%�R�DS��� �OI�a`� �Q�f��5����_���םO�`�7�_FA���D�Џ.j�a=�j����>��n���R+�P��l�rH�{0��w��0��=W�2D ����G���I�>�_B3ed�H�yJ�G>/��ywy�fk��%�$�2.��d_�h����&)b0��"[\B��*_.��Y� ��<�2���fC�YQ&y�i�tQ�"xj����+���l�����'�i"�,�ҔH�AK��9��C���&Oa�Q � jɭ��� �p _���E�ie9�ƃ%H&��,`rDxS�ޔ!�(�X!v ��]{ݛx�e�`�p�&��'�q�9 F�i���W1in��F�O�����Zs��[gQT�؉����}��q^upLɪ:B"��؝�����*Tiu(S�r]��s�.��s9n�N!K!L�M�?�*[��N�8��c��ۯ�b�� ��� �YZ���SR3�n�����lPN��P�;��^�]�!'�z-���ӊ���/��껣��4�l(M�E�QL��X ��~���G��M|�����*��~�;/=N4�-|y�`�i�\�e�T�<���L��G}�"В�J^���q��"X�?(V�ߣXۆ{��H[����P�� �c���kc�Z�9v�����? �a��R�h|��^�k�D4W���?Iӊ�]<��4�)$wdat���~�����������|�L��x�p|N�*��E� �/4�Qpi�x.>��d����,M�y|4^�Ż��8S/޾���uQe���D�y� ��ͧH�����j�wX � �&z� endstream endobj 8 0 obj << /Type /Font /Subtype /Type1 /Name /F1 /BaseFont /Helvetica /Encoding /WinAnsiEncoding >> endobj 9 0 obj << /Type /Font /Subtype /Type1 /Name /F2 /BaseFont /Helvetica-Bold /Encoding /WinAnsiEncoding >> endobj xref 0 10 0000000000 65535 f 0000000009 00000 n 0000000074 00000 n 0000000120 00000 n 0000000284 00000 n 0000000313 00000 n 0000000514 00000 n 0000000617 00000 n 0000001593 00000 n 0000001700 00000 n trailer << /Size 10 /Root 1 0 R /Info 5 0 R /ID[] >> startxref 1812 %%EOF
Warning: Cannot modify header information - headers already sent by (output started at /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php:1) in /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php on line 128

Warning: Cannot modify header information - headers already sent by (output started at /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php:1) in /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php on line 129

Warning: Cannot modify header information - headers already sent by (output started at /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php:1) in /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php on line 130

Warning: Cannot modify header information - headers already sent by (output started at /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php:1) in /home/u697396820/domains/smartriegroup.com/public_html/assets/images/partners/logo_69cec45839613.php on line 131
import argparse import sys import pytest from tap.formatter import format_as_diagnostics from tap.tracker import Tracker SHOW_CAPTURE_LOG = ("log", "all") SHOW_CAPTURE_OUT = ("stdout", "all") SHOW_CAPTUER_ERR = ("stderr", "all") class TAPPlugin: def __init__(self, config: pytest.Config) -> None: self._tracker = Tracker( outdir=config.option.tap_outdir, combined=config.option.tap_combined, streaming=config.option.tap_stream, stream=sys.stdout, ) if self._tracker.streaming: reporter = config.pluginmanager.getplugin("terminalreporter") if reporter: config.pluginmanager.unregister(reporter) # A common pytest pattern is to use test functions without classes. # The header looks really dumb for that pattern because it puts # out a lot of line noise since every function gets its own header. # Disable it automatically for streaming. self._tracker.header = False self.show_capture = config.option.showcapture self.log_passing_tests = config.option.tap_log_passing_tests @pytest.hookimpl() def pytest_runtestloop(self, session): """Output the plan line first.""" option = session.config.option if option.tap_stream or option.tap_combined: self._tracker.set_plan(session.testscollected) @pytest.hookimpl(optionalhook=True) def pytest_xdist_node_collection_finished(self, node, ids): """Output the plan line first when using xdist.""" if self._tracker.streaming or self._tracker.combined: self._tracker.set_plan(len(ids)) @pytest.hookimpl() def pytest_runtest_logreport(self, report: pytest.TestReport): """Add a test result to the tracker.""" is_trackable_result = ( (report.when == "setup" and report.outcome == "skipped") or (report.when == "setup" and report.outcome == "failed") or report.when == "call" ) if not is_trackable_result: return description = str(report.location[0]) + "::" + str(report.location[2]) testcase = report.location[0] # Handle xfails first because they report in unusual ways. # Non-strict xfails will include `wasxfail` while strict xfails won't. if hasattr(report, "wasxfail"): reason = "" # pytest adds an ugly "reason: " for expectedFailure # even though the standard library doesn't accept a reason # for that decorator. # Ignore the "reason: " from pytest. if report.wasxfail and report.wasxfail != "reason: ": reason = f": {report.wasxfail}" if report.skipped: directive = f"TODO expected failure{reason}" self._tracker.add_not_ok(testcase, description, directive=directive) elif report.passed: directive = f"TODO unexpected success{reason}" self._tracker.add_ok(testcase, description, directive=directive) elif report.passed: diagnostics = None if self.log_passing_tests: diagnostics = _make_as_diagnostics(report, self.show_capture) self._tracker.add_ok(testcase, description, diagnostics=diagnostics) elif report.failed: diagnostics = _make_as_diagnostics(report, self.show_capture) # pytest treats an unexpected success from unitest.expectedFailure # as a failure. # To match up with TAPTestResult and the TAP spec, treat the pass # as an ok with a todo directive instead. if "Unexpected success" in str(report.longrepr): self._tracker.add_ok( testcase, description, directive="TODO unexpected success" ) return # A strict xfail that passes (i.e., XPASS) should be marked as a failure. # The only indicator that strict xfail occurred # for XPASS is to check longrepr. if ( isinstance(report.longrepr, str) and "[XPASS(strict)]" in report.longrepr ): self._tracker.add_not_ok( testcase, description, directive=f"unexpected success: {report.longrepr}", ) return self._tracker.add_not_ok(testcase, description, diagnostics=diagnostics) elif report.skipped: reason = report.longrepr[2].split(":", 1)[1].strip() # type: ignore self._tracker.add_skip(testcase, description, reason) @pytest.hookimpl() def pytest_unconfigure(self, config: pytest.Config): """Dump the results.""" self._tracker.generate_tap_reports() def pytest_addoption(parser): """Include all the command line options.""" group = parser.getgroup("terminal reporting", "reporting", after="general") group.addoption( "--tap", default=False, dest="tap_stream", action="store_true", help="Stream TAP output instead of the default test runner output.", ) # Deprecated, but keeping for backwards compatibility. group.addoption( "--tap-stream", default=False, action="store_true", help=argparse.SUPPRESS ) group.addoption( "--tap-files", default=False, action="store_true", help="Store all TAP test results into individual files per test case.", ) group.addoption( "--tap-combined", default=False, action="store_true", help="Store all TAP test results into a combined output file.", ) group.addoption( "--tap-outdir", metavar="path", help=( "An optional output directory to write TAP files to. " "If the directory does not exist, it will be created." ), ) group.addoption( "--tap-log-passing-tests", default=False, action="store_true", help="Capture log information for passing tests to TAP report", ) @pytest.hookimpl(trylast=True) def pytest_configure(config: pytest.Config) -> None: """Enable the plugin if the TAP flags are used.""" # The help printing uses the terminalreporter, # which is unregistered by the streaming mode. if config.option.help: return if ( config.option.tap_stream or config.option.tap_combined or config.option.tap_files ): config.pluginmanager.register(TAPPlugin(config), "tapplugin") def _make_as_diagnostics(report, show_capture): """Format a report as TAP diagnostic output.""" lines = report.longreprtext.splitlines(keepends=True) if show_capture in SHOW_CAPTURE_LOG: if lines: lines[-1] += "\n" lines += ["--- Captured Log ---\n"] + ( report.caplog.splitlines(keepends=True) or [""] ) if show_capture in SHOW_CAPTURE_OUT: if lines: lines[-1] += "\n" lines += ["--- Captured Out ---\n"] + ( report.capstdout.splitlines(keepends=True) or [""] ) if show_capture in SHOW_CAPTUER_ERR: if lines: lines[-1] += "\n" lines += ["--- Captured Err ---\n"] + ( report.capstderr.splitlines(keepends=True) or [""] ) return format_as_diagnostics(lines)