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
# Licensed under the GPL: https://www.gnu.org/licenses/old-licenses/gpl-2.0.html # For details: https://github.com/PyCQA/pylint/blob/main/LICENSE # Copyright (c) https://github.com/PyCQA/pylint/blob/main/CONTRIBUTORS.txt from __future__ import annotations import sys from typing import cast from pylint.typing import MessageTypesFullName if sys.version_info >= (3, 8): from typing import Literal, TypedDict else: from typing_extensions import Literal, TypedDict class BadNames(TypedDict): """TypedDict to store counts of node types with bad names.""" argument: int attr: int klass: int class_attribute: int class_const: int const: int inlinevar: int function: int method: int module: int variable: int typevar: int typealias: int class CodeTypeCount(TypedDict): """TypedDict to store counts of lines of code types.""" code: int comment: int docstring: int empty: int total: int class DuplicatedLines(TypedDict): """TypedDict to store counts of lines of duplicated code.""" nb_duplicated_lines: int percent_duplicated_lines: float class NodeCount(TypedDict): """TypedDict to store counts of different types of nodes.""" function: int klass: int method: int module: int class UndocumentedNodes(TypedDict): """TypedDict to store counts of undocumented node types.""" function: int klass: int method: int module: int class ModuleStats(TypedDict): """TypedDict to store counts of types of messages and statements.""" convention: int error: int fatal: int info: int refactor: int statement: int warning: int # pylint: disable-next=too-many-instance-attributes class LinterStats: """Class used to linter stats.""" def __init__( self, bad_names: BadNames | None = None, by_module: dict[str, ModuleStats] | None = None, by_msg: dict[str, int] | None = None, code_type_count: CodeTypeCount | None = None, dependencies: dict[str, set[str]] | None = None, duplicated_lines: DuplicatedLines | None = None, node_count: NodeCount | None = None, undocumented: UndocumentedNodes | None = None, ) -> None: self.bad_names = bad_names or BadNames( argument=0, attr=0, klass=0, class_attribute=0, class_const=0, const=0, inlinevar=0, function=0, method=0, module=0, variable=0, typevar=0, typealias=0, ) self.by_module: dict[str, ModuleStats] = by_module or {} self.by_msg: dict[str, int] = by_msg or {} self.code_type_count = code_type_count or CodeTypeCount( code=0, comment=0, docstring=0, empty=0, total=0 ) self.dependencies: dict[str, set[str]] = dependencies or {} self.duplicated_lines = duplicated_lines or DuplicatedLines( nb_duplicated_lines=0, percent_duplicated_lines=0.0 ) self.node_count = node_count or NodeCount( function=0, klass=0, method=0, module=0 ) self.undocumented = undocumented or UndocumentedNodes( function=0, klass=0, method=0, module=0 ) self.convention = 0 self.error = 0 self.fatal = 0 self.info = 0 self.refactor = 0 self.statement = 0 self.warning = 0 self.global_note = 0 self.nb_duplicated_lines = 0 self.percent_duplicated_lines = 0.0 def __repr__(self) -> str: return str(self) def __str__(self) -> str: return f"""{self.bad_names} {sorted(self.by_module.items())} {sorted(self.by_msg.items())} {self.code_type_count} {sorted(self.dependencies.items())} {self.duplicated_lines} {self.undocumented} {self.convention} {self.error} {self.fatal} {self.info} {self.refactor} {self.statement} {self.warning} {self.global_note} {self.nb_duplicated_lines} {self.percent_duplicated_lines}""" def init_single_module(self, module_name: str) -> None: """Use through PyLinter.set_current_module so PyLinter.current_name is consistent. """ self.by_module[module_name] = ModuleStats( convention=0, error=0, fatal=0, info=0, refactor=0, statement=0, warning=0 ) def get_bad_names( self, node_name: Literal[ "argument", "attr", "class", "class_attribute", "class_const", "const", "inlinevar", "function", "method", "module", "variable", "typevar", "typealias", ], ) -> int: """Get a bad names node count.""" if node_name == "class": return self.bad_names.get("klass", 0) return self.bad_names.get(node_name, 0) def increase_bad_name(self, node_name: str, increase: int) -> None: """Increase a bad names node count.""" if node_name not in { "argument", "attr", "class", "class_attribute", "class_const", "const", "inlinevar", "function", "method", "module", "variable", "typevar", "typealias", }: raise ValueError("Node type not part of the bad_names stat") node_name = cast( Literal[ "argument", "attr", "class", "class_attribute", "class_const", "const", "inlinevar", "function", "method", "module", "variable", "typevar", "typealias", ], node_name, ) if node_name == "class": self.bad_names["klass"] += increase else: self.bad_names[node_name] += increase def reset_bad_names(self) -> None: """Resets the bad_names attribute.""" self.bad_names = BadNames( argument=0, attr=0, klass=0, class_attribute=0, class_const=0, const=0, inlinevar=0, function=0, method=0, module=0, variable=0, typevar=0, typealias=0, ) def get_code_count( self, type_name: Literal["code", "comment", "docstring", "empty", "total"] ) -> int: """Get a code type count.""" return self.code_type_count.get(type_name, 0) def reset_code_count(self) -> None: """Resets the code_type_count attribute.""" self.code_type_count = CodeTypeCount( code=0, comment=0, docstring=0, empty=0, total=0 ) def reset_duplicated_lines(self) -> None: """Resets the duplicated_lines attribute.""" self.duplicated_lines = DuplicatedLines( nb_duplicated_lines=0, percent_duplicated_lines=0.0 ) def get_node_count( self, node_name: Literal["function", "class", "method", "module"] ) -> int: """Get a node count while handling some extra conditions.""" if node_name == "class": return self.node_count.get("klass", 0) return self.node_count.get(node_name, 0) def reset_node_count(self) -> None: """Resets the node count attribute.""" self.node_count = NodeCount(function=0, klass=0, method=0, module=0) def get_undocumented( self, node_name: Literal["function", "class", "method", "module"] ) -> float: """Get a undocumented node count.""" if node_name == "class": return self.undocumented["klass"] return self.undocumented[node_name] def reset_undocumented(self) -> None: """Resets the undocumented attribute.""" self.undocumented = UndocumentedNodes(function=0, klass=0, method=0, module=0) def get_global_message_count(self, type_name: str) -> int: """Get a global message count.""" return getattr(self, type_name, 0) def get_module_message_count(self, modname: str, type_name: str) -> int: """Get a module message count.""" return getattr(self.by_module[modname], type_name, 0) def increase_single_message_count(self, type_name: str, increase: int) -> None: """Increase the message type count of an individual message type.""" setattr(self, type_name, getattr(self, type_name) + increase) def increase_single_module_message_count( self, modname: str, type_name: MessageTypesFullName, increase: int ) -> None: """Increase the message type count of an individual message type of a module. """ self.by_module[modname][type_name] += increase def reset_message_count(self) -> None: """Resets the message type count of the stats object.""" self.convention = 0 self.error = 0 self.fatal = 0 self.info = 0 self.refactor = 0 self.warning = 0 def merge_stats(stats: list[LinterStats]) -> LinterStats: """Used to merge multiple stats objects into a new one when pylint is run in parallel mode. """ merged = LinterStats() for stat in stats: merged.bad_names["argument"] += stat.bad_names["argument"] merged.bad_names["attr"] += stat.bad_names["attr"] merged.bad_names["klass"] += stat.bad_names["klass"] merged.bad_names["class_attribute"] += stat.bad_names["class_attribute"] merged.bad_names["class_const"] += stat.bad_names["class_const"] merged.bad_names["const"] += stat.bad_names["const"] merged.bad_names["inlinevar"] += stat.bad_names["inlinevar"] merged.bad_names["function"] += stat.bad_names["function"] merged.bad_names["method"] += stat.bad_names["method"] merged.bad_names["module"] += stat.bad_names["module"] merged.bad_names["variable"] += stat.bad_names["variable"] merged.bad_names["typevar"] += stat.bad_names["typevar"] merged.bad_names["typealias"] += stat.bad_names["typealias"] for mod_key, mod_value in stat.by_module.items(): merged.by_module[mod_key] = mod_value for msg_key, msg_value in stat.by_msg.items(): try: merged.by_msg[msg_key] += msg_value except KeyError: merged.by_msg[msg_key] = msg_value merged.code_type_count["code"] += stat.code_type_count["code"] merged.code_type_count["comment"] += stat.code_type_count["comment"] merged.code_type_count["docstring"] += stat.code_type_count["docstring"] merged.code_type_count["empty"] += stat.code_type_count["empty"] merged.code_type_count["total"] += stat.code_type_count["total"] for dep_key, dep_value in stat.dependencies.items(): try: merged.dependencies[dep_key].update(dep_value) except KeyError: merged.dependencies[dep_key] = dep_value merged.duplicated_lines["nb_duplicated_lines"] += stat.duplicated_lines[ "nb_duplicated_lines" ] merged.duplicated_lines["percent_duplicated_lines"] += stat.duplicated_lines[ "percent_duplicated_lines" ] merged.node_count["function"] += stat.node_count["function"] merged.node_count["klass"] += stat.node_count["klass"] merged.node_count["method"] += stat.node_count["method"] merged.node_count["module"] += stat.node_count["module"] merged.undocumented["function"] += stat.undocumented["function"] merged.undocumented["klass"] += stat.undocumented["klass"] merged.undocumented["method"] += stat.undocumented["method"] merged.undocumented["module"] += stat.undocumented["module"] merged.convention += stat.convention merged.error += stat.error merged.fatal += stat.fatal merged.info += stat.info merged.refactor += stat.refactor merged.statement += stat.statement merged.warning += stat.warning merged.global_note += stat.global_note return merged